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:
Nate Myren
2021-07-02 09:30:43 -07:00
parent 9e3ce77cca
commit 6c7dac39d5

View File

@@ -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() {