diff options
| -rw-r--r-- | core/java/android/speech/RecognitionService.java | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index e9efb9dd8afb..a6ec399e7d30 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -115,20 +115,28 @@ public abstract class RecognitionService extends Service { @NonNull AttributionSource attributionSource) { try { if (mCurrentCallback == null) { - if (DBG) { - Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder()); - } - mCurrentCallback = new Callback(listener, attributionSource); - - boolean preflightPermissionCheckPassed = - checkPermissionForPreflight(); + 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()); + } + mCurrentCallback = new Callback(listener, attributionSource, + attributionContext); RecognitionService.this.onStartListening(intent, mCurrentCallback); } + if (!preflightPermissionCheckPassed || !checkPermissionAndStartDataDelivery()) { listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS); - RecognitionService.this.onCancel(mCurrentCallback); - dispatchClearCallback(); + 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() { |