From b5f9a951d379e7313baa26f77cd31876dbebb543 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:30:25 +0900 Subject: [PATCH] feat(YouTube - Navigation bar components): Separate `Enable translucent navigation bar` setting into `Disable light translucent bar` and `Disable dark translucent bar` settings --- .../extension/shared/utils/Utils.java | 10 +++++++ .../youtube/patches/general/GeneralPatch.java | 30 ++++++++++++++++--- .../extension/youtube/settings/Settings.java | 3 +- .../ReVancedSettingsPreference.java | 5 ++-- .../general/navigation/Fingerprints.kt | 22 ++++++++++++-- .../NavigationBarComponentsPatch.kt | 25 ++++++++++++---- .../youtube/settings/host/values/strings.xml | 9 ++++-- .../youtube/settings/xml/revanced_prefs.xml | 3 +- 8 files changed, 87 insertions(+), 20 deletions(-) diff --git a/extensions/shared/src/main/java/app/revanced/extension/shared/utils/Utils.java b/extensions/shared/src/main/java/app/revanced/extension/shared/utils/Utils.java index b0fbf2a62..d8e6a0afc 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/shared/utils/Utils.java +++ b/extensions/shared/src/main/java/app/revanced/extension/shared/utils/Utils.java @@ -462,6 +462,16 @@ public class Utils { return false; } + public static boolean isDarkModeEnabled() { + return isDarkModeEnabled(context); + } + + public static boolean isDarkModeEnabled(Context context) { + Configuration config = context.getResources().getConfiguration(); + final int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK; + return currentNightMode == Configuration.UI_MODE_NIGHT_YES; + } + /** * @return whether the device's API level is higher than a specific SDK version. */ diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/general/GeneralPatch.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/general/GeneralPatch.java index f1dd20b99..2530994e8 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/general/GeneralPatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/general/GeneralPatch.java @@ -5,6 +5,7 @@ import static app.revanced.extension.shared.utils.Utils.getChildView; import static app.revanced.extension.shared.utils.Utils.hideViewByLayoutParams; import static app.revanced.extension.shared.utils.Utils.hideViewGroupByMarginLayoutParams; import static app.revanced.extension.shared.utils.Utils.hideViewUnderCondition; +import static app.revanced.extension.shared.utils.Utils.isSDKAbove; import static app.revanced.extension.youtube.patches.utils.PatchStatus.ImageSearchButton; import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; @@ -214,10 +215,6 @@ public class GeneralPatch { return Settings.ENABLE_NARROW_NAVIGATION_BUTTONS.get() || original; } - public static boolean enableTranslucentNavigationBar() { - return Settings.ENABLE_TRANSLUCENT_NAVIGATION_BAR.get(); - } - /** * @noinspection ALL */ @@ -248,6 +245,31 @@ public class GeneralPatch { hideViewUnderCondition(Settings.HIDE_NAVIGATION_BAR.get(), view); } + private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT + = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT.get(); + + private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); + + public static boolean useTranslucentNavigationButtons(boolean original) { + // Feature requires Android 13+ + if (!isSDKAbove(33)) { + return original; + } + + if (!DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { + return original; + } + + if (DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { + return false; + } + + return Utils.isDarkModeEnabled() + ? !DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + : !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT; + } + // endregion // region [Remove viewer discretion dialog] patch diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 6d6d6f1a0..ee7bf2417 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -189,7 +189,8 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_NAVIGATION_SUBSCRIPTIONS_BUTTON = new BooleanSetting("revanced_hide_navigation_subscriptions_button", FALSE, true); public static final BooleanSetting HIDE_NAVIGATION_LABEL = new BooleanSetting("revanced_hide_navigation_label", FALSE, true); public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); - public static final BooleanSetting ENABLE_TRANSLUCENT_NAVIGATION_BAR = new BooleanSetting("revanced_enable_translucent_navigation_bar", FALSE, true); + public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); + public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = new BooleanSetting("revanced_disable_translucent_navigation_bar_dark", FALSE, true); public static final BooleanSetting HIDE_NAVIGATION_BAR = new BooleanSetting("revanced_hide_navigation_bar", FALSE, true); // PreferenceScreen: General - Override buttons diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedSettingsPreference.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedSettingsPreference.java index e902d2ab8..d1dfbcdb4 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedSettingsPreference.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedSettingsPreference.java @@ -204,8 +204,9 @@ public class ReVancedSettingsPreference extends ReVancedPreferenceFragment { Settings.REPLACE_TOOLBAR_CREATE_BUTTON_TYPE ); enableDisablePreferences( - !isSDKAbove(31), - Settings.ENABLE_TRANSLUCENT_NAVIGATION_BAR + !isSDKAbove(33), + Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT, + Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK ); } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/Fingerprints.kt index adc587729..eadcf1f5e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/Fingerprints.kt @@ -74,7 +74,23 @@ internal val setEnumMapFingerprint = legacyFingerprint( literals = listOf(ytFillBell), ) -internal val translucentNavigationBarFingerprint = legacyFingerprint( - name = "translucentNavigationBarFingerprint", - literals = listOf(45630927L), +internal const val TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG = 45630927L + +internal val translucentNavigationButtonsFeatureFlagFingerprint = legacyFingerprint( + name = "translucentNavigationButtonsFeatureFlagFingerprint", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "V", + literals = listOf(TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG) +) + +/** + * The device on screen back/home/recent buttons. + */ +internal const val TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG = 45632194L + +internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = legacyFingerprint( + name = "translucentNavigationButtonsSystemFeatureFlagFingerprint", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Z", + literals = listOf(TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG) ) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/NavigationBarComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/NavigationBarComponentsPatch.kt index 8524ae122..dbd8c7321 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/NavigationBarComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/general/navigation/NavigationBarComponentsPatch.kt @@ -11,7 +11,7 @@ import app.revanced.patches.youtube.utils.navigation.addBottomBarContainerHook import app.revanced.patches.youtube.utils.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.utils.navigation.navigationBarHookPatch import app.revanced.patches.youtube.utils.patch.PatchList.NAVIGATION_BAR_COMPONENTS -import app.revanced.patches.youtube.utils.playservice.is_19_23_or_greater +import app.revanced.patches.youtube.utils.playservice.is_19_25_or_greater import app.revanced.patches.youtube.utils.playservice.is_19_28_or_greater import app.revanced.patches.youtube.utils.playservice.versionCheckPatch import app.revanced.patches.youtube.utils.resourceid.sharedResourceIdPatch @@ -84,11 +84,24 @@ val navigationBarComponentsPatch = bytecodePatch( // region patch for enable translucent navigation bar - if (is_19_23_or_greater) { - translucentNavigationBarFingerprint.injectLiteralInstructionBooleanCall( - 45630927L, - "$GENERAL_CLASS_DESCRIPTOR->enableTranslucentNavigationBar()Z" - ) + if (is_19_25_or_greater) { + arrayOf( + Triple( + translucentNavigationButtonsFeatureFlagFingerprint, + TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG, + "useTranslucentNavigationButtons" + ), + Triple( + translucentNavigationButtonsSystemFeatureFlagFingerprint, + TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG, + "useTranslucentNavigationButtons" + ) + ).forEach { + it.first.injectLiteralInstructionBooleanCall( + it.second, + "$GENERAL_CLASS_DESCRIPTOR->${it.third}(Z)Z" + ) + } settingArray += "SETTINGS: TRANSLUCENT_NAVIGATION_BAR" } diff --git a/patches/src/main/resources/youtube/settings/host/values/strings.xml b/patches/src/main/resources/youtube/settings/host/values/strings.xml index 485e0c2e8..ca90f5ab4 100644 --- a/patches/src/main/resources/youtube/settings/host/values/strings.xml +++ b/patches/src/main/resources/youtube/settings/host/values/strings.xml @@ -537,9 +537,12 @@ Also, ads will no longer be blocked in Shorts. If this setting do not take effect, try switching to Incognito mode." - Enable translucent navigation bar - Navigation bar is translucent. - Navigation bar is opaque. + Disable light translucent bar + Light mode navigation bar is opaque. + Light mode navigation bar is opaque or translucent. + Disable dark translucent bar + Dark mode navigation bar is opaque. + Dark mode navigation bar is opaque or translucent. Hide navigation bar Navigation bar is hidden. Navigation bar is shown. diff --git a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml index 9accb1174..4f2ee4e33 100644 --- a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -214,7 +214,8 @@ SETTINGS: HIDE_NAVIGATION_COMPONENTS --> + + SETTINGS: TRANSLUCENT_NAVIGATION_BAR -->