Revert "Revert "Have AMS.setFocusedActivityLocked() move the focus stack to the front""
This reverts commit 3426b72cff7f8eeea4c802f4f0fcae4b995e177a
and fixes bugs 19505341 19507107
Bug: 19219490
Bug: 19507107
Bug: 19505341
Change-Id: I7d6fc9fa41ed03bb7834facbb4c453e2561f13c9
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 907381e..c4234eb 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -386,21 +386,22 @@
return mLastFocusedStack;
}
- /** Top of all visible stacks. Use {@link ActivityStack#isStackVisibleLocked} to determine if a
- * specific stack is visible or not. */
+ /** Top of all visible stacks is/should always be equal to the focused stack.
+ * Use {@link ActivityStack#isStackVisibleLocked} to determine if a specific
+ * stack is visible or not. */
boolean isFrontStack(ActivityStack stack) {
final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
if (parent != null) {
stack = parent.task.stack;
}
- ArrayList<ActivityStack> stacks = stack.mStacks;
- if (stacks != null && !stacks.isEmpty()) {
- return stack == stacks.get(stacks.size() - 1);
- }
- return false;
+ return stack == mFocusedStack;
}
void moveHomeStack(boolean toFront, String reason) {
+ moveHomeStack(toFront, reason, null);
+ }
+
+ void moveHomeStack(boolean toFront, String reason, ActivityStack lastFocusedStack) {
ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
final int topNdx = stacks.size() - 1;
if (topNdx <= 0) {
@@ -409,13 +410,17 @@
ActivityStack topStack = stacks.get(topNdx);
final boolean homeInFront = topStack == mHomeStack;
if (homeInFront != toFront) {
- mLastFocusedStack = topStack;
stacks.remove(mHomeStack);
stacks.add(toFront ? topNdx : 0, mHomeStack);
- mFocusedStack = stacks.get(topNdx);
if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new="
+ mFocusedStack);
}
+
+ if (lastFocusedStack != null) {
+ mLastFocusedStack = lastFocusedStack;
+ }
+ mFocusedStack = stacks.get(topNdx);
+
EventLog.writeEvent(EventLogTags.AM_HOME_STACK_MOVED,
mCurrentUser, toFront ? 1 : 0, stacks.get(topNdx).getStackId(),
mFocusedStack == null ? -1 : mFocusedStack.getStackId(), reason);
@@ -1541,25 +1546,27 @@
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 +1579,41 @@
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 +2087,9 @@
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 +2210,7 @@
// 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(),