Merge pull request #82 from october93/glide-v4

Upgrade android to Glide v4
This commit is contained in:
Dylan Vann 2018-03-17 23:57:02 -04:00 committed by GitHub
commit 31126bcddc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 94 additions and 90 deletions

View File

@ -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'
}

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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();
}
}

View File

@ -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) {