Merge "Remove duplicated field of activity stopped state"

This commit is contained in:
Riddle Hsu
2022-12-12 10:05:53 +00:00
committed by Android (Google) Code Review
3 changed files with 53 additions and 64 deletions

View File

@@ -513,7 +513,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// dies. After an activity is launched it follows the value
// of #mIcicle.
boolean launchFailed; // set if a launched failed, to abort on 2nd try
boolean stopped; // is activity pause finished?
boolean delayedResume; // not yet resumed because of stopped app switches?
boolean finishing; // activity in pending finish list?
boolean deferRelaunchUntilPaused; // relaunch of activity is being deferred until pause is
@@ -875,6 +874,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean mOverrideTaskTransition;
boolean mDismissKeyguard;
/** True if the activity has reported stopped; False if the activity becomes visible. */
boolean mAppStopped;
// A hint to override the window specified rotation animation, or -1 to use the window specified
// value. We use this so that we can select the right animation in the cases of starting
@@ -1135,7 +1135,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
pw.print(prefix); pw.print("mHaveState="); pw.print(mHaveState);
pw.print(" mIcicle="); pw.println(mIcicle);
pw.print(prefix); pw.print("state="); pw.print(mState);
pw.print(" stopped="); pw.print(stopped);
pw.print(" delayedResume="); pw.print(delayedResume);
pw.print(" finishing="); pw.println(finishing);
pw.print(prefix); pw.print("keysPaused="); pw.print(keysPaused);
@@ -2021,7 +2020,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
requestCode = _reqCode;
setState(INITIALIZING, "ActivityRecord ctor");
launchFailed = false;
stopped = false;
delayedResume = false;
finishing = false;
deferRelaunchUntilPaused = false;
@@ -3871,7 +3869,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
taskFragment.sendTaskFragmentInfoChanged();
}
if (stopped) {
if (mAppStopped) {
abortAndClearOptionsAnimation();
}
}
@@ -5707,11 +5705,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
void notifyAppResumed(boolean wasStopped) {
void notifyAppResumed() {
if (getParent() == null) {
Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: " + token);
return;
}
final boolean wasStopped = mAppStopped;
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "notifyAppResumed: wasStopped=%b %s",
wasStopped, this);
mAppStopped = false;
@@ -5725,32 +5724,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
/**
* Notify that the app has stopped, and it is okay to destroy any surfaces which were
* keeping alive in case they were still being used.
*/
void notifyAppStopped() {
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "notifyAppStopped: %s", this);
mAppStopped = true;
firstWindowDrawn = false;
// This is to fix the edge case that auto-enter-pip is finished in Launcher but app calls
// setAutoEnterEnabled(false) and transitions to STOPPED state, see b/191930787.
// Clear any surface transactions and content overlay in this case.
if (task != null && task.mLastRecentsAnimationTransaction != null) {
task.clearLastRecentsAnimationTransaction(true /* forceRemoveOverlay */);
}
// Reset the last saved PiP snap fraction on app stop.
mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent);
mDisplayContent.mUnknownAppVisibilityController.appRemovedOrHidden(this);
if (isClientVisible()) {
// Though this is usually unlikely to happen, still make sure the client is invisible.
setClientVisible(false);
}
destroySurfaces();
// Remove any starting window that was added for this app if they are still around.
removeStartingWindow();
}
/**
* Suppress transition until the new activity becomes ready, otherwise the keyguard can appear
* for a short amount of time before the new process with the new activity had the ability to
@@ -6111,7 +6084,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
mLastNewIntent = newIntents.get(newIntents.size() - 1);
}
newIntents = null;
stopped = false;
if (isActivityTypeHome()) {
mTaskSupervisor.updateHomeProcess(task.getBottomMostActivity().app);
@@ -6233,7 +6205,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
resumeKeyDispatchingLocked();
try {
stopped = false;
ProtoLog.v(WM_DEBUG_STATES, "Moving to STOPPING: %s (stop requested)", this);
setState(STOPPING, "stopIfPossible");
@@ -6251,7 +6222,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// notification will clean things up.
Slog.w(TAG, "Exception thrown during pause", e);
// Just in case, assume it to be stopped.
stopped = true;
mAppStopped = true;
ProtoLog.v(WM_DEBUG_STATES, "Stop failed; moving to STOPPED: %s", this);
setState(STOPPED, "stopIfPossible");
if (deferRelaunchUntilPaused) {
@@ -6260,12 +6231,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
/**
* Notifies that the activity has stopped, and it is okay to destroy any surfaces which were
* keeping alive in case they were still being used.
*/
void activityStopped(Bundle newIcicle, PersistableBundle newPersistentState,
CharSequence description) {
removeStopTimeout();
final boolean isStopping = mState == STOPPING;
if (!isStopping && mState != RESTARTING_PROCESS) {
Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this + " " + mState);
removeStopTimeout();
return;
}
if (newPersistentState != null) {
@@ -6281,28 +6256,42 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
updateTaskDescription(description);
}
ProtoLog.i(WM_DEBUG_STATES, "Saving icicle of %s: %s", this, mIcicle);
if (!stopped) {
if (isStopping) {
ProtoLog.v(WM_DEBUG_STATES, "Moving to STOPPED: %s (stop complete)", this);
removeStopTimeout();
stopped = true;
if (isStopping) {
setState(STOPPED, "activityStoppedLocked");
}
notifyAppStopped();
if (finishing) {
abortAndClearOptionsAnimation();
} else {
if (deferRelaunchUntilPaused) {
destroyImmediately("stop-config");
mRootWindowContainer.resumeFocusedTasksTopActivities();
} else {
mAtmService.updatePreviousProcess(this);
}
}
mTaskSupervisor.checkReadyForSleepLocked(true /* allowDelay */);
setState(STOPPED, "activityStopped");
}
mAppStopped = true;
firstWindowDrawn = false;
// This is to fix the edge case that auto-enter-pip is finished in Launcher but app calls
// setAutoEnterEnabled(false) and transitions to STOPPED state, see b/191930787.
// Clear any surface transactions and content overlay in this case.
if (task.mLastRecentsAnimationTransaction != null) {
task.clearLastRecentsAnimationTransaction(true /* forceRemoveOverlay */);
}
// Reset the last saved PiP snap fraction on app stop.
mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent);
mDisplayContent.mUnknownAppVisibilityController.appRemovedOrHidden(this);
if (isClientVisible()) {
// Though this is usually unlikely to happen, still make sure the client is invisible.
setClientVisible(false);
}
destroySurfaces();
// Remove any starting window that was added for this app if they are still around.
removeStartingWindow();
if (finishing) {
abortAndClearOptionsAnimation();
} else {
if (deferRelaunchUntilPaused) {
destroyImmediately("stop-config");
mRootWindowContainer.resumeFocusedTasksTopActivities();
} else {
mAtmService.updatePreviousProcess(this);
}
}
mTaskSupervisor.checkReadyForSleepLocked(true /* allowDelay */);
}
void addToStopping(boolean scheduleIdle, boolean idleDelayed, String reason) {
@@ -6840,7 +6829,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
private ActivityRecord getWaitingHistoryRecordLocked() {
// First find the real culprit... if this activity has stopped, then the key dispatching
// timeout should not be caused by this.
if (stopped) {
if (mAppStopped) {
final Task rootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
if (rootTask == null) {
return this;
@@ -6921,7 +6910,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
if (isState(RESUMED) || getRootTask() == null
|| this == getTaskFragment().getPausingActivity()
|| !mHaveState || !stopped) {
|| !mHaveState || !mAppStopped) {
// We're not ready for this kind of thing.
return false;
}

View File

@@ -1361,7 +1361,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
if (next.attachedToProcess()) {
if (DEBUG_SWITCH) {
Slog.v(TAG_SWITCH, "Resume running: " + next + " stopped=" + next.stopped
Slog.v(TAG_SWITCH, "Resume running: " + next + " stopped=" + next.mAppStopped
+ " visibleRequested=" + next.isVisibleRequested());
}
@@ -1376,7 +1376,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
|| mLastPausedActivity != null && !mLastPausedActivity.occludesParent();
// This activity is now becoming visible.
if (!next.isVisibleRequested() || next.stopped || lastActivityTranslucent) {
if (!next.isVisibleRequested() || next.mAppStopped || lastActivityTranslucent) {
next.app.addToPendingTop();
next.setVisibility(true);
}
@@ -1427,7 +1427,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
// Do over!
mTaskSupervisor.scheduleResumeTopActivities();
}
if (!next.isVisibleRequested() || next.stopped) {
if (!next.isVisibleRequested() || next.mAppStopped) {
next.setVisibility(true);
}
next.completeResumeLocked();
@@ -1456,7 +1456,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
// Well the app will no longer be stopped.
// Clear app token stopped state in window manager if needed.
next.notifyAppResumed(next.stopped);
next.notifyAppResumed();
EventLogTags.writeWmResumeActivity(next.mUserId, System.identityHashCode(next),
next.getTask().mTaskId, next.shortComponentName);

View File

@@ -903,7 +903,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
if (launchedActivity == activity) {
continue;
}
if (!activity.stopped) {
if (!activity.mAppStopped) {
return true;
}
}
@@ -926,7 +926,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
boolean shouldKillProcessForRemovedTask(Task task) {
for (int k = 0; k < mActivities.size(); k++) {
final ActivityRecord activity = mActivities.get(k);
if (!activity.stopped) {
if (!activity.mAppStopped) {
// Don't kill process(es) that has an activity not stopped.
return false;
}
@@ -956,7 +956,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
// Don't consider any activities that are currently not in a state where they
// can be destroyed.
if (r.isVisibleRequested() || !r.stopped || !r.hasSavedState() || !r.isDestroyable()
if (r.isVisibleRequested() || !r.mAppStopped || !r.hasSavedState() || !r.isDestroyable()
|| r.isState(STARTED, RESUMED, PAUSING, PAUSED, STOPPING)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
continue;