diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java | 96 |
1 files changed, 52 insertions, 44 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index 0b4498c487a8..802cb8315484 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -161,50 +161,7 @@ class BackgroundTaskLoader implements Runnable { // If we've stopped the loader, then fall through to the above logic to wait on // the load thread if (ssp != null) { - // Load the next item from the queue - final Task t = mLoadQueue.nextTask(); - if (t != null) { - Drawable cachedIcon = mIconCache.get(t.key); - - // Load the icon if it is stale or we haven't cached one yet - if (cachedIcon == null) { - cachedIcon = ssp.getBadgedTaskDescriptionIcon(t.taskDescription, - t.key.userId, mContext.getResources()); - - if (cachedIcon == null) { - ActivityInfo info = ssp.getActivityInfo( - t.key.getComponent(), t.key.userId); - if (info != null) { - if (DEBUG) Log.d(TAG, "Loading icon: " + t.key); - cachedIcon = ssp.getBadgedActivityIcon(info, t.key.userId); - } - } - - if (cachedIcon == null) { - cachedIcon = mDefaultIcon; - } - - // At this point, even if we can't load the icon, we will set the - // default icon. - mIconCache.put(t.key, cachedIcon); - } - - if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key); - ThumbnailData cachedThumbnailData = ssp.getTaskThumbnail(t.key.id, - true /* reducedResolution */); - - if (cachedThumbnailData.thumbnail == null) { - cachedThumbnailData.thumbnail = mDefaultThumbnail; - } - - if (!mCancelled) { - // Notify that the task data has changed - final Drawable newIcon = cachedIcon; - final ThumbnailData newThumbnailData = cachedThumbnailData; - mMainThreadHandler.post( - () -> t.notifyTaskDataLoaded(newThumbnailData, newIcon)); - } - } + processLoadQueueItem(ssp); } // If there are no other items in the list, then just wait until something is added @@ -222,6 +179,57 @@ class BackgroundTaskLoader implements Runnable { } } } + + /** + * This needs to be in a separate method to work around an surprising interpreter behavior: + * The register will keep the local reference to cachedThumbnailData even if it falls out of + * scope. Putting it into a method fixes this issue. + */ + private void processLoadQueueItem(SystemServicesProxy ssp) { + // Load the next item from the queue + final Task t = mLoadQueue.nextTask(); + if (t != null) { + Drawable cachedIcon = mIconCache.get(t.key); + + // Load the icon if it is stale or we haven't cached one yet + if (cachedIcon == null) { + cachedIcon = ssp.getBadgedTaskDescriptionIcon(t.taskDescription, + t.key.userId, mContext.getResources()); + + if (cachedIcon == null) { + ActivityInfo info = ssp.getActivityInfo( + t.key.getComponent(), t.key.userId); + if (info != null) { + if (DEBUG) Log.d(TAG, "Loading icon: " + t.key); + cachedIcon = ssp.getBadgedActivityIcon(info, t.key.userId); + } + } + + if (cachedIcon == null) { + cachedIcon = mDefaultIcon; + } + + // At this point, even if we can't load the icon, we will set the + // default icon. + mIconCache.put(t.key, cachedIcon); + } + + if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key); + final ThumbnailData cachedThumbnailData = ssp.getTaskThumbnail(t.key.id, + true /* reducedResolution */); + + if (cachedThumbnailData.thumbnail == null) { + cachedThumbnailData.thumbnail = mDefaultThumbnail; + } + + if (!mCancelled) { + // Notify that the task data has changed + final Drawable finalIcon = cachedIcon; + mMainThreadHandler.post( + () -> t.notifyTaskDataLoaded(cachedThumbnailData, finalIcon)); + } + } + } } /** |