From 3d95175dd5b72a1458a9aec96e7791727f1e460d Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 10 Oct 2018 12:00:40 -0700 Subject: [PATCH] Hook up wake-lock-screen with plugin structure Wake-lock-screen gesture now receives signals from the pluggable sensor pipeline. Bug: 111414690 Test: manual Change-Id: I9433d7310fcb9dd9b08a4fedf7d2a8e8779fe386 --- .../hardware/AmbientDisplayConfiguration.java | 7 +-- core/res/res/values/config.xml | 4 +- core/res/res/values/symbols.xml | 2 +- .../systemui/plugins/SensorManagerPlugin.java | 9 +++- .../android/systemui/doze/DozeSensors.java | 53 +++++++++++++++++-- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java index 0080ace230a27..d4c451e3ffffd 100644 --- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -72,7 +72,8 @@ public class AmbientDisplayConfiguration { } public boolean wakeLockScreenGestureAvailable() { - return !TextUtils.isEmpty(wakeLockScreenSensorType()); + return mContext.getResources() + .getBoolean(R.bool.config_dozeWakeLockScreenSensorAvailable); } public boolean wakeScreenGestureEnabled(int user) { @@ -92,10 +93,6 @@ public class AmbientDisplayConfiguration { return mContext.getResources().getString(R.string.config_dozeLongPressSensorType); } - public String wakeLockScreenSensorType() { - return mContext.getResources().getString(R.string.config_dozeWakeLockScreenSensorType); - } - public String wakeScreenSensorType() { return mContext.getResources().getString(R.string.config_dozeWakeScreenSensorType); } diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8b73b67684790..aeeba59b694b1 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2113,8 +2113,8 @@ - - + + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7e7c7b252e21d..6f28b2c36e16c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3280,7 +3280,7 @@ - + diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java index d1181445be439..839b90bf6c5e1 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java @@ -16,6 +16,9 @@ package com.android.systemui.plugins; +import android.hardware.Sensor; +import android.hardware.TriggerEventListener; + import com.android.systemui.plugins.annotations.ProvidesInterface; /** @@ -28,10 +31,12 @@ public interface SensorManagerPlugin extends Plugin { int VERSION = 1; /** - * Registers for trigger events from the sensor. The client will receive trigger events until - * {@link #unregisterTriggerEvent(Sensor, TriggerEventListener)} is called. + * Registers for trigger events from the sensor. Trigger events are one-shot and need to + * re-registered in order for them to be fired again. * @param sensor * @param listener + * @see android.hardware.SensorManager#requestTriggerSensor( + * android.hardware.TriggerEventListener, android.hardware.Sensor) */ void registerTriggerEvent(Sensor sensor, TriggerEventListener listener); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 701394763fbd3..43dd412f70941 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -16,6 +16,8 @@ package com.android.systemui.doze; +import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN; + import android.annotation.AnyThread; import android.app.ActivityManager; import android.app.AlarmManager; @@ -39,8 +41,10 @@ import android.util.Log; import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AlarmTimeout; +import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.wakelock.WakeLock; import java.io.PrintWriter; @@ -112,8 +116,8 @@ public class DozeSensors { DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, true /* reports touch coordinates */, true /* touchscreen */), - new TriggerSensor( - findSensorWithType(config.wakeLockScreenSensorType()), + new PluginTriggerSensor( + new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN), Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, true /* configured */, DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, @@ -375,7 +379,7 @@ public class DozeSensors { mHandler.post(mWakeLock.wrap(() -> { if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event)); boolean sensorPerformsProxCheck = false; - if (mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) { + if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) { int subType = (int) event.values[0]; MetricsLogger.action( mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE, @@ -418,6 +422,49 @@ public class DozeSensors { } } + /** + * A Sensor that is injected via plugin, for better ContextHub interface. + */ + private class PluginTriggerSensor extends TriggerSensor { + + private final SensorManagerPlugin.Sensor mPluginSensor; + private final SensorManagerPlugin.TriggerEventListener mTriggerEventListener = (event) -> { + onTrigger(null); + }; + + PluginTriggerSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured, + int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { + super(null, setting, configured, pulseReason, reportsTouchCoordinates, + requiresTouchscreen); + mPluginSensor = sensor; + } + + @Override + public void updateListener() { + if (!mConfigured) return; + AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager; + if (mRequested && !mDisabled && enabledBySetting() && !mRegistered) { + asyncSensorManager.requestPluginTriggerSensor(mPluginSensor, mTriggerEventListener); + mRegistered = true; + if (DEBUG) Log.d(TAG, "requestPluginTriggerSensor"); + } else if (mRegistered) { + asyncSensorManager.cancelPluginTriggerSensor(mPluginSensor, mTriggerEventListener); + mRegistered = false; + if (DEBUG) Log.d(TAG, "cancelPluginTriggerSensor"); + } + } + + @Override + public String toString() { + return new StringBuilder("{mRegistered=").append(mRegistered) + .append(", mRequested=").append(mRequested) + .append(", mDisabled=").append(mDisabled) + .append(", mConfigured=").append(mConfigured) + .append(", mSensor=").append(mPluginSensor).append("}").toString(); + } + + } + private class WakeScreenSensor extends TriggerSensor { WakeScreenSensor() {