VoiceInteractionSession.java revision 2f280d06396d7b8234197a3b1a35d5319f7d6951
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/** 291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project 391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License. 691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at 791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and 1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License. 1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */ 1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice; 1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 196cf397508eb7edef13baefad942a59b058ed450bJames Cookimport android.annotation.Nullable; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 223d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor; 2369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistContent; 2469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistStructure; 251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2; 2691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration; 29c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 3027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap; 31e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 32c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 4091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 4191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 42e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 49c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 50c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 51225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 5391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 58a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 59a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 60c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 61c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 62a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 634e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation 64ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer. The user interface is 65ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()} 66ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built. 674e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * 684e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish} 694e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done. It can also initiate voice interactions with applications by calling 704e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>. 71a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornpublic class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 { 7391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 7491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final boolean DEBUG = true; 7591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * assist data from the currently focused activity. 792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_ASSIST = 1<<0; 812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * @hide 842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * a screen shot of the currently focused activity. 862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_SCREENSHOT = 1<<1; 882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag for use with {@link #onShow}: indicates that the session has been started from the 912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * system assist gesture. 922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_SOURCE_ASSIST_GESTURE = 1<<2; 942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 95c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 96c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 97c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 98c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 99c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 100c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 101c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 102c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 103c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 104c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 106c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 108c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 109c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 110c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 111c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 112c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 113c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 114c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 115c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 116c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 117c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 120a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 121a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 122a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 12391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 12491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 12591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 1266cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, Bundle extras) { 1272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest request = new ConfirmationRequest(callingPackage, 1282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, extras); 1302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_CONFIRMATION, 1322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 13391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 13491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 13591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 13691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 1373d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public IVoiceInteractorRequest startPickOption(String callingPackage, 1386cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, 1393d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 1402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest request = new PickOptionRequest(callingPackage, 1412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, options, extras); 1432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_PICK_OPTION, 1452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 1463d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return request.mInterface; 1473d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 1483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 1493d07c94c393831091958fe6a98811843db8973bdDianne Hackborn @Override 150d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 1516cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest request = new CompleteVoiceRequest(callingPackage, 1532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMPLETE_VOICE, 1572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 158d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 159d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 160d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 161d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 162a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 1636cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest request = new AbortVoiceRequest(callingPackage, 1652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_ABORT_VOICE, 1692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 170a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 171a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 172a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 173a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 17491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 1762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest request = new CommandRequest(callingPackage, 1772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn command, extras); 1792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND, 1802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 18191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 18291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 1872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 0, commands, null); 18891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 18991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 19791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 200225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public void show(Bundle sessionArgs, int flags, 201225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi IVoiceInteractionSessionShowCallback showCallback) { 202225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW, 203225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi flags, sessionArgs, showCallback)); 204ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 205ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 206ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 207ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 208ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE)); 209ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 210ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 211ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 21209d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn public void handleAssist(Bundle data, AssistStructure structure, 21309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn AssistContent content) { 2145688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // We want to pre-warm the AssistStructure before handing it off to the main 2155688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // thread. There is a strong argument to be made that it should be handed 2165688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // through as a separate param rather than part of the assistBundle. 21709d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (structure != null) { 21809d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn structure.ensureData(); 2195688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn } 22009d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOO(MSG_HANDLE_ASSIST, 22109d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn data, structure, content)); 222ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 223ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 224ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn @Override 22527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void handleScreenshot(Bitmap screenshot) { 22627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT, 22727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn screenshot)); 22827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 22927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 23027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn @Override 231c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 239c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 246c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 247c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 2542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static class Caller { 2552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 2562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 2572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 2582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Base class representing a request from a voice-driver app to perform a particular 2592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * voice operation with the user. See related subclasses for the types of requests 2602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that are possible. 2612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 2622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static class Request extends Caller { 26391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 26491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 26591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 266a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 267a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 268a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 269a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 270a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 27291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 2732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCallingPackage; 2742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final int mCallingUid; 27591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 276a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 2772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final Bundle mExtras; 278a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 2792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Request(String packageName, int uid, IVoiceInteractorCallback callback, 2802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, Bundle extras) { 2812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingPackage = packageName; 2822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingUid = uid; 28391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 284a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 2852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mExtras = extras; 2862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 2872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 2882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 2892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the uid of the application that initiated the request. 2902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 2912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public int getCallingUid() { 2922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingUid; 2932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 2942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 2952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 2962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the package name of the application that initiated the request. 2972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 2982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCallingPackage() { 2992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingPackage; 3002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return any additional extra information that was supplied as part of the request. 3042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public Bundle getExtras() { 3062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mExtras; 307a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 308a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 310a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 311a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 312a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 313a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 314a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 315a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 316a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 317a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 318a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 319a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 320a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 32191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendConfirmResult(boolean confirmed, Bundle result) { 32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 32791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 328a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 33091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 33291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 33391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 3353d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendPickOptionResult(boolean finished, 3363d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 3373d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 3383d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface 3393d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " finished=" + finished + " selections=" + selections 3403d07c94c393831091958fe6a98811843db8973bdDianne Hackborn + " result=" + result); 3413d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 3423d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 3433d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 3443d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverPickOptionResult(mInterface, finished, selections, result); 3453d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 3463d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 3473d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 3483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 3492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 350d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public void sendCompleteVoiceResult(Bundle result) { 351d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James try { 352d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 353d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James + " result=" + result); 354d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James finishRequest(); 355d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James mCallback.deliverCompleteVoiceResult(mInterface, result); 356d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } catch (RemoteException e) { 357d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 358d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 359d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 3602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 361a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public void sendAbortVoiceResult(Bundle result) { 362a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn try { 363a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 364a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " result=" + result); 365a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 366a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 367a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } catch (RemoteException e) { 368a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 369a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 370a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 3723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void sendCommandResult(boolean finished, Bundle result) { 37391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 37491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 37591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn + " result=" + result); 3763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (finished) { 3773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn finishRequest(); 3783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 3793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mCallback.deliverCommandResult(mInterface, finished, result); 38091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 38191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 38291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 38391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 38591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void sendCancelResult() { 3862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn cancel(); 3872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 39069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * ASk the app to cancelLocked this current request. 3912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void cancel() { 39391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 39491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 395a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 39691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 39791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 39891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 39991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 40091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 40191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for confirmation from the user of an operation, as per 4042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class ConfirmationRequest extends Request { 4086cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4116cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 4122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 4132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 4142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what will happen, as per 4182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4216cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4226cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 4232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 4242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 42591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4276cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what will happen, as per 4286cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.ConfirmationRequest 4296cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.ConfirmationRequest}. 4306cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 4316cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 4326cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4336cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 4346cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 4356cf397508eb7edef13baefad942a59b058ed450bJames Cook } 4366cf397508eb7edef13baefad942a59b058ed450bJames Cook 4376cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 4382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has confirmed the operation with the user, resulting 4392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 4402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult 4412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest.onConfirmationResult}. 4422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendConfirmationResult(boolean confirmed, Bundle result) { 4442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendConfirmResult(confirmed, result); 4452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for the user to pick from a set of option, as per 4502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class PickOptionRequest extends Request { 4536cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final VoiceInteractor.PickOptionRequest.Option[] mOptions; 4552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4576cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, 4582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 4592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 4602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 4612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mOptions = options; 4622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what they are picking, as per 4662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4686cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4696cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 4702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 4712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4746cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what they are picking, as per 4756cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4766cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 4776cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 4786cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4796cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 4806cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 4816cf397508eb7edef13baefad942a59b058ed450bJames Cook } 4826cf397508eb7edef13baefad942a59b058ed450bJames Cook 4836cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 4842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the set of options the user is picking from, as per 4852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public VoiceInteractor.PickOptionRequest.Option[] getOptions() { 4882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mOptions; 4892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate option selection from the request, without completing it (the 4932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * request is still active and the app is waiting for the final option selection), 4942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * resulting in a call to 4952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 4962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 4972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediatePickOptionResult( 4992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(false, selections, result); 5012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final option selection for the request, completing the request 5052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * and resulting in a call to 5062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 5072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 5082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendPickOptionResult( 5102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(true, selections, result); 5122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to simply inform the user that the voice operation has completed, as per 5172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 5182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 5192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CompleteVoiceRequest extends Request { 5216cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 5222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 5246cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 5252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 5266cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 5272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the completion, as per 5312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 5322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 5332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5346cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5356cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 5366cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 5376cf397508eb7edef13baefad942a59b058ed450bJames Cook } 5386cf397508eb7edef13baefad942a59b058ed450bJames Cook 5396cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 5406cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the completion, as per 5416cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.CompleteVoiceRequest 5426cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.CompleteVoiceRequest}. 5436cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 5446cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 5456cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 5476cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 5482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished completing the voice operation, resulting 5522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 5532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult 5542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest.onCompleteResult}. 5552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendCompleteResult(Bundle result) { 5572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCompleteVoiceResult(result); 5582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to report that the current user interaction can not be completed with voice, as per 5632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 5642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class AbortVoiceRequest extends Request { 5666cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 5672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 5696cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 5702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 5716cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 5722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the problem, as per 5762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 5772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5786cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5796cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 5806cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 5816cf397508eb7edef13baefad942a59b058ed450bJames Cook } 5826cf397508eb7edef13baefad942a59b058ed450bJames Cook 5836cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 5846cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the problem, as per 5856cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 5866cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 5876cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 5886cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 5906cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 5912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished aborting the voice operation, resulting 5952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 5962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult 5972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest.onAbortResult}. 5982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendAbortResult(Bundle result) { 6002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendAbortVoiceResult(result); 6012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A generic vendor-specific request, as per 6062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 6072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CommandRequest extends Request { 6092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCommand; 6102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest(String packageName, int uid, IVoiceInteractorCallback callback, 6122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, String command, Bundle extras) { 6132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 6142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCommand = command; 6152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the command that is being executed, as per 6192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 6202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCommand() { 6222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCommand; 6232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate result of the request, without completing it (the request 6272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * is still active and the app is waiting for the final result), resulting in a call to 6282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 6292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with false for isCompleted. 6302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediateResult(Bundle result) { 6322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(false, result); 6332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final result of the request, completing the request and resulting in a call to 6372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 6382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted. 6392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendResult(Bundle result) { 6412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(true, result); 64291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 64391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 64491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 64591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 6463d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_PICK_OPTION = 2; 6473d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMPLETE_VOICE = 3; 6483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_ABORT_VOICE = 4; 6493d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMMAND = 5; 6503d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 6; 6513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_CANCEL = 7; 65291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 653c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 654c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 655c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 656c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 657ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn static final int MSG_HANDLE_ASSIST = 104; 65827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HANDLE_SCREENSHOT = 105; 65927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_SHOW = 106; 66027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HIDE = 107; 661c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 662c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 66391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 66491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 665c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SomeArgs args; 66691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 66791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 6682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + msg.obj); 6692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestConfirmation((ConfirmationRequest) msg.obj); 67091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 6713d07c94c393831091958fe6a98811843db8973bdDianne Hackborn case MSG_START_PICK_OPTION: 6722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onPickOption: req=" + msg.obj); 6732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestPickOption((PickOptionRequest) msg.obj); 6743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn break; 675d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 6762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + msg.obj); 6772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCompleteVoice((CompleteVoiceRequest) msg.obj); 678d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 679a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 6802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + msg.obj); 6812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestAbortVoice((AbortVoiceRequest) msg.obj); 682a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 68391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 6842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + msg.obj); 6852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCommand((CommandRequest) msg.obj); 68691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 68791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 688c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 6892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg1); 6902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn args.arg1 = onGetSupportedCommands((String[]) args.arg1); 69191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 69291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 693ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj)); 6942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCancelRequest((Request) msg.obj); 69591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 696c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 697c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 698c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 699c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 700c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 701c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 702c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 703c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 704c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 705c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 706c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 707c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 708c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 709c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 710c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 711c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 712c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 713c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 714ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn case MSG_HANDLE_ASSIST: 71509d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn args = (SomeArgs)msg.obj; 71609d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1 71709d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn + " structure=" + args.arg2 + " content=" + args.arg3); 71809d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn onHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2, 71909d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn (AssistContent) args.arg3); 720ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn break; 72127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn case MSG_HANDLE_SCREENSHOT: 72227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj); 72327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn onHandleScreenshot((Bitmap) msg.obj); 72427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn break; 725ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_SHOW: 726225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi args = (SomeArgs)msg.obj; 727225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1 728225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " flags=" + msg.arg1 729225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " showCallback=" + args.arg2); 730225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi doShow((Bundle) args.arg1, msg.arg1, 731225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi (IVoiceInteractionSessionShowCallback) args.arg2); 732ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 733ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_HIDE: 734ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "doHide"); 735ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn doHide(); 736ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 73791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 73891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 73991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 740c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 741c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 742c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 743c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 744c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 745c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 749c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 750c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 751c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 752c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 753e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 754c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 755c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 756c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 757c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 758c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 759c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 760e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 761c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 762c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 763c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 764c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 765c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 766c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 767c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 768c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 769c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 770c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 771c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 772c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 773c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 774c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 775c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 776c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 777c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 778c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 779c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 780c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 781c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 782c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 783c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 784c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 785c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 786c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 787c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 788c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 789c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 790c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 791c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 792c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 793c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 795c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 796c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 797c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 798c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 799c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 800c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 801c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 802e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 803e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 804c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 805c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 806c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 807c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 80891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 80991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 81091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 81191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 81291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 81391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 81491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 81591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 816c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 81791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 81891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 819d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn public Context getContext() { 820d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn return mContext; 821d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn } 822d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn 8232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn void addRequest(Request req) { 8242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 825a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 826a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 827a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 82891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 8298ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe return mActiveRequests.remove(reqInterface); 83091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 83191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 83291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 833ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args, 834ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn int startFlags) { 835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 837ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn onCreate(args, startFlags); 838c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 839c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 840225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) { 841ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 842ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 843ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 844ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mInShowWindow) { 845ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 846ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn return; 847ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 848ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 849ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 850ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = true; 851ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 852ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowAdded) { 853ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowAdded = true; 854ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn View v = onCreateContentView(); 855ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (v != null) { 856ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn setContentView(v); 857ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 858ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 859ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 860ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onShow(args, flags); 861ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 862ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = true; 863ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.show(); 864ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 865225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (showCallback != null) { 866225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.invalidate(); 867225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().addOnPreDrawListener( 868225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi new ViewTreeObserver.OnPreDrawListener() { 869225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi @Override 870225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public boolean onPreDraw() { 871225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mRootView.getViewTreeObserver().removeOnPreDrawListener(this); 872225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi try { 873225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi showCallback.onShown(); 874225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } catch (RemoteException e) { 875225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi Log.w(TAG, "Error calling onShown", e); 876225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 877225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi return true; 878225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 879225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi }); 880225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 881ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } finally { 882ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowWasVisible = true; 883ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = false; 884ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 885ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 886ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 887ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn void doHide() { 888ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mWindowVisible) { 889ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindow.hide(); 890ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = false; 891ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onHide(); 892ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 893ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 894ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 895c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 8969a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 897c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 898c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 899c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 902c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 903c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 904c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 905c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 906c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 907c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 908c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void initViews() { 909c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 910c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 911c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 912c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 913c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 915225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 916225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 917c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 918c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 919c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 920c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 921c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 922c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 9232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 924ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void show() { 9252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn show(null, 0); 9262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 9272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 92869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 92969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Show the UI for this session. This asks the system to go through the process of showing 93069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * your UI, which will eventually culminate in {@link #onShow}. This is similar to calling 93169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 93269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param args Arbitrary arguments that will be propagated {@link #onShow}. 93369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param flags Indicates additional optional behavior that should be performed. May 93469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * be {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} 93569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * to request that the system generate and deliver assist data on the current foreground 93669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * app as part of showing the session UI. 93769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 93869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn public void show(Bundle args, int flags) { 93969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 94069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 94169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 942ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 94369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn mSystemService.showSessionFromSession(mToken, args, flags); 944ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 945c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 946ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 947c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 94869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 94969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Hide the session's UI, if currently shown. Call this when you are done with your 95069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * user interaction. 95169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 952ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 95369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 95469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 95569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 956c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 957ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.hideSessionFromSession(mToken); 958ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 959c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 960c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 961c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 9622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 963ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void showWindow() { 964ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 965ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 9662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 967c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void hideWindow() { 968c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 969c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 970c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 971c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 972c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 973c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 974c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 975c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 976c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 977c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 978c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 979c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 980c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 981c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 982c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 983a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 984a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 985a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 986a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 987a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 988a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 989a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 990a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 991a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 992a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 993a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 994a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 9952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestConfirmation}, {@link #onRequestPickOption}, 9962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 9972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand} 998a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 999a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 1000a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 1001a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1002a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 1003a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 1004a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 1005a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1006c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 1007c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1008c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1009c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1010c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1011e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 1012e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.prepareToLeaveProcess(); 1013c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 1014c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 1015c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 1016c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 1017c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1018c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1019c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1020a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 10213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Set whether this session will keep the device awake while it is running a voice 10223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * activity. By default, the system holds a wake lock for it while in this state, 10233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * so that it can work even if the screen is off. Setting this to false removes that 10243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * wake lock, allowing the CPU to go to sleep. This is typically used if the 10253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * session decides it has been waiting too long for a response from the user and 10263d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * doesn't want to let this continue to drain the battery. 10273d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 10283d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * <p>Passing false here will release the wake lock, and you can call later with 10293d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * true to re-acquire it. It will also be automatically re-acquired for you each 10303d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * time you start a new voice activity task -- that is when you call 10313d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link #startVoiceActivity}.</p> 10323d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 10333d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void setKeepAwake(boolean keepAwake) { 103469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 103569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 103669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 10373d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 10383d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mSystemService.setKeepAwake(mToken, keepAwake); 10393d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 10403d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 10413d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 10423d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 10433d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 1044a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 1045a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1046c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 1047c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 1048c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1049c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1050a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1051a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 1052a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1053c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 1054c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 1055c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1056c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1057a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 105869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Finish the session. This completely destroys the session -- the next time it is shown, 105969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * an entirely new one will be created. You do not normally call this function; instead, 106069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * use {@link #hide} and allow the system to destroy your session if it needs its RAM. 1061a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1062c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 1063c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1064c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1065c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1066c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn hideWindow(); 1067c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1068c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 1069c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 1070c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1071c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1072c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 10732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 10742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Initiatize a new session. At this point you don't know exactly what this 10752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * session will be used for; you will find that out in {@link #onShow}. 10762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 10772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCreate() { 10782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn doOnCreate(); 10792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 10802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 1081ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** @hide */ 1082c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCreate(Bundle args) { 10832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn doOnCreate(); 10842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 10856cf397508eb7edef13baefad942a59b058ed450bJames Cook 10862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 10872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCreate(Bundle args, int showFlags) { 10882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn doOnCreate(); 10892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 10902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 10912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn private void doOnCreate() { 1092c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 1093c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 1094c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 1095c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 1096c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 1097e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn mCallbacks, this, mDispatcherState, 1098ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); 1099225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mWindow.getWindow().addFlags( 1100225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 11012f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 11022f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); 1103c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn initViews(); 1104ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); 1105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setToken(mToken); 1106c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1108a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1109ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called when the session UI is going to be shown. This is called after 1110ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link #onCreateContentView} (if the session's content UI needed to be created) and 1111ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * immediately prior to the window being shown. This may be called while the window 1112ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * is already shown, if a show request has come in while it is shown, to allow you to 1113ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * update the UI to match the new show arguments. 1114ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * 1115ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * @param args The arguments that were supplied to 1116ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1117ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * @param showFlags The show flags originally provided to 1118ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1119ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn */ 1120ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onShow(Bundle args, int showFlags) { 1121ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1122ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1123ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 1124ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called immediately after stopping to show the session UI. 1125ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 1126ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onHide() { 1127ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 1128ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 1129ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** 1130a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 1131a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 1133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1135a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 1137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1138c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 1139c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 1140c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1141c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1142c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 1143c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 1144c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 1145c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 1146ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT)); 1147c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1149c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 115009d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn /** @hide */ 1151ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void onHandleAssist(Bundle assistBundle) { 1152ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 1153ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 115409d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) { 115509d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (data != null) { 115609d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn Bundle assistContext = data.getBundle(Intent.EXTRA_ASSIST_CONTEXT); 115709d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (assistContext != null) { 115809d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn assistContext.putParcelable(AssistStructure.ASSIST_KEY, structure); 115909d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn assistContext.putParcelable(AssistContent.ASSIST_KEY, content); 116009d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn data.putBundle(Intent.EXTRA_ASSIST_CONTEXT, assistContext); 116109d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn } 116209d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn } 116309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn onHandleAssist(data); 116409d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn } 116509d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn 116638a499edf5542fbd0948a02b77ecd84c0d62a846Dianne Hackborn /** @hide */ 116727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void onHandleScreenshot(Bitmap screenshot) { 116827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 116927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 1170c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 1171c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1172c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1173c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1174c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 1175c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1176c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1177c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1178c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 1179c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1180c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1181c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1182c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 1183c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1184c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1185c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1186d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn /** 1187d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * Called when the user presses the back button while focus is in the session UI. Note 1188d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * that this will only happen if the session UI has requested input focus in its window; 1189d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * otherwise, the back key will go to whatever window has focus and do whatever behavior 119069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * it normally has there. The default implementation simply calls {@link #hide}. 1191d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn */ 1192c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 1193ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1194c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1195c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1196a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1197a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 1198a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 119969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * calls {@link #hide}. 1200a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 1202ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1204c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 12051e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 12061e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 12071e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 12081e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 12091e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 12101e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 12111e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 12121e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 12131e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 12141e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 12151e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 12161e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 1217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 1218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 1219ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height 1220ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * of the window, meaning it should not adjust content underneath. The default touchable 1221ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch 1222ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * events within its window frame. 1223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 1224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 1225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 1226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 1227e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 1228e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 1229ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.right = 0; 1230ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 1231ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.top = decor.getHeight(); 1232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 1233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 1234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 1238a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 1239a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1240a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1241a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 1243a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 1245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1246c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1247a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1248a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 1249a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 1250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 1251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 1252a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 1253a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1254a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1255a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1256a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 1257a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 1259ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 12622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public boolean[] onGetSupportedCommands(Caller caller, String[] commands) { 12642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return new boolean[commands.length]; 12652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onConfirm(Caller caller, Request request, CharSequence prompt, 12682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Bundle extras) { 12692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onPickOption(Caller caller, Request request, CharSequence prompt, 12722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 12732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCompleteVoice(Caller caller, Request request, CharSequence message, 12762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Bundle extras) { 12772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request.sendCompleteVoiceResult(null); 12782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) { 12812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request.sendAbortVoiceResult(null); 12822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCommand(Caller caller, Request request, String command, Bundle extras) { 12852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** @hide */ 12872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCancel(Request request) { 12882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 12892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 1290a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 1292a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 1294a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 1295a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 1296a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 1297a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 1298a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 12992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public boolean[] onGetSupportedCommands(String[] commands) { 13002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return onGetSupportedCommands(new Caller(), commands); 1301a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1302a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1304a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 1305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 1306a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 1307a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1308a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 13102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestConfirmation(ConfirmationRequest request) { 13112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onConfirm(request, request, request.getPrompt(), request.getExtras()); 13122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1313a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1314a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 13153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Request for the user to pick one of N options, corresponding to a 13163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 13173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 13183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param request The active request. 13193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 13202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestPickOption(PickOptionRequest request) { 13212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onPickOption(request, request, request.getPrompt(), request.getOptions(), 13222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request.getExtras()); 13232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 13243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 13253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 1326d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 1327d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 1328d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 1329d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 1330d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 1331d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 1332d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 1333d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 13342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCompleteVoice(CompleteVoiceRequest request) { 13352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCompleteVoice(request, request, request.getMessage(), request.getExtras()); 1336d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 1337d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 1338d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 1339a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 1340a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 1341a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 1342a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 1343a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 1344a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1345a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1346a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 13472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestAbortVoice(AbortVoiceRequest request) { 13482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onAbortVoice(request, request, request.getMessage(), request.getExtras()); 1349a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1350a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1351a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1352a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 1353a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 1354a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 1355a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1356a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1357a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 13582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCommand(CommandRequest request) { 13592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCommand(request, request, request.getCommand(), request.getExtras()); 13602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1361a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1362a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 136369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancelLocked a {@link Request} 13642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that was previously delivered to {@link #onRequestConfirmation}, 13652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 13662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand}. 1367a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1368a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 1369a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 13702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCancelRequest(Request request) { 13712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCancel(request); 13722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 137391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 1374