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

Commit 93b776db authored by Wu Ahan's avatar Wu Ahan
Browse files

Instrument CUJ of the latency of udfps overlay attachment

Flag: EXEMPT latency instrument
Bug: 433878387
Test: atest UdfpsControllerTest
Change-Id: I57ac42b3fb10658dc3158dcabab9a9ea042e20b4
parent 9fa41441
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInt
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.UserActivityNotifierKosmosKt;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.kosmos.Kosmos;
import com.android.systemui.log.SessionTracker;
@@ -190,6 +191,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
    private UdfpsOverlayInteractor mUdfpsOverlayInteractor;
    @Mock
    private SelectedUserInteractor mSelectedUserInteractor;
    @Mock
    private Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;

    // Capture listeners so that they can be used to send events
    @Captor
@@ -306,7 +309,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
                mUdfpsOverlayInteractor,
                mPowerInteractor,
                mock(CoroutineScope.class),
                UserActivityNotifierKosmosKt.getUserActivityNotifier(mKosmos)
                UserActivityNotifierKosmosKt.getUserActivityNotifier(mKosmos),
                mWakefulnessLifecycle
        );
        verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
        mOverlayController = mOverlayCaptor.getValue();
+35 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static android.hardware.biometrics.BiometricRequestConstants.REASON_ENROL
import static android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_FIND_SENSOR;

import static com.android.internal.util.LatencyTracker.ACTION_UDFPS_ILLUMINATE;
import static com.android.internal.util.LatencyTracker.ACTION_UDFPS_OVERLAY_ATTACHED_AFTER_GOING_TO_SLEEP;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;

@@ -93,6 +94,7 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInt
import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.plugins.FalsingManager;
@@ -260,6 +262,29 @@ public class UdfpsController implements DozeReceiver, Dumpable {
        }
    };

    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
            new WakefulnessLifecycle.Observer() {
                @Override
                public void onStartedGoingToSleep() {
                    mLatencyTracker.onActionCancel(
                            ACTION_UDFPS_OVERLAY_ATTACHED_AFTER_GOING_TO_SLEEP);
                    mLatencyTracker.onActionStart(
                            ACTION_UDFPS_OVERLAY_ATTACHED_AFTER_GOING_TO_SLEEP);
                }
            };

    private final View.OnAttachStateChangeListener mOverlayAttachStateListener =
            new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(@NonNull View v) {
                    mLatencyTracker.onActionEnd(ACTION_UDFPS_OVERLAY_ATTACHED_AFTER_GOING_TO_SLEEP);
                }

                @Override
                public void onViewDetachedFromWindow(@NonNull View v) {}
            };

    @Override
    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
        final int touchConfigId = mContext.getResources().getInteger(
@@ -693,7 +718,8 @@ public class UdfpsController implements DozeReceiver, Dumpable {
            @NonNull UdfpsOverlayInteractor udfpsOverlayInteractor,
            @NonNull PowerInteractor powerInteractor,
            @Application CoroutineScope scope,
            UserActivityNotifier userActivityNotifier) {
            UserActivityNotifier userActivityNotifier,
            Lazy<WakefulnessLifecycle> wakefulnessLifecycle) {
        mContext = context;
        mExecution = execution;
        mVibrator = vibrator;
@@ -772,6 +798,11 @@ public class UdfpsController implements DozeReceiver, Dumpable {

        udfpsHapticsSimulator.setUdfpsController(this);
        udfpsShell.setUdfpsOverlayController(mUdfpsOverlayController);

        mWakefulnessLifecycle = wakefulnessLifecycle.get();
        if (mWakefulnessLifecycle != null) {
            mWakefulnessLifecycle.addObserver(mWakefulnessLifecycleObserver);
        }
    }

    /**
@@ -821,7 +852,9 @@ public class UdfpsController implements DozeReceiver, Dumpable {
                    + " isn't running on keyguard. Skip show.");
            return;
        }
        if (overlay.show(mOverlayParams)) {
        final View.OnAttachStateChangeListener listener =
                mWakefulnessLifecycle == null ? null : mOverlayAttachStateListener;
        if (overlay.show(mOverlayParams, listener)) {
            Log.d(TAG, "showUdfpsOverlay | adding window reason=" + requestReason);
            mOnFingerDown = false;
            mAttemptedToDismissKeyguard = false;
+10 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.Surface
import android.view.View
import android.view.View.OnAttachStateChangeListener
import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener
@@ -109,6 +110,7 @@ constructor(
    private var sensorBounds: Rect = Rect()

    private var overlayTouchListener: TouchExplorationStateChangeListener? = null
    private var overlayAttachStateListener: OnAttachStateChangeListener? = null

    private val coreLayoutParams =
        WindowManager.LayoutParams(
@@ -141,11 +143,16 @@ constructor(

    private var touchExplorationEnabled = false

    fun show(params: UdfpsOverlayParams): Boolean {
        return show(params, null)
    }

    /** Show the overlay or return false and do nothing if it is already showing. */
    @SuppressLint("ClickableViewAccessibility")
    fun show(params: UdfpsOverlayParams): Boolean {
    fun show(params: UdfpsOverlayParams, attachListener: OnAttachStateChangeListener?): Boolean {
        if (getTouchOverlay() == null) {
            overlayParams = params
            overlayAttachStateListener = attachListener
            sensorBounds = Rect(params.sensorBounds)
            try {
                overlayTouchView =
@@ -158,6 +165,7 @@ constructor(
                                importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
                            }

                            overlayAttachStateListener?.let { addOnAttachStateChangeListener(it) }
                            addViewNowOrLater(this, null)
                            when (requestReason) {
                                REASON_AUTH_KEYGUARD ->
@@ -259,6 +267,7 @@ constructor(
            Trace.setCounter("UdfpsAddView", 0)
            setOnTouchListener(null)
            setOnHoverListener(null)
            overlayAttachStateListener?.let { removeOnAttachStateChangeListener(it) }
            overlayTouchListener?.let {
                accessibilityManager.removeTouchExplorationStateChangeListener(it)
            }