Merge "Fix issue where scrim color event would be skipped" into qt-dev
am: a288fae7cb

Change-Id: I7da1a69f7f51d472e5402a2b75dd080e1e4af83d
diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
index 05665b5..835ffc9 100644
--- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
+++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.colorextraction;
 
+import android.annotation.ColorInt;
 import android.app.WallpaperColors;
 import android.app.WallpaperManager;
 import android.content.Context;
@@ -113,7 +114,11 @@
         super.onColorsChanged(colors, which);
 
         if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
+            @ColorInt int oldColor = mWpHiddenColors.getMainColor();
             updateDefaultGradients(colors);
+            if (oldColor != mWpHiddenColors.getMainColor()) {
+                triggerColorsChanged(WallpaperManager.FLAG_SYSTEM);
+            }
         }
     }
 
@@ -121,6 +126,7 @@
     public void onUiModeChanged() {
         WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
         updateDefaultGradients(systemColors);
+        triggerColorsChanged(WallpaperManager.FLAG_SYSTEM);
     }
 
     /**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
index 67df60a..9c2c822 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
@@ -36,8 +37,10 @@
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
 
 /**
  * Tests color extraction generation.
@@ -54,62 +57,68 @@
             ColorExtractor.TYPE_DARK,
             ColorExtractor.TYPE_EXTRA_DARK};
 
+    private ColorExtractor.GradientColors mColors;
+    private SysuiColorExtractor mColorExtractor;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mColors = new ColorExtractor.GradientColors();
+        mColors.setMainColor(Color.RED);
+        mColors.setSecondaryColor(Color.RED);
+        mColorExtractor = new SysuiColorExtractor(getContext(),
+                (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark,
+                        outGradientColorsExtraDark) -> {
+                    outGradientColorsNormal.set(mColors);
+                    outGradientColorsDark.set(mColors);
+                    outGradientColorsExtraDark.set(mColors);
+                }, mock(ConfigurationController.class), false);
+    }
+
     @Test
     public void getColors_usesGreyIfWallpaperNotVisible() {
-        ColorExtractor.GradientColors colors = new ColorExtractor.GradientColors();
-        colors.setMainColor(Color.RED);
-        colors.setSecondaryColor(Color.RED);
+        simulateEvent(mColorExtractor);
+        mColorExtractor.setWallpaperVisible(false);
 
-        SysuiColorExtractor extractor = getTestableExtractor(colors);
-        simulateEvent(extractor);
-        extractor.setWallpaperVisible(false);
-
-        ColorExtractor.GradientColors fallbackColors = extractor.getNeutralColors();
+        ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors();
 
         for (int type : sTypes) {
             assertEquals("Not using fallback!",
-                    extractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors);
+                    mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors);
             assertNotEquals("Wallpaper visibility event should not affect lock wallpaper.",
-                    extractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors);
+                    mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors);
         }
     }
 
     @Test
     public void getColors_doesntUseFallbackIfVisible() {
-        ColorExtractor.GradientColors colors = new ColorExtractor.GradientColors();
-        colors.setMainColor(Color.RED);
-        colors.setSecondaryColor(Color.RED);
+        mColors.setMainColor(Color.RED);
+        mColors.setSecondaryColor(Color.RED);
 
-        SysuiColorExtractor extractor = getTestableExtractor(colors);
-        simulateEvent(extractor);
-        extractor.setWallpaperVisible(true);
+        simulateEvent(mColorExtractor);
+        mColorExtractor.setWallpaperVisible(true);
 
         for (int which : sWhich) {
             for (int type : sTypes) {
                 assertEquals("Not using extracted colors!",
-                        extractor.getColors(which, type), colors);
+                        mColorExtractor.getColors(which, type), mColors);
             }
         }
     }
 
     @Test
     public void getColors_fallbackWhenMediaIsVisible() {
-        ColorExtractor.GradientColors colors = new ColorExtractor.GradientColors();
-        colors.setMainColor(Color.RED);
-        colors.setSecondaryColor(Color.RED);
+        simulateEvent(mColorExtractor);
+        mColorExtractor.setWallpaperVisible(true);
+        mColorExtractor.setHasBackdrop(true);
 
-        SysuiColorExtractor extractor = getTestableExtractor(colors);
-        simulateEvent(extractor);
-        extractor.setWallpaperVisible(true);
-        extractor.setHasBackdrop(true);
-
-        ColorExtractor.GradientColors fallbackColors = extractor.getNeutralColors();
+        ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors();
 
         for (int type : sTypes) {
             assertEquals("Not using fallback!",
-                    extractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors);
+                    mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors);
             assertNotEquals("Media visibility should not affect system wallpaper.",
-                    extractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors);
+                    mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors);
         }
     }
 
@@ -126,14 +135,13 @@
         verify(tonal).applyFallback(any(), any());
     }
 
-    private SysuiColorExtractor getTestableExtractor(ColorExtractor.GradientColors colors) {
-        return new SysuiColorExtractor(getContext(),
-                (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark,
-                        outGradientColorsExtraDark) -> {
-                    outGradientColorsNormal.set(colors);
-                    outGradientColorsDark.set(colors);
-                    outGradientColorsExtraDark.set(colors);
-                }, mock(ConfigurationController.class), false);
+    @Test
+    public void onUiModeChanged_notifiesListener() {
+        ColorExtractor.OnColorsChangedListener listener = mock(
+                ColorExtractor.OnColorsChangedListener.class);
+        mColorExtractor.addOnColorsChangedListener(listener);
+        mColorExtractor.onUiModeChanged();
+        verify(listener).onColorsChanged(any(), anyInt());
     }
 
     private void simulateEvent(SysuiColorExtractor extractor) {