From 12c7c8909bad20830c3841314ab22275b78b2b98 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sun, 8 Mar 2020 12:45:31 +0300 Subject: [PATCH] Non empty bounds for AsyncDrawable when no dimensions available --- CHANGELOG.md | 2 + .../noties/markwon/image/AsyncDrawable.java | 23 +++++ sample/src/main/AndroidManifest.xml | 1 + .../noties/markwon/sample/MainActivity.java | 5 ++ .../java/io/noties/markwon/sample/Sample.java | 4 +- .../markwon/sample/images/ImagesActivity.java | 85 +++++++++++++++++++ .../markwon/sample/latex/LatexActivity.java | 17 +++- .../src/main/res/values/strings-samples.xml | 2 + 8 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 sample/src/main/java/io/noties/markwon/sample/images/ImagesActivity.java 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 = "[![undefined](https://img.youtube.com/vi/gs1I8_m4AOM/0.jpg)](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 = "[![undefined](https://img.youtube.com/vi/gs1I8_m4AOM/0.jpg)](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