Loading core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +4 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,10 @@ public class AmbientDisplayConfiguration { && wakeScreenGestureAvailable(); } public long getWakeLockScreenDebounce() { return mContext.getResources().getInteger(R.integer.config_dozeWakeLockScreenDebounce); } public String doubleTapSensorType() { return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); } Loading core/res/res/values/config.xml +1 −0 Original line number Diff line number Diff line Loading @@ -2272,6 +2272,7 @@ <!-- If the sensor that wakes up the lock screen is available or not. --> <bool name="config_dozeWakeLockScreenSensorAvailable">false</bool> <integer name="config_dozeWakeLockScreenDebounce">3000</integer> <!-- 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 Loading core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3404,6 +3404,7 @@ <java-symbol type="string" name="config_dozeLongPressSensorType" /> <java-symbol type="bool" name="config_dozeWakeLockScreenSensorAvailable" /> <java-symbol type="integer" name="config_dozeWakeLockScreenDebounce" /> <java-symbol type="array" name="config_allowedGlobalInstantAppSettings" /> <java-symbol type="array" name="config_allowedSystemInstantAppSettings" /> Loading packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +45 −16 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; Loading @@ -60,7 +62,6 @@ public class DozeSensors { private final Context mContext; private final AlarmManager mAlarmManager; private final SensorManager mSensorManager; private final TriggerSensor[] mSensors; private final ContentResolver mResolver; private final TriggerSensor mPickupSensor; private final DozeParameters mDozeParameters; Loading @@ -68,10 +69,12 @@ public class DozeSensors { private final WakeLock mWakeLock; private final Consumer<Boolean> mProxCallback; private final Callback mCallback; @VisibleForTesting protected final TriggerSensor[] mSensors; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; private long mDebounceFrom; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Loading Loading @@ -134,13 +137,21 @@ public class DozeSensors { mConfig.wakeScreenGestureAvailable() && alwaysOn, DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, false /* reports touch coordinates */, false /* touchscreen */), false /* touchscreen */, mConfig.getWakeLockScreenDebounce()), }; mProxSensor = new ProxSensor(policy); mCallback = callback; } /** * Temporarily disable some sensors to avoid turning on the device while the user is * turning it off. */ public void requestTemporaryDisable() { mDebounceFrom = SystemClock.uptimeMillis(); } private Sensor findSensorWithType(String type) { return findSensorWithType(mSensorManager, type); } Loading Loading @@ -320,7 +331,8 @@ public class DozeSensors { } } private class TriggerSensor extends TriggerEventListener { @VisibleForTesting class TriggerSensor extends TriggerEventListener { final Sensor mSensor; final boolean mConfigured; final int mPulseReason; Loading Loading @@ -467,23 +479,25 @@ public class DozeSensors { /** * A Sensor that is injected via plugin. */ private class PluginSensor extends TriggerSensor { @VisibleForTesting class PluginSensor extends TriggerSensor implements SensorManagerPlugin.SensorEventListener { private final SensorManagerPlugin.Sensor mPluginSensor; private final SensorManagerPlugin.SensorEventListener mTriggerEventListener = (event) -> { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1, event.getValues()); })); }; final SensorManagerPlugin.Sensor mPluginSensor; private long mDebounce; PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { this(sensor, setting, configured, pulseReason, reportsTouchCoordinates, requiresTouchscreen, 0L /* debounce */); } PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen, long debounce) { super(null, setting, configured, pulseReason, reportsTouchCoordinates, requiresTouchscreen); mPluginSensor = sensor; mDebounce = debounce; } @Override Loading @@ -492,11 +506,11 @@ public class DozeSensors { AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) && !mRegistered) { asyncSensorManager.registerPluginListener(mPluginSensor, mTriggerEventListener); asyncSensorManager.registerPluginListener(mPluginSensor, this); mRegistered = true; if (DEBUG) Log.d(TAG, "registerPluginListener"); } else if (mRegistered) { asyncSensorManager.unregisterPluginListener(mPluginSensor, mTriggerEventListener); asyncSensorManager.unregisterPluginListener(mPluginSensor, this); mRegistered = false; if (DEBUG) Log.d(TAG, "unregisterPluginListener"); } Loading Loading @@ -524,6 +538,21 @@ public class DozeSensors { } return sb.append(']').toString(); } @Override public void onSensorChanged(SensorManagerPlugin.SensorEvent event) { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { final long now = SystemClock.uptimeMillis(); if (now < mDebounceFrom + mDebounce) { if (DEBUG) Log.d(TAG, "onSensorEvent dropped: " + triggerEventToString(event)); return; } if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1, event.getValues()); })); } } public interface Callback { Loading packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +9 −1 Original line number Diff line number Diff line Loading @@ -143,8 +143,12 @@ public class DozeTriggers implements DozeMachine.Part { if (isWakeDisplay) { onWakeScreen(wakeEvent, mMachine.getState()); } else if (isLongPress || isWakeLockScreen) { } else if (isLongPress) { requestPulse(pulseReason, sensorPerformedProxCheck); } else if (isWakeLockScreen) { if (wakeEvent) { requestPulse(pulseReason, sensorPerformedProxCheck); } } else { proximityCheckThenCall((result) -> { if (result == ProximityCheck.RESULT_NEAR) { Loading Loading @@ -228,6 +232,7 @@ public class DozeTriggers implements DozeMachine.Part { if (mDockManager != null) { mDockManager.addListener(mDockEventListener); } mDozeSensors.requestTemporaryDisable(); checkTriggersAtInit(); break; case DOZE: Loading @@ -250,6 +255,9 @@ public class DozeTriggers implements DozeMachine.Part { mDozeSensors.setTouchscreenSensorsListening(false); mDozeSensors.setProxListening(true); break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); break; case FINISH: mBroadcastReceiver.unregister(mContext); mDozeHost.removeCallback(mHostCallback); Loading Loading
core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +4 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,10 @@ public class AmbientDisplayConfiguration { && wakeScreenGestureAvailable(); } public long getWakeLockScreenDebounce() { return mContext.getResources().getInteger(R.integer.config_dozeWakeLockScreenDebounce); } public String doubleTapSensorType() { return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); } Loading
core/res/res/values/config.xml +1 −0 Original line number Diff line number Diff line Loading @@ -2272,6 +2272,7 @@ <!-- If the sensor that wakes up the lock screen is available or not. --> <bool name="config_dozeWakeLockScreenSensorAvailable">false</bool> <integer name="config_dozeWakeLockScreenDebounce">3000</integer> <!-- 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 Loading
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3404,6 +3404,7 @@ <java-symbol type="string" name="config_dozeLongPressSensorType" /> <java-symbol type="bool" name="config_dozeWakeLockScreenSensorAvailable" /> <java-symbol type="integer" name="config_dozeWakeLockScreenDebounce" /> <java-symbol type="array" name="config_allowedGlobalInstantAppSettings" /> <java-symbol type="array" name="config_allowedSystemInstantAppSettings" /> Loading
packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +45 −16 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; Loading @@ -60,7 +62,6 @@ public class DozeSensors { private final Context mContext; private final AlarmManager mAlarmManager; private final SensorManager mSensorManager; private final TriggerSensor[] mSensors; private final ContentResolver mResolver; private final TriggerSensor mPickupSensor; private final DozeParameters mDozeParameters; Loading @@ -68,10 +69,12 @@ public class DozeSensors { private final WakeLock mWakeLock; private final Consumer<Boolean> mProxCallback; private final Callback mCallback; @VisibleForTesting protected final TriggerSensor[] mSensors; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; private long mDebounceFrom; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Loading Loading @@ -134,13 +137,21 @@ public class DozeSensors { mConfig.wakeScreenGestureAvailable() && alwaysOn, DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, false /* reports touch coordinates */, false /* touchscreen */), false /* touchscreen */, mConfig.getWakeLockScreenDebounce()), }; mProxSensor = new ProxSensor(policy); mCallback = callback; } /** * Temporarily disable some sensors to avoid turning on the device while the user is * turning it off. */ public void requestTemporaryDisable() { mDebounceFrom = SystemClock.uptimeMillis(); } private Sensor findSensorWithType(String type) { return findSensorWithType(mSensorManager, type); } Loading Loading @@ -320,7 +331,8 @@ public class DozeSensors { } } private class TriggerSensor extends TriggerEventListener { @VisibleForTesting class TriggerSensor extends TriggerEventListener { final Sensor mSensor; final boolean mConfigured; final int mPulseReason; Loading Loading @@ -467,23 +479,25 @@ public class DozeSensors { /** * A Sensor that is injected via plugin. */ private class PluginSensor extends TriggerSensor { @VisibleForTesting class PluginSensor extends TriggerSensor implements SensorManagerPlugin.SensorEventListener { private final SensorManagerPlugin.Sensor mPluginSensor; private final SensorManagerPlugin.SensorEventListener mTriggerEventListener = (event) -> { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1, event.getValues()); })); }; final SensorManagerPlugin.Sensor mPluginSensor; private long mDebounce; PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { this(sensor, setting, configured, pulseReason, reportsTouchCoordinates, requiresTouchscreen, 0L /* debounce */); } PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen, long debounce) { super(null, setting, configured, pulseReason, reportsTouchCoordinates, requiresTouchscreen); mPluginSensor = sensor; mDebounce = debounce; } @Override Loading @@ -492,11 +506,11 @@ public class DozeSensors { AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) && !mRegistered) { asyncSensorManager.registerPluginListener(mPluginSensor, mTriggerEventListener); asyncSensorManager.registerPluginListener(mPluginSensor, this); mRegistered = true; if (DEBUG) Log.d(TAG, "registerPluginListener"); } else if (mRegistered) { asyncSensorManager.unregisterPluginListener(mPluginSensor, mTriggerEventListener); asyncSensorManager.unregisterPluginListener(mPluginSensor, this); mRegistered = false; if (DEBUG) Log.d(TAG, "unregisterPluginListener"); } Loading Loading @@ -524,6 +538,21 @@ public class DozeSensors { } return sb.append(']').toString(); } @Override public void onSensorChanged(SensorManagerPlugin.SensorEvent event) { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { final long now = SystemClock.uptimeMillis(); if (now < mDebounceFrom + mDebounce) { if (DEBUG) Log.d(TAG, "onSensorEvent dropped: " + triggerEventToString(event)); return; } if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1, event.getValues()); })); } } public interface Callback { Loading
packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +9 −1 Original line number Diff line number Diff line Loading @@ -143,8 +143,12 @@ public class DozeTriggers implements DozeMachine.Part { if (isWakeDisplay) { onWakeScreen(wakeEvent, mMachine.getState()); } else if (isLongPress || isWakeLockScreen) { } else if (isLongPress) { requestPulse(pulseReason, sensorPerformedProxCheck); } else if (isWakeLockScreen) { if (wakeEvent) { requestPulse(pulseReason, sensorPerformedProxCheck); } } else { proximityCheckThenCall((result) -> { if (result == ProximityCheck.RESULT_NEAR) { Loading Loading @@ -228,6 +232,7 @@ public class DozeTriggers implements DozeMachine.Part { if (mDockManager != null) { mDockManager.addListener(mDockEventListener); } mDozeSensors.requestTemporaryDisable(); checkTriggersAtInit(); break; case DOZE: Loading @@ -250,6 +255,9 @@ public class DozeTriggers implements DozeMachine.Part { mDozeSensors.setTouchscreenSensorsListening(false); mDozeSensors.setProxListening(true); break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); break; case FINISH: mBroadcastReceiver.unregister(mContext); mDozeHost.removeCallback(mHostCallback); Loading