diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 2c3d3a0e0a64d..93027c1914ee5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -884,7 +884,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab Assert.isMainThread(); if (mWakeOnFingerprintAcquiredStart && acquireInfo == FINGERPRINT_ACQUIRED_START) { mPowerManager.wakeUp( - SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, + SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_BIOMETRIC, "com.android.systemui.keyguard:FINGERPRINT_ACQUIRED_START"); } for (int i = 0; i < mCallbacks.size(); i++) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 5d21349fce114..5b90ef2bb806a 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -16,7 +16,14 @@ package com.android.systemui.doze; +import static android.os.PowerManager.WAKE_REASON_BIOMETRIC; +import static android.os.PowerManager.WAKE_REASON_GESTURE; +import static android.os.PowerManager.WAKE_REASON_LIFT; +import static android.os.PowerManager.WAKE_REASON_PLUGGED_IN; +import static android.os.PowerManager.WAKE_REASON_TAP; + import android.annotation.IntDef; +import android.os.PowerManager; import android.util.TimeUtils; import androidx.annotation.NonNull; @@ -511,6 +518,25 @@ public class DozeLog implements Dumpable { } } + /** + * Converts {@link Reason} to {@link PowerManager.WakeReason}. + */ + public static @PowerManager.WakeReason int getPowerManagerWakeReason(@Reason int wakeReason) { + switch (wakeReason) { + case REASON_SENSOR_DOUBLE_TAP: + case REASON_SENSOR_TAP: + return WAKE_REASON_TAP; + case REASON_SENSOR_PICKUP: + return WAKE_REASON_LIFT; + case REASON_SENSOR_UDFPS_LONG_PRESS: + return WAKE_REASON_BIOMETRIC; + case PULSE_REASON_DOCKING: + return WAKE_REASON_PLUGGED_IN; + default: + return WAKE_REASON_GESTURE; + } + } + @Retention(RetentionPolicy.SOURCE) @IntDef({PULSE_REASON_NONE, PULSE_REASON_INTENT, PULSE_REASON_NOTIFICATION, PULSE_REASON_SENSOR_SIGMOTION, REASON_SENSOR_PICKUP, REASON_SENSOR_DOUBLE_TAP, diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index f8bd1e712b1b9..ba38ab0583d4d 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -116,8 +116,8 @@ public class DozeService extends DreamService @Override public void requestWakeUp(@DozeLog.Reason int reason) { - PowerManager pm = getSystemService(PowerManager.class); - pm.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, + final PowerManager pm = getSystemService(PowerManager.class); + pm.wakeUp(SystemClock.uptimeMillis(), DozeLog.getPowerManagerWakeReason(reason), "com.android.systemui:NODOZE " + DozeLog.reasonToString(reason)); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index d773c0103c931..5c1ddd601f966 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -19,6 +19,7 @@ package com.android.systemui.shade; import android.app.StatusBarManager; import android.media.AudioManager; import android.media.session.MediaSessionLegacyHelper; +import android.os.PowerManager; import android.os.SystemClock; import android.util.Log; import android.view.GestureDetector; @@ -238,7 +239,9 @@ public class NotificationShadeWindowViewController { () -> mService.wakeUpIfDozing( SystemClock.uptimeMillis(), mView, - "LOCK_ICON_TOUCH")); + "LOCK_ICON_TOUCH", + PowerManager.WAKE_REASON_GESTURE) + ); // In case we start outside of the view bounds (below the status bar), we need to // dispatch diff --git a/packages/SystemUI/src/com/android/systemui/shade/PulsingGestureListener.kt b/packages/SystemUI/src/com/android/systemui/shade/PulsingGestureListener.kt index bf622c941abb7..db700650e46c0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/PulsingGestureListener.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/PulsingGestureListener.kt @@ -17,6 +17,7 @@ package com.android.systemui.shade import android.hardware.display.AmbientDisplayConfiguration +import android.os.PowerManager import android.os.SystemClock import android.os.UserHandle import android.provider.Settings @@ -89,7 +90,8 @@ class PulsingGestureListener @Inject constructor( centralSurfaces.wakeUpIfDozing( SystemClock.uptimeMillis(), notificationShadeWindowView, - "PULSING_SINGLE_TAP" + "PULSING_SINGLE_TAP", + PowerManager.WAKE_REASON_TAP ) } return true @@ -114,7 +116,9 @@ class PulsingGestureListener @Inject constructor( centralSurfaces.wakeUpIfDozing( SystemClock.uptimeMillis(), notificationShadeWindowView, - "PULSING_DOUBLE_TAP") + "PULSING_DOUBLE_TAP", + PowerManager.WAKE_REASON_TAP + ) return true } return false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index b8302d706e8d8..905cc3fc71e09 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -5,6 +5,7 @@ import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context import android.content.res.Configuration +import android.os.PowerManager import android.os.SystemClock import android.util.IndentingPrintWriter import android.util.MathUtils @@ -272,7 +273,12 @@ class LockscreenShadeTransitionController @Inject constructor( // Bind the click listener of the shelf to go to the full shade notificationShelfController.setOnClickListener { if (statusBarStateController.state == StatusBarState.KEYGUARD) { - centralSurfaces.wakeUpIfDozing(SystemClock.uptimeMillis(), it, "SHADE_CLICK") + centralSurfaces.wakeUpIfDozing( + SystemClock.uptimeMillis(), + it, + "SHADE_CLICK", + PowerManager.WAKE_REASON_GESTURE, + ) goToLockedShade(it) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index 80a891319f6c3..8f9365cd4dc46 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java @@ -24,6 +24,7 @@ import android.app.RemoteInput; import android.content.Context; import android.content.Intent; import android.content.pm.UserInfo; +import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -64,6 +65,8 @@ import com.android.systemui.statusbar.policy.RemoteInputView; import com.android.systemui.util.DumpUtilsKt; import com.android.systemui.util.ListenerSet; +import dagger.Lazy; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -71,8 +74,6 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; -import dagger.Lazy; - /** * Class for handling remote input state over a set of notifications. This class handles things * like keeping notifications temporarily that were cancelled as a response to a remote input @@ -120,7 +121,8 @@ public class NotificationRemoteInputManager implements Dumpable { View view, PendingIntent pendingIntent, RemoteViews.RemoteResponse response) { mCentralSurfacesOptionalLazy.get().ifPresent( centralSurfaces -> centralSurfaces.wakeUpIfDozing( - SystemClock.uptimeMillis(), view, "NOTIFICATION_CLICK")); + SystemClock.uptimeMillis(), view, "NOTIFICATION_CLICK", + PowerManager.WAKE_REASON_GESTURE)); final NotificationEntry entry = getNotificationForParent(view.getParent()); mLogger.logInitialClick(entry, pendingIntent); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index c630feba1dcb9..976924a2159db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -22,7 +22,6 @@ import android.animation.ValueAnimator import android.content.Context import android.content.res.Configuration import android.os.PowerManager -import android.os.PowerManager.WAKE_REASON_GESTURE import android.os.SystemClock import android.util.IndentingPrintWriter import android.view.MotionEvent @@ -249,7 +248,7 @@ constructor( } if (statusBarStateController.isDozing) { wakeUpCoordinator.willWakeUp = true - mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE, + mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:PULSEDRAG") } lockscreenShadeTransitionController.goToLockedShade(startingChild, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java index c3ce593b54fdf..705cf92ee8699 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification; import android.app.Notification; +import android.os.PowerManager; import android.os.SystemClock; import android.service.notification.StatusBarNotification; import android.util.Log; @@ -70,7 +71,8 @@ public final class NotificationClicker implements View.OnClickListener { } mCentralSurfacesOptional.ifPresent(centralSurfaces -> centralSurfaces.wakeUpIfDozing( - SystemClock.uptimeMillis(), v, "NOTIFICATION_CLICK")); + SystemClock.uptimeMillis(), v, "NOTIFICATION_CLICK", + PowerManager.WAKE_REASON_GESTURE)); final ExpandableNotificationRow row = (ExpandableNotificationRow) v; final NotificationEntry entry = row.getEntry(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 5e98f5419e84a..895a2934ec1bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -429,7 +429,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp Runnable wakeUp = ()-> { if (!wasDeviceInteractive || mUpdateMonitor.isDreaming()) { mLogger.i("bio wakelock: Authenticated, waking up..."); - mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, + mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_BIOMETRIC, "android.policy:BIOMETRIC"); } Trace.beginSection("release wake-and-unlock"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 8d06fad0f418a..4d0ad405835a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.PowerManager; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.view.KeyEvent; @@ -203,7 +204,10 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn @Override Lifecycle getLifecycle(); - void wakeUpIfDozing(long time, View where, String why); + /** + * Wakes up the device if the device was dozing. + */ + void wakeUpIfDozing(long time, View where, String why, @PowerManager.WakeReason int wakeReason); NotificationShadeWindowView getNotificationShadeWindowView(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 1fcfe4ef2f889..198572a51760e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -899,8 +899,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mKeyguardIndicationController.init(); mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener); - mStatusBarStateController.addCallback(mStateListener, - SysuiStatusBarStateController.RANK_STATUS_BAR); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); @@ -1519,10 +1517,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * @param why the reason for the wake up */ @Override - public void wakeUpIfDozing(long time, View where, String why) { + public void wakeUpIfDozing(long time, View where, String why, + @PowerManager.WakeReason int wakeReason) { if (mDozing && mScreenOffAnimationController.allowWakeUpIfDozing()) { mPowerManager.wakeUp( - time, PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:" + why); + time, wakeReason, "com.android.systemui:" + why); mWakeUpComingFromTouch = true; mFalsingCollector.onScreenOnFromTouch(); } @@ -1599,6 +1598,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { protected void startKeyguard() { Trace.beginSection("CentralSurfaces#startKeyguard"); + mStatusBarStateController.addCallback(mStateListener, + SysuiStatusBarStateController.RANK_STATUS_BAR); mBiometricUnlockController = mBiometricUnlockControllerLazy.get(); mBiometricUnlockController.addBiometricModeListener( new BiometricUnlockController.BiometricModeListener() { @@ -3379,7 +3380,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarHideIconsForBouncerManager.setBouncerShowingAndTriggerUpdate(bouncerShowing); mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */); if (mBouncerShowing) { - wakeUpIfDozing(SystemClock.uptimeMillis(), null, "BOUNCER_VISIBLE"); + wakeUpIfDozing(SystemClock.uptimeMillis(), null, "BOUNCER_VISIBLE", + PowerManager.WAKE_REASON_GESTURE); } updateScrimController(); if (!mBouncerShowing) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index a1e0c5067ef33..da1c361bced76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.phone.CentralSurfaces.MULTIUSER_DEB import android.app.KeyguardManager; import android.content.Context; +import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -270,7 +271,8 @@ class StatusBarNotificationPresenter implements NotificationPresenter, boolean nowExpanded) { mHeadsUpManager.setExpanded(clickedEntry, nowExpanded); mCentralSurfaces.wakeUpIfDozing( - SystemClock.uptimeMillis(), clickedView, "NOTIFICATION_CLICK"); + SystemClock.uptimeMillis(), clickedView, "NOTIFICATION_CLICK", + PowerManager.WAKE_REASON_GESTURE); if (nowExpanded) { if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mShadeTransitionController.goToLockedShade(clickedEntry.getRow()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt index 43c694245ebad..3e769e94b6add 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt @@ -21,6 +21,7 @@ import android.provider.Settings.Secure.DOZE_DOUBLE_TAP_GESTURE import android.provider.Settings.Secure.DOZE_TAP_SCREEN_GESTURE import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper +import android.os.PowerManager import android.view.MotionEvent import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -36,9 +37,9 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyLong -import org.mockito.ArgumentMatchers.anyObject import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito.never @@ -106,7 +107,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onSingleTapUp(upEv) // THEN wake up device if dozing - verify(centralSurfaces).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces).wakeUpIfDozing( + anyLong(), any(), anyString(), eq(PowerManager.WAKE_REASON_TAP)) } @Test @@ -125,7 +127,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onDoubleTapEvent(upEv) // THEN wake up device if dozing - verify(centralSurfaces).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces).wakeUpIfDozing( + anyLong(), any(), anyString(), eq(PowerManager.WAKE_REASON_TAP)) } @Test @@ -156,7 +159,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onSingleTapUp(upEv) // THEN the device doesn't wake up - verify(centralSurfaces, never()).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces, never()).wakeUpIfDozing( + anyLong(), any(), anyString(), anyInt()) } @Test @@ -203,7 +207,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onDoubleTapEvent(upEv) // THEN the device doesn't wake up - verify(centralSurfaces, never()).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces, never()).wakeUpIfDozing( + anyLong(), any(), anyString(), anyInt()) } @Test @@ -222,7 +227,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onSingleTapUp(upEv) // THEN the device doesn't wake up - verify(centralSurfaces, never()).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces, never()).wakeUpIfDozing( + anyLong(), any(), anyString(), anyInt()) } @Test @@ -241,7 +247,8 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest.onDoubleTapEvent(upEv) // THEN the device doesn't wake up - verify(centralSurfaces, never()).wakeUpIfDozing(anyLong(), anyObject(), anyString()) + verify(centralSurfaces, never()).wakeUpIfDozing( + anyLong(), any(), anyString(), anyInt()) } fun updateSettings() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index ae60c73b89b9d..09254ad0faf23 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -31,6 +31,7 @@ import static junit.framework.TestCase.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; @@ -176,6 +177,8 @@ import com.android.systemui.volume.VolumeComponent; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.startingsurface.StartingSurface; +import dagger.Lazy; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -188,8 +191,6 @@ import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.util.Optional; -import dagger.Lazy; - @SmallTest @RunWith(AndroidTestingRunner.class) @RunWithLooper(setAsMainLooper = true) @@ -304,6 +305,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { @Mock private ViewRootImpl mViewRootImpl; @Mock private WindowOnBackInvokedDispatcher mOnBackInvokedDispatcher; @Captor private ArgumentCaptor mOnBackInvokedCallback; + @Mock IPowerManager mPowerManagerService; private ShadeController mShadeController; private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); @@ -317,9 +319,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase { public void setup() throws Exception { MockitoAnnotations.initMocks(this); - IPowerManager powerManagerService = mock(IPowerManager.class); IThermalService thermalService = mock(IThermalService.class); - mPowerManager = new PowerManager(mContext, powerManagerService, thermalService, + mPowerManager = new PowerManager(mContext, mPowerManagerService, thermalService, Handler.createAsync(Looper.myLooper())); mNotificationInterruptStateProvider = @@ -361,7 +362,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { when(mStackScrollerController.getView()).thenReturn(mStackScroller); when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0)); when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0)); - when(powerManagerService.isInteractive()).thenReturn(true); + when(mPowerManagerService.isInteractive()).thenReturn(true); when(mStackScroller.getActivatedChild()).thenReturn(null); doAnswer(invocation -> { @@ -1186,6 +1187,34 @@ public class CentralSurfacesImplTest extends SysuiTestCase { verify(mStatusBarStateController).setState(SHADE); } + @Test + public void dozing_wakeUp() throws RemoteException { + // GIVEN can wakeup when dozing & is dozing + when(mScreenOffAnimationController.allowWakeUpIfDozing()).thenReturn(true); + setDozing(true); + + // WHEN wakeup is requested + final int wakeReason = PowerManager.WAKE_REASON_TAP; + mCentralSurfaces.wakeUpIfDozing(0, null, "", wakeReason); + + // THEN power manager receives wakeup + verify(mPowerManagerService).wakeUp(eq(0L), eq(wakeReason), anyString(), anyString()); + } + + @Test + public void notDozing_noWakeUp() throws RemoteException { + // GIVEN can wakeup when dozing and NOT dozing + when(mScreenOffAnimationController.allowWakeUpIfDozing()).thenReturn(true); + setDozing(false); + + // WHEN wakeup is requested + final int wakeReason = PowerManager.WAKE_REASON_TAP; + mCentralSurfaces.wakeUpIfDozing(0, null, "", wakeReason); + + // THEN power manager receives wakeup + verify(mPowerManagerService, never()).wakeUp(anyLong(), anyInt(), anyString(), anyString()); + } + /** * Configures the appropriate mocks and then calls {@link CentralSurfacesImpl#updateIsKeyguard} * to reconfigure the keyguard to reflect the requested showing/occluded states. @@ -1222,6 +1251,13 @@ public class CentralSurfacesImplTest extends SysuiTestCase { states); } + private void setDozing(boolean isDozing) { + ArgumentCaptor callbackCaptor = + ArgumentCaptor.forClass(StatusBarStateController.StateListener.class); + verify(mStatusBarStateController).addCallback(callbackCaptor.capture(), anyInt()); + callbackCaptor.getValue().onDozingChanged(isDozing); + } + public static class TestableNotificationInterruptStateProviderImpl extends NotificationInterruptStateProviderImpl {