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:
Henrik Rydgård 2021-01-09 01:26:53 +01:00
parent 401d9ca469
commit db545ac034
3 changed files with 24 additions and 10 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;