VoiceInteractionSession.java revision 1e38382b542f5cef9957a89692b02c55a3dd351c
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
195688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackbornimport android.app.AssistStructure;
20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
223d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor;
231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2;
2491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
25c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration;
27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray;
2827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap;
29e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect;
30c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region;
31c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap;
3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log;
40e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity;
41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent;
42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater;
43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View;
44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup;
45c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver;
46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout;
48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService;
49225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback;
5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback;
5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest;
5391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller;
5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs;
5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
56a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference;
57a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
58c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
60a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/**
614e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation
62ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer.  The user interface is
63ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()}
64ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built.
654e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn *
664e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish}
674e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done.  It can also initiate voice interactions with applications by calling
684e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>.
69a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */
701e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback,
711e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        ComponentCallbacks2 {
7291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
7391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final boolean DEBUG = true;
7491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
89c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
90c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
91c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
92c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
93c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
94c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
95c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
96c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
97c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
98c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
99c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
100a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    final WeakReference<VoiceInteractionSession> mWeakRef
101a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            = new WeakReference<VoiceInteractionSession>(this);
102a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
106a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) {
107a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION,
10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    prompt, extras));
11191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
11291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
11391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
11491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
1153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public IVoiceInteractorRequest startPickOption(String callingPackage,
1163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                IVoiceInteractorCallback callback, CharSequence prompt,
1173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
1183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            Request request = newRequest(callback);
1193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOO(MSG_START_PICK_OPTION,
1203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
1213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    prompt, options, extras));
1223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            return request.mInterface;
1233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
1243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
1253d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        @Override
126d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public IVoiceInteractorRequest startCompleteVoice(String callingPackage,
127d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
128d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            Request request = newRequest(callback);
129d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE,
130d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    new Caller(callingPackage, Binder.getCallingUid()), request,
131d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    message, extras));
132d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            return request.mInterface;
133d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
134d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
135d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        @Override
136a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public IVoiceInteractorRequest startAbortVoice(String callingPackage,
137a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
138a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
139a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE,
140a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
141a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    message, extras));
142a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return request.mInterface;
143a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
144a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
145a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        @Override
14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
148a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND,
15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    command, extras));
15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, new Caller(callingPackage, Binder.getCallingUid()), commands);
15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
16691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
16891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
170c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
171225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        public void show(Bundle sessionArgs, int flags,
172225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                IVoiceInteractionSessionShowCallback showCallback) {
173225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW,
174225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    flags, sessionArgs, showCallback));
175ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
176ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
177ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
178ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        public void hide() {
179ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE));
180ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
181ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
182ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
183ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        public void handleAssist(Bundle assistBundle) {
1845688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            // We want to pre-warm the AssistStructure before handing it off to the main
1855688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            // thread.  There is a strong argument to be made that it should be handed
1865688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            // through as a separate param rather than part of the assistBundle.
1875688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            if (assistBundle != null) {
1885688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                Bundle assistContext = assistBundle.getBundle(Intent.EXTRA_ASSIST_CONTEXT);
1895688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                if (assistContext != null) {
1905688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                    AssistStructure as = AssistStructure.getAssistStructure(assistContext);
1915688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                    if (as != null) {
1925688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                        as.ensureData();
1935688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                    }
1945688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn                }
1955688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            }
196ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_ASSIST,
197ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    assistBundle));
198ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        }
199ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
200ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        @Override
20127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        public void handleScreenshot(Bitmap screenshot) {
20227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT,
20327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    screenshot));
20427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        }
20527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
20627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        @Override
207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
208c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
211c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
212c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
213c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
214c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
216c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
219c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
22991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Request {
23091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
23191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
23291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                VoiceInteractionSession session = mSession.get();
234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (session != null) {
235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    session.mHandlerCaller.sendMessage(
236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                }
23891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
23991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
24091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
241a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        final WeakReference<VoiceInteractionSession> mSession;
242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
243a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) {
24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
245a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mSession = session.mWeakRef;
246a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
247a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
248a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        void finishRequest() {
249a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            VoiceInteractionSession session = mSession.get();
250a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (session == null) {
251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("VoiceInteractionSession has been destroyed");
252a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
253a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = session.removeRequest(mInterface.asBinder());
254a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (req == null) {
255a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Request not active: " + this);
256a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } else if (req != this) {
257a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Current active request " + req
258a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " not same as calling request " + this);
259a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
26091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
26191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
26291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendConfirmResult(boolean confirmed, Bundle result) {
26391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
26491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
26591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
266a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
26791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
26891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
26991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
27091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
2723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public void sendPickOptionResult(boolean finished,
2733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
2743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            try {
2753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
2763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                        + " finished=" + finished + " selections=" + selections
2773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                        + " result=" + result);
2783d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (finished) {
2793d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    finishRequest();
2803d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                }
2813d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
2823d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            } catch (RemoteException e) {
2833d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            }
2843d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
2853d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
286d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public void sendCompleteVoiceResult(Bundle result) {
287d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            try {
288d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
289d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                        + " result=" + result);
290d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                finishRequest();
291d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                mCallback.deliverCompleteVoiceResult(mInterface, result);
292d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            } catch (RemoteException e) {
293d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            }
294d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
295d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
296a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public void sendAbortVoiceResult(Bundle result) {
297a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            try {
298a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
299a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " result=" + result);
300a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
301a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                mCallback.deliverAbortVoiceResult(mInterface, result);
302a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } catch (RemoteException e) {
303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
304a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
3063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public void sendCommandResult(boolean finished, Bundle result) {
30791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
30991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " result=" + result);
3103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                if (finished) {
3113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    finishRequest();
3123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                }
3133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                mCallback.deliverCommandResult(mInterface, finished, result);
31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
31891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendCancelResult() {
31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
321a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
32391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
32791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
32891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Caller {
32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final String packageName;
33091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int uid;
33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
33291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        Caller(String _packageName, int _uid) {
33391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            packageName = _packageName;
33491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            uid = _uid;
33591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
33691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
33791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
33891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
3393d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_PICK_OPTION = 2;
3403d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMPLETE_VOICE = 3;
3413d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_ABORT_VOICE = 4;
3423d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMMAND = 5;
3433d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_SUPPORTS_COMMANDS = 6;
3443d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_CANCEL = 7;
34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
346c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
347c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
348c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
350ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    static final int MSG_HANDLE_ASSIST = 104;
35127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HANDLE_SCREENSHOT = 105;
35227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_SHOW = 106;
35327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HIDE = 107;
354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
35691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
35791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            SomeArgs args;
35991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
36091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
36291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface
36391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " prompt=" + args.arg3 + " extras=" + args.arg4);
364a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3,
36591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle)args.arg4);
36691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
3673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                case MSG_START_PICK_OPTION:
3683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    args = (SomeArgs)msg.obj;
3693d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    if (DEBUG) Log.d(TAG, "onPickOption: req=" + ((Request) args.arg2).mInterface
3703d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            + " prompt=" + args.arg3 + " options=" + args.arg4
3713d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            + " extras=" + args.arg5);
3723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    onPickOption((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3,
3733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            (VoiceInteractor.PickOptionRequest.Option[])args.arg4,
3743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                            (Bundle)args.arg5);
3753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    break;
376d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                case MSG_START_COMPLETE_VOICE:
377d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    args = (SomeArgs)msg.obj;
378d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface
379d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            + " message=" + args.arg3 + " extras=" + args.arg4);
380d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    onCompleteVoice((Caller) args.arg1, (Request) args.arg2,
381d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            (CharSequence) args.arg3, (Bundle) args.arg4);
382d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    break;
383a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                case MSG_START_ABORT_VOICE:
384a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    args = (SomeArgs)msg.obj;
385a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface
386a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            + " message=" + args.arg3 + " extras=" + args.arg4);
387a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3,
388a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            (Bundle) args.arg4);
389a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    break;
39091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
39291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface
39391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " command=" + args.arg3 + " extras=" + args.arg4);
39491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3,
39591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle) args.arg4);
39691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
39791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
39991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2);
40091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2);
40191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
40291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
403ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj));
404ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    onCancel((Request)msg.obj);
40591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
422c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
423c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
424ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                case MSG_HANDLE_ASSIST:
42527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleAssist: " + msg.obj);
426ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    onHandleAssist((Bundle) msg.obj);
427ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    break;
42827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                case MSG_HANDLE_SCREENSHOT:
42927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj);
43027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    onHandleScreenshot((Bitmap) msg.obj);
43127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    break;
432ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_SHOW:
433225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    args = (SomeArgs)msg.obj;
434225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1
435225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " flags=" + msg.arg1
436225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " showCallback=" + args.arg2);
437225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    doShow((Bundle) args.arg1, msg.arg1,
438225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            (IVoiceInteractionSessionShowCallback) args.arg2);
439ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
440ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_HIDE:
441ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doHide");
442ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    doHide();
443ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
44491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
44591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
44691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
460e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
467e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
509e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
510e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
512c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
513c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
514c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
51591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
51691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
51791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
51891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
51991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
52091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
52191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
52291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
52491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
52591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
526d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    public Context getContext() {
527d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn        return mContext;
528d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    }
529d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn
530a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request newRequest(IVoiceInteractorCallback callback) {
531a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        synchronized (this) {
532a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = new Request(callback, this);
533a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mActiveRequests.put(req.mInterface.asBinder(), req);
534a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return req;
535a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
536a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
537a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
538a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request removeRequest(IBinder reqInterface) {
53991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
5408ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe            return mActiveRequests.remove(reqInterface);
54191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
54291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
54391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
544ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args,
545ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            int startFlags) {
546c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
547c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
548ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        onCreate(args, startFlags);
549c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
550c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
551225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi    void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) {
552ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
553ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
554ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
555ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mInShowWindow) {
556ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
557ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            return;
558ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
559ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
560ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
561ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = true;
562ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
563ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                if (!mWindowAdded) {
564ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    mWindowAdded = true;
565ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    View v = onCreateContentView();
566ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (v != null) {
567ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                        setContentView(v);
568ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    }
569ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                }
570ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
571ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onShow(args, flags);
572ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
573ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindowVisible = true;
574ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindow.show();
575ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
576225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            if (showCallback != null) {
577225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.invalidate();
578225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.getViewTreeObserver().addOnPreDrawListener(
579225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        new ViewTreeObserver.OnPreDrawListener() {
580225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            @Override
581225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            public boolean onPreDraw() {
582225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                mRootView.getViewTreeObserver().removeOnPreDrawListener(this);
583225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                try {
584225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    showCallback.onShown();
585225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                } catch (RemoteException e) {
586225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    Log.w(TAG, "Error calling onShown", e);
587225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                }
588225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                return true;
589225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            }
590225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        });
591225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            }
592ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } finally {
593ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowWasVisible = true;
594ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = false;
595ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
596ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
597ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
598ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    void doHide() {
599ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mWindowVisible) {
600ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindow.hide();
601ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowVisible = false;
602ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onHide();
603ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
604ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
605ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
606c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
6079a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn        onDestroy();
608c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
609c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
610c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
611c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
612c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
614c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
615c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
616c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
617c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
619c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
620c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
621c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
623c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
624c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
626225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
627225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
628c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
629c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
630c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
631c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
632c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
633c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
634ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void show() {
635ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
636ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.showSessionFromSession(mToken, null, 0);
637ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
639ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
641ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void hide() {
642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
643ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.hideSessionFromSession(mToken);
644ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
648ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /** TODO: remove */
649ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void showWindow() {
650ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
651ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
652ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /** TODO: remove */
653c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void hideWindow() {
654c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
655c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
656c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
657c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
658c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
659c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
660c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
661c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
662c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
663c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
664c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
665c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
666c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
667c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
668c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
669a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
670a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Ask that a new activity be started for voice interaction.  This will create a
671a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * new dedicated task in the activity manager for this voice interaction session;
672a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK}
673a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * will be set for you to make it a new task.
674a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
675a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>The newly started activity will be displayed to the user in a special way, as
676a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * a layer under the voice interaction UI.</p>
677a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
678a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor}
679a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * through which it can perform voice interactions through your session.  These requests
680a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands},
681a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}.
682a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
683a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>You will receive a call to {@link #onTaskStarted} when the task starts up
684a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * and {@link #onTaskFinished} when the last activity has finished.
685a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
686a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The Intent to start this voice interaction.  The given Intent will
687a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since
688a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this is part of a voice interaction.
689a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
690c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
691c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
692c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
693c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
694c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
695e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
696e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.prepareToLeaveProcess();
697c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
698c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
699c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
700c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
701c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
702c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
703c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
704a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
7053d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Set whether this session will keep the device awake while it is running a voice
7063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * activity.  By default, the system holds a wake lock for it while in this state,
7073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * so that it can work even if the screen is off.  Setting this to false removes that
7083d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * wake lock, allowing the CPU to go to sleep.  This is typically used if the
7093d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * session decides it has been waiting too long for a response from the user and
7103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * doesn't want to let this continue to drain the battery.
7113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
7123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * <p>Passing false here will release the wake lock, and you can call later with
7133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * true to re-acquire it.  It will also be automatically re-acquired for you each
7143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * time you start a new voice activity task -- that is when you call
7153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link #startVoiceActivity}.</p>
7163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
7173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public void setKeepAwake(boolean keepAwake) {
7183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        try {
7193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mSystemService.setKeepAwake(mToken, keepAwake);
7203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        } catch (RemoteException e) {
7213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
7223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    }
7233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
7243d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
725a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Convenience for inflating views.
726a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
727c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
728c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
729c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
731a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
732a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Retrieve the window being used to show the session's UI.
733a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
734c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
735c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
736c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
737c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
738a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
739a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Finish the session.
740a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
741c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
742c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
743c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
744c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
745c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        hideWindow();
746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
749c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
750c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
751c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
752ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /** @hide */
753c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCreate(Bundle args) {
754c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
755c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
756c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
757c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
758c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
759e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
760ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true);
761225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        mWindow.getWindow().addFlags(
762225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED |
763225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
764c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
765ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
766c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
767c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
768c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
769a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
770ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Initiatize a new session.  The given args and showFlags are the initial values
771ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * passed to {@link VoiceInteractionService#showSession VoiceInteractionService.showSession},
772ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * if possible.  Normally you should handle these in {@link #onShow}.
773ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
774ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onCreate(Bundle args, int showFlags) {
775ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        onCreate(args);
776ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
777ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
778ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
779ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called when the session UI is going to be shown.  This is called after
780ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link #onCreateContentView} (if the session's content UI needed to be created) and
781ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * immediately prior to the window being shown.  This may be called while the window
782ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * is already shown, if a show request has come in while it is shown, to allow you to
783ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * update the UI to match the new show arguments.
784ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     *
785ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * @param args The arguments that were supplied to
786ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
787ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * @param showFlags The show flags originally provided to
788ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
789ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     */
790ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onShow(Bundle args, int showFlags) {
791ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
792ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
793ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
794ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called immediately after stopping to show the session UI.
795ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
796ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onHide() {
797ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
798ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
799ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /**
800a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Last callback to the session as it is being finished.
801a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
802c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
803c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
804c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
805a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
806a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Hook in which to create the session's UI.
807a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
808c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
809c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
810c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
811c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
812c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
813c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
815c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
816ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT));
817c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
818c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
819c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
820ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    public void onHandleAssist(Bundle assistBundle) {
821ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
822ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
82327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    public void onHandleScreenshot(Bitmap screenshot) {
82427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    }
82527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
826c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
827c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
828c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
829c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
830c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
832c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
837c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
838c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
839c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
840c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
842d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    /**
843d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * Called when the user presses the back button while focus is in the session UI.  Note
844d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * that this will only happen if the session UI has requested input focus in its window;
845d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * otherwise, the back key will go to whatever window has focus and do whatever behavior
846d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * it normally has there.
847d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     */
848c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
849ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
850c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
851c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
852a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
853a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Sessions automatically watch for requests that all system UI be closed (such as when
854a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the user presses HOME), which will appear here.  The default implementation always
855a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * calls {@link #finish}.
856a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
857c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
858ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
859c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
860c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
8611e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
8621e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onConfigurationChanged(Configuration newConfig) {
8631e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
8641e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
8651e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
8661e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onLowMemory() {
8671e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
8681e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
8691e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
8701e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onTrimMemory(int level) {
8711e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
8721e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
873c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
874c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
875ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height
876ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * of the window, meaning it should not adjust content underneath.  The default touchable
877ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch
878ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * events within its window frame.
879c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
880c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
881c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
882c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
883e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
884e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
885ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.right = 0;
886ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
887ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.top = decor.getHeight();
888c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
892a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
893a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)}
894a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * has actually started.
895a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
896a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
897a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
898a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the now running task.
899a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
902c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
903a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
904a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the last activity of a task initiated by
905a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)} has finished.  The default
906a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * implementation calls {@link #finish()} on the assumption that this represents
907a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the completion of a voice action.  You can override the implementation if you would
908a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * like a different behavior.
909a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
910a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
911a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
912a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the finished task.
913a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
915ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
917c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
918a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
919a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to query for what extended commands the session supports.
920a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
921a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
922a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param commands An array of commands that are being queried.
923a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @return Return an array of booleans indicating which of each entry in the
924a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * command array is supported.  A true entry in the array indicates the command
925a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * is supported; false indicates it is not.  The default implementation returns
926a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * an array of all false entries.
927a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
928a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public boolean[] onGetSupportedCommands(Caller caller, String[] commands) {
929a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        return new boolean[commands.length];
930a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
931a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
932a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
933a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to confirm with the user before proceeding with an unrecoverable operation,
934a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest
935a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
936a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
937a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
938a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
939a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param prompt The prompt informing the user of what will happen, as per
940a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
941a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
942a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
943a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
944a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public abstract void onConfirm(Caller caller, Request request, CharSequence prompt,
945a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Bundle extras);
946a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
947a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
9483d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Request for the user to pick one of N options, corresponding to a
9493d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9503d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
9513d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param caller Who is making the request.
9523d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param request The active request.
9533d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param prompt The prompt informing the user of what they are picking, as per
9543d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param options The set of options the user is picking from, as per
9563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param extras Any additional information, as per
9583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
9593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
9603d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public abstract void onPickOption(Caller caller, Request request, CharSequence prompt,
9613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras);
9623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
9633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
964d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * Request to complete the voice interaction session because the voice activity successfully
965d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * completed its interaction using voice.  Corresponds to
966d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
967d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.  The default implementation just sends an empty
968d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * confirmation back to allow the activity to exit.
969d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     *
970d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param caller Who is making the request.
971d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param request The active request.
972d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param message The message informing the user of the problem, as per
973d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
974d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
975d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param extras Any additional information, as per
976d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
977d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
978d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     */
979d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    public void onCompleteVoice(Caller caller, Request request, CharSequence message,
980d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James           Bundle extras) {
981d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        request.sendCompleteVoiceResult(null);
982d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    }
983d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
984d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    /**
985a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to abort the voice interaction session because the voice activity can not
986a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * complete its interaction using voice.  Corresponds to
987a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest
988a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.AbortVoiceRequest}.  The default implementation just sends an empty
989a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * confirmation back to allow the activity to exit.
990a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
991a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
992a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
993a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param message The message informing the user of the problem, as per
994a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
995a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
996a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
997a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
998a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
999a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        request.sendAbortVoiceResult(null);
1000a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
1001a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1002a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1003a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Process an arbitrary extended command from the caller,
1004a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.CommandRequest
1005a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.CommandRequest}.
1006a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1007a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
1008a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1009a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param command The command that is being executed, as per
1010a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
1011a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
1012a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
1013a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
101491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCommand(Caller caller, Request request, String command, Bundle extras);
1015a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1016a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1017a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
1018a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * that was previously delivered to {@link #onConfirm} or {@link #onCommand}.
1019a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1020a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The request that is being canceled.
1021a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
102291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCancel(Request request);
102391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
1024