Skip to content

Commit

Permalink
Android only: support for originalFilapath with stat (content uri res…
Browse files Browse the repository at this point in the history
…olution)
  • Loading branch information
Andrea Tosatto committed May 10, 2018
1 parent 9b130ad commit d659a3d
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
7 changes: 5 additions & 2 deletions FS.common.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ var getJobId = () => {
return jobId;
};

var normalizeFilePath = (path: string) => (path.startsWith('file://') ? path.slice(7) : path);
var normalizeFilePath = (path: string) => (path.startsWith('file://') && !path.startsWith('content://') ? path.slice(7) : path);

type MkdirOptions = {
NSURLIsExcludedFromBackupKey?: boolean; // iOS only
Expand All @@ -42,12 +42,13 @@ type ReadDirItem = {
};

type StatResult = {
name: string; // The name of the item
name: ?string; // The name of the item
path: string; // The absolute path to the item
size: string; // Size in bytes
mode: number; // UNIX file mode
ctime: number; // Created date
mtime: number; // Last modified date
originalFilepath: ?string; // In case of content uri this is the pointed file path, otherwise is the same as path
isFile: () => boolean; // Is the file just a file?
isDirectory: () => boolean; // Is the file a directory?
};
Expand Down Expand Up @@ -272,10 +273,12 @@ var RNFS = {
stat(filepath: string): Promise<StatResult> {
return RNFSManager.stat(normalizeFilePath(filepath)).then((result) => {
return {
'path': filepath,
'ctime': new Date(result.ctime * 1000),
'mtime': new Date(result.mtime * 1000),
'size': result.size,
'mode': result.mode,
'originalFilepath': result.originalFilepath,
isFile: () => result.type === RNFSFileTypeRegular,
isDirectory: () => result.type === RNFSFileTypeDirectory,
};
Expand Down
22 changes: 20 additions & 2 deletions android/src/main/java/com/rnfs/RNFSManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.util.Base64;
import android.util.SparseArray;
Expand Down Expand Up @@ -72,6 +74,21 @@ private Uri getFileUri(String filepath) throws IORejectionException {
return uri;
}

private String getOriginalFilepath(String filepath) throws IORejectionException {
Uri uri = getFileUri(filepath);
String originalFilepath = "";
if (uri.getScheme().equals("content")) {
try {
Cursor cursor = reactContext.getContentResolver().query(uri, null, null, null, null);
if (cursor.moveToFirst()) {
originalFilepath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
}
} catch (IllegalArgumentException ignored) {
}
}
return originalFilepath;
}

private InputStream getInputStream(String filepath) throws IORejectionException {
Uri uri = getFileUri(filepath);
InputStream stream;
Expand Down Expand Up @@ -510,16 +527,17 @@ public void setReadable(String filepath, Boolean readable, Boolean ownerOnly, Pr
@ReactMethod
public void stat(String filepath, Promise promise) {
try {
File file = new File(filepath);
String originalFilepath = getOriginalFilepath(filepath);
File file = new File(originalFilepath);

if (!file.exists()) throw new Exception("File does not exist");

WritableMap statMap = Arguments.createMap();

statMap.putInt("ctime", (int) (file.lastModified() / 1000));
statMap.putInt("mtime", (int) (file.lastModified() / 1000));
statMap.putInt("size", (int) file.length());
statMap.putInt("type", file.isDirectory() ? 1 : 0);
statMap.putString("originalFilepath", originalFilepath);

promise.resolve(statMap);
} catch (Exception ex) {
Expand Down

0 comments on commit d659a3d

Please sign in to comment.