Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 553d8a4d authored by Matt Pietal's avatar Matt Pietal
Browse files

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
(cherry picked from commit 2cf4c6c3)
parent 400db4bf
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -1666,10 +1666,6 @@ public class ChooserActivity extends ResolverActivity {
        mServiceConnections.clear();
    }

    public void onSetupVoiceInteraction() {
        // Do nothing. We'll send the voice stuff ourselves.
    }

    private void logDirectShareTargetReceived(int logCategory) {
        final long queryTime =
                logCategory == MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_SHORTCUT_MANAGER
+8 −14
Original line number Diff line number Diff line
@@ -361,9 +361,6 @@ public class ResolverActivity extends Activity {

        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 @@ public class ResolverActivity extends Activity {
        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 @@ public class ResolverActivity extends Activity {
                }
            }


            sendVoiceChoicesIfNeeded();
            postListReadyRunnable();
        }

+4 −0
Original line number Diff line number Diff line
@@ -609,6 +609,10 @@
                android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
                android:process=":ui"
                android:visibleToInstantApps="true">
            <intent-filter>
                <action android:name="android.intent.action.CHOOSER" />
                <category android:name="android.intent.category.VOICE" />
            </intent-filter>
        </activity>

        <!-- Doze with notifications, run in main sysui process for every user  -->