Android: Add content provider support to File::Delete

This commit is contained in:
JosJuice 2020-06-27 11:04:48 +02:00
parent 6e1e6d2311
commit 3805b84906
6 changed files with 49 additions and 2 deletions

View File

@ -1,6 +1,8 @@
package org.dolphinemu.dolphinemu.utils;
import android.content.ContentResolver;
import android.net.Uri;
import android.provider.DocumentsContract;
import org.dolphinemu.dolphinemu.DolphinApplication;
@ -20,4 +22,18 @@ public class ContentHandler
return -1;
}
}
public static boolean delete(String uri)
{
try
{
ContentResolver resolver = DolphinApplication.getAppContext().getContentResolver();
return DocumentsContract.deleteDocument(resolver, Uri.parse(uri));
}
catch (FileNotFoundException e)
{
// Return true because we care about the file not being there, not the actual delete.
return true;
}
}
}

View File

@ -58,3 +58,10 @@ int OpenAndroidContent(const std::string& uri, const std::string& mode)
return fd;
}
bool DeleteAndroidContent(const std::string& uri)
{
JNIEnv* env = IDCache::GetEnvForThread();
return env->CallStaticBooleanMethod(IDCache::GetContentHandlerClass(),
IDCache::GetContentHandlerDelete(), ToJString(env, uri));
}

View File

@ -13,3 +13,4 @@ jstring ToJString(JNIEnv* env, const std::string& str);
std::vector<std::string> JStringArrayToVector(JNIEnv* env, jobjectArray array);
int OpenAndroidContent(const std::string& uri, const std::string& mode);
bool DeleteAndroidContent(const std::string& uri);

View File

@ -41,6 +41,7 @@ static jmethodID s_compress_cb_run;
static jclass s_content_handler_class;
static jmethodID s_content_handler_open_fd;
static jmethodID s_content_handler_delete;
namespace IDCache
{
@ -187,6 +188,11 @@ jmethodID GetContentHandlerOpenFd()
return s_content_handler_open_fd;
}
jmethodID GetContentHandlerDelete()
{
return s_content_handler_delete;
}
} // namespace IDCache
#ifdef __cplusplus
@ -259,6 +265,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
s_content_handler_class = reinterpret_cast<jclass>(env->NewGlobalRef(content_handler_class));
s_content_handler_open_fd = env->GetStaticMethodID(s_content_handler_class, "openFd",
"(Ljava/lang/String;Ljava/lang/String;)I");
s_content_handler_delete =
env->GetStaticMethodID(s_content_handler_class, "delete", "(Ljava/lang/String;)Z");
return JNI_VERSION;
}

View File

@ -43,5 +43,6 @@ jmethodID GetCompressCallbackRun();
jclass GetContentHandlerClass();
jmethodID GetContentHandlerOpenFd();
jmethodID GetContentHandlerDelete();
} // namespace IDCache

View File

@ -46,6 +46,11 @@
#include <sys/param.h>
#endif
#ifdef ANDROID
#include "Common/StringUtil.h"
#include "jni/AndroidCommon/AndroidCommon.h"
#endif
#ifndef S_ISDIR
#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
#endif
@ -132,10 +137,19 @@ bool Delete(const std::string& filename)
{
INFO_LOG(COMMON, "Delete: file %s", filename.c_str());
#ifdef ANDROID
if (StringBeginsWith(filename, "content://"))
{
const bool success = DeleteAndroidContent(filename);
if (!success)
WARN_LOG(COMMON, "Delete failed on %s", filename.c_str());
return success;
}
#endif
const FileInfo file_info(filename);
// Return true because we care about the file no
// being there, not the actual delete.
// Return true because we care about the file not being there, not the actual delete.
if (!file_info.Exists())
{
WARN_LOG(COMMON, "Delete: %s does not exist", filename.c_str());