diff --git a/markwon-image-loader/src/main/java/ru/noties/markwon/il/AsyncDrawableLoader.java b/markwon-image-loader/src/main/java/ru/noties/markwon/il/AsyncDrawableLoader.java index e2d0eec0..0009c855 100644 --- a/markwon-image-loader/src/main/java/ru/noties/markwon/il/AsyncDrawableLoader.java +++ b/markwon-image-loader/src/main/java/ru/noties/markwon/il/AsyncDrawableLoader.java @@ -225,8 +225,18 @@ public class AsyncDrawableLoader implements AsyncDrawable.Loader { * @since 2.0.0 */ @NonNull - public Builder schemeHandler(@NonNull String scheme, @Nullable SchemeHandler schemeHandler) { - schemeHandlers.put(scheme, schemeHandler); + public Builder addSchemeHandler(@NonNull SchemeHandler schemeHandler) { + + SchemeHandler previous; + + for (String scheme : schemeHandler.schemes()) { + previous = schemeHandlers.put(scheme, schemeHandler); + if (previous != null) { + throw new IllegalStateException(String.format("Multiple scheme handlers handle " + + "the same scheme: `%s`, %s %s", scheme, previous, schemeHandler)); + } + } + return this; } @@ -261,33 +271,13 @@ public class AsyncDrawableLoader implements AsyncDrawable.Loader { // @since 2.0.0 // put default scheme handlers (to mimic previous behavior) - { - - final boolean hasHttp = schemeHandlers.containsKey("http"); - final boolean hasHttps = schemeHandlers.containsKey("https"); - - if (!hasHttp || !hasHttps) { - - if (client == null) { - client = new OkHttpClient(); - } - - final NetworkSchemeHandler handler = NetworkSchemeHandler.create(client); - if (!hasHttp) { - schemeHandlers.put("http", handler); - } - if (!hasHttps) { - schemeHandlers.put("https", handler); - } - } - - if (!schemeHandlers.containsKey("file")) { - schemeHandlers.put("file", FileSchemeHandler.createWithAssets(resources.getAssets())); - } - - if (!schemeHandlers.containsKey("data")) { - schemeHandlers.put("data", DataUriSchemeHandler.create()); + if (schemeHandlers.size() == 0) { + if (client == null) { + client = new OkHttpClient(); } + addSchemeHandler(NetworkSchemeHandler.create(client)); + addSchemeHandler(FileSchemeHandler.createWithAssets(resources.getAssets())); + addSchemeHandler(DataUriSchemeHandler.create()); } // add default media decoders if not specified diff --git a/markwon-image-loader/src/main/java/ru/noties/markwon/il/DataUriSchemeHandler.java b/markwon-image-loader/src/main/java/ru/noties/markwon/il/DataUriSchemeHandler.java index 95bed1aa..e93aa256 100644 --- a/markwon-image-loader/src/main/java/ru/noties/markwon/il/DataUriSchemeHandler.java +++ b/markwon-image-loader/src/main/java/ru/noties/markwon/il/DataUriSchemeHandler.java @@ -6,6 +6,8 @@ import android.support.annotation.Nullable; import android.text.TextUtils; import java.io.ByteArrayInputStream; +import java.util.Collection; +import java.util.Collections; /** * @since 2.0.0 @@ -57,4 +59,10 @@ public class DataUriSchemeHandler extends SchemeHandler { public void cancel(@NonNull String raw) { // no op } + + @NonNull + @Override + public Collection schemes() { + return Collections.singleton("data"); + } } diff --git a/markwon-image-loader/src/main/java/ru/noties/markwon/il/FileSchemeHandler.java b/markwon-image-loader/src/main/java/ru/noties/markwon/il/FileSchemeHandler.java index 51e96533..437bbf7a 100644 --- a/markwon-image-loader/src/main/java/ru/noties/markwon/il/FileSchemeHandler.java +++ b/markwon-image-loader/src/main/java/ru/noties/markwon/il/FileSchemeHandler.java @@ -11,6 +11,8 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -98,4 +100,10 @@ public class FileSchemeHandler extends SchemeHandler { public void cancel(@NonNull String raw) { // no op } + + @NonNull + @Override + public Collection schemes() { + return Collections.singleton("file"); + } } diff --git a/markwon-image-loader/src/main/java/ru/noties/markwon/il/NetworkSchemeHandler.java b/markwon-image-loader/src/main/java/ru/noties/markwon/il/NetworkSchemeHandler.java index 8a98463a..d87c4019 100644 --- a/markwon-image-loader/src/main/java/ru/noties/markwon/il/NetworkSchemeHandler.java +++ b/markwon-image-loader/src/main/java/ru/noties/markwon/il/NetworkSchemeHandler.java @@ -6,6 +6,8 @@ import android.support.annotation.Nullable; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import okhttp3.Call; @@ -78,4 +80,10 @@ public class NetworkSchemeHandler extends SchemeHandler { } } } + + @NonNull + @Override + public Collection schemes() { + return Arrays.asList("http", "https"); + } } diff --git a/markwon-image-loader/src/main/java/ru/noties/markwon/il/SchemeHandler.java b/markwon-image-loader/src/main/java/ru/noties/markwon/il/SchemeHandler.java index c83bc5d9..3a7f9fc7 100644 --- a/markwon-image-loader/src/main/java/ru/noties/markwon/il/SchemeHandler.java +++ b/markwon-image-loader/src/main/java/ru/noties/markwon/il/SchemeHandler.java @@ -4,6 +4,8 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.util.Collection; + /** * @since 2.0.0 */ @@ -13,4 +15,7 @@ public abstract class SchemeHandler { public abstract ImageItem handle(@NonNull String raw, @NonNull Uri uri); public abstract void cancel(@NonNull String raw); + + @NonNull + public abstract Collection schemes(); }