diff options
author | 2020-02-14 15:19:06 +0000 | |
---|---|---|
committer | 2020-02-16 23:19:38 +0000 | |
commit | 4cf7314f9b698c4b00cd6a621166a612237d9b26 (patch) | |
tree | 37cf5f8eb9525193f73ccd90a68f1014a87b9305 | |
parent | abba9759ff6282ddf0509284279a8375a4dcd6cd (diff) |
Load and cache thumbnail with correct user
Bug: 149557252
Test: manual
Test: atest DocumentsUIGoogleTests:com.android.documentsui.ThumbnailCacheTest
Change-Id: Ic77d5612b7bd039daf1e7dd432acb09f05c88895
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) { |