diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7410eca..b86d8953 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,7 +17,9 @@
* add `SoftBreakAddsNewLinePlugin` plugin (`core` module)
* `LinkResolverDef` defaults to `https` when a link does not have scheme information ([#75])
* add `option` abstraction for `sample` module allowing switching of multiple cases in runtime via menu
+* non-empty bounds for `AsyncDrawable` when no dimensions are not yet available ([#189])
+[#189]: https://github.com/noties/Markwon/issues/189
[#75]: https://github.com/noties/Markwon/issues/75
[#204]: https://github.com/noties/Markwon/issues/204
diff --git a/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java b/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java
index ad247238..935313d5 100644
--- a/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java
+++ b/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java
@@ -223,6 +223,7 @@ public class AsyncDrawable extends Drawable {
}
this.result = result;
+// this.result.setCallback(callback);
initBounds();
}
@@ -250,6 +251,10 @@ public class AsyncDrawable extends Drawable {
if (canvasWidth == 0) {
// we still have no bounds - wait for them
waitingForDimensions = true;
+
+ // we cannot have empty bounds - otherwise in case if text contains
+ // a single AsyncDrawableSpan, it won't be displayed
+ setBounds(noDimensionsBounds(result));
return;
}
@@ -268,6 +273,24 @@ public class AsyncDrawable extends Drawable {
invalidateSelf();
}
+ /**
+ * @since 4.3.0-SNAPSHOT
+ */
+ @NonNull
+ private static Rect noDimensionsBounds(@Nullable Drawable result) {
+ if (result != null) {
+ final Rect bounds = result.getBounds();
+ if (!bounds.isEmpty()) {
+ return bounds;
+ }
+ final Rect intrinsicBounds = DrawableUtils.intrinsicBounds(result);
+ if (!intrinsicBounds.isEmpty()) {
+ return intrinsicBounds;
+ }
+ }
+ return new Rect(0, 0, 1, 1);
+ }
+
/**
* @since 1.0.1
*/
diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml
index 0c02f47f..d3266265 100644
--- a/sample/src/main/AndroidManifest.xml
+++ b/sample/src/main/AndroidManifest.xml
@@ -36,6 +36,7 @@
+
diff --git a/sample/src/main/java/io/noties/markwon/sample/MainActivity.java b/sample/src/main/java/io/noties/markwon/sample/MainActivity.java
index a14a8183..a8391ce8 100644
--- a/sample/src/main/java/io/noties/markwon/sample/MainActivity.java
+++ b/sample/src/main/java/io/noties/markwon/sample/MainActivity.java
@@ -25,6 +25,7 @@ import io.noties.markwon.sample.customextension2.CustomExtensionActivity2;
import io.noties.markwon.sample.editor.EditorActivity;
import io.noties.markwon.sample.html.HtmlActivity;
import io.noties.markwon.sample.htmldetails.HtmlDetailsActivity;
+import io.noties.markwon.sample.images.ImagesActivity;
import io.noties.markwon.sample.inlineparser.InlineParserActivity;
import io.noties.markwon.sample.latex.LatexActivity;
import io.noties.markwon.sample.precomputed.PrecomputedActivity;
@@ -137,6 +138,10 @@ public class MainActivity extends Activity {
activity = TaskListActivity.class;
break;
+ case IMAGES:
+ activity = ImagesActivity.class;
+ break;
+
default:
throw new IllegalStateException("No Activity is associated with sample-item: " + item);
}
diff --git a/sample/src/main/java/io/noties/markwon/sample/Sample.java b/sample/src/main/java/io/noties/markwon/sample/Sample.java
index f243c0ec..bf05297d 100644
--- a/sample/src/main/java/io/noties/markwon/sample/Sample.java
+++ b/sample/src/main/java/io/noties/markwon/sample/Sample.java
@@ -29,7 +29,9 @@ public enum Sample {
HTML_DETAILS(R.string.sample_html_details),
- TASK_LIST(R.string.sample_task_list);
+ TASK_LIST(R.string.sample_task_list),
+
+ IMAGES(R.string.sample_images);
private final int textResId;
diff --git a/sample/src/main/java/io/noties/markwon/sample/images/ImagesActivity.java b/sample/src/main/java/io/noties/markwon/sample/images/ImagesActivity.java
new file mode 100644
index 00000000..dd4a44dc
--- /dev/null
+++ b/sample/src/main/java/io/noties/markwon/sample/images/ImagesActivity.java
@@ -0,0 +1,85 @@
+package io.noties.markwon.sample.images;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.RequestBuilder;
+import com.bumptech.glide.request.target.Target;
+
+import io.noties.markwon.Markwon;
+import io.noties.markwon.image.AsyncDrawable;
+import io.noties.markwon.image.glide.GlideImagesPlugin;
+import io.noties.markwon.sample.ActivityWithMenuOptions;
+import io.noties.markwon.sample.MenuOptions;
+import io.noties.markwon.sample.R;
+
+public class ImagesActivity extends ActivityWithMenuOptions {
+
+ private TextView textView;
+
+ @NonNull
+ @Override
+ public MenuOptions menuOptions() {
+ // todo: same for other plugins
+ return MenuOptions.create()
+ .add("glide-singleImage", this::glideSingleImage)
+ .add("glide-singleImageWithPlaceholder", this::glideSingleImageWithPlaceholder);
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.activity_text_view);
+ textView = findViewById(R.id.text_view);
+
+ glideSingleImageWithPlaceholder();
+ }
+
+ private void glideSingleImage() {
+ final String md = "[](https://www.youtube.com/watch?v=gs1I8_m4AOM)";
+
+ final Markwon markwon = Markwon.builder(this)
+ .usePlugin(GlideImagesPlugin.create(this))
+ .build();
+
+ markwon.setMarkdown(textView, md);
+ }
+
+ // can be checked when used first, otherwise works as expected...
+ private void glideSingleImageWithPlaceholder() {
+ final String md = "[](https://www.youtube.com/watch?v=gs1I8_m4AOM)";
+
+ final Context context = this;
+
+ final Markwon markwon = Markwon.builder(context)
+ .usePlugin(GlideImagesPlugin.create(new GlideImagesPlugin.GlideStore() {
+ @NonNull
+ @Override
+ public RequestBuilder load(@NonNull AsyncDrawable drawable) {
+// final Drawable placeholder = ContextCompat.getDrawable(context, R.drawable.ic_home_black_36dp);
+// placeholder.setBounds(0, 0, 100, 100);
+ return Glide.with(context)
+ .load(drawable.getDestination())
+// .placeholder(ContextCompat.getDrawable(context, R.drawable.ic_home_black_36dp));
+// .placeholder(placeholder);
+ .placeholder(R.drawable.ic_home_black_36dp);
+ }
+
+ @Override
+ public void cancel(@NonNull Target> target) {
+ Glide.with(context)
+ .clear(target);
+ }
+ }))
+ .build();
+
+ markwon.setMarkdown(textView, md);
+ }
+}
diff --git a/sample/src/main/java/io/noties/markwon/sample/latex/LatexActivity.java b/sample/src/main/java/io/noties/markwon/sample/latex/LatexActivity.java
index 24d87da3..8a55a8ec 100644
--- a/sample/src/main/java/io/noties/markwon/sample/latex/LatexActivity.java
+++ b/sample/src/main/java/io/noties/markwon/sample/latex/LatexActivity.java
@@ -61,7 +61,8 @@ public class LatexActivity extends ActivityWithMenuOptions {
.add("boxes", this::boxes)
.add("insideBlockQuote", this::insideBlockQuote)
.add("error", this::error)
- .add("legacy", this::legacy);
+ .add("legacy", this::legacy)
+ .add("textColor", this::textColor);
}
@Override
@@ -136,6 +137,20 @@ public class LatexActivity extends ActivityWithMenuOptions {
markwon.setMarkdown(textView, md);
}
+ private void textColor() {
+ final String md = wrapLatexInSampleMarkdown(LATEX_LONG_DIVISION);
+ final Markwon markwon = Markwon.builder(this)
+ .usePlugin(MarkwonInlineParserPlugin.create())
+ .usePlugin(JLatexMathPlugin.create(textView.getTextSize(), new JLatexMathPlugin.BuilderConfigure() {
+ @Override
+ public void configureBuilder(@NonNull JLatexMathPlugin.Builder builder) {
+
+ }
+ }))
+ .build();
+ markwon.setMarkdown(textView, md);
+ }
+
@NonNull
private static String wrapLatexInSampleMarkdown(@NonNull String latex) {
return "" +
diff --git a/sample/src/main/res/values/strings-samples.xml b/sample/src/main/res/values/strings-samples.xml
index d7f11e1a..d174e736 100644
--- a/sample/src/main/res/values/strings-samples.xml
+++ b/sample/src/main/res/values/strings-samples.xml
@@ -33,4 +33,6 @@
# \# TaskList\n\nUsage of TaskListPlugin
+ # \# Images\n\nUsage of different images plugins
+
\ No newline at end of file