/* * Copyright 2012 GitHub Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.oschina.gitapp.util; import static net.oschina.gitapp.common.Contanst.CHARSET_UTF8; import static net.oschina.gitapp.bean.CodeFile.ENCODING_BASE64; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.os.Build; import android.text.TextUtils; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import java.io.UnsupportedEncodingException; import net.oschina.gitapp.bean.CodeFile; /** * 用markdown渲染代码显示 * @author 火蚁(http://my.oschina.net/LittleDY) * */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) @SuppressLint("SetJavaScriptEnabled") public class SourceEditor { private static final String URL_PAGE = "file:///android_asset/source-editor.html"; private final WebView view; private boolean wrap; private String name; private String content; private boolean encoded; private boolean markdown; /** * Create source editor using given web view * * @param view */ public SourceEditor(final WebView view) { WebSettings settings = view.getSettings(); settings.setJavaScriptEnabled(true); settings.setBuiltInZoomControls(true); try { int version = Integer.valueOf(android.os.Build.VERSION.SDK_INT); if (version >= 11) { // 这个方法在API level 11 以上才可以调用,不然会发生异常 settings.setDisplayZoomControls(false); } } catch (NumberFormatException e) { } settings.setUseWideViewPort(true); view.addJavascriptInterface(SourceEditor.this, "SourceEditor"); this.view = view; } /** * @return name */ @JavascriptInterface public String getName() { return name; } /** * @return content */ @JavascriptInterface public String getRawContent() { return content; } /** * @return content */ @JavascriptInterface public String getContent() { if (encoded) try { return new String(EncodingUtils.fromBase64(content), CHARSET_UTF8); } catch (UnsupportedEncodingException e) { return getRawContent(); } else return getRawContent(); } /** * @return wrap */ @JavascriptInterface public boolean getWrap() { return wrap; } /** * @return markdown */ @JavascriptInterface public boolean isMarkdown() { return markdown; } /** * Set whether lines should wrap * * @param wrap * @return this editor */ @JavascriptInterface public SourceEditor setWrap(final boolean wrap) { this.wrap = wrap; loadSource(); return this; } /** * Sets whether the content is a markdown file * * @param markdown * @return this editor */ @JavascriptInterface public SourceEditor setMarkdown(final boolean markdown) { this.markdown = markdown; return this; } /** * Bind content to current {@link WebView} * * @param name * @param content * @param encoded * @return this editor */ @JavascriptInterface public SourceEditor setSource(final String name, final String content, final boolean encoded) { this.name = name; this.content = content; this.encoded = encoded; loadSource(); return this; } @JavascriptInterface private void loadSource() { if (name != null && content != null) { view.loadUrl(URL_PAGE); } } /** * Bind blob content to current {@link WebView} * * @param name * @param blob * @return this editor */ @JavascriptInterface public SourceEditor setSource(final String name, final CodeFile blob) { String content = blob.getContent(); if (content == null) content = ""; boolean encoded = !TextUtils.isEmpty(content) && ENCODING_BASE64.equals(blob.getEncoding()); return setSource(name, content, encoded); } /** * Toggle line wrap * * @return this editor */ @JavascriptInterface public SourceEditor toggleWrap() { return setWrap(!wrap); } /** * Toggle markdown file rendering * * @return this editor */ @JavascriptInterface public SourceEditor toggleMarkdown() { return setMarkdown(!markdown); } }