VoiceInteractionSession.java revision 225d3b5449d29b43e619d8538d024305f6e81ba9
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/**
291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project
391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License.
691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at
791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and
1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License.
1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */
1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice;
1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
19c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
213d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor;
2291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
24c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray;
2527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap;
26e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect;
27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region;
28c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow;
2991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder;
3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle;
3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log;
37e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity;
38c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent;
39c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater;
40c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View;
41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup;
42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver;
43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout;
45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService;
46225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback;
4791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
4891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback;
4991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest;
5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller;
5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs;
5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
53a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference;
54a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
55c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
56c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
57a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/**
584e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation
59ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer.  The user interface is
60ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()}
61ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built.
624e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn *
634e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish}
644e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done.  It can also initiate voice interactions with applications by calling
654e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>.
66a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */
67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback {
6891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
6991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final boolean DEBUG = true;
7091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
89c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
90c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
91c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
92c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
93c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
94c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
95c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
96a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    final WeakReference<VoiceInteractionSession> mWeakRef
97a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            = new WeakReference<VoiceInteractionSession>(this);
98a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
102a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) {
103a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION,
10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
10691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    prompt, extras));
10791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
1113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public IVoiceInteractorRequest startPickOption(String callingPackage,
1123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                IVoiceInteractorCallback callback, CharSequence prompt,
1133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
1143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            Request request = newRequest(callback);
1153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOO(MSG_START_PICK_OPTION,
1163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
1173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    prompt, options, extras));
1183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            return request.mInterface;
1193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
1203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
1213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        @Override
122d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public IVoiceInteractorRequest startCompleteVoice(String callingPackage,
123d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
124d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            Request request = newRequest(callback);
125d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE,
126d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    new Caller(callingPackage, Binder.getCallingUid()), request,
127d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    message, extras));
128d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            return request.mInterface;
129d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
130d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
131d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        @Override
132a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public IVoiceInteractorRequest startAbortVoice(String callingPackage,
133a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
134a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
135a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE,
136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    message, extras));
138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return request.mInterface;
139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        @Override
14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND,
14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    command, extras));
14891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, new Caller(callingPackage, Binder.getCallingUid()), commands);
15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
167225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        public void show(Bundle sessionArgs, int flags,
168225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                IVoiceInteractionSessionShowCallback showCallback) {
169225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW,
170225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    flags, sessionArgs, showCallback));
171ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
172ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
173ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
174ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        public void hide() {
175ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE));
176ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
177ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
178ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
179ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        public void handleAssist(Bundle assistBundle) {
180ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_ASSIST,
181ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    assistBundle));
182ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        }
183ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
184ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        @Override
18527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        public void handleScreenshot(Bitmap screenshot) {
18627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT,
18727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    screenshot));
18827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        }
18927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
19027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        @Override
191c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
192c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
193c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
194c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
195c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
196c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
197c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
198c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
200c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
202c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
204c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
205c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
206c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
208c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Request {
21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
217a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                VoiceInteractionSession session = mSession.get();
218a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (session != null) {
219a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    session.mHandlerCaller.sendMessage(
220a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
221a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                }
22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
22491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
225a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        final WeakReference<VoiceInteractionSession> mSession;
226a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
227a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) {
22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
229a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mSession = session.mWeakRef;
230a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
231a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
232a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        void finishRequest() {
233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            VoiceInteractionSession session = mSession.get();
234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (session == null) {
235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("VoiceInteractionSession has been destroyed");
236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = session.removeRequest(mInterface.asBinder());
238a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (req == null) {
239a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Request not active: " + this);
240a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } else if (req != this) {
241a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Current active request " + req
242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " not same as calling request " + this);
243a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
24591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendConfirmResult(boolean confirmed, Bundle result) {
24791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
24891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
24991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
25591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
2563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public void sendPickOptionResult(boolean finished,
2573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
2583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            try {
2593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
2603d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                        + " finished=" + finished + " selections=" + selections
2613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                        + " result=" + result);
2623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (finished) {
2633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    finishRequest();
2643d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                }
2653d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
2663d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            } catch (RemoteException e) {
2673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            }
2683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
2693d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
270d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public void sendCompleteVoiceResult(Bundle result) {
271d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            try {
272d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
273d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                        + " result=" + result);
274d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                finishRequest();
275d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                mCallback.deliverCompleteVoiceResult(mInterface, result);
276d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            } catch (RemoteException e) {
277d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            }
278d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
279d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
280a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public void sendAbortVoiceResult(Bundle result) {
281a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            try {
282a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
283a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " result=" + result);
284a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
285a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                mCallback.deliverAbortVoiceResult(mInterface, result);
286a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } catch (RemoteException e) {
287a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
288a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
289a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
2903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public void sendCommandResult(boolean finished, Bundle result) {
29191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
29391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " result=" + result);
2943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (finished) {
2953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    finishRequest();
2963d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                }
2973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                mCallback.deliverCommandResult(mInterface, finished, result);
29891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
29991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
30291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendCancelResult() {
30391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
30491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
30691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
30791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
30991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
31091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
31191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Caller {
31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final String packageName;
31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int uid;
31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        Caller(String _packageName, int _uid) {
31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            packageName = _packageName;
31891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            uid = _uid;
31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
32191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
3233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_PICK_OPTION = 2;
3243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMPLETE_VOICE = 3;
3253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_ABORT_VOICE = 4;
3263d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMMAND = 5;
3273d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_SUPPORTS_COMMANDS = 6;
3283d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_CANCEL = 7;
32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
331c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
332c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
333c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
334ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    static final int MSG_HANDLE_ASSIST = 104;
33527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HANDLE_SCREENSHOT = 105;
33627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_SHOW = 106;
33727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HIDE = 107;
338c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
339c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
34091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
34191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
342c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            SomeArgs args;
34391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
34491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
345c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface
34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " prompt=" + args.arg3 + " extras=" + args.arg4);
348a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3,
34991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle)args.arg4);
35091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
3513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                case MSG_START_PICK_OPTION:
3523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    args = (SomeArgs)msg.obj;
3533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    if (DEBUG) Log.d(TAG, "onPickOption: req=" + ((Request) args.arg2).mInterface
3543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            + " prompt=" + args.arg3 + " options=" + args.arg4
3553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            + " extras=" + args.arg5);
3563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    onPickOption((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3,
3573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            (VoiceInteractor.PickOptionRequest.Option[])args.arg4,
3583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            (Bundle)args.arg5);
3593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    break;
360d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                case MSG_START_COMPLETE_VOICE:
361d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    args = (SomeArgs)msg.obj;
362d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface
363d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            + " message=" + args.arg3 + " extras=" + args.arg4);
364d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    onCompleteVoice((Caller) args.arg1, (Request) args.arg2,
365d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            (CharSequence) args.arg3, (Bundle) args.arg4);
366d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    break;
367a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                case MSG_START_ABORT_VOICE:
368a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    args = (SomeArgs)msg.obj;
369a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface
370a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            + " message=" + args.arg3 + " extras=" + args.arg4);
371a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3,
372a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            (Bundle) args.arg4);
373a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    break;
37491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
37691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface
37791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " command=" + args.arg3 + " extras=" + args.arg4);
37891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3,
37991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle) args.arg4);
38091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
38191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
38391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2);
38491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2);
38591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
38691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
387ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj));
388ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    onCancel((Request)msg.obj);
38991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
408ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                case MSG_HANDLE_ASSIST:
40927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleAssist: " + msg.obj);
410ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    onHandleAssist((Bundle) msg.obj);
411ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    break;
41227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                case MSG_HANDLE_SCREENSHOT:
41327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj);
41427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    onHandleScreenshot((Bitmap) msg.obj);
41527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    break;
416ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_SHOW:
417225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    args = (SomeArgs)msg.obj;
418225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1
419225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " flags=" + msg.arg1
420225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " showCallback=" + args.arg2);
421225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    doShow((Bundle) args.arg1, msg.arg1,
422225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            (IVoiceInteractionSessionShowCallback) args.arg2);
423ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
424ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_HIDE:
425ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doHide");
426ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    doHide();
427ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
42891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
42991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
43091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
431c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
432c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
433c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
434c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
435c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
436c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
437c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
438c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
442c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
443c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
444e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
445c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
446c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
451e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
493e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
494e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
49991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
50091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
50191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
50291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
50391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
50491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
50591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
50691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
50891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
50991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
510a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request newRequest(IVoiceInteractorCallback callback) {
511a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        synchronized (this) {
512a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = new Request(callback, this);
513a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mActiveRequests.put(req.mInterface.asBinder(), req);
514a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return req;
515a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
516a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
517a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
518a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request removeRequest(IBinder reqInterface) {
51991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
5208ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe            return mActiveRequests.remove(reqInterface);
52191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
52291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
52391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
524ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args,
525ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            int startFlags) {
526c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
527c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
528ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        onCreate(args, startFlags);
529c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
530c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
531225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi    void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) {
532ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
533ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
534ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
535ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mInShowWindow) {
536ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
537ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            return;
538ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
539ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
540ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
541ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = true;
542ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
543ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                if (!mWindowAdded) {
544ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    mWindowAdded = true;
545ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    View v = onCreateContentView();
546ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (v != null) {
547ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                        setContentView(v);
548ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    }
549ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                }
550ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
551ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onShow(args, flags);
552ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
553ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindowVisible = true;
554ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindow.show();
555ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
556225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            if (showCallback != null) {
557225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.invalidate();
558225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.getViewTreeObserver().addOnPreDrawListener(
559225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        new ViewTreeObserver.OnPreDrawListener() {
560225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            @Override
561225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            public boolean onPreDraw() {
562225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                mRootView.getViewTreeObserver().removeOnPreDrawListener(this);
563225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                try {
564225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    showCallback.onShown();
565225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                } catch (RemoteException e) {
566225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    Log.w(TAG, "Error calling onShown", e);
567225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                }
568225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                return true;
569225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            }
570225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        });
571225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            }
572ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } finally {
573ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowWasVisible = true;
574ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = false;
575ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
576ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
577ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
578ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    void doHide() {
579ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mWindowVisible) {
580ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindow.hide();
581ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowVisible = false;
582ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onHide();
583ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
584ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
585ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
586c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
5879a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn        onDestroy();
588c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
589c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
590c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
591c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
592c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
593c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
594c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
595c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
596c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
597c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
598c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
599c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
600c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
601c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
602c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
603c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
604c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
605c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
606225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
607225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
608c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
609c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
610c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
611c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
612c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
614ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void show() {
615ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
616ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.showSessionFromSession(mToken, null, 0);
617ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
619ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
620c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
621ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void hide() {
622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
623ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.hideSessionFromSession(mToken);
624ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
626c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
627c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
628ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /** TODO: remove */
629ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void showWindow() {
630ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
631ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
632ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /** TODO: remove */
633c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void hideWindow() {
634c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
635c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
636c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
637c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
639c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
641c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
643c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
644c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
648c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
649a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
650a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Ask that a new activity be started for voice interaction.  This will create a
651a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * new dedicated task in the activity manager for this voice interaction session;
652a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK}
653a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * will be set for you to make it a new task.
654a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
655a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>The newly started activity will be displayed to the user in a special way, as
656a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * a layer under the voice interaction UI.</p>
657a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
658a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor}
659a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * through which it can perform voice interactions through your session.  These requests
660a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands},
661a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}.
662a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
663a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>You will receive a call to {@link #onTaskStarted} when the task starts up
664a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * and {@link #onTaskFinished} when the last activity has finished.
665a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
666a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The Intent to start this voice interaction.  The given Intent will
667a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since
668a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this is part of a voice interaction.
669a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
670c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
671c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
672c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
673c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
674c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
675e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
676e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.prepareToLeaveProcess();
677c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
678c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
679c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
680c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
681c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
682c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
683c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
684a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
6853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Set whether this session will keep the device awake while it is running a voice
6863d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * activity.  By default, the system holds a wake lock for it while in this state,
6873d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * so that it can work even if the screen is off.  Setting this to false removes that
6883d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * wake lock, allowing the CPU to go to sleep.  This is typically used if the
6893d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * session decides it has been waiting too long for a response from the user and
6903d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * doesn't want to let this continue to drain the battery.
6913d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
6923d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * <p>Passing false here will release the wake lock, and you can call later with
6933d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * true to re-acquire it.  It will also be automatically re-acquired for you each
6943d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * time you start a new voice activity task -- that is when you call
6953d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link #startVoiceActivity}.</p>
6963d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
6973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public void setKeepAwake(boolean keepAwake) {
6983d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        try {
6993d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mSystemService.setKeepAwake(mToken, keepAwake);
7003d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        } catch (RemoteException e) {
7013d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
7023d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    }
7033d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
7043d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
705a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Convenience for inflating views.
706a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
707c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
708c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
709c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
710c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
711a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
712a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Retrieve the window being used to show the session's UI.
713a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
714c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
715c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
716c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
717c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
718a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
719a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Finish the session.
720a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
721c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
722c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
723c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
724c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
725c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        hideWindow();
726c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
727c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
728c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
729c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
731c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
732ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /** @hide */
733c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCreate(Bundle args) {
734c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
735c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
736c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
737c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
738c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
739e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
740ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true);
741225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        mWindow.getWindow().addFlags(
742225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED |
743225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
744c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
745ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
749a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
750ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Initiatize a new session.  The given args and showFlags are the initial values
751ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * passed to {@link VoiceInteractionService#showSession VoiceInteractionService.showSession},
752ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * if possible.  Normally you should handle these in {@link #onShow}.
753ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
754ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onCreate(Bundle args, int showFlags) {
755ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        onCreate(args);
756ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
757ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
758ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
759ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called when the session UI is going to be shown.  This is called after
760ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link #onCreateContentView} (if the session's content UI needed to be created) and
761ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * immediately prior to the window being shown.  This may be called while the window
762ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * is already shown, if a show request has come in while it is shown, to allow you to
763ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * update the UI to match the new show arguments.
764ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     *
765ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * @param args The arguments that were supplied to
766ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
767ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * @param showFlags The show flags originally provided to
768ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
769ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     */
770ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onShow(Bundle args, int showFlags) {
771ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
772ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
773ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
774ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called immediately after stopping to show the session UI.
775ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
776ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onHide() {
777ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
778ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
779ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /**
780a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Last callback to the session as it is being finished.
781a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
782c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
783c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
784c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
785a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
786a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Hook in which to create the session's UI.
787a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
788c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
789c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
790c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
791c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
792c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
793c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
794c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
795c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
796ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT));
797c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
798c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
799c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
800ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    public void onHandleAssist(Bundle assistBundle) {
801ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
802ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
80327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    public void onHandleScreenshot(Bitmap screenshot) {
80427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    }
80527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
806c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
807c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
816c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
820c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
821c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
822c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
823ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
824c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
825c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
826a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
827a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Sessions automatically watch for requests that all system UI be closed (such as when
828a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the user presses HOME), which will appear here.  The default implementation always
829a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * calls {@link #finish}.
830a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
832ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
837ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height
838ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * of the window, meaning it should not adjust content underneath.  The default touchable
839ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch
840ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * events within its window frame.
841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
842c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
843c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
844c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
845e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
846e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
847ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.right = 0;
848ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
849ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.top = decor.getHeight();
850c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
851c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
852c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
853c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
854a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
855a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)}
856a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * has actually started.
857a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
858a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
859a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
860a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the now running task.
861a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
862c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
863c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
864c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
865a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
866a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the last activity of a task initiated by
867a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)} has finished.  The default
868a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * implementation calls {@link #finish()} on the assumption that this represents
869a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the completion of a voice action.  You can override the implementation if you would
870a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * like a different behavior.
871a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
872a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
873a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
874a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the finished task.
875a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
876c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
877ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
878c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
880a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
881a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to query for what extended commands the session supports.
882a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
883a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
884a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param commands An array of commands that are being queried.
885a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @return Return an array of booleans indicating which of each entry in the
886a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * command array is supported.  A true entry in the array indicates the command
887a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * is supported; false indicates it is not.  The default implementation returns
888a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * an array of all false entries.
889a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
890a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public boolean[] onGetSupportedCommands(Caller caller, String[] commands) {
891a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        return new boolean[commands.length];
892a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
893a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
894a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
895a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to confirm with the user before proceeding with an unrecoverable operation,
896a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest
897a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
898a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
899a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
900a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
901a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param prompt The prompt informing the user of what will happen, as per
902a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
903a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
904a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
905a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
906a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public abstract void onConfirm(Caller caller, Request request, CharSequence prompt,
907a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Bundle extras);
908a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
909a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
9103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Request for the user to pick one of N options, corresponding to a
9113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
9133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param caller Who is making the request.
9143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param request The active request.
9153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param prompt The prompt informing the user of what they are picking, as per
9163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param options The set of options the user is picking from, as per
9183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param extras Any additional information, as per
9203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
9223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public abstract void onPickOption(Caller caller, Request request, CharSequence prompt,
9233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras);
9243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
9253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
926d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * Request to complete the voice interaction session because the voice activity successfully
927d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * completed its interaction using voice.  Corresponds to
928d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
929d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.  The default implementation just sends an empty
930d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * confirmation back to allow the activity to exit.
931d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     *
932d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param caller Who is making the request.
933d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param request The active request.
934d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param message The message informing the user of the problem, as per
935d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
936d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
937d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param extras Any additional information, as per
938d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
939d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
940d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     */
941d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    public void onCompleteVoice(Caller caller, Request request, CharSequence message,
942d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James           Bundle extras) {
943d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        request.sendCompleteVoiceResult(null);
944d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    }
945d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
946d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    /**
947a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to abort the voice interaction session because the voice activity can not
948a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * complete its interaction using voice.  Corresponds to
949a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest
950a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.AbortVoiceRequest}.  The default implementation just sends an empty
951a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * confirmation back to allow the activity to exit.
952a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
953a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
954a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
955a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param message The message informing the user of the problem, as per
956a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
957a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
958a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
959a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
960a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
961a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        request.sendAbortVoiceResult(null);
962a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
963a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
964a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
965a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Process an arbitrary extended command from the caller,
966a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.CommandRequest
967a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.CommandRequest}.
968a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
969a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
970a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
971a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param command The command that is being executed, as per
972a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
973a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
974a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
975a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
97691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCommand(Caller caller, Request request, String command, Bundle extras);
977a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
978a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
979a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
980a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * that was previously delivered to {@link #onConfirm} or {@link #onCommand}.
981a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
982a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The request that is being canceled.
983a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
98491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCancel(Request request);
98591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
986