| package com.android.systemui.recents.model; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| |
| /** Represents a grouping of tasks witihin a stack. */ |
| public class TaskGrouping { |
| |
| int affiliation; |
| long latestActiveTimeInGroup; |
| |
| Task.TaskKey mFrontMostTaskKey; |
| ArrayList<Task.TaskKey> mTaskKeys = new ArrayList<Task.TaskKey>(); |
| HashMap<Task.TaskKey, Integer> mTaskKeyIndices = new HashMap<Task.TaskKey, Integer>(); |
| |
| /** Creates a group with a specified affiliation. */ |
| public TaskGrouping(int affiliation) { |
| this.affiliation = affiliation; |
| } |
| |
| /** Adds a new task to this group. */ |
| void addTask(Task t) { |
| mTaskKeys.add(t.key); |
| if (t.key.lastActiveTime > latestActiveTimeInGroup) { |
| latestActiveTimeInGroup = t.key.lastActiveTime; |
| } |
| t.setGroup(this); |
| updateTaskIndices(); |
| } |
| |
| /** Removes a task from this group. */ |
| void removeTask(Task t) { |
| mTaskKeys.remove(t.key); |
| latestActiveTimeInGroup = 0; |
| int taskCount = mTaskKeys.size(); |
| for (int i = 0; i < taskCount; i++) { |
| long lastActiveTime = mTaskKeys.get(i).lastActiveTime; |
| if (lastActiveTime > latestActiveTimeInGroup) { |
| latestActiveTimeInGroup = lastActiveTime; |
| } |
| } |
| t.setGroup(null); |
| updateTaskIndices(); |
| } |
| |
| /** Returns the key of the next task in the group. */ |
| public Task.TaskKey getNextTaskInGroup(Task t) { |
| int i = indexOf(t); |
| if ((i + 1) < getTaskCount()) { |
| return mTaskKeys.get(i + 1); |
| } |
| return null; |
| } |
| |
| /** Returns the key of the previous task in the group. */ |
| public Task.TaskKey getPrevTaskInGroup(Task t) { |
| int i = indexOf(t); |
| if ((i - 1) >= 0) { |
| return mTaskKeys.get(i - 1); |
| } |
| return null; |
| } |
| |
| /** Gets the front task */ |
| public boolean isFrontMostTask(Task t) { |
| return (t.key == mFrontMostTaskKey); |
| } |
| |
| /** Finds the index of a given task in a group. */ |
| public int indexOf(Task t) { |
| return mTaskKeyIndices.get(t.key); |
| } |
| |
| /** Returns whether a task is in this grouping. */ |
| public boolean containsTask(Task t) { |
| return mTaskKeyIndices.containsKey(t.key); |
| } |
| |
| /** Returns whether one task is above another in the group. If they are not in the same group, |
| * this returns false. */ |
| public boolean isTaskAboveTask(Task t, Task below) { |
| return mTaskKeyIndices.containsKey(t.key) && mTaskKeyIndices.containsKey(below.key) && |
| mTaskKeyIndices.get(t.key) > mTaskKeyIndices.get(below.key); |
| } |
| |
| /** Returns the number of tasks in this group. */ |
| public int getTaskCount() { return mTaskKeys.size(); } |
| |
| /** Updates the mapping of tasks to indices. */ |
| private void updateTaskIndices() { |
| if (mTaskKeys.isEmpty()) { |
| mFrontMostTaskKey = null; |
| mTaskKeyIndices.clear(); |
| return; |
| } |
| |
| mFrontMostTaskKey = mTaskKeys.get(mTaskKeys.size() - 1); |
| mTaskKeyIndices.clear(); |
| int taskCount = mTaskKeys.size(); |
| for (int i = 0; i < taskCount; i++) { |
| Task.TaskKey k = mTaskKeys.get(i); |
| mTaskKeyIndices.put(k, i); |
| } |
| } |
| } |