blob: 05a234f1e43158d124b26adad3ac96add0e709bc [file] [log] [blame]
Adrian Roosea8d6ae2016-10-26 10:40:12 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
Adrian Roosff2c4562016-11-03 12:13:36 -070014 * limitations under the License.
Adrian Roosea8d6ae2016-10-26 10:40:12 -070015 */
16
17package com.android.systemui.doze;
18
Lucas Dupinb2d9f482018-11-16 18:55:13 -080019import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_DISPLAY;
Lucas Dupinde64ee02018-12-21 14:45:12 -080020import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;
Lucas Dupin3d951752018-10-10 12:00:40 -070021
Adrian Roosea8d6ae2016-10-26 10:40:12 -070022import android.annotation.AnyThread;
23import android.app.ActivityManager;
Adrian Roos6023ccb2017-06-28 16:22:02 +020024import android.app.AlarmManager;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070025import android.content.ContentResolver;
26import android.content.Context;
27import android.database.ContentObserver;
28import android.hardware.Sensor;
29import android.hardware.SensorManager;
30import android.hardware.TriggerEvent;
31import android.hardware.TriggerEventListener;
Issei Suzukica19e6e2019-02-26 12:39:11 +010032import android.hardware.display.AmbientDisplayConfiguration;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070033import android.net.Uri;
34import android.os.Handler;
Adrian Roos6023ccb2017-06-28 16:22:02 +020035import android.os.SystemClock;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070036import android.os.UserHandle;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070037import android.provider.Settings;
38import android.text.TextUtils;
39import android.util.Log;
40
Lucas Dupin8a13aa72019-02-22 12:45:21 -080041import androidx.annotation.VisibleForTesting;
42
Adrian Roosff2c4562016-11-03 12:13:36 -070043import com.android.internal.logging.MetricsLogger;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010044import com.android.internal.logging.nano.MetricsProto;
Lucas Dupin3d951752018-10-10 12:00:40 -070045import com.android.systemui.plugins.SensorManagerPlugin;
Adrian Roosff2c4562016-11-03 12:13:36 -070046import com.android.systemui.statusbar.phone.DozeParameters;
Dave Mankoff63a12822019-09-16 14:38:06 -040047import com.android.systemui.util.sensors.AsyncSensorManager;
48import com.android.systemui.util.sensors.ProximitySensor;
Adrian Roosc1b50322017-02-27 21:07:58 +010049import com.android.systemui.util.wakelock.WakeLock;
Adrian Roosff2c4562016-11-03 12:13:36 -070050
51import java.io.PrintWriter;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070052import java.util.List;
Adrian Roos67cca742017-04-13 16:52:51 -070053import java.util.function.Consumer;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070054
55public class DozeSensors {
56
57 private static final boolean DEBUG = DozeService.DEBUG;
58
59 private static final String TAG = "DozeSensors";
60
61 private final Context mContext;
Adrian Roos6023ccb2017-06-28 16:22:02 +020062 private final AlarmManager mAlarmManager;
Dave Mankoff63a12822019-09-16 14:38:06 -040063 private final AsyncSensorManager mSensorManager;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070064 private final ContentResolver mResolver;
65 private final TriggerSensor mPickupSensor;
66 private final DozeParameters mDozeParameters;
67 private final AmbientDisplayConfiguration mConfig;
Adrian Roosc1b50322017-02-27 21:07:58 +010068 private final WakeLock mWakeLock;
Adrian Roos67cca742017-04-13 16:52:51 -070069 private final Consumer<Boolean> mProxCallback;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070070 private final Callback mCallback;
Lucas Dupin8a13aa72019-02-22 12:45:21 -080071 @VisibleForTesting
lpeteraca97632019-06-11 11:13:54 +080072 protected TriggerSensor[] mSensors;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070073
74 private final Handler mHandler = new Handler();
Dave Mankoff63a12822019-09-16 14:38:06 -040075 private final ProximitySensor mProximitySensor;
Lucas Dupin8a13aa72019-02-22 12:45:21 -080076 private long mDebounceFrom;
lpeteraca97632019-06-11 11:13:54 +080077 private boolean mSettingRegistered;
Lucas Dupinfac2e8e2019-06-27 16:10:19 -070078 private boolean mListening;
79 private boolean mPaused;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070080
Dave Mankoff63a12822019-09-16 14:38:06 -040081 public DozeSensors(Context context, AlarmManager alarmManager, AsyncSensorManager sensorManager,
Lucas Dupin323f9ff2018-08-27 16:55:56 -070082 DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
Beverlycc4a62f2019-09-26 14:55:28 -040083 Callback callback, Consumer<Boolean> proxCallback, AlwaysOnDisplayPolicy policy,
84 DozeLog dozeLog) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -070085 mContext = context;
Adrian Roos6023ccb2017-06-28 16:22:02 +020086 mAlarmManager = alarmManager;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070087 mSensorManager = sensorManager;
88 mDozeParameters = dozeParameters;
89 mConfig = config;
90 mWakeLock = wakeLock;
Adrian Roos67cca742017-04-13 16:52:51 -070091 mProxCallback = proxCallback;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070092 mResolver = mContext.getContentResolver();
Dave Mankoff63a12822019-09-16 14:38:06 -040093 mCallback = callback;
Adrian Roosea8d6ae2016-10-26 10:40:12 -070094
Lucas Dupin70bda672018-12-27 15:43:40 -080095 boolean alwaysOn = mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT);
Adrian Roosea8d6ae2016-10-26 10:40:12 -070096 mSensors = new TriggerSensor[] {
97 new TriggerSensor(
98 mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION),
99 null /* setting */,
100 dozeParameters.getPulseOnSigMotion(),
Beverlycc4a62f2019-09-26 14:55:28 -0400101 DozeEvent.PULSE_REASON_SENSOR_SIGMOTION, false /* touchCoords */,
102 false /* touchscreen */, dozeLog),
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700103 mPickupSensor = new TriggerSensor(
104 mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
Lucas Dupin4359b552018-08-09 15:07:54 -0700105 Settings.Secure.DOZE_PICK_UP_GESTURE,
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700106 true /* settingDef */,
Lucas Dupin4359b552018-08-09 15:07:54 -0700107 config.dozePickupSensorAvailable(),
Beverlycc4a62f2019-09-26 14:55:28 -0400108 DozeEvent.REASON_SENSOR_PICKUP, false /* touchCoords */,
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700109 false /* touchscreen */,
Beverlycc4a62f2019-09-26 14:55:28 -0400110 false /* ignoresSetting */,
111 dozeLog),
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700112 new TriggerSensor(
113 findSensorWithType(config.doubleTapSensorType()),
Lucas Dupin4359b552018-08-09 15:07:54 -0700114 Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700115 true /* configured */,
Beverlycc4a62f2019-09-26 14:55:28 -0400116 DozeEvent.REASON_SENSOR_DOUBLE_TAP,
Adrian Roos98d31982017-08-02 20:50:16 +0200117 dozeParameters.doubleTapReportsTouchCoordinates(),
Beverlycc4a62f2019-09-26 14:55:28 -0400118 true /* touchscreen */,
119 dozeLog),
Adrian Roosd0963a02017-05-15 14:33:37 -0700120 new TriggerSensor(
Lucas Dupind43bf702019-01-15 13:40:42 -0800121 findSensorWithType(config.tapSensorType()),
122 Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
123 true /* configured */,
Beverlycc4a62f2019-09-26 14:55:28 -0400124 DozeEvent.REASON_SENSOR_TAP,
Lucas Dupind43bf702019-01-15 13:40:42 -0800125 false /* reports touch coordinates */,
Beverlycc4a62f2019-09-26 14:55:28 -0400126 true /* touchscreen */,
127 dozeLog),
Lucas Dupind43bf702019-01-15 13:40:42 -0800128 new TriggerSensor(
Adrian Roosd0963a02017-05-15 14:33:37 -0700129 findSensorWithType(config.longPressSensorType()),
130 Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
131 false /* settingDef */,
132 true /* configured */,
Beverlycc4a62f2019-09-26 14:55:28 -0400133 DozeEvent.PULSE_REASON_SENSOR_LONG_PRESS,
Adrian Roos98d31982017-08-02 20:50:16 +0200134 true /* reports touch coordinates */,
Beverlycc4a62f2019-09-26 14:55:28 -0400135 true /* touchscreen */,
136 dozeLog),
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800137 new PluginSensor(
Lucas Dupinb2d9f482018-11-16 18:55:13 -0800138 new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY),
Lucas Dupin7c7b8c22019-06-12 15:23:17 -0700139 Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE,
Lucas Dupin70bda672018-12-27 15:43:40 -0800140 mConfig.wakeScreenGestureAvailable() && alwaysOn,
Beverlycc4a62f2019-09-26 14:55:28 -0400141 DozeEvent.REASON_SENSOR_WAKE_UP,
Lucas Dupinb2d9f482018-11-16 18:55:13 -0800142 false /* reports touch coordinates */,
Beverlycc4a62f2019-09-26 14:55:28 -0400143 false /* touchscreen */,
144 dozeLog),
Lucas Dupinde64ee02018-12-21 14:45:12 -0800145 new PluginSensor(
146 new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN),
Lucas Dupin7c7b8c22019-06-12 15:23:17 -0700147 Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE,
148 mConfig.wakeScreenGestureAvailable(),
Beverlycc4a62f2019-09-26 14:55:28 -0400149 DozeEvent.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN,
Lucas Dupinde64ee02018-12-21 14:45:12 -0800150 false /* reports touch coordinates */,
Beverlycc4a62f2019-09-26 14:55:28 -0400151 false /* touchscreen */,
152 mConfig.getWakeLockScreenDebounce(),
153 dozeLog),
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700154 };
Adrian Roos67cca742017-04-13 16:52:51 -0700155
Dave Mankoffd94c9692019-10-18 12:38:21 -0400156 mProximitySensor = new ProximitySensor(context.getResources(), sensorManager);
Dave Mankoff63a12822019-09-16 14:38:06 -0400157
158 mProximitySensor.register(
Dave Mankoffa8a82562019-09-25 09:48:12 -0400159 proximityEvent -> {
160 if (proximityEvent != null) {
161 mProxCallback.accept(!proximityEvent.getNear());
162 }
163 });
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700164 }
165
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800166 /**
167 * Temporarily disable some sensors to avoid turning on the device while the user is
168 * turning it off.
169 */
170 public void requestTemporaryDisable() {
171 mDebounceFrom = SystemClock.uptimeMillis();
172 }
173
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700174 private Sensor findSensorWithType(String type) {
Adrian Roos2981eb02017-05-26 18:40:09 -0700175 return findSensorWithType(mSensorManager, type);
176 }
177
178 static Sensor findSensorWithType(SensorManager sensorManager, String type) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700179 if (TextUtils.isEmpty(type)) {
180 return null;
181 }
Adrian Roos2981eb02017-05-26 18:40:09 -0700182 List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700183 for (Sensor s : sensorList) {
184 if (type.equals(s.getStringType())) {
185 return s;
186 }
187 }
188 return null;
189 }
190
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700191 /**
192 * If sensors should be registered and sending signals.
193 */
Adrian Roosd6ec13132016-10-27 11:50:47 -0700194 public void setListening(boolean listen) {
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700195 if (mListening == listen) {
196 return;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700197 }
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700198 mListening = listen;
199 updateListening();
200 }
201
202 /**
203 * Unregister sensors, when listening, unless they are prox gated.
204 * @see #setListening(boolean)
205 */
206 public void setPaused(boolean paused) {
207 if (mPaused == paused) {
208 return;
209 }
210 mPaused = paused;
211 updateListening();
212 }
213
Lucas Dupin3174c662019-07-15 15:49:54 -0700214 /**
215 * Registers/unregisters sensors based on internal state.
216 */
217 public void updateListening() {
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700218 boolean anyListening = false;
219 for (TriggerSensor s : mSensors) {
Lucas Dupinf40bd8f2019-08-07 15:55:00 -0700220 s.setListening(mListening);
221 if (mListening) {
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700222 anyListening = true;
223 }
224 }
225
226 if (!anyListening) {
227 mResolver.unregisterContentObserver(mSettingsObserver);
228 } else if (!mSettingRegistered) {
229 for (TriggerSensor s : mSensors) {
230 s.registerSettingsObserver(mSettingsObserver);
231 }
232 }
233 mSettingRegistered = anyListening;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700234 }
235
Adrian Roos98d31982017-08-02 20:50:16 +0200236 /** Set the listening state of only the sensors that require the touchscreen. */
237 public void setTouchscreenSensorsListening(boolean listening) {
238 for (TriggerSensor sensor : mSensors) {
239 if (sensor.mRequiresTouchscreen) {
240 sensor.setListening(listening);
241 }
242 }
243 }
244
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700245 public void onUserSwitched() {
246 for (TriggerSensor s : mSensors) {
Lucas Dupin3174c662019-07-15 15:49:54 -0700247 s.updateListening();
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700248 }
249 }
250
Adrian Roos67cca742017-04-13 16:52:51 -0700251 public void setProxListening(boolean listen) {
Dave Mankoff63a12822019-09-16 14:38:06 -0400252 if (mProximitySensor.isRegistered() && listen) {
253 mProximitySensor.alertListeners();
254 } else {
255 if (listen) {
256 mProximitySensor.resume();
257 } else {
258 mProximitySensor.pause();
259 }
260 }
Adrian Roos67cca742017-04-13 16:52:51 -0700261 }
262
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700263 private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
264 @Override
265 public void onChange(boolean selfChange, Uri uri, int userId) {
266 if (userId != ActivityManager.getCurrentUser()) {
267 return;
268 }
269 for (TriggerSensor s : mSensors) {
Lucas Dupin3174c662019-07-15 15:49:54 -0700270 s.updateListening();
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700271 }
272 }
273 };
274
275 public void setDisableSensorsInterferingWithProximity(boolean disable) {
276 mPickupSensor.setDisabled(disable);
277 }
278
lpeter8a5f4702019-01-18 16:53:07 +0800279 /** Ignore the setting value of only the sensors that require the touchscreen. */
280 public void ignoreTouchScreenSensorsSettingInterferingWithDocking(boolean ignore) {
281 for (TriggerSensor sensor : mSensors) {
282 if (sensor.mRequiresTouchscreen) {
283 sensor.ignoreSetting(ignore);
284 }
285 }
286 }
287
Adrian Roosff2c4562016-11-03 12:13:36 -0700288 /** Dump current state */
289 public void dump(PrintWriter pw) {
290 for (TriggerSensor s : mSensors) {
Dave Mankoff63a12822019-09-16 14:38:06 -0400291 pw.println(" Sensor: " + s.toString());
Adrian Roosff2c4562016-11-03 12:13:36 -0700292 }
Dave Mankoff63a12822019-09-16 14:38:06 -0400293 pw.println(" ProxSensor: " + mProximitySensor.toString());
Adrian Roosff2c4562016-11-03 12:13:36 -0700294 }
295
Adrian Roos70da03a2017-07-24 16:42:57 +0200296 /**
Dave Mankoff63a12822019-09-16 14:38:06 -0400297 * @return true if prox is currently near, false if far or null if unknown.
Adrian Roos70da03a2017-07-24 16:42:57 +0200298 */
Dave Mankoff63a12822019-09-16 14:38:06 -0400299 public Boolean isProximityCurrentlyNear() {
300 return mProximitySensor.isNear();
Adrian Roos67cca742017-04-13 16:52:51 -0700301 }
302
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800303 @VisibleForTesting
304 class TriggerSensor extends TriggerEventListener {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700305 final Sensor mSensor;
306 final boolean mConfigured;
307 final int mPulseReason;
Lucas Dupinfac2e8e2019-06-27 16:10:19 -0700308 private final String mSetting;
309 private final boolean mReportsTouchCoordinates;
310 private final boolean mSettingDefault;
311 private final boolean mRequiresTouchscreen;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700312
Lucas Dupin323f9ff2018-08-27 16:55:56 -0700313 protected boolean mRequested;
314 protected boolean mRegistered;
315 protected boolean mDisabled;
lpeter8a5f4702019-01-18 16:53:07 +0800316 protected boolean mIgnoresSetting;
Beverlycc4a62f2019-09-26 14:55:28 -0400317 protected final DozeLog mDozeLog;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700318
Adrian Roos25c7a582017-06-02 12:50:38 -0700319 public TriggerSensor(Sensor sensor, String setting, boolean configured, int pulseReason,
Beverlycc4a62f2019-09-26 14:55:28 -0400320 boolean reportsTouchCoordinates, boolean requiresTouchscreen, DozeLog dozeLog) {
Adrian Roosd0963a02017-05-15 14:33:37 -0700321 this(sensor, setting, true /* settingDef */, configured, pulseReason,
Beverlycc4a62f2019-09-26 14:55:28 -0400322 reportsTouchCoordinates, requiresTouchscreen, dozeLog);
Adrian Roosd0963a02017-05-15 14:33:37 -0700323 }
324
325 public TriggerSensor(Sensor sensor, String setting, boolean settingDef,
Adrian Roos98d31982017-08-02 20:50:16 +0200326 boolean configured, int pulseReason, boolean reportsTouchCoordinates,
Beverlycc4a62f2019-09-26 14:55:28 -0400327 boolean requiresTouchscreen, DozeLog dozeLog) {
lpeter8a5f4702019-01-18 16:53:07 +0800328 this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates,
Beverlycc4a62f2019-09-26 14:55:28 -0400329 requiresTouchscreen, false /* ignoresSetting */, dozeLog);
lpeter8a5f4702019-01-18 16:53:07 +0800330 }
331
332 private TriggerSensor(Sensor sensor, String setting, boolean settingDef,
333 boolean configured, int pulseReason, boolean reportsTouchCoordinates,
Beverlycc4a62f2019-09-26 14:55:28 -0400334 boolean requiresTouchscreen, boolean ignoresSetting, DozeLog dozeLog) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700335 mSensor = sensor;
336 mSetting = setting;
Adrian Roosd0963a02017-05-15 14:33:37 -0700337 mSettingDefault = settingDef;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700338 mConfigured = configured;
339 mPulseReason = pulseReason;
Adrian Roos25c7a582017-06-02 12:50:38 -0700340 mReportsTouchCoordinates = reportsTouchCoordinates;
Adrian Roos98d31982017-08-02 20:50:16 +0200341 mRequiresTouchscreen = requiresTouchscreen;
lpeter8a5f4702019-01-18 16:53:07 +0800342 mIgnoresSetting = ignoresSetting;
Beverlycc4a62f2019-09-26 14:55:28 -0400343 mDozeLog = dozeLog;
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700344 }
345
346 public void setListening(boolean listen) {
347 if (mRequested == listen) return;
348 mRequested = listen;
Lucas Dupin3174c662019-07-15 15:49:54 -0700349 updateListening();
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700350 }
351
352 public void setDisabled(boolean disabled) {
353 if (mDisabled == disabled) return;
354 mDisabled = disabled;
Lucas Dupin3174c662019-07-15 15:49:54 -0700355 updateListening();
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700356 }
357
lpeter8a5f4702019-01-18 16:53:07 +0800358 public void ignoreSetting(boolean ignored) {
359 if (mIgnoresSetting == ignored) return;
360 mIgnoresSetting = ignored;
Lucas Dupin3174c662019-07-15 15:49:54 -0700361 updateListening();
lpeter8a5f4702019-01-18 16:53:07 +0800362 }
363
Lucas Dupin3174c662019-07-15 15:49:54 -0700364 public void updateListening() {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700365 if (!mConfigured || mSensor == null) return;
lpeter8a5f4702019-01-18 16:53:07 +0800366 if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting)
367 && !mRegistered) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700368 mRegistered = mSensorManager.requestTriggerSensor(this, mSensor);
369 if (DEBUG) Log.d(TAG, "requestTriggerSensor " + mRegistered);
370 } else if (mRegistered) {
371 final boolean rt = mSensorManager.cancelTriggerSensor(this, mSensor);
372 if (DEBUG) Log.d(TAG, "cancelTriggerSensor " + rt);
373 mRegistered = false;
374 }
375 }
376
Lucas Dupin323f9ff2018-08-27 16:55:56 -0700377 protected boolean enabledBySetting() {
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800378 if (!mConfig.enabled(UserHandle.USER_CURRENT)) {
379 return false;
380 } else if (TextUtils.isEmpty(mSetting)) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700381 return true;
382 }
Adrian Roosd0963a02017-05-15 14:33:37 -0700383 return Settings.Secure.getIntForUser(mResolver, mSetting, mSettingDefault ? 1 : 0,
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700384 UserHandle.USER_CURRENT) != 0;
385 }
386
387 @Override
388 public String toString() {
389 return new StringBuilder("{mRegistered=").append(mRegistered)
390 .append(", mRequested=").append(mRequested)
391 .append(", mDisabled=").append(mDisabled)
392 .append(", mConfigured=").append(mConfigured)
lpeter8a5f4702019-01-18 16:53:07 +0800393 .append(", mIgnoresSetting=").append(mIgnoresSetting)
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700394 .append(", mSensor=").append(mSensor).append("}").toString();
395 }
396
397 @Override
398 @AnyThread
399 public void onTrigger(TriggerEvent event) {
Beverlycc4a62f2019-09-26 14:55:28 -0400400 mDozeLog.traceSensor(mPulseReason);
Adrian Roos79bacbb2016-10-26 11:00:12 -0700401 mHandler.post(mWakeLock.wrap(() -> {
Adrian Roosd6ec13132016-10-27 11:50:47 -0700402 if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event));
Lucas Dupin3d951752018-10-10 12:00:40 -0700403 if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700404 int subType = (int) event.values[0];
405 MetricsLogger.action(
Adrian Roos79bacbb2016-10-26 11:00:12 -0700406 mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE,
407 subType);
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700408 }
409
410 mRegistered = false;
Adrian Roos25c7a582017-06-02 12:50:38 -0700411 float screenX = -1;
412 float screenY = -1;
413 if (mReportsTouchCoordinates && event.values.length >= 2) {
414 screenX = event.values[0];
415 screenY = event.values[1];
416 }
Lucas Dupinf40bd8f2019-08-07 15:55:00 -0700417 mCallback.onSensorPulse(mPulseReason, screenX, screenY, event.values);
Lucas Dupin65104382018-12-04 11:53:42 -0800418 if (!mRegistered) {
Lucas Dupin3174c662019-07-15 15:49:54 -0700419 updateListening(); // reregister, this sensor only fires once
Lucas Dupin65104382018-12-04 11:53:42 -0800420 }
Adrian Roos79bacbb2016-10-26 11:00:12 -0700421 }));
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700422 }
423
424 public void registerSettingsObserver(ContentObserver settingsObserver) {
425 if (mConfigured && !TextUtils.isEmpty(mSetting)) {
426 mResolver.registerContentObserver(
427 Settings.Secure.getUriFor(mSetting), false /* descendants */,
428 mSettingsObserver, UserHandle.USER_ALL);
429 }
430 }
431
Lucas Dupin323f9ff2018-08-27 16:55:56 -0700432 protected String triggerEventToString(TriggerEvent event) {
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700433 if (event == null) return null;
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800434 final StringBuilder sb = new StringBuilder("SensorEvent[")
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700435 .append(event.timestamp).append(',')
436 .append(event.sensor.getName());
437 if (event.values != null) {
438 for (int i = 0; i < event.values.length; i++) {
439 sb.append(',').append(event.values[i]);
440 }
441 }
442 return sb.append(']').toString();
443 }
444 }
445
Lucas Dupin3d951752018-10-10 12:00:40 -0700446 /**
Kevin Chynf7c39032018-10-11 00:44:39 -0700447 * A Sensor that is injected via plugin.
Lucas Dupin3d951752018-10-10 12:00:40 -0700448 */
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800449 @VisibleForTesting
450 class PluginSensor extends TriggerSensor implements SensorManagerPlugin.SensorEventListener {
Lucas Dupin3d951752018-10-10 12:00:40 -0700451
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800452 final SensorManagerPlugin.Sensor mPluginSensor;
453 private long mDebounce;
Lucas Dupin3d951752018-10-10 12:00:40 -0700454
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800455 PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured,
Beverlycc4a62f2019-09-26 14:55:28 -0400456 int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen,
457 DozeLog dozeLog) {
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800458 this(sensor, setting, configured, pulseReason, reportsTouchCoordinates,
Beverlycc4a62f2019-09-26 14:55:28 -0400459 requiresTouchscreen, 0L /* debounce */, dozeLog);
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800460 }
461
462 PluginSensor(SensorManagerPlugin.Sensor sensor, String setting, boolean configured,
463 int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen,
Beverlycc4a62f2019-09-26 14:55:28 -0400464 long debounce, DozeLog dozeLog) {
Lucas Dupin3d951752018-10-10 12:00:40 -0700465 super(null, setting, configured, pulseReason, reportsTouchCoordinates,
Beverlycc4a62f2019-09-26 14:55:28 -0400466 requiresTouchscreen, dozeLog);
Lucas Dupin3d951752018-10-10 12:00:40 -0700467 mPluginSensor = sensor;
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800468 mDebounce = debounce;
Lucas Dupin3d951752018-10-10 12:00:40 -0700469 }
470
471 @Override
Lucas Dupin3174c662019-07-15 15:49:54 -0700472 public void updateListening() {
Lucas Dupin3d951752018-10-10 12:00:40 -0700473 if (!mConfigured) return;
474 AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager;
lpeter8a5f4702019-01-18 16:53:07 +0800475 if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting)
476 && !mRegistered) {
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800477 asyncSensorManager.registerPluginListener(mPluginSensor, this);
Lucas Dupin3d951752018-10-10 12:00:40 -0700478 mRegistered = true;
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800479 if (DEBUG) Log.d(TAG, "registerPluginListener");
Lucas Dupin3d951752018-10-10 12:00:40 -0700480 } else if (mRegistered) {
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800481 asyncSensorManager.unregisterPluginListener(mPluginSensor, this);
Lucas Dupin3d951752018-10-10 12:00:40 -0700482 mRegistered = false;
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800483 if (DEBUG) Log.d(TAG, "unregisterPluginListener");
Lucas Dupin3d951752018-10-10 12:00:40 -0700484 }
485 }
486
487 @Override
488 public String toString() {
489 return new StringBuilder("{mRegistered=").append(mRegistered)
490 .append(", mRequested=").append(mRequested)
491 .append(", mDisabled=").append(mDisabled)
492 .append(", mConfigured=").append(mConfigured)
lpeter8a5f4702019-01-18 16:53:07 +0800493 .append(", mIgnoresSetting=").append(mIgnoresSetting)
Lucas Dupin3d951752018-10-10 12:00:40 -0700494 .append(", mSensor=").append(mPluginSensor).append("}").toString();
495 }
496
Lucas Dupin1ae6cf92018-12-14 18:06:38 -0800497 private String triggerEventToString(SensorManagerPlugin.SensorEvent event) {
Lucas Dupinb2d9f482018-11-16 18:55:13 -0800498 if (event == null) return null;
499 final StringBuilder sb = new StringBuilder("PluginTriggerEvent[")
500 .append(event.getSensor()).append(',')
501 .append(event.getVendorType());
502 if (event.getValues() != null) {
503 for (int i = 0; i < event.getValues().length; i++) {
504 sb.append(',').append(event.getValues()[i]);
505 }
506 }
507 return sb.append(']').toString();
Lucas Dupin323f9ff2018-08-27 16:55:56 -0700508 }
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800509
510 @Override
511 public void onSensorChanged(SensorManagerPlugin.SensorEvent event) {
Beverlycc4a62f2019-09-26 14:55:28 -0400512 mDozeLog.traceSensor(mPulseReason);
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800513 mHandler.post(mWakeLock.wrap(() -> {
514 final long now = SystemClock.uptimeMillis();
515 if (now < mDebounceFrom + mDebounce) {
Lucas Dupinbca7ec72019-05-30 10:24:54 -0700516 Log.d(TAG, "onSensorEvent dropped: " + triggerEventToString(event));
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800517 return;
518 }
519 if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event));
Lucas Dupinf40bd8f2019-08-07 15:55:00 -0700520 mCallback.onSensorPulse(mPulseReason, -1, -1, event.getValues());
Lucas Dupin8a13aa72019-02-22 12:45:21 -0800521 }));
522 }
Lucas Dupin323f9ff2018-08-27 16:55:56 -0700523 }
524
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700525 public interface Callback {
Adrian Roosd6ec13132016-10-27 11:50:47 -0700526
527 /**
528 * Called when a sensor requests a pulse
Beverlycc4a62f2019-09-26 14:55:28 -0400529 * @param pulseReason Requesting sensor, e.g. {@link DozeEvent#REASON_SENSOR_PICKUP}
Adrian Roos25c7a582017-06-02 12:50:38 -0700530 * @param screenX the location on the screen where the sensor fired or -1
Lucas Dupinf40bd8f2019-08-07 15:55:00 -0700531 * if the sensor doesn't support reporting screen locations.
Adrian Roos25c7a582017-06-02 12:50:38 -0700532 * @param screenY the location on the screen where the sensor fired or -1
Lucas Dupinb2d9f482018-11-16 18:55:13 -0800533 * @param rawValues raw values array from the event.
Adrian Roosd6ec13132016-10-27 11:50:47 -0700534 */
Lucas Dupinf40bd8f2019-08-07 15:55:00 -0700535 void onSensorPulse(int pulseReason, float screenX, float screenY, float[] rawValues);
Adrian Roosea8d6ae2016-10-26 10:40:12 -0700536 }
537}