Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 666451c1 authored by Beverly's avatar Beverly
Browse files

Don't update layout of a view that hasn't been added yet

Fixes: 333180884
Test: atest UdfpsControllerOverlayTest
Test: enroll udfps; rotate device to landscape in an app;
press power button to AOD; observe no crash
Flag: ACONFIG com.android.systemui.udfps_view_performance NEXTFOOD
Flag: ACONFIG com.android.systemui.device_entry_udfps_refactor TRUNKFOOD

Change-Id: Ie27c655df08bf554b2ebd5a24558f84fb4350ad4
parent ecad616a
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -537,4 +537,65 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
                assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
            }
        }

    @Test
    fun addViewPending_layoutIsNotUpdated() =
        testScope.runTest {
            withReasonSuspend(REASON_AUTH_KEYGUARD) {
                mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE)
                mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)

                // GIVEN going to sleep
                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()

                // WHEN a request comes to show the view
                controllerOverlay.show(udfpsController, overlayParams)
                runCurrent()

                // THEN the view does not get added immediately
                verify(windowManager, never()).addView(any(), any())

                // WHEN updateOverlayParams gets called when the view is pending to be added
                controllerOverlay.updateOverlayParams(overlayParams)

                // THEN the view layout is never updated
                verify(windowManager, never()).updateViewLayout(any(), any())

                // CLEANUPL we hide to end the job that listens for the finishedGoingToSleep signal
                controllerOverlay.hide()
            }
        }

    @Test
    fun updateOverlayParams_viewLayoutUpdated() =
        testScope.runTest {
            withReasonSuspend(REASON_AUTH_KEYGUARD) {
                mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE)
                powerRepository.updateWakefulness(
                    rawState = WakefulnessState.AWAKE,
                    lastWakeReason = WakeSleepReason.POWER_BUTTON,
                    lastSleepReason = WakeSleepReason.OTHER,
                )
                runCurrent()
                controllerOverlay.show(udfpsController, overlayParams)
                runCurrent()
                verify(windowManager).addView(any(), any())

                // WHEN updateOverlayParams gets called
                controllerOverlay.updateOverlayParams(overlayParams)

                // THEN the view layout is updated
                verify(windowManager, never()).updateViewLayout(any(), any())
            }
        }
}
+7 −1
Original line number Diff line number Diff line
@@ -323,9 +323,15 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
        overlayParams = updatedOverlayParams
        sensorBounds = updatedOverlayParams.sensorBounds
        getTouchOverlay()?.let {
            if (addViewRunnable != null) {
                // Only updateViewLayout if there's no pending view to add to WM.
                // If there is a pending view, that means the view hasn't been added yet so there's
                // no need to update any layouts. Instead the correct params will be used when the
                // view is eventually added.
                windowManager.updateViewLayout(it, coreLayoutParams.updateDimensions(null))
            }
        }
    }

    fun inflateUdfpsAnimation(
        view: UdfpsView,