Fix launching logic.
Fixes bug 8643197.
Change-Id: Ie09a767082dc492b449111da91bc0e77b43fa2f6
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 0711f74..d80e4a1 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -1266,7 +1266,7 @@
// There are no more activities! Let's just start up the
// Launcher...
ActivityOptions.abort(options);
- return mService.startHomeActivityLocked(mCurrentUser);
+ return mStackSupervisor.resumeHomeActivity(prev);
}
next.delayedResume = false;
@@ -1284,8 +1284,7 @@
if (prev != null && prev.mLaunchHomeTaskNext && prev.finishing &&
prev.task.getTopActivity() == null) {
- prev.mLaunchHomeTaskNext = false;
- return mService.startHomeActivityLocked(mCurrentUser);
+ return mStackSupervisor.resumeHomeActivity(prev);
}
// If we are sleeping, and there is no resumed activity, and the top
@@ -1323,9 +1322,8 @@
// If we are currently pausing an activity, then don't do anything
// until that is done.
- if (mPausingActivity != null) {
- if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG,
- "Skip resume: pausing=" + mPausingActivity);
+ if (!mStackSupervisor.allPausedActivitiesComplete()) {
+ if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG, "Skip resume: some activity pausing");
return false;
}
@@ -1362,6 +1360,7 @@
// can be resumed...
final ActivityStack lastStack = mStackSupervisor.getLastStack();
if ((isHomeStack() ^ lastStack.isHomeStack()) && lastStack.mResumedActivity != null) {
+ // TODO: Don't pause when launching to the sibling task.
if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
// At this point we want to put the upcoming activity's process
// at the top of the LRU list, since we know we will be needing it
@@ -3274,7 +3273,7 @@
if (mResumedActivity != null && mResumedActivity.task == tr &&
mResumedActivity.mLaunchHomeTaskNext) {
mResumedActivity.mLaunchHomeTaskNext = false;
- return mService.startHomeActivityLocked(mCurrentUser);
+ return mStackSupervisor.resumeHomeActivity(null);
}
mStackSupervisor.getTopStack().resumeTopActivityLocked(null);
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 7a6687e..b5e952e 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -185,6 +185,17 @@
}
}
+ boolean resumeHomeActivity(ActivityRecord prev) {
+ moveHomeStack(true);
+ if (prev != null) {
+ prev.mLaunchHomeTaskNext = false;
+ }
+ if (mHomeStack.topRunningActivityLocked(null) != null) {
+ return mHomeStack.resumeTopActivityLocked(prev);
+ }
+ return mService.startHomeActivityLocked(mCurrentUser);
+ }
+
final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
ActivityStack stack) {
if (stack == mHomeStack) {
@@ -337,24 +348,13 @@
boolean allPausedActivitiesComplete() {
for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = mStacks.get(stackNdx);
- if (isFrontStack(stack)) {
- final ActivityRecord r = stack.mLastPausedActivity;
- if (r != null && r.state != ActivityState.PAUSED
- && r.state != ActivityState.STOPPED
- && r.state != ActivityState.STOPPING) {
- return false;
- }
+ final ActivityRecord r = stack.mPausingActivity;
+ if (r != null && r.state != ActivityState.PAUSED
+ && r.state != ActivityState.STOPPED
+ && r.state != ActivityState.STOPPING) {
+ return false;
}
}
- // TODO: Not sure if this should check if all Resumed are complete too.
- switch (mStackState) {
- case STACK_STATE_HOME_TO_BACK:
- mStackState = STACK_STATE_HOME_IN_BACK;
- break;
- case STACK_STATE_HOME_TO_FRONT:
- mStackState = STACK_STATE_HOME_IN_FRONT;
- break;
- }
return true;
}