VoiceInteractionSession.java revision 225d3b5449d29b43e619d8538d024305f6e81ba9
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 19c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 213d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor; 2291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 24c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 2527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap; 26e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 28c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 2991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 37e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 38c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 39c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 40c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 46225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 4791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 4891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 4991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 53a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 54a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 55c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 56c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 57a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 584e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation 59ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer. The user interface is 60ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()} 61ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built. 624e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * 634e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish} 644e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done. It can also initiate voice interactions with applications by calling 654e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>. 66a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback { 6891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 6991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final boolean DEBUG = true; 7091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 89c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 90c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 91c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 92c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 93c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 94c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 95c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 96a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 97a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 98a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 102a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) { 103a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION, 10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 10691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn prompt, extras)); 10791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 1113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public IVoiceInteractorRequest startPickOption(String callingPackage, 1123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn IVoiceInteractorCallback callback, CharSequence prompt, 1133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 1143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn Request request = newRequest(callback); 1153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOO(MSG_START_PICK_OPTION, 1163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 1173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn prompt, options, extras)); 1183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return request.mInterface; 1193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 1203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 1213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn @Override 122d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 123d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 124d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Request request = newRequest(callback); 125d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE, 126d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James new Caller(callingPackage, Binder.getCallingUid()), request, 127d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James message, extras)); 128d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 129d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 130d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 131d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 132a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 133a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 134a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 135a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE, 136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn message, extras)); 138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND, 14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn command, extras)); 14891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 0, new Caller(callingPackage, Binder.getCallingUid()), commands); 15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 167225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public void show(Bundle sessionArgs, int flags, 168225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi IVoiceInteractionSessionShowCallback showCallback) { 169225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW, 170225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi flags, sessionArgs, showCallback)); 171ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 172ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 173ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 174ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 175ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE)); 176ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 177ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 178ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 179ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void handleAssist(Bundle assistBundle) { 180ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_ASSIST, 181ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn assistBundle)); 182ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 183ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 184ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn @Override 18527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void handleScreenshot(Bitmap screenshot) { 18627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT, 18727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn screenshot)); 18827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 18927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 19027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn @Override 191c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 192c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 193c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 194c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 195c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 196c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 197c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 198c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 200c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 202c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 204c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 205c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 206c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 208c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Request { 21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 217a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 218a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 219a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 220a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 221a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 22491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 225a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 226a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 227a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) { 22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 229a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 230a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 231a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 232a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 238a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 239a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 240a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 241a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 243a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 24591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendConfirmResult(boolean confirmed, Bundle result) { 24791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 24891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 24991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendPickOptionResult(boolean finished, 2573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 2583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 2593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface 2603d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " finished=" + finished + " selections=" + selections 2613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " result=" + result); 2623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 2633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 2643d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2653d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverPickOptionResult(mInterface, finished, selections, result); 2663d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 2673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2693d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 270d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void sendCompleteVoiceResult(Bundle result) { 271d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James try { 272d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 273d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " result=" + result); 274d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James finishRequest(); 275d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mCallback.deliverCompleteVoiceResult(mInterface, result); 276d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } catch (RemoteException e) { 277d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 278d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 279d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 280a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void sendAbortVoiceResult(Bundle result) { 281a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn try { 282a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 283a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " result=" + result); 284a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 285a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 286a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } catch (RemoteException e) { 287a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 288a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 289a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 2903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendCommandResult(boolean finished, Bundle result) { 29191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 29391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " result=" + result); 2943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 2953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 2963d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverCommandResult(mInterface, finished, result); 29891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 29991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 30291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendCancelResult() { 30391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 30491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 30691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 30791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 30991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 31091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 31191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Caller { 31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final String packageName; 31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int uid; 31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Caller(String _packageName, int _uid) { 31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn packageName = _packageName; 31891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn uid = _uid; 31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 3233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_PICK_OPTION = 2; 3243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMPLETE_VOICE = 3; 3253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_ABORT_VOICE = 4; 3263d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMMAND = 5; 3273d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 6; 3283d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_CANCEL = 7; 32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 331c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 332c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 333c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 334ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn static final int MSG_HANDLE_ASSIST = 104; 33527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HANDLE_SCREENSHOT = 105; 33627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_SHOW = 106; 33727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HIDE = 107; 338c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 339c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 34091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 34191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 342c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SomeArgs args; 34391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 34491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 345c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface 34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " prompt=" + args.arg3 + " extras=" + args.arg4); 348a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3, 34991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle)args.arg4); 35091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 3513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn case MSG_START_PICK_OPTION: 3523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn args = (SomeArgs)msg.obj; 3533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (DEBUG) Log.d(TAG, "onPickOption: req=" + ((Request) args.arg2).mInterface 3543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " prompt=" + args.arg3 + " options=" + args.arg4 3553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " extras=" + args.arg5); 3563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn onPickOption((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3, 3573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn (VoiceInteractor.PickOptionRequest.Option[])args.arg4, 3583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn (Bundle)args.arg5); 3593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn break; 360d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 361d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James args = (SomeArgs)msg.obj; 362d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface 363d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " message=" + args.arg3 + " extras=" + args.arg4); 364d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James onCompleteVoice((Caller) args.arg1, (Request) args.arg2, 365d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James (CharSequence) args.arg3, (Bundle) args.arg4); 366d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 367a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 368a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn args = (SomeArgs)msg.obj; 369a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface 370a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " message=" + args.arg3 + " extras=" + args.arg4); 371a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3, 372a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn (Bundle) args.arg4); 373a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 37491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 37691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface 37791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " command=" + args.arg3 + " extras=" + args.arg4); 37891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3, 37991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle) args.arg4); 38091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 38191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 38391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2); 38491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2); 38591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 38691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 387ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj)); 388ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onCancel((Request)msg.obj); 38991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 408ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn case MSG_HANDLE_ASSIST: 40927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleAssist: " + msg.obj); 410ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn onHandleAssist((Bundle) msg.obj); 411ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn break; 41227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn case MSG_HANDLE_SCREENSHOT: 41327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj); 41427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn onHandleScreenshot((Bitmap) msg.obj); 41527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn break; 416ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_SHOW: 417225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi args = (SomeArgs)msg.obj; 418225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1 419225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " flags=" + msg.arg1 420225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " showCallback=" + args.arg2); 421225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi doShow((Bundle) args.arg1, msg.arg1, 422225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi (IVoiceInteractionSessionShowCallback) args.arg2); 423ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 424ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_HIDE: 425ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "doHide"); 426ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn doHide(); 427ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 42891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 42991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 43091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 431c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 432c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 433c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 434c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 435c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 436c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 437c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 438c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 442c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 443c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 444e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 445c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 446c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 451e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 493e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 494e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 49991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 50091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 50191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 50291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 50391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 50491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 50591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 50691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 50891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 50991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 510a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request newRequest(IVoiceInteractorCallback callback) { 511a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn synchronized (this) { 512a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = new Request(callback, this); 513a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 514a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return req; 515a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 516a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 517a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 518a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 51991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 5208ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe return mActiveRequests.remove(reqInterface); 52191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 52291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 52391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 524ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args, 525ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn int startFlags) { 526c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 527c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 528ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn onCreate(args, startFlags); 529c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 530c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 531225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) { 532ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 533ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 534ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 535ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mInShowWindow) { 536ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 537ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn return; 538ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 539ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 540ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 541ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = true; 542ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 543ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowAdded) { 544ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowAdded = true; 545ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn View v = onCreateContentView(); 546ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (v != null) { 547ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn setContentView(v); 548ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 549ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 550ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 551ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onShow(args, flags); 552ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 553ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = true; 554ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.show(); 555ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 556225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (showCallback != null) { 557225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.invalidate(); 558225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().addOnPreDrawListener( 559225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi new ViewTreeObserver.OnPreDrawListener() { 560225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi @Override 561225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public boolean onPreDraw() { 562225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().removeOnPreDrawListener(this); 563225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi try { 564225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi showCallback.onShown(); 565225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } catch (RemoteException e) { 566225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi Log.w(TAG, "Error calling onShown", e); 567225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 568225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi return true; 569225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 570225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi }); 571225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 572ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } finally { 573ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowWasVisible = true; 574ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = false; 575ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 576ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 577ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 578ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn void doHide() { 579ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mWindowVisible) { 580ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.hide(); 581ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = false; 582ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onHide(); 583ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 584ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 585ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 586c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 5879a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 588c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 589c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 590c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 591c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 592c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 593c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 594c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 595c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 596c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 597c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 598c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 599c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 600c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 601c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 602c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 603c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 604c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 605c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 606225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 607225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 608c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 609c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 610c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 611c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 612c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 614ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void show() { 615ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 616ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.showSessionFromSession(mToken, null, 0); 617ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 619ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 620c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 621ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 623ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.hideSessionFromSession(mToken); 624ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 626c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 627c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 628ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** TODO: remove */ 629ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void showWindow() { 630ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 631ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 632ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** TODO: remove */ 633c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void hideWindow() { 634c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 635c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 636c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 637c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 639c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 641c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 643c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 644c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 648c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 649a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 650a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 651a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 652a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 653a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 654a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 655a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 656a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 657a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 658a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 659a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 660a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 661a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}. 662a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 663a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 664a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 665a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 666a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 667a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 668a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 669a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 670c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 671c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 672c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 673c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 674c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 675e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 676e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 677c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 678c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 679c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 680c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 681c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 682c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 683c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 684a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 6853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Set whether this session will keep the device awake while it is running a voice 6863d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * activity. By default, the system holds a wake lock for it while in this state, 6873d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * so that it can work even if the screen is off. Setting this to false removes that 6883d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * wake lock, allowing the CPU to go to sleep. This is typically used if the 6893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * session decides it has been waiting too long for a response from the user and 6903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * doesn't want to let this continue to drain the battery. 6913d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 6923d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * <p>Passing false here will release the wake lock, and you can call later with 6933d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * true to re-acquire it. It will also be automatically re-acquired for you each 6943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * time you start a new voice activity task -- that is when you call 6953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link #startVoiceActivity}.</p> 6963d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 6973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void setKeepAwake(boolean keepAwake) { 6983d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 6993d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mSystemService.setKeepAwake(mToken, keepAwake); 7003d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 7013d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 7023d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 7033d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 7043d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 705a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 706a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 707c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 708c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 709c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 710c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 711a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 712a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 713a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 714c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 715c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 716c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 717c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 718a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 719a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Finish the session. 720a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 721c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 722c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 723c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 724c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 725c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn hideWindow(); 726c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 727c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 728c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 729c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 731c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 732ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** @hide */ 733c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCreate(Bundle args) { 734c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 735c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 736c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 737c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 738c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 739e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 740ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); 741225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mWindow.getWindow().addFlags( 742225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 743225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 744c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 745ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); 746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 749a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 750ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Initiatize a new session. The given args and showFlags are the initial values 751ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * passed to {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}, 752ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * if possible. Normally you should handle these in {@link #onShow}. 753ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 754ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onCreate(Bundle args, int showFlags) { 755ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onCreate(args); 756ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 757ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 758ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 759ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called when the session UI is going to be shown. This is called after 760ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link #onCreateContentView} (if the session's content UI needed to be created) and 761ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * immediately prior to the window being shown. This may be called while the window 762ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * is already shown, if a show request has come in while it is shown, to allow you to 763ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * update the UI to match the new show arguments. 764ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * 765ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * @param args The arguments that were supplied to 766ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 767ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * @param showFlags The show flags originally provided to 768ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 769ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn */ 770ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onShow(Bundle args, int showFlags) { 771ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 772ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 773ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 774ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called immediately after stopping to show the session UI. 775ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 776ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onHide() { 777ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 778ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 779ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** 780a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 781a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 782c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 783c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 784c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 785a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 786a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 787a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 788c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 789c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 790c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 791c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 792c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 793c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 795c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 796ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT)); 797c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 798c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 799c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 800ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void onHandleAssist(Bundle assistBundle) { 801ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 802ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 80327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void onHandleScreenshot(Bitmap screenshot) { 80427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 80527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 806c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 807c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 816c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 820c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 821c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 822c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 823ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 824c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 825c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 826a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 827a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 828a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 829a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * calls {@link #finish}. 830a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 832ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 837ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height 838ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * of the window, meaning it should not adjust content underneath. The default touchable 839ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch 840ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * events within its window frame. 841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 842c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 843c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 844c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 845e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 846e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 847ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.right = 0; 848ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 849ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.top = decor.getHeight(); 850c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 851c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 852c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 853c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 854a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 855a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 856a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 857a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 858a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 859a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 860a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 861a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 862c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 863c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 864c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 865a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 866a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 867a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 868a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 869a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 870a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 871a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 872a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 873a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 874a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 875a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 876c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 877ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 878c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 880a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 881a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 882a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 883a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 884a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 885a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 886a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 887a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 888a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 889a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 890a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public boolean[] onGetSupportedCommands(Caller caller, String[] commands) { 891a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return new boolean[commands.length]; 892a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 893a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 894a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 895a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 896a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 897a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 898a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 899a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 900a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 901a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param prompt The prompt informing the user of what will happen, as per 902a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 903a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 904a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 905a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 906a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public abstract void onConfirm(Caller caller, Request request, CharSequence prompt, 907a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Bundle extras); 908a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 909a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 9103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Request for the user to pick one of N options, corresponding to a 9113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 9133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param caller Who is making the request. 9143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param request The active request. 9153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param prompt The prompt informing the user of what they are picking, as per 9163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param options The set of options the user is picking from, as per 9183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param extras Any additional information, as per 9203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 9223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public abstract void onPickOption(Caller caller, Request request, CharSequence prompt, 9233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras); 9243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 9253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 926d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 927d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 928d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 929d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 930d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 931d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 932d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param caller Who is making the request. 933d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 934d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param message The message informing the user of the problem, as per 935d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 936d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 937d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param extras Any additional information, as per 938d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 939d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 940d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 941d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void onCompleteVoice(Caller caller, Request request, CharSequence message, 942d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Bundle extras) { 943d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James request.sendCompleteVoiceResult(null); 944d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 945d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 946d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 947a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 948a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 949a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 950a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 951a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 952a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 953a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 954a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 955a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param message The message informing the user of the problem, as per 956a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 957a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 958a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 959a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 960a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) { 961a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn request.sendAbortVoiceResult(null); 962a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 963a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 964a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 965a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 966a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 967a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 968a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 969a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 970a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 971a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param command The command that is being executed, as per 972a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 973a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 974a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 975a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 97691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCommand(Caller caller, Request request, String command, Bundle extras); 977a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 978a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 979a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request} 980a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * that was previously delivered to {@link #onConfirm} or {@link #onCommand}. 981a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 982a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 983a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 98491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCancel(Request request); 98591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 986