diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index 490890f263aa4..ae7d82ac4a5e2 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -199,6 +199,12 @@ public class DozeMachine { requestState(State.DOZE_REQUEST_PULSE, pulseReason); } + void onScreenState(int state) { + for (Part part : mParts) { + part.onScreenState(state); + } + } + private void requestState(State requestedState, int pulseReason) { Assert.isMainThread(); if (DEBUG) { @@ -423,6 +429,9 @@ public class DozeMachine { /** Give the Part a chance to clean itself up. */ default void destroy() {} + + /** Alerts that the screenstate is being changed. */ + default void onScreenState(int state) {} } /** A wrapper interface for {@link android.service.dreams.DreamService} */ diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index f6fccc00bf999..8a1b68ddda7d2 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -29,6 +29,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.provider.Settings; +import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.broadcast.BroadcastDispatcher; @@ -68,6 +69,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi * --ei brightness_bucket 1} */ private int mDebugBrightnessBucket = -1; + private DozeMachine.State mState; @VisibleForTesting public DozeScreenBrightness(Context context, DozeMachine.Service service, @@ -107,17 +109,10 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi @Override public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { + mState = newState; switch (newState) { case INITIALIZED: - resetBrightnessToDefault(); - break; - case DOZE_AOD: - case DOZE_REQUEST_PULSE: - case DOZE_AOD_DOCKED: - setLightSensorEnabled(true); - break; case DOZE: - setLightSensorEnabled(false); resetBrightnessToDefault(); break; case FINISH: @@ -130,6 +125,16 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi } } + @Override + public void onScreenState(int state) { + if (mState == DozeMachine.State.FINISH && !mScreenOff + && (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND)) { + setLightSensorEnabled(true); + } else { + setLightSensorEnabled(false); + } + } + private void onDestroy() { setLightSensorEnabled(false); if (mDebuggable) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 24e1ce0b4b18b..8a23dcf25cd4c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -66,7 +66,6 @@ public class DozeSensors { private final AlarmManager mAlarmManager; private final AsyncSensorManager mSensorManager; private final ContentResolver mResolver; - private final TriggerSensor mPickupSensor; private final DozeParameters mDozeParameters; private final AmbientDisplayConfiguration mConfig; private final WakeLock mWakeLock; @@ -80,7 +79,6 @@ public class DozeSensors { private long mDebounceFrom; private boolean mSettingRegistered; private boolean mListening; - private boolean mPaused; @VisibleForTesting public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum { @@ -121,7 +119,7 @@ public class DozeSensors { dozeParameters.getPulseOnSigMotion(), DozeLog.PULSE_REASON_SENSOR_SIGMOTION, false /* touchCoords */, false /* touchscreen */, dozeLog), - mPickupSensor = new TriggerSensor( + new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE), Settings.Secure.DOZE_PICK_UP_GESTURE, true /* settingDef */, @@ -231,18 +229,6 @@ public class DozeSensors { 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(); - } - /** * Registers/unregisters sensors based on internal state. */ @@ -304,10 +290,6 @@ public class DozeSensors { } }; - public void setDisableSensorsInterferingWithProximity(boolean disable) { - mPickupSensor.setDisabled(disable); - } - /** Ignore the setting value of only the sensors that require the touchscreen. */ public void ignoreTouchScreenSensorsSettingInterferingWithDocking(boolean ignore) { for (TriggerSensor sensor : mSensors) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index 529b016aaca6a..d2bebb7b27d14 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -130,4 +130,10 @@ public class DozeService extends DreamService mDozeMachine.requestState(DozeMachine.State.DOZE); } } + + @Override + public void setDozeScreenState(int state) { + super.setDozeScreenState(state); + mDozeMachine.onScreenState(state); + } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 15b0b7dfac3d9..2ce66bb0e953f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -31,6 +31,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.text.format.Formatter; import android.util.Log; +import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; @@ -93,6 +94,9 @@ public class DozeTriggers implements DozeMachine.Part { private boolean mPulsePending; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); + private boolean mWantProx; + private boolean mWantSensors; + private boolean mWantTouchScreenSensors; @VisibleForTesting public enum DozingUpdateUiEvent implements UiEventLogger.UiEventEnum { @@ -384,24 +388,22 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE: case DOZE_AOD: - mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); - mDozeSensors.setListening(true); - mDozeSensors.setPaused(false); + mWantProx = newState != DozeMachine.State.DOZE; + mWantSensors = true; + mWantTouchScreenSensors = true; if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) { onWakeScreen(false, newState); } break; case DOZE_AOD_PAUSED: case DOZE_AOD_PAUSING: - mDozeSensors.setProxListening(true); - mDozeSensors.setPaused(true); + mWantProx = true; break; case DOZE_PULSING: case DOZE_PULSING_BRIGHT: case DOZE_AOD_DOCKED: - mDozeSensors.setTouchscreenSensorsListening(false); - mDozeSensors.setProxListening(true); - mDozeSensors.setPaused(false); + mWantProx = true; + mWantTouchScreenSensors = false; break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); @@ -420,6 +422,19 @@ public class DozeTriggers implements DozeMachine.Part { } } + @Override + public void onScreenState(int 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(false); + } + } + private void checkTriggersAtInit() { if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR || mDozeHost.isBlockingDoze() diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java index f535351f0f13d..5288f93dbc38b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java @@ -18,7 +18,6 @@ package com.android.systemui.doze; import static com.android.systemui.doze.DozeMachine.State.DOZE; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD; -import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_DOCKED; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSING; import static com.android.systemui.doze.DozeMachine.State.DOZE_PULSE_DONE; @@ -41,6 +40,7 @@ import android.content.Intent; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; +import android.view.Display; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -89,6 +89,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mSensor.getSensor(), mBroadcastDispatcher, mDozeHost, null /* handler */, DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY, true /* debuggable */); + + mScreen.onScreenState(Display.STATE_ON); } @Test @@ -100,9 +102,11 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { } @Test - public void testAod_usesLightSensor() throws Exception { + public void testAod_usesLightSensor() { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(3); @@ -133,25 +137,12 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { assertEquals(maxBrightness, mServiceFake.screenBrightness); } - @Test - public void testPausingAod_doesntPauseLightSensor() throws Exception { - mScreen.transitionTo(UNINITIALIZED, INITIALIZED); - mScreen.transitionTo(INITIALIZED, DOZE_AOD); - - mSensor.sendSensorEvent(1); - - mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); - mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); - - mSensor.sendSensorEvent(2); - - assertEquals(2, mServiceFake.screenBrightness); - } - @Test public void testPausingAod_doesNotResetBrightness() throws Exception { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(1); @@ -161,17 +152,6 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { assertEquals(1, mServiceFake.screenBrightness); } - @Test - public void testPulsing_usesLightSensor() throws Exception { - mScreen.transitionTo(UNINITIALIZED, INITIALIZED); - mScreen.transitionTo(INITIALIZED, DOZE); - mScreen.transitionTo(DOZE, DOZE_REQUEST_PULSE); - - mSensor.sendSensorEvent(1); - - assertEquals(1, mServiceFake.screenBrightness); - } - @Test public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, @@ -187,16 +167,6 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { verify(mDozeHost).setAodDimmingScrim(eq(0f)); } - @Test - public void testDockedAod_usesLightSensor() { - mScreen.transitionTo(UNINITIALIZED, INITIALIZED); - mScreen.transitionTo(INITIALIZED, DOZE_AOD_DOCKED); - - mSensor.sendSensorEvent(3); - - assertEquals(3, mServiceFake.screenBrightness); - } - @Test public void testDozingAfterPulsing_pausesLightSensor() throws Exception { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); @@ -205,6 +175,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mScreen.transitionTo(DOZE_REQUEST_PULSE, DOZE_PULSING); mScreen.transitionTo(DOZE_PULSING, DOZE_PULSE_DONE); mScreen.transitionTo(DOZE_PULSE_DONE, DOZE); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(1); @@ -239,6 +210,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void testNonPositiveBrightness_keepsPreviousBrightnessAndScrim() throws Exception { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(1); mSensor.sendSensorEvent(0); @@ -248,19 +221,23 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { } @Test - public void pausingAod_unblanksAfterSensor() throws Exception { + public void pausingAod_unblanksAfterSensor() { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(2); - mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); + mScreen.transitionTo(FINISH, DOZE_AOD_PAUSING); mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); mSensor.sendSensorEvent(0); reset(mDozeHost); mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(2); verify(mDozeHost).setAodDimmingScrim(eq(0f)); } @@ -269,9 +246,11 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void pausingAod_unblanksIfSensorWasAlwaysReady() throws Exception { mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + mScreen.onScreenState(Display.STATE_DOZE); mSensor.sendSensorEvent(2); - mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING); + mScreen.transitionTo(FINISH, DOZE_AOD_PAUSING); mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED); reset(mDozeHost); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 2208ac0dcbbd4..539fa07c08fce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -22,7 +22,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -147,21 +146,6 @@ public class DozeSensorsTest extends SysuiTestCase { verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); } - @Test - public void testSetPaused_doesntPause_sensors() { - verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt()); - mDozeSensors.setListening(true); - verify(mTriggerSensor).setListening(eq(true)); - - clearInvocations(mTriggerSensor); - mDozeSensors.setPaused(true); - verify(mTriggerSensor).setListening(eq(true)); - - clearInvocations(mTriggerSensor); - mDozeSensors.setListening(false); - verify(mTriggerSensor).setListening(eq(false)); - } - @Test public void testDestroy() { mDozeSensors.destroy(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 1d2021721634d..eefd7249022c7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -35,6 +35,7 @@ import android.os.Looper; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; +import android.view.Display; import androidx.test.filters.SmallTest; @@ -132,6 +133,7 @@ public class DozeTriggersTest extends SysuiTestCase { when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + mTriggers.onScreenState(Display.STATE_OFF); waitForSensorManager(); verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); @@ -140,6 +142,7 @@ public class DozeTriggersTest extends SysuiTestCase { DozeMachine.State.DOZE_REQUEST_PULSE); mTriggers.transitionTo(DozeMachine.State.DOZE_REQUEST_PULSE, DozeMachine.State.DOZE_PULSING); + mTriggers.onScreenState(Display.STATE_DOZE); waitForSensorManager(); verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor)); @@ -152,10 +155,12 @@ public class DozeTriggersTest extends SysuiTestCase { @Test public void transitionToDockedAod_disablesTouchSensors() { mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + mTriggers.onScreenState(Display.STATE_OFF); waitForSensorManager(); verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.DOZE_AOD_DOCKED); + mTriggers.onScreenState(Display.STATE_DOZE); waitForSensorManager(); verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor));