Notify OverviewProxyService of scrim colors

Bug: 130451254
Test: manual
Test: atest SysuiColorExtractorTests
Change-Id: I0ce271d3250ff5292a8e195c4c19ee99328ebad4
This commit is contained in:
Lucas Dupin
2019-05-09 11:30:56 -07:00
parent 0d04871fb3
commit d9b9847ad6
4 changed files with 77 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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;
@@ -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;
@@ -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);
@@ -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);
}
}
/**

View File

@@ -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;
@@ -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;
@@ -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 {

View File

@@ -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.
@@ -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() {
@@ -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);
@@ -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) {