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 19d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackbornimport android.annotation.SystemApi; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 2291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 24c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 25e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 26c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 2891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 2991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 36e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 37c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 38c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 39c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 40c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 4591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 4691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 4791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 4891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 4991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 51a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 52a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 53c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 55c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 56a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 57d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * An active interaction session, started by a {@link VoiceInteractionService}. 58a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback { 6091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 6191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final boolean DEBUG = true; 6291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 63c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 68c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 69c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 70c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final int[] mTmpLocation = new int[2]; 88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 89a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 90a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 91a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 9391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 95a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) { 96a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION, 9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn prompt, extras)); 10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 104d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 105d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 106d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Request request = newRequest(callback); 107d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE, 108d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James new Caller(callingPackage, Binder.getCallingUid()), request, 109d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James message, extras)); 110d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 111d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 112d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 113d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 114a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 115a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn IVoiceInteractorCallback callback, CharSequence message, Bundle extras) { 116a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 117a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE, 118a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 119a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn message, extras)); 120a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 121a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 122a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 123a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 12491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 12591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 126a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request request = newRequest(callback); 12791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND, 12891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 12991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn command, extras)); 13091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 13191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 13291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 13391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 13491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 13591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 13691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 0, new Caller(callingPackage, Binder.getCallingUid()), commands); 13791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 13891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 13991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 14091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 14191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 149c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 150c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 151c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 152c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 153c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 154c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 155c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 156c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 157c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 159c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 162c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 163c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 164c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 165c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 167c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 168c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 17091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 171d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 172d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 173d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 174d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Request { 17691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 17791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 179a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 180a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 181a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 182a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 183a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 187a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 188a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 189a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) { 19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 191a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 192a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 193a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 194a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 195a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 196a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 197a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 198a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 199a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 200a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 201a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 202a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 203a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 204a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 205a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 20791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendConfirmResult(boolean confirmed, Bundle result) { 20991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 21091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 212a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 21791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 218d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void sendCompleteVoiceResult(Bundle result) { 219d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James try { 220d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 221d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " result=" + result); 222d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James finishRequest(); 223d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mCallback.deliverCompleteVoiceResult(mInterface, result); 224d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } catch (RemoteException e) { 225d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 226d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 227d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 228a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void sendAbortVoiceResult(Bundle result) { 229a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn try { 230a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 231a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " result=" + result); 232a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } catch (RemoteException e) { 235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 23818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void sendCommandResult(boolean complete, Bundle result) { 23991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 24091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 24191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " result=" + result); 242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 24318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mCallback.deliverCommandResult(mInterface, complete, result); 24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 24591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 24791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 24891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendCancelResult() { 24991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 25091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 258d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 259d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 260d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 261d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 26291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Caller { 26391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final String packageName; 26491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int uid; 26591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 26691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Caller(String _packageName, int _uid) { 26791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn packageName = _packageName; 26891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn uid = _uid; 26991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 27091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 27291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 273d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James static final int MSG_START_COMPLETE_VOICE = 2; 274d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James static final int MSG_START_ABORT_VOICE = 3; 275d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James static final int MSG_START_COMMAND = 4; 276d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James static final int MSG_SUPPORTS_COMMANDS = 5; 277d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James static final int MSG_CANCEL = 6; 27891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 28591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 28691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SomeArgs args; 28891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 28991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 29191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface 29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " prompt=" + args.arg3 + " extras=" + args.arg4); 293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3, 29491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle)args.arg4); 29591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 296d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 297d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James args = (SomeArgs)msg.obj; 298d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface 299d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " message=" + args.arg3 + " extras=" + args.arg4); 300d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James onCompleteVoice((Caller) args.arg1, (Request) args.arg2, 301d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James (CharSequence) args.arg3, (Bundle) args.arg4); 302d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 304a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn args = (SomeArgs)msg.obj; 305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface 306a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " message=" + args.arg3 + " extras=" + args.arg4); 307a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3, 308a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn (Bundle) args.arg4); 309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 31091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 311c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface 31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " command=" + args.arg3 + " extras=" + args.arg4); 31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3, 31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle) args.arg4); 31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 318c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2); 32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2); 32191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 323c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request) args.arg1).mInterface); 32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCancel((Request)args.arg1); 32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 327c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 328c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 329c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 331c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 332c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 333c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 334c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 335c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 336c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 337c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 338c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 339c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 340c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 341c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 342c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 343c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 344c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 348c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 350c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 351c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 352c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 353c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 356c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 357d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 360d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 363e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 370e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 374c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 376c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 377c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 378c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 379c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 381c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 384c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 385c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 386c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 387c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 388c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 412e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 413e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 41891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 41991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 42091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 42191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 42291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 42391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 42491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 42591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 426c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 42791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 42891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 429a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request newRequest(IVoiceInteractorCallback callback) { 430a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn synchronized (this) { 431a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = new Request(callback, this); 432a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 433a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return req; 434a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 435a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 436a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 437a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 43891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 439a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = mActiveRequests.get(reqInterface); 44091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (req != null) { 441a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mActiveRequests.remove(req); 44291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 44391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return req; 44491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 44591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 44691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args) { 448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCreate(args); 451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 4549a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 480d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 481d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 482d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 483d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void showWindow() { 485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInShowWindow) { 489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return; 491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInShowWindow = true; 495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (!mWindowVisible) { 496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowVisible = true; 497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (!mWindowAdded) { 498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = true; 499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View v = onCreateContentView(); 500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (v != null) { 501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn setContentView(v); 502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.show(); 505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } finally { 507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowWasVisible = true; 508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInShowWindow = false; 509c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 510c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 512d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 513d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 514d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 515d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 516c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void hideWindow() { 517c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowVisible) { 518c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.hide(); 519c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowVisible = false; 520c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 521c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 522c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 524d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 525c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 526c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 527c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 528c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 529c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 530d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 531c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 532c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 533c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 534c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 535c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 536c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 537c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 538a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 539d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 540a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 541a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 542a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 543a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 544a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 545a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 546a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 547a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 548a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 549a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 550a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 551a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}. 552a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 553a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 554a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 555a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 556a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 557a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 558a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 559a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 560d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 561c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 562c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 563c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 564c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 565c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 566e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 567e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 568c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 569c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 570c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 571c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 572c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 573c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 574c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 575a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 576d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 577a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 578a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 579d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 580c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 581c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 582c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 583c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 584a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 585d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 586a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 587a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 588d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 589c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 590c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 591c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 592c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 593a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 594a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Finish the session. 595a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 596c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 597c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 598c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 599c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 600c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn hideWindow(); 601c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 602c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 603c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 604c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 605c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 606c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 607a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 608a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Initiatize a new session. 609a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 610a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param args The arguments that were supplied to 611a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link VoiceInteractionService#startSession VoiceInteractionService.startSession}. 612a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCreate(Bundle args) { 614c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 615c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 616c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 617c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 619e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 620e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.TOP, true); 621c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 623c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT); 624c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 626c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 627a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 628a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 629a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 630c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 631c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 632c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 633a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 634d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 635a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 636a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 637d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 639c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 641c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 643c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 644c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.WRAP_CONTENT)); 647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 648c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 649c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 650d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 651d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 652d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 653d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 654c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 655c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 656c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 657c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 658d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 659d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 660d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 661d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 662c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 663c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 664c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 665c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 666d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 667d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 668d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 669d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 670c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 671c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 672c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 673c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 674d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 675d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 676d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 677d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 678c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 679c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 680c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 681c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 682d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn /** 683d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 684d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn */ 685d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 686c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 687c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 688c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 689c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 690a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 691a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 692a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 693a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * calls {@link #finish}. 694a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 695c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 696c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 697c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 698c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 699c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 700d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 701c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 702c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * uses the entire window frame as the insets. The default touchable 703c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}. 704c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 705c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 706c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 707d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn @SystemApi 708c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 709c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int[] loc = mTmpLocation; 710c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 711c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn decor.getLocationInWindow(loc); 712e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.top = 0; 713e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 714e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.right = 0; 715e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 716c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 717c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 718c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 719c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 720a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 721d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 722d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 723a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 724a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 725a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 726a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 727a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 728a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 729a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 731c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 732c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 733a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 734d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 735d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 736a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 737a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 738a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 739a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 740a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 741a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 742a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 743a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 744a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 745a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 749c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 750a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 751d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 752d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 753a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 754a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 755a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 756a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 757a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 758a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 759a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 760a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 761a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 762a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public boolean[] onGetSupportedCommands(Caller caller, String[] commands) { 763a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return new boolean[commands.length]; 764a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 765a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 766a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 767d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 768d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 769a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 770a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 771a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 772a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 773a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 774a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 775a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param prompt The prompt informing the user of what will happen, as per 776a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 777a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 778a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}. 779a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 780a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public abstract void onConfirm(Caller caller, Request request, CharSequence prompt, 781a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Bundle extras); 782a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 783a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 784d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 785d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 786d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 787d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 788d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 789d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 790d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 791d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 792d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param caller Who is making the request. 793d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 794d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param message The message informing the user of the problem, as per 795d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 796d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 797d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param extras Any additional information, as per 798d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 799d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. 800d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 801d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void onCompleteVoice(Caller caller, Request request, CharSequence message, 802d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James Bundle extras) { 803d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James request.sendCompleteVoiceResult(null); 804d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 805d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 806d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 807d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 808d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 809a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 810a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 811a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 812a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 813a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 814a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 815a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 816a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 817a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param message The message informing the user of the problem, as per 818a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 819a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 820a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 821a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 822a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) { 823a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn request.sendAbortVoiceResult(null); 824a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 825a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 826a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 827d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 828d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 829a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 830a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 831a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 832a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 833a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param caller Who is making the request. 834a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 835a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param command The command that is being executed, as per 836a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 837a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param extras Any additional information, as per 838a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 839a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 84091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCommand(Caller caller, Request request, String command, Bundle extras); 841a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 842a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 843d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @hide 844d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * @SystemApi 845a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request} 846a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * that was previously delivered to {@link #onConfirm} or {@link #onCommand}. 847a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 848a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 849a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 85091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCancel(Request request); 85191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 852