summaryrefslogtreecommitdiff
path: root/java/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com')
-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.