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

Commit d9b9847a authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Notify OverviewProxyService of scrim colors

Bug: 130451254
Test: manual
Test: atest SysuiColorExtractorTests
Change-Id: I0ce271d3250ff5292a8e195c4c19ee99328ebad4
parent 0d04871f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
}
+46 −5
Original line number Diff line number Diff line
@@ -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);
        }
    }

    /**
+12 −0
Original line number Diff line number Diff line
@@ -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 {
+14 −2
Original line number Diff line number Diff line
@@ -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) {