From a59937a8e0f4417650aa790c089973be626f6249 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 20 Mar 2019 17:17:22 +0800 Subject: [PATCH] Make sure to report wait result when clean up activities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Starting activity with ‘-W’ option from shell waited forever because activity was brought to top, but being removed from waiting visible activities (due to process was gone) without reporting the wait result. Also correcting the component to avoid waiting for a top finishing activity. Bug: 117579987 Test: atest ActivityManagerAmStartOptionsTests Change-Id: I7c1e6781544f0d794225a13fdf417475ff0598a3 --- .../java/com/android/server/wm/ActivityRecord.java | 7 +++---- .../android/server/wm/ActivityStackSupervisor.java | 12 ++---------- .../java/com/android/server/wm/ActivityStarter.java | 7 +++++-- 3 files changed, 10 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 4706930928f45..a519938847c0b 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2159,8 +2159,7 @@ final class ActivityRecord extends ConfigurationContainer { } if (nowVisible) { - // We won't get a call to reportActivityVisibleLocked() so dismiss lockscreen now. - mStackSupervisor.reportActivityVisibleLocked(this); + mStackSupervisor.stopWaitingForActivityVisible(this); } // Schedule an idle timeout in case the app doesn't do it for us. @@ -2349,7 +2348,7 @@ final class ActivityRecord extends ConfigurationContainer { final @LaunchState int launchState = info != null ? info.getLaunchState() : -1; mStackSupervisor.reportActivityLaunchedLocked(false /* timeout */, this, windowsDrawnDelayMs, launchState); - mStackSupervisor.sendWaitingVisibleReportLocked(this); + mStackSupervisor.stopWaitingForActivityVisible(this); finishLaunchTickingLocked(); if (task != null) { task.hasBeenVisible = true; @@ -2360,7 +2359,7 @@ final class ActivityRecord extends ConfigurationContainer { /** Called when the windows associated app window container are visible. */ public void onWindowsVisible() { synchronized (mAtmService.mGlobalLock) { - mStackSupervisor.reportActivityVisibleLocked(this); + mStackSupervisor.stopWaitingForActivityVisible(this); if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "windowsVisibleLocked(): " + this); if (!nowVisible) { nowVisible = true; diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index d7c9bc78e72f5..53dc1df5a46aa 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -553,18 +553,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // down to the max limit while they are still waiting to finish. mFinishingActivities.remove(r); - for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) { - if (mWaitingForActivityVisible.get(i).matches(r.mActivityComponent)) { - mWaitingForActivityVisible.remove(i); - } - } + stopWaitingForActivityVisible(r); } - void reportActivityVisibleLocked(ActivityRecord r) { - sendWaitingVisibleReportLocked(r); - } - - void sendWaitingVisibleReportLocked(ActivityRecord r) { + void stopWaitingForActivityVisible(ActivityRecord r) { boolean changed = false; for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) { final WaitInfo w = mWaitingForActivityVisible.get(i); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 2b23ff0843912..3acd4e7fc7462 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1538,10 +1538,13 @@ class ActivityStarter { if (!mAddingToTask && mReuseTask == null) { // We didn't do anything... but it was needed (a.k.a., client don't use that // intent!) And for paranoia, make sure we have correctly resumed the top activity. - resumeTargetStackIfNeeded(); if (outActivity != null && outActivity.length > 0) { - outActivity[0] = reusedActivity; + // The reusedActivity could be finishing, for example of starting an + // activity with FLAG_ACTIVITY_CLEAR_TOP flag. In that case, return the + // top running activity in the task instead. + outActivity[0] = reusedActivity.finishing + ? reusedActivity.getTaskRecord().getTopActivity() : reusedActivity; } return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;