summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kelvin Kwan <kelvinkwan@google.com> 2020-02-14 15:19:06 +0000
committer Kelvin Kwan <kelvinkwan@google.com> 2020-02-16 23:19:38 +0000
commit4cf7314f9b698c4b00cd6a621166a612237d9b26 (patch)
tree37cf5f8eb9525193f73ccd90a68f1014a87b9305
parentabba9759ff6282ddf0509284279a8375a4dcd6cd (diff)
Load and cache thumbnail with correct user
Bug: 149557252 Test: manual Test: atest DocumentsUIGoogleTests:com.android.documentsui.ThumbnailCacheTest Change-Id: Ic77d5612b7bd039daf1e7dd432acb09f05c88895
-rw-r--r--src/com/android/documentsui/Model.java8
-rw-r--r--src/com/android/documentsui/ThumbnailCache.java131
-rw-r--r--src/com/android/documentsui/ThumbnailLoader.java14
-rw-r--r--src/com/android/documentsui/base/DocumentInfo.java4
-rw-r--r--src/com/android/documentsui/dirlist/DirectoryFragment.java2
-rw-r--r--src/com/android/documentsui/dirlist/IconHelper.java16
-rw-r--r--src/com/android/documentsui/inspector/HeaderView.java2
-rw-r--r--tests/unit/com/android/documentsui/ThumbnailCacheTest.java77
8 files changed, 178 insertions, 76 deletions
diff --git a/src/com/android/documentsui/Model.java b/src/com/android/documentsui/Model.java
index b9c3d1d4d..aef17a380 100644
--- a/src/com/android/documentsui/Model.java
+++ b/src/com/android/documentsui/Model.java
@@ -20,7 +20,6 @@ import static com.android.documentsui.base.DocumentInfo.getCursorString;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
-import androidx.annotation.IntDef;
import android.app.AuthenticationRequiredException;
import android.database.Cursor;
import android.net.Uri;
@@ -29,6 +28,7 @@ import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.util.Log;
+import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.selection.Selection;
@@ -37,6 +37,7 @@ import com.android.documentsui.base.DocumentFilters;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.EventListener;
import com.android.documentsui.base.Features;
+import com.android.documentsui.base.UserId;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -258,6 +259,11 @@ public class Model {
return DocumentInfo.getUri(cursor);
}
+ public UserId getItemUserId(String modelId) {
+ final Cursor cursor = getItem(modelId);
+ return DocumentInfo.getUserId(cursor);
+ }
+
/**
* @return An ordered array of model IDs representing the documents in the model. It is sorted
* according to the current sort order, which was set by the last model update.
diff --git a/src/com/android/documentsui/ThumbnailCache.java b/src/com/android/documentsui/ThumbnailCache.java
index b98ee20ca..05905886e 100644
--- a/src/com/android/documentsui/ThumbnailCache.java
+++ b/src/com/android/documentsui/ThumbnailCache.java
@@ -16,23 +16,26 @@
package com.android.documentsui;
-import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
-import androidx.core.util.Pools;
+import static androidx.core.util.Preconditions.checkNotNull;
import android.content.ComponentCallbacks2;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.net.Uri;
import android.util.LruCache;
-import android.util.Pair;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
+import androidx.core.util.Pools;
import com.android.documentsui.base.Shared;
+import com.android.documentsui.base.UserId;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.Objects;
import java.util.TreeMap;
/**
@@ -44,10 +47,10 @@ public class ThumbnailCache {
private static final SizeComparator SIZE_COMPARATOR = new SizeComparator();
/**
- * A 2-dimensional index into {@link #mCache} entries. Pair<Uri, Point> is the key to
+ * A 2-dimensional index into {@link #mCache} entries. {@link CacheKey} is the key to
* {@link #mCache}. TreeMap is used to search the closest size to a given size and a given uri.
*/
- private final HashMap<Uri, TreeMap<Point, Pair<Uri, Point>>> mSizeIndex;
+ private final HashMap<SizeIndexKey, TreeMap<Point, CacheKey>> mSizeIndex;
private final Cache mCache;
/**
@@ -67,16 +70,16 @@ public class ThumbnailCache {
* @param size the desired size of the thumbnail
* @return the thumbnail result
*/
- public Result getThumbnail(Uri uri, Point size) {
- TreeMap<Point, Pair<Uri, Point>> sizeMap;
- sizeMap = mSizeIndex.get(uri);
+ public Result getThumbnail(Uri uri, UserId userId, Point size) {
+ TreeMap<Point, CacheKey> sizeMap;
+ sizeMap = mSizeIndex.get(new SizeIndexKey(uri, userId));
if (sizeMap == null || sizeMap.isEmpty()) {
// There is not any thumbnail for this uri.
return Result.obtainMiss();
}
// Look for thumbnail of the same size.
- Pair<Uri, Point> cacheKey = sizeMap.get(size);
+ CacheKey cacheKey = sizeMap.get(size);
if (cacheKey != null) {
Entry entry = mCache.get(cacheKey);
if (entry != null) {
@@ -121,15 +124,16 @@ public class ThumbnailCache {
* @param thumbnail the thumbnail to put in cache
* @param lastModified last modified value of the thumbnail to track its validity
*/
- public void putThumbnail(Uri uri, Point size, Bitmap thumbnail, long lastModified) {
- Pair<Uri, Point> cacheKey = Pair.create(uri, size);
+ public void putThumbnail(Uri uri, UserId userId, Point size, Bitmap thumbnail,
+ long lastModified) {
+ CacheKey cacheKey = new CacheKey(uri, userId, size);
- TreeMap<Point, Pair<Uri, Point>> sizeMap;
+ TreeMap<Point, CacheKey> sizeMap;
synchronized (mSizeIndex) {
- sizeMap = mSizeIndex.get(uri);
+ sizeMap = mSizeIndex.get(new SizeIndexKey(uri, userId));
if (sizeMap == null) {
sizeMap = new TreeMap<>(SIZE_COMPARATOR);
- mSizeIndex.put(uri, sizeMap);
+ mSizeIndex.put(new SizeIndexKey(uri, userId), sizeMap);
}
}
@@ -141,34 +145,34 @@ public class ThumbnailCache {
}
/**
- * Removes all thumbnail cache associated to the given uri.
+ * Removes all thumbnail cache associated to the given uri and user.
* @param uri the uri which thumbnail cache to remove
*/
- public void removeUri(Uri uri) {
- TreeMap<Point, Pair<Uri, Point>> sizeMap;
+ public void removeUri(Uri uri, UserId userId) {
+ TreeMap<Point, CacheKey> sizeMap;
synchronized (mSizeIndex) {
- sizeMap = mSizeIndex.get(uri);
+ sizeMap = mSizeIndex.get(new SizeIndexKey(uri, userId));
}
if (sizeMap != null) {
// Create an array to hold all values to avoid ConcurrentModificationException because
// removeKey() will be called by LruCache but we can't modify the map while we're
// iterating over the collection of values.
- for (Pair<Uri, Point> index : sizeMap.values().toArray(new Pair[0])) {
+ for (CacheKey index : sizeMap.values().toArray(new CacheKey[0])) {
mCache.remove(index);
}
}
}
- private void removeKey(Uri uri, Point size) {
- TreeMap<Point, Pair<Uri, Point>> sizeMap;
+ private void removeKey(CacheKey cacheKey) {
+ TreeMap<Point, CacheKey> sizeMap;
synchronized (mSizeIndex) {
- sizeMap = mSizeIndex.get(uri);
+ sizeMap = mSizeIndex.get(new SizeIndexKey(cacheKey.uri, cacheKey.userId));
}
- assert(sizeMap != null);
+ assert (sizeMap != null);
synchronized (sizeMap) {
- sizeMap.remove(size);
+ sizeMap.remove(cacheKey.point);
}
}
@@ -291,22 +295,22 @@ public class ThumbnailCache {
}
}
- private final class Cache extends LruCache<Pair<Uri, Point>, Entry> {
+ private final class Cache extends LruCache<CacheKey, Entry> {
private Cache(int maxSizeBytes) {
super(maxSizeBytes);
}
@Override
- protected int sizeOf(Pair<Uri, Point> key, Entry value) {
+ protected int sizeOf(CacheKey key, Entry value) {
return value.mThumbnail.getByteCount();
}
@Override
protected void entryRemoved(
- boolean evicted, Pair<Uri, Point> key, Entry oldValue, Entry newValue) {
+ boolean evicted, CacheKey key, Entry oldValue, Entry newValue) {
if (newValue == null) {
- removeKey(key.first, key.second);
+ removeKey(key);
}
}
}
@@ -318,4 +322,73 @@ public class ThumbnailCache {
return size0.x - size1.x;
}
}
+
+ private static class SizeIndexKey {
+ final Uri uri;
+ final UserId userId;
+
+ SizeIndexKey(Uri uri, UserId userId) {
+ this.uri = checkNotNull(uri);
+ this.userId = checkNotNull(userId);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof SizeIndexKey) {
+ SizeIndexKey other = (SizeIndexKey) o;
+ return Objects.equals(uri, other.uri)
+ && Objects.equals(userId, other.userId);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(uri, userId);
+ }
+ }
+
+ private static class CacheKey {
+ final Uri uri;
+ final UserId userId;
+ final Point point;
+
+ CacheKey(Uri uri, UserId userId, Point point) {
+ this.uri = checkNotNull(uri);
+ this.userId = checkNotNull(userId);
+ this.point = checkNotNull(point);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof CacheKey) {
+ CacheKey other = (CacheKey) o;
+ return Objects.equals(uri, other.uri)
+ && Objects.equals(userId, other.userId)
+ && Objects.equals(point, other.point);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(uri, userId, point);
+ }
+ }
}
diff --git a/src/com/android/documentsui/ThumbnailLoader.java b/src/com/android/documentsui/ThumbnailLoader.java
index 56cadc3b1..436d5d2b4 100644
--- a/src/com/android/documentsui/ThumbnailLoader.java
+++ b/src/com/android/documentsui/ThumbnailLoader.java
@@ -33,7 +33,10 @@ import android.provider.DocumentsContract;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
+
import com.android.documentsui.ProviderExecutor.Preemptable;
+import com.android.documentsui.base.UserId;
+
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -59,6 +62,7 @@ public final class ThumbnailLoader extends AsyncTask<Uri, Void, Bitmap> implemen
private final ImageView mIconThumb;
private final Point mThumbSize;
private final Uri mUri;
+ private final UserId mUserId;
private final long mLastModified;
private final Consumer<Bitmap> mCallback;
private final boolean mAddToCache;
@@ -66,15 +70,17 @@ public final class ThumbnailLoader extends AsyncTask<Uri, Void, Bitmap> implemen
/**
* @param uri - to a thumbnail.
+ * @param userId - user of the uri.
* @param iconThumb - ImageView to display the thumbnail.
* @param thumbSize - size of the thumbnail.
* @param lastModified - used for updating thumbnail caches.
* @param addToCache - flag that determines if the loader saves the thumbnail to the cache.
*/
- public ThumbnailLoader(Uri uri, ImageView iconThumb, Point thumbSize, long lastModified,
- Consumer<Bitmap> callback, boolean addToCache) {
+ public ThumbnailLoader(Uri uri, UserId userId, ImageView iconThumb, Point thumbSize,
+ long lastModified, Consumer<Bitmap> callback, boolean addToCache) {
mUri = uri;
+ mUserId = userId;
mIconThumb = iconThumb;
mThumbSize = thumbSize;
mLastModified = lastModified;
@@ -100,7 +106,7 @@ public final class ThumbnailLoader extends AsyncTask<Uri, Void, Bitmap> implemen
}
final Context context = mIconThumb.getContext();
- final ContentResolver resolver = context.getContentResolver();
+ final ContentResolver resolver = mUserId.getContentResolver(context);
ContentProviderClient client = null;
Bitmap result = null;
@@ -111,7 +117,7 @@ public final class ThumbnailLoader extends AsyncTask<Uri, Void, Bitmap> implemen
mUri, mThumbSize, mSignal);
if (result != null && mAddToCache) {
final ThumbnailCache cache = DocumentsApplication.getThumbnailCache(context);
- cache.putThumbnail(mUri, mThumbSize, result, mLastModified);
+ cache.putThumbnail(mUri, mUserId, mThumbSize, result, mLastModified);
}
} catch (Exception e) {
if (!(e instanceof OperationCanceledException)) {
diff --git a/src/com/android/documentsui/base/DocumentInfo.java b/src/com/android/documentsui/base/DocumentInfo.java
index e1d9234f3..85ce6c5cf 100644
--- a/src/com/android/documentsui/base/DocumentInfo.java
+++ b/src/com/android/documentsui/base/DocumentInfo.java
@@ -418,6 +418,10 @@ public class DocumentInfo implements Durable, Parcelable {
getCursorString(cursor, Document.COLUMN_DOCUMENT_ID));
}
+ public static UserId getUserId(Cursor cursor) {
+ return UserId.of(getCursorInt(cursor, RootCursorWrapper.COLUMN_USER_ID));
+ }
+
public static void addMimeTypes(ContentResolver resolver, Uri uri, Set<String> mimeTypes) {
assert(uri != null);
if ("content".equals(uri.getScheme())) {
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index dcd2edd19..8f994c6bd 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -1161,7 +1161,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
String[] ids = mModel.getModelIds();
int numOfEvicts = Math.min(ids.length, CACHE_EVICT_LIMIT);
for (int i = 0; i < numOfEvicts; ++i) {
- cache.removeUri(mModel.getItemUri(ids[i]));
+ cache.removeUri(mModel.getItemUri(ids[i]), mModel.getItemUserId(ids[i]));
}
final DocumentInfo doc = mActivity.getCurrentDirectory();
diff --git a/src/com/android/documentsui/dirlist/IconHelper.java b/src/com/android/documentsui/dirlist/IconHelper.java
index 08b4f9fc8..5e58c185a 100644
--- a/src/com/android/documentsui/dirlist/IconHelper.java
+++ b/src/com/android/documentsui/dirlist/IconHelper.java
@@ -44,6 +44,7 @@ import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.MimeTypes;
import com.android.documentsui.base.State;
import com.android.documentsui.base.State.ViewMode;
+import com.android.documentsui.base.UserId;
import java.util.function.BiConsumer;
@@ -136,7 +137,7 @@ public class IconHelper {
ImageView iconThumb,
ImageView iconMime,
@Nullable ImageView subIconMime) {
- load(doc.derivedUri, doc.mimeType, doc.flags, doc.icon, doc.lastModified,
+ load(doc.derivedUri, doc.userId, doc.mimeType, doc.flags, doc.icon, doc.lastModified,
iconThumb, iconMime, subIconMime);
}
@@ -153,8 +154,9 @@ public class IconHelper {
* @param subIconMime The second itemview's mime icon. Always visible.
* @return
*/
- public void load(Uri uri, String mimeType, int docFlags, int docIcon, long docLastModified,
- ImageView iconThumb, ImageView iconMime, @Nullable ImageView subIconMime) {
+ public void load(Uri uri, UserId userId, String mimeType, int docFlags, int docIcon,
+ long docLastModified, ImageView iconThumb, ImageView iconMime,
+ @Nullable ImageView subIconMime) {
boolean loadedThumbnail = false;
final String docAuthority = uri.getAuthority();
@@ -165,7 +167,7 @@ public class IconHelper {
final boolean showThumbnail = supportsThumbnail && allowThumbnail && mThumbnailsEnabled;
if (showThumbnail) {
loadedThumbnail =
- loadThumbnail(uri, docAuthority, docLastModified, iconThumb, iconMime);
+ loadThumbnail(uri, userId, docAuthority, docLastModified, iconThumb, iconMime);
}
final Drawable mimeIcon = getDocumentIcon(mContext, docAuthority,
@@ -183,9 +185,9 @@ public class IconHelper {
}
}
- private boolean loadThumbnail(Uri uri, String docAuthority, long docLastModified,
+ private boolean loadThumbnail(Uri uri, UserId userId, String docAuthority, long docLastModified,
ImageView iconThumb, ImageView iconMime) {
- final Result result = mThumbnailCache.getThumbnail(uri, mCurrentSize);
+ final Result result = mThumbnailCache.getThumbnail(uri, userId, mCurrentSize);
try {
final Bitmap cachedThumbnail = result.getThumbnail();
@@ -200,7 +202,7 @@ public class IconHelper {
(cachedThumbnail == null ? ThumbnailLoader.ANIM_FADE_IN :
ThumbnailLoader.ANIM_NO_OP);
- final ThumbnailLoader task = new ThumbnailLoader(uri, iconThumb,
+ final ThumbnailLoader task = new ThumbnailLoader(uri, userId, iconThumb,
mCurrentSize, docLastModified,
bitmap -> {
if (bitmap != null) {
diff --git a/src/com/android/documentsui/inspector/HeaderView.java b/src/com/android/documentsui/inspector/HeaderView.java
index 3aa1f2246..ddff7acd7 100644
--- a/src/com/android/documentsui/inspector/HeaderView.java
+++ b/src/com/android/documentsui/inspector/HeaderView.java
@@ -87,7 +87,7 @@ public final class HeaderView extends RelativeLayout implements HeaderDisplay {
}
};
// load the thumbnail async.
- final ThumbnailLoader task = new ThumbnailLoader(doc.derivedUri, mThumbnail,
+ final ThumbnailLoader task = new ThumbnailLoader(doc.derivedUri, doc.userId, mThumbnail,
mImageDimensions, doc.lastModified, callback, false);
task.executeOnExecutor(ProviderExecutor.forAuthority(doc.derivedUri.getAuthority()),
doc.derivedUri);
diff --git a/tests/unit/com/android/documentsui/ThumbnailCacheTest.java b/tests/unit/com/android/documentsui/ThumbnailCacheTest.java
index 570cefccf..613fd5929 100644
--- a/tests/unit/com/android/documentsui/ThumbnailCacheTest.java
+++ b/tests/unit/com/android/documentsui/ThumbnailCacheTest.java
@@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.ThumbnailCache.Result;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.testing.Bitmaps;
import org.junit.Before;
@@ -43,6 +44,9 @@ public class ThumbnailCacheTest {
private static final Uri URI_0 = Uri.parse("content://authority/document/0");
private static final Uri URI_1 = Uri.parse("content://authority/document/1");
+ private static final UserId USER_ID_0 = UserId.of(0);
+ private static final UserId USER_ID_1 = UserId.of(1);
+
private static final Point SMALL_SIZE = new Point(1, 1);
private static final Point MID_SIZE = new Point(2, 2);
private static final Point LARGE_SIZE = new Point(3, 3);
@@ -65,18 +69,25 @@ public class ThumbnailCacheTest {
@Test
public void testMiss() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_1, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_1, USER_ID_0, MID_SIZE);
assertMiss(result);
}
@Test
+ public void testMiss_DifferentUser() {
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_1, MID_SIZE);
+ assertMiss(result);
+ }
+
+ @Test
public void testHit_Exact() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertHitExact(result);
assertSame(MIDSIZE_BITMAP, result.getThumbnail());
@@ -84,9 +95,9 @@ public class ThumbnailCacheTest {
@Test
public void testHit_Smaller() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, LARGE_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, LARGE_SIZE);
assertHitSmaller(result);
assertSame(MIDSIZE_BITMAP, result.getThumbnail());
@@ -94,9 +105,9 @@ public class ThumbnailCacheTest {
@Test
public void testHit_Larger() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, SMALL_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, SMALL_SIZE);
assertHitLarger(result);
assertSame(MIDSIZE_BITMAP, result.getThumbnail());
@@ -104,10 +115,10 @@ public class ThumbnailCacheTest {
@Test
public void testHit_Larger_HasBothSize() {
- mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertHitLarger(result);
assertSame(LARGE_BITMAP, result.getThumbnail());
@@ -115,13 +126,13 @@ public class ThumbnailCacheTest {
@Test
public void testHit_Exact_MultiplePut() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
Bitmap localBitmap = Bitmaps.createTestBitmap(MID_SIZE.x, MID_SIZE.y);
long localLastModified = LAST_MODIFIED + 100;
- mCache.putThumbnail(URI_0, MID_SIZE, localBitmap, localLastModified);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, localBitmap, localLastModified);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertHitExact(result);
assertSame(localBitmap, result.getThumbnail());
@@ -129,40 +140,40 @@ public class ThumbnailCacheTest {
@Test
public void testHit_EqualLastModified() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertEquals(LAST_MODIFIED, result.getLastModified());
}
@Test
public void testEvictOldest_SizeExceeded() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_1, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_1, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_1, USER_ID_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_1, USER_ID_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertMiss(result);
}
@Test
public void testCacheShrink_OnTrimMemory_Moderate() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
mCache.onTrimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertMiss(result);
}
@Test
public void testCacheShrink_OnTrimMemory_Background() {
- mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
mCache.onTrimMemory(ComponentCallbacks2.TRIM_MEMORY_BACKGROUND);
@@ -172,21 +183,21 @@ public class ThumbnailCacheTest {
//
// HalfLimit = Limit / 2 = 5. After evicting largeSize bitmap, cache size decreases to 4,
// which is smaller than 5. Then smallSize bitmap remains.
- Result result = mCache.getThumbnail(URI_0, MID_SIZE);
+ Result result = mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE);
assertHitSmaller(result);
assertSame(SMALL_BITMAP, result.getThumbnail());
}
@Test
public void testRemoveUri() {
- mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
- mCache.putThumbnail(URI_1, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_0, USER_ID_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED);
+ mCache.putThumbnail(URI_1, USER_ID_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED);
- mCache.removeUri(URI_0);
+ mCache.removeUri(URI_0, USER_ID_0);
- assertMiss(mCache.getThumbnail(URI_0, MID_SIZE));
- assertHitExact(mCache.getThumbnail(URI_1, MID_SIZE));
+ assertMiss(mCache.getThumbnail(URI_0, USER_ID_0, MID_SIZE));
+ assertHitExact(mCache.getThumbnail(URI_1, USER_ID_0, MID_SIZE));
}
private static void assertMiss(Result result) {