VoiceInteractionSession.java revision e30e02f5d9a9141c9ee70c712d4f9d52c88ea969
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/** 291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project 391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License. 691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at 791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and 1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License. 1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */ 1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice; 1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 19c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 2191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 22c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.Resources; 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 51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 53c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback { 5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final boolean DEBUG = true; 5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 58c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 60c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 61c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 62c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 63c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 68c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 69c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 70c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final int[] mTmpLocation = new int[2]; 83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 8491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 8591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 8691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 8791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String prompt, Bundle extras) { 8891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Request request = findRequest(callback, true); 8991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION, 9091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 9191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn prompt, extras)); 9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 9391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 9591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 9691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Request request = findRequest(callback, true); 9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND, 10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn new Caller(callingPackage, Binder.getCallingUid()), request, 10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn command, extras)); 10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 10691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 10791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 0, new Caller(callingPackage, Binder.getCallingUid()), commands); 10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 11191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 11291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 11391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 11491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 11591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 11691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 11791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 11891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 11991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 135c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 136c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 137c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 138c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 139c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 140c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 14191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Request { 14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 14891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final HandlerCaller mHandlerCaller; 15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Request(IVoiceInteractorCallback callback, HandlerCaller handlerCaller) { 15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = handlerCaller; 15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendConfirmResult(boolean confirmed, Bundle result) { 15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 16618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void sendCommandResult(boolean complete, Bundle result) { 16791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 16891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " result=" + result); 17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mCallback.deliverCommandResult(mInterface, complete, result); 17191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 17291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 17391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 17491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendCancelResult() { 17691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 17791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 17991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 18091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 18191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 18291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public static class Caller { 18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final String packageName; 18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int uid; 18791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 18891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Caller(String _packageName, int _uid) { 18991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn packageName = _packageName; 19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn uid = _uid; 19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_COMMAND = 2; 19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 3; 19791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_CANCEL = 4; 19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 200c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 202c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 204c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 20591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SomeArgs args; 20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 20991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface 21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " prompt=" + args.arg3 + " extras=" + args.arg4); 21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onConfirm((Caller)args.arg1, (Request)args.arg2, (String)args.arg3, 21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle)args.arg4); 21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 21891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface 21991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " command=" + args.arg3 + " extras=" + args.arg4); 22091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3, 22191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn (Bundle) args.arg4); 22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 22591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2); 22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2); 22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 23091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request) args.arg1).mInterface); 23191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn onCancel((Request)args.arg1); 23291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 239c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 246c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 247c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 254c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 267e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 268c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 269c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 270c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 271c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 272c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 273c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 274e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 275c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 276c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 285c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 286c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 291c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 292c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 293c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 295c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 296c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 300c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 301c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 302c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 303c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 304c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 305c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 306c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 307c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 308c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 309c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 310c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 311c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 312c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 313c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 314c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 315c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 316e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 317e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 318c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 319c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 320c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 321c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 32391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 32791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 32891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 33291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 33391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Request findRequest(IVoiceInteractorCallback callback, boolean newRequest) { 33491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 33591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Request req = mActiveRequests.get(callback.asBinder()); 33691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (req != null) { 33791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (newRequest) { 33891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn throw new IllegalArgumentException("Given request callback " + callback 33991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " is already active"); 34091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return req; 34291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn req = new Request(callback, mHandlerCaller); 34491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mActiveRequests.put(callback.asBinder(), req); 34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return req; 34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 34891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args) { 350c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 351c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 352c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCreate(args); 353c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 356c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 357c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 360c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 363c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 370c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 374c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 376c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 377c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 378c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 379c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 381c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void showWindow() { 382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 384c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 385c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInShowWindow) { 386c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 387c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return; 388c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInShowWindow = true; 392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (!mWindowVisible) { 393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowVisible = true; 394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (!mWindowAdded) { 395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = true; 396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View v = onCreateContentView(); 397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (v != null) { 398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn setContentView(v); 399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.show(); 402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } finally { 404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowWasVisible = true; 405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInShowWindow = false; 406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void hideWindow() { 410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowVisible) { 411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.hide(); 412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowVisible = false; 413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 422c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 423c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 424c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 425c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 426c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 427c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 428c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 429c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 430c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 431c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 432c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 433c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 434e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 435e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 436c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 437c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 438c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 442c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 443c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 444c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 445c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 446c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn hideWindow(); 456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCreate(Bundle args) { 463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 468e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 469e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.TOP, true); 470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT); 473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.WRAP_CONTENT)); 488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 509c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 510c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 512c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 513c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 514c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 515c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 516c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 517c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * uses the entire window frame as the insets. The default touchable 518c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}. 519c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 520c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 521c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 522c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int[] loc = mTmpLocation; 524c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 525c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn decor.getLocationInWindow(loc); 526e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.top = 0; 527e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 528e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.right = 0; 529e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 530c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 531c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 532c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 533c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 534c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 535c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 536c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 537c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 538c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn finish(); 539c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 540c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 54191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract boolean[] onGetSupportedCommands(Caller caller, String[] commands); 54291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onConfirm(Caller caller, Request request, String prompt, Bundle extras); 54391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCommand(Caller caller, Request request, String command, Bundle extras); 54491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public abstract void onCancel(Request request); 54591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 546