diff options
| author | 2019-08-28 15:25:19 +0000 | |
|---|---|---|
| committer | 2019-08-28 15:25:19 +0000 | |
| commit | da5a3ac0299e0c9120f74ffb58b68c632e7fbfcc (patch) | |
| tree | 534ee04a5f63d8d98106e90e5a29165343222123 | |
| parent | 09ff08d055236ffbec540861cc9179901aecc08e (diff) | |
| parent | cfe46219cfa5b75e5d444a7b2eedabda78c8b2e0 (diff) | |
Merge "Resuming the restarting activities only if they were on stack top"
3 files changed, 22 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index fc36e9984c1b..7d398a4a1c18 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2918,7 +2918,7 @@ final class ActivityRecord extends ConfigurationContainer { return false; } - boolean handleAlreadyVisible() { + void handleAlreadyVisible() { stopFreezingScreenLocked(false); try { if (returningOptions != null) { @@ -2926,7 +2926,6 @@ final class ActivityRecord extends ConfigurationContainer { } } catch(RemoteException e) { } - return mState == RESUMED; } static void activityResumedLocked(IBinder token) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 8bdedffa581a..699580b2633d 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -2088,7 +2088,7 @@ class ActivityStack extends ConfigurationContainer { boolean aboveTop = top != null; final boolean stackShouldBeVisible = shouldBeVisible(starting); boolean behindFullscreenActivity = !stackShouldBeVisible; - boolean resumeNextActivity = isFocusable() && isInStackLocked(starting) == null; + final boolean resumeTopActivity = isFocusable() && isInStackLocked(starting) == null; for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); final ArrayList<ActivityRecord> activities = task.mActivities; @@ -2122,15 +2122,8 @@ class ActivityStack extends ConfigurationContainer { } if (!r.attachedToProcess()) { - if (makeVisibleAndRestartIfNeeded(starting, configChanges, isTop, - resumeNextActivity, r)) { - if (activityNdx >= activities.size()) { - // Record may be removed if its process needs to restart. - activityNdx = activities.size() - 1; - } else { - resumeNextActivity = false; - } - } + makeVisibleAndRestartIfNeeded(starting, configChanges, isTop, + resumeTopActivity && isTop, r); } else if (r.visible) { // If this activity is already visible, then there is nothing to do here. if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, @@ -2140,10 +2133,7 @@ class ActivityStack extends ConfigurationContainer { r.makeClientVisible(); } - if (r.handleAlreadyVisible()) { - resumeNextActivity = false; - } - + r.handleAlreadyVisible(); if (notifyClients) { r.makeActiveIfNeeded(starting); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 60c5f0bd7188..c83e5cb71feb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -26,6 +26,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -1122,6 +1123,22 @@ public class ActivityStackTests extends ActivityTestsBase { assertThat(result).isEqualTo(taskTop); } + @Test + public void testNonTopVisibleActivityNotResume() { + final ActivityRecord nonTopVisibleActivity = + new ActivityBuilder(mService).setTask(mTask).build(); + new ActivityBuilder(mService).setTask(mTask).build(); + doReturn(false).when(nonTopVisibleActivity).attachedToProcess(); + doReturn(true).when(nonTopVisibleActivity).shouldBeVisibleIgnoringKeyguard(anyBoolean()); + doNothing().when(mSupervisor).startSpecificActivityLocked(any(), anyBoolean(), + anyBoolean()); + + mStack.ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */, + false /* preserveWindows */); + verify(mSupervisor).startSpecificActivityLocked(any(), eq(false) /* andResume */, + anyBoolean()); + } + private void verifyShouldSleepActivities(boolean focusedStack, boolean keyguardGoingAway, boolean displaySleeping, boolean expected) { final ActivityDisplay display = mock(ActivityDisplay.class); |