[Bouncer] Fix flicker tests.
Fixes an issue where dismissaction is set to null before it's called when bouncer is unlocked. Fixes an issue where we call updateState everytime expansion changes. This was causing an overstack flow issue. Also it's super not performant to call this everytime expansion changes. Bug: 240298500 Test: Passed flicker tests for cts test. Passed presubmit. Test: Tested showing the bouncer. Test: Tested opening notification from lockscreen. Change-Id: Iede30acdf11689c5da7abd2d5e5b4619aa10b34a
This commit is contained in:
@@ -18,6 +18,7 @@ package com.android.systemui.keyguard.data
|
||||
|
||||
import android.view.KeyEvent
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
import java.lang.ref.WeakReference
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -45,4 +46,9 @@ interface BouncerViewDelegate {
|
||||
fun dispatchBackKeyEventPreIme(): Boolean
|
||||
fun showNextSecurityScreenOrFinish(): Boolean
|
||||
fun resume()
|
||||
fun setDismissAction(
|
||||
onDismissAction: ActivityStarter.OnDismissAction?,
|
||||
cancelAction: Runnable?,
|
||||
)
|
||||
fun willDismissWithActions(): Boolean
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import com.android.keyguard.KeyguardUpdateMonitor
|
||||
import com.android.keyguard.KeyguardUpdateMonitorCallback
|
||||
import com.android.keyguard.ViewMediatorCallback
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.keyguard.shared.model.BouncerCallbackActionsModel
|
||||
import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel
|
||||
import com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_HIDDEN
|
||||
@@ -54,8 +53,6 @@ constructor(
|
||||
val hide = _hide.asStateFlow()
|
||||
private val _startingToHide = MutableStateFlow(false)
|
||||
val startingToHide = _startingToHide.asStateFlow()
|
||||
private val _onDismissAction = MutableStateFlow<BouncerCallbackActionsModel?>(null)
|
||||
val onDismissAction = _onDismissAction.asStateFlow()
|
||||
private val _disappearAnimation = MutableStateFlow<Runnable?>(null)
|
||||
val startingDisappearAnimation = _disappearAnimation.asStateFlow()
|
||||
private val _keyguardPosition = MutableStateFlow(0f)
|
||||
@@ -120,10 +117,6 @@ constructor(
|
||||
_startingToHide.value = startingToHide
|
||||
}
|
||||
|
||||
fun setOnDismissAction(bouncerCallbackActionsModel: BouncerCallbackActionsModel?) {
|
||||
_onDismissAction.value = bouncerCallbackActionsModel
|
||||
}
|
||||
|
||||
fun setStartDisappearAnimation(runnable: Runnable?) {
|
||||
_disappearAnimation.value = runnable
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import com.android.systemui.dagger.qualifiers.Main
|
||||
import com.android.systemui.keyguard.DismissCallbackRegistry
|
||||
import com.android.systemui.keyguard.data.BouncerView
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository
|
||||
import com.android.systemui.keyguard.shared.model.BouncerCallbackActionsModel
|
||||
import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
@@ -94,8 +93,6 @@ constructor(
|
||||
val showMessage: Flow<BouncerShowMessageModel> = repository.showMessage.filterNotNull()
|
||||
val startingDisappearAnimation: Flow<Runnable> =
|
||||
repository.startingDisappearAnimation.filterNotNull()
|
||||
val onDismissAction: Flow<BouncerCallbackActionsModel> =
|
||||
repository.onDismissAction.filterNotNull()
|
||||
val resourceUpdateRequests: Flow<Boolean> = repository.resourceUpdateRequests.filter { it }
|
||||
val keyguardPosition: Flow<Float> = repository.keyguardPosition
|
||||
|
||||
@@ -149,7 +146,6 @@ constructor(
|
||||
}
|
||||
keyguardStateController.notifyBouncerShowing(true)
|
||||
callbackInteractor.dispatchStartingToShow()
|
||||
|
||||
Trace.endSection()
|
||||
}
|
||||
|
||||
@@ -168,7 +164,6 @@ constructor(
|
||||
keyguardStateController.notifyBouncerShowing(false /* showing */)
|
||||
cancelShowRunnable()
|
||||
repository.setShowingSoon(false)
|
||||
repository.setOnDismissAction(null)
|
||||
repository.setVisible(false)
|
||||
repository.setHide(true)
|
||||
repository.setShow(null)
|
||||
@@ -227,7 +222,7 @@ constructor(
|
||||
onDismissAction: ActivityStarter.OnDismissAction?,
|
||||
cancelAction: Runnable?
|
||||
) {
|
||||
repository.setOnDismissAction(BouncerCallbackActionsModel(onDismissAction, cancelAction))
|
||||
bouncerView.delegate?.setDismissAction(onDismissAction, cancelAction)
|
||||
}
|
||||
|
||||
/** Update the resources of the views. */
|
||||
@@ -305,7 +300,7 @@ constructor(
|
||||
|
||||
/** Return whether bouncer will dismiss with actions */
|
||||
fun willDismissWithAction(): Boolean {
|
||||
return repository.onDismissAction.value?.onDismissAction != null
|
||||
return bouncerView.delegate?.willDismissWithActions() == true
|
||||
}
|
||||
|
||||
/** Returns whether the bouncer should be full screen. */
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.android.keyguard.dagger.KeyguardBouncerComponent
|
||||
import com.android.systemui.keyguard.data.BouncerViewDelegate
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel
|
||||
import com.android.systemui.lifecycle.repeatWhenAttached
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
import com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_VISIBLE
|
||||
import kotlinx.coroutines.awaitCancellation
|
||||
import kotlinx.coroutines.flow.collect
|
||||
@@ -75,6 +76,17 @@ object KeyguardBouncerViewBinder {
|
||||
hostViewController.showPrimarySecurityScreen()
|
||||
hostViewController.onResume()
|
||||
}
|
||||
|
||||
override fun setDismissAction(
|
||||
onDismissAction: ActivityStarter.OnDismissAction?,
|
||||
cancelAction: Runnable?
|
||||
) {
|
||||
hostViewController.setOnDismissAction(onDismissAction, cancelAction)
|
||||
}
|
||||
|
||||
override fun willDismissWithActions(): Boolean {
|
||||
return hostViewController.hasDismissActions()
|
||||
}
|
||||
}
|
||||
view.repeatWhenAttached {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
@@ -121,15 +133,6 @@ object KeyguardBouncerViewBinder {
|
||||
viewModel.startingToHide.collect { hostViewController.onStartingToHide() }
|
||||
}
|
||||
|
||||
launch {
|
||||
viewModel.setDismissAction.collect {
|
||||
hostViewController.setOnDismissAction(
|
||||
it.onDismissAction,
|
||||
it.cancelAction
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
launch {
|
||||
viewModel.startDisappearAnimation.collect {
|
||||
hostViewController.startDisappearAnimation(it)
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.view.View
|
||||
import com.android.systemui.keyguard.data.BouncerView
|
||||
import com.android.systemui.keyguard.data.BouncerViewDelegate
|
||||
import com.android.systemui.keyguard.domain.interactor.BouncerInteractor
|
||||
import com.android.systemui.keyguard.shared.model.BouncerCallbackActionsModel
|
||||
import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel
|
||||
import com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_VISIBLE
|
||||
@@ -63,9 +62,6 @@ constructor(
|
||||
/** Observe whether bouncer is starting to hide. */
|
||||
val startingToHide: Flow<Unit> = interactor.startingToHide
|
||||
|
||||
/** Observe whether we want to set the dismiss action to the bouncer. */
|
||||
val setDismissAction: Flow<BouncerCallbackActionsModel> = interactor.onDismissAction
|
||||
|
||||
/** Observe whether we want to start the disappear animation. */
|
||||
val startDisappearAnimation: Flow<Runnable> = interactor.startingDisappearAnimation
|
||||
|
||||
|
||||
@@ -172,7 +172,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
if (mBouncerAnimating) {
|
||||
mCentralSurfaces.setBouncerHiddenFraction(expansion);
|
||||
}
|
||||
updateStates();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,8 +27,8 @@ import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.keyguard.DismissCallbackRegistry
|
||||
import com.android.systemui.keyguard.data.BouncerView
|
||||
import com.android.systemui.keyguard.data.BouncerViewDelegate
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository
|
||||
import com.android.systemui.keyguard.shared.model.BouncerCallbackActionsModel
|
||||
import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
@@ -57,6 +57,7 @@ class BouncerInteractorTest : SysuiTestCase() {
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private lateinit var repository: KeyguardBouncerRepository
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var bouncerView: BouncerView
|
||||
@Mock private lateinit var bouncerViewDelegate: BouncerViewDelegate
|
||||
@Mock private lateinit var keyguardStateController: KeyguardStateController
|
||||
@Mock private lateinit var keyguardSecurityModel: KeyguardSecurityModel
|
||||
@Mock private lateinit var bouncerCallbackInteractor: BouncerCallbackInteractor
|
||||
@@ -86,6 +87,7 @@ class BouncerInteractorTest : SysuiTestCase() {
|
||||
)
|
||||
`when`(repository.startingDisappearAnimation.value).thenReturn(null)
|
||||
`when`(repository.show.value).thenReturn(null)
|
||||
`when`(bouncerView.delegate).thenReturn(bouncerViewDelegate)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -124,7 +126,6 @@ class BouncerInteractorTest : SysuiTestCase() {
|
||||
verify(falsingCollector).onBouncerHidden()
|
||||
verify(keyguardStateController).notifyBouncerShowing(false)
|
||||
verify(repository).setShowingSoon(false)
|
||||
verify(repository).setOnDismissAction(null)
|
||||
verify(repository).setVisible(false)
|
||||
verify(repository).setHide(true)
|
||||
verify(repository).setShow(null)
|
||||
@@ -178,8 +179,7 @@ class BouncerInteractorTest : SysuiTestCase() {
|
||||
val onDismissAction = mock(ActivityStarter.OnDismissAction::class.java)
|
||||
val cancelAction = mock(Runnable::class.java)
|
||||
bouncerInteractor.setDismissAction(onDismissAction, cancelAction)
|
||||
verify(repository)
|
||||
.setOnDismissAction(BouncerCallbackActionsModel(onDismissAction, cancelAction))
|
||||
verify(bouncerViewDelegate).setDismissAction(onDismissAction, cancelAction)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -269,10 +269,9 @@ class BouncerInteractorTest : SysuiTestCase() {
|
||||
|
||||
@Test
|
||||
fun testWillDismissWithAction() {
|
||||
`when`(repository.onDismissAction.value?.onDismissAction)
|
||||
.thenReturn(mock(ActivityStarter.OnDismissAction::class.java))
|
||||
`when`(bouncerViewDelegate.willDismissWithActions()).thenReturn(true)
|
||||
assertThat(bouncerInteractor.willDismissWithAction()).isTrue()
|
||||
`when`(repository.onDismissAction.value?.onDismissAction).thenReturn(null)
|
||||
`when`(bouncerViewDelegate.willDismissWithActions()).thenReturn(false)
|
||||
assertThat(bouncerInteractor.willDismissWithAction()).isFalse()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user