VoiceInteractionSession.java revision 57dd737443a174379eb638450e4888500d8e4a23
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/** 291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project 391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License. 691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at 791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and 1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License. 1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */ 1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice; 1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 196cf397508eb7edef13baefad942a59b058ed450bJames Cookimport android.annotation.Nullable; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 223d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor; 2369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistContent; 2469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistStructure; 251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2; 2691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration; 29c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 3027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap; 31e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 32c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 4057dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.os.UserHandle; 4191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 4257dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.util.DebugUtils; 4391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 44e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 49c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 50c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 53225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 6057dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.FileDescriptor; 6157dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.PrintWriter; 62a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 63a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 66a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 674e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation 68ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer. The user interface is 69ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()} 70ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built. 714e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * 724e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish} 734e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done. It can also initiate voice interactions with applications by calling 744e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>. 75a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornpublic class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 { 7791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 78593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn static final boolean DEBUG = false; 7991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * assist data from the currently focused activity. 832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_ASSIST = 1<<0; 852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * a screen shot of the currently focused activity. 892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_SCREENSHOT = 1<<1; 912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag for use with {@link #onShow}: indicates that the session has been started from the 942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * system assist gesture. 952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_SOURCE_ASSIST_GESTURE = 1<<2; 972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 9817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn /** 9917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * Flag for use with {@link #onShow}: indicates that the application itself has invoked 10017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * the assistant. 10117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn */ 10217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public static final int SHOW_SOURCE_APPLICATION = 1<<3; 10317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn 104c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 106c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 108c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 109c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 110c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 111c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 112c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 113c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 114c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 115c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 116c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 117c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 129a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 130a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 131a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 13291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 13391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 13491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 1356cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, Bundle extras) { 1362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest request = new ConfirmationRequest(callingPackage, 1372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, extras); 1392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_CONFIRMATION, 1412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 1463d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public IVoiceInteractorRequest startPickOption(String callingPackage, 1476cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, 1483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 1492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest request = new PickOptionRequest(callingPackage, 1502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, options, extras); 1522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_PICK_OPTION, 1542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 1553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return request.mInterface; 1563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 1573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 1583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn @Override 159d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 1606cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest request = new CompleteVoiceRequest(callingPackage, 1622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMPLETE_VOICE, 1662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 167d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 168d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 169d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 170d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 171a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 1726cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest request = new AbortVoiceRequest(callingPackage, 1742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_ABORT_VOICE, 1782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 179a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 180a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 181a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 182a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 1852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest request = new CommandRequest(callingPackage, 1862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn command, extras); 188593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn addRequest(request); 1892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND, 1902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 1972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 0, commands, null); 19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 19991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 20091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 20191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 20291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 20391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 20491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 20591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 20791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 210225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public void show(Bundle sessionArgs, int flags, 211225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi IVoiceInteractionSessionShowCallback showCallback) { 212225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW, 213225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi flags, sessionArgs, showCallback)); 214ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 215ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 216ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 217ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 218ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE)); 219ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 220ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 221ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 222782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void handleAssist(final Bundle data, final AssistStructure structure, 223782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn final AssistContent content) { 2245688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // We want to pre-warm the AssistStructure before handing it off to the main 225782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // thread. We also want to do this on a separate thread, so that if the app 226782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // is for some reason slow (due to slow filling in of async children in the 227782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // structure), we don't block other incoming IPCs (such as the screenshot) to 228782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // us (since we are a oneway interface, they get serialized). (Okay?) 229782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Thread retriever = new Thread("AssistStructure retriever") { 230782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn @Override 231782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void run() { 232782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Throwable failure = null; 233782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn if (structure != null) { 234782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn try { 235782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn structure.ensureData(); 236782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } catch (Throwable e) { 237782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Log.w(TAG, "Failure retrieving AssistStructure", e); 238782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn failure = e; 239782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 240782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 241782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_HANDLE_ASSIST, 242782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn data, failure == null ? structure : null, failure, content)); 243782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 244782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn }; 245782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn retriever.start(); 246ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 247ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 248ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn @Override 24927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void handleScreenshot(Bitmap screenshot) { 25027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT, 25127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn screenshot)); 25227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 25327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 25427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn @Override 255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 267c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 268c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 269c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 270c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 271c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 27219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi public void onLockscreenShown() { 27319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_ON_LOCKSCREEN_SHOWN)); 27419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi } 27519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi 27619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi @Override 277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 28091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 28191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 2832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Base class representing a request from a voice-driver app to perform a particular 2842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * voice operation with the user. See related subclasses for the types of requests 2852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that are possible. 2862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 287593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn public static class Request { 28891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 28991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 29091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 292a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 294a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 295a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 29691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 29791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 2982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCallingPackage; 2992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final int mCallingUid; 30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 301a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 3022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final Bundle mExtras; 303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Request(String packageName, int uid, IVoiceInteractorCallback callback, 3052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, Bundle extras) { 3062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingPackage = packageName; 3072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingUid = uid; 30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 3102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mExtras = extras; 3112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the uid of the application that initiated the request. 3152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public int getCallingUid() { 3172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingUid; 3182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the package name of the application that initiated the request. 3222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCallingPackage() { 3242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingPackage; 3252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return any additional extra information that was supplied as part of the request. 3292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public Bundle getExtras() { 3312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mExtras; 332a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 333a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3341b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn /** 3351b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * Check whether this request is currently active. A request becomes inactive after 3361b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * calling {@link #cancel} or a final result method that completes the request. After 3371b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * this point, further interactions with the request will result in 3381b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * {@link java.lang.IllegalStateException} errors; you should not catch these errors, 3391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * but can use this method if you need to determine the state of the request. Returns 3401b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * true if the request is still active. 3411b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn */ 3421b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn public boolean isActive() { 3431b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn VoiceInteractionSession session = mSession.get(); 3441b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn if (session == null) { 3451b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return false; 3461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 3471b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return session.isRequestActive(mInterface.asBinder()); 3481b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 3491b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn 350a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 351a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 352a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 353a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 354a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 355a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 356a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 357a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 358a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 359a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 360a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 361a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 36291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 36391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 365593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn * Ask the app to cancel this current request. 3661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This also finishes the request (it is no longer active). 3672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void cancel() { 36991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 37091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 371a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 37291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 37391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 37491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 37591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 37657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 37757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn @Override 37857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn public String toString() { 37957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn StringBuilder sb = new StringBuilder(128); 38057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn DebugUtils.buildShortClassTag(this, sb); 38157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" "); 38257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(mInterface.asBinder()); 38357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" pkg="); 38457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(mCallingPackage); 38557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" uid="); 38657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn UserHandle.formatUid(sb, mCallingUid); 38757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append('}'); 38857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn return sb.toString(); 38957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 39057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 39157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 39257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mInterface="); 39357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mInterface.asBinder()); 39457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage); 39557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid); 39657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(); 39757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCallback="); 39857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mCallback.asBinder()); 39957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mExtras != null) { 40057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mExtras="); 40157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mExtras); 40257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 40357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 40491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 40591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for confirmation from the user of an operation, as per 4082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class ConfirmationRequest extends Request { 4126cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4156cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 4162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 4172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 4182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what will happen, as per 4222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4256cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4266cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 4272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 4282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 42991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4316cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what will happen, as per 4326cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.ConfirmationRequest 4336cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.ConfirmationRequest}. 4346cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 4356cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 4366cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4376cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 4386cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 4396cf397508eb7edef13baefad942a59b058ed450bJames Cook } 4406cf397508eb7edef13baefad942a59b058ed450bJames Cook 4416cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 4422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has confirmed the operation with the user, resulting 4432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 4442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult 4452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest.onConfirmationResult}. 4461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 4472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendConfirmationResult(boolean confirmed, Bundle result) { 449593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 450593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmationResult: req=" + mInterface 451593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 452593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 453593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 454593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 455593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 4562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 45757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 45857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 45957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 46057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 46157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 46257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 4632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for the user to pick from a set of option, as per 4672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class PickOptionRequest extends Request { 4706cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final VoiceInteractor.PickOptionRequest.Option[] mOptions; 4722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4746cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, 4752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 4762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 4772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 4782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mOptions = options; 4792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what they are picking, as per 4832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4856cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4866cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 4872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 4882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4916cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what they are picking, as per 4926cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4936cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 4946cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 4956cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4966cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 4976cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 4986cf397508eb7edef13baefad942a59b058ed450bJames Cook } 4996cf397508eb7edef13baefad942a59b058ed450bJames Cook 5006cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 5012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the set of options the user is picking from, as per 5022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 5032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public VoiceInteractor.PickOptionRequest.Option[] getOptions() { 5052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mOptions; 5062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 508593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void sendPickOptionResult(boolean finished, 509593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 510593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 511593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface 512593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " finished=" + finished + " selections=" + selections 513593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 514593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (finished) { 515593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 516593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 517593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverPickOptionResult(mInterface, finished, selections, result); 518593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 519593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 520593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 521593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn 5222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate option selection from the request, without completing it (the 5242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * request is still active and the app is waiting for the final option selection), 5252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * resulting in a call to 5262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 5272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 5282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediatePickOptionResult( 5302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(false, selections, result); 5322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final option selection for the request, completing the request 5362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * and resulting in a call to 5372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 5382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 5391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 5402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendPickOptionResult( 5422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(true, selections, result); 5442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 54557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 54657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 54757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 54857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 54957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 55057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mOptions != null) { 55157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println("Options:"); 55257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int i=0; i<mOptions.length; i++) { 55357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn VoiceInteractor.PickOptionRequest.Option op = mOptions[i]; 55457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); 55557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mLabel="); 55657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getLabel()); 55757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mIndex="); 55857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getIndex()); 55957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (op.countSynonyms() > 0) { 56057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println(" Synonyms:"); 56157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int j=0; j<op.countSynonyms(); j++) { 56257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(j); 56357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(": "); writer.println(op.getSynonymAt(j)); 56457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 56557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 56657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (op.getExtras() != null) { 56757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mExtras="); 56857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getExtras()); 56957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 57057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 57157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 57257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 5732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to simply inform the user that the voice operation has completed, as per 5772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 5782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 5792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CompleteVoiceRequest extends Request { 5816cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 5822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 5846cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 5852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 5866cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 5872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the completion, as per 5912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 5922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 5932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5946cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5956cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 5966cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 5976cf397508eb7edef13baefad942a59b058ed450bJames Cook } 5986cf397508eb7edef13baefad942a59b058ed450bJames Cook 5996cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 6006cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the completion, as per 6016cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.CompleteVoiceRequest 6026cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.CompleteVoiceRequest}. 6036cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 6046cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 6056cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 6076cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 6082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished completing the voice operation, resulting 6122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 6132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult 6142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest.onCompleteResult}. 6151b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 6162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendCompleteResult(Bundle result) { 618593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 619593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 620593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 621593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 622593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverCompleteVoiceResult(mInterface, result); 623593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 624593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 6252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 62657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 62757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 62857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 62957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 63057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 63157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 6322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to report that the current user interaction can not be completed with voice, as per 6362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class AbortVoiceRequest extends Request { 6396cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 6402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 6426cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 6432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 6446cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 6452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the problem, as per 6492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6516cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6526cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 6536cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 6546cf397508eb7edef13baefad942a59b058ed450bJames Cook } 6556cf397508eb7edef13baefad942a59b058ed450bJames Cook 6566cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 6576cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the problem, as per 6586cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6596cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 6606cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 6616cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 6636cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 6642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished aborting the voice operation, resulting 6682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 6692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult 6701b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * VoiceInteractor.AbortVoiceRequest.onAbortResult}. This finishes the request (it 6711b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * is no longer active). 6722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendAbortResult(Bundle result) { 674593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 675593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 676593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 677593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 678593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 679593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 680593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 6812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 68257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 68357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 68457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 68557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 68657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 68757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 6882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A generic vendor-specific request, as per 6922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 6932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CommandRequest extends Request { 6952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCommand; 6962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest(String packageName, int uid, IVoiceInteractorCallback callback, 6982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, String command, Bundle extras) { 6992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 7002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCommand = command; 7012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the command that is being executed, as per 7052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 7062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCommand() { 7082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCommand; 7092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 711593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void sendCommandResult(boolean finished, Bundle result) { 712593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 713593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 714593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 715593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (finished) { 716593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 717593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 718593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverCommandResult(mInterface, finished, result); 719593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 720593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 721593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 722593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn 7232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate result of the request, without completing it (the request 7252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * is still active and the app is waiting for the final result), resulting in a call to 7262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 7272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with false for isCompleted. 7282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediateResult(Bundle result) { 7302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(false, result); 7312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final result of the request, completing the request and resulting in a call to 7352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 7362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted. 7371b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 7382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendResult(Bundle result) { 7402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(true, result); 74191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 74257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 74357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 74457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 74557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCommand="); 74657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mCommand); 74757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 74891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 74991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 75091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 7513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_PICK_OPTION = 2; 7523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMPLETE_VOICE = 3; 7533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_ABORT_VOICE = 4; 7543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMMAND = 5; 7553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 6; 7563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_CANCEL = 7; 75791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 758c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 759c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 760c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 761c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 762ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn static final int MSG_HANDLE_ASSIST = 104; 76327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HANDLE_SCREENSHOT = 105; 76427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_SHOW = 106; 76527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HIDE = 107; 76619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi static final int MSG_ON_LOCKSCREEN_SHOWN = 108; 767c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 768c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 76991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 77091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 771d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn SomeArgs args = null; 77291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 77391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 7742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + msg.obj); 7752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestConfirmation((ConfirmationRequest) msg.obj); 77691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 7773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn case MSG_START_PICK_OPTION: 7782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onPickOption: req=" + msg.obj); 7792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestPickOption((PickOptionRequest) msg.obj); 7803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn break; 781d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 7822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + msg.obj); 7832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCompleteVoice((CompleteVoiceRequest) msg.obj); 784d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 785a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 7862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + msg.obj); 7872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestAbortVoice((AbortVoiceRequest) msg.obj); 788a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 78991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 7902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + msg.obj); 7912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCommand((CommandRequest) msg.obj); 79291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 79391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 7952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg1); 7962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn args.arg1 = onGetSupportedCommands((String[]) args.arg1); 797d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args.complete(); 798d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args = null; 79991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 80091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 801ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj)); 8022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCancelRequest((Request) msg.obj); 80391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 804c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 805c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 806c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 807c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 816c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 820c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 821c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 822ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn case MSG_HANDLE_ASSIST: 82309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn args = (SomeArgs)msg.obj; 82409d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1 82509d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn + " structure=" + args.arg2 + " content=" + args.arg3); 826782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn doOnHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2, 827782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn (Throwable) args.arg3, (AssistContent) args.arg4); 828ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn break; 82927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn case MSG_HANDLE_SCREENSHOT: 83027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj); 83127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn onHandleScreenshot((Bitmap) msg.obj); 83227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn break; 833ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_SHOW: 834225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi args = (SomeArgs)msg.obj; 835225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1 836225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " flags=" + msg.arg1 837225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " showCallback=" + args.arg2); 838225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi doShow((Bundle) args.arg1, msg.arg1, 839225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi (IVoiceInteractionSessionShowCallback) args.arg2); 840ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 841ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_HIDE: 842ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "doHide"); 843ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn doHide(); 844ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 84519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi case MSG_ON_LOCKSCREEN_SHOWN: 84619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi if (DEBUG) Log.d(TAG, "onLockscreenShown"); 84719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi onLockscreenShown(); 84819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi break; 84991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 850d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn if (args != null) { 851d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args.recycle(); 852d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn } 85391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 85491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 855c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 856c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 857c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 858c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 859c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 860c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 861c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 862c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 863c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 864c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 865c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 866c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 867c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 868e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 869c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 870c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 871c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 872c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 873c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 874c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 875e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 876c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 877c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 878c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 880c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 881c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 882c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 883c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 884c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 885c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 886c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 887c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 888c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 892c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 893c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 894c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 895c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 896c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 897c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 898c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 899c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 902c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 903c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 904c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 905c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 906c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 907c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 908c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 909c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 910c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 911c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 912c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 913c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 915c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 917e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 918e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 919c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 920c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 921c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 922c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 92391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 92491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 92591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 92691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 92791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 92891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 92991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 93091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 931c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 93291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 93391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 934d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn public Context getContext() { 935d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn return mContext; 936d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn } 937d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn 9382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn void addRequest(Request req) { 9391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn synchronized (this) { 9401b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 9411b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 9421b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 9431b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn 9441b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn boolean isRequestActive(IBinder reqInterface) { 9451b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn synchronized (this) { 9461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return mActiveRequests.containsKey(reqInterface); 9471b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 948a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 949a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 950a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 95191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 9528ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe return mActiveRequests.remove(reqInterface); 95391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 95491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 95591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 956593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token) { 957c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 958c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 959593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn onCreate(); 960c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 961c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 962225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) { 963ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 964ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 965ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 966ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mInShowWindow) { 967ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 968ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn return; 969ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 970ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 971ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 972ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = true; 973ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 974ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowAdded) { 975ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowAdded = true; 976ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn View v = onCreateContentView(); 977ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (v != null) { 978ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn setContentView(v); 979ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 980ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 981ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 982ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onShow(args, flags); 983ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 984ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = true; 985ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.show(); 986ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 987225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (showCallback != null) { 988225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.invalidate(); 989225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().addOnPreDrawListener( 990225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi new ViewTreeObserver.OnPreDrawListener() { 991225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi @Override 992225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public boolean onPreDraw() { 993225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().removeOnPreDrawListener(this); 994225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi try { 995225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi showCallback.onShown(); 996225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } catch (RemoteException e) { 997225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi Log.w(TAG, "Error calling onShown", e); 998225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 999225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi return true; 1000225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 1001225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi }); 1002225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 1003ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } finally { 1004ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowWasVisible = true; 1005ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = false; 1006ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1007ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1008ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1009ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn void doHide() { 1010ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mWindowVisible) { 1011ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.hide(); 1012ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = false; 1013ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onHide(); 1014ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1015ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1016ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1017c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 10189a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 1019c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 1020c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 1021c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 1022c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 1023c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 1024c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 1025c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1026c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 1027c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1028c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1029c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1030c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 1031c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 1032c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1033c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 1034c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 1035c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 1036c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 1037225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 1038225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 1039c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 1040c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 1041c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1042c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 1043c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1044c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 104569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 10461de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * Equivalent to {@link VoiceInteractionService#setDisabledShowContext 10471de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionService.setDisabledShowContext(int)}. 10481de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn */ 10491de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn public void setDisabledShowContext(int flags) { 10501de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn try { 10511de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn mSystemService.setDisabledShowContext(flags); 10521de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } catch (RemoteException e) { 10531de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 10541de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 10551de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn 10561de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn /** 10571de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * Equivalent to {@link VoiceInteractionService#getDisabledShowContext 10581de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionService.getDisabledShowContext}. 10591de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn */ 10601de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn public int getDisabledShowContext() { 10611de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn try { 10621de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn return mSystemService.getDisabledShowContext(); 10631de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } catch (RemoteException e) { 10641de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn return 0; 10651de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 10661de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 10671de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn 10681de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn /** 106917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * Return which show context flags have been disabled by the user through the system 107017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * settings UI, so the session will never get this data. Returned flags are any combination of 107117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and 107217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT 107317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}. Note that this only tells you about 107417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * global user settings, not about restrictions that may be applied contextual based on 107517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * the current application the user is in or other transient states. 107617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn */ 107717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public int getUserDisabledShowContext() { 107817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn try { 107917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn return mSystemService.getUserDisabledShowContext(); 108017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } catch (RemoteException e) { 108117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn return 0; 108217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } 108317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } 108417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn 108517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn /** 108669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Show the UI for this session. This asks the system to go through the process of showing 108769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * your UI, which will eventually culminate in {@link #onShow}. This is similar to calling 108869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 108969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param args Arbitrary arguments that will be propagated {@link #onShow}. 109069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param flags Indicates additional optional behavior that should be performed. May 10911de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * be any combination of 10921de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and 10931de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT 10941de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionSession.SHOW_WITH_SCREENSHOT} 109569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * to request that the system generate and deliver assist data on the current foreground 109669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * app as part of showing the session UI. 109769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 109869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn public void show(Bundle args, int flags) { 109969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 110069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 110169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 1102ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 110369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn mSystemService.showSessionFromSession(mToken, args, flags); 1104ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 1105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1106ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 110869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 110969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Hide the session's UI, if currently shown. Call this when you are done with your 111069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * user interaction. 111169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 1112ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 111369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 111469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 111569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 1116c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1117ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.hideSessionFromSession(mToken); 1118ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 1119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 1123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 1124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 1125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 1126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 1127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 1128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 1129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 1130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 1131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 1133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1135a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 1137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 1138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 1139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 1140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 1142a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 1143a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 1145a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 1146a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 11472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestConfirmation}, {@link #onRequestPickOption}, 11482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 11492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand} 1150a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1151a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 1152a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 1153a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1154a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 1155a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 1156a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 1157a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 1159c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1162c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1163e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 1164e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 1165c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 1166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 1167c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 1168c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 1169c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1170c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1171c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1172a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 11733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Set whether this session will keep the device awake while it is running a voice 11743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * activity. By default, the system holds a wake lock for it while in this state, 11753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * so that it can work even if the screen is off. Setting this to false removes that 11763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * wake lock, allowing the CPU to go to sleep. This is typically used if the 11773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * session decides it has been waiting too long for a response from the user and 11783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * doesn't want to let this continue to drain the battery. 11793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 11803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * <p>Passing false here will release the wake lock, and you can call later with 11813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * true to re-acquire it. It will also be automatically re-acquired for you each 11823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * time you start a new voice activity task -- that is when you call 11833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link #startVoiceActivity}.</p> 11843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 11853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void setKeepAwake(boolean keepAwake) { 118669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 118769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 118869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 11893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 11903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mSystemService.setKeepAwake(mToken, keepAwake); 11913d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 11923d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 11933d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 11943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 11953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 11964e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * Request that all system dialogs (and status bar shade etc) be closed, allowing 11974e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * access to the session's UI. This will <em>not</em> cause the lock screen to be 11984e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * dismissed. 11994e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn */ 12004e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn public void closeSystemDialogs() { 12014e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn if (mToken == null) { 12024e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 12034e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 12044e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn try { 12054e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn mSystemService.closeSystemDialogs(mToken); 12064e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } catch (RemoteException e) { 12074e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 12084e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 12094e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn 12104e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn /** 1211a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 1212a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1213c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 1214c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 1215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1216c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1217a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1218a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 1219a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 1221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 1222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1224a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 122569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Finish the session. This completely destroys the session -- the next time it is shown, 122669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * an entirely new one will be created. You do not normally call this function; instead, 122769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * use {@link #hide} and allow the system to destroy your session if it needs its RAM. 1228a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 1230c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1231c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 1235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 1236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 12392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 12402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Initiatize a new session. At this point you don't know exactly what this 12412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * session will be used for; you will find that out in {@link #onShow}. 12422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 12432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCreate() { 12442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn doOnCreate(); 12452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 12472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn private void doOnCreate() { 1248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 1249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 1250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 1251c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 1252c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 1253e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 1254ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); 1255225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mWindow.getWindow().addFlags( 1256225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 12572f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 12582f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); 1259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 1260ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); 1261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 1262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1264a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1265ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called when the session UI is going to be shown. This is called after 1266ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link #onCreateContentView} (if the session's content UI needed to be created) and 1267ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * immediately prior to the window being shown. This may be called while the window 1268ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * is already shown, if a show request has come in while it is shown, to allow you to 1269ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * update the UI to match the new show arguments. 1270ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * 1271ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * @param args The arguments that were supplied to 1272ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1273ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * @param showFlags The show flags originally provided to 1274ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1275ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn */ 1276ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onShow(Bundle args, int showFlags) { 1277ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1278ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1279ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 1280ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called immediately after stopping to show the session UI. 1281ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 1282ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onHide() { 1283ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 1284ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 1285ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** 1286a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 1287a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 1289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1292a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 1293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 1295c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 1296c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 1299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 1300c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 1301c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 1302ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT)); 130341607d5a2b8cc4a3fde4a2f75e33a00e8d957b1dAdam Powell mContentFrame.requestApplyInsets(); 1304c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1305c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1306782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn void doOnHandleAssist(Bundle data, AssistStructure structure, Throwable failure, 1307782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn AssistContent content) { 1308782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn if (failure != null) { 1309782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn onAssistStructureFailure(failure); 1310782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1311782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn onHandleAssist(data, structure, content); 1312782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1313782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn 1314782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1315782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called when there has been a failure transferring the {@link AssistStructure} to 1316782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * the assistant. This may happen, for example, if the data is too large and results 1317782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * in an out of memory exception, or the client has provided corrupt data. This will 1318782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * be called immediately before {@link #onHandleAssist} and the AssistStructure supplied 1319782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * there afterwards will be null. 1320782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * 1321782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param failure The failure exception that was thrown when building the 1322782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link AssistStructure}. 1323782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 1324782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void onAssistStructureFailure(Throwable failure) { 1325782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1326782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn 1327782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1328782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called to receive data from the application that the user was currently viewing when 132917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * an assist session is started. If the original show request did not specify 133017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link #SHOW_WITH_ASSIST}, this method will not be called. 1331782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * 1332782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param data Arbitrary data supplied by the app through 1333782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}. 133417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * May be null if assist data has been disabled by the user or device policy. 1335782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param structure If available, the structure definition of all windows currently 133617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * displayed by the app. May be null if assist data has been disabled by the user 133717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * or device policy; will be an empty stub if the application has disabled assist 133817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * by marking its window as secure. 1339782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param content Additional content data supplied by the app through 1340782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}. 134117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * May be null if assist data has been disabled by the user or device policy; will 134217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * not be automatically filled in with data from the app if the app has marked its 134317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * window as secure. 1344782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 134517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public void onHandleAssist(@Nullable Bundle data, @Nullable AssistStructure structure, 134617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn @Nullable AssistContent content) { 134709d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn } 134809d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn 1349782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1350782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called to receive a screenshot of what the user was currently viewing when an assist 135117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * session is started. May be null if screenshots are disabled by the user, policy, 135217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * or application. If the original show request did not specify 135317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link #SHOW_WITH_SCREENSHOT}, this method will not be called. 1354782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 135517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public void onHandleScreenshot(@Nullable Bitmap screenshot) { 135627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 135727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 1358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 1359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1360c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 1363c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 1367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1370c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 1371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1374d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn /** 1375d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * Called when the user presses the back button while focus is in the session UI. Note 1376d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * that this will only happen if the session UI has requested input focus in its window; 1377d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * otherwise, the back key will go to whatever window has focus and do whatever behavior 137869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * it normally has there. The default implementation simply calls {@link #hide}. 1379d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn */ 1380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 1381ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1384a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1385a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 1386a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 138769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * calls {@link #hide}. 1388a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 1390ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 139119695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi } 139219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi 139319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi /** 139419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi * Called when the lockscreen was shown. 139519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi */ 139619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi public void onLockscreenShown() { 139719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi hide(); 1398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 14001e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 14011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 14021e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 14031e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 14041e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 14051e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 14061e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 14071e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 14081e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 14091e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 14101e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 14111e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 1412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 1413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 1414ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height 1415ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * of the window, meaning it should not adjust content underneath. The default touchable 1416ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch 1417ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * events within its window frame. 1418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 1419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 1420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 1421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 1422e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 1423e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 1424ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.right = 0; 1425ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 1426ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.top = decor.getHeight(); 1427c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 1428c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 1429c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1430c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1431a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1432a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 1433a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 1434a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1435a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1436a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1437a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 1438a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 1440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1442a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1443a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 1444a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 1445a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 1446a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 1447a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 1448a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1449a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1450a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1451a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 1452a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 1454ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1457a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1458a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 1459a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1460a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 1461a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 1462a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 1463a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 1464a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 1465a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 14662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public boolean[] onGetSupportedCommands(String[] commands) { 1467593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn return new boolean[commands.length]; 1468a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1469a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1470a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1471a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 1472a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 1473a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 1474a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1475a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1476a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 14772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestConfirmation(ConfirmationRequest request) { 14782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1479a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1480a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 14813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Request for the user to pick one of N options, corresponding to a 14823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 14833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 14843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param request The active request. 14853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 14862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestPickOption(PickOptionRequest request) { 14872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 14883d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 14893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 1490d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 1491d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 1492d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 1493d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 1494d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 1495d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 1496d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 1497d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 14982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCompleteVoice(CompleteVoiceRequest request) { 1499d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 1500d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 1501d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 1502a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 1503a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 1504a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 1505a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 1506a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 1507a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1508a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1509a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 15102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestAbortVoice(AbortVoiceRequest request) { 1511a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1512a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1513a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1514a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 1515a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 1516a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 1517a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1518a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1519a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 15202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCommand(CommandRequest request) { 15212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1522a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1523a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1524593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request} 15252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that was previously delivered to {@link #onRequestConfirmation}, 15262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 15272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand}. 1528a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1529a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 1530a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 15312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCancelRequest(Request request) { 15322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 153357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 153457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn /** 153557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * Print the Service's state into the given stream. This gets invoked by 153657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * {@link VoiceInteractionSessionService} when its Service 153757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * {@link android.app.Service#dump} method is called. 153857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * 153957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param prefix Text to print at the front of each line. 154057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param fd The raw file descriptor that the dump is being sent to. 154157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param writer The PrintWriter to which you should dump your state. This will be 154257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * closed for you after you return. 154357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param args additional arguments to the dump request. 154457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn */ 154557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 154657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mToken="); writer.println(mToken); 154757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme)); 154857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mInitialized="); writer.println(mInitialized); 154957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded); 155057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mWindowVisible="); writer.println(mWindowVisible); 155157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible); 155257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mInShowWindow="); writer.println(mInShowWindow); 155357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mActiveRequests.size() > 0) { 155457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println("Active requests:"); 155557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn String innerPrefix = prefix + " "; 155657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int i=0; i<mActiveRequests.size(); i++) { 155757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn Request req = mActiveRequests.valueAt(i); 155857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 155957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(": "); 156057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(req); 156157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn req.dump(innerPrefix, fd, writer, args); 156257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 156357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 156457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 156557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 156691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 1567