Merge "Use the colors from the last wallpaper applied" into sc-dev

This commit is contained in:
Santiago Etchebehere
2021-05-26 02:14:19 +00:00
committed by Android (Google) Code Review
2 changed files with 77 additions and 11 deletions

View File

@@ -103,11 +103,11 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
private final boolean mIsMonetEnabled;
private UserTracker mUserTracker;
private DeviceProvisionedController mDeviceProvisionedController;
private WallpaperColors mSystemColors;
private WallpaperColors mCurrentColors;
private WallpaperManager mWallpaperManager;
// If fabricated overlays were already created for the current theme.
private boolean mNeedsOverlayCreation;
// Dominant olor extracted from wallpaper, NOT the color used on the overlay
// Dominant color extracted from wallpaper, NOT the color used on the overlay
protected int mMainWallpaperColor = Color.TRANSPARENT;
// Accent color extracted from wallpaper, NOT the color used on the overlay
protected int mWallpaperAccentColor = Color.TRANSPARENT;
@@ -162,10 +162,17 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
handleWallpaperColors(wallpaperColors, which);
};
private int getLatestWallpaperType() {
return mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)
> mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)
? WallpaperManager.FLAG_LOCK : WallpaperManager.FLAG_SYSTEM;
}
private void handleWallpaperColors(WallpaperColors wallpaperColors, int flags) {
final boolean hadWallpaperColors = mSystemColors != null;
if ((flags & WallpaperManager.FLAG_SYSTEM) != 0) {
mSystemColors = wallpaperColors;
final boolean hadWallpaperColors = mCurrentColors != null;
int latestWallpaperType = getLatestWallpaperType();
if ((flags & latestWallpaperType) != 0) {
mCurrentColors = wallpaperColors;
if (DEBUG) Log.d(TAG, "got new colors: " + wallpaperColors + " where: " + flags);
}
@@ -183,7 +190,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
} else {
if (DEBUG) {
Log.i(TAG, "During user setup, but allowing first color event: had? "
+ hadWallpaperColors + " has? " + (mSystemColors != null));
+ hadWallpaperColors + " has? " + (mCurrentColors != null));
}
}
}
@@ -198,7 +205,8 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
if (!TextUtils.isEmpty(overlayPackageJson)) {
try {
JSONObject jsonObject = new JSONObject(overlayPackageJson);
if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE))) {
if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE))
&& ((flags & latestWallpaperType) != 0)) {
mSkipSettingChange = true;
if (jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR) || jsonObject.has(
OVERLAY_CATEGORY_SYSTEM_PALETTE)) {
@@ -314,10 +322,10 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
// Upon boot, make sure we have the most up to date colors
Runnable updateColors = () -> {
WallpaperColors systemColor = mWallpaperManager.getWallpaperColors(
WallpaperManager.FLAG_SYSTEM);
getLatestWallpaperType());
mMainExecutor.execute(() -> {
if (DEBUG) Log.d(TAG, "Boot colors: " + systemColor);
mSystemColors = systemColor;
mCurrentColors = systemColor;
reevaluateSystemTheme(false /* forceReload */);
});
};
@@ -348,7 +356,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
}
private void reevaluateSystemTheme(boolean forceReload) {
final WallpaperColors currentColors = mSystemColors;
final WallpaperColors currentColors = mCurrentColors;
final int mainColor;
final int accentCandidate;
if (currentColors == null) {
@@ -506,7 +514,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
@Override
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("mSystemColors=" + mSystemColors);
pw.println("mSystemColors=" + mCurrentColors);
pw.println("mMainWallpaperColor=" + Integer.toHexString(mMainWallpaperColor));
pw.println("mWallpaperAccentColor=" + Integer.toHexString(mWallpaperAccentColor));
pw.println("mSecondaryOverlay=" + mSecondaryOverlay);

View File

@@ -258,6 +258,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
.thenReturn(jsonString);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(20);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(21);
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
@@ -301,6 +302,63 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
.applyCurrentUserOverlays(any(), any(), anyInt(), any());
}
@Test
public void onWallpaperColorsChanged_ResetThemeWhenFromLatestWallpaper() {
// Should ask for a new theme when the colors of the last applied wallpaper change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null);
String jsonString =
"{\"android.theme.customization.system_palette\":\"override.package.name\","
+ "\"android.theme.customization.color_source\":\"home_wallpaper\","
+ "\"android.theme.customization.color_index\":\"2\"}";
when(mSecureSettings.getStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
.thenReturn(jsonString);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(1);
// SYSTEM wallpaper is the last applied one
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(2);
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
ArgumentCaptor<String> updatedSetting = ArgumentCaptor.forClass(String.class);
verify(mSecureSettings).putString(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), updatedSetting.capture());
verify(mThemeOverlayApplier)
.applyCurrentUserOverlays(any(), any(), anyInt(), any());
}
@Test
public void onWallpaperColorsChanged_keepThemeIfNotLatestWallpaper() {
// Shouldn't ask for a new theme when the colors of the wallpaper that is not the last
// applied one change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
Color.valueOf(Color.BLUE), null);
String jsonString =
"{\"android.theme.customization.system_palette\":\"override.package.name\","
+ "\"android.theme.customization.color_source\":\"home_wallpaper\","
+ "\"android.theme.customization.color_index\":\"2\"}";
when(mSecureSettings.getStringForUser(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
.thenReturn(jsonString);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(1);
// SYSTEM wallpaper is the last applied one
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(2);
mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_LOCK);
verify(mSecureSettings, never()).putString(
eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), any());
verify(mThemeOverlayApplier, never())
.applyCurrentUserOverlays(any(), any(), anyInt(), any());
}
@Test
public void onProfileAdded_setsTheme() {
mBroadcastReceiver.getValue().onReceive(null,