summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/speech/RecognitionService.java39
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() {