diff options
author | Craig Mautner <cmautner@google.com> | 2015-01-26 14:43:30 -0800 |
---|---|---|
committer | Craig Mautner <cmautner@google.com> | 2015-01-27 13:56:20 -0800 |
commit | 83162a90278d9d52d8fca7ee20ba314b452261de (patch) | |
tree | ced2c68ab15582dffb405ff24396e2ac2bf57c9b | |
parent | 3d62078498e8e9f7552d49f5f5e53ec339f4c2ce (diff) |
Eliminate groupId and add task to AppWindowToken
Simplifies access by eliminating indirect referencing.
Fixes bug 18088522 item #15.
Change-Id: I9049192a7f3e1028d60c4f2d4d4a0d4aad590aa4
10 files changed, 54 insertions, 49 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 7b20e721832c..743f6b789207 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -81,7 +81,7 @@ interface IWindowManager void addAppToken(int addPos, IApplicationToken token, int groupId, int stackId, int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId, int configChanges, boolean voiceInteraction, boolean launchTaskBehind); - void setAppGroupId(IBinder token, int groupId); + void setAppTask(IBinder token, int taskId); void setAppOrientation(IApplicationToken token, int requestedOrientation); int getAppOrientation(IApplicationToken token); void setFocusedApp(IBinder token, boolean moveFocusNow); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 13df44478549..97feb41b7c52 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2195,7 +2195,7 @@ final class ActivityStack { } final int targetTaskId = targetTask.taskId; - mWindowManager.setAppGroupId(target.appToken, targetTaskId); + mWindowManager.setAppTask(target.appToken, targetTaskId); boolean noOptions = canMoveOptions; final int start = replyChainEnd < 0 ? i : replyChainEnd; @@ -2220,7 +2220,7 @@ final class ActivityStack { p.setTask(targetTask, null); targetTask.addActivityAtBottom(p); - mWindowManager.setAppGroupId(p.appToken, targetTaskId); + mWindowManager.setAppTask(p.appToken, targetTaskId); } mWindowManager.moveTaskToBottom(targetTaskId); @@ -2360,7 +2360,7 @@ final class ActivityStack { new RuntimeException("here").fillInStackTrace()); if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p + " from " + srcPos + " in to resetting task " + task); - mWindowManager.setAppGroupId(p.appToken, taskId); + mWindowManager.setAppTask(p.appToken, taskId); } mWindowManager.moveTaskToTop(taskId); if (VALIDATE_TOKENS) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 3b27cd229e79..a04f6cbf7fac 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -52,7 +52,7 @@ class AppWindowToken extends WindowToken { final boolean voiceInteraction; - int groupId = -1; + Task mTask; boolean appFullscreen; int requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; boolean layoutConfigChanges; @@ -256,7 +256,8 @@ class AppWindowToken extends WindowToken { mIsExiting = false; removeAllWindows(); - final Task task = service.mTaskIdToTask.get(groupId); + // Use local variable because removeAppToken will null out mTask. + final Task task = mTask; if (task != null) { if (!task.removeAppToken(this)) { Slog.e(WindowManagerService.TAG, "removeAppFromTaskLocked: token=" + this @@ -295,8 +296,8 @@ class AppWindowToken extends WindowToken { if (allAppWindows.size() > 0) { pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows); } - pw.print(prefix); pw.print("groupId="); pw.print(groupId); - pw.print(" appFullscreen="); pw.print(appFullscreen); + pw.print(prefix); pw.print("task="); pw.println(mTask); + pw.print(prefix); pw.print(" appFullscreen="); pw.print(appFullscreen); pw.print(" requestedOrientation="); pw.println(requestedOrientation); pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested); pw.print(" clientHidden="); pw.print(clientHidden); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e3b53b04a488..8bbc5a905039 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -379,7 +379,7 @@ class DisplayContent { ArrayList<Task> tasks = stack.getTasks(); for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { final Task task = tasks.get(taskNdx); - pw.print(" mTaskId="); pw.println(task.taskId); + pw.print(" mTaskId="); pw.println(task.mTaskId); AppTokenList tokens = task.mAppTokens; for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx, ++ndx) { final AppWindowToken wtoken = tokens.get(tokenNdx); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 80d727d80854..a9b26e290191 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -26,14 +26,13 @@ import com.android.server.EventLogTags; class Task { TaskStack mStack; final AppTokenList mAppTokens = new AppTokenList(); - final int taskId; + final int mTaskId; final int mUserId; boolean mDeferRemoval = false; final WindowManagerService mService; - Task(AppWindowToken wtoken, TaskStack stack, int userId, WindowManagerService service) { - taskId = wtoken.groupId; - mAppTokens.add(wtoken); + Task(int taskId, TaskStack stack, int userId, WindowManagerService service) { + mTaskId = taskId; mStack = stack; mUserId = userId; mService = service; @@ -45,38 +44,47 @@ class Task { void addAppToken(int addPos, AppWindowToken wtoken) { final int lastPos = mAppTokens.size(); - for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { - if (mAppTokens.get(pos).removed) { - // addPos assumes removed tokens are actually gone. - ++addPos; + if (addPos >= lastPos) { + addPos = lastPos; + } else { + for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { + if (mAppTokens.get(pos).removed) { + // addPos assumes removed tokens are actually gone. + ++addPos; + } } } mAppTokens.add(addPos, wtoken); + wtoken.mTask = this; mDeferRemoval = false; } void removeLocked() { if (!mAppTokens.isEmpty() && mStack.isAnimating()) { - if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId); mDeferRemoval = true; return; } - if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + taskId); - EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, taskId, "removeTask"); + if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); + EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask"); mDeferRemoval = false; mStack.removeTask(this); - mService.mTaskIdToTask.delete(taskId); + mService.mTaskIdToTask.delete(mTaskId); } boolean removeAppToken(AppWindowToken wtoken) { boolean removed = mAppTokens.remove(wtoken); if (mAppTokens.size() == 0) { - EventLog.writeEvent(com.android.server.EventLogTags.WM_TASK_REMOVED, taskId, + EventLog.writeEvent(com.android.server.EventLogTags.WM_TASK_REMOVED, mTaskId, "removeAppToken: last token"); if (mDeferRemoval) { removeLocked(); } } + wtoken.mTask = null; + /* Leave mTaskId for now, it might be useful for debug + wtoken.mTaskId = -1; + */ return removed; } @@ -88,6 +96,6 @@ class Task { @Override public String toString() { - return "{taskId=" + taskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; + return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; } } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index d6741b381d26..7b8637e7c894 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -194,7 +194,7 @@ public class TaskStack { if (toTop) { mDisplayContent.moveStack(this, true); } - EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, task.taskId, toTop ? 1 : 0, stackNdx); + EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, task.mTaskId, toTop ? 1 : 0, stackNdx); } void moveTaskToTop(Task task) { @@ -224,10 +224,9 @@ public class TaskStack { } mDisplayContent.layoutNeeded = true; } - final int taskId = task.taskId; for (int appNdx = mExitingAppTokens.size() - 1; appNdx >= 0; --appNdx) { final AppWindowToken wtoken = mExitingAppTokens.get(appNdx); - if (wtoken.groupId == taskId) { + if (wtoken.mTask == task) { wtoken.mIsExiting = false; mExitingAppTokens.remove(appNdx); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 2c05e93ef169..fdbaafb2693f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3612,15 +3612,15 @@ public class WindowManagerService extends IWindowManager.Stub Binder.restoreCallingIdentity(origId); } - private Task createTask(int taskId, int stackId, int userId, AppWindowToken atoken) { - if (DEBUG_STACK) Slog.i(TAG, "createTask: taskId=" + taskId + " stackId=" + stackId + private Task createTaskLocked(int taskId, int stackId, int userId, AppWindowToken atoken) { + if (DEBUG_STACK) Slog.i(TAG, "createTaskLocked: taskId=" + taskId + " stackId=" + stackId + " atoken=" + atoken); final TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId); } EventLog.writeEvent(EventLogTags.WM_TASK_CREATED, taskId, stackId); - Task task = new Task(atoken, stack, userId, this); + Task task = new Task(taskId, stack, userId, this); mTaskIdToTask.put(taskId, task); stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */); return task; @@ -3657,7 +3657,6 @@ public class WindowManagerService extends IWindowManager.Stub } atoken = new AppWindowToken(this, token, voiceInteraction); atoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos; - atoken.groupId = taskId; atoken.appFullscreen = fullscreen; atoken.showWhenLocked = showWhenLocked; atoken.requestedOrientation = requestedOrientation; @@ -3669,10 +3668,9 @@ public class WindowManagerService extends IWindowManager.Stub Task task = mTaskIdToTask.get(taskId); if (task == null) { - createTask(taskId, stackId, userId, atoken); - } else { - task.addAppToken(addPos, atoken); + task = createTaskLocked(taskId, stackId, userId, atoken); } + task.addAppToken(addPos, atoken); mTokenMap.put(token.asBinder(), atoken); @@ -3685,28 +3683,27 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void setAppGroupId(IBinder token, int groupId) { + public void setAppTask(IBinder token, int taskId) { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, - "setAppGroupId()")) { + "setAppTask()")) { throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); } synchronized(mWindowMap) { final AppWindowToken atoken = findAppWindowToken(token); if (atoken == null) { - Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token); + Slog.w(TAG, "Attempted to set task id of non-existing app token: " + token); return; } - final Task oldTask = mTaskIdToTask.get(atoken.groupId); + final Task oldTask = atoken.mTask; oldTask.removeAppToken(atoken); - atoken.groupId = groupId; - Task newTask = mTaskIdToTask.get(groupId); + Task newTask = mTaskIdToTask.get(taskId); if (newTask == null) { - newTask = createTask(groupId, oldTask.mStack.mStackId, oldTask.mUserId, atoken); - } else { - newTask.mAppTokens.add(atoken); + newTask = + createTaskLocked(taskId, oldTask.mStack.mStackId, oldTask.mUserId, atoken); } + newTask.addAppToken(Integer.MAX_VALUE /* at top */, atoken); } } @@ -3990,7 +3987,7 @@ public class WindowManagerService extends IWindowManager.Stub void setFocusedStackFrame() { final TaskStack stack; if (mFocusedApp != null) { - Task task = mTaskIdToTask.get(mFocusedApp.groupId); + final Task task = mFocusedApp.mTask; stack = task.mStack; final DisplayContent displayContent = task.getDisplayContent(); if (displayContent != null) { @@ -4812,7 +4809,7 @@ public class WindowManagerService extends IWindowManager.Stub + " animating=" + wtoken.mAppAnimator.animating); if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "removeAppToken: " + wtoken + " delayed=" + delayed + " Callers=" + Debug.getCallers(4)); - final TaskStack stack = mTaskIdToTask.get(wtoken.groupId).mStack; + final TaskStack stack = wtoken.mTask.mStack; if (delayed && !wtoken.allAppWindows.isEmpty()) { // set the token aside because it has an active animation to be finished if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, @@ -4877,7 +4874,7 @@ public class WindowManagerService extends IWindowManager.Stub final int numTasks = tasks.size(); for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) { final Task task = tasks.get(taskNdx); - Slog.v(TAG, " Task #" + task.taskId + " activities from bottom to top:"); + Slog.v(TAG, " Task #" + task.mTaskId + " activities from bottom to top:"); AppTokenList tokens = task.mAppTokens; final int numTokens = tokens.size(); for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 978f5c30cc24..be33b3eaee8e 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -792,14 +792,14 @@ final class WindowState implements WindowManagerPolicy.WindowState { TaskStack getStack() { AppWindowToken wtoken = mAppToken == null ? mService.mFocusedApp : mAppToken; if (wtoken != null) { - Task task = mService.mTaskIdToTask.get(wtoken.groupId); + Task task = wtoken.mTask; if (task != null) { if (task.mStack != null) { return task.mStack; } Slog.e(TAG, "getStack: mStack null for task=" + task); } else { - Slog.e(TAG, "getStack: " + this + " couldn't find taskId=" + wtoken.groupId + Slog.e(TAG, "getStack: " + this + " couldn't find task for " + wtoken + " Callers=" + Debug.getCallers(4)); } } diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java index 62c92a145f02..e44969d9baf2 100644 --- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java +++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java @@ -103,7 +103,7 @@ public class WindowManagerPermissionTests extends TestCase { } try { - mWm.setAppGroupId(null, 0); + mWm.setAppTask(null, 0); fail("IWindowManager.setAppGroupId did not throw SecurityException as" + " expected"); } catch (SecurityException e) { diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 5176419a8b68..d90271b68b33 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -293,7 +293,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setAppGroupId(IBinder arg0, int arg1) throws RemoteException { + public void setAppTask(IBinder arg0, int arg1) throws RemoteException { // TODO Auto-generated method stub } |