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: 172412931
Test: manual
Change-Id: I86f800cb75fee9f2d7e60655af4803e616a68fb2
Merged-In: I86f800cb75fee9f2d7e60655af4803e616a68fb2
This commit is contained in:
Dave Mankoff
2020-12-04 17:42:20 -05:00
parent 11ed014edf
commit 3995f0db93
4 changed files with 31 additions and 27 deletions

View File

@@ -46,6 +46,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -80,6 +81,7 @@ public class DozeSensors {
private long mDebounceFrom;
private boolean mSettingRegistered;
private boolean mListening;
private boolean mListeningTouchScreenSensors;
@VisibleForTesting
public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum {
@@ -222,22 +224,25 @@ public class DozeSensors {
/**
* If sensors should be registered and sending signals.
*/
public void setListening(boolean listen) {
if (mListening == listen) {
public void setListening(boolean listen, boolean includeTouchScreenSensors) {
if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) {
return;
}
mListening = listen;
mListeningTouchScreenSensors = includeTouchScreenSensors;
updateListening();
}
/**
* Registers/unregisters sensors based on internal state.
*/
public void updateListening() {
private void updateListening() {
boolean anyListening = false;
for (TriggerSensor s : mSensors) {
s.setListening(mListening);
if (mListening) {
boolean listen = mListening
&& (!s.mRequiresTouchscreen || mListeningTouchScreenSensors);
s.setListening(listen);
if (listen) {
anyListening = true;
}
}
@@ -309,10 +314,14 @@ public class DozeSensors {
/** Dump current state */
public void dump(PrintWriter pw) {
pw.println("mListening=" + mListening);
pw.println("mListeningTouchScreenSensors=" + mListeningTouchScreenSensors);
IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
idpw.increaseIndent();
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

@@ -38,6 +38,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.IndentingPrintWriter;
import com.android.systemui.Dependency;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
@@ -408,15 +409,12 @@ public class DozeTriggers implements DozeMachine.Part {
break;
case DOZE_PULSE_DONE:
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;
case FINISH:
mBroadcastReceiver.unregister(mBroadcastDispatcher);
mDozeHost.removeCallback(mHostCallback);
mDockManager.removeListener(mDockEventListener);
mDozeSensors.setListening(false);
mDozeSensors.setListening(false, false);
mDozeSensors.setProxListening(false);
mWantSensors = false;
mWantProx = false;
@@ -424,20 +422,16 @@ public class DozeTriggers implements DozeMachine.Part {
break;
default:
}
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
}
@Override
public void onScreenState(int state) {
mDozeSensors.onScreenState(state);
if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND
|| state == Display.STATE_OFF) {
mDozeSensors.setProxListening(mWantProx);
mDozeSensors.setListening(mWantSensors);
mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors);
} else {
mDozeSensors.setProxListening(false);
mDozeSensors.setListening(mWantSensors);
}
mDozeSensors.setProxListening(mWantProx && (state == Display.STATE_DOZE
|| state == Display.STATE_DOZE_SUSPEND
|| state == Display.STATE_OFF));
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
}
private void checkTriggersAtInit() {
@@ -513,7 +507,9 @@ public class DozeTriggers implements DozeMachine.Part {
pw.println(" pulsePending=" + mPulsePending);
pw.println("DozeSensors:");
mDozeSensors.dump(pw);
IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
idpw.increaseIndent();
mDozeSensors.dump(idpw);
}
private class TriggerReceiver extends BroadcastReceiver {

View File

@@ -77,8 +77,6 @@ public class DozeSensorsTest extends SysuiTestCase {
@Mock
private Consumer<Boolean> mProxCallback;
@Mock
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
@Mock
private TriggerSensor mTriggerSensor;
@Mock
private DozeLog mDozeLog;
@@ -110,7 +108,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSensorDebounce() {
mDozeSensors.setListening(true);
mDozeSensors.setListening(true, true);
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages();
@@ -128,7 +126,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSetListening_firstTrue_registerSettingsObserver() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true);
mDozeSensors.setListening(true, true);
verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
}
@@ -136,8 +134,8 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true);
mDozeSensors.setListening(true);
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true);
verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
}

View File

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