mirror of
https://github.com/status-im/react-native-fast-image.git
synced 2025-02-23 19:58:15 +00:00
Merge pull request #82 from october93/glide-v4
Upgrade android to Glide v4
This commit is contained in:
commit
31126bcddc
@ -1,6 +1,7 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:2.2.3'
|
||||
@ -26,11 +27,14 @@ android {
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
url "https://maven.google.com"
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.facebook.react:react-native:+'
|
||||
compile group: 'com.github.bumptech.glide', name: 'glide', version: '3.8.0'
|
||||
compile group: 'com.github.bumptech.glide', name: 'okhttp3-integration', version: '1.5.0'
|
||||
compile 'com.android.support:support-v4:19.1.0'
|
||||
compile group: 'com.github.bumptech.glide', name: 'glide', version: '4.3.1'
|
||||
compile group: 'com.github.bumptech.glide', name: 'okhttp3-integration', version: '4.3.1'
|
||||
compile 'com.android.support:support-v4:23.0.1'
|
||||
}
|
||||
|
@ -1,17 +1,2 @@
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.dylanvann.fastimage"
|
||||
>
|
||||
<application>
|
||||
<meta-data
|
||||
android:name="com.dylanvann.fastimage.OkHttpProgressGlideModule"
|
||||
android:value="GlideModule"
|
||||
/>
|
||||
<meta-data
|
||||
android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
|
||||
tools:node="remove"
|
||||
android:value="GlideModule"
|
||||
/>
|
||||
</application>
|
||||
<manifest package="com.dylanvann.fastimage">
|
||||
</manifest>
|
||||
|
@ -0,0 +1,52 @@
|
||||
package com.dylanvann.fastimage;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
import com.bumptech.glide.load.DataSource;
|
||||
import com.bumptech.glide.load.engine.GlideException;
|
||||
import com.bumptech.glide.request.RequestListener;
|
||||
import com.bumptech.glide.request.target.ImageViewTarget;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
import com.facebook.react.bridge.WritableNativeMap;
|
||||
import com.facebook.react.uimanager.ThemedReactContext;
|
||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
||||
|
||||
public class FastImageRequestListener implements RequestListener<Drawable> {
|
||||
public static final String REACT_ON_ERROR_EVENT = "onFastImageError";
|
||||
public static final String REACT_ON_LOAD_EVENT = "onFastImageLoad";
|
||||
public static final String REACT_ON_LOAD_END_EVENT = "onFastImageLoadEnd";
|
||||
private static String key = null;
|
||||
|
||||
public FastImageRequestListener(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onLoadFailed(@android.support.annotation.Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
|
||||
OkHttpProgressGlideModule.forget(key);
|
||||
if (!(target instanceof ImageViewTarget)) {
|
||||
return false;
|
||||
}
|
||||
ImageViewWithUrl view = (ImageViewWithUrl) ((ImageViewTarget) target).getView();
|
||||
ThemedReactContext context = (ThemedReactContext) view.getContext();
|
||||
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
|
||||
int viewId = view.getId();
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_ERROR_EVENT, new WritableNativeMap());
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, new WritableNativeMap());
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
|
||||
if (!(target instanceof ImageViewTarget)) {
|
||||
return false;
|
||||
}
|
||||
ImageViewWithUrl view = (ImageViewWithUrl) ((ImageViewTarget) target).getView();
|
||||
ThemedReactContext context = (ThemedReactContext) view.getContext();
|
||||
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
|
||||
int viewId = view.getId();
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_EVENT, new WritableNativeMap());
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, new WritableNativeMap());
|
||||
return false;
|
||||
}
|
||||
}
|
@ -8,12 +8,10 @@ import android.widget.ImageView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.Priority;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.load.model.GlideUrl;
|
||||
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||
import com.bumptech.glide.request.RequestListener;
|
||||
import com.bumptech.glide.request.target.ImageViewTarget;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.bridge.WritableNativeMap;
|
||||
@ -31,6 +29,10 @@ import java.util.Map;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static com.dylanvann.fastimage.FastImageRequestListener.REACT_ON_ERROR_EVENT;
|
||||
import static com.dylanvann.fastimage.FastImageRequestListener.REACT_ON_LOAD_END_EVENT;
|
||||
import static com.dylanvann.fastimage.FastImageRequestListener.REACT_ON_LOAD_EVENT;
|
||||
|
||||
class ImageViewWithUrl extends ImageView {
|
||||
public GlideUrl glideUrl;
|
||||
|
||||
@ -44,11 +46,9 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
private static final String REACT_CLASS = "FastImageView";
|
||||
private static final String REACT_ON_LOAD_START_EVENT = "onFastImageLoadStart";
|
||||
private static final String REACT_ON_PROGRESS_EVENT = "onFastImageProgress";
|
||||
private static final String REACT_ON_ERROR_EVENT = "onFastImageError";
|
||||
private static final String REACT_ON_LOAD_EVENT = "onFastImageLoad";
|
||||
private static final String REACT_ON_LOAD_END_EVENT = "onFastImageLoadEnd";
|
||||
private static final Drawable TRANSPARENT_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
|
||||
private static final Map<String, List<ImageViewWithUrl>> VIEWS_FOR_URLS = new HashMap<>();
|
||||
private static RequestManager requestManager = null;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
@ -57,52 +57,10 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
|
||||
@Override
|
||||
protected ImageViewWithUrl createViewInstance(ThemedReactContext reactContext) {
|
||||
requestManager = Glide.with(reactContext);
|
||||
return new ImageViewWithUrl(reactContext);
|
||||
}
|
||||
|
||||
private static RequestListener<GlideUrl, GlideDrawable> LISTENER = new RequestListener<GlideUrl, GlideDrawable>() {
|
||||
@Override
|
||||
public boolean onException(
|
||||
Exception e,
|
||||
GlideUrl uri,
|
||||
Target<GlideDrawable> target,
|
||||
boolean isFirstResource
|
||||
) {
|
||||
OkHttpProgressGlideModule.forget(uri.toStringUrl());
|
||||
if (!(target instanceof ImageViewTarget)) {
|
||||
return false;
|
||||
}
|
||||
ImageViewWithUrl view = (ImageViewWithUrl) ((ImageViewTarget) target).getView();
|
||||
ThemedReactContext context = (ThemedReactContext) view.getContext();
|
||||
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
|
||||
int viewId = view.getId();
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_ERROR_EVENT, new WritableNativeMap());
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, new WritableNativeMap());
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onResourceReady(
|
||||
GlideDrawable resource,
|
||||
GlideUrl uri,
|
||||
Target<GlideDrawable> target,
|
||||
boolean isFromMemoryCache,
|
||||
boolean isFirstResource
|
||||
) {
|
||||
if (!(target instanceof ImageViewTarget)) {
|
||||
return false;
|
||||
}
|
||||
ImageViewWithUrl view = (ImageViewWithUrl) ((ImageViewTarget) target).getView();
|
||||
ThemedReactContext context = (ThemedReactContext) view.getContext();
|
||||
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
|
||||
int viewId = view.getId();
|
||||
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_EVENT, mapFromResource(resource));
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, mapFromResource(resource));
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
private static WritableMap mapFromResource(GlideDrawable resource) {
|
||||
WritableMap resourceData = new WritableNativeMap();
|
||||
resourceData.putInt("width", resource.getIntrinsicWidth());
|
||||
@ -115,7 +73,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
public void setSrc(ImageViewWithUrl view, @Nullable ReadableMap source) {
|
||||
if (source == null) {
|
||||
// Cancel existing requests.
|
||||
Glide.clear(view);
|
||||
requestManager.clear(view);
|
||||
if (view.glideUrl != null) {
|
||||
OkHttpProgressGlideModule.forget(view.glideUrl.toStringUrl());
|
||||
}
|
||||
@ -132,7 +90,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
final Priority priority = FastImageViewConverter.priority(source);
|
||||
|
||||
// Cancel existing request.
|
||||
Glide.clear(view);
|
||||
requestManager.clear(view);
|
||||
|
||||
String key = glideUrl.toStringUrl();
|
||||
OkHttpProgressGlideModule.expect(key, this);
|
||||
@ -149,14 +107,16 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
int viewId = view.getId();
|
||||
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_START_EVENT, new WritableNativeMap());
|
||||
|
||||
Glide
|
||||
.with(view.getContext().getApplicationContext())
|
||||
RequestOptions options = new RequestOptions()
|
||||
.priority(priority)
|
||||
.dontTransform()
|
||||
.placeholder(TRANSPARENT_DRAWABLE);
|
||||
|
||||
requestManager
|
||||
.load(glideUrl)
|
||||
.diskCacheStrategy(DiskCacheStrategy.ALL)
|
||||
.dontTransform()
|
||||
.priority(priority)
|
||||
.placeholder(TRANSPARENT_DRAWABLE)
|
||||
.listener(LISTENER)
|
||||
.apply(options)
|
||||
.listener(new FastImageRequestListener(key))
|
||||
.into(view);
|
||||
}
|
||||
|
||||
@ -169,7 +129,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
|
||||
@Override
|
||||
public void onDropViewInstance(ImageViewWithUrl view) {
|
||||
// This will cancel existing requests.
|
||||
Glide.clear(view);
|
||||
requestManager.clear(view);
|
||||
final String key = view.glideUrl.toString();
|
||||
OkHttpProgressGlideModule.forget(key);
|
||||
List<ImageViewWithUrl> viewsForKey = VIEWS_FOR_URLS.get(key);
|
||||
|
@ -9,6 +9,7 @@ import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.Priority;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.load.model.GlideUrl;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
@ -40,12 +41,16 @@ class FastImageViewModule extends ReactContextBaseJavaModule {
|
||||
final ReadableMap source = sources.getMap(i);
|
||||
final GlideUrl glideUrl = FastImageViewConverter.glideUrl(source);
|
||||
final Priority priority = FastImageViewConverter.priority(source);
|
||||
|
||||
RequestOptions options = new RequestOptions()
|
||||
.placeholder(TRANSPARENT_DRAWABLE)
|
||||
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
|
||||
.priority(priority);
|
||||
|
||||
Glide
|
||||
.with(activity.getApplicationContext())
|
||||
.applyDefaultRequestOptions(options)
|
||||
.load(glideUrl)
|
||||
.priority(priority)
|
||||
.placeholder(TRANSPARENT_DRAWABLE)
|
||||
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
|
||||
.preload();
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,11 @@ import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.GlideBuilder;
|
||||
import com.bumptech.glide.Registry;
|
||||
import com.bumptech.glide.annotation.GlideModule;
|
||||
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
|
||||
import com.bumptech.glide.load.model.GlideUrl;
|
||||
import com.bumptech.glide.module.GlideModule;
|
||||
import com.bumptech.glide.module.LibraryGlideModule;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -27,18 +28,15 @@ import okio.ForwardingSource;
|
||||
import okio.Okio;
|
||||
import okio.Source;
|
||||
|
||||
public class OkHttpProgressGlideModule implements GlideModule {
|
||||
|
||||
@GlideModule
|
||||
public class OkHttpProgressGlideModule extends LibraryGlideModule {
|
||||
@Override
|
||||
public void applyOptions(Context context, GlideBuilder builder) { }
|
||||
|
||||
@Override
|
||||
public void registerComponents(Context context, Glide glide) {
|
||||
public void registerComponents(Context context, Glide glide, Registry registry) {
|
||||
OkHttpClient client = new OkHttpClient
|
||||
.Builder()
|
||||
.addInterceptor(createInterceptor(new DispatchingProgressListener()))
|
||||
.build();
|
||||
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
|
||||
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
|
||||
}
|
||||
|
||||
private static Interceptor createInterceptor(final ResponseProgressListener listener) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user