From 67c6c345ea606e23f8ca37b8383edd4d93165526 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Wed, 19 Nov 2025 14:11:13 +0200
Subject: [PATCH] Use bold icons by default with YT 20.31+
---
.../app/revanced/extension/shared/Utils.java | 17 ++++++++++++++
.../shared/settings/BaseSettings.java | 21 +++++++++++++++++-
.../AbstractPreferenceFragment.java | 6 ++---
.../CustomDialogListPreference.java | 8 +++----
.../FeatureFlagsManagerPreference.java | 3 ++-
.../preference/ToolbarPreferenceFragment.java | 6 ++---
.../search/BaseSearchViewController.java | 6 ++---
.../settings/search/SearchHistoryManager.java | 16 ++++++--------
.../ReVancedSettingsIconDynamicDrawable.java | 6 ++---
.../extension/youtube/settings/Settings.java | 10 +++++----
.../youtube/settings/YouTubeActivityHook.java | 22 +++++++++++++++----
.../sponsorblock/ui/CreateSegmentButton.java | 7 +++---
12 files changed, 88 insertions(+), 40 deletions(-)
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java
index fcd030fc2..e1d82f4e7 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java
@@ -82,6 +82,8 @@ public class Utils {
@Nullable
private static Boolean isDarkModeEnabled;
+ private static boolean appIsUsingBoldIcons;
+
// Cached Collator instance with its locale.
@Nullable
private static Locale cachedCollatorLocale;
@@ -830,6 +832,21 @@ public class Utils {
window.setBackgroundDrawable(null); // Remove default dialog background
}
+ /**
+ * @return If the unpatched app is currently using bold icons.
+ */
+ public static boolean appIsUsingBoldIcons() {
+ return appIsUsingBoldIcons;
+ }
+
+ /**
+ * Controls if ReVanced bold icons are shown in various places.
+ * @param boldIcons If the app is currently using bold icons.
+ */
+ public static void setAppIsUsingBoldIcons(boolean boldIcons) {
+ appIsUsingBoldIcons = boldIcons;
+ }
+
/**
* Sets the theme light color used by the app.
*/
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java
index f90be7a1c..b13c74c83 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java
@@ -5,6 +5,8 @@ import static java.lang.Boolean.TRUE;
import static app.revanced.extension.shared.patches.CustomBrandingPatch.BrandingTheme;
import static app.revanced.extension.shared.settings.Setting.parent;
+import app.revanced.extension.shared.Logger;
+
/**
* Settings shared across multiple apps.
*
@@ -24,11 +26,19 @@ public class BaseSettings {
* Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing.
*/
public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true);
- public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", TRUE, true);
+ /**
+ * Do not use this setting directly. Instead use {@link app.revanced.extension.shared.Utils#appIsUsingBoldIcons()}
+ */
+ public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", FALSE, true);
public static final BooleanSetting SETTINGS_SEARCH_HISTORY = new BooleanSetting("revanced_settings_search_history", TRUE, true);
public static final StringSetting SETTINGS_SEARCH_ENTRIES = new StringSetting("revanced_settings_search_entries", "");
+ /**
+ * The first time the app was launched with no previous app data (either a clean install, or after wiping app data).
+ */
+ public static final LongSetting FIRST_TIME_APP_LAUNCHED = new LongSetting("revanced_last_time_app_was_launched", -1L, false, false);
+
//
// Settings shared by YouTube and YouTube Music.
//
@@ -45,4 +55,13 @@ public class BaseSettings {
public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", 1, true);
public static final StringSetting DISABLED_FEATURE_FLAGS = new StringSetting("revanced_disabled_feature_flags", "", true, parent(DEBUG));
+
+ static {
+ final long now = System.currentTimeMillis();
+
+ if (FIRST_TIME_APP_LAUNCHED.get() < 0) {
+ Logger.printInfo(() -> "First launch of installation with no prior app data");
+ FIRST_TIME_APP_LAUNCHED.save(now);
+ }
+ }
}
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java
index d4534a8d5..70ae3a5ab 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java
@@ -106,9 +106,9 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
protected void initialize() {
String preferenceResourceName;
if (BaseSettings.SHOW_MENU_ICONS.get()) {
- preferenceResourceName = BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? "revanced_prefs_icons"
- : "revanced_prefs_icons_bold";
+ preferenceResourceName = Utils.appIsUsingBoldIcons()
+ ? "revanced_prefs_icons_bold"
+ : "revanced_prefs_icons";
} else {
preferenceResourceName = "revanced_prefs";
}
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java
index 32eccbd26..48c50c1f3 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java
@@ -22,7 +22,6 @@ import androidx.annotation.Nullable;
import app.revanced.extension.shared.ResourceType;
import app.revanced.extension.shared.Utils;
-import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.shared.ui.CustomDialog;
/**
@@ -134,10 +133,9 @@ public class CustomDialogListPreference extends ListPreference {
holder.placeholder = view.findViewById(ID_REVANCED_CHECK_ICON_PLACEHOLDER);
holder.itemText = view.findViewById(ID_REVANCED_ITEM_TEXT);
holder.checkIcon = view.findViewById(ID_REVANCED_CHECK_ICON);
- holder.checkIcon.setImageResource(
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? DRAWABLE_CHECKMARK
- : DRAWABLE_CHECKMARK_BOLD
+ holder.checkIcon.setImageResource(Utils.appIsUsingBoldIcons()
+ ? DRAWABLE_CHECKMARK_BOLD
+ : DRAWABLE_CHECKMARK
);
view.setTag(holder);
} else {
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java
index ab02804ad..061f230e4 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java
@@ -71,7 +71,8 @@ public class FeatureFlagsManagerPreference extends Preference {
* Flags to hide from the UI.
*/
private static final Set FLAGS_TO_IGNORE = Set.of(
- 45386834L // 'You' tab settings icon.
+ 45386834L, // 'You' tab settings icon.
+ 45685201L // Bold icons. Forcing off interferes with patch changes and YT icons are broken.
);
/**
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java
index 4a72e2e70..cc0a64274 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java
@@ -136,9 +136,9 @@ public class ToolbarPreferenceFragment extends AbstractPreferenceFragment {
@SuppressLint("UseCompatLoadingForDrawables")
public static Drawable getBackButtonDrawable() {
final int backButtonResource = Utils.getResourceIdentifierOrThrow(ResourceType.DRAWABLE,
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? "revanced_settings_toolbar_arrow_left"
- : "revanced_settings_toolbar_arrow_left_bold");
+ Utils.appIsUsingBoldIcons()
+ ? "revanced_settings_toolbar_arrow_left_bold"
+ : "revanced_settings_toolbar_arrow_left");
Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource);
customizeBackButtonDrawable(drawable);
return drawable;
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java
index f2b9f5578..3be942f6f 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java
@@ -91,9 +91,9 @@ public abstract class BaseSearchViewController {
* @return The search icon, either bold or not bold, depending on the ReVanced UI setting.
*/
public static int getSearchIcon() {
- return BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON
- : DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON_BOLD;
+ return Utils.appIsUsingBoldIcons()
+ ? DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON_BOLD
+ : DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON;
}
/**
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java
index c3a6705e2..773c8a924 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java
@@ -25,7 +25,7 @@ import java.util.LinkedList;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.ResourceType;
-import app.revanced.extension.shared.settings.BaseSettings;
+import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.settings.preference.BulletPointPreference;
import app.revanced.extension.shared.ui.CustomDialog;
@@ -340,10 +340,9 @@ public class SearchHistoryManager {
// Set history icon.
ImageView historyIcon = view.findViewById(ID_HISTORY_ICON);
- historyIcon.setImageResource(
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? ID_SEARCH_ARROW_TIME_ICON
- : ID_SEARCH_ARROW_TIME_ICON_BOLD
+ historyIcon.setImageResource(Utils.appIsUsingBoldIcons()
+ ? ID_SEARCH_ARROW_TIME_ICON_BOLD
+ : ID_SEARCH_ARROW_TIME_ICON
);
TextView historyText = view.findViewById(ID_HISTORY_TEXT);
@@ -352,10 +351,9 @@ public class SearchHistoryManager {
// Set click listener for delete icon.
ImageView deleteIcon = view.findViewById(ID_DELETE_ICON);
- deleteIcon.setImageResource(
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? ID_SEARCH_REMOVE_ICON
- : ID_SEARCH_REMOVE_ICON_BOLD
+ deleteIcon.setImageResource(Utils.appIsUsingBoldIcons()
+ ? ID_SEARCH_REMOVE_ICON_BOLD
+ : ID_SEARCH_REMOVE_ICON
);
deleteIcon.setOnClickListener(v -> createAndShowDialog(
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java
index 722c3dc24..0b74f45e8 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java
@@ -27,9 +27,9 @@ public class ReVancedSettingsIconDynamicDrawable extends Drawable {
public ReVancedSettingsIconDynamicDrawable() {
final int resId = Utils.getResourceIdentifier(ResourceType.DRAWABLE,
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? "revanced_settings_icon"
- : "revanced_settings_icon_bold"
+ Utils.appIsUsingBoldIcons()
+ ? "revanced_settings_icon_bold"
+ : "revanced_settings_icon"
);
icon = Utils.getContext().getDrawable(resId);
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
index 9d7f8f671..50d7f1376 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
@@ -519,10 +519,12 @@ public class Settings extends BaseSettings {
SPOOF_APP_VERSION.resetToDefault();
}
- if (!BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- && SPOOF_APP_VERSION.get() && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) {
- Logger.printInfo(() -> "Disabling bold icons that don't work with old spoof targets");
- BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.save(true);
+ if (!BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() && SPOOF_APP_VERSION.get()
+ && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) {
+ Logger.printInfo(() -> "Temporarily disabling bold icons that don't work with old spoof targets");
+ // Don't save and only temporarily overwrite the value so
+ // if spoofing is turned off the old setting value is used.
+ BooleanSetting.privateSetValue(BaseSettings.SETTINGS_DISABLE_BOLD_ICONS, false);
}
// VR 1.61 is not selectable in the settings, and it's selected by spoof stream patch if needed.
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java
index fee16f431..218b93dca 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java
@@ -16,13 +16,27 @@ import app.revanced.extension.youtube.settings.preference.YouTubePreferenceFragm
import app.revanced.extension.youtube.settings.search.YouTubeSearchViewController;
/**
- * Hooks LicenseActivity to inject a custom {@link YouTubePreferenceFragment} with a toolbar and search functionality.
+ * Hooks LicenseActivity to inject a custom {@link YouTubePreferenceFragment}
+ * with a toolbar and search functionality.
*/
@SuppressWarnings("deprecation")
public class YouTubeActivityHook extends BaseActivityHook {
- private static final boolean SETTINGS_DISABLE_BOLD_ICONS
- = Settings.SETTINGS_DISABLE_BOLD_ICONS.get();
+ /**
+ * How much time has passed since the first launch of the app. Simple check to prevent
+ * forcing bold icons on first launch where the settings menu is partially broken
+ * due to missing icon resources the client has not yet received.
+ */
+ private static final long MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS = 10 * 1000; // 10 seconds.
+
+ private static final boolean USE_BOLD_ICONS = VersionCheckPatch.IS_20_31_OR_GREATER
+ && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get()
+ && (System.currentTimeMillis() - Settings.FIRST_TIME_APP_LAUNCHED.get())
+ > MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS;
+
+ static {
+ Utils.setAppIsUsingBoldIcons(USE_BOLD_ICONS);
+ }
private static int currentThemeValueOrdinal = -1; // Must initially be a non-valid enum ordinal value.
@@ -157,6 +171,6 @@ public class YouTubeActivityHook extends BaseActivityHook {
*/
@SuppressWarnings("unused")
public static boolean useBoldIcons(boolean original) {
- return !SETTINGS_DISABLE_BOLD_ICONS;
+ return USE_BOLD_ICONS;
}
}
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java
index c7469c44d..6307aca67 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java
@@ -8,7 +8,6 @@ import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.ResourceType;
import app.revanced.extension.shared.Utils;
-import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
import app.revanced.extension.youtube.videoplayer.PlayerControlButton;
@@ -17,9 +16,9 @@ import app.revanced.extension.youtube.videoplayer.PlayerControlButton;
public class CreateSegmentButton {
private static final int DRAWABLE_SB_LOGO = Utils.getResourceIdentifierOrThrow(
- ResourceType.DRAWABLE, BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get()
- ? "revanced_sb_logo"
- : "revanced_sb_logo_bold"
+ ResourceType.DRAWABLE, Utils.appIsUsingBoldIcons()
+ ? "revanced_sb_logo_bold"
+ : "revanced_sb_logo"
);
@Nullable