From aec171251864334d43c3fd14fe10f8bc9f45b535 Mon Sep 17 00:00:00 2001 From: Joshua Trask Date: Thu, 23 Mar 2023 17:05:01 +0000 Subject: 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 --- java/src/com/android/intentresolver/ChooserActivity.java | 9 +++++++++ .../com/android/intentresolver/ChooserRefinementManager.java | 10 ++++++++++ 2 files changed, 19 insertions(+) (limited to 'java/src') 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 @@ -66,6 +66,16 @@ public final class ChooserRefinementManager { mOnRefinementCancelled = onRefinementCancelled; } + /** + * @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 -- cgit v1.2.3-59-g8ed1b