mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-14 11:01:38 +00:00
Enable using the folder browser on Android to select SD card through a gross hack.
Should help #13827 Not yet using storage framework properly, just stealing the URI.
This commit is contained in:
parent
401d9ca469
commit
db545ac034
@ -1215,21 +1215,33 @@ void MainScreen::sendMessage(const char *message, const char *value) {
|
||||
if (!strcmp(message, "browse_folderSelect")) {
|
||||
std::string filename;
|
||||
#if PPSSPP_PLATFORM(ANDROID)
|
||||
// Hacky way to get a normal path from a Android Storage Framework path.
|
||||
// Is not gonna work forever, but ship-hack for 1.11.
|
||||
std::string url = value;
|
||||
const char *prefix = "content://com.android.externalstorage.documents/tree/";
|
||||
const char *primaryPrefix = "/storage/primary/";
|
||||
if (startsWith(url, prefix)) {
|
||||
url = url.substr(strlen(prefix));
|
||||
url = UriDecode(url);
|
||||
url = UriDecode(url.substr(strlen(prefix)));
|
||||
size_t colonPos = url.find(":");
|
||||
if (colonPos != std::string::npos) {
|
||||
url[colonPos] = '/';
|
||||
}
|
||||
url = "/storage/" + url;
|
||||
if (startsWith(url, primaryPrefix)) {
|
||||
url = g_Config.memStickDirectory + url.substr(strlen(primaryPrefix));
|
||||
}
|
||||
INFO_LOG(SYSTEM, "Translated '%s' into '%s'", value, url.c_str());
|
||||
} else {
|
||||
// It's not gonna work.
|
||||
// TODO: Show an error message?
|
||||
INFO_LOG(SYSTEM, "Failed to parse content string: '%s'", value);
|
||||
return;
|
||||
}
|
||||
filename = url;
|
||||
#else
|
||||
filename = value;
|
||||
#endif
|
||||
INFO_LOG(SYSTEM, "Got folder: %s", filename.c_str());
|
||||
INFO_LOG(SYSTEM, "Got folder: '%s'", filename.c_str());
|
||||
int tab = tabHolder_->GetCurrentTab();
|
||||
if (tab >= 0 && tab < (int)gameBrowsers_.size()) {
|
||||
gameBrowsers_[tab]->SetPath(filename);
|
||||
|
@ -430,9 +430,9 @@ bool System_GetPropertyBool(SystemProperty prop) {
|
||||
case SYSPROP_HAS_IMAGE_BROWSER:
|
||||
return true;
|
||||
case SYSPROP_HAS_FILE_BROWSER:
|
||||
return true;
|
||||
return false; // We kind of have but needs more work.
|
||||
case SYSPROP_HAS_FOLDER_BROWSER:
|
||||
// Uses OPEN_DOCUMENT_TREE
|
||||
// Uses OPEN_DOCUMENT_TREE to let you select a folder.
|
||||
return androidVersion >= 21;
|
||||
case SYSPROP_APP_GOLD:
|
||||
#ifdef GOLD
|
||||
|
@ -1149,8 +1149,9 @@ public abstract class NativeActivity extends Activity {
|
||||
Uri selectedFile = data.getData();
|
||||
if (selectedFile != null) {
|
||||
// Convert URI to normal path. (This might not be possible in Android 12+)
|
||||
// NativeApp.sendMessage("browse_folderSelect", selectedFile.toString());
|
||||
Log.i(TAG, "Browse folder finished: " + selectedFile.toString());
|
||||
String path = selectedFile.toString();
|
||||
Log.i(TAG, "Browse folder finished: " + path);
|
||||
NativeApp.sendMessage("browse_folderSelect", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1297,11 +1298,12 @@ public abstract class NativeActivity extends Activity {
|
||||
} else if (command.equals("browse_folder")) {
|
||||
try {
|
||||
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
|
||||
// intent.setType("application/octet-stream");
|
||||
// intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
|
||||
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); // not yet used properly
|
||||
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); // Only allow local folders.
|
||||
startActivityForResult(intent, RESULT_OPEN_DOCUMENT_TREE);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.toString());
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user