From 2a7dad43c66fc20cda92fdb16d248e65ff8aedac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 5 Sep 2025 10:03:33 +0200 Subject: [PATCH] WIP: Turn the methods into static methods. --- Common/File/AndroidStorage.cpp | 53 ++++++++-------- android/jni/app-android.cpp | 13 ++-- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 62 +++++++++---------- .../org/ppsspp/ppsspp/ShortcutActivity.java | 13 ++-- 4 files changed, 73 insertions(+), 68 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 2ea96b1918..5004b716cf 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -38,31 +38,31 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { openContentUri = env->GetStaticMethodID(localClass, "openContentUri", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(openContentUri); - listContentUriDir = env->GetMethodID(localClass, "listContentUriDir", "(Ljava/lang/String;)[Ljava/lang/String;"); + listContentUriDir = env->GetStaticMethodID(localClass, "listContentUriDir", "(Landroid/app/Activity;Ljava/lang/String;)[Ljava/lang/String;"); _dbg_assert_(listContentUriDir); - contentUriCreateDirectory = env->GetMethodID(localClass, "contentUriCreateDirectory", "(Ljava/lang/String;Ljava/lang/String;)I"); + contentUriCreateDirectory = env->GetStaticMethodID(localClass, "contentUriCreateDirectory", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCreateDirectory); - contentUriCreateFile = env->GetMethodID(localClass, "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)I"); + contentUriCreateFile = env->GetStaticMethodID(localClass, "contentUriCreateFile", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCreateFile); - contentUriCopyFile = env->GetMethodID(localClass, "contentUriCopyFile", "(Ljava/lang/String;Ljava/lang/String;)I"); + contentUriCopyFile = env->GetStaticMethodID(localClass, "contentUriCopyFile", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCopyFile); - contentUriRemoveFile = env->GetMethodID(localClass, "contentUriRemoveFile", "(Ljava/lang/String;)I"); + contentUriRemoveFile = env->GetStaticMethodID(localClass, "contentUriRemoveFile", "(Landroid/app/Activity;Ljava/lang/String;)I"); _dbg_assert_(contentUriRemoveFile); - contentUriMoveFile = env->GetMethodID(localClass, "contentUriMoveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"); + contentUriMoveFile = env->GetStaticMethodID(localClass, "contentUriMoveFile", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriMoveFile); - contentUriRenameFileTo = env->GetMethodID(localClass, "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)I"); + contentUriRenameFileTo = env->GetStaticMethodID(localClass, "contentUriRenameFileTo", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriRenameFileTo); - contentUriGetFileInfo = env->GetMethodID(localClass, "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;"); + contentUriGetFileInfo = env->GetStaticMethodID(localClass, "contentUriGetFileInfo", "(Landroid/app/Activity;Ljava/lang/String;)Ljava/lang/String;"); _dbg_assert_(contentUriGetFileInfo); - contentUriFileExists = env->GetMethodID(localClass, "contentUriFileExists", "(Ljava/lang/String;)Z"); + contentUriFileExists = env->GetStaticMethodID(localClass, "contentUriFileExists", "(Landroid/app/Activity;Ljava/lang/String;)Z"); _dbg_assert_(contentUriFileExists); - contentUriGetFreeStorageSpace = env->GetMethodID(localClass, "contentUriGetFreeStorageSpace", "(Ljava/lang/String;)J"); + contentUriGetFreeStorageSpace = env->GetStaticMethodID(localClass, "contentUriGetFreeStorageSpace", "(Landroid/app/Activity;Ljava/lang/String;)J"); _dbg_assert_(contentUriGetFreeStorageSpace); - filePathGetFreeStorageSpace = env->GetMethodID(localClass, "filePathGetFreeStorageSpace", "(Ljava/lang/String;)J"); + filePathGetFreeStorageSpace = env->GetStaticMethodID(localClass, "filePathGetFreeStorageSpace", "(Landroid/app/Activity;Ljava/lang/String;)J"); _dbg_assert_(filePathGetFreeStorageSpace); - isExternalStoragePreservedLegacy = env->GetMethodID(localClass, "isExternalStoragePreservedLegacy", "()Z"); + isExternalStoragePreservedLegacy = env->GetStaticMethodID(localClass, "isExternalStoragePreservedLegacy", "()Z"); // doesn't need an activity _dbg_assert_(isExternalStoragePreservedLegacy); - computeRecursiveDirectorySize = env->GetMethodID(localClass, "computeRecursiveDirectorySize", "(Ljava/lang/String;)J"); + computeRecursiveDirectorySize = env->GetStaticMethodID(localClass, "computeRecursiveDirectorySize", "(Landroid/app/Activity;Ljava/lang/String;)J"); _dbg_assert_(computeRecursiveDirectorySize); g_classActivity = reinterpret_cast(env->NewGlobalRef(localClass)); @@ -113,7 +113,7 @@ StorageError Android_CreateDirectory(const std::string &rootTreeUri, const std:: auto env = getEnv(); jstring paramRoot = env->NewStringUTF(rootTreeUri.c_str()); jstring paramDirName = env->NewStringUTF(dirName.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCreateDirectory, paramRoot, paramDirName)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriCreateDirectory, g_nativeActivity, paramRoot, paramDirName)); } StorageError Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { @@ -123,7 +123,7 @@ StorageError Android_CreateFile(const std::string &parentTreeUri, const std::str auto env = getEnv(); jstring paramRoot = env->NewStringUTF(parentTreeUri.c_str()); jstring paramFileName = env->NewStringUTF(fileName.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriCreateFile, g_nativeActivity, paramRoot, paramFileName)); } StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { @@ -133,7 +133,7 @@ StorageError Android_CopyFile(const std::string &fileUri, const std::string &des auto env = getEnv(); jstring paramFileName = env->NewStringUTF(fileUri.c_str()); jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCopyFile, paramFileName, paramDestParentUri)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriCopyFile, g_nativeActivity, paramFileName, paramDestParentUri)); } StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { @@ -144,7 +144,7 @@ StorageError Android_MoveFile(const std::string &fileUri, const std::string &src jstring paramFileName = env->NewStringUTF(fileUri.c_str()); jstring paramSrcParentUri = env->NewStringUTF(srcParentUri.c_str()); jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriMoveFile, paramFileName, paramSrcParentUri, paramDestParentUri)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriMoveFile, g_nativeActivity, paramFileName, paramSrcParentUri, paramDestParentUri)); } StorageError Android_RemoveFile(const std::string &fileUri) { @@ -153,7 +153,7 @@ StorageError Android_RemoveFile(const std::string &fileUri) { } auto env = getEnv(); jstring paramFileName = env->NewStringUTF(fileUri.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriRemoveFile, paramFileName)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriRemoveFile, g_nativeActivity, paramFileName)); } StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { @@ -163,7 +163,7 @@ StorageError Android_RenameFileTo(const std::string &fileUri, const std::string auto env = getEnv(); jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); jstring paramNewName = env->NewStringUTF(newName.c_str()); - return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriRenameFileTo, paramFileUri, paramNewName)); + return StorageErrorFromInt(env->CallStaticIntMethod(g_classActivity, contentUriRenameFileTo, g_nativeActivity, paramFileUri, paramNewName)); } // NOTE: Does not set fullName - you're supposed to already know it. @@ -209,7 +209,7 @@ bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *fileInfo) { auto env = getEnv(); jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); - jstring str = (jstring)env->CallObjectMethod(g_nativeActivity, contentUriGetFileInfo, paramFileUri); + jstring str = (jstring)env->CallStaticObjectMethod(g_classActivity, contentUriGetFileInfo, g_nativeActivity, paramFileUri); if (!str) { return false; } @@ -227,7 +227,7 @@ bool Android_FileExists(const std::string &fileUri) { } auto env = getEnv(); jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); - bool exists = env->CallBooleanMethod(g_nativeActivity, contentUriFileExists, paramFileUri); + bool exists = env->CallStaticBooleanMethod(g_classActivity, contentUriFileExists, g_nativeActivity, paramFileUri); return exists; } @@ -242,7 +242,7 @@ std::vector Android_ListContentUri(const std::string &uri, const double start = time_now_d(); jstring param = env->NewStringUTF(uri.c_str()); - jobject retval = env->CallObjectMethod(g_nativeActivity, listContentUriDir, param); + jobject retval = env->CallStaticObjectMethod(g_classActivity, listContentUriDir, g_nativeActivity, param); jobjectArray fileList = (jobjectArray)retval; std::vector items; @@ -283,7 +283,7 @@ int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { auto env = getEnv(); jstring param = env->NewStringUTF(uri.c_str()); - return env->CallLongMethod(g_nativeActivity, contentUriGetFreeStorageSpace, param); + return env->CallStaticLongMethod(g_classActivity, contentUriGetFreeStorageSpace, g_nativeActivity, param); } // Hm, this is never used? We use statvfs instead. @@ -299,7 +299,7 @@ int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { } jstring param = env->NewStringUTF(filePath.c_str()); - return env->CallLongMethod(g_nativeActivity, filePathGetFreeStorageSpace, param); + return env->CallStaticLongMethod(g_classActivity, filePathGetFreeStorageSpace, g_nativeActivity, param); } int64_t Android_ComputeRecursiveDirectorySize(const std::string &uri) { @@ -311,7 +311,7 @@ int64_t Android_ComputeRecursiveDirectorySize(const std::string &uri) { jstring param = env->NewStringUTF(uri.c_str()); double start = time_now_d(); - int64_t size = env->CallLongMethod(g_nativeActivity, computeRecursiveDirectorySize, param); + int64_t size = env->CallStaticLongMethod(g_classActivity, computeRecursiveDirectorySize, g_nativeActivity, param); double elapsed = time_now_d() - start; INFO_LOG(Log::IO, "ComputeRecursiveDirectorySize(%s) in %0.3f s", uri.c_str(), elapsed); @@ -323,7 +323,8 @@ bool Android_IsExternalStoragePreservedLegacy() { return false; } auto env = getEnv(); - return env->CallBooleanMethod(g_nativeActivity, isExternalStoragePreservedLegacy); + // Note: No activity param + return env->CallStaticBooleanMethod(g_classActivity, isExternalStoragePreservedLegacy); } const char *Android_ErrorToString(StorageError error) { diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index af1fadda95..eca011fbb4 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -1700,11 +1700,7 @@ static void VulkanEmuThread(ANativeWindow *wnd) { WARN_LOG(Log::G3D, "Render loop function exited."); } -// NOTE: This is defunct and not working, due to how the Android storage functions currently require -// a PpssppActivity specifically and we don't have one here. -// We need to make openContentUri and friends into static functions that take a jobject activity, and here -// we need to feed the ShortcutActivity to them. -extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameName(JNIEnv * env, jclass, jstring jpath) { +extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGame(JNIEnv * env, jclass, jobject activity, jstring jpath) { bool teardownThreadManager = false; if (!g_threadManager.IsInitialized()) { // Need a thread manager. @@ -1712,6 +1708,8 @@ extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameName(JNIEnv g_threadManager.Init(1, 1); g_logManager.SetOutputsEnabled(LogOutput::Stdio); g_logManager.SetAllLogLevels(LogLevel::LDEBUG); + Android_StorageSetNativeActivity(activity); + Android_RegisterStorageCallbacks(env, activity); INFO_LOG(Log::System, "No thread manager - initializing one"); } @@ -1759,7 +1757,7 @@ extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameName(JNIEnv extern "C" JNIEXPORT jbyteArray JNICALL -Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameIcon(JNIEnv * env, jclass clazz, jstring jpath) { +Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameIcon(JNIEnv * env, jclass, jobject activity, jstring jpath) { bool teardownThreadManager = false; if (!g_threadManager.IsInitialized()) { // Need a thread manager. @@ -1767,6 +1765,9 @@ Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameIcon(JNIEnv * env, jclass clazz g_threadManager.Init(1, 1); g_logManager.SetOutputsEnabled(LogOutput::Stdio); g_logManager.SetAllLogLevels(LogLevel::LDEBUG); + + Android_StorageSetNativeActivity(activity); + Android_RegisterStorageCallbacks(env, activity); INFO_LOG(Log::System, "No thread manager - initializing one"); } // TODO: implement requestIcon() diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 7fecd80548..5d14a2727a 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -191,7 +191,7 @@ public class PpssppActivity extends NativeActivity { DocumentsContract.Document.COLUMN_LAST_MODIFIED }; - private String cursorToString(Cursor c) { + private static String cursorToString(Cursor c) { final int flags = c.getInt(2); // Filter out any virtual or partial nonsense. // There's a bunch of potentially-interesting flags here btw, @@ -213,7 +213,7 @@ public class PpssppActivity extends NativeActivity { return str + size + "|" + documentName + "|" + lastModified; } - private long directorySizeRecursion(Uri uri) { + private static long directorySizeRecursion(Activity activity, Uri uri) { Cursor c = null; try { // Log.i(TAG, "recursing into " + uri.toString()); @@ -222,7 +222,7 @@ public class PpssppActivity extends NativeActivity { DocumentsContract.Document.COLUMN_SIZE, DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR }; - final ContentResolver resolver = getContentResolver(); + final ContentResolver resolver = activity.getContentResolver(); final String documentId = DocumentsContract.getDocumentId(uri); final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, documentId); c = resolver.query(childrenUri, columns, null, null, null); @@ -250,7 +250,7 @@ public class PpssppActivity extends NativeActivity { c = null; for (Uri childUri : childDirs) { - long dirSize = directorySizeRecursion(childUri); + long dirSize = directorySizeRecursion(activity, childUri); if (dirSize >= 0) { sizeSum += dirSize; } else { @@ -269,10 +269,10 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public long computeRecursiveDirectorySize(String uriString) { + public static long computeRecursiveDirectorySize(Activity activity, String uriString) { try { Uri uri = Uri.parse(uriString); - return directorySizeRecursion(uri); + return directorySizeRecursion(activity, uri); } catch (Exception e) { Log.e(TAG, "computeRecursiveSize exception: " + e); @@ -286,10 +286,10 @@ public class PpssppActivity extends NativeActivity { // uestions/42186820/documentfile-is-very-slow @Keep @SuppressWarnings("unused") - public String[] listContentUriDir(String uriString) { + public static String[] listContentUriDir(Activity activity, String uriString) { try { Uri uri = Uri.parse(uriString); - final ContentResolver resolver = getContentResolver(); + final ContentResolver resolver = activity.getContentResolver(); final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree( uri, DocumentsContract.getDocumentId(uri)); final ArrayList listing = new ArrayList<>(); @@ -325,10 +325,10 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public int contentUriCreateDirectory(String rootTreeUri, String dirName) { + public static int contentUriCreateDirectory(Activity activity, String rootTreeUri, String dirName) { try { Uri uri = Uri.parse(rootTreeUri); - DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri); + DocumentFile documentFile = DocumentFile.fromTreeUri(activity, uri); if (documentFile != null) { DocumentFile createdDir = documentFile.createDirectory(dirName); return createdDir != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; @@ -344,10 +344,10 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public int contentUriCreateFile(String rootTreeUri, String fileName) { + public static int contentUriCreateFile(Activity activity, String rootTreeUri, String fileName) { try { Uri uri = Uri.parse(rootTreeUri); - DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri); + DocumentFile documentFile = DocumentFile.fromTreeUri(activity, uri); if (documentFile != null) { // TODO: Check the file extension and choose MIME type appropriately. // Or actually, let's not bother. @@ -364,10 +364,10 @@ public class PpssppActivity extends NativeActivity { } @Keep - public int contentUriRemoveFile(String fileName) { + public static int contentUriRemoveFile(Activity activity, String fileName) { try { Uri uri = Uri.parse(fileName); - DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri); + DocumentFile documentFile = DocumentFile.fromSingleUri(activity, uri); if (documentFile != null) { return documentFile.delete() ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } else { @@ -385,11 +385,11 @@ public class PpssppActivity extends NativeActivity { @RequiresApi(Build.VERSION_CODES.N) @Keep @SuppressWarnings("unused") - public int contentUriCopyFile(String srcFileUri, String dstParentDirUri) { + public static int contentUriCopyFile(Activity activity, String srcFileUri, String dstParentDirUri) { try { Uri srcUri = Uri.parse(srcFileUri); Uri dstParentUri = Uri.parse(dstParentDirUri); - return DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; + return DocumentsContract.copyDocument(activity.getContentResolver(), srcUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } catch (Exception e) { Log.e(TAG, "contentUriCopyFile exception: " + e); return STORAGE_ERROR_UNKNOWN; @@ -401,13 +401,13 @@ public class PpssppActivity extends NativeActivity { @RequiresApi(Build.VERSION_CODES.N_MR1) @Keep @SuppressWarnings("unused") - public int contentUriMoveFile(String srcFileUri, String srcParentDirUri, String dstParentDirUri) { + public static int contentUriMoveFile(Activity activity, String srcFileUri, String srcParentDirUri, String dstParentDirUri) { try { Uri srcUri = Uri.parse(srcFileUri); Uri srcParentUri = Uri.parse(srcParentDirUri); Uri dstParentUri = Uri.parse(dstParentDirUri); Log.i(TAG, "DocumentsContract.moveDocument"); - int result = DocumentsContract.moveDocument(getContentResolver(), srcUri, srcParentUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; + int result = DocumentsContract.moveDocument(activity.getContentResolver(), srcUri, srcParentUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; Log.i(TAG, "DocumentsContract.moveDocument done"); return result; } catch (Exception e) { @@ -418,13 +418,13 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public int contentUriRenameFileTo(String fileUri, String newName) { + public static int contentUriRenameFileTo(Activity activity, String fileUri, String newName) { try { Uri uri = Uri.parse(fileUri); // Due to a design flaw, we can't use DocumentFile.renameTo(). // Instead we use the DocumentsContract API directly. // See https://stackoverflow.com/questions/37168200/android-5-0-new-sd-card-access-api-documentfile-renameto-unsupportedoperation. - Uri newUri = DocumentsContract.renameDocument(getContentResolver(), uri, newName); + Uri newUri = DocumentsContract.renameDocument(activity.getContentResolver(), uri, newName); // NOTE: we don't use the returned newUri for anything right now. return STORAGE_ERROR_SUCCESS; } catch (Exception e) { @@ -449,11 +449,11 @@ public class PpssppActivity extends NativeActivity { // Smaller difference now than before I changed that one to a query... @Keep @SuppressWarnings("unused") - public boolean contentUriFileExists(String fileUri) { + public static boolean contentUriFileExists(Activity activity, String fileUri) { Cursor c = null; try { Uri uri = Uri.parse(fileUri); - c = getContentResolver().query(uri, new String[] { DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null); + c = activity.getContentResolver().query(uri, new String[] { DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null); if (c != null) { return c.getCount() > 0; } else { @@ -469,7 +469,7 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public String contentUriGetFileInfo(String fileName) { + public static String contentUriGetFileInfo(Activity activity, String fileName) { String[] projection = { DocumentsContract.Document.COLUMN_DISPLAY_NAME, // index 0 DocumentsContract.Document.COLUMN_SIZE, // index 1 @@ -478,7 +478,7 @@ public class PpssppActivity extends NativeActivity { DocumentsContract.Document.COLUMN_LAST_MODIFIED // index 4 }; - try (Cursor c = getContentResolver().query(Uri.parse(fileName), projection, null, null, null)) { + try (Cursor c = activity.getContentResolver().query(Uri.parse(fileName), projection, null, null, null)) { if (c != null && c.moveToFirst()) { return cursorToString(c); } else { @@ -497,9 +497,9 @@ public class PpssppActivity extends NativeActivity { @RequiresApi(Build.VERSION_CODES.M) @Keep @SuppressWarnings("unused") - public long contentUriGetFreeStorageSpaceSlow(Uri uri) { + public static long contentUriGetFreeStorageSpaceSlow(Activity activity, Uri uri) { try { - ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r"); + ParcelFileDescriptor pfd = activity.getContentResolver().openFileDescriptor(uri, "r"); if (pfd == null) { Log.w(TAG, "Failed to get free storage space from URI: " + uri); return -1; @@ -518,10 +518,10 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public long contentUriGetFreeStorageSpace(String str) { + public static long contentUriGetFreeStorageSpace(Activity activity, String str) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Uri uri = Uri.parse(str); - return contentUriGetFreeStorageSpaceSlow(uri); + return contentUriGetFreeStorageSpaceSlow(activity, uri); } // Too early Android version @@ -531,9 +531,9 @@ public class PpssppActivity extends NativeActivity { @RequiresApi(Build.VERSION_CODES.O) @Keep @SuppressWarnings("unused") - public long filePathGetFreeStorageSpace(String filePath) { + public static long filePathGetFreeStorageSpace(Activity activity, String filePath) { try { - StorageManager storageManager = getApplicationContext().getSystemService(StorageManager.class); + StorageManager storageManager = activity.getApplicationContext().getSystemService(StorageManager.class); File file = new File(filePath); UUID volumeUUID = storageManager.getUuidForPath(file); return storageManager.getAllocatableBytes(volumeUUID); @@ -545,7 +545,7 @@ public class PpssppActivity extends NativeActivity { @Keep @SuppressWarnings("unused") - public boolean isExternalStoragePreservedLegacy() { + public static boolean isExternalStoragePreservedLegacy() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // In 29 and later, we can check whether we got preserved storage legacy. return Environment.isExternalStorageLegacy(); diff --git a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java index fac6fe66a4..568089efbc 100644 --- a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java +++ b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java @@ -12,6 +12,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.util.Log; + +import androidx.annotation.NonNull; + import java.io.File; /** @@ -71,11 +74,11 @@ public class ShortcutActivity extends Activity { finish(); } - public static native String queryGameName(String path); - public static native byte[] queryGameIcon(String path); + public static native String queryGameName(Activity activity, String path); + public static native byte[] queryGameIcon(Activity activity, String path); // Create shortcut as response for ACTION_CREATE_SHORTCUT intent. - private void respondToShortcutRequest(Uri uri) { + private void respondToShortcutRequest(@NonNull Uri uri) { // This is Intent that will be sent when user execute our shortcut on // homescreen. Set our app as target Context. Set Main activity as // target class. Add any parameter as data. @@ -113,7 +116,7 @@ public class ShortcutActivity extends Activity { String name = pathSegments[pathSegments.length - 1]; PpssppActivity.CheckABIAndLoadLibrary(); - String gameName = queryGameName(path); + String gameName = queryGameName(this, path); byte [] iconData = null; if (gameName.isEmpty()) { Log.i(TAG, "Failed to retrieve game name - ignoring."); @@ -122,7 +125,7 @@ public class ShortcutActivity extends Activity { // return; } else { name = gameName; - iconData = queryGameIcon(path); + iconData = queryGameIcon(this, path); } Log.i(TAG, "Game name: " + name + " : Creating shortcut to " + uri);