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