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

Commit d1c5ef28 authored by Kunhung Li's avatar Kunhung Li
Browse files

Refine color overlay attributes

- Clear OVERLAY_COLOR_INDEX attributes when wallpaper changes.
- Update OVERLAY_COLOR_BOTH to know wallpaper color is for both
  home and lock screen or not.

Bug: 186194356
Test: atest ThemeOverlayControllerTest
Change-Id: I76a0ce6c7e8455d21a890f7ac44e8ffe90dcb367
parent b9034aba
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -69,6 +69,10 @@ public class ThemeOverlayApplier implements Dumpable {

    static final String OVERLAY_COLOR_SOURCE = "android.theme.customization.color_source";

    static final String OVERLAY_COLOR_INDEX = "android.theme.customization.color_index";

    static final String OVERLAY_COLOR_BOTH = "android.theme.customization.color_both";

    static final String COLOR_SOURCE_PRESET = "preset";

    static final String TIMESTAMP_FIELD = "_applied_timestamp";
+17 −8
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.systemui.theme;
import static com.android.systemui.theme.ThemeOverlayApplier.COLOR_SOURCE_PRESET;
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ACCENT_COLOR;
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SYSTEM_PALETTE;
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_COLOR_BOTH;
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_COLOR_INDEX;
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_COLOR_SOURCE;
import static com.android.systemui.theme.ThemeOverlayApplier.TIMESTAMP_FIELD;

@@ -96,11 +98,11 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
    private SecureSettings mSecureSettings;
    private final Executor mMainExecutor;
    private final Handler mBgHandler;
    private final WallpaperManager mWallpaperManager;
    private final boolean mIsMonetEnabled;
    private UserTracker mUserTracker;
    private DeviceProvisionedController mDeviceProvisionedController;
    private WallpaperColors mSystemColors;
    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
@@ -173,17 +175,24 @@ public class ThemeOverlayController extends SystemUI implements Dumpable {
        String overlayPackageJson = mSecureSettings.getStringForUser(
                Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
                currentUser);
        boolean isDestinationBoth = mWallpaperManager.getWallpaperId(
                WallpaperManager.FLAG_LOCK) < 0;
        if (!TextUtils.isEmpty(overlayPackageJson)) {
            try {
                JSONObject jsonObject = new JSONObject(overlayPackageJson);
                if ((jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR)
                        || jsonObject.has(OVERLAY_CATEGORY_SYSTEM_PALETTE))
                        && !COLOR_SOURCE_PRESET.equals(
                        jsonObject.optString(OVERLAY_COLOR_SOURCE))) {
                if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE))) {
                    mSkipSettingChange = true;
                    if (jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR) || jsonObject.has(
                            OVERLAY_CATEGORY_SYSTEM_PALETTE)) {
                        jsonObject.remove(OVERLAY_CATEGORY_ACCENT_COLOR);
                        jsonObject.remove(OVERLAY_CATEGORY_SYSTEM_PALETTE);
                        jsonObject.remove(OVERLAY_COLOR_SOURCE);
                        jsonObject.remove(OVERLAY_COLOR_INDEX);
                    }
                    // Keep color_both value because users can change either or both home and
                    // lock screen wallpapers.
                    jsonObject.put(OVERLAY_COLOR_BOTH, isDestinationBoth ? "1" : "0");

                    jsonObject.put(TIMESTAMP_FIELD, System.currentTimeMillis());
                    if (DEBUG) {
                        Log.d(TAG, "Updating theme setting from "
+65 −1
Original line number Diff line number Diff line
@@ -211,7 +211,9 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {

        String jsonString =
                "{\"android.theme.customization.system_palette\":\"override.package.name\","
                        + "\"android.theme.customization.color_source\":\"home_wallpaper\"}";
                        + "\"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);
@@ -224,6 +226,68 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {

        assertThat(updatedSetting.getValue().contains("android.theme.customization.system_palette"))
                .isFalse();
        assertThat(updatedSetting.getValue().contains("android.theme.customization.color_source"))
                .isFalse();
        assertThat(updatedSetting.getValue().contains("android.theme.customization.color_index"))
                .isFalse();

        verify(mThemeOverlayApplier)
                .applyCurrentUserOverlays(any(), any(), anyInt(), any());
    }

    @Test
    public void onWallpaperColorsChanged_ResetThemeWithDifferentWallpapers() {
        // 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.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(20);

        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());

        assertThat(updatedSetting.getValue().contains(
                "android.theme.customization.color_both\":\"0")).isTrue();

        verify(mThemeOverlayApplier)
                .applyCurrentUserOverlays(any(), any(), anyInt(), any());
    }

    @Test
    public void onWallpaperColorsChanged_ResetThemeWithSameWallpaper() {
        // 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.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);

        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());

        assertThat(updatedSetting.getValue().contains(
                "android.theme.customization.color_both\":\"1")).isTrue();

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