summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Charles Chen <liangyuchen@google.com> 2023-08-14 05:15:53 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-08-14 05:15:53 +0000
commitf480c1626115590c87c06b91617038a9810a9e6e (patch)
treea691103a4096b85125d043ad5064ab4a8d43a763
parent068a8f1c0ac877e254bc096ae07f1d446cc5251b (diff)
parent7fdb60c8c411d0779850b97523557dd613e4ae01 (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>
-rw-r--r--core/java/com/android/internal/app/AssistUtils.java17
-rw-r--r--core/java/com/android/internal/app/IVisualQueryRecognitionStatusListener.aidl32
-rw-r--r--core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl4
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java12
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java9
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java26
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java12
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(