summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
author Joshua Trask <joshtrask@google.com> 2023-03-23 17:05:01 +0000
committer Joshua Trask <joshtrask@google.com> 2023-03-23 17:05:01 +0000
commitaec171251864334d43c3fd14fe10f8bc9f45b535 (patch)
treedd99a9d4a73a11eda61c1547daba945f0cac2ea2 /java/src
parent90aab48da1198be6a154412b3cd9a44cf97b7764 (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.java9
-rw-r--r--java/src/com/android/intentresolver/ChooserRefinementManager.java10
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.