Check and update Material You themes on app start.

This commit is contained in:
Docile-Alligator
2025-06-08 17:45:19 -04:00
parent 3ee688c710
commit 5d8a66b272
5 changed files with 87 additions and 18 deletions

View File

@ -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)

View File

@ -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;
});
}

View File

@ -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;
}
}

View File

@ -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";

View File

@ -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();