package com.yuyh.sprintnba.widget;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.yuyh.library.utils.log.LogUtils;
import com.yuyh.sprintnba.R;
import com.yuyh.sprintnba.utils.ADFilterUtils;
public class BrowserLayout extends LinearLayout {
private Context mContext = null;
private WebView mWebView = null;
private View mBrowserControllerView = null;
private ImageButton mGoBackBtn = null;
private ImageButton mGoForwardBtn = null;
private ImageButton mGoBrowserBtn = null;
private ImageButton mRefreshBtn = null;
private int mBarHeight = 5;
private ProgressBar mProgressBar = null;
private boolean isOverrideUrlLoading = true;
private String mLoadUrl;
private OnReceiveTitleListener listener;
public BrowserLayout(Context context) {
super(context);
init(context);
}
public BrowserLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mContext = context;
setOrientation(VERTICAL);
mProgressBar = (ProgressBar) LayoutInflater.from(context).inflate(R.layout.progress_horizontal, null);
mProgressBar.setMax(100);
mProgressBar.setProgress(0);
addView(mProgressBar, LayoutParams.MATCH_PARENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, mBarHeight, getResources().getDisplayMetrics()));
mWebView = new WebView(context);
mWebView.setLayerType(LAYER_TYPE_HARDWARE, null);
mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mWebView.getSettings().setDefaultTextEncodingName("UTF-8");
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportMultipleWindows(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setSupportZoom(false);
mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setLoadsImagesAutomatically(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
//mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
mWebView.getSettings().setAppCacheEnabled(true);
//mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
LayoutParams lps = new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1);
addView(mWebView, lps);
mWebView.setWebChromeClient(new AppCacheWebChromeClient());
mWebView.setWebViewClient(new MonitorWebClient());
mBrowserControllerView = LayoutInflater.from(context).inflate(R.layout.browser_controller, null);
mGoBackBtn = (ImageButton) mBrowserControllerView.findViewById(R.id.browser_controller_back);
mGoForwardBtn = (ImageButton) mBrowserControllerView.findViewById(R.id.browser_controller_forward);
mGoBrowserBtn = (ImageButton) mBrowserControllerView.findViewById(R.id.browser_controller_go);
mRefreshBtn = (ImageButton) mBrowserControllerView.findViewById(R.id.browser_controller_refresh);
mGoBackBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (canGoBack()) {
goBack();
}
}
});
mGoForwardBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (canGoForward()) {
goForward();
}
}
});
mRefreshBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
refresh(mLoadUrl);
}
});
mGoBrowserBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!TextUtils.isEmpty(mLoadUrl)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(mLoadUrl));
mContext.startActivity(intent);
}
}
});
addView(mBrowserControllerView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
public void loadUrl(String url) {
mWebView.loadUrl(url);
}
public void refresh(String url) {
mWebView.reload();
}
public boolean canGoBack() {
return null != mWebView ? mWebView.canGoBack() : false;
}
public boolean canGoForward() {
return null != mWebView ? mWebView.canGoForward() : false;
}
public void setOverrideUrlLoading(boolean b) {
isOverrideUrlLoading = b;
}
public void goBack() {
if (null != mWebView) {
mWebView.goBack();
}
}
public void goForward() {
if (null != mWebView) {
mWebView.goForward();
}
}
public WebView getWebView() {
return mWebView != null ? mWebView : null;
}
public void hideBrowserController() {
mBrowserControllerView.setVisibility(View.GONE);
}
public void showBrowserController() {
mBrowserControllerView.setVisibility(View.VISIBLE);
}
private class MonitorWebClient extends WebViewClient {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString().toLowerCase();
LogUtils.d("req -- "+ url);
if (!ADFilterUtils.hasAd(getContext(), url)) {
return super.shouldInterceptRequest(view, request);
} else {
LogUtils.w("ad:"+url);
return new WebResourceResponse(null, null, null);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//错误提示
Toast toast = Toast.makeText(mContext, "Oh no! " + description+" "+failingUrl, Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
toast.show();
//错误处理
try {
mWebView.stopLoading();
} catch (Exception ignored) {
}
try {
mWebView.loadUrl("about:blank");
} catch (Exception ignored) {
}
if (mWebView.canGoBack()) {
mWebView.goBack();
}
// super.onReceivedError(view, errorCode, description, failingUrl);
}
//当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
//忽略证书的错误继续Load页面内容
handler.proceed();
//handler.cancel(); // Android默认的处理方式
//handleMessage(Message msg); // 进行其他处理
// super.onReceivedSslError(view, handler, error);
}
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mLoadUrl = url;
if (listener != null) {
listener.onPageFinished();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isOverrideUrlLoading)
return super.shouldOverrideUrlLoading(view, url);
return true;
}
}
private class AppCacheWebChromeClient extends WebChromeClient {
@Override
public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
// Log.e(APP_CACHE, "onReachedMaxAppCacheSize reached, increasing space: " + spaceNeeded);
quotaUpdater.updateQuota(spaceNeeded * 2);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (listener != null)
listener.onReceive(title);
}
}
public interface OnReceiveTitleListener {
void onReceive(String title);
void onPageFinished();
}
public void setOnReceiveTitleListener(OnReceiveTitleListener listener) {
this.listener = listener;
}
}