From 2e35ef53bb80e24be0a4376d1b721b0f6f137ad7 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Thu, 30 May 2019 15:28:39 +0300 Subject: [PATCH] Ensure explicit dependencies for SVG and GIF --- .../ru/noties/markwon/MarkdownRenderer.java | 4 +-- .../markwon/ext/tasklist/TaskListPlugin.java | 2 +- .../image/AsyncDrawableLoaderBuilder.java | 11 ++------ .../ru/noties/markwon/image/ImagesPlugin.java | 4 ++- .../markwon/image/gif/GifMediaDecoder.java | 27 +++++++++++++++++++ .../image/network/NetworkSchemeHandler.java | 5 ++++ .../network/OkHttpNetworkSchemeHandler.java | 1 + .../markwon/image/svg/SvgMediaDecoder.java | 27 +++++++++++++++++++ 8 files changed, 67 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java b/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java index 26b247a2..a55d82dc 100644 --- a/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java +++ b/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java @@ -19,7 +19,6 @@ import ru.noties.markwon.ext.tables.TablePlugin; import ru.noties.markwon.ext.tasklist.TaskListPlugin; import ru.noties.markwon.gif.GifAwarePlugin; import ru.noties.markwon.html.HtmlPlugin; -import ru.noties.markwon.image.DefaultImageMediaDecoder; import ru.noties.markwon.image.ImagesPlugin; import ru.noties.markwon.image.data.DataUriSchemeHandler; import ru.noties.markwon.image.file.FileSchemeHandler; @@ -105,8 +104,7 @@ public class MarkdownRenderer { .addSchemeHandler(OkHttpNetworkSchemeHandler.create()) .addSchemeHandler(FileSchemeHandler.createWithAssets(context.getAssets())) .addMediaDecoder(GifMediaDecoder.create(false)) - .addMediaDecoder(SvgMediaDecoder.create()) - .defaultMediaDecoder(DefaultImageMediaDecoder.create()); + .addMediaDecoder(SvgMediaDecoder.create()); } })) .usePlugin(SyntaxHighlightPlugin.create(prism4j, prism4jTheme)) diff --git a/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListPlugin.java b/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListPlugin.java index 9f74c206..ec664280 100644 --- a/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListPlugin.java +++ b/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListPlugin.java @@ -101,7 +101,7 @@ public class TaskListPlugin extends AbstractMarkwonPlugin { private static int resolve(@NonNull Context context, @AttrRes int attr) { final TypedValue typedValue = new TypedValue(); - final int attrs[] = new int[]{attr}; + final int[] attrs = new int[]{attr}; final TypedArray typedArray = context.obtainStyledAttributes(typedValue.data, attrs); try { return typedArray.getColor(0, 0); diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java b/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java index 845d3e48..e82730f4 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java @@ -3,7 +3,6 @@ package ru.noties.markwon.image; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -31,14 +30,8 @@ class AsyncDrawableLoaderBuilder { } void addMediaDecoder(@NonNull MediaDecoder mediaDecoder) { - final Collection supportedTypes = mediaDecoder.supportedTypes(); - if (supportedTypes.isEmpty()) { - // todo: we should think about this little _side-effect_... does it worth it? - defaultMediaDecoder = mediaDecoder; - } else { - for (String type : supportedTypes) { - mediaDecoders.put(type, mediaDecoder); - } + for (String type : mediaDecoder.supportedTypes()) { + mediaDecoders.put(type, mediaDecoder); } } diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java b/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java index 77950ad5..0a7d9446 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java @@ -47,9 +47,11 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { * Factory method to create an empty {@link ImagesPlugin} instance with no {@link SchemeHandler}s * nor {@link MediaDecoder}s registered. Can be used to further configure via instance methods or * via {@link ru.noties.markwon.MarkwonPlugin#configure(Registry)} + * + * @see #create(ImagesConfigure) */ @NonNull - public static ImagesPlugin createEmpty() { + public static ImagesPlugin create() { return new ImagesPlugin(); } diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/gif/GifMediaDecoder.java b/markwon-image/src/main/java/ru/noties/markwon/image/gif/GifMediaDecoder.java index e5195bc5..200be994 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/gif/GifMediaDecoder.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/gif/GifMediaDecoder.java @@ -31,6 +31,9 @@ public class GifMediaDecoder extends MediaDecoder { protected GifMediaDecoder(boolean autoPlayGif) { this.autoPlayGif = autoPlayGif; + + // @since 4.0.0-SNAPSHOT + Holder.validate(); } @NonNull @@ -82,4 +85,28 @@ public class GifMediaDecoder extends MediaDecoder { } return outputStream.toByteArray(); } + + // @since 4.0.0-SNAPSHOT + private static class Holder { + + private static final boolean HAS_GIF; + + static { + boolean result = true; + try { + GifDrawable.class.getName(); + } catch (Throwable t) { + result = false; + t.printStackTrace(); + } + HAS_GIF = result; + } + + static void validate() { + if (!HAS_GIF) { + throw new IllegalStateException("`pl.droidsonroids.gif:android-gif-drawable:*` " + + "dependency is missing, please add to your project explicitly"); + } + } + } } diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java b/markwon-image/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java index a9dbfaee..920fa4c1 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java @@ -31,6 +31,11 @@ public class NetworkSchemeHandler extends SchemeHandler { return new NetworkSchemeHandler(); } + @SuppressWarnings("WeakerAccess") + NetworkSchemeHandler() { + + } + @NonNull @Override public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/network/OkHttpNetworkSchemeHandler.java b/markwon-image/src/main/java/ru/noties/markwon/image/network/OkHttpNetworkSchemeHandler.java index 7faec7e5..9feddd0f 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/network/OkHttpNetworkSchemeHandler.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/network/OkHttpNetworkSchemeHandler.java @@ -36,6 +36,7 @@ public class OkHttpNetworkSchemeHandler extends SchemeHandler { private final OkHttpClient client; + @SuppressWarnings("WeakerAccess") OkHttpNetworkSchemeHandler(@NonNull OkHttpClient client) { this.client = client; } diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/svg/SvgMediaDecoder.java b/markwon-image/src/main/java/ru/noties/markwon/image/svg/SvgMediaDecoder.java index e9484a25..78d381a8 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/svg/SvgMediaDecoder.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/svg/SvgMediaDecoder.java @@ -44,6 +44,9 @@ public class SvgMediaDecoder extends MediaDecoder { @SuppressWarnings("WeakerAccess") SvgMediaDecoder(Resources resources) { this.resources = resources; + + // @since 4.0.0-SNAPSHOT + Holder.validate(); } @NonNull @@ -79,4 +82,28 @@ public class SvgMediaDecoder extends MediaDecoder { public Collection supportedTypes() { return Collections.singleton(CONTENT_TYPE); } + + // @since 4.0.0-SNAPSHOT + private static class Holder { + + private static final boolean HAS_SVG; + + static { + boolean result = true; + try { + SVG.class.getName(); + } catch (Throwable t) { + result = false; + t.printStackTrace(); + } + HAS_SVG = result; + } + + static void validate() { + if (!HAS_SVG) { + throw new IllegalStateException("`com.caverock:androidsvg:*` dependency is missing, " + + "please add to your project explicitly"); + } + } + } }