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