Unregister Touch Sensors for DOZE_AOD_DOCKED

DOZE_AOD_DOCKED should not have screen based trigger sensors
enabled. In fact, it can end up in inconsistent states currently.
When first entering it, the sensors are not enabled. But if the screen
then turns off (in a dark room) and then back on, the sensors are
left on from the prior state.

This change ensures that, when we ask to turn off touch based sensors,
they actually turn off.

Fixes: 172412913
Test: manual
Change-Id: I86f800cb75fee9f2d7e60655af4803e616a68fb2
This commit is contained in:
Dave Mankoff
2020-12-04 17:42:20 -05:00
parent 7898548ed6
commit fcc5a5f92f
4 changed files with 31 additions and 30 deletions

View File

@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.Log; import android.util.Log;
import android.view.Display; import android.view.Display;
@@ -79,6 +80,7 @@ public class DozeSensors {
private long mDebounceFrom; private long mDebounceFrom;
private boolean mSettingRegistered; private boolean mSettingRegistered;
private boolean mListening; private boolean mListening;
private boolean mListeningTouchScreenSensors;
@VisibleForTesting @VisibleForTesting
public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum { public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum {
@@ -232,22 +234,25 @@ public class DozeSensors {
/** /**
* If sensors should be registered and sending signals. * If sensors should be registered and sending signals.
*/ */
public void setListening(boolean listen) { public void setListening(boolean listen, boolean includeTouchScreenSensors) {
if (mListening == listen) { if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) {
return; return;
} }
mListening = listen; mListening = listen;
mListeningTouchScreenSensors = includeTouchScreenSensors;
updateListening(); updateListening();
} }
/** /**
* Registers/unregisters sensors based on internal state. * Registers/unregisters sensors based on internal state.
*/ */
public void updateListening() { private void updateListening() {
boolean anyListening = false; boolean anyListening = false;
for (TriggerSensor s : mSensors) { for (TriggerSensor s : mSensors) {
s.setListening(mListening); boolean listen = mListening
if (mListening) { && (!s.mRequiresTouchscreen || mListeningTouchScreenSensors);
s.setListening(listen);
if (listen) {
anyListening = true; anyListening = true;
} }
} }
@@ -319,10 +324,14 @@ public class DozeSensors {
/** Dump current state */ /** Dump current state */
public void dump(PrintWriter pw) { public void dump(PrintWriter pw) {
pw.println("mListening=" + mListening);
pw.println("mListeningTouchScreenSensors=" + mListeningTouchScreenSensors);
IndentingPrintWriter idpw = new IndentingPrintWriter(pw);
idpw.increaseIndent();
for (TriggerSensor s : mSensors) { for (TriggerSensor s : mSensors) {
pw.println(" Sensor: " + s.toString()); idpw.println("Sensor: " + s.toString());
} }
pw.println(" ProxSensor: " + mProximitySensor.toString()); idpw.println("ProxSensor: " + mProximitySensor.toString());
} }
/** /**

View File

@@ -29,6 +29,7 @@ import android.metrics.LogMaker;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.util.IndentingPrintWriter;
import android.util.Log; import android.util.Log;
import android.view.Display; import android.view.Display;
@@ -434,15 +435,12 @@ public class DozeTriggers implements DozeMachine.Part {
break; break;
case DOZE_PULSE_DONE: case DOZE_PULSE_DONE:
mDozeSensors.requestTemporaryDisable(); mDozeSensors.requestTemporaryDisable();
// A pulse will temporarily disable sensors that require a touch screen.
// Let's make sure that they are re-enabled when the pulse is over.
mDozeSensors.updateListening();
break; break;
case FINISH: case FINISH:
mBroadcastReceiver.unregister(mBroadcastDispatcher); mBroadcastReceiver.unregister(mBroadcastDispatcher);
mDozeHost.removeCallback(mHostCallback); mDozeHost.removeCallback(mHostCallback);
mDockManager.removeListener(mDockEventListener); mDockManager.removeListener(mDockEventListener);
mDozeSensors.setListening(false); mDozeSensors.setListening(false, false);
mDozeSensors.setProxListening(false); mDozeSensors.setProxListening(false);
mWantSensors = false; mWantSensors = false;
mWantProx = false; mWantProx = false;
@@ -450,20 +448,16 @@ public class DozeTriggers implements DozeMachine.Part {
break; break;
default: default:
} }
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
} }
@Override @Override
public void onScreenState(int state) { public void onScreenState(int state) {
mDozeSensors.onScreenState(state); mDozeSensors.onScreenState(state);
if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND mDozeSensors.setProxListening(mWantProx && (state == Display.STATE_DOZE
|| state == Display.STATE_OFF) { || state == Display.STATE_DOZE_SUSPEND
mDozeSensors.setProxListening(mWantProx); || state == Display.STATE_OFF));
mDozeSensors.setListening(mWantSensors); mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors);
} else {
mDozeSensors.setProxListening(false);
mDozeSensors.setListening(mWantSensors);
}
} }
private void checkTriggersAtInit() { private void checkTriggersAtInit() {
@@ -539,7 +533,9 @@ public class DozeTriggers implements DozeMachine.Part {
pw.println(" pulsePending=" + mPulsePending); pw.println(" pulsePending=" + mPulsePending);
pw.println("DozeSensors:"); pw.println("DozeSensors:");
mDozeSensors.dump(pw); IndentingPrintWriter idpw = new IndentingPrintWriter(pw);
idpw.increaseIndent();
mDozeSensors.dump(idpw);
} }
private class TriggerReceiver extends BroadcastReceiver { private class TriggerReceiver extends BroadcastReceiver {

View File

@@ -31,7 +31,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.AmbientDisplayConfiguration;
@@ -64,8 +63,6 @@ import java.util.function.Consumer;
@SmallTest @SmallTest
public class DozeSensorsTest extends SysuiTestCase { public class DozeSensorsTest extends SysuiTestCase {
@Mock
private AlarmManager mAlarmManager;
@Mock @Mock
private AsyncSensorManager mSensorManager; private AsyncSensorManager mSensorManager;
@Mock @Mock
@@ -79,8 +76,6 @@ public class DozeSensorsTest extends SysuiTestCase {
@Mock @Mock
private Consumer<Boolean> mProxCallback; private Consumer<Boolean> mProxCallback;
@Mock @Mock
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
@Mock
private TriggerSensor mTriggerSensor; private TriggerSensor mTriggerSensor;
@Mock @Mock
private DozeLog mDozeLog; private DozeLog mDozeLog;
@@ -115,7 +110,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test @Test
public void testSensorDebounce() { public void testSensorDebounce() {
mDozeSensors.setListening(true); mDozeSensors.setListening(true, true);
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class)); mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages();
@@ -133,7 +128,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test @Test
public void testSetListening_firstTrue_registerSettingsObserver() { public void testSetListening_firstTrue_registerSettingsObserver() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt()); verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true); mDozeSensors.setListening(true, true);
verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
} }
@@ -141,8 +136,8 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test @Test
public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt()); verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true); mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true); mDozeSensors.setListening(true, true);
verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
} }

View File

@@ -154,6 +154,7 @@ public class DozeTriggersTest extends SysuiTestCase {
clearInvocations(mSensors); clearInvocations(mSensors);
mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE); mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE);
mTriggers.transitionTo(DozeMachine.State.DOZE_PULSE_DONE, DozeMachine.State.DOZE_AOD);
waitForSensorManager(); waitForSensorManager();
verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor));
} }