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

Commit 67cca744 authored by Adrian Roos's avatar Adrian Roos
Browse files

AOD: Prolong AOD2 after interaction, turn off AOD when prox covered

Turns off AOD 1 and 2 when the proximity sensor is covered.
Also extends the AOD2 duration when the screen is touched or
the lift gesture is triggered.

Also fixes some issues with the fingerprint unlock transition
from AOD where the doze state for the NotificationPanelView
was cleared too early.

Also hides the wallpaper while we're dozing.

Test: runtest -x packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
Fixes: 36893539
Fixes: 36893538
Fixes: 36033906
Fixes: 37327153
Change-Id: I3fccae1515a0daf2ff99589ed78ec947687e6262
parent 1aade4e4
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -33,6 +33,8 @@ public interface DozeHost {
    boolean isPulsingBlocked();
    boolean isPulsingBlocked();


    void startPendingIntentDismissingKeyguard(PendingIntent intent);
    void startPendingIntentDismissingKeyguard(PendingIntent intent);
    void abortPulsing();
    void extendPulse();


    interface Callback {
    interface Callback {
        default void onNotificationHeadsUp() {}
        default void onNotificationHeadsUp() {}
+10 −1
Original line number Original line Diff line number Diff line
@@ -58,12 +58,15 @@ public class DozeMachine {
        /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */
        /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */
        DOZE_PULSE_DONE,
        DOZE_PULSE_DONE,
        /** Doze is done. DozeService is finished. */
        /** Doze is done. DozeService is finished. */
        FINISH;
        FINISH,
        /** AOD, but the display is temporarily off. */
        DOZE_AOD_PAUSED;


        boolean canPulse() {
        boolean canPulse() {
            switch (this) {
            switch (this) {
                case DOZE:
                case DOZE:
                case DOZE_AOD:
                case DOZE_AOD:
                case DOZE_AOD_PAUSED:
                    return true;
                    return true;
                default:
                default:
                    return false;
                    return false;
@@ -85,6 +88,7 @@ public class DozeMachine {
                case UNINITIALIZED:
                case UNINITIALIZED:
                case INITIALIZED:
                case INITIALIZED:
                case DOZE:
                case DOZE:
                case DOZE_AOD_PAUSED:
                    return Display.STATE_OFF;
                    return Display.STATE_OFF;
                case DOZE_PULSING:
                case DOZE_PULSING:
                case DOZE_AOD:
                case DOZE_AOD:
@@ -241,6 +245,11 @@ public class DozeMachine {
        if (mState == State.FINISH) {
        if (mState == State.FINISH) {
            return State.FINISH;
            return State.FINISH;
        }
        }
        if ((mState == State.DOZE_AOD_PAUSED || mState == State.DOZE_AOD || mState == State.DOZE)
                && requestedState == State.DOZE_PULSE_DONE) {
            Log.i(TAG, "Dropping pulse done because current state is already done: " + mState);
            return mState;
        }
        if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) {
        if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) {
            Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState);
            Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState);
            return mState;
            return mState;
+51 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Context;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.hardware.TriggerEventListener;
@@ -40,6 +42,7 @@ import com.android.systemui.util.wakelock.WakeLock;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.List;
import java.util.List;
import java.util.function.Consumer;


public class DozeSensors {
public class DozeSensors {


@@ -55,18 +58,22 @@ public class DozeSensors {
    private final DozeParameters mDozeParameters;
    private final DozeParameters mDozeParameters;
    private final AmbientDisplayConfiguration mConfig;
    private final AmbientDisplayConfiguration mConfig;
    private final WakeLock mWakeLock;
    private final WakeLock mWakeLock;
    private final Consumer<Boolean> mProxCallback;
    private final Callback mCallback;
    private final Callback mCallback;


    private final Handler mHandler = new Handler();
    private final Handler mHandler = new Handler();
    private final ProxSensor mProxSensor;




    public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters,
    public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters,
            AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback) {
            AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback,
            Consumer<Boolean> proxCallback) {
        mContext = context;
        mContext = context;
        mSensorManager = sensorManager;
        mSensorManager = sensorManager;
        mDozeParameters = dozeParameters;
        mDozeParameters = dozeParameters;
        mConfig = config;
        mConfig = config;
        mWakeLock = wakeLock;
        mWakeLock = wakeLock;
        mProxCallback = proxCallback;
        mResolver = mContext.getContentResolver();
        mResolver = mContext.getContentResolver();


        mSensors = new TriggerSensor[] {
        mSensors = new TriggerSensor[] {
@@ -86,6 +93,8 @@ public class DozeSensors {
                        true /* configured */,
                        true /* configured */,
                        DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP)
                        DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP)
        };
        };

        mProxSensor = new ProxSensor();
        mCallback = callback;
        mCallback = callback;
    }
    }


@@ -129,6 +138,10 @@ public class DozeSensors {
        }
        }
    }
    }


    public void setProxListening(boolean listen) {
        mProxSensor.setRegistered(listen);
    }

    private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
    private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
        @Override
        @Override
        public void onChange(boolean selfChange, Uri uri, int userId) {
        public void onChange(boolean selfChange, Uri uri, int userId) {
@@ -152,6 +165,43 @@ public class DozeSensors {
        }
        }
    }
    }


    private class ProxSensor implements SensorEventListener {

        boolean mRegistered;
        Boolean mCurrentlyFar;

        void setRegistered(boolean register) {
            if (mRegistered == register) {
                // Send an update even if we don't re-register.
                mHandler.post(() -> {
                    if (mCurrentlyFar != null) {
                        mProxCallback.accept(mCurrentlyFar);
                    }
                });
                return;
            }
            if (register) {
                mRegistered = mSensorManager.registerListener(this,
                        mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
                        SensorManager.SENSOR_DELAY_NORMAL, mHandler);
            } else {
                mSensorManager.unregisterListener(this);
                mRegistered = false;
                mCurrentlyFar = null;
            }
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange();
            mProxCallback.accept(mCurrentlyFar);
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    }

    private class TriggerSensor extends TriggerEventListener {
    private class TriggerSensor extends TriggerEventListener {
        final Sensor mSensor;
        final Sensor mSensor;
        final boolean mConfigured;
        final boolean mConfigured;
+35 −1
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ import java.io.PrintWriter;
public class DozeTriggers implements DozeMachine.Part {
public class DozeTriggers implements DozeMachine.Part {


    private static final String TAG = "DozeTriggers";
    private static final String TAG = "DozeTriggers";
    private static final boolean DEBUG = DozeService.DEBUG;


    /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */
    /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */
    private static final String PULSE_ACTION = "com.android.systemui.doze.pulse";
    private static final String PULSE_ACTION = "com.android.systemui.doze.pulse";
@@ -81,7 +82,7 @@ public class DozeTriggers implements DozeMachine.Part {
        mWakeLock = wakeLock;
        mWakeLock = wakeLock;
        mAllowPulseTriggers = allowPulseTriggers;
        mAllowPulseTriggers = allowPulseTriggers;
        mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, config,
        mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, config,
                wakeLock, this::onSensor);
                wakeLock, this::onSensor, this::onProximityFar);
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
    }
    }


@@ -113,6 +114,22 @@ public class DozeTriggers implements DozeMachine.Part {
        }
        }
    }
    }


    private void onProximityFar(boolean far) {
        final boolean near = !far;
        DozeMachine.State state = mMachine.getState();
        if (near && state == DozeMachine.State.DOZE_PULSING) {
            if (DEBUG) Log.i(TAG, "Prox NEAR, ending pulse");
            mMachine.requestState(DozeMachine.State.DOZE_PULSE_DONE);
        }
        if (far && state == DozeMachine.State.DOZE_AOD_PAUSED) {
            if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD");
            mMachine.requestState(DozeMachine.State.DOZE_AOD);
        } else if (near && state == DozeMachine.State.DOZE_AOD) {
            if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD");
            mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSED);
        }
    }

    private void onCarMode() {
    private void onCarMode() {
        mMachine.requestState(DozeMachine.State.FINISH);
        mMachine.requestState(DozeMachine.State.FINISH);
    }
    }
@@ -131,15 +148,21 @@ public class DozeTriggers implements DozeMachine.Part {
                break;
                break;
            case DOZE:
            case DOZE:
            case DOZE_AOD:
            case DOZE_AOD:
            case DOZE_AOD_PAUSED:
                mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE);
                mDozeSensors.setListening(true);
                mDozeSensors.setListening(true);
                if (oldState != DozeMachine.State.INITIALIZED) {
                if (oldState != DozeMachine.State.INITIALIZED) {
                    mDozeSensors.reregisterAllSensors();
                    mDozeSensors.reregisterAllSensors();
                }
                }
                break;
                break;
            case DOZE_PULSING:
                mDozeSensors.setProxListening(true);
                break;
            case FINISH:
            case FINISH:
                mBroadcastReceiver.unregister(mContext);
                mBroadcastReceiver.unregister(mContext);
                mDozeHost.removeCallback(mHostCallback);
                mDozeHost.removeCallback(mHostCallback);
                mDozeSensors.setListening(false);
                mDozeSensors.setListening(false);
                mDozeSensors.setProxListening(false);
                break;
                break;
            default:
            default:
        }
        }
@@ -156,6 +179,7 @@ public class DozeTriggers implements DozeMachine.Part {


    private void requestPulse(final int reason, boolean performedProxCheck) {
    private void requestPulse(final int reason, boolean performedProxCheck) {
        Assert.isMainThread();
        Assert.isMainThread();
        mDozeHost.extendPulse();
        if (mPulsePending || !mAllowPulseTriggers || !canPulse()) {
        if (mPulsePending || !mAllowPulseTriggers || !canPulse()) {
            return;
            return;
        }
        }
@@ -286,6 +310,8 @@ public class DozeTriggers implements DozeMachine.Part {
    }
    }


    private class TriggerReceiver extends BroadcastReceiver {
    private class TriggerReceiver extends BroadcastReceiver {
        private boolean mRegistered;

        @Override
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onReceive(Context context, Intent intent) {
            if (PULSE_ACTION.equals(intent.getAction())) {
            if (PULSE_ACTION.equals(intent.getAction())) {
@@ -301,14 +327,22 @@ public class DozeTriggers implements DozeMachine.Part {
        }
        }


        public void register(Context context) {
        public void register(Context context) {
            if (mRegistered) {
                return;
            }
            IntentFilter filter = new IntentFilter(PULSE_ACTION);
            IntentFilter filter = new IntentFilter(PULSE_ACTION);
            filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
            filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
            filter.addAction(Intent.ACTION_USER_SWITCHED);
            filter.addAction(Intent.ACTION_USER_SWITCHED);
            context.registerReceiver(this, filter);
            context.registerReceiver(this, filter);
            mRegistered = true;
        }
        }


        public void unregister(Context context) {
        public void unregister(Context context) {
            if (!mRegistered) {
                return;
            }
            context.unregisterReceiver(this);
            context.unregisterReceiver(this);
            mRegistered = false;
        }
        }
    }
    }


+3 −0
Original line number Original line Diff line number Diff line
@@ -75,11 +75,14 @@ public class DozeUi implements DozeMachine.Part {
                scheduleTimeTick();
                scheduleTimeTick();
                break;
                break;
            case DOZE:
            case DOZE:
            case DOZE_AOD_PAUSED:
                unscheduleTimeTick();
                unscheduleTimeTick();
                break;
                break;
            case DOZE_REQUEST_PULSE:
            case DOZE_REQUEST_PULSE:
                pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */);
                pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */);
                break;
                break;
            case DOZE_PULSE_DONE:
                mHost.abortPulsing();
            case INITIALIZED:
            case INITIALIZED:
                mHost.startDozing();
                mHost.startDozing();
                break;
                break;
Loading