summaryrefslogtreecommitdiffstats
path: root/services/java
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2013-12-16 15:58:31 -0800
committerCraig Mautner <cmautner@google.com>2013-12-16 16:56:19 -0800
commit3b475fefa3b83ce49454936a0be3081753e3e8ad (patch)
treee7e614628b44de4e8cc41181351980182d8dd807 /services/java
parentb8928b05932f9592cfeeb9c3cdc96c4066de2d55 (diff)
downloadframeworks_base-3b475fefa3b83ce49454936a0be3081753e3e8ad.zip
frameworks_base-3b475fefa3b83ce49454936a0be3081753e3e8ad.tar.gz
frameworks_base-3b475fefa3b83ce49454936a0be3081753e3e8ad.tar.bz2
Fix incorrect setting of TaskRecord.frontOfTask DO NOT MERGE
When Intent.FLAG_ACTIVITY_REORDER_TO_FRONT was set the TaskRecord member frontOfTask was being set true incorrectly for the top activity. It should only be true for the bottom activity. This fix ensures that frontOfTask is always set correctly for all activities by consoldating it into one method. Fixes bug 12171535. Change-Id: If982dad3c81b2b816adc5d89e7e0496923098a70
Diffstat (limited to 'services/java')
-rw-r--r--services/java/com/android/server/am/ActivityStack.java21
-rw-r--r--services/java/com/android/server/am/TaskRecord.java23
2 files changed, 23 insertions, 21 deletions
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 84cedb8..cff959e 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -1287,17 +1287,7 @@ final class ActivityStack {
if (prevTask != null && prevTask.mOnTopOfHome && prev.finishing && prev.frontOfTask) {
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
if (prevTask == nextTask) {
- ArrayList<ActivityRecord> activities = prevTask.mActivities;
- final int numActivities = activities.size();
- for (int activityNdx = 0; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
- // r is usually the same as next, but what if two activities were launched
- // before prev finished?
- if (!r.finishing) {
- r.frontOfTask = true;
- break;
- }
- }
+ prevTask.setFrontOfTask();
} else if (prevTask != topTask()) {
// This task is going away but it was supposed to return to the home task.
// Now the task above it has to return to the home task instead.
@@ -1749,9 +1739,9 @@ final class ActivityStack {
if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to stack to task " + task,
new RuntimeException("here").fillInStackTrace());
task.addActivityToTop(r);
+ task.setFrontOfTask();
r.putInHistory();
- r.frontOfTask = newTask;
if (!isHomeStack() || numActivities() > 0) {
// We want to show the starting preview window if we are
// switching to a new task, or the next activity's process is
@@ -2412,15 +2402,12 @@ final class ActivityStack {
final ArrayList<ActivityRecord> activities = r.task.mActivities;
final int index = activities.indexOf(r);
if (index < (activities.size() - 1)) {
- ActivityRecord next = activities.get(index+1);
- if (r.frontOfTask) {
- // The next activity is now the front of the task.
- next.frontOfTask = true;
- }
+ r.task.setFrontOfTask();
if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
// If the caller asked that this activity (and all above it)
// be cleared when the task is reset, don't lose that information,
// but propagate it up to the next activity.
+ ActivityRecord next = activities.get(index+1);
next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
}
}
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 3d568ff..5f32dbb 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -159,18 +159,33 @@ final class TaskRecord extends ThumbnailHolder {
return null;
}
+ /** Call after activity movement or finish to make sure that frontOfTask is set correctly */
+ final void setFrontOfTask() {
+ boolean foundFront = false;
+ final int numActivities = mActivities.size();
+ for (int activityNdx = 0; numActivities < activityNdx; ++activityNdx) {
+ final ActivityRecord r = mActivities.get(activityNdx);
+ if (foundFront || r.finishing) {
+ r.frontOfTask = false;
+ } else {
+ r.frontOfTask = true;
+ // Set frontOfTask false for every following activity.
+ foundFront = true;
+ }
+ }
+ }
+
/**
- * Reorder the history stack so that the activity at the given index is
- * brought to the front.
+ * Reorder the history stack so that the passed activity is brought to the front.
*/
final void moveActivityToFrontLocked(ActivityRecord newTop) {
if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Removing and adding activity " + newTop
+ " to stack at top", new RuntimeException("here").fillInStackTrace());
- getTopActivity().frontOfTask = false;
mActivities.remove(newTop);
mActivities.add(newTop);
- newTop.frontOfTask = true;
+
+ setFrontOfTask();
}
void addActivityAtBottom(ActivityRecord r) {