package org.cnodejs.android.md.ui.widget; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.support.annotation.AttrRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.util.AttributeSet; import org.cnodejs.android.md.ui.listener.ImageJavascriptInterface; public class ContentWebView extends CNodeWebView { private static final String HTML_0 = "" + "<!DOCTYPE html>\n" + "<html>\n" + "<head>\n" + "<meta charset=\"UTF-8\">\n" + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n"; private static final String LIGHT_THEME_CSS = "" + "<link type=\"text/css\" rel=\"stylesheet\" href=\"" + "file:///android_asset/css/content_light.css" + "\">\n" + "<link type=\"text/css\" rel=\"stylesheet\" href=\"" + "file:///android_asset/css/markdown_light.css" + "\">\n"; private static final String DARK_THEME_CSS = "" + "<link type=\"text/css\" rel=\"stylesheet\" href=\"" + "file:///android_asset/css/content_dark.css" + "\">\n" + "<link type=\"text/css\" rel=\"stylesheet\" href=\"" + "file:///android_asset/css/markdown_dark.css" + "\">\n"; private static final String HTML_1 = "" + "</head>\n" + "<body>\n" + "<div id=\"markdown-container\">\n"; private static final String HTML_2 = "" + "</div>\n" + "<script>\n" + "(function() {\n" + " var markdownContainer = document.getElementById('markdown-container');\n" + " markdownContainer.onclick = function (event) {\n" + " if (event.target.nodeName === 'IMG') {\n" + " if (event.target.parentNode.nodeName !== 'A') {\n" + " window." + ImageJavascriptInterface.NAME + ".openImage(event.target.src);\n" + " }\n" + " }\n" + " };\n" + "})();\n" + "</script>\n" + "</body>\n" + "</html>"; public ContentWebView(@NonNull Context context) { super(context); init(context); } public ContentWebView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); } public ContentWebView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ContentWebView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context); } @SuppressLint("AddJavascriptInterface") private void init(@NonNull Context context) { addJavascriptInterface(ImageJavascriptInterface.with(context), ImageJavascriptInterface.NAME); } @NonNull protected String getThemeCssHtmlSlice(boolean isDarkTheme) { return isDarkTheme ? DARK_THEME_CSS : LIGHT_THEME_CSS; } public void loadRenderedContent(String data) { data = HTML_0 + getThemeCssHtmlSlice(isDarkTheme()) + HTML_1 + data + "\n" + HTML_2; loadDataWithBaseURL(null, data, "text/html", "utf-8", null); } }