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; 200af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasaniimport android.app.Activity; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog; 22c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation; 233d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor; 2469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistContent; 2569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistStructure; 261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2; 2791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context; 28c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent; 291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration; 30c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray; 3127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap; 32e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect; 33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region; 34c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow; 3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder; 3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle; 3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler; 3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder; 3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message; 4091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException; 4157dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.os.UserHandle; 4291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap; 4357dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.util.DebugUtils; 4491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 45e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity; 46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent; 47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater; 48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View; 49c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup; 50c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver; 51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager; 52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout; 530af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani 54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 55225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback; 5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest; 5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller; 6091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs; 6191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 6257dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.FileDescriptor; 6357dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.PrintWriter; 64a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference; 65a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 68a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/** 694e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation 70ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer. The user interface is 71ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()} 72ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built. 734e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * 744e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish} 754e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done. It can also initiate voice interactions with applications by calling 764e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>. 77a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornpublic class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 { 7991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "VoiceInteractionSession"; 80e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani static final boolean DEBUG = false; 8191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * assist data from the currently focused activity. 852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_ASSIST = 1<<0; 872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag received in {@link #onShow}: originator requested that the session be started with 902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * a screen shot of the currently focused activity. 912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_WITH_SCREENSHOT = 1<<1; 932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Flag for use with {@link #onShow}: indicates that the session has been started from the 962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * system assist gesture. 972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final int SHOW_SOURCE_ASSIST_GESTURE = 1<<2; 992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 10017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn /** 10117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * Flag for use with {@link #onShow}: indicates that the application itself has invoked 10217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * the assistant. 10317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn */ 10417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public static final int SHOW_SOURCE_APPLICATION = 1<<3; 10517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn 1060af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani /** 1070af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani * Flag for use with {@link #onShow}: indicates that an Activity has invoked the voice 1080af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani * interaction service for a local interaction using 1090af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani * {@link Activity#startLocalVoiceInteraction(Bundle)}. 1100af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani */ 1110af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani public static final int SHOW_SOURCE_ACTIVITY = 1<<4; 1120af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani 113e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani // Keys for Bundle values 114e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani /** @hide */ 115e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani public static final String KEY_DATA = "data"; 116e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani /** @hide */ 117e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani public static final String KEY_STRUCTURE = "structure"; 118e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani /** @hide */ 119e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani public static final String KEY_CONTENT = "content"; 120e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani /** @hide */ 121e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani public static final String KEY_RECEIVER_EXTRAS = "receiverExtras"; 122e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani 123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Context mContext; 124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final HandlerCaller mHandlerCaller; 125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); 127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IVoiceInteractionManagerService mSystemService; 129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn IBinder mToken; 130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int mTheme = 0; 132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn LayoutInflater mInflater; 133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn TypedArray mThemeAttrs; 134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn View mRootView; 135c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn FrameLayout mContentFrame; 136c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn SoftInputWindow mWindow; 137c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 13859da805846034a4939b014f469d7383285c75aabDianne Hackborn boolean mUiEnabled = true; 139c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInitialized; 140c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowAdded; 141c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowVisible; 142c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mWindowWasVisible; 143c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn boolean mInShowWindow; 144c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 145c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); 146c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 147c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final Insets mTmpInsets = new Insets(); 148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 149a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mWeakRef 150a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn = new WeakReference<VoiceInteractionSession>(this); 151a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { 15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startConfirmation(String callingPackage, 1556cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, Bundle extras) { 1562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest request = new ConfirmationRequest(callingPackage, 1572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, extras); 1592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_CONFIRMATION, 1612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 1663d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public IVoiceInteractorRequest startPickOption(String callingPackage, 1676cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, 1683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 1692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest request = new PickOptionRequest(callingPackage, 1702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn prompt, options, extras); 1722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_PICK_OPTION, 1742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 1753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return request.mInterface; 1763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 1773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 1783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn @Override 179d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James public IVoiceInteractorRequest startCompleteVoice(String callingPackage, 1806cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest request = new CompleteVoiceRequest(callingPackage, 1822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMPLETE_VOICE, 1862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 187d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James return request.mInterface; 188d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 189d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 190d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James @Override 191a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn public IVoiceInteractorRequest startAbortVoice(String callingPackage, 1926cf397508eb7edef13baefad942a59b058ed450bJames Cook IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) { 1932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest request = new AbortVoiceRequest(callingPackage, 1942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 1952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn message, extras); 1962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn addRequest(request); 1972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_ABORT_VOICE, 1982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 199a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn return request.mInterface; 200a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 201a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 202a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn @Override 20391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public IVoiceInteractorRequest startCommand(String callingPackage, 20491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractorCallback callback, String command, Bundle extras) { 2052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest request = new CommandRequest(callingPackage, 2062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Binder.getCallingUid(), callback, VoiceInteractionSession.this, 2072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn command, extras); 208593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn addRequest(request); 2092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND, 2102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn request)); 21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return request.mInterface; 21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public boolean[] supportsCommands(String callingPackage, String[] commands) { 21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS, 2172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 0, commands, null); 21891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn SomeArgs args = mHandlerCaller.sendMessageAndWait(msg); 21991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (args != null) { 22091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean[] res = (boolean[])args.arg1; 22191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn args.recycle(); 22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return res; 22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 22491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return new boolean[commands.length]; 22591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { 229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 230225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi public void show(Bundle sessionArgs, int flags, 231225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi IVoiceInteractionSessionShowCallback showCallback) { 232225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW, 233225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi flags, sessionArgs, showCallback)); 234ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 235ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 236ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 237ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 238fc3ec4c5e689e4d64f0c24d42a3b4b31ee4621c4Winson Chung // Remove any pending messages to show the session 239fc3ec4c5e689e4d64f0c24d42a3b4b31ee4621c4Winson Chung mHandlerCaller.removeMessages(MSG_SHOW); 240ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE)); 241ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 242ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 243ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn @Override 244782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void handleAssist(final Bundle data, final AssistStructure structure, 245e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani final AssistContent content, final int index, final int count) { 2465688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn // We want to pre-warm the AssistStructure before handing it off to the main 247782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // thread. We also want to do this on a separate thread, so that if the app 248782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // is for some reason slow (due to slow filling in of async children in the 249782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // structure), we don't block other incoming IPCs (such as the screenshot) to 250782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn // us (since we are a oneway interface, they get serialized). (Okay?) 251782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Thread retriever = new Thread("AssistStructure retriever") { 252782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn @Override 253782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void run() { 254782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Throwable failure = null; 255782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn if (structure != null) { 256782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn try { 257782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn structure.ensureData(); 258782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } catch (Throwable e) { 259782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn Log.w(TAG, "Failure retrieving AssistStructure", e); 260782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn failure = e; 261782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 262782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 263e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOII(MSG_HANDLE_ASSIST, 264e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani data, failure == null ? structure : null, failure, content, 265e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani index, count)); 266782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 267782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn }; 268782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn retriever.start(); 269ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 270ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 271ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn @Override 27227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn public void handleScreenshot(Bitmap screenshot) { 27327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT, 27427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn screenshot)); 27527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 27627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 27727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn @Override 278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskStarted(Intent intent, int taskId) { 279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, 280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void taskFinished(Intent intent, int taskId) { 285c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, 286c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn taskId, intent)); 287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void closeSystemDialogs() { 291c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); 292c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 293c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 29519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi public void onLockscreenShown() { 29619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_ON_LOCKSCREEN_SHOWN)); 29719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi } 29819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi 29919695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi @Override 300c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void destroy() { 301c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); 302c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 30391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 30491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Base class representing a request from a voice-driver app to perform a particular 3072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * voice operation with the user. See related subclasses for the types of requests 3082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that are possible. 3092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 310593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn public static class Request { 31191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() { 31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void cancel() throws RemoteException { 314a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 315a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session != null) { 316a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.sendMessage( 317a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this)); 318a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn }; 3212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCallingPackage; 3222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final int mCallingUid; 32391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final IVoiceInteractorCallback mCallback; 324a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn final WeakReference<VoiceInteractionSession> mSession; 3252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final Bundle mExtras; 326a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn Request(String packageName, int uid, IVoiceInteractorCallback callback, 3282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, Bundle extras) { 3292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingPackage = packageName; 3302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCallingUid = uid; 33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback = callback; 332a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn mSession = session.mWeakRef; 3332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mExtras = extras; 3342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the uid of the application that initiated the request. 3382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public int getCallingUid() { 3402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingUid; 3412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the package name of the application that initiated the request. 3452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCallingPackage() { 3472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCallingPackage; 3482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 3492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 3502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 3512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return any additional extra information that was supplied as part of the request. 3522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public Bundle getExtras() { 3542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mExtras; 355a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 356a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 3571b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn /** 3581b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * Check whether this request is currently active. A request becomes inactive after 3591b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * calling {@link #cancel} or a final result method that completes the request. After 3601b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * this point, further interactions with the request will result in 3611b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * {@link java.lang.IllegalStateException} errors; you should not catch these errors, 3621b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * but can use this method if you need to determine the state of the request. Returns 3631b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * true if the request is still active. 3641b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn */ 3651b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn public boolean isActive() { 3661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn VoiceInteractionSession session = mSession.get(); 3671b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn if (session == null) { 3681b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return false; 3691b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 3701b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return session.isRequestActive(mInterface.asBinder()); 3711b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 3721b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn 373a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn void finishRequest() { 374a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn VoiceInteractionSession session = mSession.get(); 375a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (session == null) { 376a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("VoiceInteractionSession has been destroyed"); 377a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 378a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request req = session.removeRequest(mInterface.asBinder()); 379a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn if (req == null) { 380a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Request not active: " + this); 381a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } else if (req != this) { 382a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn throw new IllegalStateException("Current active request " + req 383a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn + " not same as calling request " + this); 384a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 38591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 38691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 3872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 388593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn * Ask the app to cancel this current request. 3891b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This also finishes the request (it is no longer active). 3902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 3912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void cancel() { 39291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 39391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface); 394a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn finishRequest(); 39591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mCallback.deliverCancel(mInterface); 39691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 39791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 39891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 39957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 40057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn @Override 40157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn public String toString() { 40257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn StringBuilder sb = new StringBuilder(128); 40357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn DebugUtils.buildShortClassTag(this, sb); 40457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" "); 40557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(mInterface.asBinder()); 40657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" pkg="); 40757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(mCallingPackage); 40857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append(" uid="); 40957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn UserHandle.formatUid(sb, mCallingUid); 41057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn sb.append('}'); 41157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn return sb.toString(); 41257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 41357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 41457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 41557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mInterface="); 41657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mInterface.asBinder()); 41757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage); 41857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid); 41957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(); 42057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCallback="); 42157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mCallback.asBinder()); 42257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mExtras != null) { 42357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mExtras="); 42457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mExtras); 42557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 42657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 42791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 42891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for confirmation from the user of an operation, as per 4312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class ConfirmationRequest extends Request { 4356cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn ConfirmationRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4386cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 4392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 4402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 4412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what will happen, as per 4452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest 4462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 4472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4486cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4496cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 4502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 4512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 45291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 4532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4546cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what will happen, as per 4556cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.ConfirmationRequest 4566cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.ConfirmationRequest}. 4576cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 4586cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 459514c5ef8d5774d8820ed1bf90fe53af1606cf106Aurimas Liutikas @Deprecated 4606cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 4616cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 4626cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 4636cf397508eb7edef13baefad942a59b058ed450bJames Cook } 4646cf397508eb7edef13baefad942a59b058ed450bJames Cook 4656cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 4662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has confirmed the operation with the user, resulting 4672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 4682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult 4692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.ConfirmationRequest.onConfirmationResult}. 4701b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 4712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendConfirmationResult(boolean confirmed, Bundle result) { 473593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 474593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmationResult: req=" + mInterface 475593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " confirmed=" + confirmed + " result=" + result); 476593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 477593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverConfirmationResult(mInterface, confirmed, result); 478593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 479593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 4802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 48157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 48257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 48357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 48457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 48557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 48657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 4872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 4882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 4902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request for the user to pick from a set of option, as per 4912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 4922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 4932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class PickOptionRequest extends Request { 4946cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 4952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final VoiceInteractor.PickOptionRequest.Option[] mOptions; 4962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 4972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn PickOptionRequest(String packageName, int uid, IVoiceInteractorCallback callback, 4986cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, 4992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) { 5002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 5012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mPrompt = prompt; 5022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mOptions = options; 5032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the prompt informing the user of what they are picking, as per 5072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 5082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5096cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5106cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 5112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mPrompt; 5122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5156cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the prompt informing the user of what they are picking, as per 5166cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 5176cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts. 5186cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 519514c5ef8d5774d8820ed1bf90fe53af1606cf106Aurimas Liutikas @Deprecated 5206cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 5216cf397508eb7edef13baefad942a59b058ed450bJames Cook public CharSequence getPrompt() { 5226cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 5236cf397508eb7edef13baefad942a59b058ed450bJames Cook } 5246cf397508eb7edef13baefad942a59b058ed450bJames Cook 5256cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 5262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the set of options the user is picking from, as per 5272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 5282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public VoiceInteractor.PickOptionRequest.Option[] getOptions() { 5302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mOptions; 5312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 533593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void sendPickOptionResult(boolean finished, 534593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 535593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 536593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface 537593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " finished=" + finished + " selections=" + selections 538593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 539593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (finished) { 540593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 541593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 542593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverPickOptionResult(mInterface, finished, selections, result); 543593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 544593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 545593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 546593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn 5472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate option selection from the request, without completing it (the 5492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * request is still active and the app is waiting for the final option selection), 5502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * resulting in a call to 5512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 5522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 5532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediatePickOptionResult( 5552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(false, selections, result); 5572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 5592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 5602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final option selection for the request, completing the request 5612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * and resulting in a call to 5622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult 5632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished. 5641b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 5652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 5662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendPickOptionResult( 5672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { 5682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendPickOptionResult(true, selections, result); 5692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 57057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 57157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 57257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 57357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 57457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 57557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mOptions != null) { 57657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println("Options:"); 57757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int i=0; i<mOptions.length; i++) { 57857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn VoiceInteractor.PickOptionRequest.Option op = mOptions[i]; 57957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); 58057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mLabel="); 58157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getLabel()); 58257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mIndex="); 58357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getIndex()); 58457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (op.countSynonyms() > 0) { 58557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println(" Synonyms:"); 58657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int j=0; j<op.countSynonyms(); j++) { 58757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(j); 58857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(": "); writer.println(op.getSynonymAt(j)); 58957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 59057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 59157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (op.getExtras() != null) { 59257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" mExtras="); 59357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(op.getExtras()); 59457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 59557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 59657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 59757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 5982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 5992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to simply inform the user that the voice operation has completed, as per 6022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 6032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 6042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CompleteVoiceRequest extends Request { 6066cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 6072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CompleteVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 6096cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 6102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 6116cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 6122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the completion, as per 6162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest 6172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest}. 6182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6196cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6206cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 6216cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 6226cf397508eb7edef13baefad942a59b058ed450bJames Cook } 6236cf397508eb7edef13baefad942a59b058ed450bJames Cook 6246cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 6256cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the completion, as per 6266cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.CompleteVoiceRequest 6276cf397508eb7edef13baefad942a59b058ed450bJames Cook * VoiceInteractor.CompleteVoiceRequest}. 6286cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 6296cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 630514c5ef8d5774d8820ed1bf90fe53af1606cf106Aurimas Liutikas @Deprecated 6316cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 6336cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 6342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished completing the voice operation, resulting 6382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 6392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult 6402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CompleteVoiceRequest.onCompleteResult}. 6411b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 6422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendCompleteResult(Bundle result) { 644593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 645593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface 646593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 647593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 648593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverCompleteVoiceResult(mInterface, result); 649593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 650593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 6512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 65257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 65357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 65457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 65557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 65657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 65757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 6582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A request to report that the current user interaction can not be completed with voice, as per 6622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class AbortVoiceRequest extends Request { 6656cf397508eb7edef13baefad942a59b058ed450bJames Cook final VoiceInteractor.Prompt mPrompt; 6662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn AbortVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback, 6686cf397508eb7edef13baefad942a59b058ed450bJames Cook VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) { 6692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 6706cf397508eb7edef13baefad942a59b058ed450bJames Cook mPrompt = prompt; 6712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the message informing the user of the problem, as per 6752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 6776cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6786cf397508eb7edef13baefad942a59b058ed450bJames Cook public VoiceInteractor.Prompt getVoicePrompt() { 6796cf397508eb7edef13baefad942a59b058ed450bJames Cook return mPrompt; 6806cf397508eb7edef13baefad942a59b058ed450bJames Cook } 6816cf397508eb7edef13baefad942a59b058ed450bJames Cook 6826cf397508eb7edef13baefad942a59b058ed450bJames Cook /** 6836cf397508eb7edef13baefad942a59b058ed450bJames Cook * Return the message informing the user of the problem, as per 6846cf397508eb7edef13baefad942a59b058ed450bJames Cook * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}. 6856cf397508eb7edef13baefad942a59b058ed450bJames Cook * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message. 6866cf397508eb7edef13baefad942a59b058ed450bJames Cook */ 687514c5ef8d5774d8820ed1bf90fe53af1606cf106Aurimas Liutikas @Deprecated 6886cf397508eb7edef13baefad942a59b058ed450bJames Cook @Nullable 6892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public CharSequence getMessage() { 6906cf397508eb7edef13baefad942a59b058ed450bJames Cook return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null); 6912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 6922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 6932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 6942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report that the voice interactor has finished aborting the voice operation, resulting 6952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * in a call to 6962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult 6971b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * VoiceInteractor.AbortVoiceRequest.onAbortResult}. This finishes the request (it 6981b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * is no longer active). 6992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendAbortResult(Bundle result) { 701593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 702593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface 703593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 704593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 705593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverAbortVoiceResult(mInterface, result); 706593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 707593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 7082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 70957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 71057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 71157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 71257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mPrompt="); 71357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mPrompt); 71457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 7152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * A generic vendor-specific request, as per 7192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 7202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public static final class CommandRequest extends Request { 7222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn final String mCommand; 7232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn CommandRequest(String packageName, int uid, IVoiceInteractorCallback callback, 7252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn VoiceInteractionSession session, String command, Bundle extras) { 7262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn super(packageName, uid, callback, session, extras); 7272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn mCommand = command; 7282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Return the command that is being executed, as per 7322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}. 7332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public String getCommand() { 7352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn return mCommand; 7362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 738593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void sendCommandResult(boolean finished, Bundle result) { 739593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn try { 740593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface 741593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn + " result=" + result); 742593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn if (finished) { 743593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn finishRequest(); 744593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 745593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mCallback.deliverCommandResult(mInterface, finished, result); 746593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } catch (RemoteException e) { 747593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 748593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn } 749593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn 7502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report an intermediate result of the request, without completing it (the request 7522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * is still active and the app is waiting for the final result), resulting in a call to 7532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 7542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with false for isCompleted. 7552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendIntermediateResult(Bundle result) { 7572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(false, result); 7582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 7592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 7602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 7612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Report the final result of the request, completing the request and resulting in a call to 7622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult 7632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted. 7641b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn * This finishes the request (it is no longer active). 7652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 7662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void sendResult(Bundle result) { 7672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn sendCommandResult(true, result); 76891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 76957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 77057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 77157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn super.dump(prefix, fd, writer, args); 77257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mCommand="); 77357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(mCommand); 77457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 77591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 77691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 77791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final int MSG_START_CONFIRMATION = 1; 7783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_PICK_OPTION = 2; 7793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMPLETE_VOICE = 3; 7803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_ABORT_VOICE = 4; 7813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_START_COMMAND = 5; 7823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_SUPPORTS_COMMANDS = 6; 7833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn static final int MSG_CANCEL = 7; 78491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 785c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_STARTED = 100; 786c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_TASK_FINISHED = 101; 787c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; 788c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn static final int MSG_DESTROY = 103; 789ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn static final int MSG_HANDLE_ASSIST = 104; 79027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HANDLE_SCREENSHOT = 105; 79127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_SHOW = 106; 79227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn static final int MSG_HIDE = 107; 79319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi static final int MSG_ON_LOCKSCREEN_SHOWN = 108; 794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 795c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { 79691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 79791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public void executeMessage(Message msg) { 798d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn SomeArgs args = null; 79991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn switch (msg.what) { 80091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_CONFIRMATION: 8012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onConfirm: req=" + msg.obj); 8022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestConfirmation((ConfirmationRequest) msg.obj); 80391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 8043d07c94c393831091958fe6a98811843db8973bdDianne Hackborn case MSG_START_PICK_OPTION: 8052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onPickOption: req=" + msg.obj); 8062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestPickOption((PickOptionRequest) msg.obj); 8073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn break; 808d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James case MSG_START_COMPLETE_VOICE: 8092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + msg.obj); 8102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCompleteVoice((CompleteVoiceRequest) msg.obj); 811d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James break; 812a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn case MSG_START_ABORT_VOICE: 8132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + msg.obj); 8142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestAbortVoice((AbortVoiceRequest) msg.obj); 815a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn break; 81691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_START_COMMAND: 8172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onCommand: req=" + msg.obj); 8182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onRequestCommand((CommandRequest) msg.obj); 81991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 82091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_SUPPORTS_COMMANDS: 821c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn args = (SomeArgs)msg.obj; 8222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg1); 8232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn args.arg1 = onGetSupportedCommands((String[]) args.arg1); 824d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args.complete(); 825d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args = null; 82691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 82791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn case MSG_CANCEL: 828ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj)); 8292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn onCancelRequest((Request) msg.obj); 83091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn break; 831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_STARTED: 832c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj 833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskStarted((Intent) msg.obj, msg.arg1); 835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_TASK_FINISHED: 837c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj 838c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn + " taskId=" + msg.arg1); 839c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onTaskFinished((Intent) msg.obj, msg.arg1); 840c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_CLOSE_SYSTEM_DIALOGS: 842c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); 843c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onCloseSystemDialogs(); 844c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 845c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn case MSG_DESTROY: 846c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (DEBUG) Log.d(TAG, "doDestroy"); 847c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn doDestroy(); 848c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn break; 849ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn case MSG_HANDLE_ASSIST: 85009d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn args = (SomeArgs)msg.obj; 85109d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1 852e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani + " structure=" + args.arg2 + " content=" + args.arg3 853e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani + " activityIndex=" + args.argi5 + " activityCount=" + args.argi6); 854e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani if (args.argi5 == 0) { 855e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani doOnHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2, 856e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani (Throwable) args.arg3, (AssistContent) args.arg4); 857e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani } else { 858e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani doOnHandleAssistSecondary((Bundle) args.arg1, (AssistStructure) args.arg2, 859e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani (Throwable) args.arg3, (AssistContent) args.arg4, 860e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani args.argi5, args.argi6); 861e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani } 862ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn break; 86327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn case MSG_HANDLE_SCREENSHOT: 86427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj); 86527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn onHandleScreenshot((Bitmap) msg.obj); 86627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn break; 867ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_SHOW: 868225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi args = (SomeArgs)msg.obj; 869225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1 870225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " flags=" + msg.arg1 871225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi + " showCallback=" + args.arg2); 872225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi doShow((Bundle) args.arg1, msg.arg1, 873225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi (IVoiceInteractionSessionShowCallback) args.arg2); 874ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 875ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn case MSG_HIDE: 876ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.d(TAG, "doHide"); 877ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn doHide(); 878ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn break; 87919695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi case MSG_ON_LOCKSCREEN_SHOWN: 88019695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi if (DEBUG) Log.d(TAG, "onLockscreenShown"); 88119695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi onLockscreenShown(); 88219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi break; 88391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 884d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn if (args != null) { 885d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn args.recycle(); 886d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn } 88791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 88891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn @Override 890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession.this.onBackPressed(); 892c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 893c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 894c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 895c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final MyCallbacks mCallbacks = new MyCallbacks(); 896c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 897c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 898c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Information about where interesting parts of the input method UI appear. 899c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final class Insets { 901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 902e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn * This is the part of the UI that is the main content. It is 903c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * used to determine the basic space needed, to resize/pan the 904c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * application behind. It is assumed that this inset does not 905c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * change very much, since any change will cause a full resize/pan 906c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the application behind. This value is relative to the top edge 907c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of the input method window. 908c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 909e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn public final Rect contentInsets = new Rect(); 910c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 911c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 912c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This is the region of the UI that is touchable. It is used when 913c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. 914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * The region should be specified relative to the origin of the window frame. 915c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public final Region touchableRegion = new Region(); 917c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 918c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 919c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the entire window frame 920c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * can be touched. 921c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 922c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_FRAME 923c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 924c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 925c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 926c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the area inside of 927c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * the content insets can be touched. 928c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 929c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_CONTENT 930c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; 931c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 932c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 933c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Option for {@link #touchableInsets}: the region specified by 934c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #touchableRegion} can be touched. 935c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 936c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public static final int TOUCHABLE_INSETS_REGION 937c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; 938c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 939c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 940c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Determine which area of the window is touchable by the user. May 941c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * be one of: {@link #TOUCHABLE_INSETS_FRAME}, 942c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. 943c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 944c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public int touchableInsets; 945c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 946c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 947c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = 948c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn new ViewTreeObserver.OnComputeInternalInsetsListener() { 949c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { 950c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn onComputeInsets(mTmpInsets); 951e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.contentInsets.set(mTmpInsets.contentInsets); 952e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn info.visibleInsets.set(mTmpInsets.contentInsets); 953c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.touchableRegion.set(mTmpInsets.touchableRegion); 954c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn info.setTouchableInsets(mTmpInsets.touchableInsets); 955c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 956c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn }; 95791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 95891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context) { 95991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn this(context, new Handler()); 96091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 96191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 96291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn public VoiceInteractionSession(Context context, Handler handler) { 96391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mContext = context; 96491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn mHandlerCaller = new HandlerCaller(context, handler.getLooper(), 965c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mCallbacks, true); 96691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 96791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 968d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn public Context getContext() { 969d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn return mContext; 970d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn } 971d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn 9722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn void addRequest(Request req) { 9731b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn synchronized (this) { 9741b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn mActiveRequests.put(req.mInterface.asBinder(), req); 9751b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 9761b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 9771b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn 9781b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn boolean isRequestActive(IBinder reqInterface) { 9791b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn synchronized (this) { 9801b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn return mActiveRequests.containsKey(reqInterface); 9811b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn } 982a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 983a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 984a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn Request removeRequest(IBinder reqInterface) { 98591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn synchronized (this) { 9868ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe return mActiveRequests.remove(reqInterface); 98791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 98891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 98991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 990593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn void doCreate(IVoiceInteractionManagerService service, IBinder token) { 991c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService = service; 992c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mToken = token; 993593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn onCreate(); 994c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 995c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 996225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) { 997ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded 998ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn + " mWindowVisible=" + mWindowVisible); 999ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1000ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mInShowWindow) { 1001ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn Log.w(TAG, "Re-entrance in to showWindow"); 1002ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn return; 1003ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1004ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1005ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 1006ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = true; 100759da805846034a4939b014f469d7383285c75aabDianne Hackborn onPrepareShow(args, flags); 1008ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 100959da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowAdded(); 1010ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1011ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onShow(args, flags); 1012ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (!mWindowVisible) { 1013ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = true; 101459da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mUiEnabled) { 101559da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.show(); 101659da805846034a4939b014f469d7383285c75aabDianne Hackborn } 1017ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1018225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi if (showCallback != null) { 101959da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mUiEnabled) { 102059da805846034a4939b014f469d7383285c75aabDianne Hackborn mRootView.invalidate(); 102159da805846034a4939b014f469d7383285c75aabDianne Hackborn mRootView.getViewTreeObserver().addOnPreDrawListener( 102259da805846034a4939b014f469d7383285c75aabDianne Hackborn new ViewTreeObserver.OnPreDrawListener() { 102359da805846034a4939b014f469d7383285c75aabDianne Hackborn @Override 102459da805846034a4939b014f469d7383285c75aabDianne Hackborn public boolean onPreDraw() { 102559da805846034a4939b014f469d7383285c75aabDianne Hackborn mRootView.getViewTreeObserver().removeOnPreDrawListener(this); 102659da805846034a4939b014f469d7383285c75aabDianne Hackborn try { 102759da805846034a4939b014f469d7383285c75aabDianne Hackborn showCallback.onShown(); 102859da805846034a4939b014f469d7383285c75aabDianne Hackborn } catch (RemoteException e) { 102959da805846034a4939b014f469d7383285c75aabDianne Hackborn Log.w(TAG, "Error calling onShown", e); 103059da805846034a4939b014f469d7383285c75aabDianne Hackborn } 103159da805846034a4939b014f469d7383285c75aabDianne Hackborn return true; 1032225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 103359da805846034a4939b014f469d7383285c75aabDianne Hackborn }); 103459da805846034a4939b014f469d7383285c75aabDianne Hackborn } else { 103559da805846034a4939b014f469d7383285c75aabDianne Hackborn try { 103659da805846034a4939b014f469d7383285c75aabDianne Hackborn showCallback.onShown(); 103759da805846034a4939b014f469d7383285c75aabDianne Hackborn } catch (RemoteException e) { 103859da805846034a4939b014f469d7383285c75aabDianne Hackborn Log.w(TAG, "Error calling onShown", e); 103959da805846034a4939b014f469d7383285c75aabDianne Hackborn } 104059da805846034a4939b014f469d7383285c75aabDianne Hackborn } 1041225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi } 1042ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } finally { 1043ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowWasVisible = true; 1044ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mInShowWindow = false; 1045ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1046ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1047ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1048ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn void doHide() { 1049ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn if (mWindowVisible) { 105059da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowHidden(); 1051ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mWindowVisible = false; 1052ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn onHide(); 1053ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1054ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1055ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1056c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn void doDestroy() { 10579a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn onDestroy(); 1058c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mInitialized) { 1059c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( 1060c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInsetsComputer); 1061c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindowAdded) { 1062c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.dismiss(); 1063c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindowAdded = false; 1064c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1065c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = false; 1066c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1067c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1068c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 106959da805846034a4939b014f469d7383285c75aabDianne Hackborn void ensureWindowCreated() { 107059da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mInitialized) { 107159da805846034a4939b014f469d7383285c75aabDianne Hackborn return; 107259da805846034a4939b014f469d7383285c75aabDianne Hackborn } 107359da805846034a4939b014f469d7383285c75aabDianne Hackborn 107459da805846034a4939b014f469d7383285c75aabDianne Hackborn if (!mUiEnabled) { 107559da805846034a4939b014f469d7383285c75aabDianne Hackborn throw new IllegalStateException("setUiEnabled is false"); 107659da805846034a4939b014f469d7383285c75aabDianne Hackborn } 107759da805846034a4939b014f469d7383285c75aabDianne Hackborn 1078c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mInitialized = true; 107959da805846034a4939b014f469d7383285c75aabDianne Hackborn mInflater = (LayoutInflater)mContext.getSystemService( 108059da805846034a4939b014f469d7383285c75aabDianne Hackborn Context.LAYOUT_INFLATER_SERVICE); 108159da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, 108259da805846034a4939b014f469d7383285c75aabDianne Hackborn mCallbacks, this, mDispatcherState, 108359da805846034a4939b014f469d7383285c75aabDianne Hackborn WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true); 108459da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.getWindow().addFlags( 108559da805846034a4939b014f469d7383285c75aabDianne Hackborn WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 108659da805846034a4939b014f469d7383285c75aabDianne Hackborn WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 108759da805846034a4939b014f469d7383285c75aabDianne Hackborn WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); 1088c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1089c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); 1090c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView = mInflater.inflate( 1091c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn com.android.internal.R.layout.voice_interaction_session, null); 1092c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.setSystemUiVisibility( 1093225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 109459da805846034a4939b014f469d7383285c75aabDianne Hackborn | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 1095c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mWindow.setContentView(mRootView); 1096c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); 1097c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1098c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); 109959da805846034a4939b014f469d7383285c75aabDianne Hackborn 110059da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); 110159da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.setToken(mToken); 110259da805846034a4939b014f469d7383285c75aabDianne Hackborn } 110359da805846034a4939b014f469d7383285c75aabDianne Hackborn 110459da805846034a4939b014f469d7383285c75aabDianne Hackborn void ensureWindowAdded() { 110559da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mUiEnabled && !mWindowAdded) { 110659da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindowAdded = true; 110759da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowCreated(); 110859da805846034a4939b014f469d7383285c75aabDianne Hackborn View v = onCreateContentView(); 110959da805846034a4939b014f469d7383285c75aabDianne Hackborn if (v != null) { 111059da805846034a4939b014f469d7383285c75aabDianne Hackborn setContentView(v); 111159da805846034a4939b014f469d7383285c75aabDianne Hackborn } 111259da805846034a4939b014f469d7383285c75aabDianne Hackborn } 111359da805846034a4939b014f469d7383285c75aabDianne Hackborn } 111459da805846034a4939b014f469d7383285c75aabDianne Hackborn 111559da805846034a4939b014f469d7383285c75aabDianne Hackborn void ensureWindowHidden() { 111659da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mWindow != null) { 111759da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.hide(); 111859da805846034a4939b014f469d7383285c75aabDianne Hackborn } 1119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 112169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 11221de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * Equivalent to {@link VoiceInteractionService#setDisabledShowContext 11231de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionService.setDisabledShowContext(int)}. 11241de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn */ 11251de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn public void setDisabledShowContext(int flags) { 11261de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn try { 11271de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn mSystemService.setDisabledShowContext(flags); 11281de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } catch (RemoteException e) { 11291de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 11301de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 11311de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn 11321de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn /** 11331de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * Equivalent to {@link VoiceInteractionService#getDisabledShowContext 11341de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionService.getDisabledShowContext}. 11351de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn */ 11361de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn public int getDisabledShowContext() { 11371de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn try { 11381de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn return mSystemService.getDisabledShowContext(); 11391de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } catch (RemoteException e) { 11401de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn return 0; 11411de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 11421de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn } 11431de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn 11441de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn /** 114517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * Return which show context flags have been disabled by the user through the system 114617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * settings UI, so the session will never get this data. Returned flags are any combination of 114717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and 114817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT 114917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}. Note that this only tells you about 115017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * global user settings, not about restrictions that may be applied contextual based on 115117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * the current application the user is in or other transient states. 115217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn */ 115317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public int getUserDisabledShowContext() { 115417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn try { 115517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn return mSystemService.getUserDisabledShowContext(); 115617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } catch (RemoteException e) { 115717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn return 0; 115817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } 115917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn } 116017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn 116117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn /** 116269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Show the UI for this session. This asks the system to go through the process of showing 116369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * your UI, which will eventually culminate in {@link #onShow}. This is similar to calling 116469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 116569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param args Arbitrary arguments that will be propagated {@link #onShow}. 116669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * @param flags Indicates additional optional behavior that should be performed. May 11671de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * be any combination of 11681de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and 11691de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT 11701de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn * VoiceInteractionSession.SHOW_WITH_SCREENSHOT} 117169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * to request that the system generate and deliver assist data on the current foreground 117269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * app as part of showing the session UI. 117369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 117469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn public void show(Bundle args, int flags) { 117569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 117669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 117769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 1178ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn try { 117969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn mSystemService.showSessionFromSession(mToken, args, flags); 1180ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 1181c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1182ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1183c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 118469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn /** 118569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Hide the session's UI, if currently shown. Call this when you are done with your 118669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * user interaction. 118769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn */ 1188ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void hide() { 118969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 119069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 119169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 1192c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1193ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn mSystemService.hideSessionFromSession(mToken); 1194ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } catch (RemoteException e) { 1195c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1196c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1197c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1198c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 119959da805846034a4939b014f469d7383285c75aabDianne Hackborn * Control whether the UI layer for this session is enabled. It is enabled by default. 120059da805846034a4939b014f469d7383285c75aabDianne Hackborn * If set to false, you will not be able to provide a UI through {@link #onCreateContentView()}. 120159da805846034a4939b014f469d7383285c75aabDianne Hackborn */ 120259da805846034a4939b014f469d7383285c75aabDianne Hackborn public void setUiEnabled(boolean enabled) { 120359da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mUiEnabled != enabled) { 120459da805846034a4939b014f469d7383285c75aabDianne Hackborn mUiEnabled = enabled; 120559da805846034a4939b014f469d7383285c75aabDianne Hackborn if (mWindowVisible) { 120659da805846034a4939b014f469d7383285c75aabDianne Hackborn if (enabled) { 120759da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowAdded(); 120859da805846034a4939b014f469d7383285c75aabDianne Hackborn mWindow.show(); 120959da805846034a4939b014f469d7383285c75aabDianne Hackborn } else { 121059da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowHidden(); 121159da805846034a4939b014f469d7383285c75aabDianne Hackborn } 121259da805846034a4939b014f469d7383285c75aabDianne Hackborn } 121359da805846034a4939b014f469d7383285c75aabDianne Hackborn } 121459da805846034a4939b014f469d7383285c75aabDianne Hackborn } 121559da805846034a4939b014f469d7383285c75aabDianne Hackborn 121659da805846034a4939b014f469d7383285c75aabDianne Hackborn /** 1217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * You can call this to customize the theme used by your IME's window. 1218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * This must be set before {@link #onCreate}, so you 1219c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * will typically call it in your constructor with the resource ID 1220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * of your custom theme. 1221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 1222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setTheme(int theme) { 1223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mWindow != null) { 1224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Must be called before onCreate()"); 1225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = theme; 1227c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1228c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1229a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1230a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Ask that a new activity be started for voice interaction. This will create a 1231a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * new dedicated task in the activity manager for this voice interaction session; 1232a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 1233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * will be set for you to make it a new task. 1234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>The newly started activity will be displayed to the user in a special way, as 1236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * a layer under the voice interaction UI.</p> 1237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1238a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor} 1239a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * through which it can perform voice interactions through your session. These requests 1240a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands}, 12412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestConfirmation}, {@link #onRequestPickOption}, 12422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 12432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand} 1244a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1245a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * <p>You will receive a call to {@link #onTaskStarted} when the task starts up 1246a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * and {@link #onTaskFinished} when the last activity has finished. 1247a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1248a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The Intent to start this voice interaction. The given Intent will 1249a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since 1250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * this is part of a voice interaction. 1251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1252c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void startVoiceActivity(Intent intent) { 1253c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1254c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1257e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn intent.migrateExtraStreamToClipData(); 1258344744b49633a7f8aa0c8e43469bbfcf9d8e2cabJeff Sharkey intent.prepareToLeaveProcess(mContext); 1259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn int res = mSystemService.startVoiceActivity(mToken, intent, 1260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn intent.resolveType(mContext.getContentResolver())); 1261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn Instrumentation.checkStartActivityResult(res, intent); 1262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 12638347163dbb64fb61012c0393163283106a0a351eWinson Chung } 12648347163dbb64fb61012c0393163283106a0a351eWinson Chung } 12658347163dbb64fb61012c0393163283106a0a351eWinson Chung 12668347163dbb64fb61012c0393163283106a0a351eWinson Chung 12678347163dbb64fb61012c0393163283106a0a351eWinson Chung 12688347163dbb64fb61012c0393163283106a0a351eWinson Chung /** 12698347163dbb64fb61012c0393163283106a0a351eWinson Chung * <p>Ask that a new assistant activity be started. This will create a new task in the 12708347163dbb64fb61012c0393163283106a0a351eWinson Chung * in activity manager: this means that 12718347163dbb64fb61012c0393163283106a0a351eWinson Chung * {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK} 12728347163dbb64fb61012c0393163283106a0a351eWinson Chung * will be set for you to make it a new task.</p> 12738347163dbb64fb61012c0393163283106a0a351eWinson Chung * 12748347163dbb64fb61012c0393163283106a0a351eWinson Chung * <p>The newly started activity will be displayed on top of other activities in the system 12758347163dbb64fb61012c0393163283106a0a351eWinson Chung * in a new layer that is not affected by multi-window mode. Tasks started from this activity 12768347163dbb64fb61012c0393163283106a0a351eWinson Chung * will go into the normal activity layer and not this new layer.</p> 12778347163dbb64fb61012c0393163283106a0a351eWinson Chung * 12788347163dbb64fb61012c0393163283106a0a351eWinson Chung * <p>By default, the system will create a window for the UI for this session. If you are using 12798347163dbb64fb61012c0393163283106a0a351eWinson Chung * an assistant activity instead, then you can disable the window creation by calling 12808347163dbb64fb61012c0393163283106a0a351eWinson Chung * {@link #setUiEnabled} in {@link #onPrepareShow(Bundle, int)}.</p> 12818347163dbb64fb61012c0393163283106a0a351eWinson Chung */ 12828347163dbb64fb61012c0393163283106a0a351eWinson Chung public void startAssistantActivity(Intent intent) { 12838347163dbb64fb61012c0393163283106a0a351eWinson Chung if (mToken == null) { 12848347163dbb64fb61012c0393163283106a0a351eWinson Chung throw new IllegalStateException("Can't call before onCreate()"); 12858347163dbb64fb61012c0393163283106a0a351eWinson Chung } 12868347163dbb64fb61012c0393163283106a0a351eWinson Chung try { 12878347163dbb64fb61012c0393163283106a0a351eWinson Chung intent.migrateExtraStreamToClipData(); 12888347163dbb64fb61012c0393163283106a0a351eWinson Chung intent.prepareToLeaveProcess(mContext); 12898347163dbb64fb61012c0393163283106a0a351eWinson Chung int res = mSystemService.startAssistantActivity(mToken, intent, 12908347163dbb64fb61012c0393163283106a0a351eWinson Chung intent.resolveType(mContext.getContentResolver())); 12918347163dbb64fb61012c0393163283106a0a351eWinson Chung Instrumentation.checkStartActivityResult(res, intent); 12928347163dbb64fb61012c0393163283106a0a351eWinson Chung } catch (RemoteException e) { 1293c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1295c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1296a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 12973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Set whether this session will keep the device awake while it is running a voice 12983d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * activity. By default, the system holds a wake lock for it while in this state, 12993d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * so that it can work even if the screen is off. Setting this to false removes that 13003d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * wake lock, allowing the CPU to go to sleep. This is typically used if the 13013d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * session decides it has been waiting too long for a response from the user and 13023d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * doesn't want to let this continue to drain the battery. 13033d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 13043d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * <p>Passing false here will release the wake lock, and you can call later with 13053d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * true to re-acquire it. It will also be automatically re-acquired for you each 13063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * time you start a new voice activity task -- that is when you call 13073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link #startVoiceActivity}.</p> 13083d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 13093d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public void setKeepAwake(boolean keepAwake) { 131069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn if (mToken == null) { 131169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 131269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn } 13133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn try { 13143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn mSystemService.setKeepAwake(mToken, keepAwake); 13153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } catch (RemoteException e) { 13163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 13173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 13183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 13193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 13204e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * Request that all system dialogs (and status bar shade etc) be closed, allowing 13214e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * access to the session's UI. This will <em>not</em> cause the lock screen to be 13224e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn * dismissed. 13234e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn */ 13244e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn public void closeSystemDialogs() { 13254e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn if (mToken == null) { 13264e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 13274e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 13284e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn try { 13294e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn mSystemService.closeSystemDialogs(mToken); 13304e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } catch (RemoteException e) { 13314e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 13324e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn } 13334e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn 13344e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn /** 1335a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Convenience for inflating views. 1336a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1337c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public LayoutInflater getLayoutInflater() { 133859da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowCreated(); 1339c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mInflater; 1340c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1341c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1342a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1343a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Retrieve the window being used to show the session's UI. 1344a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1345c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public Dialog getWindow() { 134659da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowCreated(); 1347c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return mWindow; 1348c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1350a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 135169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * Finish the session. This completely destroys the session -- the next time it is shown, 135269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * an entirely new one will be created. You do not normally call this function; instead, 135369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * use {@link #hide} and allow the system to destroy your session if it needs its RAM. 1354a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void finish() { 1356c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mToken == null) { 1357c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn throw new IllegalStateException("Can't call before onCreate()"); 1358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn try { 1360c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.finish(mToken); 1361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } catch (RemoteException e) { 1362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1363c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 13652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn /** 13662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * Initiatize a new session. At this point you don't know exactly what this 13672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * session will be used for; you will find that out in {@link #onShow}. 13682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn */ 13692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCreate() { 13702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn doOnCreate(); 13712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 13722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn 13732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn private void doOnCreate() { 1374c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mTheme = mTheme != 0 ? mTheme 1375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; 137659da805846034a4939b014f469d7383285c75aabDianne Hackborn } 137759da805846034a4939b014f469d7383285c75aabDianne Hackborn 137859da805846034a4939b014f469d7383285c75aabDianne Hackborn /** 137959da805846034a4939b014f469d7383285c75aabDianne Hackborn * Called prior to {@link #onShow} before any UI setup has occurred. Not generally useful. 138059da805846034a4939b014f469d7383285c75aabDianne Hackborn * 138159da805846034a4939b014f469d7383285c75aabDianne Hackborn * @param args The arguments that were supplied to 138259da805846034a4939b014f469d7383285c75aabDianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 138359da805846034a4939b014f469d7383285c75aabDianne Hackborn * @param showFlags The show flags originally provided to 138459da805846034a4939b014f469d7383285c75aabDianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 138559da805846034a4939b014f469d7383285c75aabDianne Hackborn */ 138659da805846034a4939b014f469d7383285c75aabDianne Hackborn public void onPrepareShow(Bundle args, int showFlags) { 1387c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1388c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1389a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1390ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called when the session UI is going to be shown. This is called after 1391ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link #onCreateContentView} (if the session's content UI needed to be created) and 1392ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * immediately prior to the window being shown. This may be called while the window 1393ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * is already shown, if a show request has come in while it is shown, to allow you to 1394ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * update the UI to match the new show arguments. 1395ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * 1396ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * @param args The arguments that were supplied to 1397ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1398ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * @param showFlags The show flags originally provided to 1399ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}. 1400ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn */ 1401ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onShow(Bundle args, int showFlags) { 1402ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn } 1403ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn 1404ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn /** 1405ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * Called immediately after stopping to show the session UI. 1406ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn */ 1407ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn public void onHide() { 1408ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn } 1409ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn 1410ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn /** 1411a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Last callback to the session as it is being finished. 1412a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onDestroy() { 1414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1416a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1417a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Hook in which to create the session's UI. 1418a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public View onCreateContentView() { 1420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return null; 1421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1422c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1423c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void setContentView(View view) { 142459da805846034a4939b014f469d7383285c75aabDianne Hackborn ensureWindowCreated(); 1425c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.removeAllViews(); 1426c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mContentFrame.addView(view, new FrameLayout.LayoutParams( 1427c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT, 1428ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn ViewGroup.LayoutParams.MATCH_PARENT)); 142941607d5a2b8cc4a3fde4a2f75e33a00e8d957b1dAdam Powell mContentFrame.requestApplyInsets(); 1430c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1431c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1432782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn void doOnHandleAssist(Bundle data, AssistStructure structure, Throwable failure, 1433782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn AssistContent content) { 1434782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn if (failure != null) { 1435782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn onAssistStructureFailure(failure); 1436782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1437782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn onHandleAssist(data, structure, content); 1438782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1439782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn 1440e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani void doOnHandleAssistSecondary(Bundle data, AssistStructure structure, Throwable failure, 1441e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani AssistContent content, int index, int count) { 1442e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani if (failure != null) { 1443e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani onAssistStructureFailure(failure); 1444e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani } 1445e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani onHandleAssistSecondary(data, structure, content, index, count); 1446e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani } 1447e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani 1448782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1449782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called when there has been a failure transferring the {@link AssistStructure} to 1450782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * the assistant. This may happen, for example, if the data is too large and results 1451782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * in an out of memory exception, or the client has provided corrupt data. This will 1452782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * be called immediately before {@link #onHandleAssist} and the AssistStructure supplied 1453782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * there afterwards will be null. 1454782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * 1455782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param failure The failure exception that was thrown when building the 1456782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link AssistStructure}. 1457782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 1458782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn public void onAssistStructureFailure(Throwable failure) { 1459782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn } 1460782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn 1461782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1462782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called to receive data from the application that the user was currently viewing when 146317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * an assist session is started. If the original show request did not specify 146417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link #SHOW_WITH_ASSIST}, this method will not be called. 1465782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * 1466782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param data Arbitrary data supplied by the app through 1467782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}. 146817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * May be null if assist data has been disabled by the user or device policy. 1469782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param structure If available, the structure definition of all windows currently 147017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * displayed by the app. May be null if assist data has been disabled by the user 147117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * or device policy; will be an empty stub if the application has disabled assist 147217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * by marking its window as secure. 1473782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * @param content Additional content data supplied by the app through 1474782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}. 147517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * May be null if assist data has been disabled by the user or device policy; will 147617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * not be automatically filled in with data from the app if the app has marked its 147717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * window as secure. 1478782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 147917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public void onHandleAssist(@Nullable Bundle data, @Nullable AssistStructure structure, 148017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn @Nullable AssistContent content) { 148109d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn } 148209d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn 1483782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn /** 1484e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * Called to receive data from other applications that the user was or is interacting with, 1485e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * that are currently on the screen in a multi-window display environment, not including the 1486e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * currently focused activity. This could be 1487e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * a free-form window, a picture-in-picture window, or another window in a split-screen display. 1488e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * <p> 1489e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * This method is very similar to 1490e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * {@link #onHandleAssist} except that it is called 1491e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * for additional non-focused activities along with an index and count that indicates 1492e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * which additional activity the data is for. {@code index} will be between 1 and 1493e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * {@code count}-1 and this method is called once for each additional window, in no particular 1494e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * order. The {@code count} indicates how many windows to expect assist data for, including the 1495e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * top focused activity, which continues to be returned via {@link #onHandleAssist}. 1496e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * <p> 1497e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * To be responsive to assist requests, process assist data as soon as it is received, 1498e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * without waiting for all queued activities to return assist data. 1499e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * 1500e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * @param data Arbitrary data supplied by the app through 1501e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}. 1502e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * May be null if assist data has been disabled by the user or device policy. 1503e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * @param structure If available, the structure definition of all windows currently 1504e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * displayed by the app. May be null if assist data has been disabled by the user 1505e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * or device policy; will be an empty stub if the application has disabled assist 1506e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * by marking its window as secure. 1507e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * @param content Additional content data supplied by the app through 1508e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}. 1509e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * May be null if assist data has been disabled by the user or device policy; will 1510e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * not be automatically filled in with data from the app if the app has marked its 1511e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * window as secure. 1512e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * @param index the index of the additional activity that this data 1513e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * is for. 1514e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * @param count the total number of additional activities for which the assist data is being 1515e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * returned, including the focused activity that is returned via 1516e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani * {@link #onHandleAssist}. 1517e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani */ 1518e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani public void onHandleAssistSecondary(@Nullable Bundle data, @Nullable AssistStructure structure, 1519e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani @Nullable AssistContent content, int index, int count) { 1520e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani } 1521e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani 1522e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani /** 1523782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn * Called to receive a screenshot of what the user was currently viewing when an assist 152417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * session is started. May be null if screenshots are disabled by the user, policy, 152517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * or application. If the original show request did not specify 152617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn * {@link #SHOW_WITH_SCREENSHOT}, this method will not be called. 1527782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn */ 152817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn public void onHandleScreenshot(@Nullable Bitmap screenshot) { 152927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn } 153027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn 1531c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyDown(int keyCode, KeyEvent event) { 1532c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1533c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1534c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1535c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyLongPress(int keyCode, KeyEvent event) { 1536c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1537c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1538c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1539c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyUp(int keyCode, KeyEvent event) { 1540c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1541c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1542c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1543c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { 1544c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn return false; 1545c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1546c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1547d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn /** 1548d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * Called when the user presses the back button while focus is in the session UI. Note 1549d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * that this will only happen if the session UI has requested input focus in its window; 1550d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn * otherwise, the back key will go to whatever window has focus and do whatever behavior 155169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * it normally has there. The default implementation simply calls {@link #hide}. 1552d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn */ 1553c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onBackPressed() { 1554ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1555c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1556c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1557a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1558a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Sessions automatically watch for requests that all system UI be closed (such as when 1559a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the user presses HOME), which will appear here. The default implementation always 156069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn * calls {@link #hide}. 1561a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1562c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onCloseSystemDialogs() { 1563ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 156419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi } 156519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi 156619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi /** 156719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi * Called when the lockscreen was shown. 156819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi */ 156919695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi public void onLockscreenShown() { 157019695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi hide(); 1571c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1572c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 15731e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 15741e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 15751e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 15761e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 15771e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 15781e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 15791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 15801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 15811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 15821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 15831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 15841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 1585c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn /** 1586c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * Compute the interesting insets into your UI. The default implementation 1587ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height 1588ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * of the window, meaning it should not adjust content underneath. The default touchable 1589ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch 1590ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn * events within its window frame. 1591c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * 1592c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * @param outInsets Fill in with the current UI insets. 1593c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 1594c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onComputeInsets(Insets outInsets) { 1595e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.left = 0; 1596e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn outInsets.contentInsets.bottom = 0; 1597ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.right = 0; 1598ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn View decor = getWindow().getWindow().getDecorView(); 1599ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn outInsets.contentInsets.top = decor.getHeight(); 1600c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; 1601c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn outInsets.touchableRegion.setEmpty(); 1602c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1603c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1604a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1605a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)} 1606a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * has actually started. 1607a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1608a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1609a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1610a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the now running task. 1611a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1612c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskStarted(Intent intent, int taskId) { 1613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1614c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1615a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1616a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Called when the last activity of a task initiated by 1617a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)} has finished. The default 1618a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * implementation calls {@link #finish()} on the assumption that this represents 1619a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * the completion of a voice action. You can override the implementation if you would 1620a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * like a different behavior. 1621a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1622a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param intent The original {@link Intent} supplied to 1623a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link #startVoiceActivity(android.content.Intent)}. 1624a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param taskId Unique ID of the finished task. 1625a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 1626c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn public void onTaskFinished(Intent intent, int taskId) { 1627ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn hide(); 1628c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 1629c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn 1630a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1631a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to query for what extended commands the session supports. 1632a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1633a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param commands An array of commands that are being queried. 1634a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @return Return an array of booleans indicating which of each entry in the 1635a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * command array is supported. A true entry in the array indicates the command 1636a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * is supported; false indicates it is not. The default implementation returns 1637a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * an array of all false entries. 1638a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 16392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public boolean[] onGetSupportedCommands(String[] commands) { 1640593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn return new boolean[commands.length]; 1641a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1642a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1643a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1644a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to confirm with the user before proceeding with an unrecoverable operation, 1645a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest 1646a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.ConfirmationRequest}. 1647a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1648a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1649a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 16502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestConfirmation(ConfirmationRequest request) { 16512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1652a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1653a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 16543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Request for the user to pick one of N options, corresponding to a 16553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}. 16563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * 16573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @param request The active request. 16583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 16592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestPickOption(PickOptionRequest request) { 16602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 16613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 16623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 1663d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * Request to complete the voice interaction session because the voice activity successfully 1664d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * completed its interaction using voice. Corresponds to 1665d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * {@link android.app.VoiceInteractor.CompleteVoiceRequest 1666d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * VoiceInteractor.CompleteVoiceRequest}. The default implementation just sends an empty 1667d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * confirmation back to allow the activity to exit. 1668d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * 1669d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James * @param request The active request. 1670d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James */ 16712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCompleteVoice(CompleteVoiceRequest request) { 1672d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James } 1673d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James 1674d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James /** 1675a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Request to abort the voice interaction session because the voice activity can not 1676a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * complete its interaction using voice. Corresponds to 1677a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * {@link android.app.VoiceInteractor.AbortVoiceRequest 1678a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.AbortVoiceRequest}. The default implementation just sends an empty 1679a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * confirmation back to allow the activity to exit. 1680a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1681a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1682a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 16832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestAbortVoice(AbortVoiceRequest request) { 1684a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn } 1685a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1686a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1687a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * Process an arbitrary extended command from the caller, 1688a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * corresponding to a {@link android.app.VoiceInteractor.CommandRequest 1689a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * VoiceInteractor.CommandRequest}. 1690a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1691a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The active request. 1692a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 16932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onRequestCommand(CommandRequest request) { 16942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 1695a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn 1696a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn /** 1697593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request} 16982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * that was previously delivered to {@link #onRequestConfirmation}, 16992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice}, 17002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn * or {@link #onRequestCommand}. 1701a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * 1702a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn * @param request The request that is being canceled. 1703a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */ 17042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn public void onCancelRequest(Request request) { 17052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn } 170657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 170757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn /** 170857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * Print the Service's state into the given stream. This gets invoked by 170957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * {@link VoiceInteractionSessionService} when its Service 171057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * {@link android.app.Service#dump} method is called. 171157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * 171257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param prefix Text to print at the front of each line. 171357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param fd The raw file descriptor that the dump is being sent to. 171457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param writer The PrintWriter to which you should dump your state. This will be 171557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * closed for you after you return. 171657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn * @param args additional arguments to the dump request. 171757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn */ 171857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 171957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mToken="); writer.println(mToken); 172057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme)); 172159da805846034a4939b014f469d7383285c75aabDianne Hackborn writer.print(prefix); writer.print("mUiEnabled="); writer.println(mUiEnabled); 172259da805846034a4939b014f469d7383285c75aabDianne Hackborn writer.print(" mInitialized="); writer.println(mInitialized); 172357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded); 172457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mWindowVisible="); writer.println(mWindowVisible); 172557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible); 172657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(" mInShowWindow="); writer.println(mInShowWindow); 172757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mActiveRequests.size() > 0) { 172857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.println("Active requests:"); 172957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn String innerPrefix = prefix + " "; 173057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn for (int i=0; i<mActiveRequests.size(); i++) { 173157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn Request req = mActiveRequests.valueAt(i); 173257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 173357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.print(": "); 173457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println(req); 173557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn req.dump(innerPrefix, fd, writer, args); 173657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 173757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 173857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 173957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 174091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 1741