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