From a66bd2dfc8293899c50a89848cefdaff43307c50 Mon Sep 17 00:00:00 2001 From: Bryan van Wijk Date: Thu, 24 Jun 2021 12:32:03 +0200 Subject: [PATCH 1/3] Expose public URI in image assets --- .../com/imagepicker/ImagePickerModule.java | 19 ++++++++++++------- .../src/main/java/com/imagepicker/Utils.java | 16 ++++++++++++---- src/types.ts | 1 + 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/imagepicker/ImagePickerModule.java b/android/src/main/java/com/imagepicker/ImagePickerModule.java index 0f037be37..af2a7db46 100644 --- a/android/src/main/java/com/imagepicker/ImagePickerModule.java +++ b/android/src/main/java/com/imagepicker/ImagePickerModule.java @@ -17,6 +17,7 @@ import java.io.File; import java.util.Collections; +import java.util.ArrayList; import java.util.List; import static com.imagepicker.Utils.*; @@ -159,9 +160,9 @@ public void launchImageLibrary(final ReadableMap options, final Callback callbac } } - void onAssetsObtained(List fileUris) { + void onAssetsObtained(List fileUris, List publicFileUris) { try { - callback.invoke(getResponseMap(fileUris, options, reactContext)); + callback.invoke(getResponseMap(fileUris, publicFileUris, options, reactContext)); } catch (RuntimeException exception) { callback.invoke(getErrorMap(errOthers, exception.getMessage())); } finally { @@ -185,25 +186,29 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, return; } + List publicFileUris = new ArrayList<>(); + switch (requestCode) { case REQUEST_LAUNCH_IMAGE_CAPTURE: if (options.saveToPhotos) { - saveToPublicDirectory(cameraCaptureURI, reactContext, "photo"); + Uri publicFileUri = saveToPublicDirectory(cameraCaptureURI, reactContext, "photo"); + publicFileUris.add(publicFileUri); } - onAssetsObtained(Collections.singletonList(fileUri)); + onAssetsObtained(Collections.singletonList(fileUri), publicFileUris); break; case REQUEST_LAUNCH_LIBRARY: - onAssetsObtained(collectUrisFromData(data)); + onAssetsObtained(collectUrisFromData(data), publicFileUris); break; case REQUEST_LAUNCH_VIDEO_CAPTURE: if (options.saveToPhotos) { - saveToPublicDirectory(cameraCaptureURI, reactContext, "video"); + Uri publicFileUri = saveToPublicDirectory(cameraCaptureURI, reactContext, "video"); + publicFileUris.add(publicFileUri); } - onAssetsObtained(Collections.singletonList(fileUri)); + onAssetsObtained(Collections.singletonList(fileUri), publicFileUris); break; } } diff --git a/android/src/main/java/com/imagepicker/Utils.java b/android/src/main/java/com/imagepicker/Utils.java index 304f3c6e4..acc2be83d 100644 --- a/android/src/main/java/com/imagepicker/Utils.java +++ b/android/src/main/java/com/imagepicker/Utils.java @@ -78,7 +78,7 @@ public static Uri createUri(File file, Context reactContext) { return FileProvider.getUriForFile(reactContext, authority, file); } - public static void saveToPublicDirectory(Uri uri, Context context, String mediaType) { + public static Uri saveToPublicDirectory(Uri uri, Context context, String mediaType) { ContentResolver resolver = context.getContentResolver(); Uri mediaStoreUri; ContentValues fileDetails = new ContentValues(); @@ -94,6 +94,7 @@ public static void saveToPublicDirectory(Uri uri, Context context, String mediaT } copyUri(uri, mediaStoreUri, resolver); + return mediaStoreUri; } public static void copyUri(Uri fromUri, Uri toUri, ContentResolver resolver) { @@ -383,12 +384,15 @@ static List collectUrisFromData(Intent data) { return fileUris; } - static ReadableMap getImageResponseMap(Uri uri, Options options, Context context) { + static ReadableMap getImageResponseMap(Uri uri, Uri publicUri, Options options, Context context) { String fileName = uri.getLastPathSegment(); int[] dimensions = getImageDimensions(uri, context); WritableMap map = Arguments.createMap(); map.putString("uri", uri.toString()); + if (publicUri != null) { + map.putString("publicUri", publicUri.toString()); + } map.putDouble("fileSize", getFileSize(uri, context)); map.putString("fileName", fileName); map.putString("type", getMimeTypeFromFileUri(uri)); @@ -411,7 +415,7 @@ static ReadableMap getVideoResponseMap(Uri uri, Context context) { return map; } - static ReadableMap getResponseMap(List fileUris, Options options, Context context) throws RuntimeException { + static ReadableMap getResponseMap(List fileUris, List publicFileUris, Options options, Context context) throws RuntimeException { WritableArray assets = Arguments.createArray(); for(int i = 0; i < fileUris.size(); ++i) { @@ -422,7 +426,11 @@ static ReadableMap getResponseMap(List fileUris, Options options, Context c uri = getAppSpecificStorageUri(uri, context); } uri = resizeImage(uri, context, options); - assets.pushMap(getImageResponseMap(uri, options, context)); + Uri publicUri = null; + if (i < publicFileUris.size()) { + publicUri = publicFileUris.get(i); + } + assets.pushMap(getImageResponseMap(uri, publicUri, options, context)); } else if (isVideoType(uri, context)) { assets.pushMap(getVideoResponseMap(uri, context)); } else { diff --git a/src/types.ts b/src/types.ts index 8d9f2757e..f71710204 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,6 +20,7 @@ export interface CameraOptions export interface Asset { base64?: string; uri?: string; + publicUri?: string; width?: number; height?: number; fileSize?: number; From 4df8aa157e60708cd260ac09643abb59029b3c5f Mon Sep 17 00:00:00 2001 From: Bryan van Wijk Date: Thu, 24 Jun 2021 16:23:49 +0200 Subject: [PATCH 2/3] Replace uri with publicUri if saveToPhotos enabled --- .../com/imagepicker/ImagePickerModule.java | 17 +++++++-------- .../src/main/java/com/imagepicker/Utils.java | 21 ++++++++----------- src/types.ts | 1 - 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/android/src/main/java/com/imagepicker/ImagePickerModule.java b/android/src/main/java/com/imagepicker/ImagePickerModule.java index af2a7db46..774c602a1 100644 --- a/android/src/main/java/com/imagepicker/ImagePickerModule.java +++ b/android/src/main/java/com/imagepicker/ImagePickerModule.java @@ -17,7 +17,6 @@ import java.io.File; import java.util.Collections; -import java.util.ArrayList; import java.util.List; import static com.imagepicker.Utils.*; @@ -160,7 +159,7 @@ public void launchImageLibrary(final ReadableMap options, final Callback callbac } } - void onAssetsObtained(List fileUris, List publicFileUris) { + void onAssetsObtained(List fileUris) { try { callback.invoke(getResponseMap(fileUris, publicFileUris, options, reactContext)); } catch (RuntimeException exception) { @@ -186,29 +185,29 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, return; } - List publicFileUris = new ArrayList<>(); - switch (requestCode) { case REQUEST_LAUNCH_IMAGE_CAPTURE: if (options.saveToPhotos) { Uri publicFileUri = saveToPublicDirectory(cameraCaptureURI, reactContext, "photo"); - publicFileUris.add(publicFileUri); + onAssetsObtained(Collections.singletonList(publicFileUri)); + break; } - onAssetsObtained(Collections.singletonList(fileUri), publicFileUris); + onAssetsObtained(Collections.singletonList(fileUri)); break; case REQUEST_LAUNCH_LIBRARY: - onAssetsObtained(collectUrisFromData(data), publicFileUris); + onAssetsObtained(collectUrisFromData(data)); break; case REQUEST_LAUNCH_VIDEO_CAPTURE: if (options.saveToPhotos) { Uri publicFileUri = saveToPublicDirectory(cameraCaptureURI, reactContext, "video"); - publicFileUris.add(publicFileUri); + onAssetsObtained(Collections.singletonList(publicFileUri)); + break; } - onAssetsObtained(Collections.singletonList(fileUri), publicFileUris); + onAssetsObtained(Collections.singletonList(fileUri)); break; } } diff --git a/android/src/main/java/com/imagepicker/Utils.java b/android/src/main/java/com/imagepicker/Utils.java index acc2be83d..38abd35ed 100644 --- a/android/src/main/java/com/imagepicker/Utils.java +++ b/android/src/main/java/com/imagepicker/Utils.java @@ -384,18 +384,19 @@ static List collectUrisFromData(Intent data) { return fileUris; } - static ReadableMap getImageResponseMap(Uri uri, Uri publicUri, Options options, Context context) { + static ReadableMap getImageResponseMap(Uri uri, Options options, Context context) { String fileName = uri.getLastPathSegment(); int[] dimensions = getImageDimensions(uri, context); + ContentResolver resolver = context.getContentResolver(); + String fileType = resolver.getType(uri); + + WritableMap map = Arguments.createMap(); map.putString("uri", uri.toString()); - if (publicUri != null) { - map.putString("publicUri", publicUri.toString()); - } map.putDouble("fileSize", getFileSize(uri, context)); map.putString("fileName", fileName); - map.putString("type", getMimeTypeFromFileUri(uri)); + map.putString("type", getFileTypeFromMime(fileType)); map.putInt("width", dimensions[0]); map.putInt("height", dimensions[1]); @@ -415,22 +416,18 @@ static ReadableMap getVideoResponseMap(Uri uri, Context context) { return map; } - static ReadableMap getResponseMap(List fileUris, List publicFileUris, Options options, Context context) throws RuntimeException { + static ReadableMap getResponseMap(List fileUris, Options options, Context context) throws RuntimeException { WritableArray assets = Arguments.createArray(); for(int i = 0; i < fileUris.size(); ++i) { Uri uri = fileUris.get(i); if (isImageType(uri, context)) { - if (uri.getScheme().contains("content")) { + if (uri.getScheme().contains("content") && !options.saveToPhotos) { uri = getAppSpecificStorageUri(uri, context); } uri = resizeImage(uri, context, options); - Uri publicUri = null; - if (i < publicFileUris.size()) { - publicUri = publicFileUris.get(i); - } - assets.pushMap(getImageResponseMap(uri, publicUri, options, context)); + assets.pushMap(getImageResponseMap(uri, options, context)); } else if (isVideoType(uri, context)) { assets.pushMap(getVideoResponseMap(uri, context)); } else { diff --git a/src/types.ts b/src/types.ts index f71710204..8d9f2757e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,7 +20,6 @@ export interface CameraOptions export interface Asset { base64?: string; uri?: string; - publicUri?: string; width?: number; height?: number; fileSize?: number; From 3ccede9e4afc6dd70cdb704f11b17b44414ac568 Mon Sep 17 00:00:00 2001 From: Bryan van Wijk Date: Thu, 24 Jun 2021 16:27:01 +0200 Subject: [PATCH 3/3] Remove unused parameter --- android/src/main/java/com/imagepicker/ImagePickerModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/imagepicker/ImagePickerModule.java b/android/src/main/java/com/imagepicker/ImagePickerModule.java index 774c602a1..d7653e82e 100644 --- a/android/src/main/java/com/imagepicker/ImagePickerModule.java +++ b/android/src/main/java/com/imagepicker/ImagePickerModule.java @@ -161,7 +161,7 @@ public void launchImageLibrary(final ReadableMap options, final Callback callbac void onAssetsObtained(List fileUris) { try { - callback.invoke(getResponseMap(fileUris, publicFileUris, options, reactContext)); + callback.invoke(getResponseMap(fileUris, options, reactContext)); } catch (RuntimeException exception) { callback.invoke(getErrorMap(errOthers, exception.getMessage())); } finally {