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