Loading packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +47 −86 Original line number Original line Diff line number Diff line Loading @@ -23,8 +23,6 @@ import android.app.WallpaperManager; import android.app.smartspace.SmartspaceConfig; import android.app.smartspace.SmartspaceConfig; import android.app.smartspace.SmartspaceManager; import android.app.smartspace.SmartspaceManager; import android.app.smartspace.SmartspaceSession; import android.app.smartspace.SmartspaceSession; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Color; import android.text.TextUtils; import android.text.TextUtils; Loading @@ -39,14 +37,13 @@ import com.android.internal.graphics.ColorUtils; import com.android.keyguard.clock.ClockManager; import com.android.keyguard.clock.ClockManager; import com.android.settingslib.Utils; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.PropertyAnimator; Loading @@ -69,14 +66,16 @@ import javax.inject.Inject; public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> { public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> { private static final boolean CUSTOM_CLOCKS_ENABLED = true; private static final boolean CUSTOM_CLOCKS_ENABLED = true; private final Resources mResources; private final StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController; private final SysuiColorExtractor mColorExtractor; private final SysuiColorExtractor mColorExtractor; private final ClockManager mClockManager; private final ClockManager mClockManager; private final KeyguardSliceViewController mKeyguardSliceViewController; private final KeyguardSliceViewController mKeyguardSliceViewController; private final NotificationIconAreaController mNotificationIconAreaController; private final NotificationIconAreaController mNotificationIconAreaController; private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher; private final Executor mUiExecutor; private final BatteryController mBatteryController; private final BatteryController mBatteryController; private final FeatureFlags mFeatureFlags; private final SystemUIFactory mSystemUIFactory; /** /** * Clock for both small and large sizes * Clock for both small and large sizes Loading @@ -86,10 +85,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private AnimatableClockController mLargeClockViewController; private AnimatableClockController mLargeClockViewController; private FrameLayout mLargeClockFrame; private FrameLayout mLargeClockFrame; private PluginManager mPluginManager; private boolean mIsSmartspaceEnabled; PluginListener mPluginListener; private Executor mUiExecutor; private SmartspaceSession mSmartspaceSession; private SmartspaceSession mSmartspaceSession; private SmartspaceSession.Callback mSmartspaceCallback; private SmartspaceSession.Callback mSmartspaceCallback; private float mDozeAmount; private float mDozeAmount; Loading Loading @@ -137,31 +132,28 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS @Inject @Inject public KeyguardClockSwitchController( public KeyguardClockSwitchController( KeyguardClockSwitch keyguardClockSwitch, KeyguardClockSwitch keyguardClockSwitch, @Main Resources resources, StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController, SysuiColorExtractor colorExtractor, ClockManager clockManager, SysuiColorExtractor colorExtractor, ClockManager clockManager, KeyguardSliceViewController keyguardSliceViewController, KeyguardSliceViewController keyguardSliceViewController, NotificationIconAreaController notificationIconAreaController, NotificationIconAreaController notificationIconAreaController, ContentResolver contentResolver, BroadcastDispatcher broadcastDispatcher, BroadcastDispatcher broadcastDispatcher, PluginManager pluginManager, FeatureFlags featureFlags, FeatureFlags featureFlags, @Main Executor uiExecutor, @Main Executor uiExecutor, BatteryController batteryController, BatteryController batteryController, ConfigurationController configurationController) { ConfigurationController configurationController, SystemUIFactory systemUIFactory) { super(keyguardClockSwitch); super(keyguardClockSwitch); mResources = resources; mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController; mColorExtractor = colorExtractor; mColorExtractor = colorExtractor; mClockManager = clockManager; mClockManager = clockManager; mKeyguardSliceViewController = keyguardSliceViewController; mKeyguardSliceViewController = keyguardSliceViewController; mNotificationIconAreaController = notificationIconAreaController; mNotificationIconAreaController = notificationIconAreaController; mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher; mPluginManager = pluginManager; mFeatureFlags = featureFlags; mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled(); mUiExecutor = uiExecutor; mUiExecutor = uiExecutor; mBatteryController = batteryController; mBatteryController = batteryController; mConfigurationController = configurationController; mConfigurationController = configurationController; mSystemUIFactory = systemUIFactory; } } /** /** Loading Loading @@ -206,24 +198,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mStatusBarStateController.addCallback(mStatusBarStateListener); mStatusBarStateController.addCallback(mStatusBarStateListener); mConfigurationController.addCallback(mConfigurationListener); mConfigurationController.addCallback(mConfigurationListener); // If a smartspace plugin is detected, replace the existing smartspace BcSmartspaceDataPlugin smartspaceDataPlugin = mSystemUIFactory.getSmartspaceDataProvider(); // (keyguard_status_area), and initialize a new session if (mFeatureFlags.isSmartspaceEnabled() && smartspaceDataPlugin != null) { mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() { @Override public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) { if (!mIsSmartspaceEnabled) return; View ksa = mView.findViewById(R.id.keyguard_status_area); View ksa = mView.findViewById(R.id.keyguard_status_area); int ksaIndex = mView.indexOfChild(ksa); int ksaIndex = mView.indexOfChild(ksa); ksa.setVisibility(View.GONE); ksa.setVisibility(View.GONE); mSmartspaceView = plugin.getView(mView); mSmartspaceView = smartspaceDataPlugin.getView(mView); mSmartspaceView.registerDataProvider(plugin); mSmartspaceView.registerDataProvider(smartspaceDataPlugin); updateSmartspaceColor(); updateSmartspaceColor(); View asView = (View) mSmartspaceView; View asView = (View) mSmartspaceView; // Place plugin view below normal clock... // Place smartspace view below normal clock... RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( MATCH_PARENT, WRAP_CONTENT); MATCH_PARENT, WRAP_CONTENT); lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view); lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view); Loading @@ -239,42 +225,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mLargeClockFrame.setLayoutParams(lp); mLargeClockFrame.setLayoutParams(lp); View nic = mView.findViewById( View nic = mView.findViewById( com.android.systemui.R.id.left_aligned_notification_icon_container); R.id.left_aligned_notification_icon_container); lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp.addRule(RelativeLayout.BELOW, asView.getId()); lp.addRule(RelativeLayout.BELOW, asView.getId()); nic.setLayoutParams(lp); nic.setLayoutParams(lp); createSmartspaceSession(plugin); } @Override public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) { if (!mIsSmartspaceEnabled) return; mView.removeView((View) mSmartspaceView); mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE); View nic = mView.findViewById( com.android.systemui.R.id.left_aligned_notification_icon_container); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area); nic.setLayoutParams(lp); mLargeClockFrame.setLayoutParams(lp); mSmartspaceView = null; } private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) { mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class) mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class) .createSmartspaceSession( .createSmartspaceSession( new SmartspaceConfig.Builder(getContext(), "lockscreen").build()); new SmartspaceConfig.Builder(getContext(), "lockscreen").build()); mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets); mSmartspaceCallback = targets -> smartspaceDataPlugin.onTargetsAvailable(targets); mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback); mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback); mSmartspaceSession.requestSmartspaceUpdate(); mSmartspaceSession.requestSmartspaceUpdate(); } } }; mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false); } } private void updateWallpaperColor() { private void updateWallpaperColor() { Loading Loading @@ -303,7 +265,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mSmartspaceSession.destroy(); mSmartspaceSession.destroy(); mSmartspaceSession = null; mSmartspaceSession = null; } } mPluginManager.removePluginListener(mPluginListener); mStatusBarStateController.removeCallback(mStatusBarStateListener); mStatusBarStateController.removeCallback(mStatusBarStateListener); mConfigurationController.removeCallback(mConfigurationListener); mConfigurationController.removeCallback(mConfigurationListener); } } Loading packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.systemui.dagger.GlobalRootComponent; import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMComponent; import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider; import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions; Loading Loading @@ -209,4 +210,8 @@ public class SystemUIFactory { AssetManager am, String modelName) { AssetManager am, String modelName) { return new BackGestureTfClassifierProvider(); return new BackGestureTfClassifierProvider(); } } public BcSmartspaceDataPlugin getSmartspaceDataProvider() { return null; } } } packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.keyguard.clock.ClockModule; import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.systemui.BootCompleteCache; import com.android.systemui.BootCompleteCache; import com.android.systemui.BootCompleteCacheImpl; import com.android.systemui.BootCompleteCacheImpl; import com.android.systemui.SystemUIFactory; import com.android.systemui.appops.dagger.AppOpsModule; import com.android.systemui.appops.dagger.AppOpsModule; import com.android.systemui.assist.AssistModule; import com.android.systemui.assist.AssistModule; import com.android.systemui.classifier.FalsingModule; import com.android.systemui.classifier.FalsingModule; Loading Loading @@ -159,6 +160,11 @@ public abstract class SystemUIModule { @Binds @Binds abstract SystemClock bindSystemClock(SystemClockImpl systemClock); abstract SystemClock bindSystemClock(SystemClockImpl systemClock); @Provides static SystemUIFactory getSystemUIFactory() { return SystemUIFactory.getInstance(); } // TODO: This should provided by the WM component // TODO: This should provided by the WM component /** Provides Optional of BubbleManager */ /** Provides Optional of BubbleManager */ @SysUISingleton @SysUISingleton Loading packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +33 −36 Original line number Original line Diff line number Diff line Loading @@ -16,16 +16,15 @@ package com.android.keyguard; package com.android.keyguard; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -38,13 +37,13 @@ import android.widget.RelativeLayout; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.ColorExtractor; import com.android.keyguard.clock.ClockManager; import com.android.keyguard.clock.ClockManager; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.NotificationIconAreaController; Loading Loading @@ -87,12 +86,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Mock @Mock NotificationIconAreaController mNotificationIconAreaController; NotificationIconAreaController mNotificationIconAreaController; @Mock @Mock ContentResolver mContentResolver; @Mock BroadcastDispatcher mBroadcastDispatcher; BroadcastDispatcher mBroadcastDispatcher; @Mock @Mock private PluginManager mPluginManager; @Mock private FeatureFlags mFeatureFlags; private FeatureFlags mFeatureFlags; @Mock @Mock private Executor mExecutor; private Executor mExecutor; Loading @@ -106,6 +101,12 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { BatteryController mBatteryController; BatteryController mBatteryController; @Mock @Mock ConfigurationController mConfigurationController; ConfigurationController mConfigurationController; @Mock BcSmartspaceDataPlugin mSmartspaceDataProvider; @Mock SmartspaceView mSmartspaceView; @Mock SystemUIFactory mSystemUIFactory; private KeyguardClockSwitchController mController; private KeyguardClockSwitchController mController; private View mStatusArea; private View mStatusArea; Loading @@ -129,27 +130,28 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mView.isAttachedToWindow()).thenReturn(true); when(mView.isAttachedToWindow()).thenReturn(true); when(mResources.getString(anyInt())).thenReturn("h:mm"); when(mResources.getString(anyInt())).thenReturn("h:mm"); when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(mSmartspaceDataProvider); mController = new KeyguardClockSwitchController( mController = new KeyguardClockSwitchController( mView, mView, mResources, mStatusBarStateController, mStatusBarStateController, mColorExtractor, mColorExtractor, mClockManager, mClockManager, mKeyguardSliceViewController, mKeyguardSliceViewController, mNotificationIconAreaController, mNotificationIconAreaController, mContentResolver, mBroadcastDispatcher, mBroadcastDispatcher, mPluginManager, mFeatureFlags, mFeatureFlags, mExecutor, mExecutor, mBatteryController, mBatteryController, mConfigurationController); mConfigurationController, mSystemUIFactory ); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors); when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors); mStatusArea = mock(View.class); mStatusArea = new View(getContext()); when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea); when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea); when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView); } } Loading Loading @@ -210,43 +212,37 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { } } @Test @Test public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() { public void testSmartspaceEnabledRemovesKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.GONE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); verify(mStatusArea).setVisibility(View.GONE); } } @Test @Test public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() { public void testSmartspaceEnabledNoDataProviderShowsKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(null); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.VISIBLE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); mController.mPluginListener.onPluginDisconnected(plugin); verify(mStatusArea).setVisibility(View.VISIBLE); } } @Test @Test public void testThemeChangeNotifiesSmartspace() { public void testSmartspaceDisabledShowsKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(false); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.VISIBLE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); } when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); @Test public void testThemeChangeNotifiesSmartspace() { mController.init(); verify(mSmartspaceView).setPrimaryTextColor(anyInt()); reset(view); mController.getConfigurationListener().onThemeChanged(); mController.getConfigurationListener().onThemeChanged(); verify(view).setPrimaryTextColor(anyInt()); verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt()); } } private void verifyAttachment(VerificationMode times) { private void verifyAttachment(VerificationMode times) { Loading @@ -257,8 +253,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { verify(mView, times).updateColors(mGradientColors); verify(mView, times).updateColors(mGradientColors); } } private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView { private static class SmartspaceView extends View TestView(Context context, AttributeSet attrs) { implements BcSmartspaceDataPlugin.SmartspaceView { SmartspaceView(Context context, AttributeSet attrs) { super(context, attrs); super(context, attrs); } } Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +47 −86 Original line number Original line Diff line number Diff line Loading @@ -23,8 +23,6 @@ import android.app.WallpaperManager; import android.app.smartspace.SmartspaceConfig; import android.app.smartspace.SmartspaceConfig; import android.app.smartspace.SmartspaceManager; import android.app.smartspace.SmartspaceManager; import android.app.smartspace.SmartspaceSession; import android.app.smartspace.SmartspaceSession; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Color; import android.text.TextUtils; import android.text.TextUtils; Loading @@ -39,14 +37,13 @@ import com.android.internal.graphics.ColorUtils; import com.android.keyguard.clock.ClockManager; import com.android.keyguard.clock.ClockManager; import com.android.settingslib.Utils; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.PropertyAnimator; Loading @@ -69,14 +66,16 @@ import javax.inject.Inject; public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> { public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> { private static final boolean CUSTOM_CLOCKS_ENABLED = true; private static final boolean CUSTOM_CLOCKS_ENABLED = true; private final Resources mResources; private final StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController; private final SysuiColorExtractor mColorExtractor; private final SysuiColorExtractor mColorExtractor; private final ClockManager mClockManager; private final ClockManager mClockManager; private final KeyguardSliceViewController mKeyguardSliceViewController; private final KeyguardSliceViewController mKeyguardSliceViewController; private final NotificationIconAreaController mNotificationIconAreaController; private final NotificationIconAreaController mNotificationIconAreaController; private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher; private final Executor mUiExecutor; private final BatteryController mBatteryController; private final BatteryController mBatteryController; private final FeatureFlags mFeatureFlags; private final SystemUIFactory mSystemUIFactory; /** /** * Clock for both small and large sizes * Clock for both small and large sizes Loading @@ -86,10 +85,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private AnimatableClockController mLargeClockViewController; private AnimatableClockController mLargeClockViewController; private FrameLayout mLargeClockFrame; private FrameLayout mLargeClockFrame; private PluginManager mPluginManager; private boolean mIsSmartspaceEnabled; PluginListener mPluginListener; private Executor mUiExecutor; private SmartspaceSession mSmartspaceSession; private SmartspaceSession mSmartspaceSession; private SmartspaceSession.Callback mSmartspaceCallback; private SmartspaceSession.Callback mSmartspaceCallback; private float mDozeAmount; private float mDozeAmount; Loading Loading @@ -137,31 +132,28 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS @Inject @Inject public KeyguardClockSwitchController( public KeyguardClockSwitchController( KeyguardClockSwitch keyguardClockSwitch, KeyguardClockSwitch keyguardClockSwitch, @Main Resources resources, StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController, SysuiColorExtractor colorExtractor, ClockManager clockManager, SysuiColorExtractor colorExtractor, ClockManager clockManager, KeyguardSliceViewController keyguardSliceViewController, KeyguardSliceViewController keyguardSliceViewController, NotificationIconAreaController notificationIconAreaController, NotificationIconAreaController notificationIconAreaController, ContentResolver contentResolver, BroadcastDispatcher broadcastDispatcher, BroadcastDispatcher broadcastDispatcher, PluginManager pluginManager, FeatureFlags featureFlags, FeatureFlags featureFlags, @Main Executor uiExecutor, @Main Executor uiExecutor, BatteryController batteryController, BatteryController batteryController, ConfigurationController configurationController) { ConfigurationController configurationController, SystemUIFactory systemUIFactory) { super(keyguardClockSwitch); super(keyguardClockSwitch); mResources = resources; mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController; mColorExtractor = colorExtractor; mColorExtractor = colorExtractor; mClockManager = clockManager; mClockManager = clockManager; mKeyguardSliceViewController = keyguardSliceViewController; mKeyguardSliceViewController = keyguardSliceViewController; mNotificationIconAreaController = notificationIconAreaController; mNotificationIconAreaController = notificationIconAreaController; mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher; mPluginManager = pluginManager; mFeatureFlags = featureFlags; mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled(); mUiExecutor = uiExecutor; mUiExecutor = uiExecutor; mBatteryController = batteryController; mBatteryController = batteryController; mConfigurationController = configurationController; mConfigurationController = configurationController; mSystemUIFactory = systemUIFactory; } } /** /** Loading Loading @@ -206,24 +198,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mStatusBarStateController.addCallback(mStatusBarStateListener); mStatusBarStateController.addCallback(mStatusBarStateListener); mConfigurationController.addCallback(mConfigurationListener); mConfigurationController.addCallback(mConfigurationListener); // If a smartspace plugin is detected, replace the existing smartspace BcSmartspaceDataPlugin smartspaceDataPlugin = mSystemUIFactory.getSmartspaceDataProvider(); // (keyguard_status_area), and initialize a new session if (mFeatureFlags.isSmartspaceEnabled() && smartspaceDataPlugin != null) { mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() { @Override public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) { if (!mIsSmartspaceEnabled) return; View ksa = mView.findViewById(R.id.keyguard_status_area); View ksa = mView.findViewById(R.id.keyguard_status_area); int ksaIndex = mView.indexOfChild(ksa); int ksaIndex = mView.indexOfChild(ksa); ksa.setVisibility(View.GONE); ksa.setVisibility(View.GONE); mSmartspaceView = plugin.getView(mView); mSmartspaceView = smartspaceDataPlugin.getView(mView); mSmartspaceView.registerDataProvider(plugin); mSmartspaceView.registerDataProvider(smartspaceDataPlugin); updateSmartspaceColor(); updateSmartspaceColor(); View asView = (View) mSmartspaceView; View asView = (View) mSmartspaceView; // Place plugin view below normal clock... // Place smartspace view below normal clock... RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( MATCH_PARENT, WRAP_CONTENT); MATCH_PARENT, WRAP_CONTENT); lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view); lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view); Loading @@ -239,42 +225,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mLargeClockFrame.setLayoutParams(lp); mLargeClockFrame.setLayoutParams(lp); View nic = mView.findViewById( View nic = mView.findViewById( com.android.systemui.R.id.left_aligned_notification_icon_container); R.id.left_aligned_notification_icon_container); lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp.addRule(RelativeLayout.BELOW, asView.getId()); lp.addRule(RelativeLayout.BELOW, asView.getId()); nic.setLayoutParams(lp); nic.setLayoutParams(lp); createSmartspaceSession(plugin); } @Override public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) { if (!mIsSmartspaceEnabled) return; mView.removeView((View) mSmartspaceView); mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE); View nic = mView.findViewById( com.android.systemui.R.id.left_aligned_notification_icon_container); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) nic.getLayoutParams(); lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area); nic.setLayoutParams(lp); mLargeClockFrame.setLayoutParams(lp); mSmartspaceView = null; } private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) { mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class) mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class) .createSmartspaceSession( .createSmartspaceSession( new SmartspaceConfig.Builder(getContext(), "lockscreen").build()); new SmartspaceConfig.Builder(getContext(), "lockscreen").build()); mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets); mSmartspaceCallback = targets -> smartspaceDataPlugin.onTargetsAvailable(targets); mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback); mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback); mSmartspaceSession.requestSmartspaceUpdate(); mSmartspaceSession.requestSmartspaceUpdate(); } } }; mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false); } } private void updateWallpaperColor() { private void updateWallpaperColor() { Loading Loading @@ -303,7 +265,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mSmartspaceSession.destroy(); mSmartspaceSession.destroy(); mSmartspaceSession = null; mSmartspaceSession = null; } } mPluginManager.removePluginListener(mPluginListener); mStatusBarStateController.removeCallback(mStatusBarStateListener); mStatusBarStateController.removeCallback(mStatusBarStateListener); mConfigurationController.removeCallback(mConfigurationListener); mConfigurationController.removeCallback(mConfigurationListener); } } Loading
packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.systemui.dagger.GlobalRootComponent; import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMComponent; import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider; import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions; Loading Loading @@ -209,4 +210,8 @@ public class SystemUIFactory { AssetManager am, String modelName) { AssetManager am, String modelName) { return new BackGestureTfClassifierProvider(); return new BackGestureTfClassifierProvider(); } } public BcSmartspaceDataPlugin getSmartspaceDataProvider() { return null; } } }
packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.keyguard.clock.ClockModule; import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.systemui.BootCompleteCache; import com.android.systemui.BootCompleteCache; import com.android.systemui.BootCompleteCacheImpl; import com.android.systemui.BootCompleteCacheImpl; import com.android.systemui.SystemUIFactory; import com.android.systemui.appops.dagger.AppOpsModule; import com.android.systemui.appops.dagger.AppOpsModule; import com.android.systemui.assist.AssistModule; import com.android.systemui.assist.AssistModule; import com.android.systemui.classifier.FalsingModule; import com.android.systemui.classifier.FalsingModule; Loading Loading @@ -159,6 +160,11 @@ public abstract class SystemUIModule { @Binds @Binds abstract SystemClock bindSystemClock(SystemClockImpl systemClock); abstract SystemClock bindSystemClock(SystemClockImpl systemClock); @Provides static SystemUIFactory getSystemUIFactory() { return SystemUIFactory.getInstance(); } // TODO: This should provided by the WM component // TODO: This should provided by the WM component /** Provides Optional of BubbleManager */ /** Provides Optional of BubbleManager */ @SysUISingleton @SysUISingleton Loading
packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +33 −36 Original line number Original line Diff line number Diff line Loading @@ -16,16 +16,15 @@ package com.android.keyguard; package com.android.keyguard; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -38,13 +37,13 @@ import android.widget.RelativeLayout; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.ColorExtractor; import com.android.keyguard.clock.ClockManager; import com.android.keyguard.clock.ClockManager; import com.android.systemui.R; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.NotificationIconAreaController; Loading Loading @@ -87,12 +86,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Mock @Mock NotificationIconAreaController mNotificationIconAreaController; NotificationIconAreaController mNotificationIconAreaController; @Mock @Mock ContentResolver mContentResolver; @Mock BroadcastDispatcher mBroadcastDispatcher; BroadcastDispatcher mBroadcastDispatcher; @Mock @Mock private PluginManager mPluginManager; @Mock private FeatureFlags mFeatureFlags; private FeatureFlags mFeatureFlags; @Mock @Mock private Executor mExecutor; private Executor mExecutor; Loading @@ -106,6 +101,12 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { BatteryController mBatteryController; BatteryController mBatteryController; @Mock @Mock ConfigurationController mConfigurationController; ConfigurationController mConfigurationController; @Mock BcSmartspaceDataPlugin mSmartspaceDataProvider; @Mock SmartspaceView mSmartspaceView; @Mock SystemUIFactory mSystemUIFactory; private KeyguardClockSwitchController mController; private KeyguardClockSwitchController mController; private View mStatusArea; private View mStatusArea; Loading @@ -129,27 +130,28 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mView.isAttachedToWindow()).thenReturn(true); when(mView.isAttachedToWindow()).thenReturn(true); when(mResources.getString(anyInt())).thenReturn("h:mm"); when(mResources.getString(anyInt())).thenReturn("h:mm"); when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(mSmartspaceDataProvider); mController = new KeyguardClockSwitchController( mController = new KeyguardClockSwitchController( mView, mView, mResources, mStatusBarStateController, mStatusBarStateController, mColorExtractor, mColorExtractor, mClockManager, mClockManager, mKeyguardSliceViewController, mKeyguardSliceViewController, mNotificationIconAreaController, mNotificationIconAreaController, mContentResolver, mBroadcastDispatcher, mBroadcastDispatcher, mPluginManager, mFeatureFlags, mFeatureFlags, mExecutor, mExecutor, mBatteryController, mBatteryController, mConfigurationController); mConfigurationController, mSystemUIFactory ); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors); when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors); mStatusArea = mock(View.class); mStatusArea = new View(getContext()); when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea); when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea); when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView); } } Loading Loading @@ -210,43 +212,37 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { } } @Test @Test public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() { public void testSmartspaceEnabledRemovesKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.GONE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); verify(mStatusArea).setVisibility(View.GONE); } } @Test @Test public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() { public void testSmartspaceEnabledNoDataProviderShowsKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true); when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(null); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.VISIBLE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); mController.mPluginListener.onPluginDisconnected(plugin); verify(mStatusArea).setVisibility(View.VISIBLE); } } @Test @Test public void testThemeChangeNotifiesSmartspace() { public void testSmartspaceDisabledShowsKeyguardStatusArea() { when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(false); mController.init(); mController.init(); BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class); assertEquals(View.VISIBLE, mStatusArea.getVisibility()); TestView view = mock(TestView.class); } when(plugin.getView(any())).thenReturn(view); mController.mPluginListener.onPluginConnected(plugin, mContext); @Test public void testThemeChangeNotifiesSmartspace() { mController.init(); verify(mSmartspaceView).setPrimaryTextColor(anyInt()); reset(view); mController.getConfigurationListener().onThemeChanged(); mController.getConfigurationListener().onThemeChanged(); verify(view).setPrimaryTextColor(anyInt()); verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt()); } } private void verifyAttachment(VerificationMode times) { private void verifyAttachment(VerificationMode times) { Loading @@ -257,8 +253,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { verify(mView, times).updateColors(mGradientColors); verify(mView, times).updateColors(mGradientColors); } } private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView { private static class SmartspaceView extends View TestView(Context context, AttributeSet attrs) { implements BcSmartspaceDataPlugin.SmartspaceView { SmartspaceView(Context context, AttributeSet attrs) { super(context, attrs); super(context, attrs); } } Loading