package com.tejia.lijin.app.util.x5; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Message; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.webkit.ValueCallback; import com.tencent.smtt.export.external.extension.interfaces.IX5WebChromeClientExtension; import com.tencent.smtt.export.external.extension.interfaces.IX5WebViewExtension; import com.tencent.smtt.export.external.extension.proxy.ProxyWebViewClientExtension; import com.tencent.smtt.export.external.interfaces.IX5WebViewBase.HitTestResult; import com.tencent.smtt.export.external.interfaces.JsResult; import com.tencent.smtt.export.external.interfaces.MediaAccessPermissionsCallback; import com.tencent.smtt.sdk.WebViewCallbackClient; import java.util.HashMap; public class X5WebViewEventHandler extends ProxyWebViewClientExtension implements IX5WebChromeClientExtension { /** * 这个类用于实现由于X5webview适配架构导致的部分client回调不会发生,或者回调中传入的值不正确 * 这个方法中所有的interface均是直接从内核中获取值并传入内核,请谨慎修改 使用时只需要在对应的方法中加入你自己的逻辑就可以 * 同时注意:具有返回值的方法在正常情况下保持其返回效果 一般而言:返回true表示消费事件,由用户端直接处理事件 * 返回false表示需要内核使用默认机制处理事件 */ private X5WebView webView; // the vote of x5webview @Override public void onColorModeChanged(long l) { } @Override public boolean onPermissionRequest(String s, long l, MediaAccessPermissionsCallback mediaAccessPermissionsCallback) { return false; } @Override public void onPrintPage() { } @Override public void jsExitFullScreen() { } @Override public void openFileChooser(ValueCallback valueCallback, String s, String s1) { } @Override public boolean onSavePassword(ValueCallback valueCallback, String s, String s1, String s2, String s3, String s4, boolean b) { return false; } @Override public void jsRequestFullScreen() { } public X5WebViewEventHandler(X5WebView webView) { this.webView = webView; this.webView.setWebViewCallbackClient(callbackClient); } @Override public void acquireWakeLock() { } @Override public void addFlashView(View arg0, LayoutParams arg1) { } @Override public void exitFullScreenFlash() { } @Override public Context getApplicationContex() { return null; } @Override public View getVideoLoadingProgressView() { return null; } @Override public Object getX5WebChromeClientInstance() { return null; } @Override public void h5videoExitFullScreen(String arg0) { } @Override public void h5videoRequestFullScreen(String arg0) { } @Override public boolean onAddFavorite(IX5WebViewExtension arg0, String arg1, String arg2, JsResult arg3) { return false; } @Override public void onAllMetaDataFinished(IX5WebViewExtension arg0, HashMap arg1) { } @Override public void onBackforwardFinished(int arg0) { } @Override public void onHitTestResultFinished(IX5WebViewExtension arg0, HitTestResult arg1) { } @Override public void onHitTestResultForPluginFinished(IX5WebViewExtension arg0, HitTestResult arg1, Bundle arg2) { arg1.getData(); } @Override public boolean onPageNotResponding(Runnable arg0) { return false; } @Override public void onPrepareX5ReadPageDataFinished(IX5WebViewExtension arg0, HashMap arg1) { } @Override public void onPromptNotScalable(IX5WebViewExtension arg0) { } @Override public void onPromptScaleSaved(IX5WebViewExtension arg0) { } @Override public boolean onSavePassword(String arg0, String arg1, String arg2, boolean arg3, Message arg4) { return false; } @Override public void onX5ReadModeAvailableChecked(HashMap arg0) { } @Override public void releaseWakeLock() { } @Override public void requestFullScreenFlash() { } /** * 这里使用内核的事件回调链接到对应webview的事件回调 */ private WebViewCallbackClient callbackClient = new WebViewCallbackClient() { @Override public boolean onTouchEvent(MotionEvent event, View view) { return webView.tbs_onTouchEvent(event, view); } @Override public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent, View view) { return webView.tbs_overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent, view); } @Override public void computeScroll(View view) { webView.tbs_computeScroll(view); } @Override public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY, View view) { webView.tbs_onOverScrolled(scrollX, scrollY, clampedX, clampedY, view); } @Override public void onScrollChanged(int l, int t, int oldl, int oldt, View view) { webView.tbs_onScrollChanged(l, t, oldl, oldt, view); } @Override public void invalidate() { } @Override public boolean dispatchTouchEvent(MotionEvent ev, View view) { return webView.tbs_dispatchTouchEvent(ev, view); } @Override public boolean onInterceptTouchEvent(MotionEvent ev, View view) { return webView.tbs_onInterceptTouchEvent(ev, view); } }; // //////////////////////////////////////////////////////////////////// /** * 这里是内核代理的事件处理方法 */ @Override public Object onMiscCallBack(String method, Bundle bundle) { return null; } @Override public boolean onTouchEvent(MotionEvent event, View view) { return callbackClient.onTouchEvent(event, view); } // 1 public boolean onInterceptTouchEvent(MotionEvent ev, View view) { return callbackClient.onInterceptTouchEvent(ev, view); } // 3 public boolean dispatchTouchEvent(MotionEvent ev, View view) { return callbackClient.dispatchTouchEvent(ev, view); } // 4 public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent, View view) { return callbackClient.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent, view); } // 5 public void onScrollChanged(int l, int t, int oldl, int oldt, View view) { callbackClient.onScrollChanged(l, t, oldl, oldt, view); } // 6 public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY, View view) { callbackClient.onOverScrolled(scrollX, scrollY, clampedX, clampedY, view); } // 7 public void computeScroll(View view) { callbackClient.computeScroll(view); } }