Do not unregister lift when prox is covered
The lift sensor won't receive all the data that it needs otherwise.
Test: atest DozeParametersTest
Test: lift while prox is covered
Test: lift while prox is covered, uncovering before end of gesture
Test: lift while prox is not covered
Fixes: 134685251
Change-Id: I0938baba6ccaaf04c40fe30b3f4f59293179dc2a
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index cdcf660..ce9f2c7 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -76,6 +76,8 @@
private final ProxSensor mProxSensor;
private long mDebounceFrom;
private boolean mSettingRegistered;
+ private boolean mListening;
+ private boolean mPaused;
public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager,
DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
@@ -100,9 +102,12 @@
mPickupSensor = new TriggerSensor(
mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
Settings.Secure.DOZE_PICK_UP_GESTURE,
+ true /* settingDef */,
config.dozePickupSensorAvailable(),
DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */,
- false /* touchscreen */),
+ false /* touchscreen */,
+ false /* ignoresSetting */,
+ mDozeParameters.getPickupPerformsProxCheck()),
new TriggerSensor(
findSensorWithType(config.doubleTapSensorType()),
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
@@ -170,11 +175,49 @@
return null;
}
+ /**
+ * If sensors should be registered and sending signals.
+ */
public void setListening(boolean listen) {
- for (TriggerSensor s : mSensors) {
- s.setListening(listen);
+ if (mListening == listen) {
+ return;
}
- registerSettingsObserverIfNeeded(listen);
+ mListening = listen;
+ updateListening();
+ }
+
+ /**
+ * Unregister sensors, when listening, unless they are prox gated.
+ * @see #setListening(boolean)
+ */
+ public void setPaused(boolean paused) {
+ if (mPaused == paused) {
+ return;
+ }
+ mPaused = paused;
+ updateListening();
+ }
+
+ private void updateListening() {
+ boolean anyListening = false;
+ for (TriggerSensor s : mSensors) {
+ // We don't want to be listening while we're PAUSED (prox sensor is covered)
+ // except when the sensor is already gated by prox.
+ boolean listen = mListening && (!mPaused || s.performsProxCheck());
+ s.setListening(listen);
+ if (listen) {
+ anyListening = true;
+ }
+ }
+
+ if (!anyListening) {
+ mResolver.unregisterContentObserver(mSettingsObserver);
+ } else if (!mSettingRegistered) {
+ for (TriggerSensor s : mSensors) {
+ s.registerSettingsObserver(mSettingsObserver);
+ }
+ }
+ mSettingRegistered = anyListening;
}
/** Set the listening state of only the sensors that require the touchscreen. */
@@ -236,17 +279,6 @@
return mProxSensor.mCurrentlyFar;
}
- private void registerSettingsObserverIfNeeded(boolean register) {
- if (!register) {
- mResolver.unregisterContentObserver(mSettingsObserver);
- } else if (!mSettingRegistered) {
- for (TriggerSensor s : mSensors) {
- s.registerSettingsObserver(mSettingsObserver);
- }
- }
- mSettingRegistered = register;
- }
-
private class ProxSensor implements SensorEventListener {
boolean mRequested;
@@ -334,10 +366,11 @@
final Sensor mSensor;
final boolean mConfigured;
final int mPulseReason;
- final String mSetting;
- final boolean mReportsTouchCoordinates;
- final boolean mSettingDefault;
- final boolean mRequiresTouchscreen;
+ private final String mSetting;
+ private final boolean mReportsTouchCoordinates;
+ private final boolean mSettingDefault;
+ private final boolean mRequiresTouchscreen;
+ private final boolean mSensorPerformsProxCheck;
protected boolean mRequested;
protected boolean mRegistered;
@@ -354,12 +387,14 @@
boolean configured, int pulseReason, boolean reportsTouchCoordinates,
boolean requiresTouchscreen) {
this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates,
- requiresTouchscreen, false /* ignoresSetting */);
+ requiresTouchscreen, false /* ignoresSetting */,
+ false /* sensorPerformsProxCheck */);
}
private TriggerSensor(Sensor sensor, String setting, boolean settingDef,
boolean configured, int pulseReason, boolean reportsTouchCoordinates,
- boolean requiresTouchscreen, boolean ignoresSetting) {
+ boolean requiresTouchscreen, boolean ignoresSetting,
+ boolean sensorPerformsProxCheck) {
mSensor = sensor;
mSetting = setting;
mSettingDefault = settingDef;
@@ -368,6 +403,7 @@
mReportsTouchCoordinates = reportsTouchCoordinates;
mRequiresTouchscreen = requiresTouchscreen;
mIgnoresSetting = ignoresSetting;
+ mSensorPerformsProxCheck = sensorPerformsProxCheck;
}
public void setListening(boolean listen) {
@@ -427,14 +463,11 @@
DozeLog.traceSensor(mContext, mPulseReason);
mHandler.post(mWakeLock.wrap(() -> {
if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event));
- boolean sensorPerformsProxCheck = false;
if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) {
int subType = (int) event.values[0];
MetricsLogger.action(
mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE,
subType);
- sensorPerformsProxCheck =
- mDozeParameters.getPickupSubtypePerformsProxCheck(subType);
}
mRegistered = false;
@@ -444,7 +477,7 @@
screenX = event.values[0];
screenY = event.values[1];
}
- mCallback.onSensorPulse(mPulseReason, sensorPerformsProxCheck, screenX, screenY,
+ mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY,
event.values);
if (!mRegistered) {
updateListener(); // reregister, this sensor only fires once
@@ -452,6 +485,15 @@
}));
}
+ /**
+ * If the sensor itself performs proximity checks, to avoid pocket dialing.
+ * Gated sensors don't need to be stopped when the {@link DozeMachine} is
+ * {@link DozeMachine.State#DOZE_AOD_PAUSED}.
+ */
+ public boolean performsProxCheck() {
+ return mSensorPerformsProxCheck;
+ }
+
public void registerSettingsObserver(ContentObserver settingsObserver) {
if (mConfigured && !TextUtils.isEmpty(mSetting)) {
mResolver.registerContentObserver(
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index a381e7b..eff2afa 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -282,6 +282,7 @@
case DOZE_AOD:
mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE);
mDozeSensors.setListening(true);
+ mDozeSensors.setPaused(false);
if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) {
onWakeScreen(false, newState);
}
@@ -289,12 +290,13 @@
case DOZE_AOD_PAUSED:
case DOZE_AOD_PAUSING:
mDozeSensors.setProxListening(true);
- mDozeSensors.setListening(false);
+ mDozeSensors.setPaused(true);
break;
case DOZE_PULSING:
case DOZE_PULSING_BRIGHT:
mDozeSensors.setTouchscreenSensorsListening(false);
mDozeSensors.setProxListening(true);
+ mDozeSensors.setPaused(false);
break;
case DOZE_PULSE_DONE:
mDozeSensors.requestTemporaryDisable();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 89bd1b6..10b48e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -22,9 +22,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
-import android.text.TextUtils;
import android.util.MathUtils;
-import android.util.SparseBooleanArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
@@ -41,13 +39,11 @@
public class DozeParameters implements TunerService.Tunable,
com.android.systemui.plugins.statusbar.DozeParameters {
private static final int MAX_DURATION = 60 * 1000;
- public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully";
public static final boolean FORCE_NO_BLANKING =
SystemProperties.getBoolean("debug.force_no_blanking", false);
public static final boolean FORCE_BLANKING =
SystemProperties.getBoolean("debug.force_blanking", false);
- private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
private static DozeParameters sInstance;
private final Context mContext;
@@ -92,20 +88,6 @@
pw.print(" getVibrateOnPickup(): "); pw.println(getVibrateOnPickup());
pw.print(" getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse());
pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
- pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println(
- dumpPickupSubtypePerformsProxCheck());
- }
-
- private String dumpPickupSubtypePerformsProxCheck() {
- // Refresh sPickupSubtypePerformsProxMatcher
- getPickupSubtypePerformsProxCheck(0);
-
- if (sPickupSubtypePerformsProxMatcher == null) {
- return "fallback: " + mContext.getResources().getBoolean(
- R.bool.doze_pickup_performs_proximity_check);
- } else {
- return "spec: " + sPickupSubtypePerformsProxMatcher.mSpec;
- }
}
public boolean getDisplayStateSupported() {
@@ -225,21 +207,8 @@
return SystemProperties.get(propName, mContext.getString(resId));
}
- public boolean getPickupSubtypePerformsProxCheck(int subType) {
- String spec = getString("doze.pickup.proxcheck",
- R.string.doze_pickup_subtype_performs_proximity_check);
-
- if (TextUtils.isEmpty(spec)) {
- // Fall back to non-subtype based property.
- return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check);
- }
-
- if (sPickupSubtypePerformsProxMatcher == null
- || !TextUtils.equals(spec, sPickupSubtypePerformsProxMatcher.mSpec)) {
- sPickupSubtypePerformsProxMatcher = new IntInOutMatcher(spec);
- }
-
- return sPickupSubtypePerformsProxMatcher.isIn(subType);
+ public boolean getPickupPerformsProxCheck() {
+ return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check);
}
public int getPulseVisibleDurationExtended() {
@@ -258,81 +227,4 @@
public AlwaysOnDisplayPolicy getPolicy() {
return mAlwaysOnPolicy;
}
-
- /**
- * Parses a spec of the form `1,2,3,!5,*`. The resulting object will match numbers that are
- * listed, will not match numbers that are listed with a ! prefix, and will match / not match
- * unlisted numbers depending on whether * or !* is present.
- *
- * * -> match any numbers that are not explicitly listed
- * !* -> don't match any numbers that are not explicitly listed
- * 2 -> match 2
- * !3 -> don't match 3
- *
- * It is illegal to specify:
- * - an empty spec
- * - a spec containing that are empty, or a lone !
- * - a spec for anything other than numbers or *
- * - multiple terms for the same number / multiple *s
- */
- public static class IntInOutMatcher {
- private static final String WILDCARD = "*";
- private static final char OUT_PREFIX = '!';
-
- private final SparseBooleanArray mIsIn;
- private final boolean mDefaultIsIn;
- final String mSpec;
-
- public IntInOutMatcher(String spec) {
- if (TextUtils.isEmpty(spec)) {
- throw new IllegalArgumentException("Spec must not be empty");
- }
-
- boolean defaultIsIn = false;
- boolean foundWildcard = false;
-
- mSpec = spec;
- mIsIn = new SparseBooleanArray();
-
- for (String itemPrefixed : spec.split(",", -1)) {
- if (itemPrefixed.length() == 0) {
- throw new IllegalArgumentException(
- "Illegal spec, must not have zero-length items: `" + spec + "`");
- }
- boolean isIn = itemPrefixed.charAt(0) != OUT_PREFIX;
- String item = isIn ? itemPrefixed : itemPrefixed.substring(1);
-
- if (itemPrefixed.length() == 0) {
- throw new IllegalArgumentException(
- "Illegal spec, must not have zero-length items: `" + spec + "`");
- }
-
- if (WILDCARD.equals(item)) {
- if (foundWildcard) {
- throw new IllegalArgumentException("Illegal spec, `" + WILDCARD +
- "` must not appear multiple times in `" + spec + "`");
- }
- defaultIsIn = isIn;
- foundWildcard = true;
- } else {
- int key = Integer.parseInt(item);
- if (mIsIn.indexOfKey(key) >= 0) {
- throw new IllegalArgumentException("Illegal spec, `" + key +
- "` must not appear multiple times in `" + spec + "`");
- }
- mIsIn.put(key, isIn);
- }
- }
-
- if (!foundWildcard) {
- throw new IllegalArgumentException("Illegal spec, must specify either * or !*");
- }
-
- mDefaultIsIn = defaultIsIn;
- }
-
- public boolean isIn(int value) {
- return (mIsIn.get(value, mDefaultIsIn));
- }
- }
}