派享便利 v1.0.3版本的 MD5 值为:1fc1776275e6607636a3a1f946b1f976
以下内容为反编译后的 DCWXWebView.java 源代码,内容仅作参考
package io.dcloud.feature.weex.adapter.webview;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.GeolocationPermissions;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
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.FrameLayout;
import androidx.core.content.FileProvider;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.autonavi.amap.mapcore.AMapEngineUtils;
import com.dcloud.android.widget.DCWebViewProgressBar;
import com.dcloud.zxing2.common.StringUtils;
import com.facebook.common.util.UriUtil;
import com.taobao.weex.el.parse.Operators;
import com.taobao.weex.ui.view.IWebView;
import com.taobao.weex.utils.WXLogUtils;
import io.dcloud.common.DHInterface.IActivityDelegate;
import io.dcloud.common.DHInterface.IActivityHandler;
import io.dcloud.common.adapter.ui.AdaWebview;
import io.dcloud.common.adapter.ui.FileChooseDialog;
import io.dcloud.common.adapter.ui.webview.WebViewFactory;
import io.dcloud.common.adapter.util.DeviceInfo;
import io.dcloud.common.adapter.util.PermissionUtil;
import io.dcloud.common.util.PdrUtil;
import io.dcloud.feature.weex.adapter.webview.WXDCWeb;
import io.dcloud.feature.weex.adapter.webview.video.FullscreenHolder;
import io.src.dcloud.adapter.DCloudAdapterUtil;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.HashMap;
public class DCWXWebView implements IDCWebView {
private static final String BRIDGE_NAME = "__dcloud_weex_";
private static final int POST_MESSAGE = 1;
private static final int POST_MESSAGE_TO_CONTROL = 2;
private static final int SDK_VERSION = Build.VERSION.SDK_INT;
DCWXChromeClient chromeClient;
private View customView;
private WebChromeClient.CustomViewCallback customViewCallback;
private FrameLayout fullscreenContainer;
private Context mContext;
private WeakReference<WXDCWeb> mDCWeb;
private Handler mMessageHandler;
private IWebView.OnErrorListener mOnErrorListener;
private WXDCWeb.OnDCMessageListener mOnMessageListener;
private IWebView.OnPageListener mOnPageListener;
private String mOrigin;
private FrameLayout mRootView;
private DCWebViewProgressBar mWebProgressView;
private WebView mWebView;
private boolean mShowLoading = true;
public int mProgress = 0;
private boolean isStart = false;
private int defaultSystemUI = 0;
@Override
public void setOnMessageListener(IWebView.OnMessageListener onMessageListener) {
}
public DCWXWebView(Context context, String str, WXDCWeb wXDCWeb) {
this.mContext = context;
this.mOrigin = str;
this.mDCWeb = new WeakReference<>(wXDCWeb);
}
@Override
public View getView() {
FrameLayout frameLayout = new FrameLayout(this.mContext);
this.mRootView = frameLayout;
frameLayout.setBackgroundColor(-1);
this.mWebView = new WebView(this.mContext);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(-1, -1);
layoutParams.gravity = 17;
this.mWebView.setLayoutParams(layoutParams);
this.mRootView.addView(this.mWebView);
this.mWebView.setBackgroundColor(0);
initWebView(this.mWebView);
this.mMessageHandler = new MessageHandler();
return this.mRootView;
}
@Override
public void destroy() {
if (getWebView() != null) {
hideCustomView();
getWebView().setWebViewClient(null);
getWebView().setWebChromeClient(null);
getWebView().removeAllViews();
getWebView().destroy();
this.mWebView = null;
this.mDCWeb.clear();
this.mOnMessageListener = null;
this.mWebProgressView = null;
this.mOnPageListener = null;
this.mOnErrorListener = null;
}
}
@Override
public void loadUrl(String str) {
if (getWebView() == null) {
return;
}
getWebView().loadUrl(str);
}
@Override
public void loadDataWithBaseURL(String str) {
if (getWebView() == null) {
return;
}
getWebView().loadDataWithBaseURL(this.mOrigin, str, "text/html", "utf-8", null);
}
@Override
public void reload() {
if (getWebView() == null) {
return;
}
getWebView().reload();
}
@Override
public void goBack() {
if (getWebView() == null) {
return;
}
getWebView().goBack();
}
@Override
public void goForward() {
if (getWebView() == null) {
return;
}
getWebView().goForward();
}
@Override
public void postMessage(Object obj) {
if (getWebView() == null) {
return;
}
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("type", (Object) "message");
jSONObject.put("data", obj);
evaluateJS("javascript:(function () {var initData = " + jSONObject.toString() + ";try {var event = new MessageEvent('onPostMessage', initData);window.dispatchEvent(event);} catch (e) {}})();");
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
@Override
public void setShowLoading(boolean z) {
this.mShowLoading = z;
}
@Override
public void setOnErrorListener(IWebView.OnErrorListener onErrorListener) {
this.mOnErrorListener = onErrorListener;
}
@Override
public void setOnPageListener(IWebView.OnPageListener onPageListener) {
this.mOnPageListener = onPageListener;
}
@Override
public void onActivityResult(int i, int i2, Intent intent) {
DCWXChromeClient dCWXChromeClient = this.chromeClient;
if (dCWXChromeClient != null) {
dCWXChromeClient.onResult(i, i2, intent);
}
}
public void setOnDCMessageListener(WXDCWeb.OnDCMessageListener onDCMessageListener) {
this.mOnMessageListener = onDCMessageListener;
}
private void showWebView(boolean z) {
this.mWebView.setVisibility(z ? 0 : 4);
}
@Override
public WebView getWebView() {
return this.mWebView;
}
private void initWebView(WebView webView) {
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAppCacheEnabled(true);
settings.setUseWideViewPort(true);
settings.setDomStorageEnabled(true);
settings.setSupportZoom(false);
settings.setAllowFileAccess(false);
settings.setBuiltInZoomControls(false);
settings.setAllowContentAccess(true);
settings.setSavePassword(false);
if (Build.VERSION.SDK_INT >= 21) {
settings.setMixedContentMode(0);
}
if (!TextUtils.isEmpty(AdaWebview.sCustomUserAgent)) {
settings.setUserAgentString(AdaWebview.sCustomUserAgent);
}
webView.removeJavascriptInterface("searchBoxJavaBridge_");
webView.removeJavascriptInterface("accessibilityTraversal");
webView.removeJavascriptInterface("accessibility");
WebViewFactory.setFileAccess(settings, true);
settings.setDefaultTextEncodingName(StringUtils.GB2312);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView webView2, String str) {
if (PdrUtil.isDeviceRootDir(str) || PdrUtil.isNetPath(str) || str.startsWith(DeviceInfo.FILE_PROTOCOL)) {
return false;
}
try {
if (str.startsWith("intent://")) {
Intent parseUri = Intent.parseUri(str, 1);
parseUri.addCategory("android.intent.category.BROWSABLE");
parseUri.setComponent(null);
if (Build.VERSION.SDK_INT >= 15) {
parseUri.setSelector(null);
}
if (DCWXWebView.this.mContext.getPackageManager().queryIntentActivities(parseUri, 0).size() > 0) {
((Activity) DCWXWebView.this.mContext).startActivityIfNeeded(parseUri, -1);
}
} else {
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(str));
intent.setFlags(AMapEngineUtils.MAX_P20_WIDTH);
DCWXWebView.this.mContext.startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
public void onPageStarted(WebView webView2, String str, Bitmap bitmap) {
super.onPageStarted(webView2, str, bitmap);
WXLogUtils.v("tag", "onPageStarted " + str);
if (DCWXWebView.this.mOnPageListener != null) {
DCWXWebView.this.mOnPageListener.onPageStart(str);
}
}
@Override
public void onPageFinished(WebView webView2, String str) {
super.onPageFinished(webView2, str);
WXLogUtils.v("tag", "onPageFinished " + str);
if (DCWXWebView.this.isStart) {
DCWXWebView.this.isStart = false;
if (DCWXWebView.this.mWebProgressView != null) {
DCWXWebView.this.mWebProgressView.finishProgress();
}
}
if (DCWXWebView.this.mOnPageListener != null) {
DCWXWebView.this.mOnPageListener.onPageFinish(str, webView2.canGoBack(), webView2.canGoForward());
}
}
@Override
public void onReceivedError(WebView webView2, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
super.onReceivedError(webView2, webResourceRequest, webResourceError);
if (DCWXWebView.this.mOnErrorListener != null) {
DCWXWebView.this.mOnErrorListener.onError("error", "page error");
}
}
@Override
public void onReceivedHttpError(WebView webView2, WebResourceRequest webResourceRequest, WebResourceResponse webResourceResponse) {
super.onReceivedHttpError(webView2, webResourceRequest, webResourceResponse);
if (DCWXWebView.this.mOnErrorListener != null) {
DCWXWebView.this.mOnErrorListener.onError("error", "http error");
}
}
@Override
public void onReceivedSslError(WebView webView2, SslErrorHandler sslErrorHandler, SslError sslError) {
super.onReceivedSslError(webView2, sslErrorHandler, sslError);
if (DCWXWebView.this.mOnErrorListener != null) {
DCWXWebView.this.mOnErrorListener.onError("error", "ssl error");
}
}
});
DCWXChromeClient dCWXChromeClient = new DCWXChromeClient();
this.chromeClient = dCWXChromeClient;
webView.setWebChromeClient(dCWXChromeClient);
if (Build.VERSION.SDK_INT > 18) {
webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void postMessage(String str) {
DCWXWebView.this.onMessage(str, 1);
}
@JavascriptInterface
public void postMessageToService(String str) {
DCWXWebView.this.onMessage(str, 2);
}
}, BRIDGE_NAME);
}
}
public void startWebProgress() {
if (this.mDCWeb.get() == null || this.mDCWeb.get().getHostView() == null) {
return;
}
if (this.mDCWeb.get() == null || this.mDCWeb.get().getWebStyles() == null || this.mDCWeb.get().getWebStyles().getBooleanValue("isProgress")) {
String url = getWebView().getUrl();
if (TextUtils.isEmpty(url) || url.startsWith("file")) {
return;
}
if (this.mWebProgressView == null) {
this.mWebProgressView = new DCWebViewProgressBar(this.mWebView.getContext());
}
int parseColor = Color.parseColor(this.mDCWeb.get().getWebStyles().containsKey("progressColor") ? this.mDCWeb.get().getWebStyles().getString("progressColor") : "#00FF00");
int convertToScreenInt = PdrUtil.convertToScreenInt("2px", this.mWebView.getMeasuredWidth(), 0, this.mWebView.getScale());
this.mWebProgressView.setColorInt(parseColor);
this.mWebProgressView.setVisibility(0);
this.mWebProgressView.setAlphaInt(255);
if (this.mWebProgressView.getParent() == null) {
this.mRootView.addView(this.mWebProgressView, new ViewGroup.LayoutParams(-1, convertToScreenInt));
}
this.mWebProgressView.startProgress();
}
}
public void onMessage(String str, int i) {
if (str == 0 || this.mOnMessageListener == null) {
return;
}
try {
str = JSON.parse(str);
} catch (Exception unused) {
}
Message message = new Message();
message.what = i;
message.obj = str;
this.mMessageHandler.sendMessage(message);
}
private void evaluateJS(String str) {
if (SDK_VERSION < 19) {
this.mWebView.loadUrl(str);
} else {
this.mWebView.evaluateJavascript(str, null);
}
}
private static class MessageHandler extends Handler {
private final WeakReference<DCWXWebView> mWv;
private MessageHandler(DCWXWebView dCWXWebView) {
this.mWv = new WeakReference<>(dCWXWebView);
}
@Override
public void handleMessage(Message message) {
super.handleMessage(message);
int i = message.what;
if (i == 1) {
if (this.mWv.get() == null || this.mWv.get().mOnMessageListener == null) {
return;
}
HashMap hashMap = new HashMap();
hashMap.put("detail", message.obj);
this.mWv.get().mOnMessageListener.onMessage(hashMap, 1);
} else if (i != 2 || this.mWv.get() == null || this.mWv.get().mOnMessageListener == null) {
} else {
HashMap hashMap2 = new HashMap();
hashMap2.put("data", message.obj);
this.mWv.get().mOnMessageListener.onMessage(hashMap2, 2);
}
}
}
public class DCWXChromeClient extends WebChromeClient {
FileChooseDialog dialog;
ValueCallback<Uri> mUploadMessage;
ValueCallback<Uri[]> mUploadMessage21Level;
private DCWXChromeClient() {
}
@Override
public void onProgressChanged(WebView webView, int i) {
super.onProgressChanged(webView, i);
DCWXWebView.this.mProgress = i;
if (!DCWXWebView.this.isStart && DCWXWebView.this.mProgress < 100) {
DCWXWebView.this.startWebProgress();
DCWXWebView.this.isStart = true;
}
if (DCWXWebView.this.mProgress >= 100 && DCWXWebView.this.isStart) {
DCWXWebView.this.isStart = false;
if (DCWXWebView.this.mWebProgressView != null) {
DCWXWebView.this.mWebProgressView.finishProgress();
}
}
WXLogUtils.v("tag", "onPageProgressChanged " + i);
}
@Override
public void onReceivedTitle(WebView webView, String str) {
super.onReceivedTitle(webView, str);
if (DCWXWebView.this.mOnPageListener != null) {
DCWXWebView.this.mOnPageListener.onReceivedTitle(webView.getTitle());
}
}
@Override
public boolean onJsPrompt(WebView webView, String str, String str2, String str3, JsPromptResult jsPromptResult) {
return super.onJsPrompt(webView, str, str2, str3, jsPromptResult);
}
@Override
public void onGeolocationPermissionsShowPrompt(final String str, final GeolocationPermissions.Callback callback) {
if (DCWXWebView.this.mContext instanceof Activity) {
PermissionUtil.usePermission((Activity) DCWXWebView.this.mContext, "dc_weexsdk", PermissionUtil.PMS_LOCATION, 2, new PermissionUtil.Request() {
@Override
public void onGranted(String str2) {
callback.invoke(str, true, false);
}
@Override
public void onDenied(String str2) {
callback.invoke(str, false, false);
}
});
} else {
super.onGeolocationPermissionsShowPrompt(str, callback);
}
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback, WebChromeClient.FileChooserParams fileChooserParams) {
openFileChooserLogic(webView, null, valueCallback, fileChooserParams.getAcceptTypes() != null ? fileChooserParams.getAcceptTypes()[0] : null, "");
return true;
}
private void openFileChooserLogic(final WebView webView, final ValueCallback<Uri> valueCallback, final ValueCallback<Uri[]> valueCallback2, final String str, final String str2) {
if (DCWXWebView.this.mContext == null) {
return;
}
PermissionUtil.usePermission((Activity) DCWXWebView.this.mContext, "dc_weexsdk", PermissionUtil.PMS_STORAGE, 2, new PermissionUtil.Request() {
@Override
public void onDenied(String str3) {
}
@Override
public void onGranted(String str3) {
DCWXChromeClient.this.showOpenFileChooser(webView, valueCallback, valueCallback2, str, str2);
}
});
}
public void showOpenFileChooser(WebView webView, ValueCallback<Uri> valueCallback, ValueCallback<Uri[]> valueCallback2, String str, String str2) {
this.mUploadMessage = valueCallback;
this.mUploadMessage21Level = valueCallback2;
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.addCategory("android.intent.category.OPENABLE");
if (!PdrUtil.isEmpty(str)) {
intent.setType(str);
} else {
intent.setType("*/*");
}
FileChooseDialog fileChooseDialog = new FileChooseDialog(webView.getContext(), (Activity) webView.getContext(), intent);
this.dialog = fileChooseDialog;
try {
fileChooseDialog.show();
this.dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
try {
if (DCWXChromeClient.this.mUploadMessage21Level != null) {
DCWXChromeClient.this.mUploadMessage21Level.onReceiveValue(null);
} else if (DCWXChromeClient.this.mUploadMessage != null) {
DCWXChromeClient.this.mUploadMessage.onReceiveValue(null);
}
} catch (Exception unused) {
}
}
});
} catch (Exception unused) {
}
}
public void onResult(int i, int i2, Intent intent) {
Uri uri;
FileChooseDialog fileChooseDialog;
Cursor query;
FileChooseDialog fileChooseDialog2 = this.dialog;
if (fileChooseDialog2 != null) {
fileChooseDialog2.dismiss();
if (i2 != 0) {
if (i != 1) {
if (i == 2 && (fileChooseDialog = this.dialog) != null && fileChooseDialog.uris != null) {
for (File file : this.dialog.uris) {
if (file.exists()) {
uri = FileProvider.getUriForFile(DCWXWebView.this.mContext, DCWXWebView.this.mContext.getPackageName() + ".dc.fileprovider", file);
break;
}
}
}
uri = null;
} else if (intent == null) {
ValueCallback<Uri[]> valueCallback = this.mUploadMessage21Level;
if (valueCallback != null) {
valueCallback.onReceiveValue(null);
} else {
ValueCallback<Uri> valueCallback2 = this.mUploadMessage;
if (valueCallback2 != null) {
valueCallback2.onReceiveValue(null);
}
}
this.dialog = null;
return;
} else {
uri = intent.getData();
if (uri != null && UriUtil.LOCAL_CONTENT_SCHEME.equals(uri.getScheme()) && (query = DCWXWebView.this.mContext.getContentResolver().query(uri, new String[]{"_data"}, null, null, null)) != null) {
if (query.moveToFirst()) {
try {
int columnIndexOrThrow = query.getColumnIndexOrThrow("_data");
if (columnIndexOrThrow > -1) {
String string = query.getString(columnIndexOrThrow);
uri = Uri.parse(string);
if (PdrUtil.isEmpty(uri.getScheme())) {
uri = Uri.parse((string.startsWith(Operators.DIV) ? DeviceInfo.FILE_PROTOCOL : "file:///") + string);
}
}
} catch (Exception unused) {
}
}
query.close();
}
}
Uri[] uriArr = uri != null ? new Uri[]{uri} : null;
ValueCallback<Uri[]> valueCallback3 = this.mUploadMessage21Level;
if (valueCallback3 != null) {
valueCallback3.onReceiveValue(uriArr);
} else {
ValueCallback<Uri> valueCallback4 = this.mUploadMessage;
if (valueCallback4 != null) {
valueCallback4.onReceiveValue(uri);
}
}
} else {
ValueCallback<Uri[]> valueCallback5 = this.mUploadMessage21Level;
if (valueCallback5 != null) {
valueCallback5.onReceiveValue(null);
} else {
ValueCallback<Uri> valueCallback6 = this.mUploadMessage;
if (valueCallback6 != null) {
valueCallback6.onReceiveValue(null);
}
}
}
this.dialog = null;
}
}
@Override
public void onShowCustomView(View view, WebChromeClient.CustomViewCallback customViewCallback) {
DCWXWebView.this.showCustomView(view, customViewCallback);
}
@Override
public void onHideCustomView() {
DCWXWebView.this.hideCustomView();
}
}
public void showCustomView(View view, WebChromeClient.CustomViewCallback customViewCallback) {
if (this.customView != null) {
customViewCallback.onCustomViewHidden();
return;
}
Context context = this.mContext;
if (context == null || !(context instanceof Activity)) {
return;
}
Activity activity = (Activity) context;
FrameLayout frameLayout = null;
IActivityHandler iActivityHandler = DCloudAdapterUtil.getIActivityHandler(activity);
if (iActivityHandler != null) {
frameLayout = iActivityHandler.obtainActivityContentView();
iActivityHandler.closeSideBar();
iActivityHandler.setSideBarVisibility(8);
} else if (activity instanceof IActivityDelegate) {
frameLayout = ((IActivityDelegate) activity).obtainActivityContentView();
}
this.mWebView.setVisibility(8);
this.fullscreenContainer = new FullscreenHolder(this.mContext);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(-1, -1);
this.fullscreenContainer.addView(view, layoutParams);
frameLayout.addView(this.fullscreenContainer, layoutParams);
this.customView = view;
setStatusBarVisibility(activity, false);
this.customViewCallback = customViewCallback;
}
public void hideCustomView() {
Context context;
if (this.customView == null || (context = this.mContext) == null || !(context instanceof Activity)) {
return;
}
setStatusBarVisibility((Activity) context, true);
if (this.fullscreenContainer.getParent() != null) {
((ViewGroup) this.fullscreenContainer.getParent()).removeView(this.fullscreenContainer);
this.fullscreenContainer.removeAllViews();
}
this.fullscreenContainer = null;
this.customView = null;
WebChromeClient.CustomViewCallback customViewCallback = this.customViewCallback;
if (customViewCallback != null) {
customViewCallback.onCustomViewHidden();
this.customViewCallback = null;
}
this.mWebView.setVisibility(0);
}
private void setStatusBarVisibility(Activity activity, boolean z) {
if (z) {
activity.getWindow().getDecorView().setSystemUiVisibility(this.defaultSystemUI);
return;
}
this.defaultSystemUI = activity.getWindow().getDecorView().getSystemUiVisibility();
activity.getWindow().getDecorView().setSystemUiVisibility(5894);
}
}