Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +5 −0 Original line number Diff line number Diff line Loading @@ -2040,6 +2040,11 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityRecord prevTopActivity = mTopResumedActivity; final Task topStack = mRootWindowContainer.getTopDisplayFocusedStack(); if (topStack == null || topStack.mResumedActivity == prevTopActivity) { if (mService.isSleepingLocked()) { // There won't be a next resumed activity. The top process should still be updated // according to the current top focused activity. mService.updateTopApp(null /* topResumedActivity */); } return; } Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +2 −5 Original line number Diff line number Diff line Loading @@ -5547,11 +5547,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } void updateTopApp(ActivityRecord 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. final ActivityRecord top = topResumedActivity != null ? topResumedActivity // If there is no resumed activity, it will choose the pausing or focused activity. : mRootWindowContainer.getTopResumedActivity(); mTopApp = top != null ? top.app : null; } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +1 −6 Original line number Diff line number Diff line Loading @@ -511,6 +511,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> void onChildPositionChanged(WindowContainer child) { mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, !mWmService.mPerDisplayFocusEnabled /* updateInputWindows */); mStackSupervisor.updateTopResumedActivityIfNeeded(); } /** Loading Loading @@ -2626,12 +2627,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> + " in=" + taskDisplayArea); } @Override void positionChildAt(int position, DisplayContent child, boolean includingParents) { super.positionChildAt(position, child, includingParents); mStackSupervisor.updateTopResumedActivityIfNeeded(); } Configuration getDisplayOverrideConfiguration(int displayId) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); if (displayContent == null) { Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +13 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.MockitoSession; import java.util.ArrayList; import java.util.function.Consumer; /** * Tests for the {@link ActivityTaskManagerService} class. Loading Loading @@ -261,15 +262,17 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { public void testUpdateSleep() { doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay(); mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class); final ActivityRecord homeActivity = new ActivityBuilder(mAtm) .setTask(mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()).build(); final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build(); topActivity.setState(Task.ActivityState.RESUMED, "test"); final Runnable assertTopNonSleeping = () -> { final Consumer<ActivityRecord> assertTopNonSleeping = activity -> { assertFalse(mAtm.mInternal.isSleeping()); assertEquals(ActivityManager.PROCESS_STATE_TOP, mAtm.mInternal.getTopProcessState()); assertEquals(topActivity.app, mAtm.mInternal.getTopApp()); assertEquals(activity.app, mAtm.mInternal.getTopApp()); }; assertTopNonSleeping.run(); assertTopNonSleeping.accept(topActivity); // Sleep all displays. mWm.mRoot.forAllDisplays(display -> doReturn(true).when(display).shouldSleep()); Loading @@ -279,13 +282,18 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { assertTrue(mAtm.mInternal.isSleeping()); assertEquals(ActivityManager.PROCESS_STATE_TOP_SLEEPING, mAtm.mInternal.getTopProcessState()); assertNull(mAtm.mInternal.getTopApp()); // The top app should not change while sleeping. assertEquals(topActivity.app, mAtm.mInternal.getTopApp()); // Move the current top to back, the top app should update to the next activity. topActivity.getRootTask().moveToBack("test", null /* self */); assertEquals(homeActivity.app, mAtm.mInternal.getTopApp()); // Wake all displays. mWm.mRoot.forAllDisplays(display -> doReturn(false).when(display).shouldSleep()); mAtm.updateSleepIfNeededLocked(); assertTopNonSleeping.run(); assertTopNonSleeping.accept(homeActivity); } } Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +5 −0 Original line number Diff line number Diff line Loading @@ -2040,6 +2040,11 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityRecord prevTopActivity = mTopResumedActivity; final Task topStack = mRootWindowContainer.getTopDisplayFocusedStack(); if (topStack == null || topStack.mResumedActivity == prevTopActivity) { if (mService.isSleepingLocked()) { // There won't be a next resumed activity. The top process should still be updated // according to the current top focused activity. mService.updateTopApp(null /* topResumedActivity */); } return; } Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +2 −5 Original line number Diff line number Diff line Loading @@ -5547,11 +5547,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } void updateTopApp(ActivityRecord 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. final ActivityRecord top = topResumedActivity != null ? topResumedActivity // If there is no resumed activity, it will choose the pausing or focused activity. : mRootWindowContainer.getTopResumedActivity(); mTopApp = top != null ? top.app : null; } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +1 −6 Original line number Diff line number Diff line Loading @@ -511,6 +511,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> void onChildPositionChanged(WindowContainer child) { mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, !mWmService.mPerDisplayFocusEnabled /* updateInputWindows */); mStackSupervisor.updateTopResumedActivityIfNeeded(); } /** Loading Loading @@ -2626,12 +2627,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> + " in=" + taskDisplayArea); } @Override void positionChildAt(int position, DisplayContent child, boolean includingParents) { super.positionChildAt(position, child, includingParents); mStackSupervisor.updateTopResumedActivityIfNeeded(); } Configuration getDisplayOverrideConfiguration(int displayId) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); if (displayContent == null) { Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +13 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.MockitoSession; import java.util.ArrayList; import java.util.function.Consumer; /** * Tests for the {@link ActivityTaskManagerService} class. Loading Loading @@ -261,15 +262,17 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { public void testUpdateSleep() { doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay(); mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class); final ActivityRecord homeActivity = new ActivityBuilder(mAtm) .setTask(mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()).build(); final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build(); topActivity.setState(Task.ActivityState.RESUMED, "test"); final Runnable assertTopNonSleeping = () -> { final Consumer<ActivityRecord> assertTopNonSleeping = activity -> { assertFalse(mAtm.mInternal.isSleeping()); assertEquals(ActivityManager.PROCESS_STATE_TOP, mAtm.mInternal.getTopProcessState()); assertEquals(topActivity.app, mAtm.mInternal.getTopApp()); assertEquals(activity.app, mAtm.mInternal.getTopApp()); }; assertTopNonSleeping.run(); assertTopNonSleeping.accept(topActivity); // Sleep all displays. mWm.mRoot.forAllDisplays(display -> doReturn(true).when(display).shouldSleep()); Loading @@ -279,13 +282,18 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { assertTrue(mAtm.mInternal.isSleeping()); assertEquals(ActivityManager.PROCESS_STATE_TOP_SLEEPING, mAtm.mInternal.getTopProcessState()); assertNull(mAtm.mInternal.getTopApp()); // The top app should not change while sleeping. assertEquals(topActivity.app, mAtm.mInternal.getTopApp()); // Move the current top to back, the top app should update to the next activity. topActivity.getRootTask().moveToBack("test", null /* self */); assertEquals(homeActivity.app, mAtm.mInternal.getTopApp()); // Wake all displays. mWm.mRoot.forAllDisplays(display -> doReturn(false).when(display).shouldSleep()); mAtm.updateSleepIfNeededLocked(); assertTopNonSleeping.run(); assertTopNonSleeping.accept(homeActivity); } }