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