From d833cceb96f3d2a2d00e56ab7a773f34afa2752c Mon Sep 17 00:00:00 2001 From: anthony restaino Date: Sun, 14 May 2017 20:37:33 -0400 Subject: [PATCH] Utilizing LRUCache for in memory bitmap caching --- .../lightning/favicon/FaviconModel.java | 31 +++++++++++++++++-- .../lightning/favicon/ImageFetcher.java | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/acr/browser/lightning/favicon/FaviconModel.java b/app/src/main/java/acr/browser/lightning/favicon/FaviconModel.java index 8900b18..9a16de5 100644 --- a/app/src/main/java/acr/browser/lightning/favicon/FaviconModel.java +++ b/app/src/main/java/acr/browser/lightning/favicon/FaviconModel.java @@ -4,7 +4,9 @@ import android.app.Application; import android.graphics.Bitmap; import android.net.Uri; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.Log; +import android.util.LruCache; import com.anthonycr.bonsai.Completable; import com.anthonycr.bonsai.CompletableAction; @@ -20,6 +22,8 @@ import java.io.IOException; import javax.inject.Inject; import javax.inject.Singleton; +import acr.browser.lightning.utils.FileUtils; +import acr.browser.lightning.utils.Preconditions; import acr.browser.lightning.utils.Utils; /** @@ -33,6 +37,12 @@ public class FaviconModel { @NonNull private final ImageFetcher mImageFetcher; @NonNull private final Application mApplication; + @NonNull private final LruCache mFaviconCache = new LruCache((int) FileUtils.megabytesToBytes(1)) { + @Override + protected int sizeOf(String key, Bitmap value) { + return value.getByteCount(); + } + }; @Inject public FaviconModel(@NonNull Application application) { @@ -40,6 +50,22 @@ public class FaviconModel { mApplication = application; } + @Nullable + private Bitmap getFaviconFromMemCache(@NonNull String url) { + Preconditions.checkNonNull(url); + synchronized (mFaviconCache) { + return mFaviconCache.get(url); + } + } + + private void addFaviconToMemCache(@NonNull String url, @NonNull Bitmap bitmap) { + Preconditions.checkNonNull(url); + Preconditions.checkNonNull(bitmap); + synchronized (mFaviconCache) { + mFaviconCache.put(url, bitmap); + } + } + @NonNull private static File createFaviconCacheFile(@NonNull Application app, @NonNull Uri uri) { FaviconUtils.assertUriSafe(uri); @@ -71,9 +97,9 @@ public class FaviconModel { File faviconCacheFile = createFaviconCacheFile(mApplication, uri); - Bitmap favicon = null; + Bitmap favicon = getFaviconFromMemCache(url); - if (faviconCacheFile.exists()) { + if (faviconCacheFile.exists() && favicon != null) { favicon = mImageFetcher.retrieveFaviconFromCache(faviconCacheFile); } @@ -93,6 +119,7 @@ public class FaviconModel { } if (favicon != null) { + addFaviconToMemCache(url, favicon); cacheFaviconForUrl(favicon, url).subscribe(); } diff --git a/app/src/main/java/acr/browser/lightning/favicon/ImageFetcher.java b/app/src/main/java/acr/browser/lightning/favicon/ImageFetcher.java index 6dc37ce..cbef07b 100644 --- a/app/src/main/java/acr/browser/lightning/favicon/ImageFetcher.java +++ b/app/src/main/java/acr/browser/lightning/favicon/ImageFetcher.java @@ -73,8 +73,8 @@ class ImageFetcher { int size = Utils.dpToPx(24); - mLoaderOptions.inJustDecodeBounds = false; mLoaderOptions.inSampleSize = Utils.calculateInSampleSize(mLoaderOptions, size, size); + mLoaderOptions.inJustDecodeBounds = false; Response imageResponse = mHttpClient.newCall(imageRequest).execute(); iconStream = imageResponse.body().byteStream();