[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:
Aaron Liu
2022-10-19 11:03:51 -07:00
parent d779fab0e6
commit 3e304dffc3
7 changed files with 26 additions and 35 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -172,7 +172,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
if (mBouncerAnimating) {
mCentralSurfaces.setBouncerHiddenFraction(expansion);
}
updateStates();
}
@Override

View File

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