diff options
| author | 2023-08-14 05:15:53 +0000 | |
|---|---|---|
| committer | 2023-08-14 05:15:53 +0000 | |
| commit | f480c1626115590c87c06b91617038a9810a9e6e (patch) | |
| tree | a691103a4096b85125d043ad5064ab4a8d43a763 | |
| parent | 068a8f1c0ac877e254bc096ae07f1d446cc5251b (diff) | |
| parent | 7fdb60c8c411d0779850b97523557dd613e4ae01 (diff) | |
Merge "Provides VisualQueryDetection start recognition signal for SysUI" into udc-qpr-dev am: cb8ddff059 am: 7fdb60c8c4
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24315052
Change-Id: Ieddb5ed11de41d1408954cc6995ac3ddb1263acb
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
7 files changed, 91 insertions, 21 deletions
diff --git a/core/java/com/android/internal/app/AssistUtils.java b/core/java/com/android/internal/app/AssistUtils.java index 0ea80144a798..4261a0f14767 100644 --- a/core/java/com/android/internal/app/AssistUtils.java +++ b/core/java/com/android/internal/app/AssistUtils.java @@ -234,6 +234,23 @@ public class AssistUtils { } /** + * Allows subscription to {@link android.service.voice.VisualQueryDetectionService} service + * status. + * + * @param listener to receive visual service start/stop events. + */ + public void subscribeVisualQueryRecognitionStatus(IVisualQueryRecognitionStatusListener + listener) { + try { + if (mVoiceInteractionManagerService != null) { + mVoiceInteractionManagerService.subscribeVisualQueryRecognitionStatus(listener); + } + } catch (RemoteException e) { + Log.w(TAG, "Failed to register visual query detection start listener", e); + } + } + + /** * Enables visual detection service. * * @param listener to receive visual attention gained/lost events. diff --git a/core/java/com/android/internal/app/IVisualQueryRecognitionStatusListener.aidl b/core/java/com/android/internal/app/IVisualQueryRecognitionStatusListener.aidl new file mode 100644 index 000000000000..cc49a7539cf0 --- /dev/null +++ b/core/java/com/android/internal/app/IVisualQueryRecognitionStatusListener.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + package com.android.internal.app; + + + oneway interface IVisualQueryRecognitionStatusListener { + /** + * Called when {@link VisualQueryDetectionService#onStartDetection} is scheduled from the system + * server via {@link VoiceInteractionManagerService#StartPerceiving}. + */ + void onStartPerceiving(); + + /** + * Called when {@link VisualQueryDetectionService#onStopDetection} is scheduled from the system + * server via {@link VoiceInteractionManagerService#StopPerceiving}. + */ + void onStopPerceiving(); + }
\ No newline at end of file diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl index 24d5afc42d8f..314ed69cb885 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl @@ -40,6 +40,7 @@ import com.android.internal.app.IVoiceInteractionSessionShowCallback; import com.android.internal.app.IVoiceInteractionSoundTriggerSession; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.IVisualQueryDetectionAttentionListener; +import com.android.internal.app.IVisualQueryRecognitionStatusListener; interface IVoiceInteractionManagerService { void showSession(in Bundle sessionArgs, int flags, String attributionTag); @@ -325,6 +326,9 @@ interface IVoiceInteractionManagerService { void shutdownHotwordDetectionService(); @EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE") + void subscribeVisualQueryRecognitionStatus(in IVisualQueryRecognitionStatusListener listener); + + @EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE") void enableVisualQueryDetection(in IVisualQueryDetectionAttentionListener Listener); @EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE") diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index ccc4ac28876a..58da4b43aa05 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -368,29 +368,29 @@ final class HotwordDetectionConnection { /** * This method is only used by VisualQueryDetector. */ - void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { + boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { if (DEBUG) { Slog.d(TAG, "startPerceivingLocked"); } final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked(); if (session == null) { - return; + return false; } - session.startPerceivingLocked(callback); + return session.startPerceivingLocked(callback); } /** * This method is only used by VisaulQueryDetector. */ - void stopPerceivingLocked() { + boolean stopPerceivingLocked() { if (DEBUG) { Slog.d(TAG, "stopPerceivingLocked"); } final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked(); if (session == null) { - return; + return false; } - session.stopPerceivingLocked(); + return session.stopPerceivingLocked(); } public void startListeningFromExternalSourceLocked( diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java index 2e05e2073e80..4720d279a676 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java @@ -95,7 +95,7 @@ final class VisualQueryDetectorSession extends DetectorSession { } @SuppressWarnings("GuardedBy") - void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { + boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { if (DEBUG) { Slog.d(TAG, "startPerceivingLocked"); } @@ -198,15 +198,16 @@ final class VisualQueryDetectorSession extends DetectorSession { mQueryStreaming = false; } }; - mRemoteDetectionService.run(service -> service.detectWithVisualSignals(internalCallback)); + return mRemoteDetectionService.run( + service -> service.detectWithVisualSignals(internalCallback)); } @SuppressWarnings("GuardedBy") - void stopPerceivingLocked() { + boolean stopPerceivingLocked() { if (DEBUG) { Slog.d(TAG, "stopPerceivingLocked"); } - mRemoteDetectionService.run(ISandboxedDetectionService::stopDetection); + return mRemoteDetectionService.run(ISandboxedDetectionService::stopDetection); } @Override diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 3502a3ff2949..98cc1dab1601 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; -import android.app.ActivityThread; import android.app.AppGlobals; import android.app.role.OnRoleHoldersChangedListener; import android.app.role.RoleManager; @@ -51,7 +50,6 @@ import android.hardware.soundtrigger.SoundTrigger.ModuleProperties; import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig; import android.media.AudioFormat; import android.media.permission.Identity; -import android.media.permission.IdentityContext; import android.media.permission.PermissionUtil; import android.media.permission.SafeCloseable; import android.os.Binder; @@ -61,7 +59,6 @@ import android.os.IBinder; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; -import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -88,6 +85,7 @@ import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IHotwordRecognitionStatusCallback; import com.android.internal.app.IVisualQueryDetectionAttentionListener; +import com.android.internal.app.IVisualQueryRecognitionStatusListener; import com.android.internal.app.IVoiceActionCheckCallback; import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.app.IVoiceInteractionSessionListener; @@ -139,6 +137,7 @@ public class VoiceInteractionManagerService extends SystemService { private final RemoteCallbackList<IVoiceInteractionSessionListener> mVoiceInteractionSessionListeners = new RemoteCallbackList<>(); + private IVisualQueryRecognitionStatusListener mVisualQueryRecognitionStatusListener; public VoiceInteractionManagerService(Context context) { super(context); @@ -1346,6 +1345,17 @@ public class VoiceInteractionManagerService extends SystemService { @android.annotation.EnforcePermission( android.Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE) @Override + public void subscribeVisualQueryRecognitionStatus(IVisualQueryRecognitionStatusListener + listener) { + super.subscribeVisualQueryRecognitionStatus_enforcePermission(); + synchronized (this) { + mVisualQueryRecognitionStatusListener = listener; + } + } + + @android.annotation.EnforcePermission( + android.Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE) + @Override public void enableVisualQueryDetection( IVisualQueryDetectionAttentionListener listener) { super.enableVisualQueryDetection_enforcePermission(); @@ -1391,7 +1401,10 @@ public class VoiceInteractionManagerService extends SystemService { } final long caller = Binder.clearCallingIdentity(); try { - mImpl.startPerceivingLocked(callback); + boolean success = mImpl.startPerceivingLocked(callback); + if (success && mVisualQueryRecognitionStatusListener != null) { + mVisualQueryRecognitionStatusListener.onStartPerceiving(); + } } finally { Binder.restoreCallingIdentity(caller); } @@ -1409,7 +1422,10 @@ public class VoiceInteractionManagerService extends SystemService { } final long caller = Binder.clearCallingIdentity(); try { - mImpl.stopPerceivingLocked(); + boolean success = mImpl.stopPerceivingLocked(); + if (success && mVisualQueryRecognitionStatusListener != null) { + mVisualQueryRecognitionStatusListener.onStopPerceiving(); + } } finally { Binder.restoreCallingIdentity(caller); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 5d88a65ce29e..471acc118572 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -784,30 +784,30 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne mHotwordDetectionConnection.setVisualQueryDetectionAttentionListenerLocked(listener); } - public void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { + public boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { if (DEBUG) { Slog.d(TAG, "startPerceivingLocked"); } if (mHotwordDetectionConnection == null) { // TODO: callback.onError(); - return; + return false; } - mHotwordDetectionConnection.startPerceivingLocked(callback); + return mHotwordDetectionConnection.startPerceivingLocked(callback); } - public void stopPerceivingLocked() { + public boolean stopPerceivingLocked() { if (DEBUG) { Slog.d(TAG, "stopPerceivingLocked"); } if (mHotwordDetectionConnection == null) { Slog.w(TAG, "stopPerceivingLocked() called but connection isn't established"); - return; + return false; } - mHotwordDetectionConnection.stopPerceivingLocked(); + return mHotwordDetectionConnection.stopPerceivingLocked(); } public void startListeningFromMicLocked( |