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

Commit d3051090 authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Wake-up sensors integration"

parents 2bad68cd b2d9f48f
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -52,7 +52,9 @@ public interface SensorManagerPlugin extends Plugin {
    }

    class Sensor {
        public static int TYPE_WAKE_LOCK_SCREEN = 1;
        public static final int TYPE_WAKE_LOCK_SCREEN = 1;
        public static final int TYPE_WAKE_DISPLAY = 2;
        public static final int TYPE_SWIPE = 3;

        int mType;

@@ -68,6 +70,7 @@ public interface SensorManagerPlugin extends Plugin {
    class TriggerEvent {
        Sensor mSensor;
        int mVendorType;
        float[] mValues;

        /**
         * Creates a trigger event
@@ -76,14 +79,30 @@ public interface SensorManagerPlugin extends Plugin {
         *                   e.g. SINGLE_TAP = 1, DOUBLE_TAP = 2, etc.
         */
        public TriggerEvent(Sensor sensor, int vendorType) {
            this(sensor, vendorType, null);
        }

        /**
         * Creates a trigger event
         * @param sensor The type of sensor, e.g. TYPE_WAKE_LOCK_SCREEN
         * @param vendorType The vendor type, which should be unique for each type of sensor,
         *                   e.g. SINGLE_TAP = 1, DOUBLE_TAP = 2, etc.
         * @param values Values captured by the sensor.
         */
        public TriggerEvent(Sensor sensor, int vendorType, float[] values) {
            mSensor = sensor;
            mVendorType = vendorType;
            mValues = values;
        }

        public Sensor getSensor() {
            return mSensor;
        }

        public float[] getValues() {
            return mValues;
        }

        public int getVendorType() {
            return mVendorType;
        }
+15 −2
Original line number Diff line number Diff line
@@ -177,9 +177,22 @@ public class DozeLog {
        log("state " + state);
    }

    public static void traceWakeLockScreenWakeUp() {
    /**
     * Appends lock screen wake up event to the logs.
     * @param wake if we're waking up or sleeping.
     */
    public static void traceLockScreenWakeUp(boolean wake) {
        if (!ENABLED) return;
        log("wakeLockScreenWakeUp " + wake);
    }

    /**
     * Appends wake-display event to the logs.
     * @param wake if we're waking up or sleeping.
     */
    public static void traceWakeDisplay(boolean wake) {
        if (!ENABLED) return;
        log("wakeLockScreenWakeUp");
        log("wakeLockScreenWakeUp " + wake);
    }

    public static void traceProximityResult(Context context, boolean near, long millis,
+33 −30
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.doze;

import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_DISPLAY;
import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;

import android.annotation.AnyThread;
@@ -67,7 +68,6 @@ public class DozeSensors {
    private final AmbientDisplayConfiguration mConfig;
    private final WakeLock mWakeLock;
    private final Consumer<Boolean> mProxCallback;
    private final Consumer<Boolean> mWakeScreenCallback;
    private final Callback mCallback;

    private final Handler mHandler = new Handler();
@@ -76,8 +76,7 @@ public class DozeSensors {

    public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager,
            DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
            Callback callback, Consumer<Boolean> proxCallback,
            Consumer<Boolean> wakeScreenCallback, AlwaysOnDisplayPolicy policy) {
            Callback callback, Consumer<Boolean> proxCallback, AlwaysOnDisplayPolicy policy) {
        mContext = context;
        mAlarmManager = alarmManager;
        mSensorManager = sensorManager;
@@ -85,7 +84,6 @@ public class DozeSensors {
        mConfig = config;
        mWakeLock = wakeLock;
        mProxCallback = proxCallback;
        mWakeScreenCallback = wakeScreenCallback;
        mResolver = mContext.getContentResolver();

        mSensors = new TriggerSensor[] {
@@ -123,7 +121,13 @@ public class DozeSensors {
                        DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN,
                        false /* reports touch coordinates */,
                        false /* touchscreen */),
                new WakeScreenSensor(),
                new PluginTriggerSensor(
                        new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY),
                        Settings.Secure.DOZE_WAKE_SCREEN_GESTURE,
                        true /* configured */,
                        DozeLog.REASON_SENSOR_WAKE_UP,
                        false /* reports touch coordinates */,
                        false /* touchscreen */),
        };

        mProxSensor = new ProxSensor(policy);
@@ -395,7 +399,8 @@ public class DozeSensors {
                    screenX = event.values[0];
                    screenY = event.values[1];
                }
                mCallback.onSensorPulse(mPulseReason, sensorPerformsProxCheck, screenX, screenY);
                mCallback.onSensorPulse(mPulseReason, sensorPerformsProxCheck, screenX, screenY,
                        event.values);
                updateListener();  // reregister, this sensor only fires once
            }));
        }
@@ -429,7 +434,14 @@ public class DozeSensors {

        private final SensorManagerPlugin.Sensor mPluginSensor;
        private final SensorManagerPlugin.TriggerEventListener mTriggerEventListener = (event) -> {
            onTrigger(null);
            DozeLog.traceSensor(mContext, mPulseReason);
            mHandler.post(mWakeLock.wrap(() -> {
                if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event));
                mRegistered = false;
                mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1,
                        event.getValues());
                updateListener();  // reregister, this sensor only fires once
            }));
        };

        PluginTriggerSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured,
@@ -463,28 +475,19 @@ public class DozeSensors {
                    .append(", mSensor=").append(mPluginSensor).append("}").toString();
        }

        private String triggerEventToString(SensorManagerPlugin.TriggerEvent event) {
            if (event == null) return null;
            final StringBuilder sb = new StringBuilder("PluginTriggerEvent[")
                    .append(event.getSensor()).append(',')
                    .append(event.getVendorType());
            if (event.getValues() != null) {
                for (int i = 0; i < event.getValues().length; i++) {
                    sb.append(',').append(event.getValues()[i]);
                }

    private class WakeScreenSensor extends TriggerSensor {

        WakeScreenSensor() {
            super(findSensorWithType(mConfig.wakeScreenSensorType()),
                    Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, true /* configured */,
                    DozeLog.REASON_SENSOR_WAKE_UP, false /* reportsTouchCoordinates */,
                    false /* requiresTouchscreen */);
            }

        @Override
        @AnyThread
        public void onTrigger(TriggerEvent event) {
            DozeLog.traceSensor(mContext, mPulseReason);
            mHandler.post(mWakeLock.wrap(() -> {
                if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event));
                mRegistered = false;
                mWakeScreenCallback.accept(event.values[0] > 0);
                updateListener();  // reregister, this sensor only fires once
            }));
            return sb.append(']').toString();
        }

    }

    public interface Callback {
@@ -496,9 +499,9 @@ public class DozeSensors {
         * @param screenX the location on the screen where the sensor fired or -1
 *                if the sensor doesn't support reporting screen locations.
         * @param screenY the location on the screen where the sensor fired or -1
         *                if the sensor doesn't support reporting screen locations.
         * @param rawValues raw values array from the event.
         */
        void onSensorPulse(int pulseReason, boolean sensorPerformedProxCheck,
                float screenX, float screenY);
                float screenX, float screenY, float[] rawValues);
    }
}
+17 −6
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public class DozeTriggers implements DozeMachine.Part {
        mWakeLock = wakeLock;
        mAllowPulseTriggers = allowPulseTriggers;
        mDozeSensors = new DozeSensors(context, alarmManager, mSensorManager, dozeParameters,
                config, wakeLock, this::onSensor, this::onProximityFar, this::onWakeScreen,
                config, wakeLock, this::onSensor, this::onProximityFar,
                dozeParameters.getPolicy());
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
    }
@@ -124,13 +124,17 @@ public class DozeTriggers implements DozeMachine.Part {
    }

    private void onSensor(int pulseReason, boolean sensorPerformedProxCheck,
            float screenX, float screenY) {
            float screenX, float screenY, float[] rawValues) {
        boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP;
        boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
        boolean isLongPress = pulseReason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS;
        boolean isWakeLockScreen = pulseReason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN;
        boolean isWakeDisplay = pulseReason == DozeLog.REASON_SENSOR_WAKE_UP;
        boolean wakeEvent = rawValues != null && rawValues.length > 0 && rawValues[0] != 0;

        if (isLongPress) {
        if (isWakeDisplay) {
            onWakeScreen(wakeEvent);
        } else if (isLongPress) {
            requestPulse(pulseReason, sensorPerformedProxCheck);
        } else {
            proximityCheckThenCall((result) -> {
@@ -141,7 +145,15 @@ public class DozeTriggers implements DozeMachine.Part {
                if (isDoubleTap) {
                    mDozeHost.onDoubleTap(screenX, screenY);
                    mMachine.wakeUp();
                } else if (isPickup || isWakeLockScreen) {
                } else if (isWakeLockScreen) {
                    if (wakeEvent) {
                        mDozeHost.setPassiveInterrupt(true);
                        mMachine.wakeUp();
                        DozeLog.traceLockScreenWakeUp(wakeEvent);
                    } else {
                        if (DEBUG) Log.d(TAG, "Unpulsing");
                    }
                } else if (isPickup) {
                    mDozeHost.setPassiveInterrupt(true);
                    mMachine.wakeUp();
                } else {
@@ -157,8 +169,6 @@ public class DozeTriggers implements DozeMachine.Part {
            final boolean withinVibrationThreshold =
                    timeSinceNotification < mDozeParameters.getPickupVibrationThreshold();
            DozeLog.tracePickupWakeUp(mContext, withinVibrationThreshold);
        } else if (isWakeLockScreen) {
            DozeLog.traceWakeLockScreenWakeUp();
        }
    }

@@ -184,6 +194,7 @@ public class DozeTriggers implements DozeMachine.Part {
    }

    private void onWakeScreen(boolean wake) {
        DozeLog.traceWakeDisplay(wake);
        DozeMachine.State state = mMachine.getState();
        boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED);
        boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING);