• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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