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

Commit a76c5b2b authored by Matt Pietal's avatar Matt Pietal
Browse files

Smartspace - Allow primary card colors to be updated

This is largely for both AOD and lockscreen, while may have different
colors than launcher. Particularly for AOD, we need to transition to a
WHITE color. Set a primary text color, with expectations that a
secondary color will later be set in order to support cards with
various background colors.

Fixes: 185211979
Test: manual, change to AOD <-> LS
Change-Id: I36fb8e5cfcbac1ec999b2b9df08f42d47507990f
parent f63b7f05
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -58,5 +58,7 @@ public interface BcSmartspaceDataPlugin extends Plugin {
    /** View to which this plugin can be registered, in order to get updates. */
    interface SmartspaceView {
        void registerDataProvider(BcSmartspaceDataPlugin plugin);

        void setPrimaryTextColor(int color);
    }
}
+56 −1
Original line number Diff line number Diff line
@@ -26,14 +26,18 @@ import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.graphics.ColorUtils;
import com.android.keyguard.clock.ClockManager;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
@@ -50,6 +54,7 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.util.ViewController;

import java.util.Locale;
@@ -87,6 +92,10 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    private Executor mUiExecutor;
    private SmartspaceSession mSmartspaceSession;
    private SmartspaceSession.Callback mSmartspaceCallback;
    private float mDozeAmount;
    private int mWallpaperTextColor;
    private int mDozeColor = Color.WHITE;
    private ConfigurationController mConfigurationController;

    /**
     * Listener for changes to the color palette.
@@ -103,8 +112,25 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        }
    };

    private final ConfigurationController.ConfigurationListener mConfigurationListener =
            new ConfigurationController.ConfigurationListener() {
        @Override
        public void onThemeChanged() {
            updateWallpaperColor();
        }
    };

    private ClockManager.ClockChangedListener mClockChangedListener = this::setClockPlugin;

    private final StatusBarStateController.StateListener mStatusBarStateListener =
            new StatusBarStateController.StateListener() {
                @Override
                public void onDozeAmountChanged(float linear, float eased) {
                    mDozeAmount = eased;
                    updateSmartspaceColor();
                }
            };

    // If set, will replace keyguard_status_area
    private BcSmartspaceDataPlugin.SmartspaceView mSmartspaceView;

@@ -121,7 +147,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            PluginManager pluginManager,
            FeatureFlags featureFlags,
            @Main Executor uiExecutor,
            BatteryController batteryController) {
            BatteryController batteryController,
            ConfigurationController configurationController) {
        super(keyguardClockSwitch);
        mResources = resources;
        mStatusBarStateController = statusBarStateController;
@@ -134,6 +161,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled();
        mUiExecutor = uiExecutor;
        mBatteryController = batteryController;
        mConfigurationController = configurationController;
    }

    /**
@@ -172,6 +200,12 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
                mBatteryController);
        mLargeClockViewController.init();

        mDozeAmount = mStatusBarStateController.getDozeAmount();
        updateWallpaperColor();

        mStatusBarStateController.addCallback(mStatusBarStateListener);
        mConfigurationController.addCallback(mConfigurationListener);

        // If a smartspace plugin is detected, replace the existing smartspace
        // (keyguard_status_area), and initialize a new session
        mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() {
@@ -186,6 +220,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS

                mSmartspaceView = plugin.getView(mView);
                mSmartspaceView.registerDataProvider(plugin);
                updateSmartspaceColor();
                View asView = (View) mSmartspaceView;

                // Place plugin view below normal clock...
@@ -242,6 +277,19 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false);
    }

    private void updateWallpaperColor() {
        mWallpaperTextColor = Utils.getColorAttrDefaultColor(getContext(),
                R.attr.wallpaperTextColor);
        updateSmartspaceColor();
    }

    private void updateSmartspaceColor() {
        if (mSmartspaceView != null) {
            int color = ColorUtils.blendARGB(mWallpaperTextColor, mDozeColor, mDozeAmount);
            mSmartspaceView.setPrimaryTextColor(color);
        }
    }

    @Override
    protected void onViewDetached() {
        if (CUSTOM_CLOCKS_ENABLED) {
@@ -256,6 +304,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            mSmartspaceSession = null;
        }
        mPluginManager.removePluginListener(mPluginListener);
        mStatusBarStateController.removeCallback(mStatusBarStateListener);
        mConfigurationController.removeCallback(mConfigurationListener);
    }

    /**
@@ -399,4 +449,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    private int getCurrentLayoutDirection() {
        return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault());
    }

    @VisibleForTesting
    ConfigurationController.ConfigurationListener getConfigurationListener() {
        return mConfigurationListener;
    }
}
+31 −16
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -49,6 +50,7 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;

import org.junit.Before;
import org.junit.Test;
@@ -102,8 +104,11 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
    private FrameLayout mLargeClockFrame;
    @Mock
    BatteryController mBatteryController;
    @Mock
    ConfigurationController mConfigurationController;

    private KeyguardClockSwitchController mController;
    private View mStatusArea;

    @Before
    public void setup() {
@@ -111,6 +116,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {

        when(mView.findViewById(R.id.left_aligned_notification_icon_container))
                .thenReturn(mNotificationIcons);
        when(mNotificationIcons.getLayoutParams()).thenReturn(
                mock(RelativeLayout.LayoutParams.class));
        when(mView.getContext()).thenReturn(getContext());

        when(mView.findViewById(R.id.animatable_clock_view)).thenReturn(mClockView);
@@ -135,10 +142,15 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
                mPluginManager,
                mFeatureFlags,
                mExecutor,
                mBatteryController);
                mBatteryController,
                mConfigurationController);

        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
        when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);

        mStatusArea = mock(View.class);
        when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);

    }

    @Test
@@ -201,39 +213,40 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
    public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() {
        mController.init();

        View statusArea = mock(View.class);
        when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);

        View nic = mock(View.class);
        when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
        when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));

        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        TestView view = mock(TestView.class);
        when(plugin.getView(any())).thenReturn(view);

        mController.mPluginListener.onPluginConnected(plugin, mContext);
        verify(statusArea).setVisibility(View.GONE);
        verify(mStatusArea).setVisibility(View.GONE);
    }

    @Test
    public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() {
        mController.init();

        View statusArea = mock(View.class);
        when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);
        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        TestView view = mock(TestView.class);
        when(plugin.getView(any())).thenReturn(view);

        View nic = mock(View.class);
        when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
        when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));
        mController.mPluginListener.onPluginConnected(plugin, mContext);
        mController.mPluginListener.onPluginDisconnected(plugin);
        verify(mStatusArea).setVisibility(View.VISIBLE);
    }

    @Test
    public void testThemeChangeNotifiesSmartspace() {
        mController.init();

        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        TestView view = mock(TestView.class);
        when(plugin.getView(any())).thenReturn(view);

        mController.mPluginListener.onPluginConnected(plugin, mContext);
        mController.mPluginListener.onPluginDisconnected(plugin);
        verify(statusArea).setVisibility(View.VISIBLE);

        reset(view);
        mController.getConfigurationListener().onThemeChanged();
        verify(view).setPrimaryTextColor(anyInt());
    }

    private void verifyAttachment(VerificationMode times) {
@@ -250,5 +263,7 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
        }

        public void registerDataProvider(BcSmartspaceDataPlugin plugin) { }

        public void setPrimaryTextColor(int color) { }
    }
}