BitmapDrawable mDefaultIcon;
Bitmap mDefaultThumbnail;
+ private TaskKeyLruCache.EvictionCallback mClearActivityInfoOnEviction =
+ new TaskKeyLruCache.EvictionCallback() {
+ @Override
+ public void onEntryEvicted(Task.TaskKey key) {
+ mActivityInfoCache.remove(key.getComponent());
+ }
+ };
+
public RecentsTaskLoader(Context context) {
Resources res = context.getResources();
mDefaultTaskBarBackgroundColor =
// Initialize the proxy, cache and loaders
int numRecentTasks = ActivityManager.getMaxRecentTasksStatic();
mLoadQueue = new TaskResourceLoadQueue();
- mIconCache = new TaskKeyLruCache<>(iconCacheSize);
+ mIconCache = new TaskKeyLruCache<>(iconCacheSize, mClearActivityInfoOnEviction);
mThumbnailCache = new TaskKeyLruCache<>(thumbnailCacheSize);
- mActivityLabelCache = new TaskKeyLruCache<>(numRecentTasks);
- mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks);
+ mActivityLabelCache = new TaskKeyLruCache<>(numRecentTasks, mClearActivityInfoOnEviction);
+ mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks,
+ mClearActivityInfoOnEviction);
mActivityInfoCache = new LruCache(numRecentTasks);
mLoader = new BackgroundTaskLoader(mLoadQueue, mIconCache, mThumbnailCache,
mDefaultThumbnail, mDefaultIcon);
mIconCache.remove(t.key);
mActivityLabelCache.remove(t.key);
mContentDescriptionCache.remove(t.key);
- mActivityInfoCache.remove(t.key.getComponent());
if (notifyTaskDataUnloaded) {
t.notifyTaskDataUnloaded(null, mDefaultIcon);
}
*/
public class TaskKeyLruCache<V> {
+ public interface EvictionCallback {
+ public void onEntryEvicted(Task.TaskKey key);
+ }
+
private static final String TAG = "TaskKeyLruCache";
private final SparseArray<Task.TaskKey> mKeys = new SparseArray<>();
private final LruCache<Integer, V> mCache;
+ private final EvictionCallback mEvictionCallback;
public TaskKeyLruCache(int cacheSize) {
+ this(cacheSize, null);
+ }
+
+ public TaskKeyLruCache(int cacheSize, EvictionCallback evictionCallback) {
+ mEvictionCallback = evictionCallback;
mCache = new LruCache<Integer, V>(cacheSize) {
@Override
protected void entryRemoved(boolean evicted, Integer taskId, V oldV, V newV) {
+ if (mEvictionCallback != null) {
+ mEvictionCallback.onEntryEvicted(mKeys.get(taskId));
+ }
mKeys.remove(taskId);
}
};
/** Removes a cache entry for a specific key. */
final void remove(Task.TaskKey key) {
- mKeys.remove(key.id);
+ // Remove the key after the cache value because we need it to make the callback
mCache.remove(key.id);
+ mKeys.remove(key.id);
}
/** Removes all the entries in the cache. */