Task.java revision d16c565a607de754379fe699a4def21bd0e3de2f
1303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/*
2303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Copyright (C) 2014 The Android Open Source Project
3303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
4303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * you may not use this file except in compliance with the License.
6303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * You may obtain a copy of the License at
7303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
8303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
10303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Unless required by applicable law or agreed to in writing, software
11303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * See the License for the specific language governing permissions and
14303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * limitations under the License.
15303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
16303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
17303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpackage com.android.systemui.recents.model;
18303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
19a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guyimport android.content.ComponentName;
20303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent;
21303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.Bitmap;
2293748a11cba1b44edbc2e888c997533461355594Winson Chungimport android.graphics.Color;
23303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.drawable.Drawable;
24ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Utilities;
25303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
26a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guyimport java.util.Objects;
27a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
28303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
29303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/**
30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * A task represents the top most task in the system's task stack.
31303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class Task {
3304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    /* Task callbacks */
3404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public interface TaskCallbacks {
3504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        /* Notifies when a task has been bound */
368eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void onTaskDataLoaded();
3704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        /* Notifies when a task has been unbound */
3804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public void onTaskDataUnloaded();
39d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
40d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        /* Notifies when a task's stack id has changed. */
41d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        public void onMultiStackDebugTaskStackIdChanged();
4204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    }
4304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
44a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy    /** The ComponentNameKey represents the unique primary key for a component
45a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy     * belonging to a specified user. */
46a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy    public static class ComponentNameKey {
47a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        final ComponentName component;
48a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        final int userId;
49a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
50a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        public ComponentNameKey(ComponentName cn, int user) {
51a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            component = cn;
52a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            userId = user;
53a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        }
54a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
55a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        @Override
56a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        public int hashCode() {
57a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            return Objects.hash(component, userId);
58a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        }
59a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
60a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        @Override
61a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        public boolean equals(Object o) {
62a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            if (!(o instanceof ComponentNameKey)) {
63a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy                return false;
64a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            }
65a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            return component.equals(((ComponentNameKey) o).component) &&
66a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy                    userId == ((ComponentNameKey) o).userId;
67a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        }
68a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy    }
69a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
7004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    /* The Task Key represents the unique primary key for the task */
7104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public static class TaskKey {
72a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        final ComponentNameKey mComponentNameKey;
7304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public final int id;
74d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        public int stackId;
75c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung        public final Intent baseIntent;
764f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani        public final int userId;
77ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        public long firstActiveTime;
78f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung        public long lastActiveTime;
7904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
80d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        public TaskKey(int id, int stackId, Intent intent, int userId, long firstActiveTime,
81d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung                long lastActiveTime) {
82a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            mComponentNameKey = new ComponentNameKey(intent.getComponent(), userId);
8304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung            this.id = id;
84d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            this.stackId = stackId;
85c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung            this.baseIntent = intent;
864f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            this.userId = userId;
87ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            this.firstActiveTime = firstActiveTime;
88f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung            this.lastActiveTime = lastActiveTime;
89f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung        }
90f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung
91a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        /** Returns the component name key for this task. */
92a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        public ComponentNameKey getComponentNameKey() {
93a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy            return mComponentNameKey;
94a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        }
95a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
9604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
9704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public boolean equals(Object o) {
984f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            if (!(o instanceof TaskKey)) {
994f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani                return false;
1004f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            }
101d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            TaskKey otherKey = (TaskKey) o;
102d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            return id == otherKey.id && stackId == otherKey.stackId && userId == otherKey.userId;
10304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
10404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
10504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
10604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public int hashCode() {
107d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            return Objects.hash(id, stackId, userId);
10804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
10904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
11004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
11104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public String toString() {
1124f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            return "Task.Key: " + id + ", "
113d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung                    + "s: " + stackId + ", "
114f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung                    + "u: " + userId + ", "
115f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung                    + "lat: " + lastActiveTime + ", "
1164f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani                    + baseIntent.getComponent().getPackageName();
11704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
11804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    }
11904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
12004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public TaskKey key;
121ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public TaskGrouping group;
122083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung    public int taskAffiliation;
123ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung    public int taskAffiliationColor;
124dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    public boolean isLaunchTarget;
1255e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public Drawable applicationIcon;
12611e41baac63a42d7ddb7ba2cab40ee55443d262fWinson Chung    public Drawable activityIcon;
1275e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public String activityLabel;
128f5e22e71cb5f8699a4312c797af068f655cbe629Winson Chung    public int colorPrimary;
12993748a11cba1b44edbc2e888c997533461355594Winson Chung    public boolean useLightOnPrimaryColor;
130303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public Bitmap thumbnail;
1314be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung    public boolean isActive;
13256e09b42a0f1670970872bef611a8036904ad6bfJason Monk    public boolean lockToThisTask;
13356e09b42a0f1670970872bef611a8036904ad6bfJason Monk    public boolean lockToTaskEnabled;
134bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi    public Bitmap icon;
135bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi    public String iconFilename;
136303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    TaskCallbacks mCb;
137303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1380d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung    public Task() {
13904400672962d2e12132f9465928cbf7615c147c4Winson Chung        // Do nothing
1400d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung    }
1410d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung
142a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    public Task(TaskKey key, boolean isActive, int taskAffiliation, int taskAffiliationColor,
143a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung                String activityTitle, Drawable activityIcon, int colorPrimary,
144bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi                boolean lockToThisTask, boolean lockToTaskEnabled, Bitmap icon,
145bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi                String iconFilename) {
146a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        boolean isInAffiliationGroup = (taskAffiliation != key.id);
147ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        boolean hasAffiliationGroupColor = isInAffiliationGroup && (taskAffiliationColor != 0);
148a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.key = key;
149083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        this.taskAffiliation = taskAffiliation;
150ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.taskAffiliationColor = taskAffiliationColor;
1515e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.activityLabel = activityTitle;
1525e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.activityIcon = activityIcon;
153ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.colorPrimary = hasAffiliationGroupColor ? taskAffiliationColor : colorPrimary;
154ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.useLightOnPrimaryColor = Utilities.computeContrastBetweenColors(this.colorPrimary,
15593748a11cba1b44edbc2e888c997533461355594Winson Chung                Color.WHITE) > 3f;
1564be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung        this.isActive = isActive;
15756e09b42a0f1670970872bef611a8036904ad6bfJason Monk        this.lockToThisTask = lockToTaskEnabled && lockToThisTask;
15856e09b42a0f1670970872bef611a8036904ad6bfJason Monk        this.lockToTaskEnabled = lockToTaskEnabled;
159bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi        this.icon = icon;
160bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi        this.iconFilename = iconFilename;
161a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    }
162a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung
163a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    /** Copies the other task. */
164a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    public void copyFrom(Task o) {
165a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.key = o.key;
166a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.taskAffiliation = o.taskAffiliation;
167a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.taskAffiliationColor = o.taskAffiliationColor;
168a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.activityLabel = o.activityLabel;
169a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.activityIcon = o.activityIcon;
170a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.colorPrimary = o.colorPrimary;
171a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.useLightOnPrimaryColor = o.useLightOnPrimaryColor;
172a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.isActive = o.isActive;
173a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.lockToThisTask = o.lockToThisTask;
174a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.lockToTaskEnabled = o.lockToTaskEnabled;
175303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
176303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
177303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Set the callbacks */
178303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void setCallbacks(TaskCallbacks cb) {
179303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mCb = cb;
180303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
181303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
182ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    /** Set the grouping */
183ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public void setGroup(TaskGrouping group) {
184ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        if (group != null && this.group != null) {
185ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            throw new RuntimeException("This task is already assigned to a group.");
186ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        }
187ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        this.group = group;
188ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    }
189ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
190d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    /** Updates the stack id of this task. */
191d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    public void setStackId(int stackId) {
192d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        key.stackId = stackId;
193d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        if (mCb != null) {
194d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            mCb.onMultiStackDebugTaskStackIdChanged();
195d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        }
196d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    }
197d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
1984d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    /** Notifies the callback listeners that this task has been loaded */
1998eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon) {
2005e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.applicationIcon = applicationIcon;
2014d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        this.thumbnail = thumbnail;
2024d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (mCb != null) {
2038eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            mCb.onTaskDataLoaded();
2044d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
2054d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
2064d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
2074d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    /** Notifies the callback listeners that this task has been unloaded */
2085e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public void notifyTaskDataUnloaded(Bitmap defaultThumbnail, Drawable defaultApplicationIcon) {
2095e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        applicationIcon = defaultApplicationIcon;
2104d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        thumbnail = defaultThumbnail;
2114d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (mCb != null) {
21204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung            mCb.onTaskDataUnloaded();
2134d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
2144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
2154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
216303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
217303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public boolean equals(Object o) {
218a10370fc2eb8eb95631592160c5f6281b9d75722Winson Chung        // Check that the id matches
219303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Task t = (Task) o;
22004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        return key.equals(t.key);
221303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
222303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
223303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
224303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public String toString() {
225ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        String groupAffiliation = "no group";
226ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        if (group != null) {
227083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            groupAffiliation = Integer.toString(group.affiliation);
228ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        }
229ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        return "Task (" + groupAffiliation + "): " + key.baseIntent.getComponent().getPackageName() +
230ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung                " [" + super.toString() + "]";
231303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
232303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
233