1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.app; 18 19 import android.content.ComponentName; 20 import android.content.Intent; 21 import android.hardware.soundtrigger.KeyphraseMetadata; 22 import android.hardware.soundtrigger.SoundTrigger; 23 import android.media.AudioFormat; 24 import android.media.permission.Identity; 25 import android.os.Bundle; 26 import android.os.ParcelFileDescriptor; 27 import android.os.PersistableBundle; 28 import android.os.RemoteCallback; 29 import android.os.SharedMemory; 30 import android.service.voice.IMicrophoneHotwordDetectionVoiceInteractionCallback; 31 import android.service.voice.IVoiceInteractionService; 32 import android.service.voice.IVoiceInteractionSession; 33 import android.service.voice.VisibleActivityInfo; 34 35 import com.android.internal.app.IHotwordRecognitionStatusCallback; 36 import com.android.internal.app.IVoiceActionCheckCallback; 37 import com.android.internal.app.IVoiceInteractionSessionListener; 38 import com.android.internal.app.IVoiceInteractionSessionShowCallback; 39 import com.android.internal.app.IVoiceInteractionSoundTriggerSession; 40 import com.android.internal.app.IVoiceInteractor; 41 42 interface IVoiceInteractionManagerService { showSession(in Bundle sessionArgs, int flags)43 void showSession(in Bundle sessionArgs, int flags); deliverNewSession(IBinder token, IVoiceInteractionSession session, IVoiceInteractor interactor)44 boolean deliverNewSession(IBinder token, IVoiceInteractionSession session, 45 IVoiceInteractor interactor); showSessionFromSession(IBinder token, in Bundle sessionArgs, int flags)46 boolean showSessionFromSession(IBinder token, in Bundle sessionArgs, int flags); hideSessionFromSession(IBinder token)47 boolean hideSessionFromSession(IBinder token); startVoiceActivity(IBinder token, in Intent intent, String resolvedType, String callingFeatureId)48 int startVoiceActivity(IBinder token, in Intent intent, String resolvedType, 49 String callingFeatureId); startAssistantActivity(IBinder token, in Intent intent, String resolvedType, String callingFeatureId)50 int startAssistantActivity(IBinder token, in Intent intent, String resolvedType, 51 String callingFeatureId); setKeepAwake(IBinder token, boolean keepAwake)52 void setKeepAwake(IBinder token, boolean keepAwake); closeSystemDialogs(IBinder token)53 void closeSystemDialogs(IBinder token); finish(IBinder token)54 void finish(IBinder token); setDisabledShowContext(int flags)55 void setDisabledShowContext(int flags); getDisabledShowContext()56 int getDisabledShowContext(); getUserDisabledShowContext()57 int getUserDisabledShowContext(); 58 59 /** 60 * Gets the registered Sound model for keyphrase detection for the current user. 61 * May be null if no matching sound model exists. 62 * Caller must either be the active voice interaction service via 63 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}, or the caller must be a voice model 64 * enrollment application detected by 65 * {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}. 66 * 67 * @param keyphraseId The unique identifier for the keyphrase. 68 * @param bcp47Locale The BCP47 language tag for the keyphrase's locale. 69 * @RequiresPermission Manifest.permission.MANAGE_VOICE_KEYPHRASES 70 */ 71 @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) getKeyphraseSoundModel(int keyphraseId, in String bcp47Locale)72 SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, in String bcp47Locale); 73 /** 74 * Add/Update the given keyphrase sound model for the current user. 75 * Caller must either be the active voice interaction service via 76 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}, or the caller must be a voice model 77 * enrollment application detected by 78 * {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}. 79 * 80 * @param model The keyphrase sound model to store peristantly. 81 * @RequiresPermission Manifest.permission.MANAGE_VOICE_KEYPHRASES 82 */ updateKeyphraseSoundModel(in SoundTrigger.KeyphraseSoundModel model)83 int updateKeyphraseSoundModel(in SoundTrigger.KeyphraseSoundModel model); 84 /** 85 * Deletes the given keyphrase sound model for the current user. 86 * Caller must either be the active voice interaction service via 87 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}, or the caller must be a voice model 88 * enrollment application detected by 89 * {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}. 90 * 91 * @param keyphraseId The unique identifier for the keyphrase. 92 * @param bcp47Locale The BCP47 language tag for the keyphrase's locale. 93 * @RequiresPermission Manifest.permission.MANAGE_VOICE_KEYPHRASES 94 */ deleteKeyphraseSoundModel(int keyphraseId, in String bcp47Locale)95 int deleteKeyphraseSoundModel(int keyphraseId, in String bcp47Locale); 96 /** 97 * Indicates if there's a keyphrase sound model available for the given keyphrase ID and the 98 * user ID of the caller. 99 * Caller must be the active voice interaction service via 100 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}. 101 * 102 * @param keyphraseId The unique identifier for the keyphrase. 103 * @param bcp47Locale The BCP47 language tag for the keyphrase's locale. 104 */ isEnrolledForKeyphrase(int keyphraseId, String bcp47Locale)105 boolean isEnrolledForKeyphrase(int keyphraseId, String bcp47Locale); 106 /** 107 * Generates KeyphraseMetadata for an enrolled sound model based on keyphrase string, locale, 108 * and the user ID of the caller. 109 * Caller must be the active voice interaction service via 110 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}. 111 * 112 * @param keyphrase Keyphrase text associated with the enrolled model 113 * @param bcp47Locale The BCP47 language tag for the keyphrase's locale. 114 * @return The metadata for the enrolled voice model bassed on the passed in parameters. Null if 115 * no matching voice model exists. 116 */ getEnrolledKeyphraseMetadata(String keyphrase, String bcp47Locale)117 KeyphraseMetadata getEnrolledKeyphraseMetadata(String keyphrase, String bcp47Locale); 118 /** 119 * @return the component name for the currently active voice interaction service 120 */ getActiveServiceComponentName()121 ComponentName getActiveServiceComponentName(); 122 123 /** 124 * Shows the session for the currently active service. Used to start a new session from system 125 * affordances. 126 * 127 * @param args the bundle to pass as arguments to the voice interaction session 128 * @param sourceFlags flags indicating the source of this show 129 * @param showCallback optional callback to be notified when the session was shown 130 * @param activityToken optional token of activity that needs to be on top 131 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 132 */ showSessionForActiveService(in Bundle args, int sourceFlags, IVoiceInteractionSessionShowCallback showCallback, IBinder activityToken)133 boolean showSessionForActiveService(in Bundle args, int sourceFlags, 134 IVoiceInteractionSessionShowCallback showCallback, IBinder activityToken); 135 136 /** 137 * Hides the session from the active service, if it is showing. 138 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 139 */ hideCurrentSession()140 void hideCurrentSession(); 141 142 /** 143 * Notifies the active service that a launch was requested from the Keyguard. This will only 144 * be called if {@link #activeServiceSupportsLaunchFromKeyguard()} returns true. 145 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 146 */ launchVoiceAssistFromKeyguard()147 void launchVoiceAssistFromKeyguard(); 148 149 /** 150 * Indicates whether there is a voice session running (but not necessarily showing). 151 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 152 */ isSessionRunning()153 boolean isSessionRunning(); 154 155 /** 156 * Indicates whether the currently active voice interaction service is capable of handling the 157 * assist gesture. 158 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 159 */ activeServiceSupportsAssist()160 boolean activeServiceSupportsAssist(); 161 162 /** 163 * Indicates whether the currently active voice interaction service is capable of being launched 164 * from the lockscreen. 165 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 166 */ activeServiceSupportsLaunchFromKeyguard()167 boolean activeServiceSupportsLaunchFromKeyguard(); 168 169 /** 170 * Called when the lockscreen got shown. 171 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 172 */ onLockscreenShown()173 void onLockscreenShown(); 174 175 /** 176 * Register a voice interaction listener. 177 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 178 */ registerVoiceInteractionSessionListener(IVoiceInteractionSessionListener listener)179 void registerVoiceInteractionSessionListener(IVoiceInteractionSessionListener listener); 180 181 /** 182 * Checks the availability of a set of voice actions for the current active voice service. 183 * Returns all supported voice actions. 184 * @RequiresPermission Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE 185 */ getActiveServiceSupportedActions(in List<String> voiceActions, in IVoiceActionCheckCallback callback)186 void getActiveServiceSupportedActions(in List<String> voiceActions, 187 in IVoiceActionCheckCallback callback); 188 189 /** 190 * Provide hints for showing UI. 191 * Caller must be the active voice interaction service via 192 * {@link Settings.Secure.VOICE_INTERACTION_SERVICE}. 193 */ setUiHints(in Bundle hints)194 void setUiHints(in Bundle hints); 195 196 /** 197 * Requests a list of supported actions from a specific activity. 198 */ requestDirectActions(in IBinder token, int taskId, IBinder assistToken, in RemoteCallback cancellationCallback, in RemoteCallback callback)199 void requestDirectActions(in IBinder token, int taskId, IBinder assistToken, 200 in RemoteCallback cancellationCallback, in RemoteCallback callback); 201 202 /** 203 * Requests performing an action from a specific activity. 204 */ performDirectAction(in IBinder token, String actionId, in Bundle arguments, int taskId, IBinder assistToken, in RemoteCallback cancellationCallback, in RemoteCallback resultCallback)205 void performDirectAction(in IBinder token, String actionId, in Bundle arguments, int taskId, 206 IBinder assistToken, in RemoteCallback cancellationCallback, 207 in RemoteCallback resultCallback); 208 209 /** 210 * Temporarily disables voice interaction (for example, on Automotive when the display is off). 211 * 212 * It will shutdown the service, and only re-enable it after it's called again (or after a 213 * system restart). 214 * 215 * NOTE: it's only effective when the service itself is available / enabled in the device, so 216 * calling setDisable(false) would be a no-op when it isn't. 217 */ setDisabled(boolean disabled)218 void setDisabled(boolean disabled); 219 220 /** 221 * Creates a session, allowing controlling running sound models on detection hardware. 222 * Caller must provide an identity, used for permission tracking purposes. 223 * The uid/pid elements of the identity will be ignored by the server and replaced with the ones 224 * provided by binder. 225 * 226 * The client argument is any binder owned by the client, used for tracking is death and 227 * cleaning up in this event. 228 */ createSoundTriggerSessionAsOriginator( in Identity originatorIdentity, IBinder client)229 IVoiceInteractionSoundTriggerSession createSoundTriggerSessionAsOriginator( 230 in Identity originatorIdentity, 231 IBinder client); 232 233 /** 234 * Set configuration and pass read-only data to hotword detection service. 235 * Caller must provide an identity, used for permission tracking purposes. 236 * The uid/pid elements of the identity will be ignored by the server and replaced with the ones 237 * provided by binder. 238 * 239 * @param options Application configuration data to provide to the 240 * {@link HotwordDetectionService}. PersistableBundle does not allow any remotable objects or 241 * other contents that can be used to communicate with other processes. 242 * @param sharedMemory The unrestricted data blob to provide to the 243 * {@link HotwordDetectionService}. Use this to provide the hotword models data or other 244 * such data to the trusted process. 245 * @param callback Use this to report {@link HotwordDetectionService} status. 246 * @param detectorType Indicate which detector is used. 247 */ updateState( in Identity originatorIdentity, in PersistableBundle options, in SharedMemory sharedMemory, in IHotwordRecognitionStatusCallback callback, int detectorType)248 void updateState( 249 in Identity originatorIdentity, 250 in PersistableBundle options, 251 in SharedMemory sharedMemory, 252 in IHotwordRecognitionStatusCallback callback, 253 int detectorType); 254 255 /** 256 * Requests to shutdown hotword detection service. 257 */ shutdownHotwordDetectionService()258 void shutdownHotwordDetectionService(); 259 startListeningFromMic( in AudioFormat audioFormat, in IMicrophoneHotwordDetectionVoiceInteractionCallback callback)260 void startListeningFromMic( 261 in AudioFormat audioFormat, 262 in IMicrophoneHotwordDetectionVoiceInteractionCallback callback); 263 stopListeningFromMic()264 void stopListeningFromMic(); 265 startListeningFromExternalSource( in ParcelFileDescriptor audioStream, in AudioFormat audioFormat, in PersistableBundle options, in IMicrophoneHotwordDetectionVoiceInteractionCallback callback)266 void startListeningFromExternalSource( 267 in ParcelFileDescriptor audioStream, 268 in AudioFormat audioFormat, 269 in PersistableBundle options, 270 in IMicrophoneHotwordDetectionVoiceInteractionCallback callback); 271 272 /** 273 * Test API to simulate to trigger hardware recognition event for test. 274 */ triggerHardwareRecognitionEventForTest( in SoundTrigger.KeyphraseRecognitionEvent event, in IHotwordRecognitionStatusCallback callback)275 void triggerHardwareRecognitionEventForTest( 276 in SoundTrigger.KeyphraseRecognitionEvent event, 277 in IHotwordRecognitionStatusCallback callback); 278 279 /** 280 * Starts to listen the status of visible activity. 281 */ startListeningVisibleActivityChanged(in IBinder token)282 void startListeningVisibleActivityChanged(in IBinder token); 283 284 /** 285 * Stops to listen the status of visible activity. 286 */ stopListeningVisibleActivityChanged(in IBinder token)287 void stopListeningVisibleActivityChanged(in IBinder token); 288 289 /** 290 * Notifies when the session window is shown or hidden. 291 */ setSessionWindowVisible(in IBinder token, boolean visible)292 void setSessionWindowVisible(in IBinder token, boolean visible); 293 294 /** 295 * Notifies when the Activity lifecycle event changed. 296 * 297 * @param activityToken The token of activity. 298 * @param type The type of lifecycle event of the activity lifecycle. 299 */ notifyActivityEventChanged( in IBinder activityToken, int type)300 oneway void notifyActivityEventChanged( 301 in IBinder activityToken, 302 int type); 303 } 304