1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.recents.model; 18 19 import android.content.ComponentName; 20 import android.content.Intent; 21 import android.graphics.Bitmap; 22 import android.graphics.Color; 23 import android.graphics.drawable.Drawable; 24 import com.android.systemui.recents.misc.Utilities; 25 26 import java.util.Objects; 27 28 29 /** 30 * A task represents the top most task in the system's task stack. 31 */ 32 public class Task { 33 /* Task callbacks */ 34 public interface TaskCallbacks { 35 /* Notifies when a task has been bound */ onTaskDataLoaded()36 public void onTaskDataLoaded(); 37 /* Notifies when a task has been unbound */ onTaskDataUnloaded()38 public void onTaskDataUnloaded(); 39 } 40 41 /** The ComponentNameKey represents the unique primary key for a component 42 * belonging to a specified user. */ 43 public static class ComponentNameKey { 44 final ComponentName component; 45 final int userId; 46 ComponentNameKey(ComponentName cn, int user)47 public ComponentNameKey(ComponentName cn, int user) { 48 component = cn; 49 userId = user; 50 } 51 52 @Override hashCode()53 public int hashCode() { 54 return Objects.hash(component, userId); 55 } 56 57 @Override equals(Object o)58 public boolean equals(Object o) { 59 if (!(o instanceof ComponentNameKey)) { 60 return false; 61 } 62 return component.equals(((ComponentNameKey) o).component) && 63 userId == ((ComponentNameKey) o).userId; 64 } 65 } 66 67 /* The Task Key represents the unique primary key for the task */ 68 public static class TaskKey { 69 final ComponentNameKey mComponentNameKey; 70 public final int id; 71 public final Intent baseIntent; 72 public final int userId; 73 public long firstActiveTime; 74 public long lastActiveTime; 75 TaskKey(int id, Intent intent, int userId, long firstActiveTime, long lastActiveTime)76 public TaskKey(int id, Intent intent, int userId, long firstActiveTime, long lastActiveTime) { 77 mComponentNameKey = new ComponentNameKey(intent.getComponent(), userId); 78 this.id = id; 79 this.baseIntent = intent; 80 this.userId = userId; 81 this.firstActiveTime = firstActiveTime; 82 this.lastActiveTime = lastActiveTime; 83 } 84 85 /** Returns the component name key for this task. */ getComponentNameKey()86 public ComponentNameKey getComponentNameKey() { 87 return mComponentNameKey; 88 } 89 90 @Override equals(Object o)91 public boolean equals(Object o) { 92 if (!(o instanceof TaskKey)) { 93 return false; 94 } 95 return id == ((TaskKey) o).id 96 && userId == ((TaskKey) o).userId; 97 } 98 99 @Override hashCode()100 public int hashCode() { 101 return (id << 5) + userId; 102 } 103 104 @Override toString()105 public String toString() { 106 return "Task.Key: " + id + ", " 107 + "u: " + userId + ", " 108 + "lat: " + lastActiveTime + ", " 109 + baseIntent.getComponent().getPackageName(); 110 } 111 } 112 113 public TaskKey key; 114 public TaskGrouping group; 115 public int taskAffiliation; 116 public int taskAffiliationColor; 117 public boolean isLaunchTarget; 118 public Drawable applicationIcon; 119 public Drawable activityIcon; 120 public String activityLabel; 121 public int colorPrimary; 122 public boolean useLightOnPrimaryColor; 123 public Bitmap thumbnail; 124 public boolean isActive; 125 public boolean lockToThisTask; 126 public boolean lockToTaskEnabled; 127 public Bitmap icon; 128 public String iconFilename; 129 TaskCallbacks mCb; 130 Task()131 public Task() { 132 // Do nothing 133 } 134 Task(TaskKey key, boolean isActive, int taskAffiliation, int taskAffiliationColor, String activityTitle, Drawable activityIcon, int colorPrimary, boolean lockToThisTask, boolean lockToTaskEnabled, Bitmap icon, String iconFilename)135 public Task(TaskKey key, boolean isActive, int taskAffiliation, int taskAffiliationColor, 136 String activityTitle, Drawable activityIcon, int colorPrimary, 137 boolean lockToThisTask, boolean lockToTaskEnabled, Bitmap icon, 138 String iconFilename) { 139 boolean isInAffiliationGroup = (taskAffiliation != key.id); 140 boolean hasAffiliationGroupColor = isInAffiliationGroup && (taskAffiliationColor != 0); 141 this.key = key; 142 this.taskAffiliation = taskAffiliation; 143 this.taskAffiliationColor = taskAffiliationColor; 144 this.activityLabel = activityTitle; 145 this.activityIcon = activityIcon; 146 this.colorPrimary = hasAffiliationGroupColor ? taskAffiliationColor : colorPrimary; 147 this.useLightOnPrimaryColor = Utilities.computeContrastBetweenColors(this.colorPrimary, 148 Color.WHITE) > 3f; 149 this.isActive = isActive; 150 this.lockToThisTask = lockToTaskEnabled && lockToThisTask; 151 this.lockToTaskEnabled = lockToTaskEnabled; 152 this.icon = icon; 153 this.iconFilename = iconFilename; 154 } 155 156 /** Copies the other task. */ copyFrom(Task o)157 public void copyFrom(Task o) { 158 this.key = o.key; 159 this.taskAffiliation = o.taskAffiliation; 160 this.taskAffiliationColor = o.taskAffiliationColor; 161 this.activityLabel = o.activityLabel; 162 this.activityIcon = o.activityIcon; 163 this.colorPrimary = o.colorPrimary; 164 this.useLightOnPrimaryColor = o.useLightOnPrimaryColor; 165 this.isActive = o.isActive; 166 this.lockToThisTask = o.lockToThisTask; 167 this.lockToTaskEnabled = o.lockToTaskEnabled; 168 } 169 170 /** Set the callbacks */ setCallbacks(TaskCallbacks cb)171 public void setCallbacks(TaskCallbacks cb) { 172 mCb = cb; 173 } 174 175 /** Set the grouping */ setGroup(TaskGrouping group)176 public void setGroup(TaskGrouping group) { 177 if (group != null && this.group != null) { 178 throw new RuntimeException("This task is already assigned to a group."); 179 } 180 this.group = group; 181 } 182 183 /** Notifies the callback listeners that this task has been loaded */ notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon)184 public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon) { 185 this.applicationIcon = applicationIcon; 186 this.thumbnail = thumbnail; 187 if (mCb != null) { 188 mCb.onTaskDataLoaded(); 189 } 190 } 191 192 /** Notifies the callback listeners that this task has been unloaded */ notifyTaskDataUnloaded(Bitmap defaultThumbnail, Drawable defaultApplicationIcon)193 public void notifyTaskDataUnloaded(Bitmap defaultThumbnail, Drawable defaultApplicationIcon) { 194 applicationIcon = defaultApplicationIcon; 195 thumbnail = defaultThumbnail; 196 if (mCb != null) { 197 mCb.onTaskDataUnloaded(); 198 } 199 } 200 201 @Override equals(Object o)202 public boolean equals(Object o) { 203 // Check that the id matches 204 Task t = (Task) o; 205 return key.equals(t.key); 206 } 207 208 @Override toString()209 public String toString() { 210 String groupAffiliation = "no group"; 211 if (group != null) { 212 groupAffiliation = Integer.toString(group.affiliation); 213 } 214 return "Task (" + groupAffiliation + "): " + key.baseIntent.getComponent().getPackageName() + 215 " [" + super.toString() + "]"; 216 } 217 } 218