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