package com.nolanlawson.logcat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.ProgressBar; import com.nolanlawson.logcat.helper.PackageHelper; import com.nolanlawson.logcat.util.UtilLogger; public class AboutActivity extends Activity implements OnClickListener { private static UtilLogger log = new UtilLogger(AboutActivity.class); private Button okButton; private WebView aboutWebView; private ProgressBar progressBar; private Handler handler = new Handler(); private View topPanel; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.about); topPanel = findViewById(R.id.topPanel); topPanel.setVisibility(View.GONE); okButton = (Button) findViewById(R.id.okButton); okButton.setOnClickListener(this); okButton.setVisibility(View.GONE); aboutWebView = (WebView) findViewById(R.id.aboutTextWebView); aboutWebView.setVisibility(View.GONE); progressBar = (ProgressBar) findViewById(R.id.aboutProgressBar); aboutWebView.setBackgroundColor(0); aboutWebView.setWebViewClient(new AboutWebClient()); initializeWebView(); } public void initializeWebView() { String text = loadTextFile(R.raw.about_body); String version = PackageHelper.getVersionName(this); boolean isDonateVersion = PackageHelper.isCatlogDonateInstalled(getApplicationContext()); if (isDonateVersion) { version += " (" + getString(R.string.donate_version_name) + ")"; } String message = loadTextFile(isDonateVersion ? R.raw.donate_message : R.raw.free_message); String changelog = loadTextFile(R.raw.changelog); String css = loadTextFile(R.raw.about_css); String translations = loadTextFile(R.raw.translations); text = String.format(text, version, message, changelog, css, translations); WebSettings settings = aboutWebView.getSettings(); settings.setDefaultTextEncodingName("utf-8"); aboutWebView.loadDataWithBaseURL(null, text, "text/html", "UTF-8", null); } private String loadTextFile(int resourceId) { InputStream is = getResources().openRawResource(resourceId); BufferedReader buff = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); try { while (buff.ready()) { sb.append(buff.readLine()).append("\n"); } } catch (IOException e) { log.e(e, "This should not happen"); } return sb.toString(); } private void loadExternalUrl(String url) { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.setData(Uri.parse(url)); startActivity(intent); } @Override public void onClick(View v) { finish(); } private class AboutWebClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, final String url) { log.d("shouldOverrideUrlLoading"); // XXX hack to make the webview go to an external url if the hyperlink is // in my own HTML file - otherwise it says "Page not available" because I'm not calling // loadDataWithBaseURL. But if I call loadDataWithBaseUrl using a fake URL, then // the links within the page itself don't work!! Arggggh!!! if (url.startsWith("http") || url.startsWith("mailto") || url.startsWith("market")) { handler.post(new Runnable() { @Override public void run() { loadExternalUrl(url); } }); return true; } return false; } @Override public void onPageFinished(WebView view, String url) { // dismiss the loading bar when the page has finished loading handler.post(new Runnable(){ @Override public void run() { progressBar.setVisibility(View.GONE); aboutWebView.setVisibility(View.VISIBLE); topPanel.setVisibility(View.VISIBLE); okButton.setVisibility(View.VISIBLE); }}); super.onPageFinished(view, url); } } }