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

Commit 386c9af7 authored by Wendly Li's avatar Wendly Li
Browse files

Cancel AodTimeoutAction when display is unconfigured.



There is still an edge case which causes probelem. I found
AodTimeoutAction is not canceled when receiving acquired events. We need
to cancel AodTimeoutAction when display is unconfigured. So we can cover
all of edge cases.

Bug: 247048663
Test: Check UI works properly
Test: Run atest UdfpsControllerTest
Change-Id: Ib3c01a51fd17a0d82d837126e22d764e456f9cbb
Signed-off-by: default avatarWendly Li <wendlyli@google.com>
parent fd0c9bfa
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -245,7 +245,7 @@ public class UdfpsController implements DozeReceiver {
                    mAcquiredReceived = true;
                    final UdfpsView view = mOverlay.getOverlayView();
                    if (view != null) {
                        view.unconfigureDisplay();
                        unconfigureDisplay(view);
                    }
                    if (acquiredGood) {
                        mOverlay.onAcquiredGood();
@@ -735,6 +735,19 @@ public class UdfpsController implements DozeReceiver {

        mOverlay = null;
        mOrientationListener.disable();

    }

    private void unconfigureDisplay(@NonNull UdfpsView view) {
        if (view.isDisplayConfigured()) {
            view.unconfigureDisplay();

            if (mCancelAodTimeoutAction != null) {
                mCancelAodTimeoutAction.run();
                mCancelAodTimeoutAction = null;
            }
            mIsAodInterruptActive = false;
        }
    }

    /**
@@ -810,12 +823,12 @@ public class UdfpsController implements DozeReceiver {
     * sensors, this can result in illumination persisting for longer than necessary.
     */
    void onCancelUdfps() {
        if (mOverlay != null && mOverlay.getOverlayView() != null) {
            onFingerUp(mOverlay.getRequestId(), mOverlay.getOverlayView());
        }
        if (!mIsAodInterruptActive) {
            return;
        }
        if (mOverlay != null && mOverlay.getOverlayView() != null) {
            onFingerUp(mOverlay.getRequestId(), mOverlay.getOverlayView());
        }
        if (mCancelAodTimeoutAction != null) {
            mCancelAodTimeoutAction.run();
            mCancelAodTimeoutAction = null;
@@ -909,15 +922,8 @@ public class UdfpsController implements DozeReceiver {
            }
        }
        mOnFingerDown = false;
        if (view.isDisplayConfigured()) {
            view.unconfigureDisplay();
        }
        unconfigureDisplay(view);

        if (mCancelAodTimeoutAction != null) {
            mCancelAodTimeoutAction.run();
            mCancelAodTimeoutAction = null;
        }
        mIsAodInterruptActive = false;
    }

    /**
+52 −1
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.graphics.Rect;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricOverlayConstants;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
@@ -682,7 +683,7 @@ public class UdfpsControllerTest extends SysuiTestCase {
    }

    @Test
    public void aodInterruptCancelTimeoutActionWhenFingerUp() throws RemoteException {
    public void aodInterruptCancelTimeoutActionOnFingerUp() throws RemoteException {
        when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true);
        when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);

@@ -733,6 +734,56 @@ public class UdfpsControllerTest extends SysuiTestCase {
        verify(mUdfpsView, times(1)).unconfigureDisplay();
    }

    @Test
    public void aodInterruptCancelTimeoutActionOnAcquired() throws RemoteException {
        when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true);
        when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);

        // GIVEN AOD interrupt
        mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, TEST_UDFPS_SENSOR_ID,
                BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
        mScreenObserver.onScreenTurnedOn();
        mFgExecutor.runAllReady();
        mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
        mFgExecutor.runAllReady();

        // Configure UdfpsView to accept the acquired event
        when(mUdfpsView.isDisplayConfigured()).thenReturn(true);

        // WHEN acquired is received
        mOverlayController.onAcquired(TEST_UDFPS_SENSOR_ID,
                BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD);

        // Configure UdfpsView to accept the ACTION_DOWN event
        when(mUdfpsView.isDisplayConfigured()).thenReturn(false);

        // WHEN ACTION_DOWN is received
        verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
        MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
        mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
        mBiometricsExecutor.runAllReady();
        downEvent.recycle();

        // WHEN ACTION_MOVE is received
        MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0);
        mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
        mBiometricsExecutor.runAllReady();
        moveEvent.recycle();
        mFgExecutor.runAllReady();

        // Configure UdfpsView to accept the finger up event
        when(mUdfpsView.isDisplayConfigured()).thenReturn(true);

        // WHEN it times out
        mFgExecutor.advanceClockToNext();
        mFgExecutor.runAllReady();

        // THEN the display should be unconfigured once. If the timeout action is not
        // cancelled, the display would be unconfigured twice which would cause two
        // FP attempts.
        verify(mUdfpsView, times(1)).unconfigureDisplay();
    }

    @Test
    public void aodInterruptScreenOff() throws RemoteException {
        // GIVEN screen off