package tellh.com.gitclub.presentation.widget;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
/**
* Created by tlh on 2016/9/24 :)
*/
public class WebViewHelper {
private WebView webView;
private ProgressBar progressBar;
private WebViewCallback callback;
private Subscription subscribe;
private String url;
public abstract static class WebViewCallback {
void onPageStarted() {
}
void onPageFinished() {
}
public abstract void onError();
}
public String getUrl() {
return url;
}
public void setCallback(WebViewCallback callback) {
this.callback = callback;
}
public WebViewHelper(WebView webView, ProgressBar progressBar) {
this.webView = webView;
this.progressBar = progressBar;
init();
}
public void reLoad() {
if (TextUtils.isEmpty(url))
return;
loadUrl(url);
}
public void loadUrl(String url) {
this.url = url;
webView.loadUrl(url);
progressBar.setVisibility(VISIBLE);
if (subscribe != null)
subscribe.unsubscribe();
subscribe = Observable
.interval(1, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.d("Progress", "call() called with: progress = [" + progressBar.getProgress() + "]");
if (progressBar.getProgress() >= 90)
return;
progressBar.setProgress(progressBar.getProgress() + 5);
}
});
}
public void init() {
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.toString());
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
if (callback != null) {
callback.onError();
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (callback != null) {
callback.onError();
}
}
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
if (callback != null)
callback.onError();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
subscribe.unsubscribe();
progressBar.setProgress(100);
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(INVISIBLE);
progressBar.setProgress(0);
}
}, 200);
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (progressBar.getVisibility() == INVISIBLE)
progressBar.setVisibility(VISIBLE);
if (newProgress != 100) {
progressBar.setProgress(newProgress);
}
}
});
//setting
WebSettings settings = webView.getSettings();
settings.setUseWideViewPort(true);
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
}
public boolean goBackPage() {
if (webView.canGoBack()) {
webView.goBack();
return true;
}
return false;
}
public void detach() {
if (subscribe != null)
subscribe.unsubscribe();
callback = null;
}
}