package com.njlabs.showjava.ui; import android.content.res.AssetManager; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.ActionBar; import android.view.View; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import com.google.common.html.HtmlEscapers; import com.njlabs.showjava.R; import org.apache.commons.io.FilenameUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class SourceViewer extends BaseActivity { private String sourceFilePath; private String sourceFilename; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupLayout(R.layout.activity_source_viewer); getWindow().getDecorView().setBackgroundColor(Color.BLACK); ActionBar actionBar = getSupportActionBar(); Bundle extras = getIntent().getExtras(); String packageID = ""; if (extras != null) { sourceFilePath = extras.getString("file_path"); sourceFilename = FilenameUtils.getName(sourceFilePath); packageID = extras.getString("package_id"); } if (actionBar != null) { actionBar.setTitle(sourceFilename); String subtitle = FilenameUtils.getFullPath(sourceFilePath).replace(Environment.getExternalStorageDirectory() + "/ShowJava/sources/" + packageID + "/", ""); actionBar.setSubtitle(subtitle); if (sourceFilename.trim().equalsIgnoreCase("AndroidManifest.xml")) { actionBar.setSubtitle(packageID); } } FileInputStream fs; int ch; StringBuilder str = new StringBuilder(); String sourceCodeText = ""; try { fs = new FileInputStream(new File(sourceFilePath)); while ((ch = fs.read()) != -1) { str.append((char) ch); } sourceCodeText = str.toString(); fs.close(); } catch (IOException ignored) { } sourceCodeText = HtmlEscapers.htmlEscaper().escape(sourceCodeText); WebView webView = (WebView) findViewById(R.id.source_view); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDefaultTextEncodingName("utf-8"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { ProgressBar progress = (ProgressBar) findViewById(R.id.progress); progress.setVisibility(View.GONE); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { InputStream stream = inputStreamForAndroidResource(url); if (stream != null) { return new WebResourceResponse("text/javascript", "utf-8", stream); } return super.shouldInterceptRequest(view, url); } private InputStream inputStreamForAndroidResource(String url) { final String ANDROID_ASSET = "file:///android_asset/"; if (url.contains(ANDROID_ASSET)) { url = url.replaceFirst(ANDROID_ASSET, ""); try { AssetManager assets = getAssets(); Uri uri = Uri.parse(url); return assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING); } catch (IOException e) { e.printStackTrace(); } } return null; } }); webView.loadDataWithBaseURL("file:///android_asset/", "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><script src=\"run_prettify.js?skin=sons-of-obsidian\"></script></head><body bgcolor=\"#000000\"><pre class=\"prettyprint linenums\">" + sourceCodeText + "</pre></body></html>", "text/html", "UTF-8", null); } }