/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.wm; import java.io.PrintWriter; import java.util.ArrayList; public class TaskStack { /** Unique identifier */ final int mStackId; /** The display this stack sits under. */ private final DisplayContent mDisplayContent; /** The Tasks that define this stack. Oldest Tasks are at the bottom. The ordering must match * mTaskHistory in the ActivityStack with the same mStackId */ private ArrayList mTasks = new ArrayList(); /** The StackBox this sits in. */ private final StackBox mParent; TaskStack(int stackId, StackBox parent) { mStackId = stackId; mParent = parent; mDisplayContent = mParent.mDisplayContent; } DisplayContent getDisplayContent() { return mDisplayContent; } ArrayList getTasks() { return mTasks; } ArrayList merge(TaskStack stack) { ArrayList taskLists = stack.mTasks; taskLists.addAll(mTasks); mTasks = taskLists; return taskLists; } /** * Put a Task in this stack. Used for adding and moving. * @param task The task to add. * @param toTop Whether to add it to the top or bottom. */ void addTask(Task task, boolean toTop) { mParent.makeDirty(); mTasks.add(toTop ? mTasks.size() : 0, task); mDisplayContent.moveStackBox(mStackId, toTop); } void moveTaskToTop(Task task) { mTasks.remove(task); addTask(task, true); } void moveTaskToBottom(Task task) { mTasks.remove(task); addTask(task, false); } /** * Delete a Task from this stack. If it is the last Task in the stack, remove this stack from * its parent StackBox and merge the parent. * @param task The Task to delete. * @return True if #task was in this stack. */ boolean removeTask(Task task) { mParent.makeDirty(); if (mTasks.remove(task)) { if (mTasks.size() == 0) { mParent.removeStack(); } return true; } return false; } int remove() { return mParent.removeStack(); } int numTokens() { int count = 0; for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) { count += mTasks.get(taskNdx).mAppTokens.size(); } return count; } public void dump(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("mStackId="); pw.println(mStackId); for (int taskNdx = 0; taskNdx < mTasks.size(); ++taskNdx) { pw.print(prefix); pw.println(mTasks.get(taskNdx)); } } }