Index: chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java |
index 62e4d5828d73b824792fe94a146dde5cef4f1036..84c2ddabc190b82b5d1715e72f8683a6106429a0 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java |
@@ -6,10 +6,12 @@ package org.chromium.chrome.browser.photo_picker; |
import android.app.Activity; |
import android.content.Context; |
+import android.graphics.Bitmap; |
import android.graphics.Rect; |
import android.support.v7.widget.GridLayoutManager; |
import android.support.v7.widget.RecyclerView; |
import android.support.v7.widget.Toolbar.OnMenuItemClickListener; |
+import android.util.LruCache; |
import android.view.LayoutInflater; |
import android.view.MenuItem; |
import android.view.View; |
@@ -30,6 +32,8 @@ import java.util.List; |
public class PickerCategoryView extends RelativeLayout |
implements FileEnumWorkerTask.FilesEnumeratedCallback, RecyclerView.RecyclerListener, |
DecoderServiceHost.ServiceReadyCallback, OnMenuItemClickListener { |
+ private static final int KILOBYTE = 1024; |
+ |
// The dialog that owns us. |
private PhotoPickerDialog mDialog; |
@@ -60,6 +64,14 @@ public class PickerCategoryView extends RelativeLayout |
// The {@link SelectionDelegate} keeping track of which images are selected. |
private SelectionDelegate<PickerBitmap> mSelectionDelegate; |
+ // A low-resolution cache for images. Helpful for cache misses from the high-resolution cache |
+ // to avoid showing gray squares (we show pixelated versions instead until image can be loaded |
+ // off disk, which is much less jarring). |
+ private LruCache<String, Bitmap> mLowResBitmaps; |
+ |
+ // A high-resolution cache for images. |
+ private LruCache<String, Bitmap> mHighResBitmaps; |
+ |
/** |
* The number of columns to show. Note: mColumns and mPadding (see below) should both be even |
* numbers or both odd, not a mix (the column padding will not be of uniform thickness if they |
@@ -118,7 +130,11 @@ public class PickerCategoryView extends RelativeLayout |
mRecyclerView.setLayoutManager(mLayoutManager); |
mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(mColumns, mPadding)); |
- // TODO(finnur): Implement caching. |
+ final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / KILOBYTE); |
+ final int cacheSizeLarge = maxMemory / 2; // 1/2 of the available memory. |
+ final int cacheSizeSmall = maxMemory / 8; // 1/8th of the available memory. |
+ mLowResBitmaps = new LruCache<String, Bitmap>(cacheSizeSmall); |
+ mHighResBitmaps = new LruCache<String, Bitmap>(cacheSizeLarge); |
} |
/** |
@@ -222,6 +238,14 @@ public class PickerCategoryView extends RelativeLayout |
return mDecoderServiceHost; |
} |
+ public LruCache<String, Bitmap> getLowResBitmaps() { |
+ return mLowResBitmaps; |
+ } |
+ |
+ public LruCache<String, Bitmap> getHighResBitmaps() { |
+ return mHighResBitmaps; |
+ } |
+ |
public boolean isMultiSelectAllowed() { |
return mMultiSelectionAllowed; |
} |