From 6978614aeb7901b6269405240a70bd1b71bd5608 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 1 Jul 2021 14:49:14 -0700 Subject: [PATCH] Cancel RecognitionService if permission check fails This ensures that, when platform checks fail, the RecognitionService is notified that it should cancel recognition Fixes: 190848702 Test: manual Change-Id: I5073728e544a47f386824ca0a034e149661d864a --- core/java/android/speech/RecognitionService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index 8b4c0d9e21f5d..8fb999e2aeab3 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -120,9 +120,15 @@ public abstract class RecognitionService extends Service { } mCurrentCallback = new Callback(listener, attributionSource); - RecognitionService.this.onStartListening(intent, mCurrentCallback); - if (!checkPermissionAndStartDataDelivery()) { + boolean preflightPermissionCheckPassed = + checkPermissionForPreflight(); + if (preflightPermissionCheckPassed) { + RecognitionService.this.onStartListening(intent, mCurrentCallback); + } + if (!preflightPermissionCheckPassed || !checkPermissionAndStartDataDelivery()) { listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS); + RecognitionService.this.onCancel(mCurrentCallback); + dispatchClearCallback(); Log.i(TAG, "caller doesn't have permission:" + Manifest.permission.RECORD_AUDIO); } @@ -459,6 +465,12 @@ public abstract class RecognitionService extends Service { return mStartedDataDelivery; } + private boolean checkPermissionForPreflight() { + return PermissionChecker.checkPermissionForPreflight(RecognitionService.this, + Manifest.permission.RECORD_AUDIO, mCurrentCallback.getAttributionContextForCaller() + .getAttributionSource()) == PermissionChecker.PERMISSION_GRANTED; + } + void finishDataDelivery() { if (mStartedDataDelivery) { mStartedDataDelivery = false;