diff options
2 files changed, 102 insertions, 21 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt index 503463171ae7..230907e46df8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt @@ -46,7 +46,12 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dump.DumpManager +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository +import com.android.systemui.keyguard.domain.interactor.FromAodTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository import com.android.systemui.power.domain.interactor.PowerInteractor @@ -127,7 +132,8 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { @Mock private lateinit var defaultUdfpsTouchOverlayViewModel: DefaultUdfpsTouchOverlayViewModel @Mock private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate - @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor + private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository + private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock private lateinit var shadeInteractor: ShadeInteractor @Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams> @Mock private lateinit var udfpsOverlayInteractor: UdfpsOverlayInteractor @@ -150,6 +156,19 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { mock(ScreenOffAnimationController::class.java), statusBarStateController, ) + keyguardTransitionRepository = FakeKeyguardTransitionRepository() + keyguardTransitionInteractor = + KeyguardTransitionInteractor( + scope = testScope.backgroundScope, + repository = keyguardTransitionRepository, + fromLockscreenTransitionInteractor = { + mock(FromLockscreenTransitionInteractor::class.java) + }, + fromPrimaryBouncerTransitionInteractor = { + mock(FromPrimaryBouncerTransitionInteractor::class.java) + }, + fromAodTransitionInteractor = { mock(FromAodTransitionInteractor::class.java) }, + ) whenever(inflater.inflate(R.layout.udfps_view, null, false)).thenReturn(udfpsView) whenever(inflater.inflate(R.layout.udfps_bp_view, null)) .thenReturn(mock(UdfpsBpView::class.java)) @@ -159,11 +178,25 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { .thenReturn(mock(UdfpsFpmEmptyView::class.java)) } + private suspend fun withReasonSuspend( + @RequestReason reason: Int, + isDebuggable: Boolean = false, + enableDeviceEntryUdfpsRefactor: Boolean = false, + block: suspend () -> Unit, + ) { + withReason( + reason, + isDebuggable, + enableDeviceEntryUdfpsRefactor, + ) + block() + } + private fun withReason( @RequestReason reason: Int, isDebuggable: Boolean = false, enableDeviceEntryUdfpsRefactor: Boolean = false, - block: () -> Unit, + block: () -> Unit = {}, ) { if (enableDeviceEntryUdfpsRefactor) { mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) @@ -312,6 +345,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { lastWakeReason = WakeSleepReason.POWER_BUTTON, lastSleepReason = WakeSleepReason.OTHER, ) + runCurrent() controllerOverlay.show(udfpsController, overlayParams) runCurrent() verify(windowManager).addView(any(), any()) @@ -321,13 +355,19 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { @Test fun showUdfpsOverlay_whileGoingToSleep() = testScope.runTest { - withReason(REASON_AUTH_KEYGUARD) { + withReasonSuspend(REASON_AUTH_KEYGUARD) { mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE) + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.OFF, + to = KeyguardState.GONE, + testScope = this, + ) powerRepository.updateWakefulness( rawState = WakefulnessState.STARTING_TO_SLEEP, lastWakeReason = WakeSleepReason.POWER_BUTTON, lastSleepReason = WakeSleepReason.OTHER, ) + runCurrent() controllerOverlay.show(udfpsController, overlayParams) runCurrent() verify(windowManager, never()).addView(any(), any()) @@ -338,28 +378,60 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { } @Test - fun showUdfpsOverlay_afterFinishedGoingToSleep() = + fun showUdfpsOverlay_whileAsleep() = testScope.runTest { - withReason(REASON_AUTH_KEYGUARD) { + withReasonSuspend(REASON_AUTH_KEYGUARD) { mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE) + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.OFF, + to = KeyguardState.GONE, + testScope = this, + ) powerRepository.updateWakefulness( - rawState = WakefulnessState.STARTING_TO_SLEEP, + rawState = WakefulnessState.ASLEEP, lastWakeReason = WakeSleepReason.POWER_BUTTON, lastSleepReason = WakeSleepReason.OTHER, ) + runCurrent() controllerOverlay.show(udfpsController, overlayParams) runCurrent() verify(windowManager, never()).addView(any(), any()) + // we hide to end the job that listens for the finishedGoingToSleep signal + controllerOverlay.hide() + } + } + + @Test + fun showUdfpsOverlay_afterFinishedTransitioningToAOD() = + testScope.runTest { + withReasonSuspend(REASON_AUTH_KEYGUARD) { + mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE) + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.OFF, + to = KeyguardState.GONE, + testScope = this, + ) powerRepository.updateWakefulness( - rawState = WakefulnessState.ASLEEP, + rawState = WakefulnessState.STARTING_TO_SLEEP, lastWakeReason = WakeSleepReason.POWER_BUTTON, lastSleepReason = WakeSleepReason.OTHER, ) runCurrent() - verify(windowManager) - .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture()) + controllerOverlay.show(udfpsController, overlayParams) + runCurrent() + verify(windowManager, never()).addView(any(), any()) + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.GONE, + to = KeyguardState.AOD, + testScope = this, + ) } + + runCurrent() + verify(windowManager) + .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture()) } private fun showUdfpsOverlay() { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt index 921e39532f58..97a93c9559c7 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt @@ -31,6 +31,7 @@ import android.hardware.biometrics.BiometricRequestConstants.RequestReason import android.hardware.fingerprint.IUdfpsOverlayControllerCallback import android.os.Build import android.os.RemoteException +import android.os.Trace import android.provider.Settings import android.util.Log import android.util.RotationUtils @@ -58,9 +59,9 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.domain.interactor.PowerInteractor -import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.LockscreenShadeTransitionController @@ -125,11 +126,15 @@ class UdfpsControllerOverlay @JvmOverloads constructor( private val powerInteractor: PowerInteractor, @Application private val scope: CoroutineScope, ) { - private val isFinishedGoingToSleep: Flow<Unit> = - powerInteractor.detailedWakefulness - .filter { it.internalWakefulnessState == WakefulnessState.ASLEEP } + private val currentStateUpdatedToOffAodOrDozing: Flow<Unit> = + transitionInteractor.currentKeyguardState + .filter { + it == KeyguardState.OFF || + it == KeyguardState.AOD || + it == KeyguardState.DOZING + } .map { } // map to Unit - private var listenForAsleepJob: Job? = null + private var listenForCurrentKeyguardState: Job? = null private var addViewRunnable: Runnable? = null private var overlayViewLegacy: UdfpsView? = null private set @@ -280,18 +285,19 @@ class UdfpsControllerOverlay @JvmOverloads constructor( private fun addViewNowOrLater(view: View, animation: UdfpsAnimationViewController<*>?) { if (udfpsViewPerformance()) { addViewRunnable = kotlinx.coroutines.Runnable { + Trace.setCounter("UdfpsAddView", 1) windowManager.addView( view, coreLayoutParams.updateDimensions(animation) ) } - if (powerInteractor.detailedWakefulness.value.internalWakefulnessState - != WakefulnessState.STARTING_TO_SLEEP) { + if (powerInteractor.detailedWakefulness.value.isAwake()) { + // Device is awake, so we add the view immediately. addViewIfPending() } else { - listenForAsleepJob?.cancel() - listenForAsleepJob = scope.launch { - isFinishedGoingToSleep.collect { + listenForCurrentKeyguardState?.cancel() + listenForCurrentKeyguardState = scope.launch { + currentStateUpdatedToOffAodOrDozing.collect { addViewIfPending() } } @@ -306,7 +312,7 @@ class UdfpsControllerOverlay @JvmOverloads constructor( private fun addViewIfPending() { addViewRunnable?.let { - listenForAsleepJob?.cancel() + listenForCurrentKeyguardState?.cancel() it.run() } addViewRunnable = null @@ -413,6 +419,9 @@ class UdfpsControllerOverlay @JvmOverloads constructor( } getTouchOverlay()?.apply { windowManager.removeView(this) + if (udfpsViewPerformance()) { + Trace.setCounter("UdfpsAddView", 0) + } setOnTouchListener(null) setOnHoverListener(null) overlayTouchListener?.let { @@ -423,7 +432,7 @@ class UdfpsControllerOverlay @JvmOverloads constructor( overlayViewLegacy = null overlayTouchView = null overlayTouchListener = null - listenForAsleepJob?.cancel() + listenForCurrentKeyguardState?.cancel() return wasShowing } |