VoiceInteractionSession.java revision 1e38382b542f5cef9957a89692b02c55a3dd351c
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 195688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackbornimport android.app.AssistStructure; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 223d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor; 231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2; 2491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 25c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration; 27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 2827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap; 29e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 30c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 31c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 40e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 49225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 5391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 56a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 57a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 58c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 60a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 614e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation 62ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer. The user interface is 63ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()} 64ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built. 654e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * 664e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish} 674e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done. It can also initiate voice interactions with applications by calling 684e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>. 69a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 701e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback, 711e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn ComponentCallbacks2 { 7291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 7391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final boolean DEBUG = true; 7491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 89c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 90c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 91c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 92c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 93c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 94c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 95c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 96c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 97c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 98c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 99c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 100a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 101a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 102a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 106a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) { 107a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION, 10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn prompt, extras)); 11191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 11291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 11391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 11491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 1153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public IVoiceInteractorRequest startPickOption(String callingPackage, 1163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn IVoiceInteractorCallback callback, CharSequence prompt, 1173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 1183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn Request request = newRequest(callback); 1193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOO(MSG_START_PICK_OPTION, 1203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 1213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn prompt, options, extras)); 1223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return request.mInterface; 1233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 1243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 1253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn @Override 126d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 127d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 128d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Request request = newRequest(callback); 129d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE, 130d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James new Caller(callingPackage, Binder.getCallingUid()), request, 131d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James message, extras)); 132d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 133d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 134d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 135d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE, 140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn message, extras)); 142a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 143a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 145a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 148a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND, 15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn command, extras)); 15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 0, new Caller(callingPackage, Binder.getCallingUid()), commands); 15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 16691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 16891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 170c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 171225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public void show(Bundle sessionArgs, int flags, 172225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi IVoiceInteractionSessionShowCallback showCallback) { 173225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW, 174225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi flags, sessionArgs, showCallback)); 175ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 176ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 177ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 178ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 179ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE)); 180ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 181ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 182ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 183ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void handleAssist(Bundle assistBundle) { 1845688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // We want to pre-warm the AssistStructure before handing it off to the main 1855688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // thread. There is a strong argument to be made that it should be handed 1865688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // through as a separate param rather than part of the assistBundle. 1875688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn if (assistBundle != null) { 1885688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn Bundle assistContext = assistBundle.getBundle(Intent.EXTRA_ASSIST_CONTEXT); 1895688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn if (assistContext != null) { 1905688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn AssistStructure as = AssistStructure.getAssistStructure(assistContext); 1915688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn if (as != null) { 1925688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn as.ensureData(); 1935688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn } 1945688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn } 1955688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn } 196ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_ASSIST, 197ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn assistBundle)); 198ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 199ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 200ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn @Override 20127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void handleScreenshot(Bitmap screenshot) { 20227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT, 20327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn screenshot)); 20427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 20527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 20627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn @Override 207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 208c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 211c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 212c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 213c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 214c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 216c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 219c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 22991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Request { 23091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 23191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 23291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 23891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 23991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 24091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 241a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 243a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) { 24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 245a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 246a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 247a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 248a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 249a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 252a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 253a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 254a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 255a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 256a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 257a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 258a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 259a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 26091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 26191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 26291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendConfirmResult(boolean confirmed, Bundle result) { 26391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 26491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 26591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 266a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 26791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 26891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 26991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 27091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendPickOptionResult(boolean finished, 2733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 2743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 2753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface 2763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " finished=" + finished + " selections=" + selections 2773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " result=" + result); 2783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 2793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 2803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverPickOptionResult(mInterface, finished, selections, result); 2823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 2833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 2853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 286d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void sendCompleteVoiceResult(Bundle result) { 287d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James try { 288d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 289d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " result=" + result); 290d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James finishRequest(); 291d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mCallback.deliverCompleteVoiceResult(mInterface, result); 292d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } catch (RemoteException e) { 293d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 294d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 295d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 296a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void sendAbortVoiceResult(Bundle result) { 297a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn try { 298a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 299a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " result=" + result); 300a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 301a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 302a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } catch (RemoteException e) { 303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 304a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendCommandResult(boolean finished, Bundle result) { 30791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 30991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " result=" + result); 3103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 3113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 3123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 3133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverCommandResult(mInterface, finished, result); 31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 31891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendCancelResult() { 31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 321a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 32391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 32891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Caller { 32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final String packageName; 33091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int uid; 33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 33291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Caller(String _packageName, int _uid) { 33391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn packageName = _packageName; 33491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn uid = _uid; 33591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 33691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 33791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 33891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 3393d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_PICK_OPTION = 2; 3403d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMPLETE_VOICE = 3; 3413d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_ABORT_VOICE = 4; 3423d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMMAND = 5; 3433d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 6; 3443d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_CANCEL = 7; 34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 346c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 347c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 348c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 350ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn static final int MSG_HANDLE_ASSIST = 104; 35127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HANDLE_SCREENSHOT = 105; 35227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_SHOW = 106; 35327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HIDE = 107; 354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 35691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 35791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SomeArgs args; 35991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 36091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 36291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface 36391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " prompt=" + args.arg3 + " extras=" + args.arg4); 364a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3, 36591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle)args.arg4); 36691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 3673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn case MSG_START_PICK_OPTION: 3683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn args = (SomeArgs)msg.obj; 3693d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (DEBUG) Log.d(TAG, "onPickOption: req=" + ((Request) args.arg2).mInterface 3703d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " prompt=" + args.arg3 + " options=" + args.arg4 3713d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " extras=" + args.arg5); 3723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn onPickOption((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3, 3733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn (VoiceInteractor.PickOptionRequest.Option[])args.arg4, 3743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn (Bundle)args.arg5); 3753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn break; 376d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 377d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James args = (SomeArgs)msg.obj; 378d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface 379d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " message=" + args.arg3 + " extras=" + args.arg4); 380d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James onCompleteVoice((Caller) args.arg1, (Request) args.arg2, 381d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James (CharSequence) args.arg3, (Bundle) args.arg4); 382d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 383a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 384a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn args = (SomeArgs)msg.obj; 385a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface 386a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " message=" + args.arg3 + " extras=" + args.arg4); 387a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3, 388a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn (Bundle) args.arg4); 389a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 39091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 39291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface 39391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " command=" + args.arg3 + " extras=" + args.arg4); 39491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3, 39591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle) args.arg4); 39691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 39791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 39991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2); 40091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2); 40191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 40291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 403ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj)); 404ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onCancel((Request)msg.obj); 40591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 422c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 423c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 424ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn case MSG_HANDLE_ASSIST: 42527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleAssist: " + msg.obj); 426ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn onHandleAssist((Bundle) msg.obj); 427ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn break; 42827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn case MSG_HANDLE_SCREENSHOT: 42927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj); 43027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn onHandleScreenshot((Bitmap) msg.obj); 43127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn break; 432ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_SHOW: 433225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi args = (SomeArgs)msg.obj; 434225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1 435225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " flags=" + msg.arg1 436225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " showCallback=" + args.arg2); 437225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi doShow((Bundle) args.arg1, msg.arg1, 438225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi (IVoiceInteractionSessionShowCallback) args.arg2); 439ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 440ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_HIDE: 441ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "doHide"); 442ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn doHide(); 443ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 44491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 44591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 44691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 460e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 467e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 509e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 510e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 512c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 513c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 514c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 51591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 51691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 51791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 51891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 51991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 52091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 52191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 52291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 52491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 52591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 526d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn public Context getContext() { 527d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn return mContext; 528d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn } 529d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn 530a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request newRequest(IVoiceInteractorCallback callback) { 531a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn synchronized (this) { 532a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = new Request(callback, this); 533a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 534a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return req; 535a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 536a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 537a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 538a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 53991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 5408ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe return mActiveRequests.remove(reqInterface); 54191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 54291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 54391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 544ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args, 545ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn int startFlags) { 546c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 547c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 548ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn onCreate(args, startFlags); 549c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 550c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 551225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) { 552ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 553ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 554ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 555ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mInShowWindow) { 556ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 557ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn return; 558ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 559ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 560ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 561ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = true; 562ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 563ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowAdded) { 564ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowAdded = true; 565ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn View v = onCreateContentView(); 566ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (v != null) { 567ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn setContentView(v); 568ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 569ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 570ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 571ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onShow(args, flags); 572ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 573ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = true; 574ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.show(); 575ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 576225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (showCallback != null) { 577225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.invalidate(); 578225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().addOnPreDrawListener( 579225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi new ViewTreeObserver.OnPreDrawListener() { 580225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi @Override 581225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public boolean onPreDraw() { 582225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().removeOnPreDrawListener(this); 583225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi try { 584225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi showCallback.onShown(); 585225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } catch (RemoteException e) { 586225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi Log.w(TAG, "Error calling onShown", e); 587225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 588225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi return true; 589225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 590225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi }); 591225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 592ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } finally { 593ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowWasVisible = true; 594ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = false; 595ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 596ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 597ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 598ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn void doHide() { 599ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mWindowVisible) { 600ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.hide(); 601ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = false; 602ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onHide(); 603ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 604ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 605ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 606c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 6079a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 608c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 609c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 610c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 611c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 612c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 614c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 615c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 616c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 617c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 619c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 620c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 621c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 623c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 624c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 626225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 627225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 628c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 629c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 630c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 631c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 632c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 633c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 634ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void show() { 635ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 636ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.showSessionFromSession(mToken, null, 0); 637ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 639ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 641ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 643ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.hideSessionFromSession(mToken); 644ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 648ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** TODO: remove */ 649ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void showWindow() { 650ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 651ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 652ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** TODO: remove */ 653c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void hideWindow() { 654c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 655c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 656c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 657c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 658c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 659c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 660c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 661c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 662c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 663c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 664c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 665c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 666c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 667c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 668c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 669a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 670a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 671a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 672a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 673a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 674a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 675a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 676a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 677a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 678a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 679a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 680a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 681a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}. 682a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 683a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 684a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 685a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 686a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 687a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 688a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 689a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 690c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 691c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 692c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 693c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 694c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 695e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 696e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 697c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 698c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 699c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 700c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 701c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 702c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 703c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 704a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 7053d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Set whether this session will keep the device awake while it is running a voice 7063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * activity. By default, the system holds a wake lock for it while in this state, 7073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * so that it can work even if the screen is off. Setting this to false removes that 7083d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * wake lock, allowing the CPU to go to sleep. This is typically used if the 7093d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * session decides it has been waiting too long for a response from the user and 7103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * doesn't want to let this continue to drain the battery. 7113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 7123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * <p>Passing false here will release the wake lock, and you can call later with 7133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * true to re-acquire it. It will also be automatically re-acquired for you each 7143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * time you start a new voice activity task -- that is when you call 7153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link #startVoiceActivity}.</p> 7163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 7173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void setKeepAwake(boolean keepAwake) { 7183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 7193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mSystemService.setKeepAwake(mToken, keepAwake); 7203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 7213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 7223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 7233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 7243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 725a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 726a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 727c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 728c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 729c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 731a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 732a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 733a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 734c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 735c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 736c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 737c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 738a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 739a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Finish the session. 740a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 741c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 742c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 743c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 744c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 745c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn hideWindow(); 746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 749c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 750c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 751c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 752ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** @hide */ 753c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCreate(Bundle args) { 754c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 755c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 756c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 757c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 758c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 759e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 760ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); 761225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mWindow.getWindow().addFlags( 762225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 763225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 764c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 765ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); 766c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 767c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 768c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 769a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 770ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Initiatize a new session. The given args and showFlags are the initial values 771ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * passed to {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}, 772ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * if possible. Normally you should handle these in {@link #onShow}. 773ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 774ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onCreate(Bundle args, int showFlags) { 775ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onCreate(args); 776ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 777ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 778ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 779ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called when the session UI is going to be shown. This is called after 780ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link #onCreateContentView} (if the session's content UI needed to be created) and 781ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * immediately prior to the window being shown. This may be called while the window 782ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * is already shown, if a show request has come in while it is shown, to allow you to 783ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * update the UI to match the new show arguments. 784ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * 785ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * @param args The arguments that were supplied to 786ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 787ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * @param showFlags The show flags originally provided to 788ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 789ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn */ 790ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onShow(Bundle args, int showFlags) { 791ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 792ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 793ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 794ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called immediately after stopping to show the session UI. 795ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 796ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onHide() { 797ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 798ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 799ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** 800a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 801a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 802c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 803c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 804c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 805a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 806a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 807a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 816ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT)); 817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 820ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void onHandleAssist(Bundle assistBundle) { 821ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 822ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 82327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void onHandleScreenshot(Bitmap screenshot) { 82427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 82527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 826c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 827c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 828c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 829c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 830c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 832c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 837c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 838c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 839c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 840c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 842d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn /** 843d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * Called when the user presses the back button while focus is in the session UI. Note 844d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * that this will only happen if the session UI has requested input focus in its window; 845d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * otherwise, the back key will go to whatever window has focus and do whatever behavior 846d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * it normally has there. 847d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn */ 848c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 849ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 850c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 851c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 852a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 853a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 854a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 855a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * calls {@link #finish}. 856a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 857c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 858ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 859c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 860c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 8611e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 8621e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 8631e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 8641e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 8651e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 8661e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 8671e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 8681e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 8691e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 8701e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 8711e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 8721e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 873c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 874c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 875ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height 876ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * of the window, meaning it should not adjust content underneath. The default touchable 877ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch 878ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * events within its window frame. 879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 880c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 881c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 882c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 883e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 884e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 885ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.right = 0; 886ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 887ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.top = decor.getHeight(); 888c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 892a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 893a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 894a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 895a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 896a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 897a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 898a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 899a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 902c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 903a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 904a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 905a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 906a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 907a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 908a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 909a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 910a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 911a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 912a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 913a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 915ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 917c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 918a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 919a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 920a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 921a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 922a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 923a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 924a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 925a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 926a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 927a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 928a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public boolean[] onGetSupportedCommands(Caller caller, String[] commands) { 929a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return new boolean[commands.length]; 930a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 931a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 932a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 933a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 934a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 935a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 936a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 937a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 938a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 939a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param prompt The prompt informing the user of what will happen, as per 940a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 941a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 942a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 943a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 944a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public abstract void onConfirm(Caller caller, Request request, CharSequence prompt, 945a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Bundle extras); 946a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 947a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 9483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Request for the user to pick one of N options, corresponding to a 9493d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9503d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 9513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param caller Who is making the request. 9523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param request The active request. 9533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param prompt The prompt informing the user of what they are picking, as per 9543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param options The set of options the user is picking from, as per 9563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param extras Any additional information, as per 9583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 9593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 9603d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public abstract void onPickOption(Caller caller, Request request, CharSequence prompt, 9613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras); 9623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 9633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 964d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 965d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 966d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 967d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 968d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 969d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 970d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param caller Who is making the request. 971d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 972d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param message The message informing the user of the problem, as per 973d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 974d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 975d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param extras Any additional information, as per 976d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 977d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 978d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 979d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void onCompleteVoice(Caller caller, Request request, CharSequence message, 980d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Bundle extras) { 981d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James request.sendCompleteVoiceResult(null); 982d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 983d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 984d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 985a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 986a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 987a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 988a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 989a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 990a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 991a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 992a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 993a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param message The message informing the user of the problem, as per 994a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 995a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 996a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 997a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 998a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) { 999a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn request.sendAbortVoiceResult(null); 1000a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1001a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1002a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1003a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 1004a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 1005a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 1006a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1007a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 1008a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1009a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param command The command that is being executed, as per 1010a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 1011a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 1012a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 1013a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 101491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCommand(Caller caller, Request request, String command, Bundle extras); 1015a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1016a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1017a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request} 1018a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * that was previously delivered to {@link #onConfirm} or {@link #onCommand}. 1019a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1020a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 1021a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 102291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCancel(Request request); 102391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 1024