Update icon tint color when the user toggles Dark theme
- Reload theme in slice provider when Dark theme mode changes for slices
- Reload theme in onCreate of Panel activity for its non-slice header
- Remove applyTheme from individual slices
Test: robotest
Fixes: 153700819
Change-Id: I40a7d2817c4b9100d7b2f2962a69c8a9ce6f7906
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 2391fe8..d34dbcf 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -42,6 +42,7 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.Cursor;
@@ -1101,4 +1102,13 @@
context.getString(R.string.config_settingsintelligence_package_name));
return isSettingsIntelligence;
}
+
+ /**
+ * Returns true if the night mode is enabled.
+ */
+ public static boolean isNightMode(Context context) {
+ final int currentNightMode =
+ context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
+ }
}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 25a6841..79be26d 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -105,9 +105,6 @@
return null;
}
- // Reload theme for switching dark mode on/off
- mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
-
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
.setAccentColor(COLOR_NOT_TINTED);
diff --git a/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java b/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
index 1c1bedc..f934d58 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
@@ -24,7 +24,6 @@
import android.app.UiModeManager;
import android.content.Context;
import android.content.Intent;
-import android.content.res.Configuration;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.BatteryManager;
@@ -107,7 +106,7 @@
final IconCompat icon =
IconCompat.createWithResource(mContext, R.drawable.dark_theme);
- final boolean isChecked = isDarkThemeMode(mContext);
+ final boolean isChecked = Utils.isNightMode(mContext);
if (sPreChecked != isChecked) {
// Dark(Night) mode changed and reset the sSliceClicked.
resetValue(isChecked, false);
@@ -157,7 +156,7 @@
@VisibleForTesting
boolean isAvailable(Context context) {
// check if dark theme mode is enabled or if dark theme scheduling is on.
- if (isDarkThemeMode(context) || isNightModeScheduled()) {
+ if (Utils.isNightMode(context) || isNightModeScheduled()) {
return false;
}
// checking the current battery level
@@ -167,13 +166,6 @@
return level <= BATTERY_LEVEL_THRESHOLD;
}
- @VisibleForTesting
- static boolean isDarkThemeMode(Context context) {
- final int currentNightMode =
- context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
- return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
- }
-
private void resetValue(boolean preChecked, boolean clicked) {
sPreChecked = preChecked;
sSliceClicked = clicked;
diff --git a/src/com/android/settings/media/MediaOutputGroupSlice.java b/src/com/android/settings/media/MediaOutputGroupSlice.java
index be6c298..d75ec74 100644
--- a/src/com/android/settings/media/MediaOutputGroupSlice.java
+++ b/src/com/android/settings/media/MediaOutputGroupSlice.java
@@ -75,8 +75,6 @@
@Override
public Slice getSlice() {
- // Reload theme for switching dark mode on/off
- mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
.setAccentColor(COLOR_NOT_TINTED);
// Add "Group" row
diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java
index df9538b..773013e 100644
--- a/src/com/android/settings/media/MediaOutputSlice.java
+++ b/src/com/android/settings/media/MediaOutputSlice.java
@@ -81,9 +81,6 @@
@Override
public Slice getSlice() {
- // Reload theme for switching dark mode on/off
- mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
-
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
.setAccentColor(COLOR_NOT_TINTED);
if (!isVisible()) {
diff --git a/src/com/android/settings/panel/SettingsPanelActivity.java b/src/com/android/settings/panel/SettingsPanelActivity.java
index 6bf016e..68cb8d5 100644
--- a/src/com/android/settings/panel/SettingsPanelActivity.java
+++ b/src/com/android/settings/panel/SettingsPanelActivity.java
@@ -66,6 +66,7 @@
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ getApplicationContext().getTheme().rebase();
createOrUpdatePanel(true /* shouldForceCreation */);
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
}
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 0aaf85d..6c245ce 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -140,8 +140,11 @@
@VisibleForTesting
Map<Uri, SliceData> mSliceWeakDataCache;
+ @VisibleForTesting
final Map<Uri, SliceBackgroundWorker> mPinnedWorkers = new ArrayMap<>();
+ private boolean mNightMode;
+
public SettingsSliceProvider() {
super(READ_SEARCH_INDEXABLES);
}
@@ -150,6 +153,8 @@
public boolean onCreateSliceProvider() {
mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(getContext());
mSliceWeakDataCache = new WeakHashMap<>();
+ mNightMode = Utils.isNightMode(getContext());
+ getContext().setTheme(R.style.Theme_SettingsBase);
return true;
}
@@ -201,6 +206,13 @@
return null;
}
+ final boolean nightMode = Utils.isNightMode(getContext());
+ if (mNightMode != nightMode) {
+ Log.d(TAG, "Night mode changed, reload theme");
+ mNightMode = nightMode;
+ getContext().getTheme().rebase();
+ }
+
// Before adding a slice to {@link CustomSliceManager}, please get approval
// from the Settings team.
if (CustomSliceRegistry.isValidUri(sliceUri)) {
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 2d5b4aa..391e9fd 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -73,8 +73,6 @@
* {@param sliceData} is an inline controller.
*/
public static Slice buildSlice(Context context, SliceData sliceData) {
- // Reload theme for switching dark mode on/off
- context.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController());
final BasePreferenceController controller = getPreferenceController(context, sliceData);
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index fd27970..a489b05 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -86,9 +86,6 @@
@Override
public Slice getSlice() {
- // Reload theme for switching dark mode on/off
- mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
-
final boolean isWifiEnabled = isWifiEnabled();
ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* accessPoint */);
if (!isWifiEnabled) {