package me.pjq.pushup.activity; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.ActionBar; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.webkit.*; import android.widget.ProgressBar; import android.widget.Toast; import me.pjq.pushup.EFLogger; import me.pjq.pushup.R; import java.util.HashMap; import java.util.Map; /** * Created by kicoolzhang on 7/26/13. */ public abstract class WebViewActivity extends BaseActionBarActivity { protected static String TAG = WebViewActivity.class.getSimpleName(); public static final String KEY_URL = "url"; protected WebView mWebView; protected WebSettings webSettings; protected Handler handler; protected String mUrl; protected ProgressBar progressBar; protected Map<String, String> extraHeaders; final Activity activity = this; abstract void ensureUI(); abstract void postInit(); @Override protected void onCreate(Bundle arg0) { // requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(arg0); ensureUI(); init(); postInit(); Intent i = getIntent(); mUrl = i.getStringExtra(KEY_URL); EFLogger.i(TAG, "onCreate openUrl:" + mUrl); loadurl(mWebView, mUrl); ActionBar actionBar = getActionBarImpl(); actionBar.setHomeButtonEnabled(true); actionBar.setTitle(getString(R.string.menu_item_about)); actionBar.setDisplayHomeAsUpEnabled(true); } protected void init() { extraHeaders = new HashMap<String, String>(); initWebView(); progressBar = (ProgressBar) findViewById(R.id.webviewProgressBar); handler = new Handler() { public void handleMessage(Message msg) { if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case 0: progressBar.setVisibility(View.VISIBLE); // webSettings.setBlockNetworkImage(true); break; case 1: progressBar.setVisibility(View.GONE); webSettings.setBlockNetworkImage(false); mWebView.requestFocusFromTouch(); break; } } super.handleMessage(msg); } }; } private void initWebView() { webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSaveFormData(true); webSettings.setSavePassword(false); webSettings.setAllowFileAccess(false); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); mWebView.setVerticalScrollBarEnabled(true); mWebView.setHorizontalScrollBarEnabled(true); mWebView.setWebViewClient(new WebViewClientExtension()); mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return false; } @Override public void onProgressChanged(WebView view, int progress) { EFLogger.i(TAG, "progress:" + progress); progressBar.setProgress(progress); if (progress == 100) { handler.sendEmptyMessage(1); } super.onProgressChanged(view, progress); } }); } private class WebViewClientExtension extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { EFLogger.i(TAG, "Load URL:" + url); String scheme = Uri.parse(url).getScheme(); view.loadUrl(url, extraHeaders); return true; } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { //Toast.makeText(activity, "Error:" + description, Toast.LENGTH_SHORT).show(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); EFLogger.i(TAG, "onPageStarted URL:" + url); progressBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); EFLogger.i(TAG, "onPageFinished URL:" + url); progressBar.setVisibility(View.GONE); } } @Override protected void onDestroy() { super.onDestroy(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } else if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); return true; } return super.onKeyDown(keyCode, event); } protected void loadurl(final WebView view, final String url) { runOnUiThread(new Runnable() { @Override public void run() { handler.sendEmptyMessage(0); view.loadUrl(url, extraHeaders); } }); } }