OSDN Git Service

Ensure home activity always is on home stack.
authorBryce Lee <brycelee@google.com>
Mon, 17 Jul 2017 17:39:24 +0000 (10:39 -0700)
committerBryce Lee <brycelee@google.com>
Mon, 17 Jul 2017 21:32:58 +0000 (14:32 -0700)
It is possible to start a home activity on a non-home stack. For
example, an activity that handles the home intent may be started with
via a different intent, landing it on the fullscreen stack. This
becomes problematic later on due to our assumptions about the home
stack state and handling of tasks within it.

To ensure proper behavior, this changelist moves the activity
handling the home intent to the home stack if it is not already
present there.

Fixes: 36606833
Test: Move home activity to fullscreen stack, launch another
      activity, press home button.
Test: go/wm-smoke

Change-Id: If88550a24dca3eabc0c60940937e6a1e6f133cae

services/core/java/com/android/server/am/ActivityStarter.java

index a31c33e..4f04066 100644 (file)
@@ -1640,6 +1640,16 @@ class ActivityStarter {
                                 REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
                                 "reparentToDisplay");
                         mMovedToFront = true;
+                    } else if (launchStack.getStackId() == StackId.HOME_STACK_ID
+                        && mTargetStack.getStackId() != StackId.HOME_STACK_ID) {
+                        // It is possible for the home activity to be in another stack initially.
+                        // For example, the activity may have been initially started with an intent
+                        // which placed it in the fullscreen stack. To ensure the proper handling of
+                        // the activity based on home stack assumptions, we must move it over.
+                        intentActivity.getTask().reparent(launchStack.mStackId, ON_TOP,
+                                REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
+                                "reparentingHome");
+                        mMovedToFront = true;
                     }
                     mOptions = null;