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