Merge "Provides VisualQueryDetection start recognition signal for SysUI" into udc-qpr-dev

This commit is contained in:
Charles Chen
2023-08-12 06:47:11 +00:00
committed by Android (Google) Code Review
7 changed files with 91 additions and 21 deletions

View File

@@ -233,6 +233,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. * Enables visual detection service.
* *

View File

@@ -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();
}

View File

@@ -40,6 +40,7 @@ import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractionSoundTriggerSession; import com.android.internal.app.IVoiceInteractionSoundTriggerSession;
import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.IVisualQueryDetectionAttentionListener; import com.android.internal.app.IVisualQueryDetectionAttentionListener;
import com.android.internal.app.IVisualQueryRecognitionStatusListener;
interface IVoiceInteractionManagerService { interface IVoiceInteractionManagerService {
void showSession(in Bundle sessionArgs, int flags, String attributionTag); void showSession(in Bundle sessionArgs, int flags, String attributionTag);
@@ -324,6 +325,9 @@ interface IVoiceInteractionManagerService {
*/ */
void shutdownHotwordDetectionService(); void shutdownHotwordDetectionService();
@EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE")
void subscribeVisualQueryRecognitionStatus(in IVisualQueryRecognitionStatusListener listener);
@EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE") @EnforcePermission("ACCESS_VOICE_INTERACTION_SERVICE")
void enableVisualQueryDetection(in IVisualQueryDetectionAttentionListener Listener); void enableVisualQueryDetection(in IVisualQueryDetectionAttentionListener Listener);

View File

@@ -368,29 +368,29 @@ final class HotwordDetectionConnection {
/** /**
* This method is only used by VisualQueryDetector. * This method is only used by VisualQueryDetector.
*/ */
void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "startPerceivingLocked"); Slog.d(TAG, "startPerceivingLocked");
} }
final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked(); final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked();
if (session == null) { if (session == null) {
return; return false;
} }
session.startPerceivingLocked(callback); return session.startPerceivingLocked(callback);
} }
/** /**
* This method is only used by VisaulQueryDetector. * This method is only used by VisaulQueryDetector.
*/ */
void stopPerceivingLocked() { boolean stopPerceivingLocked() {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "stopPerceivingLocked"); Slog.d(TAG, "stopPerceivingLocked");
} }
final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked(); final VisualQueryDetectorSession session = getVisualQueryDetectorSessionLocked();
if (session == null) { if (session == null) {
return; return false;
} }
session.stopPerceivingLocked(); return session.stopPerceivingLocked();
} }
public void startListeningFromExternalSourceLocked( public void startListeningFromExternalSourceLocked(

View File

@@ -95,7 +95,7 @@ final class VisualQueryDetectorSession extends DetectorSession {
} }
@SuppressWarnings("GuardedBy") @SuppressWarnings("GuardedBy")
void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "startPerceivingLocked"); Slog.d(TAG, "startPerceivingLocked");
} }
@@ -198,15 +198,16 @@ final class VisualQueryDetectorSession extends DetectorSession {
mQueryStreaming = false; mQueryStreaming = false;
} }
}; };
mRemoteDetectionService.run(service -> service.detectWithVisualSignals(internalCallback)); return mRemoteDetectionService.run(
service -> service.detectWithVisualSignals(internalCallback));
} }
@SuppressWarnings("GuardedBy") @SuppressWarnings("GuardedBy")
void stopPerceivingLocked() { boolean stopPerceivingLocked() {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "stopPerceivingLocked"); Slog.d(TAG, "stopPerceivingLocked");
} }
mRemoteDetectionService.run(ISandboxedDetectionService::stopDetection); return mRemoteDetectionService.run(ISandboxedDetectionService::stopDetection);
} }
@Override @Override

View File

@@ -23,7 +23,6 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityManagerInternal; import android.app.ActivityManagerInternal;
import android.app.ActivityThread;
import android.app.AppGlobals; import android.app.AppGlobals;
import android.app.role.OnRoleHoldersChangedListener; import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager; import android.app.role.RoleManager;
@@ -51,7 +50,6 @@ import android.hardware.soundtrigger.SoundTrigger.ModuleProperties;
import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig; import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
import android.media.AudioFormat; import android.media.AudioFormat;
import android.media.permission.Identity; import android.media.permission.Identity;
import android.media.permission.IdentityContext;
import android.media.permission.PermissionUtil; import android.media.permission.PermissionUtil;
import android.media.permission.SafeCloseable; import android.media.permission.SafeCloseable;
import android.os.Binder; import android.os.Binder;
@@ -61,7 +59,6 @@ import android.os.IBinder;
import android.os.Parcel; import android.os.Parcel;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteCallback; import android.os.RemoteCallback;
import android.os.RemoteCallbackList; import android.os.RemoteCallbackList;
import android.os.RemoteException; import android.os.RemoteException;
@@ -88,6 +85,7 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IHotwordRecognitionStatusCallback; import com.android.internal.app.IHotwordRecognitionStatusCallback;
import com.android.internal.app.IVisualQueryDetectionAttentionListener; import com.android.internal.app.IVisualQueryDetectionAttentionListener;
import com.android.internal.app.IVisualQueryRecognitionStatusListener;
import com.android.internal.app.IVoiceActionCheckCallback; import com.android.internal.app.IVoiceActionCheckCallback;
import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.app.IVoiceInteractionManagerService;
import com.android.internal.app.IVoiceInteractionSessionListener; import com.android.internal.app.IVoiceInteractionSessionListener;
@@ -139,6 +137,7 @@ public class VoiceInteractionManagerService extends SystemService {
private final RemoteCallbackList<IVoiceInteractionSessionListener> private final RemoteCallbackList<IVoiceInteractionSessionListener>
mVoiceInteractionSessionListeners = new RemoteCallbackList<>(); mVoiceInteractionSessionListeners = new RemoteCallbackList<>();
private IVisualQueryRecognitionStatusListener mVisualQueryRecognitionStatusListener;
public VoiceInteractionManagerService(Context context) { public VoiceInteractionManagerService(Context context) {
super(context); super(context);
@@ -1343,6 +1342,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.annotation.EnforcePermission(
android.Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE) android.Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE)
@Override @Override
@@ -1391,7 +1401,10 @@ public class VoiceInteractionManagerService extends SystemService {
} }
final long caller = Binder.clearCallingIdentity(); final long caller = Binder.clearCallingIdentity();
try { try {
mImpl.startPerceivingLocked(callback); boolean success = mImpl.startPerceivingLocked(callback);
if (success && mVisualQueryRecognitionStatusListener != null) {
mVisualQueryRecognitionStatusListener.onStartPerceiving();
}
} finally { } finally {
Binder.restoreCallingIdentity(caller); Binder.restoreCallingIdentity(caller);
} }
@@ -1409,7 +1422,10 @@ public class VoiceInteractionManagerService extends SystemService {
} }
final long caller = Binder.clearCallingIdentity(); final long caller = Binder.clearCallingIdentity();
try { try {
mImpl.stopPerceivingLocked(); boolean success = mImpl.stopPerceivingLocked();
if (success && mVisualQueryRecognitionStatusListener != null) {
mVisualQueryRecognitionStatusListener.onStopPerceiving();
}
} finally { } finally {
Binder.restoreCallingIdentity(caller); Binder.restoreCallingIdentity(caller);
} }

View File

@@ -784,30 +784,30 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
mHotwordDetectionConnection.setVisualQueryDetectionAttentionListenerLocked(listener); mHotwordDetectionConnection.setVisualQueryDetectionAttentionListenerLocked(listener);
} }
public void startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) { public boolean startPerceivingLocked(IVisualQueryDetectionVoiceInteractionCallback callback) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "startPerceivingLocked"); Slog.d(TAG, "startPerceivingLocked");
} }
if (mHotwordDetectionConnection == null) { if (mHotwordDetectionConnection == null) {
// TODO: callback.onError(); // TODO: callback.onError();
return; return false;
} }
mHotwordDetectionConnection.startPerceivingLocked(callback); return mHotwordDetectionConnection.startPerceivingLocked(callback);
} }
public void stopPerceivingLocked() { public boolean stopPerceivingLocked() {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "stopPerceivingLocked"); Slog.d(TAG, "stopPerceivingLocked");
} }
if (mHotwordDetectionConnection == null) { if (mHotwordDetectionConnection == null) {
Slog.w(TAG, "stopPerceivingLocked() called but connection isn't established"); Slog.w(TAG, "stopPerceivingLocked() called but connection isn't established");
return; return false;
} }
mHotwordDetectionConnection.stopPerceivingLocked(); return mHotwordDetectionConnection.stopPerceivingLocked();
} }
public void startListeningFromMicLocked( public void startListeningFromMicLocked(