Merge "Plumb through the reason for wakeup from Doze." into tm-qpr-dev

This commit is contained in:
Chandru S
2022-09-01 16:37:18 +00:00
committed by Android (Google) Code Review
8 changed files with 54 additions and 43 deletions

View File

@@ -269,9 +269,10 @@ public class DozeMachine {
return mPulseReason; return mPulseReason;
} }
/** Requests the PowerManager to wake up now. */ /** Requests the PowerManager to wake up now.
public void wakeUp() { * @param reason {@link DozeLog.Reason} that woke up the device.*/
mDozeService.requestWakeUp(); public void wakeUp(@DozeLog.Reason int reason) {
mDozeService.requestWakeUp(reason);
} }
public boolean isExecutingTransition() { public boolean isExecutingTransition() {
@@ -469,7 +470,7 @@ public class DozeMachine {
void setDozeScreenState(int state); void setDozeScreenState(int state);
/** Request waking up. */ /** Request waking up. */
void requestWakeUp(); void requestWakeUp(@DozeLog.Reason int reason);
/** Set screen brightness */ /** Set screen brightness */
void setDozeScreenBrightness(int brightness); void setDozeScreenBrightness(int brightness);
@@ -492,8 +493,8 @@ public class DozeMachine {
} }
@Override @Override
public void requestWakeUp() { public void requestWakeUp(@DozeLog.Reason int reason) {
mDelegate.requestWakeUp(); mDelegate.requestWakeUp(reason);
} }
@Override @Override

View File

@@ -113,10 +113,10 @@ public class DozeService extends DreamService
} }
@Override @Override
public void requestWakeUp() { public void requestWakeUp(@DozeLog.Reason int reason) {
PowerManager pm = getSystemService(PowerManager.class); PowerManager pm = getSystemService(PowerManager.class);
pm.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, pm.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE,
"com.android.systemui:NODOZE"); "com.android.systemui:NODOZE " + DozeLog.reasonToString(reason));
} }
@Override @Override

View File

@@ -16,6 +16,8 @@
package com.android.systemui.doze; package com.android.systemui.doze;
import static android.app.StatusBarManager.SESSION_KEYGUARD;
import static com.android.systemui.doze.DozeMachine.State.DOZE_SUSPEND_TRIGGERS; import static com.android.systemui.doze.DozeMachine.State.DOZE_SUSPEND_TRIGGERS;
import static com.android.systemui.doze.DozeMachine.State.FINISH; import static com.android.systemui.doze.DozeMachine.State.FINISH;
import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED; import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
@@ -34,19 +36,19 @@ import android.util.Log;
import android.view.Display; import android.view.Display;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthController;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager;
import com.android.systemui.doze.DozeMachine.State; import com.android.systemui.doze.DozeMachine.State;
import com.android.systemui.doze.dagger.DozeScope; import com.android.systemui.doze.dagger.DozeScope;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.statusbar.policy.DevicePostureController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.Assert; import com.android.systemui.util.Assert;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.sensors.AsyncSensorManager; import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximityCheck; import com.android.systemui.util.sensors.ProximityCheck;
import com.android.systemui.util.sensors.ProximitySensor; import com.android.systemui.util.sensors.ProximitySensor;
@@ -80,6 +82,7 @@ public class DozeTriggers implements DozeMachine.Part {
private static final int PROXIMITY_TIMEOUT_DELAY_MS = 500; private static final int PROXIMITY_TIMEOUT_DELAY_MS = 500;
private final Context mContext; private final Context mContext;
private final SessionTracker mSessionTracker;
private DozeMachine mMachine; private DozeMachine mMachine;
private final DozeLog mDozeLog; private final DozeLog mDozeLog;
private final DozeSensors mDozeSensors; private final DozeSensors mDozeSensors;
@@ -95,10 +98,8 @@ public class DozeTriggers implements DozeMachine.Part {
private final ProximityCheck mProxCheck; private final ProximityCheck mProxCheck;
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
private final AuthController mAuthController; private final AuthController mAuthController;
private final DelayableExecutor mMainExecutor;
private final KeyguardStateController mKeyguardStateController; private final KeyguardStateController mKeyguardStateController;
private final UiEventLogger mUiEventLogger; private final UiEventLogger mUiEventLogger;
private final DevicePostureController mDevicePostureController;
private long mNotificationPulseTime; private long mNotificationPulseTime;
private boolean mPulsePending; private boolean mPulsePending;
@@ -185,8 +186,8 @@ public class DozeTriggers implements DozeMachine.Part {
ProximityCheck proxCheck, ProximityCheck proxCheck,
DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher, DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher,
SecureSettings secureSettings, AuthController authController, SecureSettings secureSettings, AuthController authController,
@Main DelayableExecutor mainExecutor,
UiEventLogger uiEventLogger, UiEventLogger uiEventLogger,
SessionTracker sessionTracker,
KeyguardStateController keyguardStateController, KeyguardStateController keyguardStateController,
DevicePostureController devicePostureController) { DevicePostureController devicePostureController) {
mContext = context; mContext = context;
@@ -196,8 +197,8 @@ public class DozeTriggers implements DozeMachine.Part {
mSensorManager = sensorManager; mSensorManager = sensorManager;
mWakeLock = wakeLock; mWakeLock = wakeLock;
mAllowPulseTriggers = true; mAllowPulseTriggers = true;
mSessionTracker = sessionTracker;
mDevicePostureController = devicePostureController;
mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters,
config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor, config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor,
secureSettings, authController, devicePostureController); secureSettings, authController, devicePostureController);
@@ -206,14 +207,9 @@ public class DozeTriggers implements DozeMachine.Part {
mDozeLog = dozeLog; mDozeLog = dozeLog;
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mAuthController = authController; mAuthController = authController;
mMainExecutor = mainExecutor;
mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
} }
private final DevicePostureController.Callback mDevicePostureCallback =
posture -> {
};
@Override @Override
public void setDozeMachine(DozeMachine dozeMachine) { public void setDozeMachine(DozeMachine dozeMachine) {
@@ -271,7 +267,7 @@ public class DozeTriggers implements DozeMachine.Part {
mProxCheck.check(PROXIMITY_TIMEOUT_DELAY_MS, near -> { mProxCheck.check(PROXIMITY_TIMEOUT_DELAY_MS, near -> {
final long end = SystemClock.uptimeMillis(); final long end = SystemClock.uptimeMillis();
mDozeLog.traceProximityResult( mDozeLog.traceProximityResult(
near == null ? false : near, near != null && near,
end - start, end - start,
reason); reason);
callback.accept(near); callback.accept(near);
@@ -354,17 +350,17 @@ public class DozeTriggers implements DozeMachine.Part {
return mKeyguardStateController.isOccluded(); return mKeyguardStateController.isOccluded();
} }
private void gentleWakeUp(int reason) { private void gentleWakeUp(@DozeLog.Reason int reason) {
// Log screen wake up reason (lift/pickup, tap, double-tap) // Log screen wake up reason (lift/pickup, tap, double-tap)
Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason)) Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
.ifPresent(mUiEventLogger::log); .ifPresent(uiEventEnum -> mUiEventLogger.log(uiEventEnum, getKeyguardSessionId()));
if (mDozeParameters.getDisplayNeedsBlanking()) { if (mDozeParameters.getDisplayNeedsBlanking()) {
// Let's prepare the display to wake-up by drawing black. // Let's prepare the display to wake-up by drawing black.
// This will cover the hardware wake-up sequence, where the display // This will cover the hardware wake-up sequence, where the display
// becomes black for a few frames. // becomes black for a few frames.
mDozeHost.setAodDimmingScrim(1f); mDozeHost.setAodDimmingScrim(1f);
} }
mMachine.wakeUp(); mMachine.wakeUp(reason);
} }
private void onProximityFar(boolean far) { private void onProximityFar(boolean far) {
@@ -384,11 +380,10 @@ public class DozeTriggers implements DozeMachine.Part {
if (state == DozeMachine.State.DOZE_PULSING if (state == DozeMachine.State.DOZE_PULSING
|| state == DozeMachine.State.DOZE_PULSING_BRIGHT) { || state == DozeMachine.State.DOZE_PULSING_BRIGHT) {
boolean ignoreTouch = near;
if (DEBUG) { if (DEBUG) {
Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch); Log.i(TAG, "Prox changed, ignore touch = " + near);
} }
mDozeHost.onIgnoreTouchWhilePulsing(ignoreTouch); mDozeHost.onIgnoreTouchWhilePulsing(near);
} }
if (far && (paused || pausing)) { if (far && (paused || pausing)) {
@@ -424,7 +419,8 @@ public class DozeTriggers implements DozeMachine.Part {
mMachine.requestState(DozeMachine.State.DOZE_AOD); mMachine.requestState(DozeMachine.State.DOZE_AOD);
// Log sensor triggered // Log sensor triggered
Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason)) Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
.ifPresent(mUiEventLogger::log); .ifPresent(uiEventEnum ->
mUiEventLogger.log(uiEventEnum, getKeyguardSessionId()));
} }
}, false /* alreadyPerformedProxCheck */, reason); }, false /* alreadyPerformedProxCheck */, reason);
} else { } else {
@@ -564,7 +560,7 @@ public class DozeTriggers implements DozeMachine.Part {
// Logs request pulse reason on AOD screen. // Logs request pulse reason on AOD screen.
Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason)) Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
.ifPresent(mUiEventLogger::log); .ifPresent(uiEventEnum -> mUiEventLogger.log(uiEventEnum, getKeyguardSessionId()));
} }
private boolean canPulse() { private boolean canPulse() {
@@ -583,6 +579,11 @@ public class DozeTriggers implements DozeMachine.Part {
mMachine.requestPulse(reason); mMachine.requestPulse(reason);
} }
@Nullable
private InstanceId getKeyguardSessionId() {
return mSessionTracker.getSessionId(SESSION_KEYGUARD);
}
@Override @Override
public void dump(PrintWriter pw) { public void dump(PrintWriter pw) {
pw.println(" mAodInterruptRunnable=" + mAodInterruptRunnable); pw.println(" mAodInterruptRunnable=" + mAodInterruptRunnable);

View File

@@ -448,7 +448,7 @@ public class DozeMachineTest extends SysuiTestCase {
@Test @Test
public void testWakeUp_wakesUp() { public void testWakeUp_wakesUp() {
mMachine.wakeUp(); mMachine.wakeUp(DozeLog.REASON_SENSOR_PICKUP);
assertTrue(mServiceFake.requestedWakeup); assertTrue(mServiceFake.requestedWakeup);
} }

View File

@@ -75,9 +75,9 @@ public class DozeScreenStatePreventingAdapterTest extends SysuiTestCase {
} }
@Test @Test
public void forwards_requestWakeUp() throws Exception { public void forwards_requestWakeUp() {
mWrapper.requestWakeUp(); mWrapper.requestWakeUp(DozeLog.REASON_SENSOR_PICKUP);
verify(mInner).requestWakeUp(); verify(mInner).requestWakeUp(DozeLog.REASON_SENSOR_PICKUP);
} }
@Test @Test

View File

@@ -48,7 +48,7 @@ public class DozeServiceFake implements DozeMachine.Service {
} }
@Override @Override
public void requestWakeUp() { public void requestWakeUp(@DozeLog.Reason int reason) {
requestedWakeup = true; requestedWakeup = true;
} }

View File

@@ -81,9 +81,9 @@ public class DozeSuspendScreenStatePreventingAdapterTest extends SysuiTestCase {
} }
@Test @Test
public void forwards_requestWakeUp() throws Exception { public void forwards_requestWakeUp() {
mWrapper.requestWakeUp(); mWrapper.requestWakeUp(DozeLog.REASON_SENSOR_PICKUP);
verify(mInner).requestWakeUp(); verify(mInner).requestWakeUp(DozeLog.REASON_SENSOR_PICKUP);
} }
@Test @Test

View File

@@ -32,6 +32,7 @@ import static org.mockito.Mockito.spy;
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.StatusBarManager;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.AmbientDisplayConfiguration;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
@@ -40,12 +41,14 @@ import android.view.Display;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthController;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager;
import com.android.systemui.doze.DozeTriggers.DozingUpdateUiEvent; import com.android.systemui.doze.DozeTriggers.DozingUpdateUiEvent;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.statusbar.policy.DevicePostureController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -92,12 +95,14 @@ public class DozeTriggersTest extends SysuiTestCase {
private KeyguardStateController mKeyguardStateController; private KeyguardStateController mKeyguardStateController;
@Mock @Mock
private DevicePostureController mDevicePostureController; private DevicePostureController mDevicePostureController;
@Mock
private SessionTracker mSessionTracker;
private DozeTriggers mTriggers; private DozeTriggers mTriggers;
private FakeSensorManager mSensors; private FakeSensorManager mSensors;
private Sensor mTapSensor; private Sensor mTapSensor;
private FakeProximitySensor mProximitySensor; private FakeProximitySensor mProximitySensor;
private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -123,14 +128,14 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers = new DozeTriggers(mContext, mHost, config, dozeParameters, mTriggers = new DozeTriggers(mContext, mHost, config, dozeParameters,
asyncSensorManager, wakeLock, mDockManager, mProximitySensor, asyncSensorManager, wakeLock, mDockManager, mProximitySensor,
mProximityCheck, mock(DozeLog.class), mBroadcastDispatcher, new FakeSettings(), mProximityCheck, mock(DozeLog.class), mBroadcastDispatcher, new FakeSettings(),
mAuthController, mExecutor, mUiEventLogger, mKeyguardStateController, mAuthController, mUiEventLogger, mSessionTracker, mKeyguardStateController,
mDevicePostureController); mDevicePostureController);
mTriggers.setDozeMachine(mMachine); mTriggers.setDozeMachine(mMachine);
waitForSensorManager(); waitForSensorManager();
} }
@Test @Test
public void testOnNotification_stillWorksAfterOneFailedProxCheck() throws Exception { public void testOnNotification_stillWorksAfterOneFailedProxCheck() {
when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
ArgumentCaptor<DozeHost.Callback> captor = ArgumentCaptor.forClass(DozeHost.Callback.class); ArgumentCaptor<DozeHost.Callback> captor = ArgumentCaptor.forClass(DozeHost.Callback.class);
doAnswer(invocation -> null).when(mHost).addCallback(captor.capture()); doAnswer(invocation -> null).when(mHost).addCallback(captor.capture());
@@ -216,7 +221,7 @@ public class DozeTriggersTest extends SysuiTestCase {
} }
@Test @Test
public void testProximitySensorNotAvailablel() { public void testProximitySensorNotAvailable() {
mProximitySensor.setSensorAvailable(false); mProximitySensor.setSensorAvailable(false);
mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, 100, 100, null); mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, 100, 100, null);
mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_WAKE_REACH, 100, 100, mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_WAKE_REACH, 100, 100,
@@ -228,6 +233,9 @@ public class DozeTriggersTest extends SysuiTestCase {
public void testQuickPickup() { public void testQuickPickup() {
// GIVEN device is in doze (screen blank, but running doze sensors) // GIVEN device is in doze (screen blank, but running doze sensors)
when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
InstanceId keyguardSessionId = InstanceId.fakeInstanceId(99);
when(mSessionTracker.getSessionId(StatusBarManager.SESSION_KEYGUARD))
.thenReturn(keyguardSessionId);
// WHEN quick pick up is triggered // WHEN quick pick up is triggered
mTriggers.onSensor(DozeLog.REASON_SENSOR_QUICK_PICKUP, 100, 100, null); mTriggers.onSensor(DozeLog.REASON_SENSOR_QUICK_PICKUP, 100, 100, null);
@@ -236,7 +244,8 @@ public class DozeTriggersTest extends SysuiTestCase {
verify(mMachine).requestPulse(anyInt()); verify(mMachine).requestPulse(anyInt());
// THEN a log is taken that quick pick up was triggered // THEN a log is taken that quick pick up was triggered
verify(mUiEventLogger).log(DozingUpdateUiEvent.DOZING_UPDATE_QUICK_PICKUP); verify(mUiEventLogger)
.log(DozingUpdateUiEvent.DOZING_UPDATE_QUICK_PICKUP, keyguardSessionId);
} }
@Test @Test
@@ -249,7 +258,7 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers.onSensor(DozeLog.REASON_SENSOR_PICKUP, 100, 100, null); mTriggers.onSensor(DozeLog.REASON_SENSOR_PICKUP, 100, 100, null);
// THEN wakeup // THEN wakeup
verify(mMachine).wakeUp(); verify(mMachine).wakeUp(DozeLog.REASON_SENSOR_PICKUP);
} }
@Test @Test
@@ -262,7 +271,7 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers.onSensor(DozeLog.REASON_SENSOR_PICKUP, 100, 100, null); mTriggers.onSensor(DozeLog.REASON_SENSOR_PICKUP, 100, 100, null);
// THEN never wakeup // THEN never wakeup
verify(mMachine, never()).wakeUp(); verify(mMachine, never()).wakeUp(DozeLog.REASON_SENSOR_PICKUP);
} }
@Test @Test