From 387103182273f26b176a045ed523e15c8130f9b7 Mon Sep 17 00:00:00 2001 From: Chandru Date: Thu, 9 Jun 2022 12:41:00 +0000 Subject: [PATCH] Update smart space views whenever the keyguard bypass state changes. This is used for showing the media info in the smart space on the lockscreen, when face unlock lockscreen bypass is enabled. Current behavior: if media is playing and user taps to wake up screen while not looking at the screen, the media controls (through notification) are not visible. There is no indication that there is media currently playing. New behavior: if media is playing and user taps to wake up screen while not looking at the screen, the smart space shows the media info. (media controls are still hidden and not affected by this change). Fixes: 230669390 Test: atest com.android.systemui.statusbar.lockscreen Change-Id: I91e705261cb6e48107103666a29a1b2ec61beeca --- .../plugins/BcSmartspaceDataPlugin.java | 5 ++ .../LockscreenSmartspaceController.kt | 23 ++++++- .../LockscreenSmartspaceControllerTest.kt | 68 +++++++++++++++++-- 3 files changed, 88 insertions(+), 8 deletions(-) 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?) { }