diff --git a/extensions/shared/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index b7dd65063..902b95897 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -1,23 +1,13 @@ package app.revanced.extension.shared.settings.preference; import static app.revanced.extension.shared.StringRef.str; -import static app.revanced.extension.shared.Utils.getResourceIdentifier; import android.annotation.SuppressLint; import android.app.AlertDialog; -import android.app.Dialog; import android.content.Context; import android.content.SharedPreferences; -import android.graphics.Insets; -import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; 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.Nullable; @@ -29,7 +19,6 @@ import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BooleanSetting; import app.revanced.extension.shared.settings.Setting; -import app.revanced.extension.youtube.ThemeHelper; @SuppressWarnings("deprecation") 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. @@ -284,7 +265,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { // causes a callback to the listener even though nothing changed. initialize(); updateUIToSettingValues(); - setPreferenceScreenToolbar(getPreferenceScreen()); preferenceManager.getSharedPreferences().registerOnSharedPreferenceChangeListener(listener); } catch (Exception ex) { @@ -297,56 +277,4 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener); 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; - } - ); - } - } - } } diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java index 51409e2e4..1ca0f5c19 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java @@ -7,7 +7,6 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; 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.settings.preference.ReVancedPreferenceFragment; import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment; @@ -83,7 +82,7 @@ public class LicenseActivityHook { ViewGroup toolbar = activity.findViewById(getToolbarResourceId()); ImageButton imageButton = Objects.requireNonNull(getChildView(toolbar, false, view -> view instanceof ImageButton)); - imageButton.setImageDrawable(AbstractPreferenceFragment.getBackButtonDrawable()); + imageButton.setImageDrawable(ReVancedPreferenceFragment.getBackButtonDrawable()); imageButton.setOnClickListener(view -> activity.onBackPressed()); } diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index a22206f22..9e6cdeeeb 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -1,13 +1,27 @@ 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.preference.ListPreference; 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 app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; 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.settings.Settings; @@ -18,12 +32,23 @@ import app.revanced.extension.youtube.settings.Settings; */ 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) @Override protected void initialize() { super.initialize(); try { + setPreferenceScreenToolbar(getPreferenceScreen()); + // If the preference was included, then initialize it based on the available playback speed. Preference defaultSpeedPreference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key); if (defaultSpeedPreference instanceof ListPreference) { @@ -33,4 +58,56 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { 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; + } + ); + } + } + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt index 71bc5f54a..7d14e7adb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt @@ -11,6 +11,7 @@ import app.revanced.patches.all.misc.resources.addResources 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.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.SwitchPreference import app.revanced.patches.shared.misc.settings.settingsPatch @@ -58,6 +59,12 @@ val settingsPatch = bytecodePatch( execute { addResources("twitch", "misc.settings.settingsPatch") + preferences += NonInteractivePreference( + key = "revanced_about", + tag = "app.revanced.extension.shared.settings.preference.ReVancedAboutPreference", + selectable = true, + ) + PreferenceScreen.MISC.OTHER.addPreferences( // 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 diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 0b837bdf7..c8a363685 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1269,6 +1269,8 @@ This is because Crowdin requires temporarily flattening this file and removing t ReVanced Settings + About + About ReVanced Ads Ad blocking settings Chat