Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -4524,6 +4524,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { mCameraGestureTriggered = false; mCameraGestureTriggered = false; } } // Called on the PowerManager's Notifier thread. @Override public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness) { if (wakefulness != globalWakefulness && wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE && groupId == Display.DEFAULT_DISPLAY_GROUP && mKeyguardDelegate != null) { mKeyguardDelegate.doKeyguardTimeout(null); } } // Called on the PowerManager's Notifier thread. // Called on the PowerManager's Notifier thread. @Override @Override public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { Loading services/core/java/com/android/server/policy/WindowManagerPolicy.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -772,6 +772,20 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ */ public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); /** * Called when a particular PowerGroup has changed wakefulness. * * @param groupId The id of the PowerGroup. * @param wakefulness One of PowerManagerInternal.WAKEFULNESS_* indicating the wake state for * the group * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the reason this * group is going to sleep. * @param globalWakefulness The global wakefulness, which may or may not match that of this * group. One of PowerManagerInternal.WAKEFULNESS_* */ void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness); /** /** * Called when the display is about to turn on to show content. * Called when the display is about to turn on to show content. * When waking up, this method will be called once after the call to wakingUp(). * When waking up, this method will be called once after the call to wakingUp(). Loading services/core/java/com/android/server/power/Notifier.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -552,6 +552,15 @@ public class Notifier { } } } } /** * Called when an individual PowerGroup changes wakefulness. */ public void onPowerGroupWakefulnessChanged(int groupId, int groupWakefulness, int changeReason, int globalWakefulness) { mHandler.post(() -> mPolicy.onPowerGroupWakefulnessChanged(groupId, groupWakefulness, changeReason, globalWakefulness)); } /** /** * Called when there has been user activity. * Called when there has been user activity. */ */ Loading services/core/java/com/android/server/power/PowerManagerService.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -674,6 +674,8 @@ public final class PowerManagerService extends SystemService } } mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); mNotifier.onPowerGroupWakefulnessChanged(groupId, wakefulness, reason, getGlobalWakefulnessLocked()); updatePowerStateLocked(); updatePowerStateLocked(); } } } } Loading services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +93 −0 Original line number Original line Diff line number Diff line Loading @@ -1696,6 +1696,99 @@ public class PowerManagerServiceTest { assertThat(mService.getLocalServiceInstance().getLastWakeup()).isEqualTo(initialWakeData); assertThat(mService.getLocalServiceInstance().getLastWakeup()).isEqualTo(initialWakeData); } } @Test public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventFires() { createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); forceSleep(); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); } @Test public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventFiresCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = new AtomicReference<>(); doAnswer((Answer<Void>) invocation -> { listener.set(invocation.getArgument(0)); return null; }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); final DisplayInfo info = new DisplayInfo(); info.displayGroupId = nonDefaultDisplayGroupId; when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, null, null); mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, null, null); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_ASLEEP); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(nonDefaultDisplayGroupId), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); } @Test public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = new AtomicReference<>(); doAnswer((Answer<Void>) invocation -> { listener.set(invocation.getArgument(0)); return null; }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); final DisplayInfo info = new DisplayInfo(); info.displayGroupId = nonDefaultDisplayGroupId; when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); final String pkg = mContextSpy.getOpPackageName(); final Binder token = new Binder(); final String tag = "testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly"; mService.getBinderServiceInstance().acquireWakeLock(token, PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg, null /* workSource */, null /* historyTag */, nonDefaultDisplay, null); forceSleep(); // The wakelock should have kept the second display awake, and we should notify that the // default display went to sleep. assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_AWAKE); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); verify(mNotifierMock, never()).onPowerGroupWakefulnessChanged( eq(nonDefaultDisplayGroupId), anyInt(), anyInt(), anyInt()); } @Test @Test public void testGetFullPowerSavePolicy_returnsStateMachineResult() { public void testGetFullPowerSavePolicy_returnsStateMachineResult() { createService(); createService(); Loading Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -4524,6 +4524,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { mCameraGestureTriggered = false; mCameraGestureTriggered = false; } } // Called on the PowerManager's Notifier thread. @Override public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness) { if (wakefulness != globalWakefulness && wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE && groupId == Display.DEFAULT_DISPLAY_GROUP && mKeyguardDelegate != null) { mKeyguardDelegate.doKeyguardTimeout(null); } } // Called on the PowerManager's Notifier thread. // Called on the PowerManager's Notifier thread. @Override @Override public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { Loading
services/core/java/com/android/server/policy/WindowManagerPolicy.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -772,6 +772,20 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ */ public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); /** * Called when a particular PowerGroup has changed wakefulness. * * @param groupId The id of the PowerGroup. * @param wakefulness One of PowerManagerInternal.WAKEFULNESS_* indicating the wake state for * the group * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the reason this * group is going to sleep. * @param globalWakefulness The global wakefulness, which may or may not match that of this * group. One of PowerManagerInternal.WAKEFULNESS_* */ void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness); /** /** * Called when the display is about to turn on to show content. * Called when the display is about to turn on to show content. * When waking up, this method will be called once after the call to wakingUp(). * When waking up, this method will be called once after the call to wakingUp(). Loading
services/core/java/com/android/server/power/Notifier.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -552,6 +552,15 @@ public class Notifier { } } } } /** * Called when an individual PowerGroup changes wakefulness. */ public void onPowerGroupWakefulnessChanged(int groupId, int groupWakefulness, int changeReason, int globalWakefulness) { mHandler.post(() -> mPolicy.onPowerGroupWakefulnessChanged(groupId, groupWakefulness, changeReason, globalWakefulness)); } /** /** * Called when there has been user activity. * Called when there has been user activity. */ */ Loading
services/core/java/com/android/server/power/PowerManagerService.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -674,6 +674,8 @@ public final class PowerManagerService extends SystemService } } mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); mNotifier.onPowerGroupWakefulnessChanged(groupId, wakefulness, reason, getGlobalWakefulnessLocked()); updatePowerStateLocked(); updatePowerStateLocked(); } } } } Loading
services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +93 −0 Original line number Original line Diff line number Diff line Loading @@ -1696,6 +1696,99 @@ public class PowerManagerServiceTest { assertThat(mService.getLocalServiceInstance().getLastWakeup()).isEqualTo(initialWakeData); assertThat(mService.getLocalServiceInstance().getLastWakeup()).isEqualTo(initialWakeData); } } @Test public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventFires() { createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); forceSleep(); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); } @Test public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventFiresCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = new AtomicReference<>(); doAnswer((Answer<Void>) invocation -> { listener.set(invocation.getArgument(0)); return null; }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); final DisplayInfo info = new DisplayInfo(); info.displayGroupId = nonDefaultDisplayGroupId; when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, null, null); mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, null, null); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_ASLEEP); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(nonDefaultDisplayGroupId), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); } @Test public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = new AtomicReference<>(); doAnswer((Answer<Void>) invocation -> { listener.set(invocation.getArgument(0)); return null; }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); final DisplayInfo info = new DisplayInfo(); info.displayGroupId = nonDefaultDisplayGroupId; when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); final String pkg = mContextSpy.getOpPackageName(); final Binder token = new Binder(); final String tag = "testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly"; mService.getBinderServiceInstance().acquireWakeLock(token, PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg, null /* workSource */, null /* historyTag */, nonDefaultDisplay, null); forceSleep(); // The wakelock should have kept the second display awake, and we should notify that the // default display went to sleep. assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_AWAKE); verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); verify(mNotifierMock, never()).onPowerGroupWakefulnessChanged( eq(nonDefaultDisplayGroupId), anyInt(), anyInt(), anyInt()); } @Test @Test public void testGetFullPowerSavePolicy_returnsStateMachineResult() { public void testGetFullPowerSavePolicy_returnsStateMachineResult() { createService(); createService(); Loading