Merge "Fixes theme choice on boot when scheme is not from latest wallpaper." into tm-qpr-dev am: 4fd8012b64

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19558672

Change-Id: I0623f3a52793d7d5442709465ffc7969590a2a3d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Chris Poultney
2022-08-22 18:04:17 +00:00
committed by Automerger Merge Worker
2 changed files with 70 additions and 9 deletions

View File

@@ -244,7 +244,8 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
final int currentUser = mUserTracker.getUserId(); final int currentUser = mUserTracker.getUserId();
final boolean hadWallpaperColors = mCurrentColors.get(userId) != null; final boolean hadWallpaperColors = mCurrentColors.get(userId) != null;
int latestWallpaperType = getLatestWallpaperType(userId); int latestWallpaperType = getLatestWallpaperType(userId);
if ((flags & latestWallpaperType) != 0) { boolean eventForLatestWallpaper = (flags & latestWallpaperType) != 0;
if (eventForLatestWallpaper) {
mCurrentColors.put(userId, wallpaperColors); mCurrentColors.put(userId, wallpaperColors);
if (DEBUG) Log.d(TAG, "got new colors: " + wallpaperColors + " where: " + flags); if (DEBUG) Log.d(TAG, "got new colors: " + wallpaperColors + " where: " + flags);
} }
@@ -280,14 +281,19 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
currentUser); currentUser);
boolean isDestinationBoth = (flags == (WallpaperManager.FLAG_SYSTEM boolean isDestinationBoth = (flags == (WallpaperManager.FLAG_SYSTEM
| WallpaperManager.FLAG_LOCK)); | WallpaperManager.FLAG_LOCK));
boolean isDestinationHomeOnly = (flags == WallpaperManager.FLAG_SYSTEM);
try { try {
JSONObject jsonObject = (overlayPackageJson == null) ? new JSONObject() JSONObject jsonObject = (overlayPackageJson == null) ? new JSONObject()
: new JSONObject(overlayPackageJson); : new JSONObject(overlayPackageJson);
// The latest applied wallpaper should be the source of system colors when: // The latest applied wallpaper should be the source of system colors when:
// There is not preset color applied and the incoming wallpaper color is not applied // There is not preset color applied and the incoming wallpaper color is not applied
if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE)) String wallpaperPickerColorSource = jsonObject.optString(OVERLAY_COLOR_SOURCE);
&& ((flags & latestWallpaperType) != 0 && !isSeedColorSet(jsonObject, boolean userChosePresetColor = COLOR_SOURCE_PRESET.equals(wallpaperPickerColorSource);
wallpaperColors))) { boolean userChoseLockScreenColor = COLOR_SOURCE_LOCK.equals(wallpaperPickerColorSource);
boolean preserveLockScreenColor = isDestinationHomeOnly && userChoseLockScreenColor;
if (!userChosePresetColor && !preserveLockScreenColor && eventForLatestWallpaper
&& !isSeedColorSet(jsonObject, wallpaperColors)) {
mSkipSettingChange = true; mSkipSettingChange = true;
if (jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR) || jsonObject.has( if (jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR) || jsonObject.has(
OVERLAY_CATEGORY_SYSTEM_PALETTE)) { OVERLAY_CATEGORY_SYSTEM_PALETTE)) {
@@ -642,7 +648,7 @@ public class ThemeOverlayController extends CoreStartable implements Dumpable {
} }
if (mNeedsOverlayCreation) { if (mNeedsOverlayCreation) {
mNeedsOverlayCreation = false; mNeedsOverlayCreation = false;
mThemeManager.applyCurrentUserOverlays(categoryToPackage, new FabricatedOverlay[] { mThemeManager.applyCurrentUserOverlays(categoryToPackage, new FabricatedOverlay[]{
mSecondaryOverlay, mNeutralOverlay mSecondaryOverlay, mNeutralOverlay
}, currentUser, managedProfiles); }, currentUser, managedProfiles);
} else { } else {

View File

@@ -310,7 +310,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onWallpaperColorsChanged_ResetThemeWithNewHomeWallpapers() { public void onWallpaperColorsChanged_resetThemeWithNewHomeWallpapers() {
// Should ask for a new theme when wallpaper colors change // Should ask for a new theme when wallpaper colors change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null); Color.valueOf(Color.BLUE), null);
@@ -344,6 +344,61 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
.applyCurrentUserOverlays(any(), any(), anyInt(), any()); .applyCurrentUserOverlays(any(), any(), anyInt(), any());
} }
@Test
public void onWallpaperColorsChanged_keepsThemeWhenSetFromLockScreen() {
// Should ask for a new theme when wallpaper colors change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null);
String jsonString =
"{\"android.theme.customization.color_source\":\"lock_wallpaper\","
+ "\"android.theme.customization.system_palette\":\"A16B00\","
+ "\"android.theme.customization.accent_color\":\"A16B00\","
+ "\"android.theme.customization.color_index\":\"2\"}";
when(mSecureSettings.getStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
.thenReturn(jsonString);
when(mWallpaperManager.getWallpaperIdForUser(WallpaperManager.FLAG_LOCK, USER_SYSTEM))
.thenReturn(20);
when(mWallpaperManager.getWallpaperIdForUser(WallpaperManager.FLAG_SYSTEM, USER_SYSTEM))
.thenReturn(21);
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM,
USER_SYSTEM);
verify(mSecureSettings, never()).putStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), any(), anyInt());
}
@Test
public void onWallpaperColorsChanged_resetLockScreenThemeWhenBothSet() {
// Should ask for a new theme when wallpaper colors change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null);
String jsonString =
"{\"android.theme.customization.color_source\":\"lock_wallpaper\","
+ "\"android.theme.customization.system_palette\":\"A16B00\","
+ "\"android.theme.customization.accent_color\":\"A16B00\","
+ "\"android.theme.customization.color_index\":\"2\"}";
when(mSecureSettings.getStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
.thenReturn(jsonString);
when(mWallpaperManager.getWallpaperIdForUser(WallpaperManager.FLAG_LOCK, USER_SYSTEM))
.thenReturn(20);
when(mWallpaperManager.getWallpaperIdForUser(WallpaperManager.FLAG_SYSTEM, USER_SYSTEM))
.thenReturn(21);
mColorsListener.getValue().onColorsChanged(mainColors,
WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK,
USER_SYSTEM);
ArgumentCaptor<String> updatedSetting = ArgumentCaptor.forClass(String.class);
verify(mSecureSettings).putStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), updatedSetting.capture(),
anyInt());
assertThat(updatedSetting.getValue().contains(
"android.theme.customization.color_both\":\"1")).isTrue();
verify(mThemeOverlayApplier)
.applyCurrentUserOverlays(any(), any(), anyInt(), any());
}
@Test @Test
public void onSettingChanged_honorThemeStyle() { public void onSettingChanged_honorThemeStyle() {
when(mDeviceProvisionedController.isUserSetup(anyInt())).thenReturn(true); when(mDeviceProvisionedController.isUserSetup(anyInt())).thenReturn(true);
@@ -381,7 +436,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onWallpaperColorsChanged_ResetThemeWithNewHomeAndLockWallpaper() { public void onWallpaperColorsChanged_resetThemeWithNewHomeAndLockWallpaper() {
// Should ask for a new theme when wallpaper colors change // Should ask for a new theme when wallpaper colors change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null); Color.valueOf(Color.BLUE), null);
@@ -450,7 +505,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null); Color.valueOf(Color.BLUE), null);
String jsonString = String jsonString =
"{\"android.theme.customization.color_source\":\"lock_wallpaper\"," "{\"android.theme.customization.color_source\":\"home_wallpaper\","
+ "\"android.theme.customization.system_palette\":\"A16B00\"," + "\"android.theme.customization.system_palette\":\"A16B00\","
+ "\"android.theme.customization.accent_color\":\"A16B00\"," + "\"android.theme.customization.accent_color\":\"A16B00\","
+ "\"android.theme.customization.color_index\":\"2\"}"; + "\"android.theme.customization.color_index\":\"2\"}";
@@ -476,7 +531,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onWallpaperColorsChanged_ResetThemeWhenFromLatestWallpaper() { public void onWallpaperColorsChanged_resetThemeWhenFromLatestWallpaper() {
// Should ask for a new theme when the colors of the last applied wallpaper change // Should ask for a new theme when the colors of the last applied wallpaper change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null); Color.valueOf(Color.BLUE), null);