Merge "Update smart space views whenever the keyguard bypass state changes." into tm-qpr-dev

This commit is contained in:
Chandru S
2022-06-15 09:00:36 +00:00
committed by Android (Google) Code Review
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?) {
}