package com.gzsll.hupu.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.util.AttributeSet;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.gzsll.hupu.BuildConfig;
import com.gzsll.hupu.components.jockeyjs.Jockey;
import com.gzsll.hupu.components.jockeyjs.JockeyAsyncHandler;
import com.gzsll.hupu.components.jockeyjs.JockeyCallback;
import com.gzsll.hupu.components.jockeyjs.JockeyHandler;
import com.gzsll.hupu.components.jockeyjs.JockeyImpl;
import com.gzsll.hupu.util.NetWorkUtil;
import java.net.URI;
import java.util.Map;
/**
* Created by sll on 2015/6/17.
*/
public class JockeyJsWebView extends WebView {
private Jockey jockey;
private JockeyAsyncHandler jockeyAsyncHandler;
private H5Callback callback;
public JockeyJsWebView(Context context) {
this(context, null);
}
public JockeyJsWebView(Context context, AttributeSet attrs) {
super(context, attrs);
initWebView();
}
private void initWebView() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setWebContentsDebuggingEnabled(BuildConfig.DEBUG);
}
WebSettings settings = getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
settings.setUseWideViewPort(true);
settings.setSupportZoom(false);
settings.setBuiltInZoomControls(false);
settings.setSupportMultipleWindows(true);
settings.setDefaultTextEncodingName("UTF-8");
if (Build.VERSION.SDK_INT > 12) {
settings.setJavaScriptCanOpenWindowsAutomatically(true);
}
settings.setAppCacheEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setDomStorageEnabled(true);
settings.setCacheMode(NetWorkUtil.isNetworkConnected(getContext()) ? WebSettings.LOAD_DEFAULT
: WebSettings.LOAD_CACHE_ELSE_NETWORK);
settings.setCacheMode(2);
if (Build.VERSION.SDK_INT > 11) {
setLayerType(0, null);
}
}
public void initJockey() {
jockeyAsyncHandler = new JockeyAsyncHandler() {
@Override
protected void doPerform(Map<Object, Object> payload) {
if (callback != null) {
callback.doPerform(payload);
}
}
};
if (jockey == null) {
jockey = JockeyImpl.getDefault();
}
jockey.configure(this);
jockey.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
if (!isJockeyScheme(new URI(url))) {
if (callback != null) {
callback.openBrowser(url);
}
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (callback != null) {
callback.onPageStarted(view, url, favicon);
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (callback != null) {
callback.onPageFinished(view, url);
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
super.onReceivedError(view, request, error);
if (callback != null) {
callback.onReceivedError(view, request, error);
}
}
});
setJockeyEvents();
}
public boolean isJockeyScheme(URI uri) {
return uri.getScheme().equals("jockey") && !uri.getQuery().equals("");
}
protected void setJockeyEvents() {
if (callback != null) {
callback.setJockeyEvents();
}
}
public void onJSEvent(String str, JockeyAsyncHandler jockeyAsyncHandler) {
if (jockey != null) {
jockey.on(str, jockeyAsyncHandler);
}
}
public void onJSEvent(String str, JockeyHandler handler) {
if (jockey != null) {
jockey.on(str, handler);
}
}
public void sendMessageToJS(String str, Object object) {
if (jockey != null) {
jockey.send(str, this, object);
}
}
public void sendMessageToJS(String str, Object object, JockeyCallback jockeyCallback) {
if (jockey != null && jockeyCallback != null) {
jockey.send(str, this, object, jockeyCallback);
}
}
public void setCallback(H5Callback callback) {
this.callback = callback;
}
@Override
public void destroy() {
jockey.configure(null);
setWebChromeClient(null);
setWebViewClient(null);
super.destroy();
}
private OnScrollChangedCallback mOnScrollChangedCallback;
@Override
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangedCallback != null) {
mOnScrollChangedCallback.onScroll(l - oldl, t - oldt);
}
}
public OnScrollChangedCallback getOnScrollChangedCallback() {
return mOnScrollChangedCallback;
}
public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) {
mOnScrollChangedCallback = onScrollChangedCallback;
}
public interface OnScrollChangedCallback {
void onScroll(int dx, int dy);
}
}