Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f16a22d authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Only enable overlay where package is installed" into sc-dev

parents 6aa114f8 3c67173e
Loading
Loading
Loading
Loading
+28 −14
Original line number Diff line number Diff line
@@ -161,10 +161,10 @@ public class ThemeOverlayApplier implements Dumpable {
    void applyCurrentUserOverlays(
            Map<String, OverlayIdentifier> categoryToPackage,
            FabricatedOverlay[] pendingCreation,
            Set<UserHandle> userHandles) {
            int currentUser,
            Set<UserHandle> managedProfiles) {
        // Disable all overlays that have not been specified in the user setting.
        final Set<String> overlayCategoriesToDisable = new HashSet<>(THEME_CATEGORIES);
        overlayCategoriesToDisable.removeAll(categoryToPackage.keySet());
        final Set<String> targetPackagesToQuery = overlayCategoriesToDisable.stream()
                .map(category -> mCategoryToTargetPackage.get(category))
                .collect(Collectors.toSet());
@@ -175,6 +175,7 @@ public class ThemeOverlayApplier implements Dumpable {
                .filter(o ->
                        mTargetPackageToCategories.get(o.targetPackageName).contains(o.category))
                .filter(o -> overlayCategoriesToDisable.contains(o.category))
                .filter(o -> !categoryToPackage.containsValue(new OverlayIdentifier(o.packageName)))
                .filter(o -> o.isEnabled())
                .map(o -> new Pair<>(o.category, o.packageName))
                .collect(Collectors.toList());
@@ -186,17 +187,18 @@ public class ThemeOverlayApplier implements Dumpable {
            }
        }

        // Toggle overlays in the order of THEME_CATEGORIES.
        for (Pair<String, String> packageToDisable : overlaysToDisable) {
            OverlayIdentifier overlayInfo = new OverlayIdentifier(packageToDisable.second);
            setEnabled(transaction, overlayInfo, packageToDisable.first, currentUser,
                    managedProfiles, false);
        }

        for (String category : THEME_CATEGORIES) {
            if (categoryToPackage.containsKey(category)) {
                OverlayIdentifier overlayInfo = categoryToPackage.get(category);
                setEnabled(transaction, overlayInfo, category, userHandles, true);
                setEnabled(transaction, overlayInfo, category, currentUser, managedProfiles, true);
            }
        }
        for (Pair<String, String> packageToDisable : overlaysToDisable) {
            OverlayIdentifier overlayInfo = new OverlayIdentifier(packageToDisable.second);
            setEnabled(transaction, overlayInfo, packageToDisable.first, userHandles, false);
        }

        mExecutor.execute(() -> {
            try {
@@ -213,18 +215,30 @@ public class ThemeOverlayApplier implements Dumpable {
    }

    private void setEnabled(OverlayManagerTransaction.Builder transaction,
            OverlayIdentifier identifier, String category, Set<UserHandle> handles,
            boolean enabled) {
            OverlayIdentifier identifier, String category, int currentUser,
            Set<UserHandle> managedProfiles, boolean enabled) {
        if (DEBUG) {
            Log.d(TAG, "setEnabled: " + identifier.getPackageName() + " category: "
                    + category + ": " + enabled);
        }
        for (UserHandle userHandle : handles) {
            transaction.setEnabled(identifier, enabled, userHandle.getIdentifier());
        }
        if (!handles.contains(UserHandle.SYSTEM) && SYSTEM_USER_CATEGORIES.contains(category)) {

        transaction.setEnabled(identifier, enabled, currentUser);
        if (currentUser != UserHandle.SYSTEM.getIdentifier()
                && SYSTEM_USER_CATEGORIES.contains(category)) {
            transaction.setEnabled(identifier, enabled, UserHandle.SYSTEM.getIdentifier());
        }

        // Do not apply Launcher or Theme picker overlays to managed users. Apps are not
        // installed in there.
        OverlayInfo overlayInfo = mOverlayManager.getOverlayInfo(identifier, UserHandle.SYSTEM);
        if (overlayInfo == null || overlayInfo.targetPackageName.equals(mLauncherPackage)
                || overlayInfo.targetPackageName.equals(mThemePickerPackage)) {
            return;
        }

        for (UserHandle userHandle : managedProfiles) {
            transaction.setEnabled(identifier, enabled, userHandle.getIdentifier());
        }
    }

    /**
+31 −13
Original line number Diff line number Diff line
@@ -55,14 +55,13 @@ import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.settings.SecureSettings;

import com.google.android.collect.Sets;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -151,7 +150,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added.");
                updateThemeOverlays();
                reevaluateSystemTheme(true /* forceReload */);
            }
        }, filter, mBgExecutor, UserHandle.ALL);
        mSecureSettings.registerContentObserverForUser(
@@ -163,7 +162,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
                            int userId) {
                        if (DEBUG) Log.d(TAG, "Overlay changed for user: " + userId);
                        if (ActivityManager.getCurrentUser() == userId) {
                            updateThemeOverlays();
                            reevaluateSystemTheme(true /* forceReload */);
                        }
                    }
                },
@@ -180,7 +179,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
                    mLockColors = lockColors;
                }
                mSystemColors = systemColor;
                reevaluateSystemTheme();
                reevaluateSystemTheme(false /* forceReload */);
            });
        });
        if (USE_LOCK_SCREEN_WALLPAPER) {
@@ -192,7 +191,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
                    }
                    // It's possible that the user has a lock screen wallpaper. On this case we'll
                    // end up with different colors after unlocking.
                    reevaluateSystemTheme();
                    reevaluateSystemTheme(false /* forceReload */);
                }
            });
        }
@@ -209,11 +208,11 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
                    Log.d(TAG, "got new lock colors: " + wallpaperColors + " where: " + which);
                }
            }
            reevaluateSystemTheme();
            reevaluateSystemTheme(false /* forceReload */);
        }, null, UserHandle.USER_ALL);
    }

    private void reevaluateSystemTheme() {
    private void reevaluateSystemTheme(boolean forceReload) {
        WallpaperColors currentColors =
                mKeyguardStateController.isShowing() && mLockColors != null
                        ? mLockColors : mSystemColors;
@@ -228,7 +227,8 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            accentCandidate = getAccentColor(currentColors);
        }

        if (mMainWallpaperColor == mainColor && mWallpaperAccentColor == accentCandidate) {
        if (mMainWallpaperColor == mainColor && mWallpaperAccentColor == accentCandidate
                && !forceReload) {
            return;
        }

@@ -309,6 +309,16 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            } catch (NumberFormatException e) {
                Log.w(TAG, "Invalid color definition: " + systemPalette.getPackageName());
            }
        } else if (!mIsMonetEnabled && systemPalette != null) {
            try {
                // It's possible that we flipped the flag off and still have a @ColorInt in the
                // setting. We need to sanitize the input, otherwise the overlay transaction will
                // fail.
                Integer.parseInt(systemPalette.getPackageName().toLowerCase(), 16);
                categoryToPackage.remove(OVERLAY_CATEGORY_SYSTEM_PALETTE);
            } catch (NumberFormatException e) {
                // This is a package name. All good, let's continue
            }
        }

        // Same for accent color.
@@ -322,6 +332,13 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            } catch (NumberFormatException e) {
                Log.w(TAG, "Invalid color definition: " + accentPalette.getPackageName());
            }
        } else if (!mIsMonetEnabled && accentPalette != null) {
            try {
                Integer.parseInt(accentPalette.getPackageName().toLowerCase(), 16);
                categoryToPackage.remove(OVERLAY_CATEGORY_ACCENT_COLOR);
            } catch (NumberFormatException e) {
                // This is a package name. All good, let's continue
            }
        }

        // Compatibility with legacy themes, where full packages were defined, instead of just
@@ -337,10 +354,10 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            categoryToPackage.put(OVERLAY_CATEGORY_ACCENT_COLOR, mSecondaryOverlay.getIdentifier());
        }

        Set<UserHandle> userHandles = Sets.newHashSet(UserHandle.of(currentUser));
        Set<UserHandle> managedProfiles = new HashSet<>();
        for (UserInfo userInfo : mUserManager.getEnabledProfiles(currentUser)) {
            if (userInfo.isManagedProfile()) {
                userHandles.add(userInfo.getUserHandle());
                managedProfiles.add(userInfo.getUserHandle());
            }
        }
        if (DEBUG) {
@@ -352,9 +369,10 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
            mNeedsOverlayCreation = false;
            mThemeManager.applyCurrentUserOverlays(categoryToPackage, new FabricatedOverlay[] {
                    mPrimaryOverlay, mSecondaryOverlay, mNeutralOverlay
            }, userHandles);
            }, currentUser, managedProfiles);
        } else {
            mThemeManager.applyCurrentUserOverlays(categoryToPackage, null, userHandles);
            mThemeManager.applyCurrentUserOverlays(categoryToPackage, null, currentUser,
                    managedProfiles);
        }
    }

+26 −42
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import static com.android.systemui.theme.ThemeOverlayApplier.SYSUI_PACKAGE;
import static com.android.systemui.theme.ThemeOverlayApplier.THEME_CATEGORIES;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
@@ -88,7 +87,9 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {
    private static final String THEMEPICKER_PACKAGE = "com.android.wallpaper";
    private static final String LAUNCHER_PACKAGE = "com.android.launcher3";
    private static final UserHandle TEST_USER = UserHandle.of(5);
    private static final Set<UserHandle> TEST_USER_HANDLES = Sets.newHashSet(TEST_USER);
    private static final UserHandle TEST_USER_MANAGED_PROFILE = UserHandle.of(6);
    private static final Set<UserHandle> TEST_USER_HANDLES =
            Sets.newHashSet(TEST_USER_MANAGED_PROFILE);

    @Mock
    OverlayManager mOverlayManager;
@@ -159,13 +160,19 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {
                                THEMEPICKER_PACKAGE, OVERLAY_CATEGORY_ICON_THEME_PICKER, false),
                        createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_ICON_THEME_PICKER,
                                THEMEPICKER_PACKAGE, OVERLAY_CATEGORY_ICON_THEME_PICKER, true)));

        OverlayInfo launcherTargetInfo = new OverlayInfo("packageName", LAUNCHER_PACKAGE,
                null, null, "/", 0, 0, 0, false);
        when(mOverlayManager.getOverlayInfo(any(OverlayIdentifier.class), any()))
                .thenReturn(launcherTargetInfo);
        clearInvocations(mOverlayManager);
        verify(mDumpManager).registerDumpable(any(), any());
    }

    @Test
    public void allCategoriesSpecified_allEnabledExclusively() {
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER_HANDLES);
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(),
                TEST_USER_HANDLES);
        verify(mOverlayManager).commit(any());

        for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) {
@@ -176,7 +183,8 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {

    @Test
    public void allCategoriesSpecified_sysuiCategoriesAlsoAppliedToSysuiUser() {
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER_HANDLES);
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(),
                TEST_USER_HANDLES);

        for (Map.Entry<String, OverlayIdentifier> entry : ALL_CATEGORIES_MAP.entrySet()) {
            if (SYSTEM_USER_CATEGORIES.contains(entry.getKey())) {
@@ -192,48 +200,39 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {
    @Test
    public void allCategoriesSpecified_enabledForAllUserHandles() {
        Set<UserHandle> userHandles = Sets.newHashSet(TEST_USER_HANDLES);
        UserHandle newUserHandle = UserHandle.of(10);
        userHandles.add(newUserHandle);
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, userHandles);
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(),
                userHandles);

        for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) {
            verify(mTransactionBuilder).setEnabled(eq(overlayPackage), eq(true),
                    eq(TEST_USER.getIdentifier()));
            verify(mTransactionBuilder).setEnabled(eq(overlayPackage), eq(true),
                    eq(newUserHandle.getIdentifier()));
            // Not enabled for work profile because the target package is LAUNCHER_PACKAGE
            verify(mTransactionBuilder, never()).setEnabled(eq(overlayPackage), eq(true),
                    eq(TEST_USER_MANAGED_PROFILE.getIdentifier()));
        }
    }

    @Test
    public void applyCurrentUserOverlays_createsPendingOverlays() {
        Set<UserHandle> userHandles = Sets.newHashSet(TEST_USER_HANDLES);
        UserHandle newUserHandle = UserHandle.of(10);
        userHandles.add(newUserHandle);
        FabricatedOverlay[] pendingCreation = new FabricatedOverlay[]{
                mock(FabricatedOverlay.class)
        };
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, pendingCreation, userHandles);
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, pendingCreation,
                TEST_USER.getIdentifier(), TEST_USER_HANDLES);

        for (FabricatedOverlay overlay : pendingCreation) {
            verify(mTransactionBuilder).registerFabricatedOverlay(eq(overlay));
        }
    }

    @Test
    public void allCategoriesSpecified_overlayManagerNotQueried() {
        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER_HANDLES);

        verify(mOverlayManager, never())
                .getOverlayInfosForTarget(anyString(), any(UserHandle.class));
    }

    @Test
    public void someCategoriesSpecified_specifiedEnabled_unspecifiedDisabled() {
        Map<String, OverlayIdentifier> categoryToPackage = new HashMap<>(ALL_CATEGORIES_MAP);
        categoryToPackage.remove(OVERLAY_CATEGORY_ICON_SETTINGS);
        categoryToPackage.remove(OVERLAY_CATEGORY_ICON_ANDROID);

        mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER_HANDLES);
        mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER.getIdentifier(),
                TEST_USER_HANDLES);

        for (OverlayIdentifier overlayPackage : categoryToPackage.values()) {
            verify(mTransactionBuilder).setEnabled(eq(overlayPackage), eq(true),
@@ -249,7 +248,8 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {

    @Test
    public void zeroCategoriesSpecified_allDisabled() {
        mManager.applyCurrentUserOverlays(Maps.newArrayMap(), null, TEST_USER_HANDLES);
        mManager.applyCurrentUserOverlays(Maps.newArrayMap(), null, TEST_USER.getIdentifier(),
                TEST_USER_HANDLES);

        for (String category : THEME_CATEGORIES) {
            verify(mTransactionBuilder).setEnabled(
@@ -263,7 +263,8 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {
        Map<String, OverlayIdentifier> categoryToPackage = new HashMap<>(ALL_CATEGORIES_MAP);
        categoryToPackage.put("blah.category", new OverlayIdentifier("com.example.blah.category"));

        mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER_HANDLES);
        mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER.getIdentifier(),
                TEST_USER_HANDLES);

        verify(mTransactionBuilder, never()).setEnabled(
                eq(new OverlayIdentifier("com.example.blah.category")), eq(false),
@@ -273,23 +274,6 @@ public class ThemeOverlayApplierTest extends SysuiTestCase {
                eq(TEST_USER.getIdentifier()));
    }

    @Test
    public void overlayManagerOnlyQueriedForUnspecifiedPackages() {
        Map<String, OverlayIdentifier> categoryToPackage = new HashMap<>(ALL_CATEGORIES_MAP);
        categoryToPackage.remove(OVERLAY_CATEGORY_ICON_SETTINGS);

        mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER_HANDLES);

        verify(mOverlayManager).getOverlayInfosForTarget(SETTINGS_PACKAGE, UserHandle.SYSTEM);
        verify(mOverlayManager, never()).getOverlayInfosForTarget(ANDROID_PACKAGE,
                UserHandle.SYSTEM);
        verify(mOverlayManager, never()).getOverlayInfosForTarget(SYSUI_PACKAGE, UserHandle.SYSTEM);
        verify(mOverlayManager, never()).getOverlayInfosForTarget(LAUNCHER_PACKAGE,
                UserHandle.SYSTEM);
        verify(mOverlayManager, never()).getOverlayInfosForTarget(THEMEPICKER_PACKAGE,
                UserHandle.SYSTEM);
    }

    private static OverlayInfo createOverlayInfo(String packageName, String targetPackageName,
            String category, boolean enabled) {
        return new OverlayInfo(packageName, null, targetPackageName, null, category, "",
+3 −3
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                ArgumentCaptor.forClass(Map.class);

        verify(mThemeOverlayApplier)
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), any());
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any());

        // Assert that we received the colors that we were expecting
        assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
@@ -175,7 +175,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                ArgumentCaptor.forClass(Map.class);

        verify(mThemeOverlayApplier)
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), any());
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any());

        // Assert that we received the colors that we were expecting
        assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
@@ -198,7 +198,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                ArgumentCaptor.forClass(Map.class);

        verify(mThemeOverlayApplier)
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), any());
                .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any());

        // Assert that we received the colors that we were expecting
        assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))