Task.java revision dcfa7976fa836ae90bb4a579892a18a0abf35b3c
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 19303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent; 20303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.Bitmap; 2193748a11cba1b44edbc2e888c997533461355594Winson Chungimport android.graphics.Color; 22303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.drawable.Drawable; 23ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Utilities; 24303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 25303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 26303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/** 27303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * A task represents the top most task in the system's task stack. 28303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */ 29303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class Task { 3004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung /* Task callbacks */ 3104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public interface TaskCallbacks { 3204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung /* Notifies when a task has been bound */ 338eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung public void onTaskDataLoaded(); 3404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung /* Notifies when a task has been unbound */ 3504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public void onTaskDataUnloaded(); 3604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung } 3704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung 3804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung /* The Task Key represents the unique primary key for the task */ 3904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public static class TaskKey { 4004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public final int id; 41c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung public final Intent baseIntent; 424f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani public final int userId; 43ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public long firstActiveTime; 44f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung public long lastActiveTime; 4504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung 46ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public TaskKey(int id, Intent intent, int userId, long firstActiveTime, long lastActiveTime) { 4704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung this.id = id; 48c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung this.baseIntent = intent; 494f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani this.userId = userId; 50ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung this.firstActiveTime = firstActiveTime; 51f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung this.lastActiveTime = lastActiveTime; 52f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung } 53f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung 5404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung @Override 5504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public boolean equals(Object o) { 564f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani if (!(o instanceof TaskKey)) { 574f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani return false; 584f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani } 594f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani return id == ((TaskKey) o).id 604f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani && userId == ((TaskKey) o).userId; 6104dfe0d26b944324ee920001f40d74cff47281d6Winson Chung } 6204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung 6304dfe0d26b944324ee920001f40d74cff47281d6Winson Chung @Override 6404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public int hashCode() { 654f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani return (id << 5) + userId; 6604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung } 6704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung 6804dfe0d26b944324ee920001f40d74cff47281d6Winson Chung @Override 6904dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public String toString() { 704f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani return "Task.Key: " + id + ", " 71f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung + "u: " + userId + ", " 72f1fbd77cf057e43926f9a0347692611386d09f40Winson Chung + "lat: " + lastActiveTime + ", " 734f0a49e6b9ad1b00972dbe8a751263aa6c482538Amith Yamasani + baseIntent.getComponent().getPackageName(); 7404dfe0d26b944324ee920001f40d74cff47281d6Winson Chung } 7504dfe0d26b944324ee920001f40d74cff47281d6Winson Chung } 7604dfe0d26b944324ee920001f40d74cff47281d6Winson Chung 7704dfe0d26b944324ee920001f40d74cff47281d6Winson Chung public TaskKey key; 78ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public TaskGrouping group; 79083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung public int taskAffiliation; 80dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung public boolean isLaunchTarget; 815e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung public Drawable applicationIcon; 8211e41baac63a42d7ddb7ba2cab40ee55443d262fWinson Chung public Drawable activityIcon; 835e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung public String activityLabel; 84f5e22e71cb5f8699a4312c797af068f655cbe629Winson Chung public int colorPrimary; 8593748a11cba1b44edbc2e888c997533461355594Winson Chung public boolean useLightOnPrimaryColor; 86303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public Bitmap thumbnail; 874be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung public boolean isActive; 8856e09b42a0f1670970872bef611a8036904ad6bfJason Monk public boolean lockToThisTask; 8956e09b42a0f1670970872bef611a8036904ad6bfJason Monk public boolean lockToTaskEnabled; 901f1cce1725a2fceee4162aec23518d42c78d6669Kenny Guy public int userId; 91303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 92303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung TaskCallbacks mCb; 93303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 940d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung public Task() { 950d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung // Only used by RecentsService for task rect calculations. 960d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung } 970d767551c55d9e594a0b944bd1926c21a344b5aeWinson Chung 98083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung public Task(int id, boolean isActive, Intent intent, int taskAffiliation, String activityTitle, 99083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung Drawable activityIcon, int colorPrimary, int userId, 10056e09b42a0f1670970872bef611a8036904ad6bfJason Monk long firstActiveTime, long lastActiveTime, boolean lockToThisTask, 10156e09b42a0f1670970872bef611a8036904ad6bfJason Monk boolean lockToTaskEnabled) { 102ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung this.key = new TaskKey(id, intent, userId, firstActiveTime, lastActiveTime); 103083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung this.taskAffiliation = taskAffiliation; 1045e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung this.activityLabel = activityTitle; 1055e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung this.activityIcon = activityIcon; 106f5e22e71cb5f8699a4312c797af068f655cbe629Winson Chung this.colorPrimary = colorPrimary; 10793748a11cba1b44edbc2e888c997533461355594Winson Chung this.useLightOnPrimaryColor = Utilities.computeContrastBetweenColors(colorPrimary, 10893748a11cba1b44edbc2e888c997533461355594Winson Chung Color.WHITE) > 3f; 1094be0445c66f19ed985aecbc2a572f5d8c6e2553aWinson Chung this.isActive = isActive; 11056e09b42a0f1670970872bef611a8036904ad6bfJason Monk this.lockToThisTask = lockToTaskEnabled && lockToThisTask; 11156e09b42a0f1670970872bef611a8036904ad6bfJason Monk this.lockToTaskEnabled = lockToTaskEnabled; 1121f1cce1725a2fceee4162aec23518d42c78d6669Kenny Guy this.userId = userId; 113303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 114303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 115303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Set the callbacks */ 116303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public void setCallbacks(TaskCallbacks cb) { 117303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung mCb = cb; 118303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 119303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 120ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung /** Set the grouping */ 121ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung public void setGroup(TaskGrouping group) { 122ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung if (group != null && this.group != null) { 123ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung throw new RuntimeException("This task is already assigned to a group."); 124ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 125ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung this.group = group; 126ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 127ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung 1284d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Notifies the callback listeners that this task has been loaded */ 1298eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon) { 1305e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung this.applicationIcon = applicationIcon; 1314d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung this.thumbnail = thumbnail; 1324d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (mCb != null) { 1338eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung mCb.onTaskDataLoaded(); 1344d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1354d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1364d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1374d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Notifies the callback listeners that this task has been unloaded */ 1385e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung public void notifyTaskDataUnloaded(Bitmap defaultThumbnail, Drawable defaultApplicationIcon) { 1395e3e5d8945249cfeb8bd59de112be88954ba62bfWinson Chung applicationIcon = defaultApplicationIcon; 1404d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung thumbnail = defaultThumbnail; 1414d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (mCb != null) { 14204dfe0d26b944324ee920001f40d74cff47281d6Winson Chung mCb.onTaskDataUnloaded(); 1434d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1444d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1454d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 146303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 147303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public boolean equals(Object o) { 148a10370fc2eb8eb95631592160c5f6281b9d75722Winson Chung // Check that the id matches 149303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Task t = (Task) o; 15004dfe0d26b944324ee920001f40d74cff47281d6Winson Chung return key.equals(t.key); 151303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 152303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 153303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 154303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public String toString() { 155ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung String groupAffiliation = "no group"; 156ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung if (group != null) { 157083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung groupAffiliation = Integer.toString(group.affiliation); 158ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung } 159ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung return "Task (" + groupAffiliation + "): " + key.baseIntent.getComponent().getPackageName() + 160ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung " [" + super.toString() + "]"; 161303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 162303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung} 163