Skip to content

Commit

Permalink
Android: Simplify handling of dialog requests even more.
Browse files Browse the repository at this point in the history
To protect against disappearing activities or whatever is causing the
lost value, I could make it static, but instead I just pack the two
values together into the requestCode.

Will hopefully help the main issue from #17683
  • Loading branch information
hrydgard committed Jul 15, 2023
1 parent a679915 commit 306be6e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 26 deletions.
1 change: 1 addition & 0 deletions UI/RetroAchievementScreens.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,7 @@ void GameAchievementSummaryView::Draw(UIContext &dc) {
}

void GameAchievementSummaryView::GetContentDimensions(const UIContext &dc, float &w, float &h) const {
// Somehow wrong!
MeasureGameAchievementSummary(dc, &w, &h);
}

Expand Down
62 changes: 36 additions & 26 deletions android/src/org/ppsspp/ppsspp/NativeActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,6 @@ public abstract class NativeActivity extends Activity {
private static final int RESULT_OPEN_DOCUMENT = 102;
private static final int RESULT_OPEN_DOCUMENT_TREE = 103;

private int lastRequestId = -1000;

// Allow for multiple connected gamepads but just consider them the same for now.
// Actually this is not entirely true, see the code.
private ArrayList<InputDeviceState> inputPlayers = new ArrayList<InputDeviceState>();
Expand Down Expand Up @@ -1126,18 +1124,27 @@ public boolean onKeyUp(int keyCode, KeyEvent event) {
}
}

static int packResultCode(int requestCode, int requestId) {
return (requestCode << 16) | (requestId & 0xFFFF);
}
static int getRequestCode(int packedResult) {
return packedResult >> 16; // This will sign-extend, just like we want.
}
static int getRequestId(int packedResult) {
return packedResult & 0xFFFF; // The requestID is unsigned, so this is fine.
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
protected void onActivityResult(int packedRequest, int resultCode, Intent data) {
super.onActivityResult(packedRequest, resultCode, data);

if (lastRequestId < 0) {
NativeApp.reportError("onActivityResult: No or bad pending request (" + lastRequestId + "). RequestCode=" + requestCode + " ResultCode = " + resultCode);
return;
}
int requestCode = getRequestCode(packedRequest);
int requestId = getRequestId(packedRequest);

Log.i(TAG, "onActivityResult: requestCode=" + requestCode + " requestId = " + requestId + " resultCode = " + resultCode);

if (resultCode != RESULT_OK || data == null) {
NativeApp.sendRequestResult(lastRequestId, false, "", resultCode);
lastRequestId = -2;
NativeApp.sendRequestResult(requestId, false, "", resultCode);
return;
}

Expand All @@ -1146,7 +1153,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Uri selectedImage = data.getData();
if (selectedImage != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NativeApp.sendRequestResult(lastRequestId, true, selectedImage.toString(), 0);
NativeApp.sendRequestResult(requestId, true, selectedImage.toString(), 0);
} else {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
Expand All @@ -1155,7 +1162,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
NativeApp.sendRequestResult(lastRequestId, true, picturePath, 0);
NativeApp.sendRequestResult(requestId, true, picturePath, 0);
}
}
}
Expand All @@ -1169,13 +1176,12 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
} catch (Exception e) {
Log.w(TAG, "Exception getting permissions for document: " + e.toString());
NativeApp.sendRequestResult(lastRequestId, false, "", 0);
NativeApp.sendRequestResult(requestId, false, "", 0);
NativeApp.reportException(e, selectedFile.toString());
lastRequestId = -3;
return;
}
Log.i(TAG, "Browse file finished:" + selectedFile.toString());
NativeApp.sendRequestResult(lastRequestId, true, selectedFile.toString(), 0);
NativeApp.sendRequestResult(requestId, true, selectedFile.toString(), 0);
}
} else if (requestCode == RESULT_OPEN_DOCUMENT_TREE) {
Uri selectedDirectoryUri = data.getData();
Expand All @@ -1194,18 +1200,17 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
DocumentFile documentFile = DocumentFile.fromTreeUri(this, selectedDirectoryUri);
Log.i(TAG, "Chosen document name: " + documentFile.getUri());
NativeApp.sendRequestResult(lastRequestId, true, documentFile.getUri().toString(), 0);
NativeApp.sendRequestResult(requestId, true, documentFile.getUri().toString(), 0);
}
} else {
Toast.makeText(getApplicationContext(), "Bad request code: " + requestCode, Toast.LENGTH_LONG).show();
NativeApp.sendRequestResult(lastRequestId, false, null, resultCode);
NativeApp.sendRequestResult(requestId, false, null, resultCode);
// Can't send a sensible request result back to the app without a requestCode
}
} catch (Exception e) {
NativeApp.reportException(e, "(function level)");
NativeApp.sendRequestResult(lastRequestId, false, null, resultCode);
NativeApp.sendRequestResult(requestId, false, null, resultCode);
}
lastRequestId = -4;
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
Expand Down Expand Up @@ -1357,10 +1362,11 @@ public boolean processCommand(String command, String params) {
}
} else if (command.equals("browse_image")) {
try {
lastRequestId = Integer.parseInt(params);
Log.i(TAG, "image request ID: " + lastRequestId);
int requestId = Integer.parseInt(params);
int packedResultCode = packResultCode(RESULT_LOAD_IMAGE, requestId);
Log.i(TAG, "image request ID: " + requestId + " packed: " + packedResultCode);
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
startActivityForResult(i, packedResultCode);
return true;
} catch (Exception e) { // For example, android.content.ActivityNotFoundException
NativeApp.reportException(e, params);
Expand All @@ -1369,15 +1375,17 @@ public boolean processCommand(String command, String params) {
}
} else if (command.equals("browse_file")) {
try {
lastRequestId = Integer.parseInt(params);
int requestId = Integer.parseInt(params);
int packedResultCode = packResultCode(RESULT_OPEN_DOCUMENT, requestId);
Log.i(TAG, "browse_file request ID: " + requestId + " packed: " + packedResultCode);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
// Possible alternative approach:
// String[] mimeTypes = {"application/octet-stream", "/x-iso9660-image"};
// intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
startActivityForResult(intent, RESULT_OPEN_DOCUMENT);
startActivityForResult(intent, packedResultCode);
// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri);
} catch (Exception e) {
NativeApp.reportException(e, params);
Expand All @@ -1386,13 +1394,15 @@ public boolean processCommand(String command, String params) {
}
} else if (command.equals("browse_folder")) {
try {
lastRequestId = Integer.parseInt(params);
int requestId = Integer.parseInt(params);
int packedResultCode = packResultCode(RESULT_OPEN_DOCUMENT_TREE, requestId);
Log.i(TAG, "browse_folder request ID: " + requestId + " packed: " + packedResultCode);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); // Only allow local folders.
startActivityForResult(intent, RESULT_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, packedResultCode);
return true;
} catch (Exception e) {
NativeApp.reportException(e, params);
Expand Down

0 comments on commit 306be6e

Please sign in to comment.