1a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung/*
2a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * Copyright (C) 2014 The Android Open Source Project
3a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *
4a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * you may not use this file except in compliance with the License.
6a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * You may obtain a copy of the License at
7a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *
8a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *
10a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * Unless required by applicable law or agreed to in writing, software
11a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * See the License for the specific language governing permissions and
14a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * limitations under the License.
15a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung */
16a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
17a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungpackage com.android.systemui.recents.model;
18a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
19a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.app.ActivityManager;
20a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.content.Context;
21a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.content.res.Resources;
22a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.graphics.Bitmap;
23a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.graphics.drawable.Drawable;
24a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.os.UserHandle;
25a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport android.util.Log;
26a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport com.android.systemui.recents.RecentsConfiguration;
27a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport com.android.systemui.recents.misc.SystemServicesProxy;
28a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
29a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport java.util.ArrayList;
30a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport java.util.Collections;
31a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport java.util.HashMap;
32a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport java.util.List;
33a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
34a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
35a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung/**
36a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung * This class stores the loading state as it goes through multiple stages of loading:
37a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *   - preloadRawTasks() will load the raw set of recents tasks from the system
38a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *   - preloadPlan() will construct a new task stack with all metadata and only icons and thumbnails
39a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *     that are currently in the cache
40a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *   - executePlan() will actually load and fill in the icons and thumbnails according to the load
41a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung *     options specified, such that we can transition into the Recents activity seamlessly
42a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung */
43a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungpublic class RecentsTaskLoadPlan {
44a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    static String TAG = "RecentsTaskLoadPlan";
45a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    static boolean DEBUG = false;
46a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
47a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /** The set of conditions to load tasks. */
48a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    public static class Options {
49a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        public int runningTaskId = -1;
50a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        public boolean loadIcons = true;
51a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        public boolean loadThumbnails = true;
5290d5136ebd59c9aff9543ea5750d4c5d57ac99dcWinson Chung        public boolean onlyLoadForCache = false;
530eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung        public boolean onlyLoadPausedActivities = false;
54a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        public int numVisibleTasks = 0;
55a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        public int numVisibleTaskThumbnails = 0;
56a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
57a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
58a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    Context mContext;
59a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    RecentsConfiguration mConfig;
60a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    SystemServicesProxy mSystemServicesProxy;
61a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
62a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    List<ActivityManager.RecentTaskInfo> mRawTasks;
63a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    TaskStack mStack;
64a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    HashMap<Task.ComponentNameKey, ActivityInfoHandle> mActivityInfoCache =
65a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            new HashMap<Task.ComponentNameKey, ActivityInfoHandle>();
66a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
67a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /** Package level ctor */
68a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    RecentsTaskLoadPlan(Context context, RecentsConfiguration config, SystemServicesProxy ssp) {
69a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mContext = context;
70a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mConfig = config;
71a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mSystemServicesProxy = ssp;
72a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
73a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
74a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /**
75a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * An optimization to preload the raw list of tasks.
76a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     */
77a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    public synchronized void preloadRawTasks(boolean isTopTaskHome) {
78a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mRawTasks = mSystemServicesProxy.getRecentTasks(mConfig.maxNumTasksToLoad,
79a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                UserHandle.CURRENT.getIdentifier(), isTopTaskHome);
80a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        Collections.reverse(mRawTasks);
81a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
82a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (DEBUG) Log.d(TAG, "preloadRawTasks, tasks: " + mRawTasks.size());
83a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
84a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
85a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /**
86a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * Preloads the list of recent tasks from the system.  After this call, the TaskStack will
87a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * have a list of all the recent tasks with their metadata, not including icons or
88a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * thumbnails which were not cached and have to be loaded.
89a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     */
90a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    synchronized void preloadPlan(RecentsTaskLoader loader, boolean isTopTaskHome) {
91a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (DEBUG) Log.d(TAG, "preloadPlan");
92a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
93a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mActivityInfoCache.clear();
94a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mStack = new TaskStack();
95a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
96a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        Resources res = mContext.getResources();
97a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        ArrayList<Task> loadedTasks = new ArrayList<Task>();
98a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (mRawTasks == null) {
99a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            preloadRawTasks(isTopTaskHome);
100a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        }
101a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        int taskCount = mRawTasks.size();
102a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        for (int i = 0; i < taskCount; i++) {
103a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            ActivityManager.RecentTaskInfo t = mRawTasks.get(i);
104a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
105a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Compose the task key
106a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.baseIntent, t.userId,
107a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    t.firstActiveTime, t.lastActiveTime);
108a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
109a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Get an existing activity info handle if possible
110a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
111a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            ActivityInfoHandle infoHandle;
112a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            boolean hadCachedActivityInfo = false;
113a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (mActivityInfoCache.containsKey(cnKey)) {
114a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                infoHandle = mActivityInfoCache.get(cnKey);
115a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                hadCachedActivityInfo = true;
116a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            } else {
117a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                infoHandle = new ActivityInfoHandle();
118a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
119a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
120a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Load the label, icon, and color
121a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            String activityLabel = loader.getAndUpdateActivityLabel(taskKey, t.taskDescription,
122a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    mSystemServicesProxy, infoHandle);
123a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Drawable activityIcon = loader.getAndUpdateActivityIcon(taskKey, t.taskDescription,
124a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    mSystemServicesProxy, res, infoHandle, false);
125a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            int activityColor = loader.getActivityPrimaryColor(t.taskDescription, mConfig);
126a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
127a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Update the activity info cache
128a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (!hadCachedActivityInfo && infoHandle.info != null) {
129a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                mActivityInfoCache.put(cnKey, infoHandle);
130a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
131a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
132a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Bitmap icon = t.taskDescription != null
133a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    ? t.taskDescription.getInMemoryIcon()
134a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    : null;
135a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            String iconFilename = t.taskDescription != null
136a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    ? t.taskDescription.getIconFilename()
137a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    : null;
138a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
139a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Add the task to the stack
140a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task task = new Task(taskKey, (t.id != RecentsTaskLoader.INVALID_TASK_ID),
141a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    t.affiliatedTaskId, t.affiliatedTaskColor, activityLabel, activityIcon,
142a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    activityColor, (i == (taskCount - 1)), mConfig.lockToAppEnabled, icon,
143a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    iconFilename);
144a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy, false);
1450eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung            if (DEBUG) Log.d(TAG, "\tthumbnail: " + taskKey + ", " + task.thumbnail);
146a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            loadedTasks.add(task);
147a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        }
148a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mStack.setTasks(loadedTasks);
149a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        mStack.createAffiliatedGroupings(mConfig);
150a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
151a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        // Assertion
152a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (mStack.getTaskCount() != mRawTasks.size()) {
153a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            throw new RuntimeException("Loading failed");
154a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        }
155a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
156a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
157a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /**
158a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * Called to apply the actual loading based on the specified conditions.
159a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     */
16096d704186621f6310e0e7d39db57caff67baa96cWinson Chung    synchronized void executePlan(Options opts, RecentsTaskLoader loader,
16196d704186621f6310e0e7d39db57caff67baa96cWinson Chung            TaskResourceLoadQueue loadQueue) {
162a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (DEBUG) Log.d(TAG, "executePlan, # tasks: " + opts.numVisibleTasks +
163a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                ", # thumbnails: " + opts.numVisibleTaskThumbnails +
164a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                ", running task id: " + opts.runningTaskId);
165a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
166a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        Resources res = mContext.getResources();
167a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
168a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        // Iterate through each of the tasks and load them according to the load conditions.
169a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        ArrayList<Task> tasks = mStack.getTasks();
170a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        int taskCount = tasks.size();
171a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        for (int i = 0; i < taskCount; i++) {
172a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            ActivityManager.RecentTaskInfo t = mRawTasks.get(i);
173a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task task = tasks.get(i);
174a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task.TaskKey taskKey = task.key;
175a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
176a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Get an existing activity info handle if possible
177a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
178a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            ActivityInfoHandle infoHandle;
179a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            boolean hadCachedActivityInfo = false;
180a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (mActivityInfoCache.containsKey(cnKey)) {
181a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                infoHandle = mActivityInfoCache.get(cnKey);
182a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                hadCachedActivityInfo = true;
183a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            } else {
184a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                infoHandle = new ActivityInfoHandle();
185a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
186a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
187a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            boolean isRunningTask = (task.key.id == opts.runningTaskId);
188a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            boolean isVisibleTask = i >= (taskCount - opts.numVisibleTasks);
189a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            boolean isVisibleThumbnail = i >= (taskCount - opts.numVisibleTaskThumbnails);
190a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
1910eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung            // If requested, skip the running task
1920eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung            if (opts.onlyLoadPausedActivities && isRunningTask) {
1930eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung                continue;
1940eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung            }
1950eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung
196a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (opts.loadIcons && (isRunningTask || isVisibleTask)) {
197a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                if (task.activityIcon == null) {
198a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    if (DEBUG) Log.d(TAG, "\tLoading icon: " + taskKey);
199a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    task.activityIcon = loader.getAndUpdateActivityIcon(taskKey, t.taskDescription,
200a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                            mSystemServicesProxy, res, infoHandle, true);
201a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                }
202a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
203a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (opts.loadThumbnails && (isRunningTask || isVisibleThumbnail)) {
2040eae5573b59ac2d3e484b7977f5fca7df9812c68Winson Chung                if (task.thumbnail == null || isRunningTask) {
205a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    if (DEBUG) Log.d(TAG, "\tLoading thumbnail: " + taskKey);
20696d704186621f6310e0e7d39db57caff67baa96cWinson Chung                    if (mConfig.svelteLevel <= RecentsConfiguration.SVELTE_LIMIT_CACHE) {
20796d704186621f6310e0e7d39db57caff67baa96cWinson Chung                        task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy,
20896d704186621f6310e0e7d39db57caff67baa96cWinson Chung                                true);
20996d704186621f6310e0e7d39db57caff67baa96cWinson Chung                    } else if (mConfig.svelteLevel == RecentsConfiguration.SVELTE_DISABLE_CACHE) {
21096d704186621f6310e0e7d39db57caff67baa96cWinson Chung                        loadQueue.addTask(task);
21196d704186621f6310e0e7d39db57caff67baa96cWinson Chung                    }
212a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                }
213a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
214a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
215a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            // Update the activity info cache
216a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            if (!hadCachedActivityInfo && infoHandle.info != null) {
217a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                mActivityInfoCache.put(cnKey, infoHandle);
218a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            }
219a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        }
220a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
221a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
222a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /**
223a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * Composes and returns a TaskStack from the preloaded list of recent tasks.
224a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     */
225a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    public TaskStack getTaskStack() {
226a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        return mStack;
227a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
228a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
229a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    /**
230a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     * Composes and returns a SpaceNode from the preloaded list of recent tasks.
231a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung     */
232a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    public SpaceNode getSpaceNode() {
233a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        SpaceNode node = new SpaceNode();
234a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        node.setStack(mStack);
235a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        return node;
236a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung    }
237a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung}
238