diff options
| author | 2021-03-03 01:32:20 +0000 | |
|---|---|---|
| committer | 2021-03-03 01:32:20 +0000 | |
| commit | 4973cb868bf4bc39b6b8125590cdad9aa339487a (patch) | |
| tree | d24960e6592927fcf4f2908462f8a5c26f5a10da | |
| parent | c74f9c2637d701d475d28201326960d0632d8059 (diff) | |
| parent | d90a66c6e85e0a697387eb78a44090df4857044a (diff) | |
Merge "Limit how often wallpapers can update system theme" into sc-dev
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java | 61 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java | 25 |
2 files changed, 39 insertions, 47 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index 5d028454a417..f19228783b88 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -43,7 +43,6 @@ import android.util.Log; import androidx.annotation.NonNull; -import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; import com.android.systemui.SystemUI; import com.android.systemui.broadcast.BroadcastDispatcher; @@ -87,12 +86,6 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { protected static final int SECONDARY = 1; protected static final int NEUTRAL = 2; - // If lock screen wallpaper colors should also be considered when selecting the theme. - // Doing this has performance impact, given that overlays would need to be swapped when - // the device unlocks. - @VisibleForTesting - static final boolean USE_LOCK_SCREEN_WALLPAPER = false; - private final ThemeOverlayApplier mThemeManager; private final UserManager mUserManager; private final BroadcastDispatcher mBroadcastDispatcher; @@ -103,7 +96,6 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { private final WallpaperManager mWallpaperManager; private final KeyguardStateController mKeyguardStateController; private final boolean mIsMonetEnabled; - private WallpaperColors mLockColors; private WallpaperColors mSystemColors; // If fabricated overlays were already created for the current theme. private boolean mNeedsOverlayCreation; @@ -117,6 +109,8 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { private FabricatedOverlay mSecondaryOverlay; // Neutral system colors overlay private FabricatedOverlay mNeutralOverlay; + // If wallpaper color event will be accepted and change the UI colors. + private boolean mAcceptColorEvents = true; @Inject public ThemeOverlayController(Context context, BroadcastDispatcher broadcastDispatcher, @@ -146,13 +140,20 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); + filter.addAction(Intent.ACTION_WALLPAPER_CHANGED); mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added."); - reevaluateSystemTheme(true /* forceReload */); + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction()) + || Intent.ACTION_MANAGED_PROFILE_ADDED.equals(intent.getAction())) { + if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added."); + reevaluateSystemTheme(true /* forceReload */); + } else if (Intent.ACTION_WALLPAPER_CHANGED.equals(intent.getAction())) { + mAcceptColorEvents = true; + Log.i(TAG, "Allowing color events again"); + } } - }, filter, mBgExecutor, UserHandle.ALL); + }, filter, mMainExecutor, UserHandle.ALL); mSecureSettings.registerContentObserverForUser( Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), false, @@ -170,38 +171,22 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { // Upon boot, make sure we have the most up to date colors mBgExecutor.execute(() -> { - WallpaperColors lockColors = mWallpaperManager.getWallpaperColors( - WallpaperManager.FLAG_LOCK); WallpaperColors systemColor = mWallpaperManager.getWallpaperColors( WallpaperManager.FLAG_SYSTEM); mMainExecutor.execute(() -> { - if (USE_LOCK_SCREEN_WALLPAPER) { - mLockColors = lockColors; - } mSystemColors = systemColor; reevaluateSystemTheme(false /* forceReload */); }); }); - if (USE_LOCK_SCREEN_WALLPAPER) { - mKeyguardStateController.addCallback(new KeyguardStateController.Callback() { - @Override - public void onKeyguardShowingChanged() { - if (mLockColors == null) { - return; - } - // It's possible that the user has a lock screen wallpaper. On this case we'll - // end up with different colors after unlocking. - reevaluateSystemTheme(false /* forceReload */); - } - }); - } mWallpaperManager.addOnColorsChangedListener((wallpaperColors, which) -> { - if (USE_LOCK_SCREEN_WALLPAPER && (which & WallpaperManager.FLAG_LOCK) != 0) { - mLockColors = wallpaperColors; - if (DEBUG) { - Log.d(TAG, "got new lock colors: " + wallpaperColors + " where: " + which); - } + if (!mAcceptColorEvents) { + Log.i(TAG, "Wallpaper color event rejected: " + wallpaperColors); + return; } + if (wallpaperColors != null && mAcceptColorEvents) { + mAcceptColorEvents = false; + } + if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { mSystemColors = wallpaperColors; if (DEBUG) { @@ -213,10 +198,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { } private void reevaluateSystemTheme(boolean forceReload) { - WallpaperColors currentColors = - mKeyguardStateController.isShowing() && mLockColors != null - ? mLockColors : mSystemColors; - + final WallpaperColors currentColors = mSystemColors; final int mainColor; final int accentCandidate; if (currentColors == null) { @@ -378,8 +360,6 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("USE_LOCK_SCREEN_WALLPAPER=" + USE_LOCK_SCREEN_WALLPAPER); - pw.println("mLockColors=" + mLockColors); pw.println("mSystemColors=" + mSystemColors); pw.println("mMainWallpaperColor=" + Integer.toHexString(mMainWallpaperColor)); pw.println("mWallpaperAccentColor=" + Integer.toHexString(mWallpaperAccentColor)); @@ -388,5 +368,6 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { pw.println("mNeutralOverlay=" + mNeutralOverlay); pw.println("mIsMonetEnabled=" + mIsMonetEnabled); pw.println("mNeedsOverlayCreation=" + mNeedsOverlayCreation); + pw.println("mAcceptColorEvents=" + mAcceptColorEvents); } } 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 d80c40fcd07b..8a0ac1111b59 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -19,13 +19,13 @@ package com.android.systemui.theme; import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ACCENT_COLOR; import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_NEUTRAL_PALETTE; import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SYSTEM_PALETTE; -import static com.android.systemui.theme.ThemeOverlayController.USE_LOCK_SCREEN_WALLPAPER; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -33,6 +33,8 @@ import static org.mockito.Mockito.when; import android.app.WallpaperColors; import android.app.WallpaperManager; +import android.content.BroadcastReceiver; +import android.content.Intent; import android.content.om.FabricatedOverlay; import android.content.om.OverlayIdentifier; import android.graphics.Color; @@ -91,7 +93,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { @Mock private FeatureFlags mFeatureFlags; @Captor - private ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateControllerCallback; + private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiver; @Captor private ArgumentCaptor<WallpaperManager.OnColorsChangedListener> mColorsListener; @@ -114,12 +116,10 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { }; mThemeOverlayController.start(); - if (USE_LOCK_SCREEN_WALLPAPER) { - verify(mKeyguardStateController).addCallback( - mKeyguardStateControllerCallback.capture()); - } verify(mWallpaperManager).addOnColorsChangedListener(mColorsListener.capture(), eq(null), eq(UserHandle.USER_ALL)); + verify(mBroadcastDispatcher).registerReceiver(mBroadcastReceiver.capture(), any(), + eq(mMainExecutor), any()); verify(mDumpManager).registerDumpable(any(), any()); } @@ -129,7 +129,6 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { verify(mBgExecutor).execute(registrationRunnable.capture()); registrationRunnable.getValue().run(); - verify(mWallpaperManager).getWallpaperColors(eq(WallpaperManager.FLAG_LOCK)); verify(mWallpaperManager).getWallpaperColors(eq(WallpaperManager.FLAG_SYSTEM)); } @@ -156,6 +155,18 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { // Should not ask again if changed to same value mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); verifyNoMoreInteractions(mThemeOverlayApplier); + + // Should not ask again even for new colors until we change wallpapers + mColorsListener.getValue().onColorsChanged(new WallpaperColors(Color.valueOf(Color.BLACK), + null, null), WallpaperManager.FLAG_SYSTEM); + verifyNoMoreInteractions(mThemeOverlayApplier); + + // But should change theme after changing wallpapers + clearInvocations(mThemeOverlayApplier); + mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_WALLPAPER_CHANGED)); + mColorsListener.getValue().onColorsChanged(new WallpaperColors(Color.valueOf(Color.BLACK), + null, null), WallpaperManager.FLAG_SYSTEM); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); } @Test |