From b990de24ca349413ebcdb1f1c845736d17213947 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 1 Jul 2021 14:32:11 -0700 Subject: [PATCH] Verify if overlay exists before applying it Fixes: 192557418 Test: ThemeOverlayApplierTest Change-Id: Id47ad96ca5494f803c92d6bb8dc338a15621a961 --- .../systemui/theme/ThemeOverlayApplier.java | 10 ++++++++- .../theme/ThemeOverlayApplierTest.java | 22 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java index e0ff88bdbfcea..843630b35e17c 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java @@ -239,6 +239,14 @@ public class ThemeOverlayApplier implements Dumpable { + category + ": " + enabled); } + OverlayInfo overlayInfo = mOverlayManager.getOverlayInfo(identifier, + UserHandle.of(currentUser)); + if (overlayInfo == null) { + Log.i(TAG, "Won't enable " + identifier + ", it doesn't exist for user" + + currentUser); + return; + } + transaction.setEnabled(identifier, enabled, currentUser); if (currentUser != UserHandle.SYSTEM.getIdentifier() && SYSTEM_USER_CATEGORIES.contains(category)) { @@ -247,7 +255,7 @@ public class ThemeOverlayApplier implements Dumpable { // Do not apply Launcher or Theme picker overlays to managed users. Apps are not // installed in there. - OverlayInfo overlayInfo = mOverlayManager.getOverlayInfo(identifier, UserHandle.SYSTEM); + overlayInfo = mOverlayManager.getOverlayInfo(identifier, UserHandle.SYSTEM); if (overlayInfo == null || overlayInfo.targetPackageName.equals(mLauncherPackage) || overlayInfo.targetPackageName.equals(mThemePickerPackage)) { return; diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java index eb6fc2e950c91..9c47f19b20c8a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java @@ -98,6 +98,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { OverlayManagerTransaction.Builder mTransactionBuilder; private ThemeOverlayApplier mManager; + private boolean mGetOverlayInfoEnabled = true; @Before public void setup() throws Exception { @@ -159,7 +160,12 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { OverlayInfo launcherTargetInfo = new OverlayInfo("packageName", LAUNCHER_PACKAGE, null, null, "/", 0, 0, 0, false); when(mOverlayManager.getOverlayInfo(any(OverlayIdentifier.class), any())) - .thenReturn(launcherTargetInfo); + .thenAnswer(answer -> { + if (mGetOverlayInfoEnabled) { + return launcherTargetInfo; + } + return null; + }); clearInvocations(mOverlayManager); verify(mDumpManager).registerDumpable(any(), any()); } @@ -207,6 +213,20 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { } } + @Test + public void enablesOverlays_onlyIfItExistsForUser() { + mGetOverlayInfoEnabled = false; + + Set userHandles = Sets.newHashSet(TEST_USER_HANDLES); + mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(), + userHandles); + + for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) { + verify(mTransactionBuilder, never()).setEnabled(eq(overlayPackage), eq(true), + eq(TEST_USER.getIdentifier())); + } + } + @Test public void applyCurrentUserOverlays_createsPendingOverlays() { FabricatedOverlay[] pendingCreation = new FabricatedOverlay[]{