Jelajahi Sumber

Merge pull request #10796 from bunnei/fix-saf

android: fs: Fix Exists / IsFile for SAF.
bunnei 3 tahun lalu
induk
melakukan
9a04793ae8

+ 18 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt

@@ -19,6 +19,8 @@ import org.yuzu.yuzu_emu.activities.EmulationActivity
 import org.yuzu.yuzu_emu.utils.DocumentsTree.Companion.isNativePath
 import org.yuzu.yuzu_emu.utils.FileUtil.getFileSize
 import org.yuzu.yuzu_emu.utils.FileUtil.openContentUri
+import org.yuzu.yuzu_emu.utils.FileUtil.exists
+import org.yuzu.yuzu_emu.utils.FileUtil.isDirectory
 import org.yuzu.yuzu_emu.utils.Log.error
 import org.yuzu.yuzu_emu.utils.Log.verbose
 import org.yuzu.yuzu_emu.utils.Log.warning
@@ -85,6 +87,22 @@ object NativeLibrary {
         } else getFileSize(appContext, path)
     }
 
+    @Keep
+    @JvmStatic
+    fun exists(path: String?): Boolean {
+        return if (isNativePath(path!!)) {
+            YuzuApplication.documentsTree!!.exists(path)
+        } else exists(appContext, path)
+    }
+
+    @Keep
+    @JvmStatic
+    fun isDirectory(path: String?): Boolean {
+        return if (isNativePath(path!!)) {
+            YuzuApplication.documentsTree!!.isDirectory(path)
+        } else isDirectory(appContext, path)
+    }
+
     /**
      * Returns true if pro controller isn't available and handheld is
      */

+ 5 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DocumentsTree.kt

@@ -36,6 +36,11 @@ class DocumentsTree {
         return resolvePath(filepath) != null
     }
 
+    fun isDirectory(filepath: String): Boolean {
+        val node = resolvePath(filepath)
+        return node != null && node.isDirectory
+    }
+
     private fun resolvePath(filepath: String): DocumentsNode? {
         val tokens = StringTokenizer(filepath, File.separator, false)
         var iterator = root

+ 27 - 0
src/common/fs/fs.cpp

@@ -3,6 +3,9 @@
 
 #include "common/fs/file.h"
 #include "common/fs/fs.h"
+#ifdef ANDROID
+#include "common/fs/fs_android.h"
+#endif
 #include "common/fs/path_util.h"
 #include "common/logging/log.h"
 
@@ -525,15 +528,39 @@ void IterateDirEntriesRecursively(const std::filesystem::path& path,
 // Generic Filesystem Operations
 
 bool Exists(const fs::path& path) {
+#ifdef ANDROID
+    if (Android::IsContentUri(path)) {
+        return Android::Exists(path);
+    } else {
+        return fs::exists(path);
+    }
+#else
     return fs::exists(path);
+#endif
 }
 
 bool IsFile(const fs::path& path) {
+#ifdef ANDROID
+    if (Android::IsContentUri(path)) {
+        return !Android::IsDirectory(path);
+    } else {
+        return fs::is_regular_file(path);
+    }
+#else
     return fs::is_regular_file(path);
+#endif
 }
 
 bool IsDir(const fs::path& path) {
+#ifdef ANDROID
+    if (Android::IsContentUri(path)) {
+        return Android::IsDirectory(path);
+    } else {
+        return fs::is_directory(path);
+    }
+#else
     return fs::is_directory(path);
+#endif
 }
 
 fs::path GetCurrentDir() {

+ 4 - 1
src/common/fs/fs_android.h

@@ -12,7 +12,10 @@
       "openContentUri", "(Ljava/lang/String;Ljava/lang/String;)I")
 
 #define ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(V)                                                 \
-    V(GetSize, std::uint64_t, get_size, CallStaticLongMethod, "getSize", "(Ljava/lang/String;)J")
+    V(GetSize, std::uint64_t, get_size, CallStaticLongMethod, "getSize", "(Ljava/lang/String;)J")  \
+    V(IsDirectory, bool, is_directory, CallStaticBooleanMethod, "isDirectory",                     \
+      "(Ljava/lang/String;)Z")                                                                     \
+    V(Exists, bool, file_exists, CallStaticBooleanMethod, "exists", "(Ljava/lang/String;)Z")
 
 namespace Common::FS::Android {