package com.stardust.widget; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import org.commonmark.ext.heading.anchor.HeadingAnchorExtension; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import java.util.Collections; /** * Created by Stardust on 2017/3/5. */ public class CommonMarkdownView extends WebView { private Parser mParser = Parser.builder().build(); private HtmlRenderer mHtmlRender = HtmlRenderer.builder() .extensions(Collections.singleton(new HeadingAnchorExtension.Builder().build())) .build(); private String mMarkdownHtml; private String mPadding = "16px"; public CommonMarkdownView(Context context) { super(context); init(); } public CommonMarkdownView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CommonMarkdownView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public void setPadding(String padding) { mPadding = padding; } private void init() { setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { loadUrl("javascript:document.body.style.margin=\"" + mPadding + "\"; void 0"); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(request.getUrl()).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); return true; } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); return true; } }); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public CommonMarkdownView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public void loadMarkdown(String markdown) { mMarkdownHtml = renderMarkdown(markdown); loadHtml(mMarkdownHtml); } private void loadHtml(String html) { loadDataWithBaseURL(null, html, "text/html", "utf-8", null); } private String renderMarkdown(String markdown) { Node document = mParser.parse(markdown); return mHtmlRender.render(document); } public void setText(int resId) { setText(getContext().getString(resId)); } private void setText(String text) { loadDataWithBaseURL(null, text, "text/plain", "utf-8", null); } public void goBack() { super.goBack(); if (!canGoBack() && mMarkdownHtml != null) { loadHtml(mMarkdownHtml); } } public static class DialogBuilder extends ThemeColorMaterialDialogBuilder { private CommonMarkdownView mMarkdownView; private FrameLayout mContainer; public DialogBuilder(@NonNull Context context) { super(context); mContainer = new FrameLayout(context); mMarkdownView = new CommonMarkdownView(context); mContainer.addView(mMarkdownView); mContainer.setClipToPadding(true); customView(mContainer, false); } public DialogBuilder padding(int l, int t, int r, int b) { mContainer.setPadding(l, t, r, b); return this; } public DialogBuilder markdown(String md) { mMarkdownView.loadMarkdown(md); return this; } } }