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
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user