/** Called to apply the actual loading based on the specified conditions. */ synchronized void executePlan( Options opts, RecentsTaskLoader loader, TaskResourceLoadQueue loadQueue) { if (DEBUG) Log.d( TAG, "executePlan, # tasks: " + opts.numVisibleTasks + ", # thumbnails: " + opts.numVisibleTaskThumbnails + ", running task id: " + opts.runningTaskId); Resources res = mContext.getResources(); // Iterate through each of the tasks and load them according to the load conditions. ArrayList<Task> tasks = mStack.getTasks(); int taskCount = tasks.size(); for (int i = 0; i < taskCount; i++) { ActivityManager.RecentTaskInfo t = mRawTasks.get(i); Task task = tasks.get(i); Task.TaskKey taskKey = task.key; // Get an existing activity info handle if possible Task.ComponentNameKey cnKey = taskKey.getComponentNameKey(); ActivityInfoHandle infoHandle; boolean hadCachedActivityInfo = false; if (mActivityInfoCache.containsKey(cnKey)) { infoHandle = mActivityInfoCache.get(cnKey); hadCachedActivityInfo = true; } else { infoHandle = new ActivityInfoHandle(); } boolean isRunningTask = (task.key.id == opts.runningTaskId); boolean isVisibleTask = i >= (taskCount - opts.numVisibleTasks); boolean isVisibleThumbnail = i >= (taskCount - opts.numVisibleTaskThumbnails); // If requested, skip the running task if (opts.onlyLoadPausedActivities && isRunningTask) { continue; } if (opts.loadIcons && (isRunningTask || isVisibleTask)) { if (task.activityIcon == null) { if (DEBUG) Log.d(TAG, "\tLoading icon: " + taskKey); task.activityIcon = loader.getAndUpdateActivityIcon( taskKey, t.taskDescription, mSystemServicesProxy, res, infoHandle, true); } } if (opts.loadThumbnails && (isRunningTask || isVisibleThumbnail)) { if (task.thumbnail == null || isRunningTask) { if (DEBUG) Log.d(TAG, "\tLoading thumbnail: " + taskKey); if (mConfig.svelteLevel <= RecentsConfiguration.SVELTE_LIMIT_CACHE) { task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy, true); } else if (mConfig.svelteLevel == RecentsConfiguration.SVELTE_DISABLE_CACHE) { loadQueue.addTask(task); } } } // Update the activity info cache if (!hadCachedActivityInfo && infoHandle.info != null) { mActivityInfoCache.put(cnKey, infoHandle); } } }
/** * Preloads the list of recent tasks from the system. After this call, the TaskStack will have a * list of all the recent tasks with their metadata, not including icons or thumbnails which were * not cached and have to be loaded. */ synchronized void preloadPlan(RecentsTaskLoader loader, boolean isTopTaskHome) { if (DEBUG) Log.d(TAG, "preloadPlan"); mActivityInfoCache.clear(); mStack = new TaskStack(); Resources res = mContext.getResources(); ArrayList<Task> loadedTasks = new ArrayList<Task>(); if (mRawTasks == null) { preloadRawTasks(isTopTaskHome); } int taskCount = mRawTasks.size(); for (int i = 0; i < taskCount; i++) { ActivityManager.RecentTaskInfo t = mRawTasks.get(i); // Compose the task key Task.TaskKey taskKey = new Task.TaskKey( t.persistentId, t.baseIntent, t.userId, t.firstActiveTime, t.lastActiveTime); // Get an existing activity info handle if possible Task.ComponentNameKey cnKey = taskKey.getComponentNameKey(); ActivityInfoHandle infoHandle; boolean hadCachedActivityInfo = false; if (mActivityInfoCache.containsKey(cnKey)) { infoHandle = mActivityInfoCache.get(cnKey); hadCachedActivityInfo = true; } else { infoHandle = new ActivityInfoHandle(); } // Load the label, icon, and color String activityLabel = loader.getAndUpdateActivityLabel( taskKey, t.taskDescription, mSystemServicesProxy, infoHandle); Drawable activityIcon = loader.getAndUpdateActivityIcon( taskKey, t.taskDescription, mSystemServicesProxy, res, infoHandle, false); int activityColor = loader.getActivityPrimaryColor(t.taskDescription, mConfig); // Update the activity info cache if (!hadCachedActivityInfo && infoHandle.info != null) { mActivityInfoCache.put(cnKey, infoHandle); } Bitmap icon = t.taskDescription != null ? t.taskDescription.getInMemoryIcon() : null; String iconFilename = t.taskDescription != null ? t.taskDescription.getIconFilename() : null; // Add the task to the stack Task task = new Task( taskKey, (t.id != RecentsTaskLoader.INVALID_TASK_ID), t.affiliatedTaskId, t.affiliatedTaskColor, activityLabel, activityIcon, activityColor, (i == (taskCount - 1)), mConfig.lockToAppEnabled, icon, iconFilename); task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy, false); if (DEBUG) Log.d(TAG, "\tthumbnail: " + taskKey + ", " + task.thumbnail); loadedTasks.add(task); } mStack.setTasks(loadedTasks); mStack.createAffiliatedGroupings(mConfig); // Assertion if (mStack.getTaskCount() != mRawTasks.size()) { throw new RuntimeException("Loading failed"); } }
public void pushTask(Runnable r) { mTaskQueue.push(r); }