speech: Wire calling in uid on support callback
This is to keep support call parallel to startListening
Bug: 268475583
Test: cts
Change-Id: I07882b69296acdf19f4e6a49a40c0bed38235934
diff --git a/core/api/current.txt b/core/api/current.txt
index 9e4c958..e02d061 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -40804,9 +40804,11 @@
method public final android.os.IBinder onBind(android.content.Intent);
method protected abstract void onCancel(android.speech.RecognitionService.Callback);
method public void onCheckRecognitionSupport(@NonNull android.content.Intent, @NonNull android.speech.RecognitionService.SupportCallback);
+ method public void onCheckRecognitionSupport(@NonNull android.content.Intent, @NonNull android.content.AttributionSource, @NonNull android.speech.RecognitionService.SupportCallback);
method protected abstract void onStartListening(android.content.Intent, android.speech.RecognitionService.Callback);
method protected abstract void onStopListening(android.speech.RecognitionService.Callback);
method public void onTriggerModelDownload(@NonNull android.content.Intent);
+ method public void onTriggerModelDownload(@NonNull android.content.Intent, @NonNull android.content.AttributionSource);
field public static final String SERVICE_INTERFACE = "android.speech.RecognitionService";
field public static final String SERVICE_META_DATA = "android.speech";
}
diff --git a/core/java/android/speech/IRecognitionService.aidl b/core/java/android/speech/IRecognitionService.aidl
index ad3ad7a..cc64c45 100644
--- a/core/java/android/speech/IRecognitionService.aidl
+++ b/core/java/android/speech/IRecognitionService.aidl
@@ -67,12 +67,15 @@
* given recognizerIntent. For more information see {@link #startListening} and
* {@link RecognizerIntent}.
*/
- void checkRecognitionSupport(in Intent recognizerIntent, in IRecognitionSupportCallback listener);
+ void checkRecognitionSupport(
+ in Intent recognizerIntent,
+ in AttributionSource attributionSource,
+ in IRecognitionSupportCallback listener);
/**
* Requests RecognitionService to download the support for the given recognizerIntent. For more
* information see {@link #checkRecognitionSupport}, {@link #startListening} and
* {@link RecognizerIntent}.
*/
- void triggerModelDownload(in Intent recognizerIntent);
+ void triggerModelDownload(in Intent recognizerIntent, in AttributionSource attributionSource);
}
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index 1cc772a..13c9f20 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -110,13 +110,14 @@
dispatchClearCallback((IRecognitionListener) msg.obj);
break;
case MSG_CHECK_RECOGNITION_SUPPORT:
- Pair<Intent, IRecognitionSupportCallback> intentAndListener =
- (Pair<Intent, IRecognitionSupportCallback>) msg.obj;
+ CheckRecognitionSupportArgs checkArgs = (CheckRecognitionSupportArgs) msg.obj;
dispatchCheckRecognitionSupport(
- intentAndListener.first, intentAndListener.second);
+ checkArgs.mIntent, checkArgs.callback, checkArgs.mAttributionSource);
break;
case MSG_TRIGGER_MODEL_DOWNLOAD:
- dispatchTriggerModelDownload((Intent) msg.obj);
+ Pair<Intent, AttributionSource> params =
+ (Pair<Intent, AttributionSource>) msg.obj;
+ dispatchTriggerModelDownload(params.first, params.second);
break;
}
}
@@ -211,12 +212,18 @@
}
private void dispatchCheckRecognitionSupport(
- Intent intent, IRecognitionSupportCallback callback) {
- RecognitionService.this.onCheckRecognitionSupport(intent, new SupportCallback(callback));
+ Intent intent, IRecognitionSupportCallback callback,
+ AttributionSource attributionSource) {
+ RecognitionService.this.onCheckRecognitionSupport(
+ intent,
+ attributionSource,
+ new SupportCallback(callback));
}
- private void dispatchTriggerModelDownload(Intent intent) {
- RecognitionService.this.onTriggerModelDownload(intent);
+ private void dispatchTriggerModelDownload(
+ Intent intent,
+ AttributionSource attributionSource) {
+ RecognitionService.this.onTriggerModelDownload(intent, attributionSource);
}
private static class StartListeningArgs {
@@ -233,6 +240,21 @@
}
}
+ private static class CheckRecognitionSupportArgs {
+ public final Intent mIntent;
+ public final IRecognitionSupportCallback callback;
+ public final AttributionSource mAttributionSource;
+
+ private CheckRecognitionSupportArgs(
+ Intent intent,
+ IRecognitionSupportCallback callback,
+ AttributionSource attributionSource) {
+ this.mIntent = intent;
+ this.callback = callback;
+ this.mAttributionSource = attributionSource;
+ }
+ }
+
/**
* Notifies the service that it should start listening for speech.
*
@@ -298,6 +320,26 @@
}
/**
+ * Queries the service on whether it would support a {@link #onStartListening(Intent, Callback)}
+ * for the same {@code recognizerIntent}.
+ *
+ * <p>The service will notify the caller about the level of support or error via
+ * {@link SupportCallback}.
+ *
+ * <p>If the service does not offer the support check it will notify the caller with
+ * {@link SpeechRecognizer#ERROR_CANNOT_CHECK_SUPPORT}.
+ *
+ * <p>Provides the calling AttributionSource to the service implementation so that permissions
+ * and bandwidth could be correctly blamed.</p>
+ */
+ public void onCheckRecognitionSupport(
+ @NonNull Intent recognizerIntent,
+ @NonNull AttributionSource attributionSource,
+ @NonNull SupportCallback supportCallback) {
+ onCheckRecognitionSupport(recognizerIntent, supportCallback);
+ }
+
+ /**
* Requests the download of the recognizer support for {@code recognizerIntent}.
*/
public void onTriggerModelDownload(@NonNull Intent recognizerIntent) {
@@ -306,6 +348,18 @@
}
}
+ /**
+ * Requests the download of the recognizer support for {@code recognizerIntent}.
+ *
+ * <p>Provides the calling AttributionSource to the service implementation so that permissions
+ * and bandwidth could be correctly blamed.</p>
+ */
+ public void onTriggerModelDownload(
+ @NonNull Intent recognizerIntent,
+ @NonNull AttributionSource attributionSource) {
+ onTriggerModelDownload(recognizerIntent);
+ }
+
@Override
@SuppressLint("MissingNullability")
public Context createContext(@NonNull ContextParams contextParams) {
@@ -524,7 +578,8 @@
public static class SupportCallback {
private final IRecognitionSupportCallback mCallback;
- private SupportCallback(IRecognitionSupportCallback callback) {
+ private SupportCallback(
+ IRecognitionSupportCallback callback) {
this.mCallback = callback;
}
@@ -596,22 +651,27 @@
@Override
public void checkRecognitionSupport(
- Intent recognizerIntent, IRecognitionSupportCallback callback) {
+ Intent recognizerIntent,
+ @NonNull AttributionSource attributionSource,
+ IRecognitionSupportCallback callback) {
final RecognitionService service = mServiceRef.get();
if (service != null) {
service.mHandler.sendMessage(
Message.obtain(service.mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
- Pair.create(recognizerIntent, callback)));
+ new CheckRecognitionSupportArgs(
+ recognizerIntent, callback, attributionSource)));
}
}
@Override
- public void triggerModelDownload(Intent recognizerIntent) {
+ public void triggerModelDownload(
+ Intent recognizerIntent, @NonNull AttributionSource attributionSource) {
final RecognitionService service = mServiceRef.get();
if (service != null) {
service.mHandler.sendMessage(
Message.obtain(
- service.mHandler, MSG_TRIGGER_MODEL_DOWNLOAD, recognizerIntent));
+ service.mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
+ Pair.create(recognizerIntent, attributionSource)));
}
}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index bcb8005..99f573c 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -652,6 +652,7 @@
try {
mService.checkRecognitionSupport(
recognizerIntent,
+ mContext.getAttributionSource(),
new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
if (DBG) Log.d(TAG, "service support command succeeded");
} catch (final RemoteException e) {
@@ -665,7 +666,7 @@
return;
}
try {
- mService.triggerModelDownload(recognizerIntent);
+ mService.triggerModelDownload(recognizerIntent, mContext.getAttributionSource());
} catch (final RemoteException e) {
Log.e(TAG, "downloadModel() failed", e);
mListener.onError(ERROR_CLIENT);
diff --git a/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java b/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java
index 411b2fa..7e05951 100644
--- a/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java
+++ b/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java
@@ -234,7 +234,9 @@
void checkRecognitionSupport(
Intent recognizerIntent,
+ AttributionSource attributionSource,
IRecognitionSupportCallback callback) {
+
if (!mConnected) {
try {
callback.onError(SpeechRecognizer.ERROR_SERVER_DISCONNECTED);
@@ -244,15 +246,16 @@
}
return;
}
- run(service -> service.checkRecognitionSupport(recognizerIntent, callback));
+ run(service ->
+ service.checkRecognitionSupport(recognizerIntent, attributionSource, callback));
}
- void triggerModelDownload(Intent recognizerIntent) {
+ void triggerModelDownload(Intent recognizerIntent, AttributionSource attributionSource) {
if (!mConnected) {
Slog.e(TAG, "#downloadModel failed due to connection.");
return;
}
- run(service -> service.triggerModelDownload(recognizerIntent));
+ run(service -> service.triggerModelDownload(recognizerIntent, attributionSource));
}
void shutdown(IBinder clientToken) {
diff --git a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
index e245c08..6aa600a 100644
--- a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
@@ -183,13 +183,17 @@
@Override
public void checkRecognitionSupport(
Intent recognizerIntent,
+ AttributionSource attributionSource,
IRecognitionSupportCallback callback) {
- service.checkRecognitionSupport(recognizerIntent, callback);
+ service.checkRecognitionSupport(
+ recognizerIntent, attributionSource, callback);
}
@Override
- public void triggerModelDownload(Intent recognizerIntent) {
- service.triggerModelDownload(recognizerIntent);
+ public void triggerModelDownload(
+ Intent recognizerIntent,
+ AttributionSource attributionSource) {
+ service.triggerModelDownload(recognizerIntent, attributionSource);
}
});
} catch (RemoteException e) {