Unverified Commit 31126bcd authored by Dylan Vann's avatar Dylan Vann Committed by GitHub

Merge pull request #82 from october93/glide-v4

Upgrade android to Glide v4 
parents 8e7ae602 c315c348
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.android.tools.build:gradle:2.2.3'
...@@ -26,11 +27,14 @@ android { ...@@ -26,11 +27,14 @@ android {
repositories { repositories {
mavenCentral() mavenCentral()
maven {
url "https://maven.google.com"
}
} }
dependencies { dependencies {
compile 'com.facebook.react:react-native:+' 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: 'glide', version: '4.3.1'
compile group: 'com.github.bumptech.glide', name: 'okhttp3-integration', version: '1.5.0' compile group: 'com.github.bumptech.glide', name: 'okhttp3-integration', version: '4.3.1'
compile 'com.android.support:support-v4:19.1.0' compile 'com.android.support:support-v4:23.0.1'
} }
<manifest <manifest package="com.dylanvann.fastimage">
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> </manifest>
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; ...@@ -8,12 +8,10 @@ import android.widget.ImageView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestOptions;
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.ReadableMap; import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.bridge.WritableNativeMap;
...@@ -31,6 +29,10 @@ import java.util.Map; ...@@ -31,6 +29,10 @@ import java.util.Map;
import javax.annotation.Nullable; 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 { class ImageViewWithUrl extends ImageView {
public GlideUrl glideUrl; public GlideUrl glideUrl;
...@@ -44,11 +46,9 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -44,11 +46,9 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
private static final String REACT_CLASS = "FastImageView"; private static final String REACT_CLASS = "FastImageView";
private static final String REACT_ON_LOAD_START_EVENT = "onFastImageLoadStart"; 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_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 Drawable TRANSPARENT_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
private static final Map<String, List<ImageViewWithUrl>> VIEWS_FOR_URLS = new HashMap<>(); private static final Map<String, List<ImageViewWithUrl>> VIEWS_FOR_URLS = new HashMap<>();
private static RequestManager requestManager = null;
@Override @Override
public String getName() { public String getName() {
...@@ -57,52 +57,10 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -57,52 +57,10 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
@Override @Override
protected ImageViewWithUrl createViewInstance(ThemedReactContext reactContext) { protected ImageViewWithUrl createViewInstance(ThemedReactContext reactContext) {
requestManager = Glide.with(reactContext);
return new ImageViewWithUrl(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) { private static WritableMap mapFromResource(GlideDrawable resource) {
WritableMap resourceData = new WritableNativeMap(); WritableMap resourceData = new WritableNativeMap();
resourceData.putInt("width", resource.getIntrinsicWidth()); resourceData.putInt("width", resource.getIntrinsicWidth());
...@@ -115,7 +73,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -115,7 +73,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
public void setSrc(ImageViewWithUrl view, @Nullable ReadableMap source) { public void setSrc(ImageViewWithUrl view, @Nullable ReadableMap source) {
if (source == null) { if (source == null) {
// Cancel existing requests. // Cancel existing requests.
Glide.clear(view); requestManager.clear(view);
if (view.glideUrl != null) { if (view.glideUrl != null) {
OkHttpProgressGlideModule.forget(view.glideUrl.toStringUrl()); OkHttpProgressGlideModule.forget(view.glideUrl.toStringUrl());
} }
...@@ -132,7 +90,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -132,7 +90,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
final Priority priority = FastImageViewConverter.priority(source); final Priority priority = FastImageViewConverter.priority(source);
// Cancel existing request. // Cancel existing request.
Glide.clear(view); requestManager.clear(view);
String key = glideUrl.toStringUrl(); String key = glideUrl.toStringUrl();
OkHttpProgressGlideModule.expect(key, this); OkHttpProgressGlideModule.expect(key, this);
...@@ -149,14 +107,16 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -149,14 +107,16 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
int viewId = view.getId(); int viewId = view.getId();
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_START_EVENT, new WritableNativeMap()); eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_START_EVENT, new WritableNativeMap());
Glide RequestOptions options = new RequestOptions()
.with(view.getContext().getApplicationContext()) .priority(priority)
.dontTransform()
.placeholder(TRANSPARENT_DRAWABLE);
requestManager
.load(glideUrl) .load(glideUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL) .diskCacheStrategy(DiskCacheStrategy.ALL)
.dontTransform() .apply(options)
.priority(priority) .listener(new FastImageRequestListener(key))
.placeholder(TRANSPARENT_DRAWABLE)
.listener(LISTENER)
.into(view); .into(view);
} }
...@@ -169,7 +129,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement ...@@ -169,7 +129,7 @@ class FastImageViewManager extends SimpleViewManager<ImageViewWithUrl> implement
@Override @Override
public void onDropViewInstance(ImageViewWithUrl view) { public void onDropViewInstance(ImageViewWithUrl view) {
// This will cancel existing requests. // This will cancel existing requests.
Glide.clear(view); requestManager.clear(view);
final String key = view.glideUrl.toString(); final String key = view.glideUrl.toString();
OkHttpProgressGlideModule.forget(key); OkHttpProgressGlideModule.forget(key);
List<ImageViewWithUrl> viewsForKey = VIEWS_FOR_URLS.get(key); List<ImageViewWithUrl> viewsForKey = VIEWS_FOR_URLS.get(key);
......
...@@ -9,6 +9,7 @@ import com.bumptech.glide.Glide; ...@@ -9,6 +9,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.request.RequestOptions;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactMethod;
...@@ -40,12 +41,16 @@ class FastImageViewModule extends ReactContextBaseJavaModule { ...@@ -40,12 +41,16 @@ class FastImageViewModule extends ReactContextBaseJavaModule {
final ReadableMap source = sources.getMap(i); final ReadableMap source = sources.getMap(i);
final GlideUrl glideUrl = FastImageViewConverter.glideUrl(source); final GlideUrl glideUrl = FastImageViewConverter.glideUrl(source);
final Priority priority = FastImageViewConverter.priority(source); final Priority priority = FastImageViewConverter.priority(source);
RequestOptions options = new RequestOptions()
.placeholder(TRANSPARENT_DRAWABLE)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.priority(priority);
Glide Glide
.with(activity.getApplicationContext()) .with(activity.getApplicationContext())
.applyDefaultRequestOptions(options)
.load(glideUrl) .load(glideUrl)
.priority(priority)
.placeholder(TRANSPARENT_DRAWABLE)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload(); .preload();
} }
} }
......
...@@ -5,10 +5,11 @@ import android.os.Handler; ...@@ -5,10 +5,11 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import com.bumptech.glide.Glide; 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.integration.okhttp3.OkHttpUrlLoader;
import com.bumptech.glide.load.model.GlideUrl; 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.IOException;
import java.io.InputStream; import java.io.InputStream;
...@@ -27,18 +28,15 @@ import okio.ForwardingSource; ...@@ -27,18 +28,15 @@ import okio.ForwardingSource;
import okio.Okio; import okio.Okio;
import okio.Source; import okio.Source;
public class OkHttpProgressGlideModule implements GlideModule { @GlideModule
public class OkHttpProgressGlideModule extends LibraryGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) { }
@Override @Override
public void registerComponents(Context context, Glide glide) { public void registerComponents(Context context, Glide glide, Registry registry) {
OkHttpClient client = new OkHttpClient OkHttpClient client = new OkHttpClient
.Builder() .Builder()
.addInterceptor(createInterceptor(new DispatchingProgressListener())) .addInterceptor(createInterceptor(new DispatchingProgressListener()))
.build(); .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) { private static Interceptor createInterceptor(final ResponseProgressListener listener) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment