Task.java revision e3119b7d353e71d1f94ddff932b722b4d285931e
1b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner/* 2b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Copyright (C) 2013 The Android Open Source Project 3b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 4b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * you may not use this file except in compliance with the License. 6b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * You may obtain a copy of the License at 7b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 8b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 10b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Unless required by applicable law or agreed to in writing, software 11b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * See the License for the specific language governing permissions and 14b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * limitations under the License. 15b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner */ 16b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 17b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautnerpackage com.android.server.wm; 18b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 1942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport static com.android.server.wm.WindowManagerService.TAG; 20e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK; 2142bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner 222c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog; 2342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog; 24e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport com.android.server.EventLogTags; 252c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner 26c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerclass Task { 27c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner TaskStack mStack; 2805d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner final AppTokenList mAppTokens = new AppTokenList(); 2905d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner final int taskId; 30ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final int mUserId; 319ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner boolean mDeferRemoval = false; 32e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner final WindowManagerService mService; 33b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 34e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner Task(AppWindowToken wtoken, TaskStack stack, int userId, WindowManagerService service) { 35b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner taskId = wtoken.groupId; 36b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner mAppTokens.add(wtoken); 37c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mStack = stack; 38ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mUserId = userId; 39e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mService = service; 40c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 41c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 42c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner DisplayContent getDisplayContent() { 43c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return mStack.getDisplayContent(); 44c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 45c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 46c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner void addAppToken(int addPos, AppWindowToken wtoken) { 4742bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner final int lastPos = mAppTokens.size(); 4801f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { 4901f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner if (mAppTokens.get(pos).removed) { 5001f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner // addPos assumes removed tokens are actually gone. 5101f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner ++addPos; 5201f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner } 5342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner } 54c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mAppTokens.add(addPos, wtoken); 5542bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner mDeferRemoval = false; 56c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 57c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 58e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner void removeLocked() { 59e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (!mAppTokens.isEmpty() && mStack.isAnimating()) { 60e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + taskId); 61e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = true; 62e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner return; 63e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 64e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + taskId); 65e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, taskId, "removeTask"); 66e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = false; 67e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mStack.removeTask(this); 68e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mService.mTaskIdToTask.delete(taskId); 69e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 70e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 71c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner boolean removeAppToken(AppWindowToken wtoken) { 7242bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner boolean removed = mAppTokens.remove(wtoken); 73c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (mAppTokens.size() == 0) { 742c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner EventLog.writeEvent(com.android.server.EventLogTags.WM_TASK_REMOVED, taskId, 752c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner "removeAppToken: last token"); 76e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (mDeferRemoval) { 77e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner removeLocked(); 78e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 79c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 8042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner return removed; 81b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 825d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner 83cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner void setSendingToBottom(boolean toBottom) { 84cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) { 85cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner mAppTokens.get(appTokenNdx).sendingToBottom = toBottom; 86cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 87cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 88cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner 895d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner @Override 905d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner public String toString() { 913d7ca31c9e4a076cef5339ae58d5cafb2efbbc8fCraig Mautner return "{taskId=" + taskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; 925d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner } 93b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner} 94