From 69c889815e7dfede6503be7cb20c6515f503116e Mon Sep 17 00:00:00 2001 From: Felix Oghina Date: Wed, 31 Aug 2016 05:06:10 -0700 Subject: [PATCH] Expose image cache interrogation to JS Summary: Add a static `Image.queryCache` function that can query multiple URLs at once. The result is a map where each URL that is in cache is mapped to the cache type (memory/disk). URLs that are not cached do not appear in the result. Reviewed By: lexs Differential Revision: D3791333 fbshipit-source-id: b183015d97423f0c095bf891f035dac2e23d8d11 --- Libraries/Image/Image.android.js | 11 ++++++++ .../modules/image/ImageLoaderModule.java | 25 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index ae2c8d5ef92..4eff9533efd 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -185,6 +185,17 @@ var Image = React.createClass({ abortPrefetch(requestId: number) { ImageLoader.abortRequest(requestId); }, + + /** + * Perform cache interrogation. + * + * @param urls the list of image URLs to check the cache for. + * @return a mapping from url to cache status, such as "disk" or "memory". If a requested URL is + * not in the mapping, it means it's not in the cache. + */ + async queryCache(urls: Array): Promise> { + return await ImageLoader.queryCache(urls); + } }, mixins: [NativeMethodsMixin], diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java index 54730146d2d..b717969e187 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java @@ -20,15 +20,18 @@ import com.facebook.datasource.BaseDataSubscriber; import com.facebook.datasource.DataSource; import com.facebook.datasource.DataSubscriber; import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.GuardedAsyncTask; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableMap; public class ImageLoaderModule extends ReactContextBaseJavaModule implements @@ -175,6 +178,28 @@ public class ImageLoaderModule extends ReactContextBaseJavaModule implements } } + @ReactMethod + public void queryCache(final ReadableArray uris, final Promise promise) { + // perform cache interrogation in async task as disk cache checks are expensive + new GuardedAsyncTask(getReactApplicationContext()) { + @Override + protected void doInBackgroundGuarded(Void... params) { + WritableMap result = Arguments.createMap(); + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + for (int i = 0; i < uris.size(); i++) { + String uriString = uris.getString(i); + final Uri uri = Uri.parse(uriString); + if (imagePipeline.isInBitmapMemoryCache(uri)) { + result.putString(uriString, "memory"); + } else if (imagePipeline.isInDiskCacheSync(uri)) { + result.putString(uriString, "disk"); + } + } + promise.resolve(result); + } + }.executeOnExecutor(GuardedAsyncTask.THREAD_POOL_EXECUTOR); + } + private void registerRequest(int requestId, DataSource request) { synchronized (mEnqueuedRequestMonitor) { mEnqueuedRequests.put(requestId, request);