summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2013-05-12 10:24:27 -0700
committerCraig Mautner <cmautner@google.com>2013-05-13 14:39:39 -0700
commit1602ec21883f73c5eb2304cf69d2278f70b145ab (patch)
treec7a4728753d07f41ac00905d77965d566587cf78
parenta5ca95a889236e72f08033bab426c8acee35ce90 (diff)
downloadframeworks_base-1602ec21883f73c5eb2304cf69d2278f70b145ab.zip
frameworks_base-1602ec21883f73c5eb2304cf69d2278f70b145ab.tar.gz
frameworks_base-1602ec21883f73c5eb2304cf69d2278f70b145ab.tar.bz2
Log stack issues and start resize effort.
- Modify Am.java to accept 'stack resize' command. - Add logging for assigning home stack to non-home task to track down bug. And maybe fix bug. - Add template parameter to ArrayList. Change-Id: Ia73182afc20e9e4430ddadebae034cecb3798eec
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java17
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java16
-rw-r--r--services/java/com/android/server/am/ActivityStackSupervisor.java27
-rw-r--r--services/java/com/android/server/am/TaskRecord.java35
4 files changed, 55 insertions, 40 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index ce71e4a..cc69176 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -104,6 +104,7 @@ public class Am extends BaseCommand {
" am stop-user <USER_ID>\n" +
" am stack create <TASK_ID> <RELATIVE_STACK_ID> <POSITION> <WEIGHT>\n" +
" am stack movetask <STACK_ID> <TASK_ID> [true|false]\n" +
+ " am stack resize <STACK_ID> <WEIGHT>\n" +
" am stack dump\n" +
"\n" +
"am start: start an Activity. Options are:\n" +
@@ -199,6 +200,8 @@ public class Am extends BaseCommand {
"am stack movetask: move <TASK_ID> from its current stack to the top (true) or" +
" bottom (false) of <STACK_ID>.\n" +
"\n" +
+ "am stack resize: change <STACK_ID> relative size to new <WEIGHT>.\n" +
+ "\n" +
"am stack dump: list the hierarchy of stacks.\n" +
"\n" +
"<INTENT> specifications include these flags and arguments:\n" +
@@ -1481,6 +1484,8 @@ public class Am extends BaseCommand {
runStackCreate();
} else if (op.equals("movetask")) {
runStackMoveTask();
+ } else if (op.equals("resize")) {
+ runStackResize();
} else if (op.equals("dump")) {
runStackDump();
} else {
@@ -1528,6 +1533,18 @@ public class Am extends BaseCommand {
}
}
+ private void runStackResize() throws Exception {
+ String stackIdStr = nextArgRequired();
+ int stackId = Integer.valueOf(stackIdStr);
+ String weightStr = nextArgRequired();
+ float weight = Float.valueOf(weightStr);
+
+ try {
+ mAm.resizeStack(stackId, weight);
+ } catch (RemoteException e) {
+ }
+ }
+
private void runStackDump() throws Exception {
try {
List<ActivityManager.StackInfo> stacks = mAm.getStacks();
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index fad1bc5..42e2b3a 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -6326,6 +6326,10 @@ public final class ActivityManagerService extends ActivityManagerNative
@Override
public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
+ if (stackId == HOME_STACK_ID) {
+ Slog.e(TAG, "moveTaskToStack: Attempt to move task " + taskId + " to home stack",
+ new RuntimeException("here").fillInStackTrace());
+ }
synchronized (this) {
mWindowManager.moveTaskToStack(taskId, stackId, toTop);
mStackSupervisor.moveTaskToStack(taskId, stackId, toTop);
@@ -6388,8 +6392,8 @@ public final class ActivityManagerService extends ActivityManagerNative
final void sendPendingThumbnail(ActivityRecord r, IBinder token,
Bitmap thumbnail, CharSequence description, boolean always) {
- TaskRecord task = null;
- ArrayList receivers = null;
+ TaskRecord task;
+ ArrayList<PendingThumbnailsRecord> receivers = null;
//System.out.println("Send pending thumbnail: " + r);
@@ -6415,12 +6419,11 @@ public final class ActivityManagerService extends ActivityManagerNative
int N = mPendingThumbnails.size();
int i=0;
while (i<N) {
- PendingThumbnailsRecord pr =
- (PendingThumbnailsRecord)mPendingThumbnails.get(i);
+ PendingThumbnailsRecord pr = mPendingThumbnails.get(i);
//System.out.println("Looking in " + pr.pendingRecords);
if (pr.pendingRecords.remove(r)) {
if (receivers == null) {
- receivers = new ArrayList();
+ receivers = new ArrayList<PendingThumbnailsRecord>();
}
receivers.add(pr);
if (pr.pendingRecords.size() == 0) {
@@ -6438,8 +6441,7 @@ public final class ActivityManagerService extends ActivityManagerNative
final int N = receivers.size();
for (int i=0; i<N; i++) {
try {
- PendingThumbnailsRecord pr =
- (PendingThumbnailsRecord)receivers.get(i);
+ PendingThumbnailsRecord pr = receivers.get(i);
pr.receiver.newThumbnail(
task != null ? task.taskId : -1, thumbnail, description);
if (pr.finished) {
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index f7f0812..b284cfa 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -305,6 +305,7 @@ public class ActivityStackSupervisor {
final int nextStackId = mWindowManager.removeStack(stackId);
// TODO: Perhaps we need to let the ActivityManager determine the next focus...
if (mFocusedStack.mStackId == stackId) {
+ // If this is the last app stack, set mFocusedStack to null.
mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
}
}
@@ -455,19 +456,16 @@ public class ActivityStackSupervisor {
}
ActivityRecord topRunningActivityLocked() {
- ActivityRecord r = null;
- if (mFocusedStack != null) {
- r = mFocusedStack.topRunningActivityLocked(null);
- if (r != null) {
- return r;
- }
+ final ActivityStack focusedStack = getFocusedStack();
+ ActivityRecord r = focusedStack.topRunningActivityLocked(null);
+ if (r != null) {
+ return r;
}
+
for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = mStacks.get(stackNdx);
- if (stack.mCurrentUser != mCurrentUser) {
- continue;
- }
- if (stack != mFocusedStack && isFrontStack(stack)) {
+ if (stack.mCurrentUser == mCurrentUser && stack != focusedStack &&
+ isFrontStack(stack)) {
r = stack.topRunningActivityLocked(null);
if (r != null) {
return r;
@@ -1162,7 +1160,7 @@ public class ActivityStackSupervisor {
}
ActivityStack getCorrectStack(ActivityRecord r) {
- if (!r.isHomeActivity) {
+ if (!r.isHomeActivity || (r.task != null && !r.task.isHomeTask())) {
int stackNdx;
for (stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
if (mStacks.get(stackNdx).mCurrentUser == mCurrentUser) {
@@ -1184,7 +1182,7 @@ public class ActivityStackSupervisor {
if (r == null) {
return;
}
- if (r.isHomeActivity) {
+ if (r.isHomeActivity || (r.task != null && r.task.isHomeTask())) {
if (mStackState != STACK_STATE_HOME_IN_FRONT) {
mStackState = STACK_STATE_HOME_TO_FRONT;
}
@@ -1598,10 +1596,9 @@ public class ActivityStackSupervisor {
// 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.
- ActivityStack lastStack = getLastStack();
- targetStack = lastStack != null ? lastStack : mHomeStack;
+ targetStack = getCorrectStack(r);
moveHomeStack(targetStack.isHomeStack());
- ActivityRecord prev = lastStack == null ? null : targetStack.topActivity();
+ ActivityRecord prev = targetStack.topActivity();
r.setTask(prev != null ? prev.task
: targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
null, true);
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index a01b882..70a5162 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -57,6 +57,8 @@ class TaskRecord extends ThumbnailHolder {
/** Current stack */
ActivityStack stack;
+ private boolean mHomeTask;
+
TaskRecord(int _taskId, ActivityInfo info, Intent _intent, ActivityStack _stack) {
taskId = _taskId;
affinity = info.taskAffinity;
@@ -153,19 +155,16 @@ class TaskRecord extends ThumbnailHolder {
}
void addActivityToTop(ActivityRecord r) {
- // Remove r first, and if it wasn't already in the list and it's fullscreen, count it.
- if (!mActivities.remove(r) && r.fullscreen) {
- // Was not previously in list.
- numFullscreen++;
- }
- mActivities.add(r);
+ addActivityAtIndex(mActivities.size(), r);
}
void addActivityAtIndex(int index, ActivityRecord r) {
+ // Remove r first, and if it wasn't already in the list and it's fullscreen, count it.
if (!mActivities.remove(r) && r.fullscreen) {
// Was not previously in list.
numFullscreen++;
}
+ mHomeTask = r.isHomeActivity;
mActivities.add(index, r);
}
@@ -183,10 +182,9 @@ class TaskRecord extends ThumbnailHolder {
* task starting at a specified index.
*/
final void performClearTaskAtIndexLocked(int activityNdx) {
- final ArrayList<ActivityRecord> activities = mActivities;
- int numActivities = activities.size();
+ int numActivities = mActivities.size();
for ( ; activityNdx < numActivities; ++activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
+ final ActivityRecord r = mActivities.get(activityNdx);
if (r.finishing) {
continue;
}
@@ -216,19 +214,18 @@ class TaskRecord extends ThumbnailHolder {
* or null if none was found.
*/
final ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) {
- final ArrayList<ActivityRecord> activities = mActivities;
- int numActivities = activities.size();
+ int numActivities = mActivities.size();
for (int activityNdx = numActivities - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = activities.get(activityNdx);
+ ActivityRecord r = mActivities.get(activityNdx);
if (r.finishing) {
continue;
}
if (r.realActivity.equals(newR.realActivity)) {
// Here it is! Now finish everything in front...
- ActivityRecord ret = r;
+ final ActivityRecord ret = r;
for (++activityNdx; activityNdx < numActivities; ++activityNdx) {
- r = activities.get(activityNdx);
+ r = mActivities.get(activityNdx);
if (r.finishing) {
continue;
}
@@ -249,10 +246,8 @@ class TaskRecord extends ThumbnailHolder {
if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
&& (launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
if (!ret.finishing) {
- if (activities.contains(ret)) {
- stack.finishActivityLocked(ret, Activity.RESULT_CANCELED, null,
- "clear", false);
- }
+ stack.finishActivityLocked(ret, Activity.RESULT_CANCELED, null,
+ "clear", false);
return null;
}
}
@@ -321,6 +316,10 @@ class TaskRecord extends ThumbnailHolder {
return subtask.activity;
}
+ boolean isHomeTask() {
+ return mHomeTask;
+ }
+
public TaskAccessInfo getTaskAccessInfoLocked(boolean inclThumbs) {
final TaskAccessInfo thumbs = new TaskAccessInfo();
// How many different sub-thumbnails?