summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2020-10-20 05:15:50 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-10-20 05:15:50 +0000
commitab8c0dde6f57b35dd1b254660ffb3f8dd84e9424 (patch)
tree6a6f7d6772928a2c24aac4027c98acd802cb3938
parentec72f9996b6d0ed6f427c7e4e9e0459d2814fe84 (diff)
parent550ec7d7040cd2fd3109964df6270b5c7c635b42 (diff)
Merge "Fix that the top process is not cleared after device sleeps"
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java35
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();
+ }
}