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

Commit 95c894c1 authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

Udfps-screen off behavior improvements

AOD x battery saver x UDFPS-screen off behavior:
- Show fingerprint icon & auth messages on udfps
screen off failures (previously, no UI would show
on failure)

Quick pickup gesture updates:
- Disable quick pickup gesture on non-optical
UDFPS devices
- Update quick pickup gesture to turn display on
without any AOD UI (previously, would show full
AOD UI); subsequent udfps-failure behavior will follow
udfps-screen off behavior

DozeTriggers changes:
- On pulse triggers, never request more than the
minimal UI the pulse trigger desires. If the doze state
is already showing more UI than the current pulse trigger,
don't request anything.

Test: atest DozeUiTest DozeTriggersTest
Test: on non-optical udfps devices: enable flag;
disable aod; check DozeLog; observe quick pickup gesture
is not enabled
Test: on optical udfps device: enable flag;
disable aod; check DozeLog; observe quick pickup gesture
is enabled; perform gestre; observe gesture triggers
Test: enable flag; enable aod; enable battery saver;
fail screen-off udfps with the wrong fingerprint; observe
fingerprint icon & fp message (and no clock UI)
Fixes: 432255207
Fixes: 433199294
Flag: com.android.systemui.new_dozing_keyguard_states

Change-Id: I9c728b395adf8d050b0037eb7ef0fb3cab7fb517
parent 6280ac14
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.doze;
import static com.android.systemui.doze.DozeMachine.State.DOZE;
import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD;
import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED;
import static com.android.systemui.doze.DozeMachine.State.DOZE_REQUEST_PULSE;
import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;

@@ -33,12 +34,14 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.systemui.DejankUtils;
import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.concurrency.FakeExecutor;
@@ -49,6 +52,8 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@@ -72,6 +77,8 @@ public class DozeUiTest extends SysuiTestCase {
    private HandlerThread mHandlerThread;
    private DozeUi mDozeUi;
    private FakeExecutor mFakeExecutor;
    @Captor
    private ArgumentCaptor<DozeHost.PulseCallback> mPulseCallbackCaptor;

    @Before
    public void setUp() throws Exception {
@@ -123,4 +130,72 @@ public class DozeUiTest extends SysuiTestCase {
        mDozeUi.transitionTo(UNINITIALIZED, DOZE);
        verify(mHost).setAnimateWakeup(eq(true));
    }

    @Test
    @EnableFlags(Flags.FLAG_NEW_DOZING_KEYGUARD_STATES)
    public void onPulseStarted_quickPickupRequestsPulsingWithoutUI() {
        mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
        mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);

        when(mMachine.getPulseReason()).thenReturn(DozeLog.REASON_SENSOR_QUICK_PICKUP);
        mDozeUi.transitionTo(DOZE_AOD, DOZE_REQUEST_PULSE);

        capturePulseCallback(DozeLog.REASON_SENSOR_QUICK_PICKUP);

        mPulseCallbackCaptor.getValue().onPulseStarted();
        verify(mMachine).requestState(DozeMachine.State.DOZE_PULSING_WITHOUT_UI);
    }

    @Test
    @EnableFlags(Flags.FLAG_NEW_DOZING_KEYGUARD_STATES)
    public void onPulseStarted_udfpsLongpressRequestsPulsingWithoutUI() {
        mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
        mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);

        when(mMachine.getPulseReason()).thenReturn(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS);
        mDozeUi.transitionTo(DOZE_AOD, DOZE_REQUEST_PULSE);

        capturePulseCallback(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS);

        mPulseCallbackCaptor.getValue().onPulseStarted();
        verify(mMachine).requestState(DozeMachine.State.DOZE_PULSING_WITHOUT_UI);
    }

    @Test
    @EnableFlags(Flags.FLAG_NEW_DOZING_KEYGUARD_STATES)
    public void onPulseStarted_fingerprintPulseShowAuthUI() {
        mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
        mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);

        when(mMachine.getPulseReason()).thenReturn(
                DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI
        );
        mDozeUi.transitionTo(DOZE_AOD, DOZE_REQUEST_PULSE);

        capturePulseCallback(DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI);

        mPulseCallbackCaptor.getValue().onPulseStarted();
        verify(mMachine).requestState(DozeMachine.State.DOZE_PULSING_AUTH_UI);
    }

    @Test
    @EnableFlags(Flags.FLAG_NEW_DOZING_KEYGUARD_STATES)
    public void onPulseStarted_fingerprintPulseShowFullUI() {
        mDozeUi.transitionTo(UNINITIALIZED, INITIALIZED);
        mDozeUi.transitionTo(INITIALIZED, DOZE_AOD);

        when(mMachine.getPulseReason()).thenReturn(
                DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_FULL_UI
        );
        mDozeUi.transitionTo(DOZE_AOD, DOZE_REQUEST_PULSE);

        capturePulseCallback(DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_FULL_UI);

        mPulseCallbackCaptor.getValue().onPulseStarted();
        verify(mMachine).requestState(DozeMachine.State.DOZE_PULSING);
    }

    private void capturePulseCallback(int pulseReason) {
        verify(mHost).pulseWhileDozing(mPulseCallbackCaptor.capture(), eq(pulseReason));
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -600,6 +600,7 @@ public class DozeLog implements Dumpable {
            PULSE_REASON_SENSOR_WAKE_REACH, REASON_SENSOR_TAP,
            PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI,
            PULSE_REASON_FINGERPRINT_PULSE_SHOW_FULL_UI,
            REASON_SENSOR_UDFPS_LONG_PRESS,
            REASON_SENSOR_QUICK_PICKUP,
            PULSE_REASON_FINGERPRINT_ACTIVATED, PULSE_REASON_MINMODE
    })
+12 −2
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ public class DozeSensors {
    private boolean mListeningProxSensors;
    private boolean mListeningAodOnlySensors;
    private boolean mUdfpsEnrolled;
    private boolean mOpticalUdfpsEnrolled;

    @DevicePostureController.DevicePostureInt
    private int mDevicePosture;
@@ -182,6 +183,8 @@ public class DozeSensors {

        mUdfpsEnrolled =
                mAuthController.isUdfpsEnrolled(mSelectedUserInteractor.getSelectedUserId());
        mOpticalUdfpsEnrolled =
                mAuthController.isOpticalUdfpsEnrolled(mSelectedUserInteractor.getSelectedUserId());
        mAuthController.addCallback(mAuthControllerCallback);
        mTriggerSensors = new TriggerSensor[] {
                new TriggerSensor(
@@ -304,6 +307,11 @@ public class DozeSensors {
    }

    private boolean quickPickUpConfigured() {
        if (Flags.newDozingKeyguardStates()) {
            return mOpticalUdfpsEnrolled
                    && mConfig.quickPickupSensorEnabled(
                            mSelectedUserInteractor.getSelectedUserId());
        }
        return mUdfpsEnrolled
                && mConfig.quickPickupSensorEnabled(mSelectedUserInteractor.getSelectedUserId());
    }
@@ -519,6 +527,7 @@ public class DozeSensors {
        pw.println("mListeningProxSensors=" + mListeningProxSensors);
        pw.println("mScreenOffUdfpsEnabled=" + mScreenOffUdfpsEnabled);
        pw.println("mUdfpsEnrolled=" + mUdfpsEnrolled);
        pw.println("mOpticalUdfpsEnrolled=" + mOpticalUdfpsEnrolled);
        IndentingPrintWriter idpw = new IndentingPrintWriter(pw);
        idpw.increaseIndent();
        for (TriggerSensor s : mTriggerSensors) {
@@ -897,8 +906,9 @@ public class DozeSensors {
        }

        private void updateUdfpsEnrolled() {
            mUdfpsEnrolled = mAuthController.isUdfpsEnrolled(
                    mSelectedUserInteractor.getSelectedUserId());
            final int userId = mSelectedUserInteractor.getSelectedUserId();
            mUdfpsEnrolled = mAuthController.isUdfpsEnrolled(userId);
            mOpticalUdfpsEnrolled = mAuthController.isOpticalUdfpsEnrolled(userId);
            for (TriggerSensor sensor : mTriggerSensors) {
                if (REASON_SENSOR_QUICK_PICKUP == sensor.mPulseReason) {
                    sensor.setConfigured(quickPickUpConfigured());
+34 −9
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.doze;

import static android.app.StatusBarManager.SESSION_KEYGUARD;

import static com.android.systemui.Flags.newDozingKeyguardStates;
import static com.android.systemui.Flags.udfpsScreenOffUnlockFlicker;
import static com.android.systemui.doze.DozeMachine.State.DOZE_SUSPEND_TRIGGERS;
import static com.android.systemui.doze.DozeMachine.State.FINISH;
@@ -603,17 +604,41 @@ public class DozeTriggers implements DozeMachine.Part {
            return;
        }

        // When we're already showing selective UI (or no UI) while pulsing, we can directly
        // go to other pulsing states.
        if (newDozingKeyguardStates()) {
            // When already pulsing, quick pickup and longpress gestures don't need to request
            // a new pulse
            if (alreadyPulsing
                    && (reason == DozeLog.REASON_SENSOR_QUICK_PICKUP
                    || reason == DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS)) {
                return;
            }

            // When already showing auth UI, PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI
            // doesn't need to request a new pulse
            if ((dozeState == State.DOZE_PULSING_AUTH_UI || dozeState == State.DOZE_PULSING)
                    && reason == DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI) {
                return;
            }

            // When already showing full aod UI, PULSE_REASON_FINGERPRINT_PULSE_SHOW_FULL_UI
            // doesn't need to request a new pulse
            if (dozeState == State.DOZE_PULSING
                    && reason == DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_FULL_UI) {
                return;
            }

            // When we're already pulsing and showing selective or no UI,
            // we can directly go to other pulsing states.
            if (selectiveUiPulsing) {
                if (reason == DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI) {
                    mMachine.requestState(State.DOZE_PULSING_AUTH_UI);
                } else {
                    // all other pulses should show full aod ui
                    mMachine.requestState(State.DOZE_PULSING);
                }
                return;
            }

        }

        if (!mAllowPulseTriggers || mDozeHost.isPulsePending()
                || !canPulse(dozeState, performedProxCheck)) {
+3 −3
Original line number Diff line number Diff line
@@ -103,9 +103,9 @@ public class DozeUi implements DozeMachine.Part {
                                requestState = DozeMachine.State.DOZE_PULSING_BRIGHT;
                            }

                            if (com.android.systemui.Flags.newDozingKeyguardStates()
                                    && !mDozeParameters.getAlwaysOn()) {
                                if (reason == DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS) {
                            if (com.android.systemui.Flags.newDozingKeyguardStates()) {
                                if (reason == DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS
                                        || reason == DozeLog.REASON_SENSOR_QUICK_PICKUP) {
                                    requestState = DozeMachine.State.DOZE_PULSING_WITHOUT_UI;
                                } else if (reason
                                        == DozeLog.PULSE_REASON_FINGERPRINT_PULSE_SHOW_AUTH_UI) {
Loading