summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWale Ogunwale <ogunwale@google.com>2015-02-24 12:27:31 -0800
committerWale Ogunwale <ogunwale@google.com>2015-02-24 17:37:29 -0800
commitaf0e44885992b0675d7881c391caeff88414695f (patch)
tree6ba2a677d3cd74c67af713e759af962b991351a2
parent9fc3cef1c7d85f764f00be40b62388a4cc0f3e82 (diff)
downloadframeworks_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
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java4
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java18
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java67
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(),