From 4ff2f43bb29aab3eb2a5f26d17eaf9753e656555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20R=C3=A9mot?= Date: Fri, 27 Nov 2020 10:55:27 +0100 Subject: [PATCH] Add basic support for Android content URIs in stat Add a basic implementation of stat for content URIs that returns what it can return: the file length. --- .../src/main/java/com/rnfs/RNFSManager.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/rnfs/RNFSManager.java b/android/src/main/java/com/rnfs/RNFSManager.java index 7aab307a..7e396dc7 100755 --- a/android/src/main/java/com/rnfs/RNFSManager.java +++ b/android/src/main/java/com/rnfs/RNFSManager.java @@ -5,6 +5,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Environment; import android.os.StatFs; import android.provider.MediaStore; @@ -620,20 +621,31 @@ public void setReadable(String filepath, Boolean readable, Boolean ownerOnly, Pr } } + @android.support.annotation.RequiresApi(api = Build.VERSION_CODES.CUPCAKE) @ReactMethod public void stat(String filepath, Promise promise) { try { - String originalFilepath = getOriginalFilepath(filepath, true); - File file = new File(originalFilepath); + WritableMap statMap = Arguments.createMap(); - if (!file.exists()) throw new Exception("File does not exist"); + if (filepath.startsWith("content://")) { + AssetFileDescriptor descriptor = reactContext.getContentResolver().openAssetFileDescriptor(Uri.parse(filepath), "r"); + statMap.putInt("ctime", 0); + statMap.putInt("mtime", 0); + statMap.putDouble("size", (double) descriptor.getLength()); + statMap.putInt("type", 0); + statMap.putString("originalFilepath", null); + } else { + String originalFilepath = getOriginalFilepath(filepath, true); + File file = new File(originalFilepath); - WritableMap statMap = Arguments.createMap(); - statMap.putInt("ctime", (int) (file.lastModified() / 1000)); - statMap.putInt("mtime", (int) (file.lastModified() / 1000)); - statMap.putDouble("size", (double) file.length()); - statMap.putInt("type", file.isDirectory() ? 1 : 0); - statMap.putString("originalFilepath", originalFilepath); + if (!file.exists()) throw new Exception("File does not exist"); + + statMap.putInt("ctime", (int) (file.lastModified() / 1000)); + statMap.putInt("mtime", (int) (file.lastModified() / 1000)); + statMap.putDouble("size", (double) file.length()); + statMap.putInt("type", file.isDirectory() ? 1 : 0); + statMap.putString("originalFilepath", originalFilepath); + } promise.resolve(statMap); } catch (Exception ex) {