diff options
author | 2023-03-23 17:05:01 +0000 | |
---|---|---|
committer | 2023-03-23 17:05:01 +0000 | |
commit | aec171251864334d43c3fd14fe10f8bc9f45b535 (patch) | |
tree | dd99a9d4a73a11eda61c1547daba945f0cac2ea2 /java/src | |
parent | 90aab48da1198be6a154412b3cd9a44cf97b7764 (diff) |
Terminate refinement on back-out w/ no result
Bug: 273864843
Test: manually tested back-out behavior with a custom refinement
activity that calls `finish()` on launch. Ran CTS &
`IntentResolverUnitTests` to confirm no regressions in the normal
refinement flow. (Also noted that this condition *isn't* triggered
when we finish after sending a valid RESULT_OK refinement. That's not
really required for correctness, but it's still simpler/preferable
that way, so it was a relief to confirm.)
Change-Id: I165c958e3633430006b7977faa7617a3f87b1092
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/com/android/intentresolver/ChooserActivity.java | 9 | ||||
-rw-r--r-- | java/src/com/android/intentresolver/ChooserRefinementManager.java | 10 |
2 files changed, 19 insertions, 0 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 71a94e11..34278065 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -620,6 +620,15 @@ public class ChooserActivity extends ResolverActivity implements super.onResume(); Log.d(TAG, "onResume: " + getComponentName().flattenToShortString()); maybeCancelFinishAnimation(); + + if (mRefinementManager.isAwaitingRefinementResult()) { + // This can happen if the refinement activity terminates without ever sending a response + // to our `ResultReceiver`. We're probably not prepared to return the user into a valid + // Chooser session, so we'll treat it as a cancellation instead. + Log.w(TAG, "Chooser resumed while awaiting refinement result; aborting"); + mRefinementManager.destroy(); + finish(); + } } @Override diff --git a/java/src/com/android/intentresolver/ChooserRefinementManager.java b/java/src/com/android/intentresolver/ChooserRefinementManager.java index 72b5305d..8d7b1aac 100644 --- a/java/src/com/android/intentresolver/ChooserRefinementManager.java +++ b/java/src/com/android/intentresolver/ChooserRefinementManager.java @@ -67,6 +67,16 @@ public final class ChooserRefinementManager { } /** + * @return whether a refinement session has been initiated (i.e., an earlier call to + * {@link #maybeHandleSelection(TargetInfo)} returned true), and isn't yet complete. The session + * is complete if the refinement activity calls {@link ResultReceiver#onResultReceived()} (with + * any result), or if it's cancelled on our side by {@link ChooserRefinementManager#destroy()}. + */ + public boolean isAwaitingRefinementResult() { + return (mRefinementResultReceiver != null); + } + + /** * Delegate the user's {@code selectedTarget} to the refinement flow, if possible. * @return true if the selection should wait for a now-started refinement flow, or false if it * can proceed by the default (non-refinement) logic. |