class FrescoImageLoader implements ImageLoader {
private Context mAppContext;
@Override
public void init(@NonNull Context appContext) {
if(Fresco.hasBeenInitialized()) return;
// hold appContext
mAppContext = appContext;
// init fresco
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(chain -> {
DevUtil.d("ImageLoader", "request-url: " + chain.request().url().toString());
return chain.proceed(chain.request());
})
.build();
ImagePipelineConfig config = OkHttpImagePipelineConfigFactory
.newBuilder(appContext, client)
.build();
Fresco.initialize(appContext, config);
}
@Override
public void displayImage(@NonNull ImageView targetView, @NonNull Uri uri, @Nullable LoadListener listener) {
// Fresco
if (targetView instanceof DraweeView) {
DraweeView realView = (DraweeView) targetView;
realView.setController(getDraweeController(realView, uri, listener));
return;
}
// Generic ImageView
targetView.setImageURI(uri);
}
private DraweeController getDraweeController(DraweeView targetView, Uri uri, LoadListener listener) {
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(targetView.getController())
.setUri(uri)
.setControllerListener(listener == null ? null : new BaseControllerListener() {
@Override
public void onFailure(String id, Throwable throwable) {
super.onFailure(id, throwable);
if (listener != null) {
listener.onFailed(targetView);
}
}
@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
if (imageInfo instanceof CloseableBitmap) {
CloseableBitmap image = (CloseableBitmap) imageInfo;
Bitmap resultBitmap = image.getUnderlyingBitmap();
if (listener != null) {
listener.onSuccess(targetView, resultBitmap);
}
}
}
})
.build();
return controller;
}
@Override
public void cancelDisplay(ImageView targetView) {
}
@Override
public void destroy() {
Fresco.shutDown();
}
}