From 40f6700c52a2cb7c35fc6db60e1dfe138122ff45 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Sun, 15 May 2022 16:18:45 -0700 Subject: [PATCH] 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 --- .../theme/ThemeOverlayController.java | 44 ++++++++++++------- .../theme/ThemeOverlayControllerTest.java | 12 +++++ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index 7920d388c6702..fa906c489f4a5 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -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 managedProfiles) { + final ArraySet 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( diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java index 3dfc94bcd5b61..c625dc7d4b508 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -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());