diff options
4 files changed, 38 insertions, 26 deletions
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 9b9511b15082..3c9086dde021 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -211,12 +211,6 @@ "group": "WM_DEBUG_WINDOW_ORGANIZER", "at": "com\/android\/server\/wm\/TaskOrganizerController.java" }, - "-1890326172": { - "message": "no-history finish of %s on new resume", - "level": "DEBUG", - "group": "WM_DEBUG_STATES", - "at": "com\/android\/server\/wm\/Task.java" - }, "-1884933373": { "message": "enableScreenAfterBoot: mDisplayEnabled=%b mForceDisplayEnabled=%b mShowingBootMessages=%b mSystemBooted=%b. %s", "level": "INFO", @@ -1429,6 +1423,12 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, + "-484194149": { + "message": "no-history finish of %s on new resume", + "level": "DEBUG", + "group": "WM_DEBUG_STATES", + "at": "com\/android\/server\/wm\/ActivityTaskSupervisor.java" + }, "-481924678": { "message": "handleNotObscuredLocked w: %s, w.mHasSurface: %b, w.isOnScreen(): %b, w.isDisplayedLw(): %b, w.mAttrs.userActivityTimeout: %d", "level": "DEBUG", diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 8c4b75bf1622..667a4fa0ae26 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2824,6 +2824,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final Transition newTransition = (!mAtmService.getTransitionController().isCollecting() && mAtmService.getTransitionController().getTransitionPlayer() != null) ? mAtmService.getTransitionController().createTransition(TRANSIT_CLOSE) : null; + mTaskSupervisor.mNoHistoryActivities.remove(this); makeFinishingLocked(); // Make a local reference to its task since this.task could be set to null once this // activity is destroyed and detached from task. diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4edcfa907a60..7fe0f5be287c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -277,6 +277,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { * settle down before doing so. It contains ActivityRecord objects. */ final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<>(); + /** + * Activities that specify No History must be removed once the user navigates away from them. + * If the device goes to sleep with such an activity in the paused state then we save it + * here and finish it later if another activity replaces it on wakeup. + */ + final ArrayList<ActivityRecord> mNoHistoryActivities = new ArrayList<>(); + /** List of activities whose multi-window mode changed that we need to report to the * application */ private final ArrayList<ActivityRecord> mMultiWindowModeChangedActivities = new ArrayList<>(); @@ -479,6 +486,20 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } } + void finishNoHistoryActivitiesIfNeeded(ActivityRecord next) { + for (int i = mNoHistoryActivities.size() - 1; i >= 0; --i) { + final ActivityRecord noHistoryActivity = mNoHistoryActivities.get(i); + if (!noHistoryActivity.finishing && noHistoryActivity != next + && next.occludesParent() + && noHistoryActivity.getDisplayId() == next.getDisplayId()) { + ProtoLog.d(WM_DEBUG_STATES, "no-history finish of %s on new resume", + noHistoryActivity); + noHistoryActivity.finishIfPossible("resume-no-history", false /* oomAdj */); + mNoHistoryActivities.remove(noHistoryActivity); + } + } + } + private static int nextTaskIdForUser(int taskId, int userId) { int nextTaskId = taskId + 1; if (nextTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index f3368c16af86..7bbb2f560a71 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -586,13 +586,6 @@ class Task extends WindowContainer<WindowContainer> { ActivityRecord mLastPausedActivity = null; /** - * Activities that specify No History must be removed once the user navigates away from them. - * If the device goes to sleep with such an activity in the paused state then we save it here - * and finish it later if another activity replaces it on wakeup. - */ - ActivityRecord mLastNoHistoryActivity = null; - - /** * Current activity that is resumed, or null if there is none. * Only set at leaf tasks. */ @@ -5756,7 +5749,9 @@ class Task extends WindowContainer<WindowContainer> { ProtoLog.v(WM_DEBUG_STATES, "Moving to PAUSING: %s", prev); mPausingActivity = prev; mLastPausedActivity = prev; - mLastNoHistoryActivity = prev.isNoHistory() ? prev : null; + if (prev.isNoHistory() && !mTaskSupervisor.mNoHistoryActivities.contains(prev)) { + mTaskSupervisor.mNoHistoryActivities.add(prev); + } prev.setState(PAUSING, "startPausingLocked"); prev.getTask().touchActiveTime(); @@ -5802,13 +5797,13 @@ class Task extends WindowContainer<WindowContainer> { Slog.w(TAG, "Exception thrown during pause", e); mPausingActivity = null; mLastPausedActivity = null; - mLastNoHistoryActivity = null; + mTaskSupervisor.mNoHistoryActivities.remove(prev); } } } else { mPausingActivity = null; mLastPausedActivity = null; - mLastNoHistoryActivity = null; + mTaskSupervisor.mNoHistoryActivities.remove(prev); } // If we are not going to sleep, we want to ensure the device is @@ -6319,13 +6314,8 @@ class Task extends WindowContainer<WindowContainer> { // If the most recent activity was noHistory but was only stopped rather // than stopped+finished because the device went to sleep, we need to make // sure to finish it as we're making a new activity topmost. - if (shouldSleepActivities() && mLastNoHistoryActivity != null - && !mLastNoHistoryActivity.finishing - && mLastNoHistoryActivity != next) { - ProtoLog.d(WM_DEBUG_STATES, "no-history finish of %s on new resume", - mLastNoHistoryActivity); - mLastNoHistoryActivity.finishIfPossible("resume-no-history", false /* oomAdj */); - mLastNoHistoryActivity = null; + if (shouldSleepActivities()) { + mTaskSupervisor.finishNoHistoryActivitiesIfNeeded(next); } if (prev != null && prev != next && next.nowVisible) { @@ -7334,8 +7324,10 @@ class Task extends WindowContainer<WindowContainer> { isPausingDied = true; } if (mLastPausedActivity != null && mLastPausedActivity.app == app) { + if (mLastPausedActivity.isNoHistory()) { + mTaskSupervisor.mNoHistoryActivities.remove(mLastPausedActivity); + } mLastPausedActivity = null; - mLastNoHistoryActivity = null; } return isPausingDied; } @@ -7371,8 +7363,6 @@ class Task extends WindowContainer<WindowContainer> { if (dumpAll) { printed |= printThisActivity(pw, mLastPausedActivity, dumpPackage, false, " mLastPausedActivity: ", null); - printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage, - false, " mLastNoHistoryActivity: ", null); } printed |= dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, false, headerPrinter); |