mirror of
https://github.com/revanced/revanced-patches
synced 2024-12-28 18:45:48 +01:00
fix(Twitch): Resolve setting menu crashes (#4025)
This commit is contained in:
parent
414e1dac33
commit
62df5965d7
@ -1,23 +1,13 @@
|
|||||||
package app.revanced.extension.shared.settings.preference;
|
package app.revanced.extension.shared.settings.preference;
|
||||||
|
|
||||||
import static app.revanced.extension.shared.StringRef.str;
|
import static app.revanced.extension.shared.StringRef.str;
|
||||||
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.Insets;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.*;
|
import android.preference.*;
|
||||||
import android.util.TypedValue;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.view.WindowInsets;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import android.widget.Toolbar;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@ -29,7 +19,6 @@ import app.revanced.extension.shared.Utils;
|
|||||||
import app.revanced.extension.shared.settings.BaseSettings;
|
import app.revanced.extension.shared.settings.BaseSettings;
|
||||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||||
import app.revanced.extension.shared.settings.Setting;
|
import app.revanced.extension.shared.settings.Setting;
|
||||||
import app.revanced.extension.youtube.ThemeHelper;
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
||||||
@ -85,14 +74,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@SuppressLint("UseCompatLoadingForDrawables")
|
|
||||||
public static Drawable getBackButtonDrawable() {
|
|
||||||
final int backButtonResource = getResourceIdentifier(ThemeHelper.isDarkTheme()
|
|
||||||
? "yt_outline_arrow_left_white_24"
|
|
||||||
: "yt_outline_arrow_left_black_24",
|
|
||||||
"drawable");
|
|
||||||
return Utils.getContext().getResources().getDrawable(backButtonResource);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize this instance, and do any custom behavior.
|
* Initialize this instance, and do any custom behavior.
|
||||||
@ -284,7 +265,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
|||||||
// causes a callback to the listener even though nothing changed.
|
// causes a callback to the listener even though nothing changed.
|
||||||
initialize();
|
initialize();
|
||||||
updateUIToSettingValues();
|
updateUIToSettingValues();
|
||||||
setPreferenceScreenToolbar(getPreferenceScreen());
|
|
||||||
|
|
||||||
preferenceManager.getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
|
preferenceManager.getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
@ -297,56 +277,4 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
|||||||
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
|
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) {
|
|
||||||
for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) {
|
|
||||||
Preference childPreference = parentScreen.getPreference(i);
|
|
||||||
if (childPreference instanceof PreferenceScreen) {
|
|
||||||
// Recursively set sub preferences.
|
|
||||||
setPreferenceScreenToolbar((PreferenceScreen) childPreference);
|
|
||||||
|
|
||||||
childPreference.setOnPreferenceClickListener(
|
|
||||||
childScreen -> {
|
|
||||||
Dialog preferenceScreenDialog = ((PreferenceScreen) childScreen).getDialog();
|
|
||||||
ViewGroup rootView = (ViewGroup) preferenceScreenDialog
|
|
||||||
.findViewById(android.R.id.content)
|
|
||||||
.getParent();
|
|
||||||
|
|
||||||
// Fix required for Android 15 and YT 19.45+
|
|
||||||
// FIXME:
|
|
||||||
// On Android 15 the text layout is not aligned the same as the parent
|
|
||||||
// screen and it looks a little off. Otherwise this works.
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
||||||
rootView.setOnApplyWindowInsetsListener((v, insets) -> {
|
|
||||||
Insets statusInsets = insets.getInsets(WindowInsets.Type.statusBars());
|
|
||||||
v.setPadding(0, statusInsets.top, 0, 0);
|
|
||||||
return insets;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Toolbar toolbar = new Toolbar(childScreen.getContext());
|
|
||||||
toolbar.setTitle(childScreen.getTitle());
|
|
||||||
toolbar.setNavigationIcon(getBackButtonDrawable());
|
|
||||||
toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss());
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
||||||
final int margin = (int) TypedValue.applyDimension(
|
|
||||||
TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()
|
|
||||||
);
|
|
||||||
toolbar.setTitleMargin(margin, 0, margin, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextView toolbarTextView = Utils.getChildView(toolbar,
|
|
||||||
true, TextView.class::isInstance);
|
|
||||||
if (toolbarTextView != null) {
|
|
||||||
toolbarTextView.setTextColor(ThemeHelper.getForegroundColor());
|
|
||||||
}
|
|
||||||
|
|
||||||
rootView.addView(toolbar, 0);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
|
||||||
import app.revanced.extension.youtube.ThemeHelper;
|
import app.revanced.extension.youtube.ThemeHelper;
|
||||||
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
|
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
|
||||||
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
|
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
|
||||||
@ -83,7 +82,7 @@ public class LicenseActivityHook {
|
|||||||
ViewGroup toolbar = activity.findViewById(getToolbarResourceId());
|
ViewGroup toolbar = activity.findViewById(getToolbarResourceId());
|
||||||
ImageButton imageButton = Objects.requireNonNull(getChildView(toolbar, false,
|
ImageButton imageButton = Objects.requireNonNull(getChildView(toolbar, false,
|
||||||
view -> view instanceof ImageButton));
|
view -> view instanceof ImageButton));
|
||||||
imageButton.setImageDrawable(AbstractPreferenceFragment.getBackButtonDrawable());
|
imageButton.setImageDrawable(ReVancedPreferenceFragment.getBackButtonDrawable());
|
||||||
imageButton.setOnClickListener(view -> activity.onBackPressed());
|
imageButton.setOnClickListener(view -> activity.onBackPressed());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +1,27 @@
|
|||||||
package app.revanced.extension.youtube.settings.preference;
|
package app.revanced.extension.youtube.settings.preference;
|
||||||
|
|
||||||
|
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.graphics.Insets;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceScreen;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.WindowInsets;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
|
import app.revanced.extension.shared.Utils;
|
||||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
||||||
|
import app.revanced.extension.youtube.ThemeHelper;
|
||||||
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
|
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
|
||||||
import app.revanced.extension.youtube.settings.Settings;
|
import app.revanced.extension.youtube.settings.Settings;
|
||||||
|
|
||||||
@ -18,12 +32,23 @@ import app.revanced.extension.youtube.settings.Settings;
|
|||||||
*/
|
*/
|
||||||
public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||||
|
|
||||||
|
@SuppressLint("UseCompatLoadingForDrawables")
|
||||||
|
public static Drawable getBackButtonDrawable() {
|
||||||
|
final int backButtonResource = getResourceIdentifier(ThemeHelper.isDarkTheme()
|
||||||
|
? "yt_outline_arrow_left_white_24"
|
||||||
|
: "yt_outline_arrow_left_black_24",
|
||||||
|
"drawable");
|
||||||
|
return Utils.getContext().getResources().getDrawable(backButtonResource);
|
||||||
|
}
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
@Override
|
@Override
|
||||||
protected void initialize() {
|
protected void initialize() {
|
||||||
super.initialize();
|
super.initialize();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
setPreferenceScreenToolbar(getPreferenceScreen());
|
||||||
|
|
||||||
// If the preference was included, then initialize it based on the available playback speed.
|
// If the preference was included, then initialize it based on the available playback speed.
|
||||||
Preference defaultSpeedPreference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key);
|
Preference defaultSpeedPreference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key);
|
||||||
if (defaultSpeedPreference instanceof ListPreference) {
|
if (defaultSpeedPreference instanceof ListPreference) {
|
||||||
@ -33,4 +58,56 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
|||||||
Logger.printException(() -> "initialize failure", ex);
|
Logger.printException(() -> "initialize failure", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) {
|
||||||
|
for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) {
|
||||||
|
Preference childPreference = parentScreen.getPreference(i);
|
||||||
|
if (childPreference instanceof PreferenceScreen) {
|
||||||
|
// Recursively set sub preferences.
|
||||||
|
setPreferenceScreenToolbar((PreferenceScreen) childPreference);
|
||||||
|
|
||||||
|
childPreference.setOnPreferenceClickListener(
|
||||||
|
childScreen -> {
|
||||||
|
Dialog preferenceScreenDialog = ((PreferenceScreen) childScreen).getDialog();
|
||||||
|
ViewGroup rootView = (ViewGroup) preferenceScreenDialog
|
||||||
|
.findViewById(android.R.id.content)
|
||||||
|
.getParent();
|
||||||
|
|
||||||
|
// Fix required for Android 15 and YT 19.45+
|
||||||
|
// FIXME:
|
||||||
|
// On Android 15 the text layout is not aligned the same as the parent
|
||||||
|
// screen and it looks a little off. Otherwise this works.
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
rootView.setOnApplyWindowInsetsListener((v, insets) -> {
|
||||||
|
Insets statusInsets = insets.getInsets(WindowInsets.Type.statusBars());
|
||||||
|
v.setPadding(0, statusInsets.top, 0, 0);
|
||||||
|
return insets;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Toolbar toolbar = new Toolbar(childScreen.getContext());
|
||||||
|
toolbar.setTitle(childScreen.getTitle());
|
||||||
|
toolbar.setNavigationIcon(getBackButtonDrawable());
|
||||||
|
toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss());
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
final int margin = (int) TypedValue.applyDimension(
|
||||||
|
TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()
|
||||||
|
);
|
||||||
|
toolbar.setTitleMargin(margin, 0, margin, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TextView toolbarTextView = Utils.getChildView(toolbar,
|
||||||
|
true, TextView.class::isInstance);
|
||||||
|
if (toolbarTextView != null) {
|
||||||
|
toolbarTextView.setTextColor(ThemeHelper.getForegroundColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
rootView.addView(toolbar, 0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import app.revanced.patches.all.misc.resources.addResources
|
|||||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||||
import app.revanced.patches.shared.misc.settings.preference.BasePreference
|
import app.revanced.patches.shared.misc.settings.preference.BasePreference
|
||||||
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
|
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
|
||||||
|
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
||||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory
|
import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.patches.shared.misc.settings.settingsPatch
|
import app.revanced.patches.shared.misc.settings.settingsPatch
|
||||||
@ -58,6 +59,12 @@ val settingsPatch = bytecodePatch(
|
|||||||
execute {
|
execute {
|
||||||
addResources("twitch", "misc.settings.settingsPatch")
|
addResources("twitch", "misc.settings.settingsPatch")
|
||||||
|
|
||||||
|
preferences += NonInteractivePreference(
|
||||||
|
key = "revanced_about",
|
||||||
|
tag = "app.revanced.extension.shared.settings.preference.ReVancedAboutPreference",
|
||||||
|
selectable = true,
|
||||||
|
)
|
||||||
|
|
||||||
PreferenceScreen.MISC.OTHER.addPreferences(
|
PreferenceScreen.MISC.OTHER.addPreferences(
|
||||||
// The debug setting is shared across multiple apps and the key must be the same.
|
// The debug setting is shared across multiple apps and the key must be the same.
|
||||||
// But the title and summary must be different, otherwise when the strings file is flattened
|
// But the title and summary must be different, otherwise when the strings file is flattened
|
||||||
|
@ -1269,6 +1269,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
|||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.settings.settingsPatch">
|
<patch id="misc.settings.settingsPatch">
|
||||||
<string name="revanced_settings">ReVanced Settings</string>
|
<string name="revanced_settings">ReVanced Settings</string>
|
||||||
|
<string name="revanced_about_title">About</string>
|
||||||
|
<string name="revanced_about_summary">About ReVanced</string>
|
||||||
<string name="revanced_ads_screen_title">Ads</string>
|
<string name="revanced_ads_screen_title">Ads</string>
|
||||||
<string name="revanced_ads_screen_summary">Ad blocking settings</string>
|
<string name="revanced_ads_screen_summary">Ad blocking settings</string>
|
||||||
<string name="revanced_chat_screen_title">Chat</string>
|
<string name="revanced_chat_screen_title">Chat</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user