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

This commit is contained in:
Lucas Dupin
2021-02-25 20:13:04 +00:00
committed by Android (Google) Code Review
4 changed files with 88 additions and 72 deletions

View File

@@ -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());
}
}
/**

View File

@@ -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);
}
}

View File

@@ -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[] {
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, "",

View File

@@ -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))