Loading packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +5 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,11 @@ public interface BcSmartspaceDataPlugin extends Plugin { */ void setDozeAmount(float amount); /** * Set the current keyguard bypass enabled status. */ default void setKeyguardBypassEnabled(boolean enabled) {} /** * Overrides how Intents/PendingIntents gets launched. Mostly to support auth from * the lockscreen. Loading packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +20 −3 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import com.android.settingslib.Utils import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener Loading @@ -44,13 +46,11 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.settings.UserTracker import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.util.concurrency.Execution import com.android.systemui.util.settings.SecureSettings import java.lang.RuntimeException import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject Loading @@ -71,6 +71,7 @@ class LockscreenSmartspaceController @Inject constructor( private val configurationController: ConfigurationController, private val statusBarStateController: StatusBarStateController, private val deviceProvisionedController: DeviceProvisionedController, private val bypassController: KeyguardBypassController, private val execution: Execution, @Main private val uiExecutor: Executor, @Main private val handler: Handler, Loading Loading @@ -154,6 +155,13 @@ class LockscreenSmartspaceController @Inject constructor( } } private val bypassStateChangedListener = object : KeyguardBypassController.OnBypassStateChangedListener { override fun onBypassStateChanged(isEnabled: Boolean) { updateBypassEnabled() } } init { deviceProvisionedController.addCallback(deviceProvisionedListener) } Loading @@ -164,6 +172,11 @@ class LockscreenSmartspaceController @Inject constructor( return featureFlags.isEnabled(Flags.SMARTSPACE) && plugin != null } private fun updateBypassEnabled() { val bypassEnabled = bypassController.bypassEnabled smartspaceViews.forEach { it.setKeyguardBypassEnabled(bypassEnabled) } } /** * Constructs the smartspace view and connects it to the smartspace service. */ Loading Loading @@ -211,6 +224,7 @@ class LockscreenSmartspaceController @Inject constructor( } }) ssView.setFalsingManager(falsingManager) ssView.setKeyguardBypassEnabled(bypassController.bypassEnabled) return (ssView as View).apply { addOnAttachStateChangeListener(stateChangeListener) } } Loading Loading @@ -248,11 +262,13 @@ class LockscreenSmartspaceController @Inject constructor( ) configurationController.addCallback(configChangeListener) statusBarStateController.addCallback(statusBarStateListener) bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener) plugin.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) } updateBypassEnabled() reloadSmartspace() } Loading @@ -276,6 +292,7 @@ class LockscreenSmartspaceController @Inject constructor( contentResolver.unregisterContentObserver(settingsObserver) configurationController.removeCallback(configChangeListener) statusBarStateController.removeCallback(statusBarStateListener) bypassController.unregisterOnBypassStateChangedListener(bypassStateChangedListener) session = null plugin?.registerSmartspaceEventNotifier(null) Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +63 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import android.view.View import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener Loading @@ -41,8 +43,7 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener import com.android.systemui.settings.UserTracker import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener import com.android.systemui.statusbar.policy.DeviceProvisionedController Loading @@ -54,20 +55,20 @@ import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock import java.util.Optional import org.junit.Before import org.junit.Test import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.anyInt import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import java.util.Optional @SmallTest class LockscreenSmartspaceControllerTest : SysuiTestCase() { Loading @@ -81,36 +82,56 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { private lateinit var activityStarter: ActivityStarter @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var secureSettings: SecureSettings @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var contentResolver: ContentResolver @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var keyguardBypassController: KeyguardBypassController @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController @Mock private lateinit var handler: Handler @Mock private lateinit var plugin: BcSmartspaceDataPlugin @Mock private lateinit var controllerListener: SmartspaceTargetListener @Captor private lateinit var sessionListenerCaptor: ArgumentCaptor<OnTargetsAvailableListener> @Captor private lateinit var userTrackerCaptor: ArgumentCaptor<UserTracker.Callback> @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver> @Captor private lateinit var configChangeListenerCaptor: ArgumentCaptor<ConfigurationListener> @Captor private lateinit var statusBarStateListenerCaptor: ArgumentCaptor<StateListener> @Captor private lateinit var bypassStateChangedListenerCaptor: ArgumentCaptor<KeyguardBypassController.OnBypassStateChangedListener> @Captor private lateinit var deviceProvisionedCaptor: ArgumentCaptor<DeviceProvisionedListener> Loading @@ -119,6 +140,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { private lateinit var settingsObserver: ContentObserver private lateinit var configChangeListener: ConfigurationListener private lateinit var statusBarStateListener: StateListener private lateinit var bypassStateChangeListener: KeyguardBypassController.OnBypassStateChangedListener private lateinit var deviceProvisionedListener: DeviceProvisionedListener private lateinit var smartspaceView: SmartspaceView Loading Loading @@ -177,6 +200,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { configurationController, statusBarStateController, deviceProvisionedController, keyguardBypassController, execution, executor, handler, Loading Loading @@ -309,6 +333,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(smartspaceView).setDozeAmount(0.7f) } @Test fun testKeyguardBypassEnabledUpdatesView() { // GIVEN a connected smartspace session connectSession() `when`(keyguardBypassController.bypassEnabled).thenReturn(true) // WHEN the doze amount changes bypassStateChangeListener.onBypassStateChanged(true) // We pass that along to the view verify(smartspaceView).setKeyguardBypassEnabled(true) } @Test fun testSensitiveTargetsAreNotFilteredIfAllowed() { // GIVEN the active and managed users allow sensitive content Loading Loading @@ -457,6 +494,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(contentResolver).unregisterContentObserver(settingsObserver) verify(configurationController).removeCallback(configChangeListener) verify(statusBarStateController).removeCallback(statusBarStateListener) verify(keyguardBypassController) .unregisterOnBypassStateChangedListener(bypassStateChangeListener) } @Test Loading @@ -477,6 +516,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(smartspaceView2).registerDataProvider(plugin) } @Test fun testViewGetInitializedWithBypassEnabledState() { // GIVEN keyguard bypass is enabled. `when`(keyguardBypassController.bypassEnabled).thenReturn(true) // WHEN the view is being built val view = controller.buildAndConnectView(fakeParent) smartspaceView = view as SmartspaceView // THEN the view is initialized with the keyguard bypass enabled state. verify(smartspaceView).setKeyguardBypassEnabled(true) } @Test fun testConnectAttemptBeforeInitializationShouldNotCreateSession() { // GIVEN an uninitalized smartspaceView Loading Loading @@ -517,6 +569,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(statusBarStateController).addCallback(statusBarStateListenerCaptor.capture()) statusBarStateListener = statusBarStateListenerCaptor.value verify(keyguardBypassController) .registerOnBypassStateChangedListener(capture(bypassStateChangedListenerCaptor)) bypassStateChangeListener = bypassStateChangedListenerCaptor.value verify(smartspaceSession).requestSmartspaceUpdate() clearInvocations(smartspaceSession) Loading Loading @@ -585,6 +640,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { override fun setDozeAmount(amount: Float) { } override fun setKeyguardBypassEnabled(enabled: Boolean) { } override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) { } Loading Loading
packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +5 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,11 @@ public interface BcSmartspaceDataPlugin extends Plugin { */ void setDozeAmount(float amount); /** * Set the current keyguard bypass enabled status. */ default void setKeyguardBypassEnabled(boolean enabled) {} /** * Overrides how Intents/PendingIntents gets launched. Mostly to support auth from * the lockscreen. Loading
packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +20 −3 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import com.android.settingslib.Utils import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener Loading @@ -44,13 +46,11 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.settings.UserTracker import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.util.concurrency.Execution import com.android.systemui.util.settings.SecureSettings import java.lang.RuntimeException import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject Loading @@ -71,6 +71,7 @@ class LockscreenSmartspaceController @Inject constructor( private val configurationController: ConfigurationController, private val statusBarStateController: StatusBarStateController, private val deviceProvisionedController: DeviceProvisionedController, private val bypassController: KeyguardBypassController, private val execution: Execution, @Main private val uiExecutor: Executor, @Main private val handler: Handler, Loading Loading @@ -154,6 +155,13 @@ class LockscreenSmartspaceController @Inject constructor( } } private val bypassStateChangedListener = object : KeyguardBypassController.OnBypassStateChangedListener { override fun onBypassStateChanged(isEnabled: Boolean) { updateBypassEnabled() } } init { deviceProvisionedController.addCallback(deviceProvisionedListener) } Loading @@ -164,6 +172,11 @@ class LockscreenSmartspaceController @Inject constructor( return featureFlags.isEnabled(Flags.SMARTSPACE) && plugin != null } private fun updateBypassEnabled() { val bypassEnabled = bypassController.bypassEnabled smartspaceViews.forEach { it.setKeyguardBypassEnabled(bypassEnabled) } } /** * Constructs the smartspace view and connects it to the smartspace service. */ Loading Loading @@ -211,6 +224,7 @@ class LockscreenSmartspaceController @Inject constructor( } }) ssView.setFalsingManager(falsingManager) ssView.setKeyguardBypassEnabled(bypassController.bypassEnabled) return (ssView as View).apply { addOnAttachStateChangeListener(stateChangeListener) } } Loading Loading @@ -248,11 +262,13 @@ class LockscreenSmartspaceController @Inject constructor( ) configurationController.addCallback(configChangeListener) statusBarStateController.addCallback(statusBarStateListener) bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener) plugin.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) } updateBypassEnabled() reloadSmartspace() } Loading @@ -276,6 +292,7 @@ class LockscreenSmartspaceController @Inject constructor( contentResolver.unregisterContentObserver(settingsObserver) configurationController.removeCallback(configChangeListener) statusBarStateController.removeCallback(statusBarStateListener) bypassController.unregisterOnBypassStateChangedListener(bypassStateChangedListener) session = null plugin?.registerSmartspaceEventNotifier(null) Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +63 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import android.view.View import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener Loading @@ -41,8 +43,7 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener import com.android.systemui.settings.UserTracker import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener import com.android.systemui.statusbar.policy.DeviceProvisionedController Loading @@ -54,20 +55,20 @@ import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock import java.util.Optional import org.junit.Before import org.junit.Test import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.anyInt import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import java.util.Optional @SmallTest class LockscreenSmartspaceControllerTest : SysuiTestCase() { Loading @@ -81,36 +82,56 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { private lateinit var activityStarter: ActivityStarter @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var secureSettings: SecureSettings @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var contentResolver: ContentResolver @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var keyguardBypassController: KeyguardBypassController @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController @Mock private lateinit var handler: Handler @Mock private lateinit var plugin: BcSmartspaceDataPlugin @Mock private lateinit var controllerListener: SmartspaceTargetListener @Captor private lateinit var sessionListenerCaptor: ArgumentCaptor<OnTargetsAvailableListener> @Captor private lateinit var userTrackerCaptor: ArgumentCaptor<UserTracker.Callback> @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver> @Captor private lateinit var configChangeListenerCaptor: ArgumentCaptor<ConfigurationListener> @Captor private lateinit var statusBarStateListenerCaptor: ArgumentCaptor<StateListener> @Captor private lateinit var bypassStateChangedListenerCaptor: ArgumentCaptor<KeyguardBypassController.OnBypassStateChangedListener> @Captor private lateinit var deviceProvisionedCaptor: ArgumentCaptor<DeviceProvisionedListener> Loading @@ -119,6 +140,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { private lateinit var settingsObserver: ContentObserver private lateinit var configChangeListener: ConfigurationListener private lateinit var statusBarStateListener: StateListener private lateinit var bypassStateChangeListener: KeyguardBypassController.OnBypassStateChangedListener private lateinit var deviceProvisionedListener: DeviceProvisionedListener private lateinit var smartspaceView: SmartspaceView Loading Loading @@ -177,6 +200,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { configurationController, statusBarStateController, deviceProvisionedController, keyguardBypassController, execution, executor, handler, Loading Loading @@ -309,6 +333,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(smartspaceView).setDozeAmount(0.7f) } @Test fun testKeyguardBypassEnabledUpdatesView() { // GIVEN a connected smartspace session connectSession() `when`(keyguardBypassController.bypassEnabled).thenReturn(true) // WHEN the doze amount changes bypassStateChangeListener.onBypassStateChanged(true) // We pass that along to the view verify(smartspaceView).setKeyguardBypassEnabled(true) } @Test fun testSensitiveTargetsAreNotFilteredIfAllowed() { // GIVEN the active and managed users allow sensitive content Loading Loading @@ -457,6 +494,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(contentResolver).unregisterContentObserver(settingsObserver) verify(configurationController).removeCallback(configChangeListener) verify(statusBarStateController).removeCallback(statusBarStateListener) verify(keyguardBypassController) .unregisterOnBypassStateChangedListener(bypassStateChangeListener) } @Test Loading @@ -477,6 +516,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(smartspaceView2).registerDataProvider(plugin) } @Test fun testViewGetInitializedWithBypassEnabledState() { // GIVEN keyguard bypass is enabled. `when`(keyguardBypassController.bypassEnabled).thenReturn(true) // WHEN the view is being built val view = controller.buildAndConnectView(fakeParent) smartspaceView = view as SmartspaceView // THEN the view is initialized with the keyguard bypass enabled state. verify(smartspaceView).setKeyguardBypassEnabled(true) } @Test fun testConnectAttemptBeforeInitializationShouldNotCreateSession() { // GIVEN an uninitalized smartspaceView Loading Loading @@ -517,6 +569,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(statusBarStateController).addCallback(statusBarStateListenerCaptor.capture()) statusBarStateListener = statusBarStateListenerCaptor.value verify(keyguardBypassController) .registerOnBypassStateChangedListener(capture(bypassStateChangedListenerCaptor)) bypassStateChangeListener = bypassStateChangedListenerCaptor.value verify(smartspaceSession).requestSmartspaceUpdate() clearInvocations(smartspaceSession) Loading Loading @@ -585,6 +640,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { override fun setDozeAmount(amount: Float) { } override fun setKeyguardBypassEnabled(enabled: Boolean) { } override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) { } Loading