1 package com.android.systemui.recents.model; 2 3 import android.util.ArrayMap; 4 5 import java.util.ArrayList; 6 7 /** Represents a grouping of tasks witihin a stack. */ 8 public class TaskGrouping { 9 10 int affiliation; 11 long latestActiveTimeInGroup; 12 13 Task.TaskKey mFrontMostTaskKey; 14 ArrayList<Task.TaskKey> mTaskKeys = new ArrayList<Task.TaskKey>(); 15 ArrayMap<Task.TaskKey, Integer> mTaskKeyIndices = new ArrayMap<>(); 16 17 /** Creates a group with a specified affiliation. */ TaskGrouping(int affiliation)18 public TaskGrouping(int affiliation) { 19 this.affiliation = affiliation; 20 } 21 22 /** Adds a new task to this group. */ addTask(Task t)23 void addTask(Task t) { 24 mTaskKeys.add(t.key); 25 if (t.key.lastActiveTime > latestActiveTimeInGroup) { 26 latestActiveTimeInGroup = t.key.lastActiveTime; 27 } 28 t.setGroup(this); 29 updateTaskIndices(); 30 } 31 32 /** Removes a task from this group. */ removeTask(Task t)33 void removeTask(Task t) { 34 mTaskKeys.remove(t.key); 35 latestActiveTimeInGroup = 0; 36 int taskCount = mTaskKeys.size(); 37 for (int i = 0; i < taskCount; i++) { 38 long lastActiveTime = mTaskKeys.get(i).lastActiveTime; 39 if (lastActiveTime > latestActiveTimeInGroup) { 40 latestActiveTimeInGroup = lastActiveTime; 41 } 42 } 43 t.setGroup(null); 44 updateTaskIndices(); 45 } 46 47 /** Returns the key of the next task in the group. */ getNextTaskInGroup(Task t)48 public Task.TaskKey getNextTaskInGroup(Task t) { 49 int i = indexOf(t); 50 if ((i + 1) < getTaskCount()) { 51 return mTaskKeys.get(i + 1); 52 } 53 return null; 54 } 55 56 /** Returns the key of the previous task in the group. */ getPrevTaskInGroup(Task t)57 public Task.TaskKey getPrevTaskInGroup(Task t) { 58 int i = indexOf(t); 59 if ((i - 1) >= 0) { 60 return mTaskKeys.get(i - 1); 61 } 62 return null; 63 } 64 65 /** Gets the front task */ isFrontMostTask(Task t)66 public boolean isFrontMostTask(Task t) { 67 return (t.key == mFrontMostTaskKey); 68 } 69 70 /** Finds the index of a given task in a group. */ indexOf(Task t)71 public int indexOf(Task t) { 72 return mTaskKeyIndices.get(t.key); 73 } 74 75 /** Returns whether a task is in this grouping. */ containsTask(Task t)76 public boolean containsTask(Task t) { 77 return mTaskKeyIndices.containsKey(t.key); 78 } 79 80 /** Returns whether one task is above another in the group. If they are not in the same group, 81 * this returns false. */ isTaskAboveTask(Task t, Task below)82 public boolean isTaskAboveTask(Task t, Task below) { 83 return mTaskKeyIndices.containsKey(t.key) && mTaskKeyIndices.containsKey(below.key) && 84 mTaskKeyIndices.get(t.key) > mTaskKeyIndices.get(below.key); 85 } 86 87 /** Returns the number of tasks in this group. */ getTaskCount()88 public int getTaskCount() { return mTaskKeys.size(); } 89 90 /** Updates the mapping of tasks to indices. */ updateTaskIndices()91 private void updateTaskIndices() { 92 if (mTaskKeys.isEmpty()) { 93 mFrontMostTaskKey = null; 94 mTaskKeyIndices.clear(); 95 return; 96 } 97 98 int taskCount = mTaskKeys.size(); 99 mFrontMostTaskKey = mTaskKeys.get(mTaskKeys.size() - 1); 100 mTaskKeyIndices.clear(); 101 for (int i = 0; i < taskCount; i++) { 102 Task.TaskKey k = mTaskKeys.get(i); 103 mTaskKeyIndices.put(k, i); 104 } 105 } 106 } 107