diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java index 3cf76456de915..eac765ab45b23 100644 --- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java @@ -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. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index a35bced819c02..a509fcaad4ee5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -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 @@ -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 @@ -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, @@ -154,6 +155,13 @@ class LockscreenSmartspaceController @Inject constructor( } } + private val bypassStateChangedListener = + object : KeyguardBypassController.OnBypassStateChangedListener { + override fun onBypassStateChanged(isEnabled: Boolean) { + updateBypassEnabled() + } + } + init { deviceProvisionedController.addCallback(deviceProvisionedListener) } @@ -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. */ @@ -211,6 +224,7 @@ class LockscreenSmartspaceController @Inject constructor( } }) ssView.setFalsingManager(falsingManager) + ssView.setKeyguardBypassEnabled(bypassController.bypassEnabled) return (ssView as View).apply { addOnAttachStateChangeListener(stateChangeListener) } } @@ -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() } @@ -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) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index b44f53c677143..20747a05a360b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -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 @@ -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 @@ -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() { @@ -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 + @Captor private lateinit var userTrackerCaptor: ArgumentCaptor + @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor + @Captor private lateinit var configChangeListenerCaptor: ArgumentCaptor + @Captor private lateinit var statusBarStateListenerCaptor: ArgumentCaptor + + @Captor + private lateinit var bypassStateChangedListenerCaptor: + ArgumentCaptor + @Captor private lateinit var deviceProvisionedCaptor: ArgumentCaptor @@ -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 @@ -177,11 +200,12 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { configurationController, statusBarStateController, deviceProvisionedController, + keyguardBypassController, execution, executor, handler, Optional.of(plugin) - ) + ) verify(deviceProvisionedController).addCallback(capture(deviceProvisionedCaptor)) deviceProvisionedListener = deviceProvisionedCaptor.value @@ -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 @@ -457,6 +494,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(contentResolver).unregisterContentObserver(settingsObserver) verify(configurationController).removeCallback(configChangeListener) verify(statusBarStateController).removeCallback(statusBarStateListener) + verify(keyguardBypassController) + .unregisterOnBypassStateChangedListener(bypassStateChangeListener) } @Test @@ -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 @@ -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) @@ -585,6 +640,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { override fun setDozeAmount(amount: Float) { } + override fun setKeyguardBypassEnabled(enabled: Boolean) { + } + override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) { }