Loading services/core/java/com/android/server/am/ActivityManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } } Loading services/core/java/com/android/server/am/ActivityStack.java +13 −6 Original line number Diff line number Diff line Loading @@ -496,11 +496,20 @@ final class ActivityStack { final void moveToFront(String reason) { if (isAttached()) { if (isOnHomeDisplay()) { mStackSupervisor.moveHomeStack(isHomeStack(), reason); } final boolean homeStack = isHomeStack() || (mActivityContainer.mParentActivity != null && mActivityContainer.mParentActivity.isHomeActivity()); ActivityStack lastFocusStack = null; if (!homeStack) { // Need to move this stack to the front before calling // {@link ActivityStackSupervisor#moveHomeStack} below. lastFocusStack = mStacks.get(mStacks.size() - 1); mStacks.remove(this); mStacks.add(this); } if (isOnHomeDisplay()) { mStackSupervisor.moveHomeStack(homeStack, reason, lastFocusStack); } final TaskRecord task = topTask(); if (task != null) { mWindowManager.moveTaskToTop(task.taskId); Loading Loading @@ -2580,7 +2589,6 @@ final class ActivityStack { if (top == null) { return false; } stack.moveToFront(myReason); mService.setFocusedActivityLocked(top, myReason); return true; } Loading Loading @@ -3656,8 +3664,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()) { Loading services/core/java/com/android/server/am/ActivityStackSupervisor.java +47 −43 Original line number Diff line number Diff line Loading @@ -386,21 +386,22 @@ public final class ActivityStackSupervisor implements DisplayListener { 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) { Loading @@ -409,13 +410,17 @@ public final class ActivityStackSupervisor implements DisplayListener { 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); Loading Loading @@ -1541,25 +1546,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; Loading @@ -1572,43 +1579,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(); 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; } moveHomeStack(isHomeActivity, reason); 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, Loading Loading @@ -2082,10 +2087,9 @@ public final class ActivityStackSupervisor implements DisplayListener { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } newTask = true; targetStack = adjustStackFocus(r, newTask); if (!launchTaskBehind) { targetStack = computeStackFocus(r, newTask); targetStack.moveToFront("startingNewTask"); } if (reuseTask == null) { r.setTask(targetStack.createTaskRecord(getNextTaskId(), newTaskInfo != null ? newTaskInfo : r.info, Loading Loading @@ -2206,7 +2210,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(), Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } } Loading
services/core/java/com/android/server/am/ActivityStack.java +13 −6 Original line number Diff line number Diff line Loading @@ -496,11 +496,20 @@ final class ActivityStack { final void moveToFront(String reason) { if (isAttached()) { if (isOnHomeDisplay()) { mStackSupervisor.moveHomeStack(isHomeStack(), reason); } final boolean homeStack = isHomeStack() || (mActivityContainer.mParentActivity != null && mActivityContainer.mParentActivity.isHomeActivity()); ActivityStack lastFocusStack = null; if (!homeStack) { // Need to move this stack to the front before calling // {@link ActivityStackSupervisor#moveHomeStack} below. lastFocusStack = mStacks.get(mStacks.size() - 1); mStacks.remove(this); mStacks.add(this); } if (isOnHomeDisplay()) { mStackSupervisor.moveHomeStack(homeStack, reason, lastFocusStack); } final TaskRecord task = topTask(); if (task != null) { mWindowManager.moveTaskToTop(task.taskId); Loading Loading @@ -2580,7 +2589,6 @@ final class ActivityStack { if (top == null) { return false; } stack.moveToFront(myReason); mService.setFocusedActivityLocked(top, myReason); return true; } Loading Loading @@ -3656,8 +3664,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()) { Loading
services/core/java/com/android/server/am/ActivityStackSupervisor.java +47 −43 Original line number Diff line number Diff line Loading @@ -386,21 +386,22 @@ public final class ActivityStackSupervisor implements DisplayListener { 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) { Loading @@ -409,13 +410,17 @@ public final class ActivityStackSupervisor implements DisplayListener { 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); Loading Loading @@ -1541,25 +1546,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; Loading @@ -1572,43 +1579,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(); 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; } moveHomeStack(isHomeActivity, reason); 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, Loading Loading @@ -2082,10 +2087,9 @@ public final class ActivityStackSupervisor implements DisplayListener { return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; } newTask = true; targetStack = adjustStackFocus(r, newTask); if (!launchTaskBehind) { targetStack = computeStackFocus(r, newTask); targetStack.moveToFront("startingNewTask"); } if (reuseTask == null) { r.setTask(targetStack.createTaskRecord(getNextTaskId(), newTaskInfo != null ? newTaskInfo : r.info, Loading Loading @@ -2206,7 +2210,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(), Loading