Merge changes from topic "cherry-pick-dropped-sensor" into qt-r1-dev

* changes:
  Fix issue where notif wouldn't HUN
  Assume sensors perform prox check
This commit is contained in:
TreeHugger Robot
2019-09-13 05:26:35 +00:00
committed by Android (Google) Code Review
7 changed files with 46 additions and 88 deletions

View File

@@ -196,9 +196,6 @@
<!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations --> <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations -->
<integer name="doze_pickup_vibration_threshold">2000</integer> <integer name="doze_pickup_vibration_threshold">2000</integer>
<!-- Doze: can we assume the pickup sensor includes a proximity check? -->
<bool name="doze_pickup_performs_proximity_check">false</bool>
<!-- Type of a sensor that provides a low-power estimate of the desired display <!-- Type of a sensor that provides a low-power estimate of the desired display
brightness, suitable to listen to while the device is asleep (e.g. during brightness, suitable to listen to while the device is asleep (e.g. during
always-on display) --> always-on display) -->

View File

@@ -107,8 +107,7 @@ public class DozeSensors {
config.dozePickupSensorAvailable(), config.dozePickupSensorAvailable(),
DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */, DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */,
false /* touchscreen */, false /* touchscreen */,
false /* ignoresSetting */, false /* ignoresSetting */),
mDozeParameters.getPickupPerformsProxCheck()),
new TriggerSensor( new TriggerSensor(
findSensorWithType(config.doubleTapSensorType()), findSensorWithType(config.doubleTapSensorType()),
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
@@ -205,11 +204,8 @@ public class DozeSensors {
public void updateListening() { public void updateListening() {
boolean anyListening = false; boolean anyListening = false;
for (TriggerSensor s : mSensors) { for (TriggerSensor s : mSensors) {
// We don't want to be listening while we're PAUSED (prox sensor is covered) s.setListening(mListening);
// except when the sensor is already gated by prox. if (mListening) {
boolean listen = mListening && (!mPaused || s.performsProxCheck());
s.setListening(listen);
if (listen) {
anyListening = true; anyListening = true;
} }
} }
@@ -391,7 +387,6 @@ public class DozeSensors {
private final boolean mReportsTouchCoordinates; private final boolean mReportsTouchCoordinates;
private final boolean mSettingDefault; private final boolean mSettingDefault;
private final boolean mRequiresTouchscreen; private final boolean mRequiresTouchscreen;
private final boolean mSensorPerformsProxCheck;
protected boolean mRequested; protected boolean mRequested;
protected boolean mRegistered; protected boolean mRegistered;
@@ -408,14 +403,12 @@ public class DozeSensors {
boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean configured, int pulseReason, boolean reportsTouchCoordinates,
boolean requiresTouchscreen) { boolean requiresTouchscreen) {
this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates, this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates,
requiresTouchscreen, false /* ignoresSetting */, requiresTouchscreen, false /* ignoresSetting */);
false /* sensorPerformsProxCheck */);
} }
private TriggerSensor(Sensor sensor, String setting, boolean settingDef, private TriggerSensor(Sensor sensor, String setting, boolean settingDef,
boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean configured, int pulseReason, boolean reportsTouchCoordinates,
boolean requiresTouchscreen, boolean ignoresSetting, boolean requiresTouchscreen, boolean ignoresSetting) {
boolean sensorPerformsProxCheck) {
mSensor = sensor; mSensor = sensor;
mSetting = setting; mSetting = setting;
mSettingDefault = settingDef; mSettingDefault = settingDef;
@@ -424,7 +417,6 @@ public class DozeSensors {
mReportsTouchCoordinates = reportsTouchCoordinates; mReportsTouchCoordinates = reportsTouchCoordinates;
mRequiresTouchscreen = requiresTouchscreen; mRequiresTouchscreen = requiresTouchscreen;
mIgnoresSetting = ignoresSetting; mIgnoresSetting = ignoresSetting;
mSensorPerformsProxCheck = sensorPerformsProxCheck;
} }
public void setListening(boolean listen) { public void setListening(boolean listen) {
@@ -498,23 +490,13 @@ public class DozeSensors {
screenX = event.values[0]; screenX = event.values[0];
screenY = event.values[1]; screenY = event.values[1];
} }
mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY, mCallback.onSensorPulse(mPulseReason, screenX, screenY, event.values);
event.values);
if (!mRegistered) { if (!mRegistered) {
updateListening(); // reregister, this sensor only fires once updateListening(); // reregister, this sensor only fires once
} }
})); }));
} }
/**
* 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) { public void registerSettingsObserver(ContentObserver settingsObserver) {
if (mConfigured && !TextUtils.isEmpty(mSetting)) { if (mConfigured && !TextUtils.isEmpty(mSetting)) {
mResolver.registerContentObserver( mResolver.registerContentObserver(
@@ -610,8 +592,7 @@ public class DozeSensors {
return; return;
} }
if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event));
mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1, mCallback.onSensorPulse(mPulseReason, -1, -1, event.getValues());
event.getValues());
})); }));
} }
} }
@@ -621,13 +602,11 @@ public class DozeSensors {
/** /**
* Called when a sensor requests a pulse * Called when a sensor requests a pulse
* @param pulseReason Requesting sensor, e.g. {@link DozeLog#REASON_SENSOR_PICKUP} * @param pulseReason Requesting sensor, e.g. {@link DozeLog#REASON_SENSOR_PICKUP}
* @param sensorPerformedProxCheck true if the sensor already checked for FAR proximity.
* @param screenX the location on the screen where the sensor fired or -1 * @param screenX the location on the screen where the sensor fired or -1
* if the sensor doesn't support reporting screen locations. * if the sensor doesn't support reporting screen locations.
* @param screenY the location on the screen where the sensor fired or -1 * @param screenY the location on the screen where the sensor fired or -1
* @param rawValues raw values array from the event. * @param rawValues raw values array from the event.
*/ */
void onSensorPulse(int pulseReason, boolean sensorPerformedProxCheck, void onSensorPulse(int pulseReason, float screenX, float screenY, float[] rawValues);
float screenX, float screenY, float[] rawValues);
} }
} }

View File

@@ -41,6 +41,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert; import com.android.systemui.util.Assert;
@@ -156,8 +157,7 @@ public class DozeTriggers implements DozeMachine.Part {
} }
@VisibleForTesting @VisibleForTesting
void onSensor(int pulseReason, boolean sensorPerformedProxCheck, void onSensor(int pulseReason, float screenX, float screenY, float[] rawValues) {
float screenX, float screenY, float[] rawValues) {
boolean isDoubleTap = pulseReason == DozeLog.REASON_SENSOR_DOUBLE_TAP; boolean isDoubleTap = pulseReason == DozeLog.REASON_SENSOR_DOUBLE_TAP;
boolean isTap = pulseReason == DozeLog.REASON_SENSOR_TAP; boolean isTap = pulseReason == DozeLog.REASON_SENSOR_TAP;
boolean isPickup = pulseReason == DozeLog.REASON_SENSOR_PICKUP; boolean isPickup = pulseReason == DozeLog.REASON_SENSOR_PICKUP;
@@ -169,10 +169,11 @@ public class DozeTriggers implements DozeMachine.Part {
if (isWakeDisplay) { if (isWakeDisplay) {
onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState()); onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState());
} else if (isLongPress) { } else if (isLongPress) {
requestPulse(pulseReason, sensorPerformedProxCheck, null /* onPulseSupressedListener */); requestPulse(pulseReason, true /* alreadyPerformedProxCheck */,
null /* onPulseSupressedListener */);
} else if (isWakeLockScreen) { } else if (isWakeLockScreen) {
if (wakeEvent) { if (wakeEvent) {
requestPulse(pulseReason, sensorPerformedProxCheck, requestPulse(pulseReason, true /* alreadyPerformedProxCheck */,
null /* onPulseSupressedListener */); null /* onPulseSupressedListener */);
} }
} else { } else {
@@ -191,8 +192,7 @@ public class DozeTriggers implements DozeMachine.Part {
} else { } else {
mDozeHost.extendPulse(pulseReason); mDozeHost.extendPulse(pulseReason);
} }
}, sensorPerformedProxCheck }, true /* alreadyPerformedProxCheck */, pulseReason);
|| (mDockManager != null && mDockManager.isDocked()), pulseReason);
} }
if (isPickup) { if (isPickup) {
@@ -278,7 +278,7 @@ public class DozeTriggers implements DozeMachine.Part {
.setType(MetricsEvent.TYPE_OPEN) .setType(MetricsEvent.TYPE_OPEN)
.setSubtype(DozeLog.REASON_SENSOR_WAKE_UP)); .setSubtype(DozeLog.REASON_SENSOR_WAKE_UP));
} }
}, false /* alreadyPerformedProxCheck */, DozeLog.REASON_SENSOR_WAKE_UP); }, true /* alreadyPerformedProxCheck */, DozeLog.REASON_SENSOR_WAKE_UP);
} else { } else {
boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED); boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED);
boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING); boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING);
@@ -417,6 +417,9 @@ public class DozeTriggers implements DozeMachine.Part {
mDozeSensors.dump(pw); mDozeSensors.dump(pw);
} }
/**
* @see DozeSensors.ProxSensor
*/
private abstract class ProximityCheck implements SensorEventListener, Runnable { private abstract class ProximityCheck implements SensorEventListener, Runnable {
private static final int TIMEOUT_DELAY_MS = 500; private static final int TIMEOUT_DELAY_MS = 500;
@@ -428,12 +431,18 @@ public class DozeTriggers implements DozeMachine.Part {
private boolean mRegistered; private boolean mRegistered;
private boolean mFinished; private boolean mFinished;
private float mMaxRange; private float mMaxRange;
private boolean mUsingBrightnessSensor;
protected abstract void onProximityResult(int result); protected abstract void onProximityResult(int result);
public void check() { public void check() {
Preconditions.checkState(!mFinished && !mRegistered); Preconditions.checkState(!mFinished && !mRegistered);
final Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); Sensor sensor = DozeSensors.findSensorWithType(mSensorManager,
mContext.getString(R.string.doze_brightness_sensor_type));
mUsingBrightnessSensor = sensor != null;
if (sensor == null) {
sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
if (sensor == null) { if (sensor == null) {
if (DozeMachine.DEBUG) Log.d(TAG, "ProxCheck: No sensor found"); if (DozeMachine.DEBUG) Log.d(TAG, "ProxCheck: No sensor found");
finishWithResult(RESULT_UNKNOWN); finishWithResult(RESULT_UNKNOWN);
@@ -449,6 +458,9 @@ public class DozeTriggers implements DozeMachine.Part {
mRegistered = true; mRegistered = true;
} }
/**
* @see DozeSensors.ProxSensor#onSensorChanged(SensorEvent)
*/
@Override @Override
public void onSensorChanged(SensorEvent event) { public void onSensorChanged(SensorEvent event) {
if (event.values.length == 0) { if (event.values.length == 0) {
@@ -458,7 +470,14 @@ public class DozeTriggers implements DozeMachine.Part {
if (DozeMachine.DEBUG) { if (DozeMachine.DEBUG) {
Log.d(TAG, "ProxCheck: Event: value=" + event.values[0] + " max=" + mMaxRange); Log.d(TAG, "ProxCheck: Event: value=" + event.values[0] + " max=" + mMaxRange);
} }
final boolean isNear = event.values[0] < mMaxRange; final boolean isNear;
if (mUsingBrightnessSensor) {
// The custom brightness sensor is gated by the proximity sensor and will
// return 0 whenever prox is covered.
isNear = event.values[0] == 0;
} else {
isNear = event.values[0] < mMaxRange;
}
finishWithResult(isNear ? RESULT_NEAR : RESULT_FAR); finishWithResult(isNear ? RESULT_NEAR : RESULT_FAR);
} }
} }

View File

@@ -207,10 +207,6 @@ public class DozeParameters implements TunerService.Tunable,
return SystemProperties.get(propName, mContext.getString(resId)); return SystemProperties.get(propName, mContext.getString(resId));
} }
public boolean getPickupPerformsProxCheck() {
return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check);
}
public int getPulseVisibleDurationExtended() { public int getPulseVisibleDurationExtended() {
return 2 * getPulseVisibleDuration(); return 2 * getPulseVisibleDuration();
} }

View File

@@ -37,7 +37,6 @@ public class DozeConfigurationUtil {
when(params.getPulseOnSigMotion()).thenReturn(false); when(params.getPulseOnSigMotion()).thenReturn(false);
when(params.getPickupVibrationThreshold()).thenReturn(0); when(params.getPickupVibrationThreshold()).thenReturn(0);
when(params.getProxCheckBeforePulse()).thenReturn(true); when(params.getProxCheckBeforePulse()).thenReturn(true);
when(params.getPickupPerformsProxCheck()).thenReturn(true);
when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class)); when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class));
when(params.doubleTapReportsTouchCoordinates()).thenReturn(false); when(params.doubleTapReportsTouchCoordinates()).thenReturn(false);
when(params.getDisplayNeedsBlanking()).thenReturn(false); when(params.getDisplayNeedsBlanking()).thenReturn(false);

View File

@@ -19,7 +19,6 @@ package com.android.systemui.doze;
import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN; import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
@@ -79,8 +78,6 @@ public class DozeSensorsTest extends SysuiTestCase {
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
@Mock @Mock
private TriggerSensor mTriggerSensor; private TriggerSensor mTriggerSensor;
@Mock
private TriggerSensor mProxGatedTriggerSensor;
private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener; private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
private TestableLooper mTestableLooper; private TestableLooper mTestableLooper;
private DozeSensors mDozeSensors; private DozeSensors mDozeSensors;
@@ -88,7 +85,6 @@ public class DozeSensorsTest extends SysuiTestCase {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mProxGatedTriggerSensor.performsProxCheck()).thenReturn(true);
mTestableLooper = TestableLooper.get(this); mTestableLooper = TestableLooper.get(this);
when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L); when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L);
when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
@@ -106,14 +102,14 @@ public class DozeSensorsTest extends SysuiTestCase {
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class)); mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages();
verify(mCallback).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN), verify(mCallback).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN),
anyBoolean(), anyFloat(), anyFloat(), eq(null)); anyFloat(), anyFloat(), eq(null));
mDozeSensors.requestTemporaryDisable(); mDozeSensors.requestTemporaryDisable();
reset(mCallback); reset(mCallback);
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class)); mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages();
verify(mCallback, never()).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN), verify(mCallback, never()).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN),
anyBoolean(), anyFloat(), anyFloat(), eq(null)); anyFloat(), anyFloat(), eq(null));
} }
@Test @Test
@@ -132,20 +128,17 @@ public class DozeSensorsTest extends SysuiTestCase {
} }
@Test @Test
public void testSetPaused_onlyPausesNonGatedSensors() { public void testSetPaused_doesntPause_sensors() {
mDozeSensors.setListening(true); mDozeSensors.setListening(true);
verify(mTriggerSensor).setListening(eq(true)); verify(mTriggerSensor).setListening(eq(true));
verify(mProxGatedTriggerSensor).setListening(eq(true));
clearInvocations(mTriggerSensor, mProxGatedTriggerSensor); clearInvocations(mTriggerSensor);
mDozeSensors.setPaused(true); mDozeSensors.setPaused(true);
verify(mTriggerSensor).setListening(eq(false));
verify(mProxGatedTriggerSensor).setListening(eq(true));
clearInvocations(mTriggerSensor, mProxGatedTriggerSensor);
mDozeSensors.setPaused(false);
verify(mTriggerSensor).setListening(eq(true)); verify(mTriggerSensor).setListening(eq(true));
verify(mProxGatedTriggerSensor).setListening(eq(true));
clearInvocations(mTriggerSensor);
mDozeSensors.setListening(false);
verify(mTriggerSensor).setListening(eq(false));
} }
private class TestableDozeSensors extends DozeSensors { private class TestableDozeSensors extends DozeSensors {
@@ -161,7 +154,7 @@ public class DozeSensorsTest extends SysuiTestCase {
mWakeLockScreenListener = (PluginSensor) sensor; mWakeLockScreenListener = (PluginSensor) sensor;
} }
} }
mSensors = new TriggerSensor[] {mTriggerSensor, mProxGatedTriggerSensor}; mSensors = new TriggerSensor[] {mTriggerSensor};
} }
} }
} }

View File

@@ -20,7 +20,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -134,28 +133,4 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH); mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH);
verify(mDockManagerFake).removeListener(any()); verify(mDockManagerFake).removeListener(any());
} }
@Test
public void testOnSensor_whenUndockedWithNearAndDoubleTapScreen_shouldNotWakeUp() {
mSensors.getMockProximitySensor().sendProximityResult(false /* far */);
mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP,
false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */,
null /* rawValues */);
verify(mMachine, never()).wakeUp();
}
@Test
public void testOnSensor_whenDockedWithNearAndDoubleTapScreen_shouldWakeUp() {
doReturn(true).when(mDockManagerFake).isDocked();
doReturn(true).when(mParameters).getDisplayNeedsBlanking();
mSensors.getMockProximitySensor().sendProximityResult(false /* far */);
mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP,
false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */,
null /* rawValues */);
verify(mHost).setAodDimmingScrim(eq(1f));
verify(mMachine).wakeUp();
}
} }