diff --git a/markwon-image-okhttp/build.gradle b/markwon-image-okhttp/build.gradle new file mode 100644 index 00000000..cafe07c2 --- /dev/null +++ b/markwon-image-okhttp/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.library' + +android { + + compileSdkVersion config['compile-sdk'] + buildToolsVersion config['build-tools'] + + defaultConfig { + minSdkVersion config['min-sdk'] + targetSdkVersion config['target-sdk'] + versionCode 1 + versionName version + } +} + +dependencies { + + api project(':markwon') + + deps.with { + api it['okhttp'] + } +} + +registerArtifact(this) \ No newline at end of file diff --git a/markwon-image-okhttp/src/main/AndroidManifest.xml b/markwon-image-okhttp/src/main/AndroidManifest.xml new file mode 100644 index 00000000..32240579 --- /dev/null +++ b/markwon-image-okhttp/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/MarkwonImageOkHttpPlugin.java b/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/MarkwonImageOkHttpPlugin.java new file mode 100644 index 00000000..bc197c16 --- /dev/null +++ b/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/MarkwonImageOkHttpPlugin.java @@ -0,0 +1,45 @@ +package ru.noties.markwon.image.okhttp; + +import android.support.annotation.NonNull; + +import java.util.Arrays; + +import okhttp3.OkHttpClient; +import ru.noties.markwon.AbstractMarkwonPlugin; +import ru.noties.markwon.image.AsyncDrawableLoader; +import ru.noties.markwon.image.network.NetworkSchemeHandler; + +/** + * Plugin to use OkHttpClient to obtain images from network (http and https schemes) + * + * @see #create() + * @see #create(OkHttpClient) + * @since 3.0.0 + */ +@SuppressWarnings("WeakerAccess") +public class MarkwonImageOkHttpPlugin extends AbstractMarkwonPlugin { + + @NonNull + public static MarkwonImageOkHttpPlugin create() { + return new MarkwonImageOkHttpPlugin(new OkHttpClient()); + } + + @NonNull + public static MarkwonImageOkHttpPlugin create(@NonNull OkHttpClient okHttpClient) { + return new MarkwonImageOkHttpPlugin(okHttpClient); + } + + private final OkHttpClient client; + + MarkwonImageOkHttpPlugin(@NonNull OkHttpClient client) { + this.client = client; + } + + @Override + public void configureImages(@NonNull AsyncDrawableLoader.Builder builder) { + builder.addSchemeHandler( + Arrays.asList(NetworkSchemeHandler.SCHEME_HTTP, NetworkSchemeHandler.SCHEME_HTTPS), + new OkHttpSchemeHandler(client) + ); + } +} diff --git a/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/OkHttpSchemeHandler.java b/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/OkHttpSchemeHandler.java new file mode 100644 index 00000000..eaf73bd6 --- /dev/null +++ b/markwon-image-okhttp/src/main/java/ru/noties/markwon/image/okhttp/OkHttpSchemeHandler.java @@ -0,0 +1,57 @@ +package ru.noties.markwon.image.okhttp; + +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import java.io.IOException; +import java.io.InputStream; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import ru.noties.markwon.image.ImageItem; +import ru.noties.markwon.image.SchemeHandler; + +class OkHttpSchemeHandler extends SchemeHandler { + + private static final String HEADER_CONTENT_TYPE = "Content-Type"; + + private final OkHttpClient client; + + OkHttpSchemeHandler(@NonNull OkHttpClient client) { + this.client = client; + } + + @Nullable + @Override + public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { + ImageItem out = null; + + final Request request = new Request.Builder() + .url(raw) + .tag(raw) + .build(); + + Response response = null; + try { + response = client.newCall(request).execute(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (response != null) { + final ResponseBody body = response.body(); + if (body != null) { + final InputStream inputStream = body.byteStream(); + if (inputStream != null) { + final String contentType = response.header(HEADER_CONTENT_TYPE); + out = new ImageItem(contentType, inputStream); + } + } + } + + return out; + } +} diff --git a/markwon/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java b/markwon/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java index c5352d4b..ebaaf803 100644 --- a/markwon/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java +++ b/markwon/src/main/java/ru/noties/markwon/image/network/NetworkSchemeHandler.java @@ -13,6 +13,12 @@ import java.net.URL; import ru.noties.markwon.image.ImageItem; import ru.noties.markwon.image.SchemeHandler; +/** + * A simple network scheme handler that is not dependent on any external libraries. + * + * @see #create() + * @since 3.0.0 + */ public class NetworkSchemeHandler extends SchemeHandler { public static final String SCHEME_HTTP = "http"; diff --git a/settings.gradle b/settings.gradle index a4ab85b4..7ae3b4b8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,6 +5,7 @@ include ':app', ':markwon-ext-strikethrough', ':markwon-ext-tables', ':markwon-ext-tasklist', + ':markwon-image-okhttp', ':markwon-image-svg', ':markwon-image-gif', ':markwon-syntax-highlight',