From 5d8a66b27267fabe358e30bc71ad9c84cc53dee9 Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Sun, 8 Jun 2025 17:45:19 -0400 Subject: [PATCH] Check and update Material You themes on app start. --- .../infinityforreddit/Infinity.java | 53 +++++++++++++++++++ .../settings/ThemePreferenceFragment.java | 12 +++-- .../utils/MaterialYouUtils.java | 34 +++++++----- .../utils/SharedPreferencesUtils.java | 1 + .../worker/MaterialYouWorker.java | 5 +- 5 files changed, 87 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java index b6fe501a..23bed206 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java @@ -2,6 +2,8 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; import android.app.Application; +import android.app.WallpaperColors; +import android.app.WallpaperManager; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; @@ -9,6 +11,8 @@ import android.graphics.Typeface; import android.net.ConnectivityManager; import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.WindowManager; import android.widget.Toast; @@ -26,18 +30,22 @@ import com.livefront.bridge.SavedStateHandler; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import java.util.concurrent.Executor; + import javax.inject.Inject; import javax.inject.Named; import ml.docilealligator.infinityforreddit.activities.LockScreenActivity; import ml.docilealligator.infinityforreddit.broadcastreceivers.NetworkWifiStatusReceiver; import ml.docilealligator.infinityforreddit.broadcastreceivers.WallpaperChangeReceiver; +import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.events.ChangeAppLockEvent; import ml.docilealligator.infinityforreddit.events.ChangeNetworkStatusEvent; import ml.docilealligator.infinityforreddit.events.ToggleSecureModeEvent; import ml.docilealligator.infinityforreddit.font.ContentFontFamily; import ml.docilealligator.infinityforreddit.font.FontFamily; import ml.docilealligator.infinityforreddit.font.TitleFontFamily; +import ml.docilealligator.infinityforreddit.utils.MaterialYouUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -57,6 +65,24 @@ public class Infinity extends Application implements LifecycleObserver { @Inject @Named("security") SharedPreferences mSecuritySharedPreferences; + @Inject + @Named("internal") + SharedPreferences mInternalSharedPreferences; + @Inject + @Named("light_theme") + SharedPreferences lightThemeSharedPreferences; + @Inject + @Named("dark_theme") + SharedPreferences darkThemeSharedPreferences; + @Inject + @Named("amoled_theme") + SharedPreferences amoledThemeSharedPreferences; + @Inject + RedditDataRoomDatabase redditDataRoomDatabase; + @Inject + CustomThemeWrapper customThemeWrapper; + @Inject + Executor executor; @Override public void onCreate() { @@ -165,6 +191,33 @@ public class Infinity extends Application implements LifecycleObserver { registerReceiver(mNetworkWifiStatusReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); registerReceiver(new WallpaperChangeReceiver(mSharedPreferences), new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED)); } + + if (mSharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_MATERIAL_YOU, false)) { + int sentryColor = mInternalSharedPreferences.getInt(SharedPreferencesUtils.MATERIAL_YOU_SENTRY_COLOR, 0); + boolean sentryColorHasChanged = false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (sentryColor != getColor(android.R.color.system_accent1_100)) { + sentryColorHasChanged = true; + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); + WallpaperColors wallpaperColors = wallpaperManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM); + + if (wallpaperColors != null) { + int colorPrimaryInt = wallpaperColors.getPrimaryColor().toArgb(); + if (sentryColor != colorPrimaryInt) { + sentryColorHasChanged = true; + } + } + } + + if (sentryColorHasChanged) { + MaterialYouUtils.changeThemeASync(this, executor, new Handler(Looper.getMainLooper()), + redditDataRoomDatabase, customThemeWrapper, + lightThemeSharedPreferences, darkThemeSharedPreferences, + amoledThemeSharedPreferences, mInternalSharedPreferences, null); + } + } } @OnLifecycleEvent(Lifecycle.Event.ON_START) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java index f2539426..6d6fdcd5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java @@ -11,6 +11,7 @@ import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.app.ActivityCompat; @@ -60,6 +61,9 @@ public class ThemePreferenceFragment extends CustomFontPreferenceFragmentCompat @Inject RedditDataRoomDatabase redditDataRoomDatabase; @Inject + @Named("internal") + SharedPreferences mInternalSharedPreferences; + @Inject CustomThemeWrapper customThemeWrapper; @Inject Executor executor; @@ -175,10 +179,10 @@ public class ThemePreferenceFragment extends CustomFontPreferenceFragmentCompat enableMaterialYouSwitchPreference.setOnPreferenceChangeListener((preference, newValue) -> { if ((Boolean) newValue) { - MaterialYouUtils.changeThemeASync(activity, executor, new Handler(), + MaterialYouUtils.changeThemeASync(activity, executor, new Handler(Looper.getMainLooper()), redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, - amoledThemeSharedPreferences, null); + amoledThemeSharedPreferences, mInternalSharedPreferences, null); applyMaterialYouPreference.setVisible(true); } else { applyMaterialYouPreference.setVisible(false); @@ -187,10 +191,10 @@ public class ThemePreferenceFragment extends CustomFontPreferenceFragmentCompat }); applyMaterialYouPreference.setOnPreferenceClickListener(preference -> { - MaterialYouUtils.changeThemeASync(activity, executor, new Handler(), + MaterialYouUtils.changeThemeASync(activity, executor, new Handler(Looper.getMainLooper()), redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, - amoledThemeSharedPreferences, null); + amoledThemeSharedPreferences, mInternalSharedPreferences, null); return true; }); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java index 08bb0fb0..fbc529cc 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java @@ -41,15 +41,17 @@ public class MaterialYouUtils { } public static void changeThemeSync(Context context, - RedditDataRoomDatabase redditDataRoomDatabase, - CustomThemeWrapper customThemeWrapper, - SharedPreferences lightThemeSharedPreferences, - SharedPreferences darkThemeSharedPreferences, - SharedPreferences amoledThemeSharedPreferences) { + RedditDataRoomDatabase redditDataRoomDatabase, + CustomThemeWrapper customThemeWrapper, + SharedPreferences lightThemeSharedPreferences, + SharedPreferences darkThemeSharedPreferences, + SharedPreferences amoledThemeSharedPreferences, + SharedPreferences internalSharedPreferences) { try { Thread.sleep(2000); - } catch (InterruptedException ignored) { } - if (changeTheme(context, redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences)) { + } catch (InterruptedException ignored) { + } + if (changeTheme(context, redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences, internalSharedPreferences)) { EventBus.getDefault().post(new RecreateActivityEvent()); } } @@ -60,12 +62,13 @@ public class MaterialYouUtils { SharedPreferences lightThemeSharedPreferences, SharedPreferences darkThemeSharedPreferences, SharedPreferences amoledThemeSharedPreferences, + SharedPreferences internalSharedPreferences, @Nullable MaterialYouListener materialYouListener) { executor.execute(() -> { try { Thread.sleep(2000); } catch (InterruptedException ignored) { } - if (changeTheme(context, redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences)) { + if (changeTheme(context, redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences, internalSharedPreferences)) { handler.post(() -> { if (materialYouListener != null) { materialYouListener.applied(); @@ -77,11 +80,12 @@ public class MaterialYouUtils { } private static boolean changeTheme(Context context, - RedditDataRoomDatabase redditDataRoomDatabase, - CustomThemeWrapper customThemeWrapper, - SharedPreferences lightThemeSharedPreferences, - SharedPreferences darkThemeSharedPreferences, - SharedPreferences amoledThemeSharedPreferences) { + RedditDataRoomDatabase redditDataRoomDatabase, + CustomThemeWrapper customThemeWrapper, + SharedPreferences lightThemeSharedPreferences, + SharedPreferences darkThemeSharedPreferences, + SharedPreferences amoledThemeSharedPreferences, + SharedPreferences internalSharedPreferences) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { CustomTheme lightTheme = CustomThemeWrapper.getIndigo(context); CustomTheme darkTheme = CustomThemeWrapper.getIndigoDark(context); @@ -165,6 +169,8 @@ public class MaterialYouUtils { CustomThemeSharedPreferencesUtils.insertThemeToSharedPreferences(darkTheme, darkThemeSharedPreferences); CustomThemeSharedPreferencesUtils.insertThemeToSharedPreferences(amoledTheme, amoledThemeSharedPreferences); + internalSharedPreferences.edit().putInt(SharedPreferencesUtils.MATERIAL_YOU_SENTRY_COLOR, context.getColor(android.R.color.system_accent1_100)).apply(); + return true; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); @@ -237,6 +243,8 @@ public class MaterialYouUtils { CustomThemeSharedPreferencesUtils.insertThemeToSharedPreferences(darkTheme, darkThemeSharedPreferences); CustomThemeSharedPreferencesUtils.insertThemeToSharedPreferences(amoledTheme, amoledThemeSharedPreferences); + internalSharedPreferences.edit().putInt(SharedPreferencesUtils.MATERIAL_YOU_SENTRY_COLOR, wallpaperColors.getPrimaryColor().toArgb()).apply(); + return true; } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java index d36ad542..6cdfdc24 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java @@ -426,6 +426,7 @@ public class SharedPreferencesUtils { public static final String INTERNAL_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.internal"; public static final String HAS_REQUESTED_NOTIFICATION_PERMISSION = "has_requested_notification_permission"; public static final String DO_NOT_SHOW_REDDIT_API_INFO_V2_AGAIN = "do_not_show_reddit_api_info_v2_again"; + public static final String MATERIAL_YOU_SENTRY_COLOR = "material_you_sentry_color"; public static final String PROXY_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.proxy"; public static final String PROXY_ENABLED = "proxy_enabled"; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/worker/MaterialYouWorker.java b/app/src/main/java/ml/docilealligator/infinityforreddit/worker/MaterialYouWorker.java index 792bc2ed..2b3eb9bd 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/worker/MaterialYouWorker.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/worker/MaterialYouWorker.java @@ -32,6 +32,9 @@ public class MaterialYouWorker extends Worker { @Named("amoled_theme") SharedPreferences amoledThemeSharedPreferences; @Inject + @Named("internal") + SharedPreferences mInternalSharedPreferences; + @Inject RedditDataRoomDatabase redditDataRoomDatabase; @Inject CustomThemeWrapper customThemeWrapper; @@ -49,7 +52,7 @@ public class MaterialYouWorker extends Worker { if (mSharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_MATERIAL_YOU, false)) { MaterialYouUtils.changeThemeSync(context, redditDataRoomDatabase, customThemeWrapper, lightThemeSharedPreferences, darkThemeSharedPreferences, - amoledThemeSharedPreferences); + amoledThemeSharedPreferences, mInternalSharedPreferences); } return Result.success();