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

Commit b81695c8 authored by Nate Myren's avatar Nate Myren Committed by Automerger Merge Worker
Browse files

Merge "Avoid creating Recognition Callback if preflight fails" into sc-dev am:...

Merge "Avoid creating Recognition Callback if preflight fails" into sc-dev am: 243bce62 am: bb7102e2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15185845

Change-Id: Ib31cb69d779f916856fc79bb06861b8496cf71f2
parents 8af1b8b7 bb7102e2
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() {