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;
     }