VoiceInteractionSession.java revision 57dd737443a174379eb638450e4888500d8e4a23
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/**
291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project
391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License.
691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at
791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and
1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License.
1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */
1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice;
1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
196cf397508eb7edef13baefad942a59b058ed450bJames Cookimport android.annotation.Nullable;
20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
223d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor;
2369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistContent;
2469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistStructure;
251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2;
2691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration;
29c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray;
3027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap;
31e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect;
32c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region;
33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message;
3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
4057dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.os.UserHandle;
4191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap;
4257dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.util.DebugUtils;
4391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log;
44e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity;
45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent;
46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater;
47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View;
48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup;
49c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver;
50c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout;
52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService;
53225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback;
5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback;
5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest;
5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller;
5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs;
5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
6057dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.FileDescriptor;
6157dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.PrintWriter;
62a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference;
63a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
66a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/**
674e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation
68ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer.  The user interface is
69ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()}
70ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built.
714e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn *
724e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish}
734e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done.  It can also initiate voice interactions with applications by calling
744e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>.
75a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */
762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornpublic class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 {
7791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
78593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    static final boolean DEBUG = false;
7991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag received in {@link #onShow}: originator requested that the session be started with
822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * assist data from the currently focused activity.
832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_WITH_ASSIST = 1<<0;
852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag received in {@link #onShow}: originator requested that the session be started with
882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * a screen shot of the currently focused activity.
892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_WITH_SCREENSHOT = 1<<1;
912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag for use with {@link #onShow}: indicates that the session has been started from the
942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * system assist gesture.
952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_SOURCE_ASSIST_GESTURE = 1<<2;
972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
9817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    /**
9917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * Flag for use with {@link #onShow}: indicates that the application itself has invoked
10017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * the assistant.
10117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     */
10217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public static final int SHOW_SOURCE_APPLICATION = 1<<3;
10317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn
104c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
106c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
108c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
109c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
110c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
111c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
112c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
113c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
114c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
115c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
116c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
117c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
129a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    final WeakReference<VoiceInteractionSession> mWeakRef
130a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            = new WeakReference<VoiceInteractionSession>(this);
131a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
13291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
13391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
13491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
1356cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, Bundle extras) {
1362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            ConfirmationRequest request = new ConfirmationRequest(callingPackage,
1372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    prompt, extras);
1392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_CONFIRMATION,
1412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
1463d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public IVoiceInteractorRequest startPickOption(String callingPackage,
1476cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt,
1483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
1492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            PickOptionRequest request = new PickOptionRequest(callingPackage,
1502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    prompt, options, extras);
1522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_PICK_OPTION,
1542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
1553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            return request.mInterface;
1563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
1573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
1583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        @Override
159d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public IVoiceInteractorRequest startCompleteVoice(String callingPackage,
1606cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) {
1612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            CompleteVoiceRequest request = new CompleteVoiceRequest(callingPackage,
1622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    message, extras);
1642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMPLETE_VOICE,
1662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
167d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            return request.mInterface;
168d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
169d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
170d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        @Override
171a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public IVoiceInteractorRequest startAbortVoice(String callingPackage,
1726cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) {
1732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            AbortVoiceRequest request = new AbortVoiceRequest(callingPackage,
1742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    message, extras);
1762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_ABORT_VOICE,
1782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
179a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return request.mInterface;
180a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
181a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
182a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        @Override
18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
1852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            CommandRequest request = new CommandRequest(callingPackage,
1862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    command, extras);
188593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            addRequest(request);
1892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND,
1902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
1972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    0, commands, null);
19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
19991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
20091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
20191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
20291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
20391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
20491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
20591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
20791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
210225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        public void show(Bundle sessionArgs, int flags,
211225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                IVoiceInteractionSessionShowCallback showCallback) {
212225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW,
213225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    flags, sessionArgs, showCallback));
214ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
215ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
216ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
217ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        public void hide() {
218ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE));
219ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
220ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
221ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
222782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        public void handleAssist(final Bundle data, final AssistStructure structure,
223782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                final AssistContent content) {
2245688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            // We want to pre-warm the AssistStructure before handing it off to the main
225782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // thread.  We also want to do this on a separate thread, so that if the app
226782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // is for some reason slow (due to slow filling in of async children in the
227782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // structure), we don't block other incoming IPCs (such as the screenshot) to
228782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // us (since we are a oneway interface, they get serialized).  (Okay?)
229782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            Thread retriever = new Thread("AssistStructure retriever") {
230782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                @Override
231782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                public void run() {
232782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    Throwable failure = null;
233782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    if (structure != null) {
234782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        try {
235782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            structure.ensureData();
236782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        } catch (Throwable e) {
237782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            Log.w(TAG, "Failure retrieving AssistStructure", e);
238782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            failure = e;
239782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        }
240782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    }
241782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_HANDLE_ASSIST,
242782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            data, failure == null ? structure : null, failure, content));
243782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                }
244782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            };
245782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            retriever.start();
246ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        }
247ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
248ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        @Override
24927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        public void handleScreenshot(Bitmap screenshot) {
25027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT,
25127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    screenshot));
25227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        }
25327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
25427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        @Override
255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
267c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
268c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
269c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
270c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
271c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
27219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        public void onLockscreenShown() {
27319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_ON_LOCKSCREEN_SHOWN));
27419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        }
27519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi
27619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        @Override
277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
28091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
28191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
2822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
2832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Base class representing a request from a voice-driver app to perform a particular
2842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * voice operation with the user.  See related subclasses for the types of requests
2852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * that are possible.
2862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
287593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public static class Request {
28891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
28991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
29091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                VoiceInteractionSession session = mSession.get();
292a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (session != null) {
293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    session.mHandlerCaller.sendMessage(
294a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
295a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                }
29691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
29791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
2982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final String mCallingPackage;
2992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final int mCallingUid;
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
301a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        final WeakReference<VoiceInteractionSession> mSession;
3022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final Bundle mExtras;
303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
3042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        Request(String packageName, int uid, IVoiceInteractorCallback callback,
3052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractionSession session, Bundle extras) {
3062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCallingPackage = packageName;
3072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCallingUid = uid;
30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mSession = session.mWeakRef;
3102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mExtras = extras;
3112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the uid of the application that initiated the request.
3152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public int getCallingUid() {
3172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCallingUid;
3182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the package name of the application that initiated the request.
3222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public String getCallingPackage() {
3242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCallingPackage;
3252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return any additional extra information that was supplied as part of the request.
3292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public Bundle getExtras() {
3312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mExtras;
332a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
333a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
3341b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        /**
3351b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * Check whether this request is currently active.  A request becomes inactive after
3361b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * calling {@link #cancel} or a final result method that completes the request.  After
3371b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * this point, further interactions with the request will result in
3381b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * {@link java.lang.IllegalStateException} errors; you should not catch these errors,
3391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * but can use this method if you need to determine the state of the request.  Returns
3401b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * true if the request is still active.
3411b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         */
3421b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        public boolean isActive() {
3431b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            VoiceInteractionSession session = mSession.get();
3441b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            if (session == null) {
3451b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn                return false;
3461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            }
3471b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            return session.isRequestActive(mInterface.asBinder());
3481b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
3491b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn
350a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        void finishRequest() {
351a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            VoiceInteractionSession session = mSession.get();
352a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (session == null) {
353a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("VoiceInteractionSession has been destroyed");
354a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
355a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = session.removeRequest(mInterface.asBinder());
356a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (req == null) {
357a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Request not active: " + this);
358a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } else if (req != this) {
359a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Current active request " + req
360a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " not same as calling request " + this);
361a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
36291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
36391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
3642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
365593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn         * Ask the app to cancel this current request.
3661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This also finishes the request (it is no longer active).
3672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void cancel() {
36991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
37091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
371a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
37291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
37391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
37491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
37591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
37657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
37757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        @Override
37857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        public String toString() {
37957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            StringBuilder sb = new StringBuilder(128);
38057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            DebugUtils.buildShortClassTag(this, sb);
38157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" ");
38257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(mInterface.asBinder());
38357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" pkg=");
38457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(mCallingPackage);
38557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" uid=");
38657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            UserHandle.formatUid(sb, mCallingUid);
38757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append('}');
38857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            return sb.toString();
38957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
39057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
39157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
39257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mInterface=");
39357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mInterface.asBinder());
39457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage);
39557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid);
39657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println();
39757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCallback=");
39857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mCallback.asBinder());
39957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            if (mExtras != null) {
40057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.print("mExtras=");
40157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.println(mExtras);
40257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
40357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
40491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
40591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
4072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request for confirmation from the user of an operation, as per
4082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest
4092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
4102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
4112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class ConfirmationRequest extends Request {
4126cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
4132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        ConfirmationRequest(String packageName, int uid, IVoiceInteractorCallback callback,
4156cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
4162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
4172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mPrompt = prompt;
4182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
4192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the prompt informing the user of what will happen, as per
4222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.ConfirmationRequest
4232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.ConfirmationRequest}.
4242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
4256cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4266cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
4272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mPrompt;
4282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
42991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4316cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the prompt informing the user of what will happen, as per
4326cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.ConfirmationRequest
4336cf397508eb7edef13baefad942a59b058ed450bJames Cook         * VoiceInteractor.ConfirmationRequest}.
4346cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts.
4356cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
4366cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4376cf397508eb7edef13baefad942a59b058ed450bJames Cook        public CharSequence getPrompt() {
4386cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
4396cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
4406cf397508eb7edef13baefad942a59b058ed450bJames Cook
4416cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
4422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has confirmed the operation with the user, resulting
4432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
4442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult
4452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.ConfirmationRequest.onConfirmationResult}.
4461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
4472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
4482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendConfirmationResult(boolean confirmed, Bundle result) {
449593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
450593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmationResult: req=" + mInterface
451593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
452593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
453593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
454593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
455593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
4562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
45757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
45857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
45957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
46057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
46157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
46257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
4632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
4642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
4662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request for the user to pick from a set of option, as per
4672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
4682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
4692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class PickOptionRequest extends Request {
4706cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
4712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final VoiceInteractor.PickOptionRequest.Option[] mOptions;
4722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        PickOptionRequest(String packageName, int uid, IVoiceInteractorCallback callback,
4746cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt,
4752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
4762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
4772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mPrompt = prompt;
4782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mOptions = options;
4792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
4802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the prompt informing the user of what they are picking, as per
4832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
4842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
4856cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4866cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
4872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mPrompt;
4882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
4892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4916cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the prompt informing the user of what they are picking, as per
4926cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
4936cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts.
4946cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
4956cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4966cf397508eb7edef13baefad942a59b058ed450bJames Cook        public CharSequence getPrompt() {
4976cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
4986cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
4996cf397508eb7edef13baefad942a59b058ed450bJames Cook
5006cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
5012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the set of options the user is picking from, as per
5022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
5032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public VoiceInteractor.PickOptionRequest.Option[] getOptions() {
5052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mOptions;
5062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
508593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        void sendPickOptionResult(boolean finished,
509593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
510593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
511593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
512593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " finished=" + finished + " selections=" + selections
513593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
514593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (finished) {
515593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                    finishRequest();
516593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                }
517593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
518593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
519593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
520593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        }
521593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn
5222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report an intermediate option selection from the request, without completing it (the
5242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * request is still active and the app is waiting for the final option selection),
5252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * resulting in a call to
5262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult
5272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished.
5282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendIntermediatePickOptionResult(
5302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
5312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendPickOptionResult(false, selections, result);
5322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report the final option selection for the request, completing the request
5362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * and resulting in a call to
5372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult
5382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished.
5391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
5402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendPickOptionResult(
5422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
5432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendPickOptionResult(true, selections, result);
5442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
54557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
54657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
54757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
54857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
54957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
55057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            if (mOptions != null) {
55157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.println("Options:");
55257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                for (int i=0; i<mOptions.length; i++) {
55357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    VoiceInteractor.PickOptionRequest.Option op = mOptions[i];
55457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("  #"); writer.print(i); writer.println(":");
55557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("    mLabel=");
55657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.println(op.getLabel());
55757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("    mIndex=");
55857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.println(op.getIndex());
55957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    if (op.countSynonyms() > 0) {
56057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.print(prefix); writer.println("    Synonyms:");
56157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        for (int j=0; j<op.countSynonyms(); j++) {
56257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                            writer.print(prefix); writer.print("      #"); writer.print(j);
56357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                            writer.print(": "); writer.println(op.getSynonymAt(j));
56457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        }
56557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    }
56657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    if (op.getExtras() != null) {
56757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.print(prefix); writer.print("    mExtras=");
56857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.println(op.getExtras());
56957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    }
57057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                }
57157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
57257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
5732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
5742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
5762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request to simply inform the user that the voice operation has completed, as per
5772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
5782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * VoiceInteractor.CompleteVoiceRequest}.
5792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
5802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class CompleteVoiceRequest extends Request {
5816cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
5822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        CompleteVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback,
5846cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
5852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
5866cf397508eb7edef13baefad942a59b058ed450bJames Cook            mPrompt = prompt;
5872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the message informing the user of the completion, as per
5912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CompleteVoiceRequest
5922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CompleteVoiceRequest}.
5932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5946cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
5956cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
5966cf397508eb7edef13baefad942a59b058ed450bJames Cook            return mPrompt;
5976cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
5986cf397508eb7edef13baefad942a59b058ed450bJames Cook
5996cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
6006cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the message informing the user of the completion, as per
6016cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.CompleteVoiceRequest
6026cf397508eb7edef13baefad942a59b058ed450bJames Cook         * VoiceInteractor.CompleteVoiceRequest}.
6036cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message.
6046cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
6056cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public CharSequence getMessage() {
6076cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
6082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has finished completing the voice operation, resulting
6122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
6132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult
6142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CompleteVoiceRequest.onCompleteResult}.
6151b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
6162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendCompleteResult(Bundle result) {
618593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
619593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
620593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
621593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
622593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverCompleteVoiceResult(mInterface, result);
623593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
624593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
6252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
62657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
62757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
62857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
62957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
63057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
63157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
6322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
6332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
6352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request to report that the current user interaction can not be completed with voice, as per
6362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
6382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class AbortVoiceRequest extends Request {
6396cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
6402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        AbortVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback,
6426cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
6432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
6446cf397508eb7edef13baefad942a59b058ed450bJames Cook            mPrompt = prompt;
6452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the message informing the user of the problem, as per
6492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6516cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6526cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
6536cf397508eb7edef13baefad942a59b058ed450bJames Cook            return mPrompt;
6546cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
6556cf397508eb7edef13baefad942a59b058ed450bJames Cook
6566cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
6576cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the message informing the user of the problem, as per
6586cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6596cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message.
6606cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
6616cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public CharSequence getMessage() {
6636cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
6642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has finished aborting the voice operation, resulting
6682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
6692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult
6701b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * VoiceInteractor.AbortVoiceRequest.onAbortResult}.  This finishes the request (it
6711b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * is no longer active).
6722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendAbortResult(Bundle result) {
674593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
675593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
676593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
677593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
678593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverAbortVoiceResult(mInterface, result);
679593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
680593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
6812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
68257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
68357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
68457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
68557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
68657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
68757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
6882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
6892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
6912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A generic vendor-specific request, as per
6922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
6932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
6942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class CommandRequest extends Request {
6952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final String mCommand;
6962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        CommandRequest(String packageName, int uid, IVoiceInteractorCallback callback,
6982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractionSession session, String command, Bundle extras) {
6992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
7002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCommand = command;
7012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the command that is being executed, as per
7052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
7062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public String getCommand() {
7082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCommand;
7092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
711593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        void sendCommandResult(boolean finished, Bundle result) {
712593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
713593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
714593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
715593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (finished) {
716593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                    finishRequest();
717593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                }
718593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverCommandResult(mInterface, finished, result);
719593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
720593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
721593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        }
722593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn
7232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report an intermediate result of the request, without completing it (the request
7252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * is still active and the app is waiting for the final result), resulting in a call to
7262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult
7272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CommandRequest.onCommandResult} with false for isCompleted.
7282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendIntermediateResult(Bundle result) {
7302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendCommandResult(false, result);
7312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report the final result of the request, completing the request and resulting in a call to
7352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult
7362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted.
7371b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
7382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendResult(Bundle result) {
7402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendCommandResult(true, result);
74191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
74257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
74357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
74457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
74557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCommand=");
74657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mCommand);
74757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
74891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
74991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
75091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
7513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_PICK_OPTION = 2;
7523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMPLETE_VOICE = 3;
7533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_ABORT_VOICE = 4;
7543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMMAND = 5;
7553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_SUPPORTS_COMMANDS = 6;
7563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_CANCEL = 7;
75791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
758c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
759c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
760c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
761c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
762ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    static final int MSG_HANDLE_ASSIST = 104;
76327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HANDLE_SCREENSHOT = 105;
76427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_SHOW = 106;
76527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HIDE = 107;
76619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    static final int MSG_ON_LOCKSCREEN_SHOWN = 108;
767c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
768c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
76991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
77091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
771d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            SomeArgs args = null;
77291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
77391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
7742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + msg.obj);
7752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestConfirmation((ConfirmationRequest) msg.obj);
77691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
7773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                case MSG_START_PICK_OPTION:
7782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onPickOption: req=" + msg.obj);
7792ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestPickOption((PickOptionRequest) msg.obj);
7803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    break;
781d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                case MSG_START_COMPLETE_VOICE:
7822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + msg.obj);
7832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestCompleteVoice((CompleteVoiceRequest) msg.obj);
784d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    break;
785a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                case MSG_START_ABORT_VOICE:
7862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + msg.obj);
7872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestAbortVoice((AbortVoiceRequest) msg.obj);
788a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    break;
78991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
7902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + msg.obj);
7912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestCommand((CommandRequest) msg.obj);
79291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
79391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
7952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg1);
7962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    args.arg1 = onGetSupportedCommands((String[]) args.arg1);
797d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                    args.complete();
798d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                    args = null;
79991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
80091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
801ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj));
8022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onCancelRequest((Request) msg.obj);
80391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
804c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
805c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
806c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
807c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
816c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
820c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
821c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
822ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                case MSG_HANDLE_ASSIST:
82309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn                    args = (SomeArgs)msg.obj;
82409d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1
82509d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn                            + " structure=" + args.arg2 + " content=" + args.arg3);
826782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    doOnHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2,
827782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            (Throwable) args.arg3, (AssistContent) args.arg4);
828ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    break;
82927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                case MSG_HANDLE_SCREENSHOT:
83027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj);
83127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    onHandleScreenshot((Bitmap) msg.obj);
83227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    break;
833ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_SHOW:
834225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    args = (SomeArgs)msg.obj;
835225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1
836225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " flags=" + msg.arg1
837225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " showCallback=" + args.arg2);
838225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    doShow((Bundle) args.arg1, msg.arg1,
839225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            (IVoiceInteractionSessionShowCallback) args.arg2);
840ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
841ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_HIDE:
842ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doHide");
843ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    doHide();
844ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
84519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                case MSG_ON_LOCKSCREEN_SHOWN:
84619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    if (DEBUG) Log.d(TAG, "onLockscreenShown");
84719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    onLockscreenShown();
84819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    break;
84991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
850d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            if (args != null) {
851d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                args.recycle();
852d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            }
85391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
85491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
855c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
856c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
857c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
858c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
859c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
860c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
861c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
862c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
863c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
864c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
865c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
866c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
867c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
868e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
869c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
870c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
871c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
872c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
873c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
874c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
875e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
876c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
877c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
878c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
880c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
881c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
882c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
883c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
884c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
885c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
886c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
887c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
888c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
892c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
893c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
894c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
895c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
896c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
897c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
898c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
899c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
902c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
903c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
904c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
905c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
906c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
907c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
908c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
909c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
910c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
911c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
912c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
913c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
915c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
917e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
918e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
919c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
920c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
921c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
922c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
92391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
92491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
92591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
92691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
92791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
92891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
92991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
93091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
931c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
93291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
93391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
934d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    public Context getContext() {
935d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn        return mContext;
936d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    }
937d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn
9382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    void addRequest(Request req) {
9391b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        synchronized (this) {
9401b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            mActiveRequests.put(req.mInterface.asBinder(), req);
9411b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
9421b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn    }
9431b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn
9441b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn    boolean isRequestActive(IBinder reqInterface) {
9451b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        synchronized (this) {
9461b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            return mActiveRequests.containsKey(reqInterface);
9471b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
948a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
949a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
950a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request removeRequest(IBinder reqInterface) {
95191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
9528ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe            return mActiveRequests.remove(reqInterface);
95391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
95491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
95591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
956593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token) {
957c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
958c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
959593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        onCreate();
960c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
961c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
962225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi    void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) {
963ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
964ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
965ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
966ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mInShowWindow) {
967ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
968ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            return;
969ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
970ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
971ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
972ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = true;
973ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
974ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                if (!mWindowAdded) {
975ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    mWindowAdded = true;
976ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    View v = onCreateContentView();
977ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (v != null) {
978ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                        setContentView(v);
979ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    }
980ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                }
981ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
982ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onShow(args, flags);
983ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
984ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindowVisible = true;
985ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindow.show();
986ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
987225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            if (showCallback != null) {
988225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.invalidate();
989225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.getViewTreeObserver().addOnPreDrawListener(
990225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        new ViewTreeObserver.OnPreDrawListener() {
991225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            @Override
992225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            public boolean onPreDraw() {
993225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                mRootView.getViewTreeObserver().removeOnPreDrawListener(this);
994225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                try {
995225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    showCallback.onShown();
996225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                } catch (RemoteException e) {
997225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    Log.w(TAG, "Error calling onShown", e);
998225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                }
999225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                return true;
1000225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            }
1001225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        });
1002225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            }
1003ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } finally {
1004ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowWasVisible = true;
1005ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = false;
1006ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
1007ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1008ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1009ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    void doHide() {
1010ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mWindowVisible) {
1011ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindow.hide();
1012ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowVisible = false;
1013ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onHide();
1014ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
1015ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1016ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1017c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
10189a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn        onDestroy();
1019c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
1020c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
1021c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
1022c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
1023c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
1024c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
1025c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
1026c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
1027c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1028c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1029c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1030c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
1031c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
1032c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1033c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
1034c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
1035c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
1036c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
1037225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
1038225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
1039c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
1040c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
1041c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1042c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
1043c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1044c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
104569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    /**
10461de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * Equivalent to {@link VoiceInteractionService#setDisabledShowContext
10471de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionService.setDisabledShowContext(int)}.
10481de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     */
10491de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    public void setDisabledShowContext(int flags) {
10501de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        try {
10511de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            mSystemService.setDisabledShowContext(flags);
10521de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        } catch (RemoteException e) {
10531de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        }
10541de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    }
10551de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn
10561de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    /**
10571de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * Equivalent to {@link VoiceInteractionService#getDisabledShowContext
10581de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionService.getDisabledShowContext}.
10591de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     */
10601de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    public int getDisabledShowContext() {
10611de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        try {
10621de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            return mSystemService.getDisabledShowContext();
10631de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        } catch (RemoteException e) {
10641de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            return 0;
10651de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        }
10661de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    }
10671de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn
10681de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    /**
106917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * Return which show context flags have been disabled by the user through the system
107017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * settings UI, so the session will never get this data.  Returned flags are any combination of
107117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and
107217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT
107317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}.  Note that this only tells you about
107417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * global user settings, not about restrictions that may be applied contextual based on
107517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * the current application the user is in or other transient states.
107617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     */
107717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public int getUserDisabledShowContext() {
107817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        try {
107917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            return mSystemService.getUserDisabledShowContext();
108017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        } catch (RemoteException e) {
108117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            return 0;
108217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        }
108317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    }
108417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn
108517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    /**
108669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Show the UI for this session.  This asks the system to go through the process of showing
108769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * your UI, which will eventually culminate in {@link #onShow}.  This is similar to calling
108869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
108969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * @param args Arbitrary arguments that will be propagated {@link #onShow}.
109069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * @param flags Indicates additional optional behavior that should be performed.  May
10911de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * be any combination of
10921de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and
10931de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT
10941de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}
109569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * to request that the system generate and deliver assist data on the current foreground
109669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * app as part of showing the session UI.
109769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     */
109869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    public void show(Bundle args, int flags) {
109969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
110069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
110169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
1102ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
110369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            mSystemService.showSessionFromSession(mToken, args, flags);
1104ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
1105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1106ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
110869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    /**
110969c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Hide the session's UI, if currently shown.  Call this when you are done with your
111069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * user interaction.
111169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     */
1112ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void hide() {
111369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
111469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
111569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
1116c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1117ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.hideSessionFromSession(mToken);
1118ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
1119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
1123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
1124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
1125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
1126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
1127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
1128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
1129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
1130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
1131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
1133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1135a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Ask that a new activity be started for voice interaction.  This will create a
1137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * new dedicated task in the activity manager for this voice interaction session;
1138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK}
1139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * will be set for you to make it a new task.
1140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>The newly started activity will be displayed to the user in a special way, as
1142a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * a layer under the voice interaction UI.</p>
1143a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor}
1145a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * through which it can perform voice interactions through your session.  These requests
1146a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands},
11472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestConfirmation}, {@link #onRequestPickOption},
11482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice},
11492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * or {@link #onRequestCommand}
1150a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1151a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>You will receive a call to {@link #onTaskStarted} when the task starts up
1152a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * and {@link #onTaskFinished} when the last activity has finished.
1153a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1154a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The Intent to start this voice interaction.  The given Intent will
1155a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since
1156a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this is part of a voice interaction.
1157a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
1159c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
1160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
1161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1162c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1163e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
1164e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.prepareToLeaveProcess();
1165c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
1166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
1167c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
1168c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
1169c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1170c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1171c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1172a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
11733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Set whether this session will keep the device awake while it is running a voice
11743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * activity.  By default, the system holds a wake lock for it while in this state,
11753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * so that it can work even if the screen is off.  Setting this to false removes that
11763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * wake lock, allowing the CPU to go to sleep.  This is typically used if the
11773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * session decides it has been waiting too long for a response from the user and
11783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * doesn't want to let this continue to drain the battery.
11793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
11803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * <p>Passing false here will release the wake lock, and you can call later with
11813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * true to re-acquire it.  It will also be automatically re-acquired for you each
11823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * time you start a new voice activity task -- that is when you call
11833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link #startVoiceActivity}.</p>
11843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
11853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public void setKeepAwake(boolean keepAwake) {
118669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
118769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
118869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
11893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        try {
11903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mSystemService.setKeepAwake(mToken, keepAwake);
11913d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        } catch (RemoteException e) {
11923d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
11933d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    }
11943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
11953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
11964e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * Request that all system dialogs (and status bar shade etc) be closed, allowing
11974e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * access to the session's UI.  This will <em>not</em> cause the lock screen to be
11984e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * dismissed.
11994e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     */
12004e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    public void closeSystemDialogs() {
12014e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        if (mToken == null) {
12024e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
12034e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        }
12044e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        try {
12054e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn            mSystemService.closeSystemDialogs(mToken);
12064e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        } catch (RemoteException e) {
12074e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        }
12084e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    }
12094e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn
12104e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    /**
1211a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Convenience for inflating views.
1212a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1213c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
1214c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
1215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1216c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1217a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1218a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Retrieve the window being used to show the session's UI.
1219a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
1221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
1222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1224a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
122569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Finish the session.  This completely destroys the session -- the next time it is shown,
122669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * an entirely new one will be created.  You do not normally call this function; instead,
122769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * use {@link #hide} and allow the system to destroy your session if it needs its RAM.
1228a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
1230c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
1231c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
1232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
1235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
1236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
12392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
12402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Initiatize a new session.  At this point you don't know exactly what this
12412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * session will be used for; you will find that out in {@link #onShow}.
12422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
12432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onCreate() {
12442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        doOnCreate();
12452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
12462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
12472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    private void doOnCreate() {
1248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
1249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
1250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
1251c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
1252c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
1253e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
1254ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true);
1255225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        mWindow.getWindow().addFlags(
1256225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED |
12572f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
12582f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne                WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
1259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
1260ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
1261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
1262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1264a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1265ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called when the session UI is going to be shown.  This is called after
1266ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link #onCreateContentView} (if the session's content UI needed to be created) and
1267ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * immediately prior to the window being shown.  This may be called while the window
1268ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * is already shown, if a show request has come in while it is shown, to allow you to
1269ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * update the UI to match the new show arguments.
1270ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     *
1271ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * @param args The arguments that were supplied to
1272ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
1273ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * @param showFlags The show flags originally provided to
1274ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
1275ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     */
1276ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onShow(Bundle args, int showFlags) {
1277ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1278ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1279ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
1280ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called immediately after stopping to show the session UI.
1281ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
1282ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onHide() {
1283ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
1284ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
1285ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /**
1286a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Last callback to the session as it is being finished.
1287a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
1289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1292a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Hook in which to create the session's UI.
1293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
1295c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
1296c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
1299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
1300c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
1301c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
1302ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT));
130341607d5a2b8cc4a3fde4a2f75e33a00e8d957b1dAdam Powell        mContentFrame.requestApplyInsets();
1304c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1305c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1306782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    void doOnHandleAssist(Bundle data, AssistStructure structure, Throwable failure,
1307782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            AssistContent content) {
1308782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        if (failure != null) {
1309782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            onAssistStructureFailure(failure);
1310782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        }
1311782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        onHandleAssist(data, structure, content);
1312782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    }
1313782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn
1314782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1315782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called when there has been a failure transferring the {@link AssistStructure} to
1316782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * the assistant.  This may happen, for example, if the data is too large and results
1317782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * in an out of memory exception, or the client has provided corrupt data.  This will
1318782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * be called immediately before {@link #onHandleAssist} and the AssistStructure supplied
1319782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * there afterwards will be null.
1320782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     *
1321782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param failure The failure exception that was thrown when building the
1322782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link AssistStructure}.
1323782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
1324782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    public void onAssistStructureFailure(Throwable failure) {
1325782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    }
1326782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn
1327782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1328782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called to receive data from the application that the user was currently viewing when
132917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * an assist session is started.  If the original show request did not specify
133017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link #SHOW_WITH_ASSIST}, this method will not be called.
1331782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     *
1332782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param data Arbitrary data supplied by the app through
1333782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
133417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * May be null if assist data has been disabled by the user or device policy.
1335782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param structure If available, the structure definition of all windows currently
133617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * displayed by the app.  May be null if assist data has been disabled by the user
133717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * or device policy; will be an empty stub if the application has disabled assist
133817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * by marking its window as secure.
1339782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param content Additional content data supplied by the app through
1340782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}.
134117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * May be null if assist data has been disabled by the user or device policy; will
134217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * not be automatically filled in with data from the app if the app has marked its
134317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * window as secure.
1344782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
134517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public void onHandleAssist(@Nullable Bundle data, @Nullable AssistStructure structure,
134617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            @Nullable AssistContent content) {
134709d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn    }
134809d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn
1349782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1350782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called to receive a screenshot of what the user was currently viewing when an assist
135117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * session is started.  May be null if screenshots are disabled by the user, policy,
135217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * or application.  If the original show request did not specify
135317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link #SHOW_WITH_SCREENSHOT}, this method will not be called.
1354782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
135517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public void onHandleScreenshot(@Nullable Bitmap screenshot) {
135627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    }
135727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
1358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
1359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1360c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
1363c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
1367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1370c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
1371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1374d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    /**
1375d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * Called when the user presses the back button while focus is in the session UI.  Note
1376d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * that this will only happen if the session UI has requested input focus in its window;
1377d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * otherwise, the back key will go to whatever window has focus and do whatever behavior
137869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * it normally has there.  The default implementation simply calls {@link #hide}.
1379d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     */
1380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
1381ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
1382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1384a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1385a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Sessions automatically watch for requests that all system UI be closed (such as when
1386a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the user presses HOME), which will appear here.  The default implementation always
138769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * calls {@link #hide}.
1388a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
1390ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
139119695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    }
139219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi
139319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    /**
139419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi     * Called when the lockscreen was shown.
139519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi     */
139619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    public void onLockscreenShown() {
139719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        hide();
1398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
14001e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onConfigurationChanged(Configuration newConfig) {
14021e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14031e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
14041e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14051e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onLowMemory() {
14061e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14071e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
14081e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14091e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onTrimMemory(int level) {
14101e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14111e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
1412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
1413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
1414ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height
1415ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * of the window, meaning it should not adjust content underneath.  The default touchable
1416ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch
1417ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * events within its window frame.
1418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
1419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
1420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
1421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
1422e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
1423e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
1424ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.right = 0;
1425ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
1426ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.top = decor.getHeight();
1427c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
1428c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
1429c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1430c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1431a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1432a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)}
1433a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * has actually started.
1434a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1435a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
1436a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
1437a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the now running task.
1438a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
1440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1442a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1443a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the last activity of a task initiated by
1444a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)} has finished.  The default
1445a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * implementation calls {@link #finish()} on the assumption that this represents
1446a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the completion of a voice action.  You can override the implementation if you would
1447a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * like a different behavior.
1448a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1449a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
1450a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
1451a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the finished task.
1452a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
1454ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
1455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1457a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1458a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to query for what extended commands the session supports.
1459a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1460a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param commands An array of commands that are being queried.
1461a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @return Return an array of booleans indicating which of each entry in the
1462a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * command array is supported.  A true entry in the array indicates the command
1463a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * is supported; false indicates it is not.  The default implementation returns
1464a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * an array of all false entries.
1465a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
14662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public boolean[] onGetSupportedCommands(String[] commands) {
1467593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        return new boolean[commands.length];
1468a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
1469a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1470a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1471a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to confirm with the user before proceeding with an unrecoverable operation,
1472a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest
1473a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
1474a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1475a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1476a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
14772ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestConfirmation(ConfirmationRequest request) {
14782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
1479a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1480a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
14813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Request for the user to pick one of N options, corresponding to a
14823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
14833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
14843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param request The active request.
14853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
14862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestPickOption(PickOptionRequest request) {
14872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
14883d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
14893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
1490d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * Request to complete the voice interaction session because the voice activity successfully
1491d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * completed its interaction using voice.  Corresponds to
1492d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
1493d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.  The default implementation just sends an empty
1494d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * confirmation back to allow the activity to exit.
1495d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     *
1496d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param request The active request.
1497d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     */
14982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestCompleteVoice(CompleteVoiceRequest request) {
1499d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    }
1500d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
1501d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    /**
1502a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to abort the voice interaction session because the voice activity can not
1503a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * complete its interaction using voice.  Corresponds to
1504a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest
1505a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.AbortVoiceRequest}.  The default implementation just sends an empty
1506a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * confirmation back to allow the activity to exit.
1507a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1508a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1509a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestAbortVoice(AbortVoiceRequest request) {
1511a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
1512a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1513a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1514a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Process an arbitrary extended command from the caller,
1515a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.CommandRequest
1516a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.CommandRequest}.
1517a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1518a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1519a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestCommand(CommandRequest request) {
15212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
1522a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1523a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1524593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn     * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
15252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * that was previously delivered to {@link #onRequestConfirmation},
15262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice},
15272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * or {@link #onRequestCommand}.
1528a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1529a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The request that is being canceled.
1530a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onCancelRequest(Request request) {
15322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
153357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
153457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    /**
153557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * Print the Service's state into the given stream.  This gets invoked by
153657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * {@link VoiceInteractionSessionService} when its Service
153757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * {@link android.app.Service#dump} method is called.
153857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     *
153957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param prefix Text to print at the front of each line.
154057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
154157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
154257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * closed for you after you return.
154357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param args additional arguments to the dump request.
154457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     */
154557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
154657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mToken="); writer.println(mToken);
154757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme));
154857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mInitialized="); writer.println(mInitialized);
154957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded);
155057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(" mWindowVisible="); writer.println(mWindowVisible);
155157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible);
155257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(" mInShowWindow="); writer.println(mInShowWindow);
155357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        if (mActiveRequests.size() > 0) {
155457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.println("Active requests:");
155557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            String innerPrefix = prefix + "    ";
155657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            for (int i=0; i<mActiveRequests.size(); i++) {
155757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                Request req = mActiveRequests.valueAt(i);
155857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.print("  #"); writer.print(i);
155957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(": ");
156057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.println(req);
156157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                req.dump(innerPrefix, fd, writer, args);
156257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
156357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
156457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
156557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    }
156691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
1567