diff --git a/core/java/android/service/voice/HotwordDetectionService.java b/core/java/android/service/voice/HotwordDetectionService.java index 567ee2f65565a..a43523974480f 100644 --- a/core/java/android/service/voice/HotwordDetectionService.java +++ b/core/java/android/service/voice/HotwordDetectionService.java @@ -200,6 +200,11 @@ public abstract class HotwordDetectionService extends Service { HotwordDetectionService.this, manager, options); } + @Override + public void ping(IRemoteCallback callback) throws RemoteException { + callback.sendResult(null); + } + @Override public void stopDetection() { HotwordDetectionService.this.onStopDetection(); diff --git a/core/java/android/service/voice/IHotwordDetectionService.aidl b/core/java/android/service/voice/IHotwordDetectionService.aidl index d7ed67812e877..f2a93f1009866 100644 --- a/core/java/android/service/voice/IHotwordDetectionService.aidl +++ b/core/java/android/service/voice/IHotwordDetectionService.aidl @@ -57,5 +57,11 @@ oneway interface IHotwordDetectionService { in IContentCaptureManager contentCaptureManager, in ContentCaptureOptions options); + /** + * Simply requests the service to trigger the callback, so that the system can check its + * identity. + */ + void ping(in IRemoteCallback callback); + void stopDetection(); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index fc10fb1042623..e80dc827c3fd1 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -164,15 +164,7 @@ final class HotwordDetectionConnection { public void sendResult(Bundle bundle) throws RemoteException { if (DEBUG) { Slog.d(TAG, "updateState finish"); - Slog.d(TAG, "updating hotword UID " + Binder.getCallingUid()); } - // TODO: Do this earlier than this callback and have the provider point to the - // current state stored in VoiceInteractionManagerServiceImpl. - final int uid = Binder.getCallingUid(); - LocalServices.getService(PermissionManagerServiceInternal.class) - .setHotwordDetectionServiceProvider(() -> uid); - mIdentity = - new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid); future.complete(null); if (mUpdateStateAfterStartFinished.getAndSet(true)) { Slog.w(TAG, "call callback after timeout"); @@ -679,6 +671,7 @@ final class HotwordDetectionConnection { updateAudioFlinger(connection); updateContentCaptureManager(connection); + updateServiceIdentity(connection); return connection; } } @@ -792,18 +785,35 @@ final class HotwordDetectionConnection { if (audioFlinger == null) { throw new IllegalStateException("Service media.audio_flinger wasn't found."); } - connection.post(service -> service.updateAudioFlinger(audioFlinger)); + connection.run(service -> service.updateAudioFlinger(audioFlinger)); } private static void updateContentCaptureManager(ServiceConnection connection) { IBinder b = ServiceManager .getService(Context.CONTENT_CAPTURE_MANAGER_SERVICE); IContentCaptureManager binderService = IContentCaptureManager.Stub.asInterface(b); - connection.post( + connection.run( service -> service.updateContentCaptureManager(binderService, new ContentCaptureOptions(null))); } + private void updateServiceIdentity(ServiceConnection connection) { + connection.run(service -> service.ping(new IRemoteCallback.Stub() { + @Override + public void sendResult(Bundle bundle) throws RemoteException { + if (DEBUG) { + Slog.d(TAG, "updating hotword UID " + Binder.getCallingUid()); + } + // TODO: Have the provider point to the current state stored in + // VoiceInteractionManagerServiceImpl. + final int uid = Binder.getCallingUid(); + LocalServices.getService(PermissionManagerServiceInternal.class) + .setHotwordDetectionServiceProvider(() -> uid); + mIdentity = new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid); + } + })); + } + private static void bestEffortClose(Closeable closeable) { try { closeable.close();