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

Commit 966bad85 authored by Beverly's avatar Beverly
Browse files

Don't remove the UdfpsView if it hasn't been added yet.

Test: atest UdfpsControllerOverlayTest UdfpsControllerTest
Fixes: 327056698
Flag: ACONFIG com.android.systemui.udfps_view_performance TEAMFOOD
Change-Id: I80a85e7ed6568233fe6c7ca47d5a11f75a1e95ee
parent 3dbb9db9
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.view.MotionEvent
import android.view.Surface
import android.view.Surface.Rotation
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -368,8 +369,12 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
                    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())

                // we hide to end the job that listens for the finishedGoingToSleep signal
@@ -393,8 +398,12 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
                    lastSleepReason = WakeSleepReason.OTHER,
                )
                runCurrent()

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

                // THEN view isn't added yet
                verify(windowManager, never()).addView(any(), any())

                // we hide to end the job that listens for the finishedGoingToSleep signal
@@ -402,6 +411,21 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
            }
        }

    @Test
    fun neverRemoveViewThatHasNotBeenAdded() =
        testScope.runTest {
            withReasonSuspend(REASON_AUTH_KEYGUARD) {
                mSetFlagsRule.enableFlags(Flags.FLAG_UDFPS_VIEW_PERFORMANCE)
                controllerOverlay.show(udfpsController, overlayParams)
                val view = controllerOverlay.getTouchOverlay()
                view?.let {
                    // parent is null, signalling that the view was never added
                    whenever(view.parent).thenReturn(null)
                }
                verify(windowManager, never()).removeView(eq(view))
            }
        }

    @Test
    fun showUdfpsOverlay_afterFinishedTransitioningToAOD() =
        testScope.runTest {
@@ -418,21 +442,27 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
                    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 the device finishes transitioning to AOD
                keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.AOD,
                    testScope = this,
                )
            }

                runCurrent()

                // THEN the view gets added
                verify(windowManager)
                    .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
            }
        }

    private fun showUdfpsOverlay() {
        val didShow = controllerOverlay.show(udfpsController, overlayParams)
@@ -459,6 +489,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
    private fun hideUdfpsOverlay() {
        val didShow = controllerOverlay.show(udfpsController, overlayParams)
        val view = controllerOverlay.getTouchOverlay()
        view?.let { whenever(view.parent).thenReturn(mock(ViewGroup::class.java)) }
        val didHide = controllerOverlay.hide()

        verify(windowManager).removeView(eq(view))
+7 −1
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
@@ -234,6 +235,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
    private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
    private IUdfpsOverlayController mOverlayController;
    @Captor
    private ArgumentCaptor<View> mViewCaptor;
    @Captor
    private ArgumentCaptor<UdfpsView.OnTouchListener> mTouchListenerCaptor;
    @Captor
    private ArgumentCaptor<View.OnHoverListener> mHoverListenerCaptor;
@@ -550,8 +553,11 @@ public class UdfpsControllerTest extends SysuiTestCase {
                                    mOpticalProps.sensorId,
                                    BiometricRequestConstants.REASON_ENROLL_ENROLLING,
                                    mUdfpsOverlayControllerCallback);

                            mFgExecutor.runAllReady();
                            verify(mWindowManager).addView(any(), any());
                            verify(mWindowManager).addView(mViewCaptor.capture(), any());
                            when(mViewCaptor.getValue().getParent())
                                    .thenReturn(mock(ViewGroup.class));

                            // Update overlay parameters.
                            reset(mWindowManager);
+5 −1
Original line number Diff line number Diff line
@@ -418,9 +418,13 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
            udfpsDisplayModeProvider.disable(null)
        }
        getTouchOverlay()?.apply {
            windowManager.removeView(this)
            if (udfpsViewPerformance()) {
                if (this.parent != null) {
                    windowManager.removeView(this)
                }
                Trace.setCounter("UdfpsAddView", 0)
            } else {
                windowManager.removeView(this)
            }
            setOnTouchListener(null)
            setOnHoverListener(null)