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