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:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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?) {
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user