diff --git a/CHANGELOG.md b/CHANGELOG.md index 76d21e93..fd69575a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +# SNAPSHOT + +#### Fixed +* `image-coil` - deliver image result if it loaded before request disposable is created ([#272]) + +[#272]: https://github.com/noties/Markwon/issues/272 + # 4.5.0 #### Added diff --git a/app-sample/src/main/java/io/noties/markwon/app/samples/image/CoilRecyclerViewSample.kt b/app-sample/src/main/java/io/noties/markwon/app/samples/image/CoilRecyclerViewSample.kt index e5cdd1ea..b9f140fd 100644 --- a/app-sample/src/main/java/io/noties/markwon/app/samples/image/CoilRecyclerViewSample.kt +++ b/app-sample/src/main/java/io/noties/markwon/app/samples/image/CoilRecyclerViewSample.kt @@ -2,7 +2,6 @@ package io.noties.markwon.app.samples.image import androidx.recyclerview.widget.LinearLayoutManager import coil.Coil -import coil.ImageLoader import coil.request.LoadRequest import coil.request.RequestDisposable import coil.transform.RoundedCornersTransformation @@ -15,7 +14,6 @@ import io.noties.markwon.image.coil.CoilImagesPlugin import io.noties.markwon.recycler.MarkwonAdapter import io.noties.markwon.sample.annotations.MarkwonArtifact import io.noties.markwon.sample.annotations.MarkwonSampleInfo -import okhttp3.OkHttpClient @MarkwonSampleInfo( id = "20200803132053", diff --git a/markwon-image-coil/src/main/java/io/noties/markwon/image/coil/CoilImagesPlugin.java b/markwon-image-coil/src/main/java/io/noties/markwon/image/coil/CoilImagesPlugin.java index b71543a7..464edf1f 100644 --- a/markwon-image-coil/src/main/java/io/noties/markwon/image/coil/CoilImagesPlugin.java +++ b/markwon-image-coil/src/main/java/io/noties/markwon/image/coil/CoilImagesPlugin.java @@ -12,6 +12,7 @@ import org.commonmark.node.Image; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import coil.Coil; import coil.ImageLoader; @@ -124,12 +125,21 @@ public class CoilImagesPlugin extends AbstractMarkwonPlugin { @Override public void load(@NonNull AsyncDrawable drawable) { - final Target target = new AsyncDrawableTarget(drawable); - LoadRequest request = coilStore.load(drawable).newBuilder() + final AtomicBoolean loaded = new AtomicBoolean(false); + final Target target = new AsyncDrawableTarget(drawable, loaded); + final LoadRequest request = coilStore.load(drawable).newBuilder() .target(target) .build(); - RequestDisposable disposable = imageLoader.execute(request); - cache.put(drawable, disposable); + // @since $SNAPSHOT; execute can return result _before_ disposable is created, + // thus `execute` would finish before we put disposable in cache (and thus result is + // not delivered) + final RequestDisposable disposable = imageLoader.execute(request); + // if flag was not set, then job is running (else - finished before we got here) + if (!loaded.get()) { + // mark flag + loaded.set(true); + cache.put(drawable, disposable); + } } @Override @@ -149,14 +159,20 @@ public class CoilImagesPlugin extends AbstractMarkwonPlugin { private class AsyncDrawableTarget implements Target { private final AsyncDrawable drawable; + private final AtomicBoolean loaded; - AsyncDrawableTarget(@NonNull AsyncDrawable drawable) { + private AsyncDrawableTarget(@NonNull AsyncDrawable drawable, @NonNull AtomicBoolean loaded) { this.drawable = drawable; + this.loaded = loaded; } @Override public void onSuccess(@NonNull Drawable loadedDrawable) { - if (cache.remove(drawable) != null) { + // @since $SNAPSHOT; check finished flag (result can be delivered _before_ disposable is created) + if (cache.remove(drawable) != null + || !loaded.get()) { + // mark + loaded.set(true); if (drawable.isAttached()) { DrawableUtils.applyIntrinsicBoundsIfEmpty(loadedDrawable); drawable.setResult(loadedDrawable);