diff options
| author | 2018-09-06 07:23:23 +0000 | |
|---|---|---|
| committer | 2018-09-06 07:23:23 +0000 | |
| commit | ec3471c182b8738c4627678ce70f9ccde06cef0e (patch) | |
| tree | 15313c1b3c344215ffb8df3e872aece9d894329e | |
| parent | 029f67f85238ba2d4a2443c5659f30f21462d672 (diff) | |
| parent | 323f9ffcb4b031e87293c3d1ab3d76c5fe88802a (diff) | |
Merge "Wake-screen gesture implementation"
9 files changed, 104 insertions, 24 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 71938d219ccc..942a700c5091 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7256,6 +7256,14 @@ public final class Settings { private static final Validator DOZE_REACH_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** + * Gesture that wakes up the display, showing the ambient version of the status bar. + * @hide + */ + public static final String DOZE_WAKE_SCREEN_GESTURE = "doze_wake_screen_gesture"; + + private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + + /** * The current night mode that has been selected by the user. Owned * and controlled by UiModeManagerService. Constants are as per * UiModeManager. @@ -8158,6 +8166,7 @@ public final class Settings { DOZE_PICK_UP_GESTURE, DOZE_DOUBLE_TAP_GESTURE, DOZE_REACH_GESTURE, + DOZE_WAKE_SCREEN_GESTURE, NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, @@ -8302,6 +8311,7 @@ public final class Settings { VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_REACH_GESTURE, DOZE_REACH_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR); VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR); VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java index 87283675d4b2..cb282b69845c 100644 --- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -75,6 +75,15 @@ public class AmbientDisplayConfiguration { return !TextUtils.isEmpty(reachSensorType()); } + public boolean wakeScreenGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, user) + && wakeScreenGestureAvailable(); + } + + public boolean wakeScreenGestureAvailable() { + return !TextUtils.isEmpty(wakeScreenSensorType()); + } + public String doubleTapSensorType() { return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); } @@ -87,6 +96,10 @@ public class AmbientDisplayConfiguration { return mContext.getResources().getString(R.string.config_dozeReachSensorType); } + public String wakeScreenSensorType() { + return mContext.getResources().getString(R.string.config_dozeWakeScreenSensorType); + } + public boolean pulseOnLongPressEnabled(int user) { return pulseOnLongPressAvailable() && boolSettingDefaultOff( Settings.Secure.DOZE_PULSE_ON_LONG_PRESS, user); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index db7d710d53e4..235f85b2c318 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2116,6 +2116,9 @@ <!-- Type of the reach sensor. Empty if reach is not supported. --> <string name="config_dozeReachSensorType" translatable="false"></string> + <!-- Type of the wake up sensor. Empty if not supported. --> + <string name="config_dozeWakeScreenSensorType" translatable="false"></string> + <!-- Control whether the always on display mode is available. This should only be enabled on devices where the display has been tuned to be power efficient in DOZE and/or DOZE_SUSPEND states. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 48c263e8caef..92cca72e055a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3462,4 +3462,5 @@ <java-symbol type="integer" name="db_wal_truncate_size" /> <java-symbol type="integer" name="config_wakeUpDelayDoze" /> + <java-symbol type="string" name="config_dozeWakeScreenSensorType" /> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 51cc4a11a8d0..ab30f2ed4483 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -35,7 +35,7 @@ public class DozeLog { private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50; static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); - private static final int PULSE_REASONS = 7; + private static final int REASONS = 8; public static final int PULSE_REASON_NONE = -1; public static final int PULSE_REASON_INTENT = 0; @@ -45,6 +45,7 @@ public class DozeLog { public static final int PULSE_REASON_SENSOR_DOUBLE_TAP = 4; public static final int PULSE_REASON_SENSOR_LONG_PRESS = 5; public static final int PULSE_REASON_SENSOR_REACH = 6; + public static final int REASON_SENSOR_WAKE_UP = 7; private static boolean sRegisterKeyguardCallback = true; @@ -74,7 +75,7 @@ public class DozeLog { public static void tracePulseStart(int reason) { if (!ENABLED) return; sPulsing = true; - log("pulseStart reason=" + pulseReasonToString(reason)); + log("pulseStart reason=" + reasonToString(reason)); } public static void tracePulseFinish() { @@ -102,8 +103,8 @@ public class DozeLog { sScreenOnPulsingStats = new SummaryStats(); sScreenOnNotPulsingStats = new SummaryStats(); sEmergencyCallStats = new SummaryStats(); - sProxStats = new SummaryStats[PULSE_REASONS][2]; - for (int i = 0; i < PULSE_REASONS; i++) { + sProxStats = new SummaryStats[REASONS][2]; + for (int i = 0; i < REASONS; i++) { sProxStats[i][0] = new SummaryStats(); sProxStats[i][1] = new SummaryStats(); } @@ -176,15 +177,15 @@ public class DozeLog { } public static void traceProximityResult(Context context, boolean near, long millis, - int pulseReason) { + int reason) { if (!ENABLED) return; init(context); - log("proximityResult reason=" + pulseReasonToString(pulseReason) + " near=" + near + log("proximityResult reason=" + reasonToString(reason) + " near=" + near + " millis=" + millis); - sProxStats[pulseReason][near ? 0 : 1].append(); + sProxStats[reason][near ? 0 : 1].append(); } - public static String pulseReasonToString(int pulseReason) { + public static String reasonToString(int pulseReason) { switch (pulseReason) { case PULSE_REASON_INTENT: return "intent"; case PULSE_REASON_NOTIFICATION: return "notification"; @@ -193,6 +194,7 @@ public class DozeLog { case PULSE_REASON_SENSOR_DOUBLE_TAP: return "doubletap"; case PULSE_REASON_SENSOR_LONG_PRESS: return "longpress"; case PULSE_REASON_SENSOR_REACH: return "reach"; + case REASON_SENSOR_WAKE_UP: return "wakeup"; default: throw new IllegalArgumentException("bad reason: " + pulseReason); } } @@ -218,8 +220,8 @@ public class DozeLog { sScreenOnPulsingStats.dump(pw, "Screen on (pulsing)"); sScreenOnNotPulsingStats.dump(pw, "Screen on (not pulsing)"); sEmergencyCallStats.dump(pw, "Emergency call"); - for (int i = 0; i < PULSE_REASONS; i++) { - final String reason = pulseReasonToString(i); + for (int i = 0; i < REASONS; i++) { + final String reason = reasonToString(i); sProxStats[i][0].dump(pw, "Proximity near (" + reason + ")"); sProxStats[i][1].dump(pw, "Proximity far (" + reason + ")"); } @@ -262,10 +264,10 @@ public class DozeLog { } } - public static void traceSensor(Context context, int pulseReason) { + public static void traceSensor(Context context, int reason) { if (!ENABLED) return; init(context); - log("sensor type=" + pulseReasonToString(pulseReason)); + log("sensor type=" + reasonToString(reason)); } private static class SummaryStats { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 045a98c51a77..f9dfb5d10403 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -63,6 +63,7 @@ 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(); @@ -70,9 +71,9 @@ public class DozeSensors { public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, - DozeParameters dozeParameters, - AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, - Consumer<Boolean> proxCallback, AlwaysOnDisplayPolicy policy) { + DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, + Callback callback, Consumer<Boolean> proxCallback, + Consumer<Boolean> wakeScreenCallback, AlwaysOnDisplayPolicy policy) { mContext = context; mAlarmManager = alarmManager; mSensorManager = sensorManager; @@ -80,6 +81,7 @@ public class DozeSensors { mConfig = config; mWakeLock = wakeLock; mProxCallback = proxCallback; + mWakeScreenCallback = wakeScreenCallback; mResolver = mContext.getContentResolver(); mSensors = new TriggerSensor[] { @@ -117,6 +119,7 @@ public class DozeSensors { DozeLog.PULSE_REASON_SENSOR_REACH, false /* reports touch coordinates */, false /* touchscreen */), + new WakeScreenSensor(), }; mProxSensor = new ProxSensor(policy); @@ -302,9 +305,9 @@ public class DozeSensors { final boolean mSettingDefault; final boolean mRequiresTouchscreen; - private boolean mRequested; - private boolean mRegistered; - private boolean mDisabled; + protected boolean mRequested; + protected boolean mRegistered; + protected boolean mDisabled; public TriggerSensor(Sensor sensor, String setting, boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { @@ -348,7 +351,7 @@ public class DozeSensors { } } - private boolean enabledBySetting() { + protected boolean enabledBySetting() { if (TextUtils.isEmpty(mSetting)) { return true; } @@ -401,7 +404,7 @@ public class DozeSensors { } } - private String triggerEventToString(TriggerEvent event) { + protected String triggerEventToString(TriggerEvent event) { if (event == null) return null; final StringBuilder sb = new StringBuilder("TriggerEvent[") .append(event.timestamp).append(',') @@ -415,6 +418,28 @@ public class DozeSensors { } } + 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 + })); + } + } + public interface Callback { /** diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 73cbd7d96d28..1589969d19c1 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -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, + config, wakeLock, this::onSensor, this::onProximityFar, this::onWakeScreen, dozeParameters.getPolicy()); mUiModeManager = mContext.getSystemService(UiModeManager.class); } @@ -103,7 +103,7 @@ public class DozeTriggers implements DozeMachine.Part { private void proximityCheckThenCall(IntConsumer callback, boolean alreadyPerformedProxCheck, - int pulseReason) { + int reason) { Boolean cachedProxFar = mDozeSensors.isProximityCurrentlyFar(); if (alreadyPerformedProxCheck) { callback.accept(ProximityCheck.RESULT_NOT_CHECKED); @@ -116,7 +116,7 @@ public class DozeTriggers implements DozeMachine.Part { public void onProximityResult(int result) { final long end = SystemClock.uptimeMillis(); DozeLog.traceProximityResult(mContext, result == RESULT_NEAR, - end - start, pulseReason); + end - start, reason); callback.accept(result); } }.check(); @@ -182,6 +182,28 @@ public class DozeTriggers implements DozeMachine.Part { } } + private void onWakeScreen(boolean wake) { + DozeMachine.State state = mMachine.getState(); + boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED); + boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING); + + if (wake) { + proximityCheckThenCall((result) -> { + if (result == ProximityCheck.RESULT_NEAR) { + // In pocket, drop event. + return; + } + if (pausing || paused) { + mMachine.requestState(DozeMachine.State.DOZE_AOD); + } + }, false /* alreadyPerformedProxCheck */, DozeLog.REASON_SENSOR_WAKE_UP); + } else { + if (!pausing && !paused) { + mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSING); + } + } + } + @Override public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index afd64f373c58..0d3ba77d5079 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -45,7 +45,7 @@ public class DozeScrimController { public void onDisplayBlanked() { if (DEBUG) { Log.d(TAG, "Pulse in, mDozing=" + mDozing + " mPulseReason=" - + DozeLog.pulseReasonToString(mPulseReason)); + + DozeLog.reasonToString(mPulseReason)); } if (!mDozing) { return; diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index b66862355460..7edcdcbb5623 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -6508,6 +6508,10 @@ message MetricsEvent { // OS: Q ACTION_EMERGENCY_DIALER_FROM_POWER_MENU = 1569; + // OPEN: Settings > System > Input & Gesture > Wake screen + // OS: Q + SETTINGS_GESTURE_WAKE_SCREEN = 1570; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. |