From 99ffee9a0acc3200f8c8af7b3fc58af2d38fb614 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 4 Nov 2020 20:59:39 +0100 Subject: Android: Add content provider support to File::OpenFStream --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 310db6b1f7..2870044ac9 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -4,6 +4,7 @@ #include "jni/AndroidCommon/AndroidCommon.h" +#include #include #include #include @@ -66,6 +67,28 @@ std::string OpenModeToAndroid(std::string mode) return mode; } +std::string OpenModeToAndroid(std::ios_base::openmode mode) +{ + std::string result; + + if (mode & std::ios_base::in) + result += 'r'; + + if (mode & (std::ios_base::out | std::ios_base::app)) + result += 'w'; + + if (mode & std::ios_base::app) + result += 'a'; + + constexpr std::ios_base::openmode t = std::ios_base::in | std::ios_base::trunc; + if ((mode & t) == t) + result += 't'; + + // The 'b' specifier is not supported. Since we're on POSIX, it's fine to just skip it. + + return result; +} + int OpenAndroidContent(const std::string& uri, const std::string& mode) { JNIEnv* env = IDCache::GetEnvForThread(); -- cgit v1.2.3 From a7c05d7e84df5949e8edf42fa6332d6aa58282f6 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 5 Nov 2020 19:47:23 +0100 Subject: Android: Add content provider support to File::FileInfo --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 2870044ac9..066b8edf27 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -104,6 +104,14 @@ bool DeleteAndroidContent(const std::string& uri) IDCache::GetContentHandlerDelete(), ToJString(env, uri)); } +jlong GetAndroidContentSizeAndIsDirectory(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + return env->CallStaticLongMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetSizeAndIsDirectory(), + ToJString(env, uri)); +} + int GetNetworkIpAddress() { JNIEnv* env = IDCache::GetEnvForThread(); -- cgit v1.2.3 From 525268f043a25116dbb5e362d9e3e84b3f4ca5e5 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 8 Nov 2020 15:39:17 +0100 Subject: Android: Fix opening games with extensionless URI --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 066b8edf27..373a4699cd 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -112,6 +112,15 @@ jlong GetAndroidContentSizeAndIsDirectory(const std::string& uri) ToJString(env, uri)); } +std::string GetAndroidContentDisplayName(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject display_name = + env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetDisplayName(), ToJString(env, uri)); + return display_name ? GetJString(env, reinterpret_cast(display_name)) : ""; +} + int GetNetworkIpAddress() { JNIEnv* env = IDCache::GetEnvForThread(); -- cgit v1.2.3 From 2126f62111a95e3a2386467747e5bf94b9943e1d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 8 Nov 2020 16:57:49 +0100 Subject: Android: Add content provider support to File::ScanDirectoryTree --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 373a4699cd..b6ecd41d48 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -121,6 +121,15 @@ std::string GetAndroidContentDisplayName(const std::string& uri) return display_name ? GetJString(env, reinterpret_cast(display_name)) : ""; } +std::vector GetAndroidContentChildNames(const std::string& uri) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject children = + env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetChildNames(), ToJString(env, uri)); + return JStringArrayToVector(env, reinterpret_cast(children)); +} + int GetNetworkIpAddress() { JNIEnv* env = IDCache::GetEnvForThread(); -- cgit v1.2.3 From 73855168f3f57f8a3037223235740eb7d9dd76e4 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 8 Nov 2020 23:01:59 +0100 Subject: Android: Show a message when adding a folder with no games To catch people who try to use unsupported formats. --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index b6ecd41d48..9e57d2764a 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -124,9 +124,9 @@ std::string GetAndroidContentDisplayName(const std::string& uri) std::vector GetAndroidContentChildNames(const std::string& uri) { JNIEnv* env = IDCache::GetEnvForThread(); - jobject children = - env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), - IDCache::GetContentHandlerGetChildNames(), ToJString(env, uri)); + jobject children = env->CallStaticObjectMethod(IDCache::GetContentHandlerClass(), + IDCache::GetContentHandlerGetChildNames(), + ToJString(env, uri), false); return JStringArrayToVector(env, reinterpret_cast(children)); } -- cgit v1.2.3 From d78277c063d43e3234fe80a38d272500f3dfce3a Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 28 Dec 2020 13:25:24 +0100 Subject: Android: Add specialized content provider implementation of DoFileSearch --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index 9e57d2764a..b5a5a7faaa 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -44,6 +44,14 @@ std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array) return result; } +jobjectArray JStringArrayFromVector(JNIEnv* env, std::vector vector) +{ + jobjectArray result = env->NewObjectArray(vector.size(), IDCache::GetStringClass(), nullptr); + for (jsize i = 0; i < vector.size(); ++i) + env->SetObjectArrayElement(result, i, ToJString(env, vector[i])); + return result; +} + bool IsPathAndroidContent(const std::string& uri) { return StringBeginsWith(uri, "content://"); @@ -130,6 +138,17 @@ std::vector GetAndroidContentChildNames(const std::string& uri) return JStringArrayToVector(env, reinterpret_cast(children)); } +std::vector DoFileSearchAndroidContent(const std::string& directory, + const std::vector& extensions, + bool recursive) +{ + JNIEnv* env = IDCache::GetEnvForThread(); + jobject result = env->CallStaticObjectMethod( + IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerDoFileSearch(), + ToJString(env, directory), JStringArrayFromVector(env, extensions), recursive); + return JStringArrayToVector(env, reinterpret_cast(result)); +} + int GetNetworkIpAddress() { JNIEnv* env = IDCache::GetEnvForThread(); -- cgit v1.2.3