Move optimization to later part of pipeline

We were checking if the theme didn't change a bit too early, not
allowing for the setting or managed users to be properly evaluated.

Test: manual, switching themes
Test: atest ThemeOverlayControllerTest
Fixes: 230625942
Fixes: 229837333
Change-Id: I164c0b9f045db9077efc1b0f48dfcbbbfea21520
This commit is contained in:
Lucas Dupin
2022-05-15 16:18:45 -07:00
parent bf7fddee01
commit 40f6700c52
2 changed files with 40 additions and 16 deletions

View File

@@ -48,6 +48,7 @@ import android.os.UserManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -474,10 +475,6 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
mThemeStyle = fetchThemeStyleFromSetting();
mSecondaryOverlay = getOverlay(mMainWallpaperColor, ACCENT, mThemeStyle);
mNeutralOverlay = getOverlay(mMainWallpaperColor, NEUTRAL, mThemeStyle);
if (colorSchemeIsApplied()) {
Log.d(TAG, "Skipping overlay creation. Theme was already: " + mColorScheme);
return;
}
mNeedsOverlayCreation = true;
if (DEBUG) {
Log.d(TAG, "fetched overlays. accent: " + mSecondaryOverlay
@@ -537,19 +534,28 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
/**
* Checks if the color scheme in mColorScheme matches the current system palettes.
* @param managedProfiles List of managed profiles for this user.
*/
private boolean colorSchemeIsApplied() {
return mResources.getColor(
android.R.color.system_accent1_500, mContext.getTheme())
== mColorScheme.getAccent1().get(6)
&& mResources.getColor(android.R.color.system_accent2_500, mContext.getTheme())
== mColorScheme.getAccent2().get(6)
&& mResources.getColor(android.R.color.system_accent3_500, mContext.getTheme())
== mColorScheme.getAccent3().get(6)
&& mResources.getColor(android.R.color.system_neutral1_500, mContext.getTheme())
== mColorScheme.getNeutral1().get(6)
&& mResources.getColor(android.R.color.system_neutral2_500, mContext.getTheme())
== mColorScheme.getNeutral2().get(6);
private boolean colorSchemeIsApplied(Set<UserHandle> managedProfiles) {
final ArraySet<UserHandle> allProfiles = new ArraySet<>(managedProfiles);
allProfiles.add(UserHandle.SYSTEM);
for (UserHandle userHandle : allProfiles) {
Resources res = userHandle.isSystem()
? mResources : mContext.createContextAsUser(userHandle, 0).getResources();
if (!(res.getColor(android.R.color.system_accent1_500, mContext.getTheme())
== mColorScheme.getAccent1().get(6)
&& res.getColor(android.R.color.system_accent2_500, mContext.getTheme())
== mColorScheme.getAccent2().get(6)
&& res.getColor(android.R.color.system_accent3_500, mContext.getTheme())
== mColorScheme.getAccent3().get(6)
&& res.getColor(android.R.color.system_neutral1_500, mContext.getTheme())
== mColorScheme.getNeutral1().get(6)
&& res.getColor(android.R.color.system_neutral2_500, mContext.getTheme())
== mColorScheme.getNeutral2().get(6))) {
return false;
}
}
return true;
}
private void updateThemeOverlays() {
@@ -622,6 +628,12 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
managedProfiles.add(userInfo.getUserHandle());
}
}
if (colorSchemeIsApplied(managedProfiles)) {
Log.d(TAG, "Skipping overlay creation. Theme was already: " + mColorScheme);
return;
}
if (DEBUG) {
Log.d(TAG, "Applying overlays: " + categoryToPackage.keySet().stream()
.map(key -> key + " -> " + categoryToPackage.get(key)).collect(

View File

@@ -729,6 +729,18 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM,
USER_SYSTEM);
reset(mResources);
when(mResources.getColor(eq(android.R.color.system_accent1_500), any()))
.thenReturn(mThemeOverlayController.mColorScheme.getAccent1().get(6));
when(mResources.getColor(eq(android.R.color.system_accent2_500), any()))
.thenReturn(mThemeOverlayController.mColorScheme.getAccent2().get(6));
when(mResources.getColor(eq(android.R.color.system_accent3_500), any()))
.thenReturn(mThemeOverlayController.mColorScheme.getAccent3().get(6));
when(mResources.getColor(eq(android.R.color.system_neutral1_500), any()))
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral1().get(6));
when(mResources.getColor(eq(android.R.color.system_neutral2_500), any()))
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral2().get(6));
// Defers event because we already have initial colors.
verify(mThemeOverlayApplier, never())
.applyCurrentUserOverlays(any(), any(), anyInt(), any());