TaskGrouping.java revision 1907cd478209f01a4215d9a3a76294c2c77c9a63
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
46ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    /** Gets the front task */
47ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public boolean isFrontMostTask(Task t) {
48083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        return (t.key == mFrontMostTaskKey);
49ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    }
50ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
51ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    /** Finds the index of a given task in a group. */
52ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public int indexOf(Task t) {
53083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        return mTaskKeyIndices.get(t.key);
54ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    }
55ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
561907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    /** Returns whether a task is in this grouping. */
571907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    public boolean containsTask(Task t) {
581907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung        return mTaskKeyIndices.containsKey(t.key);
591907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    }
601907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung
611907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    /** Returns whether one task is above another in the group.  If they are not in the same group,
621907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung     * this returns false. */
631907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    public boolean isTaskAboveTask(Task t, Task below) {
641907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung        return mTaskKeyIndices.containsKey(t.key) && mTaskKeyIndices.containsKey(below.key) &&
651907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung                mTaskKeyIndices.get(t.key) > mTaskKeyIndices.get(below.key);
661907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung    }
671907cd478209f01a4215d9a3a76294c2c77c9a63Winson Chung
68ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    /** Returns the number of tasks in this group. */
69083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung    public int getTaskCount() { return mTaskKeys.size(); }
70a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung
71a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung    /** Updates the mapping of tasks to indices. */
72a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung    private void updateTaskIndices() {
73083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        if (mTaskKeys.isEmpty()) {
74083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            mFrontMostTaskKey = null;
75083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            mTaskKeyIndices.clear();
76083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            return;
77083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        }
78083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung
79083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        mFrontMostTaskKey = mTaskKeys.get(mTaskKeys.size() - 1);
80083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        mTaskKeyIndices.clear();
81083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        int taskCount = mTaskKeys.size();
82a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung        for (int i = 0; i < taskCount; i++) {
83083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            Task.TaskKey k = mTaskKeys.get(i);
84083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            mTaskKeyIndices.put(k, i);
85a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung        }
86a433fa9c17772f563163ff7db177d091d6aebd5bWinson Chung    }
87ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung}
88