package com.halzhang.android.apps.startupnews.ui.widgets;
import com.halzhang.android.apps.startupnews.R;
import com.halzhang.android.apps.startupnews.analytics.Tracker;
import com.halzhang.android.apps.startupnews.ui.BaseFragmentActivity;
import com.halzhang.android.apps.startupnews.utils.UIUtils;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import java.lang.ref.WeakReference;
/**
* WebView and Browse Bar Controller
*
* @author Hal
*/
public class WebViewController implements OnClickListener {
private WeakReference<Activity> mActivityRef;
private WebView mWebView;
private ImageButton mBackButton;
private ImageButton mForwardButton;
private ImageButton mReadabilityButton;
private ImageButton mRefreshButton;
private ImageButton mWebSiteButton;
private View mToolBar;
private String mCurrentUrl;
public WebViewController(Activity activity) {
mActivityRef = new WeakReference<Activity>(activity);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("SetJavaScriptEnabled")
public void initControllerView(WebView webView, View view) {
if (webView == null || view == null) {
return;
}
mWebView = webView;
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.setWebViewClient(new MyWebViewClient());
WebSettings settings = mWebView.getSettings();
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
if (UIUtils.hasHoneycomb()) {
settings.setDisplayZoomControls(false);
}
settings.setJavaScriptEnabled(true);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
mBackButton = (ImageButton) view.findViewById(R.id.browse_back);
mForwardButton = (ImageButton) view.findViewById(R.id.browse_forward);
mReadabilityButton = (ImageButton) view.findViewById(R.id.browse_readability);
mRefreshButton = (ImageButton) view.findViewById(R.id.browse_refresh);
mWebSiteButton = (ImageButton) view.findViewById(R.id.browse_website);
mToolBar = view.findViewById(R.id.browse_bar);
mBackButton.setOnClickListener(this);
mForwardButton.setOnClickListener(this);
mReadabilityButton.setOnClickListener(this);
mRefreshButton.setOnClickListener(this);
mWebSiteButton.setOnClickListener(this);
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
setCurrentUrl(url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
setCurrentUrl(url);
}
}
private void setCurrentUrl(String url) {
mCurrentUrl = url;
}
private String getCurrentUrl() {
return mCurrentUrl; //TextUtils.isEmpty(mCurrentUrl) ? mOriginalUrl : mCurrentUrl;
}
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
int progress = (Window.PROGRESS_END - Window.PROGRESS_START) / 100 * newProgress;
Activity activity = mActivityRef.get();
if (activity != null && activity instanceof BaseFragmentActivity) {
((BaseFragmentActivity) activity).setSupportProgress(progress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
mActivityRef.get().setTitle(title);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.browse_back:
back();
break;
case R.id.browse_forward:
forward();
break;
case R.id.browse_readability:
readability();
break;
case R.id.browse_refresh:
refresh();
break;
case R.id.browse_website:
webSite();
break;
default:
break;
}
}
private void back() {
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"browseactivity_menu_back", 0L);
if (mWebView.canGoBack()) {
mWebView.goBack();
}
}
private void forward() {
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"browseactivity_menu_forward", 0L);
if (mWebView.canGoForward()) {
mWebView.goForward();
}
}
private void readability() {
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"browseactivity_menu_readability", 0L);
if (TextUtils.isEmpty(mCurrentUrl)) {
return;
}
mWebView.loadUrl("http://www.readability.com/m?url=" + getCurrentUrl());
}
private void refresh() {
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"browseactivity_menu_refresh", 0L);
mWebView.reload();
}
private void webSite() {
// 打开原链接,还是转码的链接呢?
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"browseactivity_menu_website", 0L);
if (TextUtils.isEmpty(mCurrentUrl)) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(getCurrentUrl()));
mActivityRef.get().startActivity(intent);
}
public WebView getWebView() {
return mWebView;
}
public void destroy() {
if (mWebView != null) {
((ViewGroup) mWebView.getParent()).removeAllViews();
mWebView.clearHistory();
mWebView.clearCache(true);
mWebView.loadUrl("about:blank");
mWebView.pauseTimers();
mWebView.destroy();
mWebView = null;
}
mActivityRef.clear();
}
public void loadUrl(String url) {
if (TextUtils.isEmpty(url) || url.equals(mCurrentUrl)) {
return;
}
mWebView.clearHistory();
mWebView.loadUrl(url);
}
public void showBrowseBar() {
if (mToolBar != null) {
Animation animation = AnimationUtils.loadAnimation(mActivityRef.get(), R.anim.push_up_in);
mToolBar.startAnimation(animation);
mToolBar.setVisibility(View.VISIBLE);
}
}
public void hideBrowseBar() {
if (mToolBar != null) {
Animation animation = AnimationUtils.loadAnimation(mActivityRef.get(), R.anim.push_down_out);
mToolBar.startAnimation(animation);
mToolBar.setVisibility(View.GONE);
}
}
}