Update picassio plugin
This commit is contained in:
parent
e4f7e9b901
commit
b67253994c
@ -1,179 +0,0 @@
|
||||
package io.noties.markwon.image.picasso;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.Spanned;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.RequestCreator;
|
||||
import com.squareup.picasso.Target;
|
||||
|
||||
import org.commonmark.node.Image;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||
import io.noties.markwon.MarkwonConfiguration;
|
||||
import io.noties.markwon.MarkwonSpansFactory;
|
||||
import io.noties.markwon.image.AsyncDrawable;
|
||||
import io.noties.markwon.image.AsyncDrawableLoader;
|
||||
import io.noties.markwon.image.AsyncDrawableScheduler;
|
||||
import io.noties.markwon.image.DrawableUtils;
|
||||
import io.noties.markwon.image.ImageSpanFactory;
|
||||
|
||||
/**
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public class PicassoImagesPlugin extends AbstractMarkwonPlugin {
|
||||
|
||||
public interface PicassoStore {
|
||||
|
||||
@NonNull
|
||||
RequestCreator load(@NonNull AsyncDrawable drawable);
|
||||
|
||||
void cancel(@NonNull AsyncDrawable drawable);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static PicassoImagesPlugin create(@NonNull Context context) {
|
||||
return create(new Picasso.Builder(context).build());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static PicassoImagesPlugin create(@NonNull final Picasso picasso) {
|
||||
return create(new PicassoStore() {
|
||||
@NonNull
|
||||
@Override
|
||||
public RequestCreator load(@NonNull AsyncDrawable drawable) {
|
||||
return picasso.load(drawable.getDestination())
|
||||
.tag(drawable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(@NonNull AsyncDrawable drawable) {
|
||||
picasso.cancelTag(drawable);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static PicassoImagesPlugin create(@NonNull PicassoStore picassoStore) {
|
||||
return new PicassoImagesPlugin(picassoStore);
|
||||
}
|
||||
|
||||
private final PicassoAsyncDrawableLoader picassoAsyncDrawableLoader;
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
PicassoImagesPlugin(@NonNull PicassoStore picassoStore) {
|
||||
this.picassoAsyncDrawableLoader = new PicassoAsyncDrawableLoader(picassoStore);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
|
||||
builder.asyncDrawableLoader(picassoAsyncDrawableLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
|
||||
builder.setFactory(Image.class, new ImageSpanFactory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeSetText(@NonNull TextView textView, @NonNull Spanned markdown) {
|
||||
AsyncDrawableScheduler.unschedule(textView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterSetText(@NonNull TextView textView) {
|
||||
AsyncDrawableScheduler.schedule(textView);
|
||||
}
|
||||
|
||||
private static class PicassoAsyncDrawableLoader extends AsyncDrawableLoader {
|
||||
|
||||
private final PicassoStore picassoStore;
|
||||
private final Map<AsyncDrawable, AsyncDrawableTarget> cache = new HashMap<>(2);
|
||||
|
||||
PicassoAsyncDrawableLoader(@NonNull PicassoStore picassoStore) {
|
||||
this.picassoStore = picassoStore;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(@NonNull AsyncDrawable drawable) {
|
||||
|
||||
// we must store hard-reference to target (otherwise it will be garbage-collected
|
||||
// ad picasso internally stores a target in a weak-reference)
|
||||
final AsyncDrawableTarget target = new AsyncDrawableTarget(drawable);
|
||||
cache.put(drawable, target);
|
||||
|
||||
picassoStore.load(drawable)
|
||||
.into(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(@NonNull AsyncDrawable drawable) {
|
||||
|
||||
cache.remove(drawable);
|
||||
|
||||
picassoStore.cancel(drawable);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Drawable placeholder(@NonNull AsyncDrawable drawable) {
|
||||
return null;
|
||||
}
|
||||
|
||||
private class AsyncDrawableTarget implements Target {
|
||||
|
||||
private final AsyncDrawable drawable;
|
||||
|
||||
AsyncDrawableTarget(@NonNull AsyncDrawable drawable) {
|
||||
this.drawable = drawable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
|
||||
if (cache.remove(drawable) != null) {
|
||||
if (drawable.isAttached() && bitmap != null) {
|
||||
final BitmapDrawable bitmapDrawable = new BitmapDrawable(Resources.getSystem(), bitmap);
|
||||
DrawableUtils.applyIntrinsicBounds(bitmapDrawable);
|
||||
drawable.setResult(bitmapDrawable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
|
||||
if (cache.remove(drawable) != null) {
|
||||
if (errorDrawable != null
|
||||
&& drawable.isAttached()) {
|
||||
DrawableUtils.applyIntrinsicBoundsIfEmpty(errorDrawable);
|
||||
drawable.setResult(errorDrawable);
|
||||
}
|
||||
}
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareLoad(Drawable placeHolderDrawable) {
|
||||
if (placeHolderDrawable != null
|
||||
&& canDeliver()) {
|
||||
DrawableUtils.applyIntrinsicBoundsIfEmpty(placeHolderDrawable);
|
||||
drawable.setResult(placeHolderDrawable);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canDeliver() {
|
||||
return drawable.isAttached() && cache.containsKey(drawable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user