diff options
author | Wale Ogunwale <ogunwale@google.com> | 2015-02-24 12:27:31 -0800 |
---|---|---|
committer | Wale Ogunwale <ogunwale@google.com> | 2015-02-24 17:37:29 -0800 |
commit | af0e44885992b0675d7881c391caeff88414695f (patch) | |
tree | 6ba2a677d3cd74c67af713e759af962b991351a2 | |
parent | 9fc3cef1c7d85f764f00be40b62388a4cc0f3e82 (diff) | |
download | frameworks_base-af0e44885992b0675d7881c391caeff88414695f.zip frameworks_base-af0e44885992b0675d7881c391caeff88414695f.tar.gz frameworks_base-af0e44885992b0675d7881c391caeff88414695f.tar.bz2 |
Have AMS.setFocusedActivityLocked() move the focus stack to the front
Bug: 19219490
Change-Id: I089c42a6cf6277f5975064103c9804c2ab05dcd6
3 files changed, 47 insertions, 42 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 966dc88..008d718 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2398,8 +2398,7 @@ public final class ActivityManagerService extends ActivityManagerNative } else { finishRunningVoiceLocked(); } - mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity"); - if (r != null) { + if (r != null && mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity")) { mWindowManager.setFocusedApp(r.appToken, true); } applyUpdateLockStateLocked(r); @@ -2423,6 +2422,7 @@ public final class ActivityManagerService extends ActivityManagerNative ActivityRecord r = stack.topRunningActivityLocked(null); if (r != null) { setFocusedActivityLocked(r, "setFocusedStack"); + mStackSupervisor.resumeTopActivitiesLocked(stack, null, null); } } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index b51f862..2ecf801 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -496,11 +496,19 @@ final class ActivityStack { final void moveToFront(String reason) { if (isAttached()) { + final boolean homeStack = isHomeStack() + || (mActivityContainer.mParentActivity != null + && mActivityContainer.mParentActivity.isHomeActivity()); + + if (!homeStack) { + // Need to move this stack to the front before calling + // {@link ActivityStackSupervisor#moveHomeStack} below. + mStacks.remove(this); + mStacks.add(this); + } if (isOnHomeDisplay()) { - mStackSupervisor.moveHomeStack(isHomeStack(), reason); + mStackSupervisor.moveHomeStack(homeStack, reason); } - mStacks.remove(this); - mStacks.add(this); final TaskRecord task = topTask(); if (task != null) { mWindowManager.moveTaskToTop(task.taskId); @@ -2580,7 +2588,6 @@ final class ActivityStack { if (top == null) { return false; } - stack.moveToFront(myReason); mService.setFocusedActivityLocked(top, myReason); return true; } @@ -3654,8 +3661,7 @@ final class ActivityStack { } } - if (DEBUG_TRANSITION) Slog.v(TAG, - "Prepare to back transition: task=" + taskId); + if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare to back transition: task=" + taskId); boolean prevIsHome = false; if (tr.isOverHomeStack()) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 907381e..f6ef295 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1541,25 +1541,27 @@ public final class ActivityStackSupervisor implements DisplayListener { return err; } - ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) { + ActivityStack computeStackFocus(ActivityRecord r, boolean newTask) { final TaskRecord task = r.task; // On leanback only devices we should keep all activities in the same stack. if (!mLeanbackOnlyDevice && (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) { + + ActivityStack stack; + if (task != null) { - final ActivityStack taskStack = task.stack; - if (taskStack.isOnHomeDisplay()) { - if (mFocusedStack != taskStack) { - if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " + + stack = task.stack; + if (stack.isOnHomeDisplay()) { + if (mFocusedStack != stack) { + if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "computeStackFocus: Setting " + "focused stack to r=" + r + " task=" + task); - mFocusedStack = taskStack; } else { if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, - "adjustStackFocus: Focused stack already=" + mFocusedStack); + "computeStackFocus: Focused stack already=" + mFocusedStack); } } - return taskStack; + return stack; } final ActivityContainer container = r.mInitialActivityContainer; @@ -1572,43 +1574,41 @@ public final class ActivityStackSupervisor implements DisplayListener { if (mFocusedStack != mHomeStack && (!newTask || mFocusedStack.mActivityContainer.isEligibleForNewTasks())) { if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, - "adjustStackFocus: Have a focused stack=" + mFocusedStack); + "computeStackFocus: Have a focused stack=" + mFocusedStack); return mFocusedStack; } final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = homeDisplayStacks.get(stackNdx); + stack = homeDisplayStacks.get(stackNdx); if (!stack.isHomeStack()) { if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, - "adjustStackFocus: Setting focused stack=" + stack); - mFocusedStack = stack; - return mFocusedStack; + "computeStackFocus: Setting focused stack=" + stack); + return stack; } } // Need to create an app stack for this user. - mFocusedStack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); - if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + - " stackId=" + mFocusedStack.mStackId); - return mFocusedStack; + stack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); + if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "computeStackFocus: New stack r=" + r + + " stackId=" + stack.mStackId); + return stack; } return mHomeStack; } - void setFocusedStack(ActivityRecord r, String reason) { - if (r != null) { - final TaskRecord task = r.task; - boolean isHomeActivity = !r.isApplicationActivity(); - if (!isHomeActivity && task != null) { - isHomeActivity = !task.isApplicationTask(); - } - if (!isHomeActivity && task != null) { - final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity; - isHomeActivity = parent != null && parent.isHomeActivity(); - } - moveHomeStack(isHomeActivity, reason); + boolean setFocusedStack(ActivityRecord r, String reason) { + if (r == null) { + // Not sure what you are trying to do, but it is not going to work... + return false; } + final TaskRecord task = r.task; + if (task == null || task.stack == null) { + Slog.w(TAG, "Can't set focus stack for r=" + r + " task=" + task); + return false; + } + task.stack.moveToFront(reason); + return true; } final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, @@ -2082,10 +2082,9 @@ public final class ActivityStackSupervisor implements DisplayListener { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } newTask = true; - targetStack = adjustStackFocus(r, newTask); - if (!launchTaskBehind) { - targetStack.moveToFront("startingNewTask"); - } + targetStack = computeStackFocus(r, newTask); + targetStack.moveToFront("startingNewTask"); + if (reuseTask == null) { r.setTask(targetStack.createTaskRecord(getNextTaskId(), newTaskInfo != null ? newTaskInfo : r.info, @@ -2206,7 +2205,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // This not being started from an existing activity, and not part // of a new task... just put it in the top task, though these days // this case should never happen. - targetStack = adjustStackFocus(r, newTask); + targetStack = computeStackFocus(r, newTask); targetStack.moveToFront("addingToTopTask"); ActivityRecord prev = targetStack.topActivity(); r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(), |