Task.java revision 2dd7694681b7256e136d7f4d060be2858c48e835
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;
232dd7694681b7256e136d7f4d060be2858c48e835Winsonimport android.graphics.Rect;
24303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.drawable.Drawable;
25ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Utilities;
26303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
27a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guyimport java.util.Objects;
28a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
29303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/**
31303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * A task represents the top most task in the system's task stack.
32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
33303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class Task {
3404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    /* Task callbacks */
3504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public interface TaskCallbacks {
3604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        /* Notifies when a task has been bound */
378eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void onTaskDataLoaded();
3804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        /* Notifies when a task has been unbound */
3904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public void onTaskDataUnloaded();
40d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
41d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        /* Notifies when a task's stack id has changed. */
42e7f138c7f0a190c86cec10fb32fa106aacae4093Winson        public void onTaskStackIdChanged();
43a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy    }
44a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
4504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    /* The Task Key represents the unique primary key for the task */
4604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public static class TaskKey {
4704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public final int id;
48d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        public int stackId;
49c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung        public final Intent baseIntent;
504f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani        public final int userId;
51ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        public long firstActiveTime;
52f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung        public long lastActiveTime;
5304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
54d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        public TaskKey(int id, int stackId, Intent intent, int userId, long firstActiveTime,
55d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung                long lastActiveTime) {
5604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung            this.id = id;
57d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            this.stackId = stackId;
58c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung            this.baseIntent = intent;
594f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            this.userId = userId;
60ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            this.firstActiveTime = firstActiveTime;
61f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung            this.lastActiveTime = lastActiveTime;
62f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung        }
63f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung
64e7f138c7f0a190c86cec10fb32fa106aacae4093Winson        public ComponentName getComponent() {
65e7f138c7f0a190c86cec10fb32fa106aacae4093Winson            return this.baseIntent.getComponent();
66a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy        }
67a734fc1ecedb316fdf6deddc169b8b0bddab76bfKenny Guy
6804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
6904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public boolean equals(Object o) {
704f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            if (!(o instanceof TaskKey)) {
714f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani                return false;
724f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            }
73d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            TaskKey otherKey = (TaskKey) o;
74d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            return id == otherKey.id && stackId == otherKey.stackId && userId == otherKey.userId;
7504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
7604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
7704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
7804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public int hashCode() {
79d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung            return Objects.hash(id, stackId, userId);
8004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
8104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
8204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        @Override
8304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        public String toString() {
844f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani            return "Task.Key: " + id + ", "
85d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung                    + "s: " + stackId + ", "
86f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung                    + "u: " + userId + ", "
87f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung                    + "lat: " + lastActiveTime + ", "
88e7f138c7f0a190c86cec10fb32fa106aacae4093Winson                    + getComponent().getPackageName();
8904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        }
9004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    }
9104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung
9204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung    public TaskKey key;
93ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public TaskGrouping group;
94083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung    public int taskAffiliation;
95ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung    public int taskAffiliationColor;
96dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    public boolean isLaunchTarget;
975e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public Drawable applicationIcon;
9811e41baac63a42d7ddb7ba2cab40ee55443d262fWinson Chung    public Drawable activityIcon;
99b7a42fda313b6e5d5e82591ea9fb5d1b30acfc55Benjamin Franz    public String contentDescription;
1005e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public String activityLabel;
101f5e22e71cb5f8699a4312c797af068f655cbe629Winson Chung    public int colorPrimary;
10293748a11cba1b44edbc2e888c997533461355594Winson Chung    public boolean useLightOnPrimaryColor;
103303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public Bitmap thumbnail;
1044be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung    public boolean isActive;
10556e09b42a0f1670970872bef611a8036904ad6bfJason Monk    public boolean lockToThisTask;
10656e09b42a0f1670970872bef611a8036904ad6bfJason Monk    public boolean lockToTaskEnabled;
107bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi    public Bitmap icon;
108bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi    public String iconFilename;
1092dd7694681b7256e136d7f4d060be2858c48e835Winson    public Rect bounds;
110e7f138c7f0a190c86cec10fb32fa106aacae4093Winson
111e7f138c7f0a190c86cec10fb32fa106aacae4093Winson    private TaskCallbacks mCb;
112303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1130d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung    public Task() {
11404400672962d2e12132f9465928cbf7615c147c4Winson Chung        // Do nothing
1150d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung    }
1160d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung
117a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    public Task(TaskKey key, boolean isActive, int taskAffiliation, int taskAffiliationColor,
118b7a42fda313b6e5d5e82591ea9fb5d1b30acfc55Benjamin Franz                String activityTitle, String contentDescription, Drawable activityIcon,
119b7a42fda313b6e5d5e82591ea9fb5d1b30acfc55Benjamin Franz                int colorPrimary, boolean lockToThisTask, boolean lockToTaskEnabled, Bitmap icon,
1202dd7694681b7256e136d7f4d060be2858c48e835Winson                String iconFilename, Rect bounds) {
121a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        boolean isInAffiliationGroup = (taskAffiliation != key.id);
122ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        boolean hasAffiliationGroupColor = isInAffiliationGroup && (taskAffiliationColor != 0);
123a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.key = key;
124083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        this.taskAffiliation = taskAffiliation;
125ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.taskAffiliationColor = taskAffiliationColor;
1265e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.activityLabel = activityTitle;
127b7a42fda313b6e5d5e82591ea9fb5d1b30acfc55Benjamin Franz        this.contentDescription = contentDescription;
1285e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.activityIcon = activityIcon;
129ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.colorPrimary = hasAffiliationGroupColor ? taskAffiliationColor : colorPrimary;
130ec396d6399c5c31d697d81e94aff459e9771b0c6Winson Chung        this.useLightOnPrimaryColor = Utilities.computeContrastBetweenColors(this.colorPrimary,
13193748a11cba1b44edbc2e888c997533461355594Winson Chung                Color.WHITE) > 3f;
1324be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung        this.isActive = isActive;
13356e09b42a0f1670970872bef611a8036904ad6bfJason Monk        this.lockToThisTask = lockToTaskEnabled && lockToThisTask;
13456e09b42a0f1670970872bef611a8036904ad6bfJason Monk        this.lockToTaskEnabled = lockToTaskEnabled;
135bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi        this.icon = icon;
136bdd4b201e45ffa82dcd3b09fb9724d243c86c8d8Jorim Jaggi        this.iconFilename = iconFilename;
1372dd7694681b7256e136d7f4d060be2858c48e835Winson        this.bounds = bounds;
138a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    }
139a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung
140a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    /** Copies the other task. */
141a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    public void copyFrom(Task o) {
142a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.key = o.key;
143a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.taskAffiliation = o.taskAffiliation;
144a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.taskAffiliationColor = o.taskAffiliationColor;
145a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.activityLabel = o.activityLabel;
146b7a42fda313b6e5d5e82591ea9fb5d1b30acfc55Benjamin Franz        this.contentDescription = o.contentDescription;
147a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.activityIcon = o.activityIcon;
148a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.colorPrimary = o.colorPrimary;
149a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.useLightOnPrimaryColor = o.useLightOnPrimaryColor;
150a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.isActive = o.isActive;
151a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.lockToThisTask = o.lockToThisTask;
152a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        this.lockToTaskEnabled = o.lockToTaskEnabled;
153303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
154303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
155303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Set the callbacks */
156303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void setCallbacks(TaskCallbacks cb) {
157303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mCb = cb;
158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
159303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
160ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    /** Set the grouping */
161ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    public void setGroup(TaskGrouping group) {
162ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        if (group != null && this.group != null) {
163ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            throw new RuntimeException("This task is already assigned to a group.");
164ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        }
165ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        this.group = group;
166ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    }
167ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
168d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    /** Updates the stack id of this task. */
169d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    public void setStackId(int stackId) {
170d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        key.stackId = stackId;
171d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        if (mCb != null) {
172e7f138c7f0a190c86cec10fb32fa106aacae4093Winson            mCb.onTaskStackIdChanged();
173d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        }
174d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    }
175d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
17623afcae84422ac7c9687b17a6193f74264361303Winson    public boolean isFreeformTask() {
17723afcae84422ac7c9687b17a6193f74264361303Winson        // Temporarily disable:
17823afcae84422ac7c9687b17a6193f74264361303Winson        return false;
17923afcae84422ac7c9687b17a6193f74264361303Winson        // return SystemServicesProxy.isFreeformStack(key.stackId);
18023afcae84422ac7c9687b17a6193f74264361303Winson    }
18123afcae84422ac7c9687b17a6193f74264361303Winson
1824d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    /** Notifies the callback listeners that this task has been loaded */
1838eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon) {
1845e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        this.applicationIcon = applicationIcon;
1854d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        this.thumbnail = thumbnail;
1864d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (mCb != null) {
1878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            mCb.onTaskDataLoaded();
1884d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
1894d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
1904d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
1914d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    /** Notifies the callback listeners that this task has been unloaded */
1925e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung    public void notifyTaskDataUnloaded(Bitmap defaultThumbnail, Drawable defaultApplicationIcon) {
1935e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung        applicationIcon = defaultApplicationIcon;
1944d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        thumbnail = defaultThumbnail;
1954d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (mCb != null) {
19604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung            mCb.onTaskDataUnloaded();
1974d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
1984d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
1994d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
200303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
201303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public boolean equals(Object o) {
202a10370fc2eb8eb95631592160c5f6281b9d75722Winson Chung        // Check that the id matches
203303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Task t = (Task) o;
20404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung        return key.equals(t.key);
205303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
206303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
207303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
208303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public String toString() {
209ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        String groupAffiliation = "no group";
210ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        if (group != null) {
211083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            groupAffiliation = Integer.toString(group.affiliation);
212ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        }
213e7f138c7f0a190c86cec10fb32fa106aacae4093Winson        return "Task (" + groupAffiliation + "): " + key.getComponent().getPackageName() +
214ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung                " [" + super.toString() + "]";
215303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
216303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
217