Assume sensors perform prox check
Assume that doze sensors will be prox gated. Not doing so would be a bad idea anyway since the device would wake up way more often than it should and drain battery. Another improvement on this CL is that regular DozeSensors prox checks are trying to use a binned brightness sensor instead. Fixes: 138765669 Test: atest DozeSensorsTest DozeTriggersTest Test: single tap from AOD (observe no re-registration of lift) Test: 'reach' from AOD (observe no re-registration of lift) Test: receive notification with prox covered or unobstructed Change-Id: I1961ff9b16480ba1a60c397570494dd7acb4802d
This commit is contained in:
@@ -196,9 +196,6 @@
|
||||
<!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations -->
|
||||
<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
|
||||
brightness, suitable to listen to while the device is asleep (e.g. during
|
||||
always-on display) -->
|
||||
|
||||
@@ -107,8 +107,7 @@ public class DozeSensors {
|
||||
config.dozePickupSensorAvailable(),
|
||||
DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */,
|
||||
false /* touchscreen */,
|
||||
false /* ignoresSetting */,
|
||||
mDozeParameters.getPickupPerformsProxCheck()),
|
||||
false /* ignoresSetting */),
|
||||
new TriggerSensor(
|
||||
findSensorWithType(config.doubleTapSensorType()),
|
||||
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
|
||||
@@ -205,11 +204,8 @@ public class DozeSensors {
|
||||
public 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) {
|
||||
s.setListening(mListening);
|
||||
if (mListening) {
|
||||
anyListening = true;
|
||||
}
|
||||
}
|
||||
@@ -384,7 +380,6 @@ public class DozeSensors {
|
||||
private final boolean mReportsTouchCoordinates;
|
||||
private final boolean mSettingDefault;
|
||||
private final boolean mRequiresTouchscreen;
|
||||
private final boolean mSensorPerformsProxCheck;
|
||||
|
||||
protected boolean mRequested;
|
||||
protected boolean mRegistered;
|
||||
@@ -401,14 +396,12 @@ public class DozeSensors {
|
||||
boolean configured, int pulseReason, boolean reportsTouchCoordinates,
|
||||
boolean requiresTouchscreen) {
|
||||
this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates,
|
||||
requiresTouchscreen, false /* ignoresSetting */,
|
||||
false /* sensorPerformsProxCheck */);
|
||||
requiresTouchscreen, false /* ignoresSetting */);
|
||||
}
|
||||
|
||||
private TriggerSensor(Sensor sensor, String setting, boolean settingDef,
|
||||
boolean configured, int pulseReason, boolean reportsTouchCoordinates,
|
||||
boolean requiresTouchscreen, boolean ignoresSetting,
|
||||
boolean sensorPerformsProxCheck) {
|
||||
boolean requiresTouchscreen, boolean ignoresSetting) {
|
||||
mSensor = sensor;
|
||||
mSetting = setting;
|
||||
mSettingDefault = settingDef;
|
||||
@@ -417,7 +410,6 @@ public class DozeSensors {
|
||||
mReportsTouchCoordinates = reportsTouchCoordinates;
|
||||
mRequiresTouchscreen = requiresTouchscreen;
|
||||
mIgnoresSetting = ignoresSetting;
|
||||
mSensorPerformsProxCheck = sensorPerformsProxCheck;
|
||||
}
|
||||
|
||||
public void setListening(boolean listen) {
|
||||
@@ -491,23 +483,13 @@ public class DozeSensors {
|
||||
screenX = event.values[0];
|
||||
screenY = event.values[1];
|
||||
}
|
||||
mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY,
|
||||
event.values);
|
||||
mCallback.onSensorPulse(mPulseReason, screenX, screenY, event.values);
|
||||
if (!mRegistered) {
|
||||
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) {
|
||||
if (mConfigured && !TextUtils.isEmpty(mSetting)) {
|
||||
mResolver.registerContentObserver(
|
||||
@@ -603,8 +585,7 @@ public class DozeSensors {
|
||||
return;
|
||||
}
|
||||
if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event));
|
||||
mCallback.onSensorPulse(mPulseReason, true /* sensorPerformsProxCheck */, -1, -1,
|
||||
event.getValues());
|
||||
mCallback.onSensorPulse(mPulseReason, -1, -1, event.getValues());
|
||||
}));
|
||||
}
|
||||
}
|
||||
@@ -614,13 +595,11 @@ public class DozeSensors {
|
||||
/**
|
||||
* Called when a sensor requests a pulse
|
||||
* @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
|
||||
* 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 rawValues raw values array from the event.
|
||||
*/
|
||||
void onSensorPulse(int pulseReason, boolean sensorPerformedProxCheck,
|
||||
float screenX, float screenY, float[] rawValues);
|
||||
void onSensorPulse(int pulseReason, float screenX, float screenY, float[] rawValues);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.util.Assert;
|
||||
@@ -156,8 +157,7 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void onSensor(int pulseReason, boolean sensorPerformedProxCheck,
|
||||
float screenX, float screenY, float[] rawValues) {
|
||||
void onSensor(int pulseReason, float screenX, float screenY, float[] rawValues) {
|
||||
boolean isDoubleTap = pulseReason == DozeLog.REASON_SENSOR_DOUBLE_TAP;
|
||||
boolean isTap = pulseReason == DozeLog.REASON_SENSOR_TAP;
|
||||
boolean isPickup = pulseReason == DozeLog.REASON_SENSOR_PICKUP;
|
||||
@@ -169,10 +169,11 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
if (isWakeDisplay) {
|
||||
onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState());
|
||||
} else if (isLongPress) {
|
||||
requestPulse(pulseReason, sensorPerformedProxCheck, null /* onPulseSupressedListener */);
|
||||
requestPulse(pulseReason, true /* alreadyPerformedProxCheck */,
|
||||
null /* onPulseSupressedListener */);
|
||||
} else if (isWakeLockScreen) {
|
||||
if (wakeEvent) {
|
||||
requestPulse(pulseReason, sensorPerformedProxCheck,
|
||||
requestPulse(pulseReason, true /* alreadyPerformedProxCheck */,
|
||||
null /* onPulseSupressedListener */);
|
||||
}
|
||||
} else {
|
||||
@@ -191,8 +192,7 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
} else {
|
||||
mDozeHost.extendPulse(pulseReason);
|
||||
}
|
||||
}, sensorPerformedProxCheck
|
||||
|| (mDockManager != null && mDockManager.isDocked()), pulseReason);
|
||||
}, true /* alreadyPerformedProxCheck */, pulseReason);
|
||||
}
|
||||
|
||||
if (isPickup) {
|
||||
@@ -278,7 +278,7 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
.setType(MetricsEvent.TYPE_OPEN)
|
||||
.setSubtype(DozeLog.REASON_SENSOR_WAKE_UP));
|
||||
}
|
||||
}, false /* alreadyPerformedProxCheck */, DozeLog.REASON_SENSOR_WAKE_UP);
|
||||
}, true /* alreadyPerformedProxCheck */, DozeLog.REASON_SENSOR_WAKE_UP);
|
||||
} else {
|
||||
boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED);
|
||||
boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING);
|
||||
@@ -433,7 +433,11 @@ public class DozeTriggers implements DozeMachine.Part {
|
||||
|
||||
public void check() {
|
||||
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));
|
||||
if (sensor == null) {
|
||||
sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||
}
|
||||
if (sensor == null) {
|
||||
if (DozeMachine.DEBUG) Log.d(TAG, "ProxCheck: No sensor found");
|
||||
finishWithResult(RESULT_UNKNOWN);
|
||||
|
||||
@@ -207,10 +207,6 @@ public class DozeParameters implements TunerService.Tunable,
|
||||
return SystemProperties.get(propName, mContext.getString(resId));
|
||||
}
|
||||
|
||||
public boolean getPickupPerformsProxCheck() {
|
||||
return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check);
|
||||
}
|
||||
|
||||
public int getPulseVisibleDurationExtended() {
|
||||
return 2 * getPulseVisibleDuration();
|
||||
}
|
||||
|
||||
@@ -37,7 +37,6 @@ public class DozeConfigurationUtil {
|
||||
when(params.getPulseOnSigMotion()).thenReturn(false);
|
||||
when(params.getPickupVibrationThreshold()).thenReturn(0);
|
||||
when(params.getProxCheckBeforePulse()).thenReturn(true);
|
||||
when(params.getPickupPerformsProxCheck()).thenReturn(true);
|
||||
when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class));
|
||||
when(params.doubleTapReportsTouchCoordinates()).thenReturn(false);
|
||||
when(params.getDisplayNeedsBlanking()).thenReturn(false);
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.systemui.doze;
|
||||
import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
@@ -79,8 +78,6 @@ public class DozeSensorsTest extends SysuiTestCase {
|
||||
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
|
||||
@Mock
|
||||
private TriggerSensor mTriggerSensor;
|
||||
@Mock
|
||||
private TriggerSensor mProxGatedTriggerSensor;
|
||||
private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
|
||||
private TestableLooper mTestableLooper;
|
||||
private DozeSensors mDozeSensors;
|
||||
@@ -88,7 +85,6 @@ public class DozeSensorsTest extends SysuiTestCase {
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
when(mProxGatedTriggerSensor.performsProxCheck()).thenReturn(true);
|
||||
mTestableLooper = TestableLooper.get(this);
|
||||
when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L);
|
||||
when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
|
||||
@@ -106,14 +102,14 @@ public class DozeSensorsTest extends SysuiTestCase {
|
||||
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
|
||||
mTestableLooper.processAllMessages();
|
||||
verify(mCallback).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN),
|
||||
anyBoolean(), anyFloat(), anyFloat(), eq(null));
|
||||
anyFloat(), anyFloat(), eq(null));
|
||||
|
||||
mDozeSensors.requestTemporaryDisable();
|
||||
reset(mCallback);
|
||||
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
|
||||
mTestableLooper.processAllMessages();
|
||||
verify(mCallback, never()).onSensorPulse(eq(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN),
|
||||
anyBoolean(), anyFloat(), anyFloat(), eq(null));
|
||||
anyFloat(), anyFloat(), eq(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -132,20 +128,17 @@ public class DozeSensorsTest extends SysuiTestCase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetPaused_onlyPausesNonGatedSensors() {
|
||||
public void testSetPaused_doesntPause_sensors() {
|
||||
mDozeSensors.setListening(true);
|
||||
verify(mTriggerSensor).setListening(eq(true));
|
||||
verify(mProxGatedTriggerSensor).setListening(eq(true));
|
||||
|
||||
clearInvocations(mTriggerSensor, mProxGatedTriggerSensor);
|
||||
clearInvocations(mTriggerSensor);
|
||||
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(mProxGatedTriggerSensor).setListening(eq(true));
|
||||
|
||||
clearInvocations(mTriggerSensor);
|
||||
mDozeSensors.setListening(false);
|
||||
verify(mTriggerSensor).setListening(eq(false));
|
||||
}
|
||||
|
||||
private class TestableDozeSensors extends DozeSensors {
|
||||
@@ -161,7 +154,7 @@ public class DozeSensorsTest extends SysuiTestCase {
|
||||
mWakeLockScreenListener = (PluginSensor) sensor;
|
||||
}
|
||||
}
|
||||
mSensors = new TriggerSensor[] {mTriggerSensor, mProxGatedTriggerSensor};
|
||||
mSensors = new TriggerSensor[] {mTriggerSensor};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
@@ -134,28 +133,4 @@ public class DozeTriggersTest extends SysuiTestCase {
|
||||
mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user