/* * 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 com.github.mobile.util; import static org.eclipse.egit.github.core.Blob.ENCODING_BASE64; import static org.eclipse.egit.github.core.client.IGitHubConstants.CHARSET_UTF8; import android.content.Context; import android.content.Intent; import android.text.TextUtils; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.github.mobile.ui.UrlLauncher; import java.io.UnsupportedEncodingException; import org.eclipse.egit.github.core.Blob; import org.eclipse.egit.github.core.util.EncodingUtils; /** * Utilities for displaying source code in a {@link WebView} */ 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) { WebViewClient client = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (URL_PAGE.equals(url)) { view.loadUrl(url); return false; } else { Context context = view.getContext(); Intent intent = new UrlLauncher(context).create(url); context.startActivity(intent); return true; } } }; view.setWebViewClient(client); WebSettings settings = view.getSettings(); settings.setJavaScriptEnabled(true); settings.setBuiltInZoomControls(true); settings.setUseWideViewPort(true); view.addJavascriptInterface(this, "SourceEditor"); this.view = view; } /** * @return name */ public String getName() { return name; } /** * @return content */ public String getRawContent() { return content; } /** * @return content */ public String getContent() { if (encoded) try { return new String(EncodingUtils.fromBase64(content), CHARSET_UTF8); } catch (UnsupportedEncodingException e) { return getRawContent(); } else return getRawContent(); } /** * @return wrap */ public boolean getWrap() { return wrap; } /** * @return markdown */ public boolean isMarkdown() { return markdown; } /** * Set whether lines should wrap * * @param wrap * @return this editor */ 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 */ 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 */ public SourceEditor setSource(final String name, final String content, final boolean encoded) { this.name = name; this.content = content; this.encoded = encoded; loadSource(); return this; } private void loadSource() { if (name != null && content != null) if (markdown) view.loadData(content, "text/html", null); else view.loadUrl(URL_PAGE); } /** * Bind blob content to current {@link WebView} * * @param name * @param blob * @return this editor */ public SourceEditor setSource(final String name, final Blob 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 */ public SourceEditor toggleWrap() { return setWrap(!wrap); } /** * Toggle markdown file rendering * * @return this editor */ public SourceEditor toggleMarkdown() { return setMarkdown(!markdown); } }