From cc4a688f88091eacd47727ccefdc467c187dc7ac Mon Sep 17 00:00:00 2001 From: Ian Y Date: Mon, 14 Oct 2024 15:33:29 +0800 Subject: [PATCH 1/2] feat: add update media file support --- .../java/com/rnfs2/RNFSMediaStoreManager.java | 46 +++++++++++++++++++ example/App/example3.tsx | 10 ++++ src/index.ts | 4 ++ 3 files changed, 60 insertions(+) diff --git a/android/src/main/java/com/rnfs2/RNFSMediaStoreManager.java b/android/src/main/java/com/rnfs2/RNFSMediaStoreManager.java index dc07aee1..221a1292 100644 --- a/android/src/main/java/com/rnfs2/RNFSMediaStoreManager.java +++ b/android/src/main/java/com/rnfs2/RNFSMediaStoreManager.java @@ -139,6 +139,25 @@ public void createMediaFile(ReadableMap filedata, String mediaType, Promise prom } } + @ReactMethod void updateMediaFile(String fileUri, ReadableMap filedata, String mediaType, Promise promise) { + if (!(filedata.hasKey("name") && filedata.hasKey("parentFolder") && filedata.hasKey("mimeType"))) { + promise.reject("RNFS2.updateMediaFile", "Invalid filedata: " + filedata.toString()); + return; + } + + if (mediaType == null) { + promise.reject("RNFS2.updateMediaFile", "Invalid mediatype"); + return; + } + + FileDescription file = new FileDescription(filedata.getString("name"), filedata.getString("mimeType"), filedata.getString("parentFolder")); + Uri fileuri = Uri.parse(fileUri); + boolean res = updateExistingMediaFile(fileuri, file, MediaType.valueOf(mediaType), promise, reactContext); + if (res) { + promise.resolve("Success"); + } + } + @ReactMethod public void writeToMediaFile(String fileUri, String path, boolean transformFile, Promise promise) { boolean res = writeToMediaFile(Uri.parse(fileUri), path, transformFile, promise, reactContext); @@ -249,6 +268,33 @@ private Uri createNewMediaFile(FileDescription file, MediaType mediaType, Promis return null; } + private boolean updateExistingMediaFile(Uri fileUri, FileDescription file, MediaType mediaType, Promise promise, ReactApplicationContext ctx) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + try { + Context appCtx = ctx.getApplicationContext(); + ContentResolver resolver = appCtx.getContentResolver(); + + ContentValues fileDetails = new ContentValues(); + String relativePath = getRelativePath(mediaType, ctx); + String mimeType = file.mimeType; + + fileDetails.put(MediaStore.MediaColumns.DATE_MODIFIED, System.currentTimeMillis() / 1000); + fileDetails.put(MediaStore.MediaColumns.MIME_TYPE, mimeType); + fileDetails.put(MediaStore.MediaColumns.DISPLAY_NAME, file.name); + fileDetails.put(MediaStore.MediaColumns.RELATIVE_PATH, relativePath + '/' + file.parentFolder); + + int rowsUpdated = resolver.update(fileUri, fileDetails, null, null); + return rowsUpdated > 0; + } catch (Exception e) { + promise.reject("RNFS2.updateExistingMediaFile", "Error updating file: " + e.getMessage()); + return false; + } + } else { + promise.reject("RNFS2.updateExistingMediaFile", "Android version not supported"); + return false; + } + } + private boolean writeToMediaFile(Uri fileUri, String filePath, boolean transformFile, Promise promise, ReactApplicationContext ctx) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { try { diff --git a/example/App/example3.tsx b/example/App/example3.tsx index 38df3494..6f668b49 100644 --- a/example/App/example3.tsx +++ b/example/App/example3.tsx @@ -151,6 +151,16 @@ const Example = () => { runStatus = `${runStatus}\n- "Media File" stat: ${JSON.stringify(mediaStat)}`; setResult(runStatus); + + await RNFS.MediaStore.updateMediaFile( + contentURI, + { + name: `pewpewDummyImageEdited.png`, + parentFolder: 'RNFSExample3Folder', + mimeType: 'image/png', + }, + RNFS.MediaStore.MEDIA_IMAGE, + ); } catch (err) { setResult(`${runStatus}\n- Error Running Example`); console.error(err); diff --git a/src/index.ts b/src/index.ts index e355536a..d2b388ab 100755 --- a/src/index.ts +++ b/src/index.ts @@ -132,6 +132,10 @@ const MediaStore = { return RNFSMediaStoreManager.createMediaFile(fileDescriptor, mediatype); }, + updateMediaFile(uri: string, fileDescriptor: FileDescriptor, mediatype: MediaCollections): Promise { + return RNFSMediaStoreManager.updateMediaFile(uri, fileDescriptor, mediatype); + }, + writeToMediaFile(uri: string, path: string): Promise { return RNFSMediaStoreManager.writeToMediaFile(uri, normalizeFilePath(path), false); }, From e9b230e15489c189483b2d65fd3c39c02827bc70 Mon Sep 17 00:00:00 2001 From: Ian Y Date: Mon, 14 Oct 2024 16:48:06 +0800 Subject: [PATCH 2/2] docs: update media store documentation --- README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1ac14834..aa4d4b21 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,19 @@ const fileDescriptor = { name: 'sample', parentFolder: 'MyAppFolder', mimeType: const contentURI = await RNFS.MediaStore.createMediaFile(fileDescriptor, RNFS.MediaStore.MEDIA_IMAGE) ``` +### `updateMediaFile` + +* Updates the media file in the MediaStore + +```ts +// updateMediaFile(uri: string, fileDescriptor: FileDescriptor, mediatype: MediaCollections): Promise + +const contentURI = 'content://media/external/images/media/123' +const fileDescriptor = { name: 'sample-updated-filename', parentFolder: 'MyAppFolder', mimeType: 'image/png' } + +const contentURI = await RNFS.MediaStore.updateMediaFile(contentURI, fileDescriptor, RNFS.MediaStore.MEDIA_IMAGE) +``` + ### `writeToMediaFile` * Writes data to a media file in the MediaStore with the given `mimeType`. @@ -337,14 +350,27 @@ const fileDescriptor = { name: 'sample', parentFolder: 'MyAppFolder', mimeType: const contentURI = await RNFS.MediaStore.copyToMediaStore(fileDescriptor, RNFS.MediaStore.MEDIA_IMAGE, '/path/to/image/imageToCopy.png') ``` -### `existsInMediaStore` +### `queryMediaStore` -* Checks if the media file at `uri` exists in the MediaStore. +* Queries the MediaStore for media files with the given `searchOptions`. ```ts -// existsInMediaStore(uri: string): Promise - -await RNFS.MediaStore.existsInMediaStore('content://media/external/images/media/123') +// queryMediaStore(searchOptions: MediaStoreSearchOptions): Promise + +await RNFS.MediaStore.queryMediaStore({ + uri: 'content://media/external/images/media/123', + fileName: '' + relativePath: '' + mediaType: RNFS.MediaStore.MEDIA_IMAGE; +}) + +// or +await RNFS.MediaStore.queryMediaStore({ + uri: '', + fileName: 'image.png' + relativePath: 'MyAppFolder' + mediaType: RNFS.MediaStore.MEDIA_IMAGE; +}) ``` ### `deleteFromMediaStore` @@ -366,6 +392,23 @@ type FileDescriptor = { }; ``` +## MediaStoreSearchOptions +```ts +type MediaStoreSearchOptions = { + uri: string; + fileName: string; + relativePath: string; + mediaType: MediaCollections +}; +``` + +## MediaStoreQueryResult +```ts +type MediaStoreQueryResult = { + contentUri: string; +}; +``` + ## MediaStore Collections * `MediaStore.MEDIA_AUDIO` - Audio media collection * `MediaStore.MEDIA_IMAGE` - Image media collection