正在查看: RummyCircle v11000.89 应用的 RNCWebViewModule.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: RummyCircle v11000.89 应用的 RNCWebViewModule.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.reactnativecommunity.webview;
import android.app.Activity;
import android.app.DownloadManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Parcelable;
import android.util.Log;
import android.webkit.MimeTypeMap;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.widget.Toast;
import androidx.camera.camera2.internal.compat.B;
import androidx.core.content.FileProvider;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.f;
import com.facebook.react.modules.core.g;
import com.truecaller.android.sdk.TruecallerSdkScope;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicReference;
@com.facebook.react.module.annotations.a(name = RNCWebViewModule.MODULE_NAME)
public class RNCWebViewModule extends ReactContextBaseJavaModule implements ActivityEventListener {
private static final int FILE_DOWNLOAD_PERMISSION_REQUEST = 1;
public static final String MODULE_NAME = "RNCWebView";
private static final int PICKER = 1;
private static final int PICKER_LEGACY = 3;
protected static final c shouldOverrideUrlLoadingLock = new c();
private DownloadManager.Request downloadRequest;
private ValueCallback<Uri[]> filePathCallback;
private ValueCallback<Uri> filePathCallbackLegacy;
private File outputImage;
private File outputVideo;
public class a implements g {
public final String a;
public final String b;
public a(String str, String str2) {
this.a = str;
this.b = str2;
}
public final boolean onRequestPermissionsResult(int i, String[] strArr, int[] iArr) {
if (i != 1) {
return false;
}
int length = iArr.length;
RNCWebViewModule rNCWebViewModule = RNCWebViewModule.this;
if (length <= 0 || iArr[0] != 0) {
Toast.makeText(rNCWebViewModule.getCurrentActivity().getApplicationContext(), this.b, 1).show();
} else if (rNCWebViewModule.downloadRequest != null) {
rNCWebViewModule.downloadFile(this.a);
}
return true;
}
}
public static final class b {
public static final b a;
public static final b b;
public static final b[] c;
b EF0;
static {
b bVar = new b("DEFAULT", 0);
b bVar2 = new b("IMAGE", 1);
a = bVar2;
b bVar3 = new b("VIDEO", 2);
b = bVar3;
c = new b[]{bVar, bVar2, bVar3};
}
public static b valueOf(String str) {
return (b) Enum.valueOf(b.class, str);
}
public static b[] values() {
return (b[]) c.clone();
}
}
public static class c {
public int a = 1;
public final HashMap<Integer, AtomicReference<a>> b = new HashMap<>();
public static final class a {
public static final a a;
public static final a b;
public static final a c;
public static final a[] d;
static {
a aVar = new a("UNDECIDED", 0);
a = aVar;
a aVar2 = new a("SHOULD_OVERRIDE", 1);
b = aVar2;
a aVar3 = new a("DO_NOT_OVERRIDE", 2);
c = aVar3;
d = new a[]{aVar, aVar2, aVar3};
}
public a() {
throw null;
}
public static a valueOf(String str) {
return (a) Enum.valueOf(a.class, str);
}
public static a[] values() {
return (a[]) d.clone();
}
}
}
public RNCWebViewModule(ReactApplicationContext reactApplicationContext) {
super(reactApplicationContext);
reactApplicationContext.addActivityEventListener(this);
}
private Boolean acceptsImages(String str) {
if (str.matches("\\.\\w+")) {
str = getMimeTypeFromExtension(str.replace(".", ""));
}
return Boolean.valueOf(str.isEmpty() || str.toLowerCase().contains("image"));
}
private Boolean acceptsVideo(String str) {
if (str.matches("\\.\\w+")) {
str = getMimeTypeFromExtension(str.replace(".", ""));
}
return Boolean.valueOf(str.isEmpty() || str.toLowerCase().contains("video"));
}
private Boolean arrayContainsString(String[] strArr, String str) {
for (String str2 : strArr) {
if (str2.contains(str)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
private String[] getAcceptedMimeType(String[] strArr) {
if (noAcceptTypesSet(strArr).booleanValue()) {
return new String[]{"*/*"};
}
String[] strArr2 = new String[strArr.length];
for (int i = 0; i < strArr.length; i++) {
String str = strArr[i];
if (str.matches("\\.\\w+")) {
String mimeTypeFromExtension = getMimeTypeFromExtension(str.replace(".", ""));
if (mimeTypeFromExtension != null) {
strArr2[i] = mimeTypeFromExtension;
} else {
strArr2[i] = str;
}
} else {
strArr2[i] = str;
}
}
return strArr2;
}
private File getCapturedFile(b bVar) throws IOException {
String str;
String str2;
int ordinal = bVar.ordinal();
if (ordinal == 1) {
String str3 = Environment.DIRECTORY_PICTURES;
str = "image-";
str2 = ".jpg";
} else if (ordinal != 2) {
str = "";
str2 = "";
} else {
String str4 = Environment.DIRECTORY_MOVIES;
str = "video-";
str2 = ".mp4";
}
StringBuilder j = B.j(str);
j.append(String.valueOf(System.currentTimeMillis()));
j.append(str2);
return File.createTempFile(str, str2, getReactApplicationContext().getExternalFilesDir(null));
}
private Intent getFileChooserIntent(String str) {
String str2 = str.isEmpty() ? "*/*" : str;
if (str.matches("\\.\\w+")) {
str2 = getMimeTypeFromExtension(str.replace(".", ""));
}
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setType(str2);
return intent;
}
private String getMimeTypeFromExtension(String str) {
if (str != null) {
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(str);
}
return null;
}
private Uri getOutputUri(File file) {
String packageName = getReactApplicationContext().getPackageName();
return FileProvider.d(getReactApplicationContext(), file, packageName + ".fileprovider");
}
private f getPermissionAwareActivity() {
f currentActivity = getCurrentActivity();
if (currentActivity == null) {
throw new IllegalStateException("Tried to use permissions API while not attached to an Activity.");
}
if (currentActivity instanceof f) {
return currentActivity;
}
throw new IllegalStateException("Tried to use permissions API but the host Activity doesn't implement PermissionAwareActivity.");
}
private Intent getPhotoIntent() {
Intent intent;
Throwable e;
Uri outputUri;
try {
File capturedFile = getCapturedFile(b.a);
this.outputImage = capturedFile;
outputUri = getOutputUri(capturedFile);
intent = new Intent("android.media.action.IMAGE_CAPTURE");
} catch (IOException | IllegalArgumentException e2) {
intent = null;
e = e2;
}
try {
intent.putExtra("output", outputUri);
} catch (IOException e3) {
e = e3;
Log.e("CREATE FILE", "Error occurred while creating the File", e);
e.printStackTrace();
return intent;
} catch (IllegalArgumentException e4) {
e = e4;
Log.e("CREATE FILE", "Error occurred while creating the File", e);
e.printStackTrace();
return intent;
}
return intent;
}
private Uri[] getSelectedFiles(Intent intent, int i) {
if (intent == null) {
return null;
}
if (intent.getClipData() == null) {
if (intent.getData() == null || i != -1) {
return null;
}
return WebChromeClient.FileChooserParams.parseResult(i, intent);
}
int itemCount = intent.getClipData().getItemCount();
Uri[] uriArr = new Uri[itemCount];
for (int i2 = 0; i2 < itemCount; i2++) {
uriArr[i2] = intent.getClipData().getItemAt(i2).getUri();
}
return uriArr;
}
private Intent getVideoIntent() {
Intent intent;
Throwable e;
Uri outputUri;
try {
File capturedFile = getCapturedFile(b.b);
this.outputVideo = capturedFile;
outputUri = getOutputUri(capturedFile);
intent = new Intent("android.media.action.VIDEO_CAPTURE");
} catch (IOException | IllegalArgumentException e2) {
intent = null;
e = e2;
}
try {
intent.putExtra("output", outputUri);
} catch (IOException e3) {
e = e3;
Log.e("CREATE FILE", "Error occurred while creating the File", e);
e.printStackTrace();
return intent;
} catch (IllegalArgumentException e4) {
e = e4;
Log.e("CREATE FILE", "Error occurred while creating the File", e);
e.printStackTrace();
return intent;
}
return intent;
}
private g getWebviewFileDownloaderPermissionListener(String str, String str2) {
return new a(str, str2);
}
private Boolean noAcceptTypesSet(String[] strArr) {
String str;
boolean z = true;
if (strArr.length != 0 && (strArr.length != 1 || (str = strArr[0]) == null || str.length() != 0)) {
z = false;
}
return Boolean.valueOf(z);
}
public void downloadFile(String str) {
((DownloadManager) getCurrentActivity().getBaseContext().getSystemService("download")).enqueue(this.downloadRequest);
Toast.makeText(getCurrentActivity().getApplicationContext(), str, 1).show();
}
public String getName() {
return MODULE_NAME;
}
public boolean grantFileDownloaderPermissions(String str, String str2) {
if (Build.VERSION.SDK_INT > 28) {
return true;
}
boolean z = androidx.core.content.b.a(getCurrentActivity(), "android.permission.WRITE_EXTERNAL_STORAGE") == 0;
if (!z) {
getPermissionAwareActivity().m(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 1, getWebviewFileDownloaderPermissionListener(str, str2));
}
return z;
}
@ReactMethod
public void isFileUploadSupported(Promise promise) {
promise.resolve(Boolean.TRUE);
}
public boolean needsCameraPermission() {
try {
if (Arrays.asList(getCurrentActivity().getPackageManager().getPackageInfo(getReactApplicationContext().getPackageName(), TruecallerSdkScope.FOOTER_TYPE_LATER).requestedPermissions).contains("android.permission.CAMERA")) {
if (androidx.core.content.b.a(getCurrentActivity(), "android.permission.CAMERA") != 0) {
return true;
}
}
return false;
} catch (PackageManager.NameNotFoundException unused) {
return true;
}
}
public void onActivityResult(Activity activity, int i, int i2, Intent intent) {
if (this.filePathCallback == null && this.filePathCallbackLegacy == null) {
return;
}
File file = this.outputImage;
boolean z = false;
boolean z2 = file != null && file.length() > 0;
File file2 = this.outputVideo;
if (file2 != null && file2.length() > 0) {
z = true;
}
if (i != 1) {
if (i == 3) {
if (i2 != -1) {
this.filePathCallbackLegacy.onReceiveValue(null);
} else if (z2) {
this.filePathCallbackLegacy.onReceiveValue(getOutputUri(this.outputImage));
} else if (z) {
this.filePathCallbackLegacy.onReceiveValue(getOutputUri(this.outputVideo));
} else {
this.filePathCallbackLegacy.onReceiveValue(intent.getData());
}
}
} else if (i2 != -1) {
ValueCallback<Uri[]> valueCallback = this.filePathCallback;
if (valueCallback != null) {
valueCallback.onReceiveValue(null);
}
} else if (z2) {
this.filePathCallback.onReceiveValue(new Uri[]{getOutputUri(this.outputImage)});
} else if (z) {
this.filePathCallback.onReceiveValue(new Uri[]{getOutputUri(this.outputVideo)});
} else {
this.filePathCallback.onReceiveValue(getSelectedFiles(intent, i2));
}
File file3 = this.outputImage;
if (file3 != null && !z2) {
file3.delete();
}
File file4 = this.outputVideo;
if (file4 != null && !z) {
file4.delete();
}
this.filePathCallback = null;
this.filePathCallbackLegacy = null;
this.outputImage = null;
this.outputVideo = null;
}
@ReactMethod(isBlockingSynchronousMethod = true)
public void onShouldStartLoadWithRequestCallback(boolean z, int i) {
AtomicReference<c.a> atomicReference;
c cVar = shouldOverrideUrlLoadingLock;
Integer valueOf = Integer.valueOf(i);
synchronized (cVar) {
atomicReference = cVar.b.get(valueOf);
}
if (atomicReference != null) {
synchronized (atomicReference) {
try {
atomicReference.set(z ? c.a.c : c.a.b);
atomicReference.notify();
} finally {
}
}
}
}
public void setDownloadRequest(DownloadManager.Request request) {
this.downloadRequest = request;
}
public void startPhotoPickerIntent(ValueCallback<Uri> valueCallback, String str) {
Intent videoIntent;
Intent photoIntent;
this.filePathCallbackLegacy = valueCallback;
Intent createChooser = Intent.createChooser(getFileChooserIntent(str), "");
ArrayList arrayList = new ArrayList();
if (acceptsImages(str).booleanValue() && (photoIntent = getPhotoIntent()) != null) {
arrayList.add(photoIntent);
}
if (acceptsVideo(str).booleanValue() && (videoIntent = getVideoIntent()) != null) {
arrayList.add(videoIntent);
}
createChooser.putExtra("android.intent.extra.INITIAL_INTENTS", (Parcelable[]) arrayList.toArray(new Parcelable[0]));
if (createChooser.resolveActivity(getCurrentActivity().getPackageManager()) != null) {
getCurrentActivity().startActivityForResult(createChooser, 3);
} else {
Log.w("RNCWebViewModule", "there is no Activity to handle this Intent");
}
}
private Boolean acceptsImages(String[] strArr) {
String[] acceptedMimeType = getAcceptedMimeType(strArr);
return Boolean.valueOf(arrayContainsString(acceptedMimeType, "*/*").booleanValue() || arrayContainsString(acceptedMimeType, "image").booleanValue());
}
private Boolean acceptsVideo(String[] strArr) {
String[] acceptedMimeType = getAcceptedMimeType(strArr);
return Boolean.valueOf(arrayContainsString(acceptedMimeType, "*/*").booleanValue() || arrayContainsString(acceptedMimeType, "video").booleanValue());
}
private Intent getFileChooserIntent(String[] strArr, boolean z) {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setType("*/*");
intent.putExtra("android.intent.extra.MIME_TYPES", getAcceptedMimeType(strArr));
intent.putExtra("android.intent.extra.ALLOW_MULTIPLE", z);
return intent;
}
public boolean startPhotoPickerIntent(ValueCallback<Uri[]> valueCallback, String[] strArr, boolean z) {
Intent videoIntent;
Intent photoIntent;
this.filePathCallback = valueCallback;
ArrayList arrayList = new ArrayList();
if (!needsCameraPermission()) {
if (acceptsImages(strArr).booleanValue() && (photoIntent = getPhotoIntent()) != null) {
arrayList.add(photoIntent);
}
if (acceptsVideo(strArr).booleanValue() && (videoIntent = getVideoIntent()) != null) {
arrayList.add(videoIntent);
}
}
Intent fileChooserIntent = getFileChooserIntent(strArr, z);
Intent intent = new Intent("android.intent.action.CHOOSER");
intent.putExtra("android.intent.extra.INTENT", fileChooserIntent);
intent.putExtra("android.intent.extra.INITIAL_INTENTS", (Parcelable[]) arrayList.toArray(new Parcelable[0]));
if (intent.resolveActivity(getCurrentActivity().getPackageManager()) != null) {
getCurrentActivity().startActivityForResult(intent, 1);
} else {
Log.w("RNCWebViewModule", "there is no Activity to handle this Intent");
}
return true;
}
public void onNewIntent(Intent intent) {
}
}