1ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungpackage com.android.systemui.recents.model; 2ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 3ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport java.util.ArrayList; 4a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chungimport java.util.HashMap; 5ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 6ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung/** Represents a grouping of tasks witihin a stack. */ 7ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungpublic class TaskGrouping { 8ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 9083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung int affiliation; 10ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung long latestActiveTimeInGroup; 11ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 12083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung Task.TaskKey mFrontMostTaskKey; 13083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung ArrayList<Task.TaskKey> mTaskKeys = new ArrayList<Task.TaskKey>(); 14083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung HashMap<Task.TaskKey, Integer> mTaskKeyIndices = new HashMap<Task.TaskKey, Integer>(); 15ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 16ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Creates a group with a specified affiliation. */ 17083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung public TaskGrouping(int affiliation) { 18ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung this.affiliation = affiliation; 19ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 20ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 21ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Adds a new task to this group. */ 22ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung void addTask(Task t) { 23083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mTaskKeys.add(t.key); 24ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung if (t.key.lastActiveTime > latestActiveTimeInGroup) { 25ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung latestActiveTimeInGroup = t.key.lastActiveTime; 26ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 27ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung t.setGroup(this); 28a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung updateTaskIndices(); 29ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 30ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 31ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Removes a task from this group. */ 32ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung void removeTask(Task t) { 33083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mTaskKeys.remove(t.key); 34ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung latestActiveTimeInGroup = 0; 35083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung int taskCount = mTaskKeys.size(); 36ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung for (int i = 0; i < taskCount; i++) { 37083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung long lastActiveTime = mTaskKeys.get(i).lastActiveTime; 38ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung if (lastActiveTime > latestActiveTimeInGroup) { 39ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung latestActiveTimeInGroup = lastActiveTime; 40ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 41ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 42ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung t.setGroup(null); 43a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung updateTaskIndices(); 44ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 45ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 46b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung /** Returns the key of the next task in the group. */ 47b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung public Task.TaskKey getNextTaskInGroup(Task t) { 48b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung int i = indexOf(t); 49b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung if ((i + 1) < getTaskCount()) { 50b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung return mTaskKeys.get(i + 1); 51b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 52b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung return null; 53b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 54b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung 55b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung /** Returns the key of the previous task in the group. */ 56b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung public Task.TaskKey getPrevTaskInGroup(Task t) { 57b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung int i = indexOf(t); 58b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung if ((i - 1) >= 0) { 59b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung return mTaskKeys.get(i - 1); 60b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 61b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung return null; 62b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 63b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung 64ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Gets the front task */ 65ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public boolean isFrontMostTask(Task t) { 66083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung return (t.key == mFrontMostTaskKey); 67ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 68ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 69ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Finds the index of a given task in a group. */ 70ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public int indexOf(Task t) { 71083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung return mTaskKeyIndices.get(t.key); 72ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 73ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 741907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung /** Returns whether a task is in this grouping. */ 751907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung public boolean containsTask(Task t) { 761907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung return mTaskKeyIndices.containsKey(t.key); 771907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung } 781907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung 791907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung /** Returns whether one task is above another in the group. If they are not in the same group, 801907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung * this returns false. */ 811907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung public boolean isTaskAboveTask(Task t, Task below) { 821907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung return mTaskKeyIndices.containsKey(t.key) && mTaskKeyIndices.containsKey(below.key) && 831907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung mTaskKeyIndices.get(t.key) > mTaskKeyIndices.get(below.key); 841907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung } 851907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung 86ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Returns the number of tasks in this group. */ 87083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung public int getTaskCount() { return mTaskKeys.size(); } 88a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung 89a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung /** Updates the mapping of tasks to indices. */ 90a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung private void updateTaskIndices() { 91083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung if (mTaskKeys.isEmpty()) { 92083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mFrontMostTaskKey = null; 93083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mTaskKeyIndices.clear(); 94083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung return; 95083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung } 96083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung 97083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mFrontMostTaskKey = mTaskKeys.get(mTaskKeys.size() - 1); 98083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mTaskKeyIndices.clear(); 99083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung int taskCount = mTaskKeys.size(); 100a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung for (int i = 0; i < taskCount; i++) { 101083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung Task.TaskKey k = mTaskKeys.get(i); 102083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung mTaskKeyIndices.put(k, i); 103a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung } 104a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung } 105ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung} 106