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
This commit is contained in:
Chandru
2022-06-09 12:41:00 +00:00
committed by Chandru S
parent 5f5b5b959d
commit 3871031822
3 changed files with 88 additions and 8 deletions

View File

@@ -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.

View File

@@ -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)

View File

@@ -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<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>
@@ -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?) {
}