diff options
author | 2020-10-20 05:15:50 +0000 | |
---|---|---|
committer | 2020-10-20 05:15:50 +0000 | |
commit | ab8c0dde6f57b35dd1b254660ffb3f8dd84e9424 (patch) | |
tree | 6a6f7d6772928a2c24aac4027c98acd802cb3938 | |
parent | ec72f9996b6d0ed6f427c7e4e9e0459d2814fe84 (diff) | |
parent | 550ec7d7040cd2fd3109964df6270b5c7c635b42 (diff) |
Merge "Fix that the top process is not cleared after device sleeps"
-rw-r--r-- | services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 5 | ||||
-rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java | 35 |
2 files changed, 39 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 48b0b7d27917..99b017f0277f 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -5572,7 +5572,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } void updateTopApp(ActivityRecord topResumedActivity) { - final ActivityRecord top = topResumedActivity != null ? topResumedActivity + // If system is sleeping, use the given record (it should be null) because there won't be + // the next resumed activity. Otherwise the process of pausing activity will keep with top + // state even the activity has paused and stopped. + final ActivityRecord top = mSleeping || topResumedActivity != null ? topResumedActivity // If there is no resumed activity, it will choose the pausing activity. : mRootWindowContainer.getTopResumedActivity(); mTopApp = top != null ? top.app : null; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 3349c6dda87f..8292420c9e0a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -23,20 +23,24 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; import android.app.Activity; +import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.EnterPipRequestedItem; import android.content.res.Configuration; import android.graphics.Rect; import android.os.IBinder; +import android.os.PowerManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.view.IDisplayWindowListener; @@ -252,5 +256,36 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { assertEquals(Task.ActivityState.RESUMED, homeActivity.getState()); assertEquals(homeActivity.app, mAtm.mInternal.getTopApp()); } + + @Test + public void testUpdateSleep() { + doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay(); + mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class); + final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build(); + topActivity.setState(Task.ActivityState.RESUMED, "test"); + + final Runnable assertTopNonSleeping = () -> { + assertFalse(mAtm.mInternal.isSleeping()); + assertEquals(ActivityManager.PROCESS_STATE_TOP, mAtm.mInternal.getTopProcessState()); + assertEquals(topActivity.app, mAtm.mInternal.getTopApp()); + }; + assertTopNonSleeping.run(); + + // Sleep all displays. + mWm.mRoot.forAllDisplays(display -> doReturn(true).when(display).shouldSleep()); + mAtm.updateSleepIfNeededLocked(); + + assertEquals(Task.ActivityState.PAUSING, topActivity.getState()); + assertTrue(mAtm.mInternal.isSleeping()); + assertEquals(ActivityManager.PROCESS_STATE_TOP_SLEEPING, + mAtm.mInternal.getTopProcessState()); + assertNull(mAtm.mInternal.getTopApp()); + + // Wake all displays. + mWm.mRoot.forAllDisplays(display -> doReturn(false).when(display).shouldSleep()); + mAtm.updateSleepIfNeededLocked(); + + assertTopNonSleeping.run(); + } } |