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(); 2983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner final int mTaskId; 30ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final int mUserId; 319ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner boolean mDeferRemoval = false; 32e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner final WindowManagerService mService; 33b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 3483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner Task(int taskId, TaskStack stack, int userId, WindowManagerService service) { 3583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner mTaskId = taskId; 36c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mStack = stack; 37ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mUserId = userId; 38e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mService = service; 39c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 40c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 41c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner DisplayContent getDisplayContent() { 42c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return mStack.getDisplayContent(); 43c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 44c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 45c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner void addAppToken(int addPos, AppWindowToken wtoken) { 4642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner final int lastPos = mAppTokens.size(); 4783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (addPos >= lastPos) { 4883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner addPos = lastPos; 4983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner } else { 5083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { 5183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (mAppTokens.get(pos).removed) { 5283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner // addPos assumes removed tokens are actually gone. 5383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner ++addPos; 5483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner } 5501f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner } 5642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner } 57c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mAppTokens.add(addPos, wtoken); 5883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTask = this; 5942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner mDeferRemoval = false; 60c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 61c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 62e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner void removeLocked() { 63e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (!mAppTokens.isEmpty() && mStack.isAnimating()) { 6483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId); 65e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = true; 66e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner return; 67e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 6883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); 6983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask"); 70e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = false; 71e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mStack.removeTask(this); 7283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner mService.mTaskIdToTask.delete(mTaskId); 73e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 74e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 7553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale void moveTaskToStack(TaskStack stack, boolean toTop) { 7653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (stack == mStack) { 7753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale return; 7853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 7953a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId 8053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale + " from stack=" + mStack); 81000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask"); 8253a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (mStack != null) { 8353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale mStack.removeTask(this); 8453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 8553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale stack.addTask(this, toTop); 8653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 8753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale 88c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner boolean removeAppToken(AppWindowToken wtoken) { 8942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner boolean removed = mAppTokens.remove(wtoken); 90c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (mAppTokens.size() == 0) { 91000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, 922c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner "removeAppToken: last token"); 93e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (mDeferRemoval) { 94e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner removeLocked(); 95e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 96c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 9783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTask = null; 9883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner /* Leave mTaskId for now, it might be useful for debug 9983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTaskId = -1; 10083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner */ 10142bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner return removed; 102b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 1035d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner 104cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner void setSendingToBottom(boolean toBottom) { 105cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) { 106cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner mAppTokens.get(appTokenNdx).sendingToBottom = toBottom; 107cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 108cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 109cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner 1106dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale boolean showForAllUsers() { 1113fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale final int tokensCount = mAppTokens.size(); 1126dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers; 1133fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale } 1143fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale 1155d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner @Override 1165d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner public String toString() { 11783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; 1185d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner } 119b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner} 120