Loading packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,9 @@ oneway interface IOverviewProxy { * Sent when some system ui state changes. */ void onSystemUiStateChanged(int stateFlags) = 16; /** * Sent when the scrim colors (based on wallpaper) change. */ void onScrimColorsChanged(int color, int type) = 17; } packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +46 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.colorextraction; import android.annotation.ColorInt; import android.annotation.IntDef; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; Loading @@ -34,10 +36,13 @@ import com.android.internal.colorextraction.types.ExtractionType; import com.android.internal.colorextraction.types.Tonal; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import javax.inject.Inject; Loading @@ -50,23 +55,41 @@ import javax.inject.Singleton; public class SysuiColorExtractor extends ColorExtractor implements Dumpable, ConfigurationController.ConfigurationListener { private static final String TAG = "SysuiColorExtractor"; public static final int SCRIM_TYPE_REGULAR = 1; public static final int SCRIM_TYPE_LIGHT = 2; public static final int SCRIM_TYPE_DARK = 3; @IntDef(prefix = {"SCRIM_TYPE_"}, value = { SCRIM_TYPE_REGULAR, SCRIM_TYPE_LIGHT, SCRIM_TYPE_DARK }) @Retention(RetentionPolicy.SOURCE) public @interface ScrimType { } private final Tonal mTonal; private final OverviewProxyService mOverviewProxyService; private boolean mWallpaperVisible; private boolean mHasBackdrop; // Colors to return when the wallpaper isn't visible private final GradientColors mWpHiddenColors; @Inject public SysuiColorExtractor(Context context, ConfigurationController configurationController) { this(context, new Tonal(context), configurationController, true); public SysuiColorExtractor(Context context, ConfigurationController configurationController, OverviewProxyService overviewProxyService) { this(context, new Tonal(context), configurationController, true, overviewProxyService); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, ConfigurationController configurationController, boolean registerVisibility) { ConfigurationController configurationController, boolean registerVisibility, OverviewProxyService overviewProxyService) { super(context, type, false /* immediately */); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); mWpHiddenColors = new GradientColors(); mOverviewProxyService = overviewProxyService; configurationController.addCallback(this); WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); Loading Loading @@ -110,17 +133,35 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, return; } super.onColorsChanged(colors, which); if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { updateDefaultGradients(colors); } super.onColorsChanged(colors, which); } @Override public void onUiModeChanged() { WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); updateDefaultGradients(systemColors); triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); } @Override protected void triggerColorsChanged(int which) { super.triggerColorsChanged(which); if (mWpHiddenColors != null && (which & WallpaperManager.FLAG_SYSTEM) != 0) { @ColorInt int colorInt = mWpHiddenColors.getMainColor(); @ScrimType int scrimType; if (colorInt == Tonal.MAIN_COLOR_LIGHT) { scrimType = SCRIM_TYPE_LIGHT; } else if (colorInt == Tonal.MAIN_COLOR_DARK) { scrimType = SCRIM_TYPE_DARK; } else { scrimType = SCRIM_TYPE_REGULAR; } mOverviewProxyService.onScrimColorsChanged(colorInt, scrimType); } } /** Loading packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +12 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_B import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import android.annotation.ColorInt; import android.annotation.FloatRange; import android.app.ActivityTaskManager; import android.content.BroadcastReceiver; Loading Loading @@ -59,6 +60,7 @@ import com.android.internal.policy.ScreenDecorationsUtils; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.colorextraction.SysuiColorExtractor.ScrimType; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; Loading Loading @@ -535,6 +537,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis dispatchNavButtonBounds(); } public void onScrimColorsChanged(@ColorInt int color, @ScrimType int type) { if (mOverviewProxy != null) { try { mOverviewProxy.onScrimColorsChanged(color, type); } catch (RemoteException e) { Log.e(TAG_OPS, "Failed to call onScrimColorsChanged()", e); } } } private void dispatchNavButtonBounds() { if (mOverviewProxy != null && mActiveNavBarRegion != null) { try { Loading packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +14 −2 Original line number Diff line number Diff line Loading @@ -34,10 +34,14 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.types.Tonal; import com.android.systemui.SysuiTestCase; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. Loading @@ -53,6 +57,13 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_NORMAL, ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; @Mock private OverviewProxyService mOverviewProxyService; @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void getColors_usesGreyIfWallpaperNotVisible() { Loading Loading @@ -118,7 +129,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), tonal, configurationController, false /* registerVisibility */); tonal, configurationController, false /* registerVisibility */, mOverviewProxyService); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); Loading @@ -133,7 +145,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(colors); outGradientColorsDark.set(colors); outGradientColorsExtraDark.set(colors); }, mock(ConfigurationController.class), false); }, mock(ConfigurationController.class), false, mOverviewProxyService); } private void simulateEvent(SysuiColorExtractor extractor) { Loading Loading
packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,9 @@ oneway interface IOverviewProxy { * Sent when some system ui state changes. */ void onSystemUiStateChanged(int stateFlags) = 16; /** * Sent when the scrim colors (based on wallpaper) change. */ void onScrimColorsChanged(int color, int type) = 17; }
packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +46 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.colorextraction; import android.annotation.ColorInt; import android.annotation.IntDef; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; Loading @@ -34,10 +36,13 @@ import com.android.internal.colorextraction.types.ExtractionType; import com.android.internal.colorextraction.types.Tonal; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import javax.inject.Inject; Loading @@ -50,23 +55,41 @@ import javax.inject.Singleton; public class SysuiColorExtractor extends ColorExtractor implements Dumpable, ConfigurationController.ConfigurationListener { private static final String TAG = "SysuiColorExtractor"; public static final int SCRIM_TYPE_REGULAR = 1; public static final int SCRIM_TYPE_LIGHT = 2; public static final int SCRIM_TYPE_DARK = 3; @IntDef(prefix = {"SCRIM_TYPE_"}, value = { SCRIM_TYPE_REGULAR, SCRIM_TYPE_LIGHT, SCRIM_TYPE_DARK }) @Retention(RetentionPolicy.SOURCE) public @interface ScrimType { } private final Tonal mTonal; private final OverviewProxyService mOverviewProxyService; private boolean mWallpaperVisible; private boolean mHasBackdrop; // Colors to return when the wallpaper isn't visible private final GradientColors mWpHiddenColors; @Inject public SysuiColorExtractor(Context context, ConfigurationController configurationController) { this(context, new Tonal(context), configurationController, true); public SysuiColorExtractor(Context context, ConfigurationController configurationController, OverviewProxyService overviewProxyService) { this(context, new Tonal(context), configurationController, true, overviewProxyService); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, ConfigurationController configurationController, boolean registerVisibility) { ConfigurationController configurationController, boolean registerVisibility, OverviewProxyService overviewProxyService) { super(context, type, false /* immediately */); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); mWpHiddenColors = new GradientColors(); mOverviewProxyService = overviewProxyService; configurationController.addCallback(this); WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); Loading Loading @@ -110,17 +133,35 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, return; } super.onColorsChanged(colors, which); if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { updateDefaultGradients(colors); } super.onColorsChanged(colors, which); } @Override public void onUiModeChanged() { WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); updateDefaultGradients(systemColors); triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); } @Override protected void triggerColorsChanged(int which) { super.triggerColorsChanged(which); if (mWpHiddenColors != null && (which & WallpaperManager.FLAG_SYSTEM) != 0) { @ColorInt int colorInt = mWpHiddenColors.getMainColor(); @ScrimType int scrimType; if (colorInt == Tonal.MAIN_COLOR_LIGHT) { scrimType = SCRIM_TYPE_LIGHT; } else if (colorInt == Tonal.MAIN_COLOR_DARK) { scrimType = SCRIM_TYPE_DARK; } else { scrimType = SCRIM_TYPE_REGULAR; } mOverviewProxyService.onScrimColorsChanged(colorInt, scrimType); } } /** Loading
packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +12 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_B import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import android.annotation.ColorInt; import android.annotation.FloatRange; import android.app.ActivityTaskManager; import android.content.BroadcastReceiver; Loading Loading @@ -59,6 +60,7 @@ import com.android.internal.policy.ScreenDecorationsUtils; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.colorextraction.SysuiColorExtractor.ScrimType; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; Loading Loading @@ -535,6 +537,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis dispatchNavButtonBounds(); } public void onScrimColorsChanged(@ColorInt int color, @ScrimType int type) { if (mOverviewProxy != null) { try { mOverviewProxy.onScrimColorsChanged(color, type); } catch (RemoteException e) { Log.e(TAG_OPS, "Failed to call onScrimColorsChanged()", e); } } } private void dispatchNavButtonBounds() { if (mOverviewProxy != null && mActiveNavBarRegion != null) { try { Loading
packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +14 −2 Original line number Diff line number Diff line Loading @@ -34,10 +34,14 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.types.Tonal; import com.android.systemui.SysuiTestCase; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. Loading @@ -53,6 +57,13 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_NORMAL, ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; @Mock private OverviewProxyService mOverviewProxyService; @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void getColors_usesGreyIfWallpaperNotVisible() { Loading Loading @@ -118,7 +129,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), tonal, configurationController, false /* registerVisibility */); tonal, configurationController, false /* registerVisibility */, mOverviewProxyService); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); Loading @@ -133,7 +145,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(colors); outGradientColorsDark.set(colors); outGradientColorsExtraDark.set(colors); }, mock(ConfigurationController.class), false); }, mock(ConfigurationController.class), false, mOverviewProxyService); } private void simulateEvent(SysuiColorExtractor extractor) { Loading