WIP: Turn the methods into static methods.

This commit is contained in:
Henrik Rydgård committed 2025-09-05 10:31:27 +02:00
1 parent 7df5941531
commit 2a7dad43c6
4 files changed
+73 -68

No files matched your search

+27 -26
View File
@@ -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<jclass>(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<File::FileInfo> 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<File::FileInfo> 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) {
+7 -6
View File
@@ -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()
@@ -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<String> 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();
@@ -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);