Resolver - Fix NGA (voice interaction) crash in resolver
A race condition existed whereby placeholder targets were attempting
to be published without any target information, due to bg thread
processing of resolved intents. Detect this scenario, and wait. Also
have SysUI ChooserActivity accept voice interactions in the intent
filter. Does not use DEFAULT category, as it should only ever be used
by explicit intents.
Bug: 139729579
Test: atest ResolverActivityTest
Change-Id: If8fc0c3595da47c26b1edab75bd6fc82a6dcb35e
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 58ce03b..407a85f 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -361,9 +361,6 @@
initSuspendedColorMatrix();
- if (isVoiceInteraction()) {
- onSetupVoiceInteraction();
- }
final Set<String> categories = intent.getCategories();
MetricsLogger.action(this, mAdapter.hasFilteredItem()
? MetricsProto.MetricsEvent.ACTION_SHOW_APP_DISAMBIG_APP_FEATURED
@@ -442,24 +439,21 @@
mSuspendedMatrixColorFilter = new ColorMatrixColorFilter(matrix);
}
- /**
- * Perform any initialization needed for voice interaction.
- */
- public void onSetupVoiceInteraction() {
- // Do it right now. Subclasses may delay this and send it later.
- sendVoiceChoicesIfNeeded();
- }
-
public void sendVoiceChoicesIfNeeded() {
if (!isVoiceInteraction()) {
// Clearly not needed.
return;
}
-
final Option[] options = new Option[mAdapter.getCount()];
for (int i = 0, N = options.length; i < N; i++) {
- options[i] = optionForChooserTarget(mAdapter.getItem(i), i);
+ TargetInfo target = mAdapter.getItem(i);
+ if (target == null) {
+ // If this occurs, a new set of targets is being loaded. Let that complete,
+ // and have the next call to send voice choices proceed instead.
+ return;
+ }
+ options[i] = optionForChooserTarget(target, i);
}
mPickOptionRequest = new PickTargetOptionRequest(
@@ -1872,7 +1866,7 @@
}
}
-
+ sendVoiceChoicesIfNeeded();
postListReadyRunnable();
}