package com.likebamboo.osa.android.ui.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import com.likebamboo.osa.android.R;
/**
* 通用webview,包装webview,向外暴露webview部分接口,统一封装了native功能,提供给页面使用
*
* @version [版本号, 2015-5-24]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class CommonWebView extends FrameLayout {
/**
* 上下文对象
*/
private Context mContext = null;
/**
* webView
*/
private ObservedWebView mWebview = null;
/**
* 进度条
*/
private ProgressBar mProgressBar = null;
/**
* 工具栏
*/
private WebViewToolBar mToolBar = null;
/**
* 状态回调
*/
private IWebViewStatusListener mListener = null;
/**
* webView client
*/
private WebViewClient mWebViewClient = new WebViewClient() {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
mProgressBar.setVisibility(View.VISIBLE);
if (mListener != null) {
mListener.onPageStarted(url);
}
}
public void onPageFinished(WebView view, String url) {
mProgressBar.setVisibility(View.GONE);
if (mListener != null) {
mListener.onPageFinished(url);
}
// 标题
if (!TextUtils.isEmpty(view.getTitle())) {
if (mListener != null) {
mListener.onReceiveTitle(view.getTitle());
}
}
if (mToolBar != null) {
// 更新工具栏状态
mToolBar.updateStatus();
}
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// Android webview访问HTTPS web page忽略验证 .
handler.proceed(); // 接受所有网站的证书
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url == null) {
return true;
}
if (mListener != null && mListener.shouldOverrideUrl(url)) {
return true;
}
return false;
}
};
/**
* WebChromeClient
*/
private WebChromeClient mWebChromeClient = new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
mProgressBar.setVisibility(GONE);
} else {
if (mProgressBar.getVisibility() == GONE) {
mProgressBar.setVisibility(VISIBLE);
}
mProgressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (!TextUtils.isEmpty(title)) {
if (mListener != null) {
mListener.onReceiveTitle(view.getTitle());
}
}
}
};
public CommonWebView(Context context) {
this(context, null);
}
public CommonWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CommonWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
/**
* 初始化view
*/
private void initView(Context context) {
mContext = context;
LayoutInflater.from(context).inflate(R.layout.common_webview, this, true);
mWebview = (ObservedWebView) findViewById(R.id.common_webview);
mProgressBar = (ProgressBar) findViewById(R.id.webview_progress_bar);
mToolBar = (WebViewToolBar) findViewById(R.id.webview_tool_bar);
initWebViewSettings();
mToolBar.attachToWebView(mWebview);
}
/**
* 初始化webview配置
*/
private void initWebViewSettings() {
WebSettings webSettings = mWebview.getSettings();
// 打开h5 localstorage
webSettings.setDomStorageEnabled(true);
// 不设置setDatabasePath,html5数据只会保存在内存
webSettings.setDatabaseEnabled(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginState(PluginState.ON);
// 禁止window open
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
// 支持viewport meta tag
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(false);
mWebview.setVerticalScrollBarEnabled(false);
mWebview.setHorizontalScrollBarEnabled(false);
// 滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上
mWebview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
mWebview.setWebChromeClient(mWebChromeClient);
mWebview.setWebViewClient(mWebViewClient);
}
// ==============api method ===========
/**
* 加载指定url
*/
public void loadUrl(String url) {
mWebview.loadUrl(url);
}
/**
* onpause
*/
public void onPause() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mWebview.onPause();
}
}
/**
* onResume
*/
public void onResume() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mWebview.onResume();
}
}
/**
* 设置toolbar是否显示
*
* @param visibility
*/
public void setToolBarVisibility(int visibility) {
mToolBar.setVisibility(visibility);
}
/**
* 设置状态监听回调
*
* @param mListener
*/
public void setStatusListener(IWebViewStatusListener mListener) {
this.mListener = mListener;
}
/**
* 返回
*
* @return
*/
public boolean goBack() {
if (mWebview.canGoBack()) {
mWebview.goBack();
return true;
}
return false;
}
/**
* getwebView
*
* @return
*/
public ObservedWebView getWebView() {
return mWebview;
}
public interface IWebViewStatusListener {
void onPageStarted(String url);
void onPageFinished(String url);
void onReceiveTitle(String title);
boolean shouldOverrideUrl(String url);
}
}