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

Commit 6c7dac39 authored by Nate Myren's avatar Nate Myren
Browse files

Avoid creating Recognition Callback if preflight fails

Only create the callback (and call onCancel) if the preflight permission
check succeeds.

Bug: 190848702
Test: manual
Change-Id: Ie7155348213e86dea0a9080a9c4ed53144f91c6f
parent 9e3ce77c
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -115,20 +115,28 @@ public abstract class RecognitionService extends Service {
            @NonNull AttributionSource attributionSource) {
        try {
            if (mCurrentCallback == null) {
                Context attributionContext = createContext(new ContextParams.Builder()
                        .setNextAttributionSource(attributionSource)
                        .build());
                boolean preflightPermissionCheckPassed = checkPermissionForPreflight(
                        attributionContext.getAttributionSource());
                if (preflightPermissionCheckPassed) {
                    if (DBG) {
                    Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
                        Log.d(TAG, "created new mCurrentCallback, listener = "
                                + listener.asBinder());
                    }
                mCurrentCallback = new Callback(listener, attributionSource);

                boolean preflightPermissionCheckPassed =
                        checkPermissionForPreflight();
                if (preflightPermissionCheckPassed) {
                    mCurrentCallback = new Callback(listener, attributionSource,
                            attributionContext);
                    RecognitionService.this.onStartListening(intent, mCurrentCallback);
                }

                if (!preflightPermissionCheckPassed || !checkPermissionAndStartDataDelivery()) {
                    listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS);
                    if (preflightPermissionCheckPassed) {
                        // If we attempted to start listening, cancel the callback
                        RecognitionService.this.onCancel(mCurrentCallback);
                        dispatchClearCallback();
                    }
                    Log.i(TAG, "caller doesn't have permission:"
                            + Manifest.permission.RECORD_AUDIO);
                }
@@ -285,8 +293,15 @@ public abstract class RecognitionService extends Service {

        private Callback(IRecognitionListener listener,
                @NonNull AttributionSource attributionSource) {
            this(listener, attributionSource, null);
        }

        private Callback(IRecognitionListener listener,
                @NonNull AttributionSource attributionSource,
                @Nullable Context attributionContext) {
            mListener = listener;
            mCallingAttributionSource = attributionSource;
            mAttributionContext = attributionContext;
        }

        /**
@@ -466,10 +481,10 @@ public abstract class RecognitionService extends Service {
        return mStartedDataDelivery;
    }

    private boolean checkPermissionForPreflight() {
    private boolean checkPermissionForPreflight(AttributionSource attributionSource) {
        return PermissionChecker.checkPermissionForPreflight(RecognitionService.this,
                Manifest.permission.RECORD_AUDIO, mCurrentCallback.getAttributionContextForCaller()
                        .getAttributionSource()) == PermissionChecker.PERMISSION_GRANTED;
                Manifest.permission.RECORD_AUDIO, attributionSource)
                == PermissionChecker.PERMISSION_GRANTED;
    }

    void finishDataDelivery() {