VoiceInteractionSession.java revision e8222e551f8abd2d82ca4f77ddb275e2e509751e
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/**
291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project
391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License.
691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at
791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and
1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License.
1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */
1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice;
1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
196cf397508eb7edef13baefad942a59b058ed450bJames Cookimport android.annotation.Nullable;
200af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasaniimport android.app.Activity;
21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
22c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
233d07c94c393831091958fe6a98811843db8973bdDianne Hackbornimport android.app.VoiceInteractor;
2469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistContent;
2569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackbornimport android.app.assist.AssistStructure;
261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.ComponentCallbacks2;
2791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
28c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration;
30c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray;
3127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackbornimport android.graphics.Bitmap;
32e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect;
33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region;
34c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message;
4091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
4157dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.os.UserHandle;
4291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap;
4357dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport android.util.DebugUtils;
4491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log;
45e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity;
46c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent;
47c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater;
48c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View;
49c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup;
50c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver;
51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout;
530af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani
54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService;
55225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback;
5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback;
5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest;
5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller;
6091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs;
6191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
6257dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.FileDescriptor;
6357dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.PrintWriter;
64a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference;
65a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
68a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/**
694e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * An active voice interaction session, providing a facility for the implementation
70ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * to interact with the user in the voice interaction layer.  The user interface is
71ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * initially shown by default, and can be created be overriding {@link #onCreateContentView()}
72ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn * in which the UI can be built.
734e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn *
744e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * <p>A voice interaction session can be self-contained, ultimately calling {@link #finish}
754e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * when done.  It can also initiate voice interactions with applications by calling
764e106cedfecd1f6026a79870c2e427853cba7491Dianne Hackborn * {@link #startVoiceActivity}</p>.
77a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */
782ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornpublic class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 {
7991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
80e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    static final boolean DEBUG = false;
8191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag received in {@link #onShow}: originator requested that the session be started with
842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * assist data from the currently focused activity.
852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_WITH_ASSIST = 1<<0;
872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag received in {@link #onShow}: originator requested that the session be started with
902ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * a screen shot of the currently focused activity.
912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_WITH_SCREENSHOT = 1<<1;
932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Flag for use with {@link #onShow}: indicates that the session has been started from the
962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * system assist gesture.
972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final int SHOW_SOURCE_ASSIST_GESTURE = 1<<2;
992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
10017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    /**
10117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * Flag for use with {@link #onShow}: indicates that the application itself has invoked
10217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * the assistant.
10317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     */
10417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public static final int SHOW_SOURCE_APPLICATION = 1<<3;
10517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn
1060af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani    /**
1070af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani     * Flag for use with {@link #onShow}: indicates that an Activity has invoked the voice
1080af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani     * interaction service for a local interaction using
1090af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani     * {@link Activity#startLocalVoiceInteraction(Bundle)}.
1100af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani     */
1110af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani    public static final int SHOW_SOURCE_ACTIVITY = 1<<4;
1120af6fa7015cd9da08bf52c1efb13641d30fd6bd7Amith Yamasani
113e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    // Keys for Bundle values
114e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    /** @hide */
115e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    public static final String KEY_DATA = "data";
116e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    /** @hide */
117e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    public static final String KEY_STRUCTURE = "structure";
118e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    /** @hide */
119e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    public static final String KEY_CONTENT = "content";
120e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    /** @hide */
121e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    public static final String KEY_RECEIVER_EXTRAS = "receiverExtras";
122e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani
123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
135c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
136c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
137c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
138c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
139c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
140c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
141c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
142c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
143c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
144c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
145c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
146c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
147c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
148a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    final WeakReference<VoiceInteractionSession> mWeakRef
149a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            = new WeakReference<VoiceInteractionSession>(this);
150a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
1546cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt, Bundle extras) {
1552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            ConfirmationRequest request = new ConfirmationRequest(callingPackage,
1562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    prompt, extras);
1582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_CONFIRMATION,
1602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
1653d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        public IVoiceInteractorRequest startPickOption(String callingPackage,
1666cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt prompt,
1673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
1682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            PickOptionRequest request = new PickOptionRequest(callingPackage,
1692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    prompt, options, extras);
1712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_PICK_OPTION,
1732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
1743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            return request.mInterface;
1753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
1763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
1773d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        @Override
178d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public IVoiceInteractorRequest startCompleteVoice(String callingPackage,
1796cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) {
1802ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            CompleteVoiceRequest request = new CompleteVoiceRequest(callingPackage,
1812ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    message, extras);
1832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMPLETE_VOICE,
1852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
186d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            return request.mInterface;
187d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
188d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
189d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        @Override
190a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public IVoiceInteractorRequest startAbortVoice(String callingPackage,
1916cf397508eb7edef13baefad942a59b058ed450bJames Cook                IVoiceInteractorCallback callback, VoiceInteractor.Prompt message, Bundle extras) {
1922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            AbortVoiceRequest request = new AbortVoiceRequest(callingPackage,
1932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
1942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    message, extras);
1952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            addRequest(request);
1962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_ABORT_VOICE,
1972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
198a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return request.mInterface;
199a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
200a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
201a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        @Override
20291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
20391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
2042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            CommandRequest request = new CommandRequest(callingPackage,
2052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    Binder.getCallingUid(), callback, VoiceInteractionSession.this,
2062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    command, extras);
207593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            addRequest(request);
2082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND,
2092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    request));
21091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
2162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    0, commands, null);
21791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
21891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
21991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
22091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
22191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
22491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
22591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
228c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
229225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        public void show(Bundle sessionArgs, int flags,
230225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                IVoiceInteractionSessionShowCallback showCallback) {
231225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_SHOW,
232225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    flags, sessionArgs, showCallback));
233ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
234ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
235ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
236ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        public void hide() {
237ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_HIDE));
238ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
239ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
240ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        @Override
241782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        public void handleAssist(final Bundle data, final AssistStructure structure,
242e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                final AssistContent content, final int index, final int count) {
2435688b03f7f4fafd671451ff73103be0f2388b32eDianne Hackborn            // We want to pre-warm the AssistStructure before handing it off to the main
244782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // thread.  We also want to do this on a separate thread, so that if the app
245782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // is for some reason slow (due to slow filling in of async children in the
246782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // structure), we don't block other incoming IPCs (such as the screenshot) to
247782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            // us (since we are a oneway interface, they get serialized).  (Okay?)
248782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            Thread retriever = new Thread("AssistStructure retriever") {
249782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                @Override
250782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                public void run() {
251782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    Throwable failure = null;
252782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    if (structure != null) {
253782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        try {
254782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            structure.ensureData();
255782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        } catch (Throwable e) {
256782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            Log.w(TAG, "Failure retrieving AssistStructure", e);
257782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                            failure = e;
258782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                        }
259782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                    }
260e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                    mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOOII(MSG_HANDLE_ASSIST,
261e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                            data, failure == null ? structure : null, failure, content,
262e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                            index, count));
263782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn                }
264782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            };
265782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            retriever.start();
266ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        }
267ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
268ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        @Override
26927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        public void handleScreenshot(Bitmap screenshot) {
27027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_HANDLE_SCREENSHOT,
27127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    screenshot));
27227eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        }
27327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
27427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn        @Override
275c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
276c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
285c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
286c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
291c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
29219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        public void onLockscreenShown() {
29319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_ON_LOCKSCREEN_SHOWN));
29419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        }
29519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi
29619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        @Override
297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
3022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
3032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Base class representing a request from a voice-driver app to perform a particular
3042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * voice operation with the user.  See related subclasses for the types of requests
3052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * that are possible.
3062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
307593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public static class Request {
30891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
30991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
31091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
311a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                VoiceInteractionSession session = mSession.get();
312a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (session != null) {
313a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    session.mHandlerCaller.sendMessage(
314a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
315a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                }
31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
3182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final String mCallingPackage;
3192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final int mCallingUid;
32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
321a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        final WeakReference<VoiceInteractionSession> mSession;
3222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final Bundle mExtras;
323a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
3242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        Request(String packageName, int uid, IVoiceInteractorCallback callback,
3252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractionSession session, Bundle extras) {
3262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCallingPackage = packageName;
3272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCallingUid = uid;
32891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
329a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mSession = session.mWeakRef;
3302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mExtras = extras;
3312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the uid of the application that initiated the request.
3352ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public int getCallingUid() {
3372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCallingUid;
3382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the package name of the application that initiated the request.
3422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public String getCallingPackage() {
3442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCallingPackage;
3452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
3462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
3472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
3482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return any additional extra information that was supplied as part of the request.
3492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public Bundle getExtras() {
3512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mExtras;
352a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
353a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
3541b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        /**
3551b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * Check whether this request is currently active.  A request becomes inactive after
3561b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * calling {@link #cancel} or a final result method that completes the request.  After
3571b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * this point, further interactions with the request will result in
3581b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * {@link java.lang.IllegalStateException} errors; you should not catch these errors,
3591b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * but can use this method if you need to determine the state of the request.  Returns
3601b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * true if the request is still active.
3611b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         */
3621b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        public boolean isActive() {
3631b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            VoiceInteractionSession session = mSession.get();
3641b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            if (session == null) {
3651b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn                return false;
3661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            }
3671b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            return session.isRequestActive(mInterface.asBinder());
3681b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
3691b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn
370a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        void finishRequest() {
371a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            VoiceInteractionSession session = mSession.get();
372a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (session == null) {
373a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("VoiceInteractionSession has been destroyed");
374a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
375a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = session.removeRequest(mInterface.asBinder());
376a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (req == null) {
377a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Request not active: " + this);
378a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } else if (req != this) {
379a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Current active request " + req
380a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " not same as calling request " + this);
381a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
38291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
38391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
3842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
385593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn         * Ask the app to cancel this current request.
3861b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This also finishes the request (it is no longer active).
3872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
3882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void cancel() {
38991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
39091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
391a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
39291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
39391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
39491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
39591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
39657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
39757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        @Override
39857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        public String toString() {
39957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            StringBuilder sb = new StringBuilder(128);
40057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            DebugUtils.buildShortClassTag(this, sb);
40157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" ");
40257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(mInterface.asBinder());
40357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" pkg=");
40457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(mCallingPackage);
40557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append(" uid=");
40657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            UserHandle.formatUid(sb, mCallingUid);
40757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            sb.append('}');
40857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            return sb.toString();
40957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
41057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
41157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
41257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mInterface=");
41357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mInterface.asBinder());
41457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage);
41557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid);
41657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println();
41757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCallback=");
41857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mCallback.asBinder());
41957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            if (mExtras != null) {
42057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.print("mExtras=");
42157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.println(mExtras);
42257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
42357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
42491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
42591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
4272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request for confirmation from the user of an operation, as per
4282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest
4292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
4302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
4312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class ConfirmationRequest extends Request {
4326cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
4332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        ConfirmationRequest(String packageName, int uid, IVoiceInteractorCallback callback,
4356cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
4362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
4372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mPrompt = prompt;
4382ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
4392ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4412ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the prompt informing the user of what will happen, as per
4422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.ConfirmationRequest
4432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.ConfirmationRequest}.
4442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
4456cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4466cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
4472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mPrompt;
4482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
44991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
4516cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the prompt informing the user of what will happen, as per
4526cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.ConfirmationRequest
4536cf397508eb7edef13baefad942a59b058ed450bJames Cook         * VoiceInteractor.ConfirmationRequest}.
4546cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts.
4556cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
4566cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
4576cf397508eb7edef13baefad942a59b058ed450bJames Cook        public CharSequence getPrompt() {
4586cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
4596cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
4606cf397508eb7edef13baefad942a59b058ed450bJames Cook
4616cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
4622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has confirmed the operation with the user, resulting
4632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
4642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.ConfirmationRequest#onConfirmationResult
4652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.ConfirmationRequest.onConfirmationResult}.
4661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
4672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
4682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendConfirmationResult(boolean confirmed, Bundle result) {
469593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
470593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmationResult: req=" + mInterface
471593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
472593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
473593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
474593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
475593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
4762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
47757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
47857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
47957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
48057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
48157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
48257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
4832ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
4842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
4862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request for the user to pick from a set of option, as per
4872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
4882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
4892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class PickOptionRequest extends Request {
4906cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
4912ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final VoiceInteractor.PickOptionRequest.Option[] mOptions;
4922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
4932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        PickOptionRequest(String packageName, int uid, IVoiceInteractorCallback callback,
4946cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt,
4952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
4962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
4972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mPrompt = prompt;
4982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mOptions = options;
4992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the prompt informing the user of what they are picking, as per
5032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
5042ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5056cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
5066cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
5072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mPrompt;
5082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5116cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the prompt informing the user of what they are picking, as per
5126cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
5136cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows multiple voice prompts.
5146cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
5156cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
5166cf397508eb7edef13baefad942a59b058ed450bJames Cook        public CharSequence getPrompt() {
5176cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
5186cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
5196cf397508eb7edef13baefad942a59b058ed450bJames Cook
5206cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
5212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the set of options the user is picking from, as per
5222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
5232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public VoiceInteractor.PickOptionRequest.Option[] getOptions() {
5252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mOptions;
5262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
528593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        void sendPickOptionResult(boolean finished,
529593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
530593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
531593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
532593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " finished=" + finished + " selections=" + selections
533593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
534593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (finished) {
535593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                    finishRequest();
536593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                }
537593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
538593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
539593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
540593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        }
541593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn
5422ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report an intermediate option selection from the request, without completing it (the
5442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * request is still active and the app is waiting for the final option selection),
5452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * resulting in a call to
5462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult
5472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished.
5482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendIntermediatePickOptionResult(
5502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
5512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendPickOptionResult(false, selections, result);
5522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
5532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
5552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report the final option selection for the request, completing the request
5562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * and resulting in a call to
5572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.PickOptionRequest#onPickOptionResult
5582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.PickOptionRequest.onPickOptionResult} with false for finished.
5591b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
5602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
5612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendPickOptionResult(
5622ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
5632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendPickOptionResult(true, selections, result);
5642ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
56557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
56657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
56757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
56857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
56957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
57057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            if (mOptions != null) {
57157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.println("Options:");
57257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                for (int i=0; i<mOptions.length; i++) {
57357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    VoiceInteractor.PickOptionRequest.Option op = mOptions[i];
57457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("  #"); writer.print(i); writer.println(":");
57557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("    mLabel=");
57657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.println(op.getLabel());
57757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.print(prefix); writer.print("    mIndex=");
57857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    writer.println(op.getIndex());
57957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    if (op.countSynonyms() > 0) {
58057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.print(prefix); writer.println("    Synonyms:");
58157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        for (int j=0; j<op.countSynonyms(); j++) {
58257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                            writer.print(prefix); writer.print("      #"); writer.print(j);
58357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                            writer.print(": "); writer.println(op.getSynonymAt(j));
58457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        }
58557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    }
58657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    if (op.getExtras() != null) {
58757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.print(prefix); writer.print("    mExtras=");
58857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                        writer.println(op.getExtras());
58957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                    }
59057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                }
59157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
59257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
5932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
5942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
5952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
5962ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request to simply inform the user that the voice operation has completed, as per
5972ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
5982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * VoiceInteractor.CompleteVoiceRequest}.
5992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
6002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class CompleteVoiceRequest extends Request {
6016cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
6022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        CompleteVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback,
6046cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
6052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
6066cf397508eb7edef13baefad942a59b058ed450bJames Cook            mPrompt = prompt;
6072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the message informing the user of the completion, as per
6112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CompleteVoiceRequest
6122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CompleteVoiceRequest}.
6132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6146cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6156cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
6166cf397508eb7edef13baefad942a59b058ed450bJames Cook            return mPrompt;
6176cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
6186cf397508eb7edef13baefad942a59b058ed450bJames Cook
6196cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
6206cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the message informing the user of the completion, as per
6216cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.CompleteVoiceRequest
6226cf397508eb7edef13baefad942a59b058ed450bJames Cook         * VoiceInteractor.CompleteVoiceRequest}.
6236cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message.
6246cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
6256cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public CharSequence getMessage() {
6276cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
6282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6312ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has finished completing the voice operation, resulting
6322ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
6332ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CompleteVoiceRequest#onCompleteResult
6342ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CompleteVoiceRequest.onCompleteResult}.
6351b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
6362ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6372ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendCompleteResult(Bundle result) {
638593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
639593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
640593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
641593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
642593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverCompleteVoiceResult(mInterface, result);
643593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
644593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
6452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
64657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
64757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
64857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
64957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
65057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
65157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
6522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
6532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
6552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A request to report that the current user interaction can not be completed with voice, as per
6562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6572ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
6582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class AbortVoiceRequest extends Request {
6596cf397508eb7edef13baefad942a59b058ed450bJames Cook        final VoiceInteractor.Prompt mPrompt;
6602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        AbortVoiceRequest(String packageName, int uid, IVoiceInteractorCallback callback,
6626cf397508eb7edef13baefad942a59b058ed450bJames Cook                VoiceInteractionSession session, VoiceInteractor.Prompt prompt, Bundle extras) {
6632ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
6646cf397508eb7edef13baefad942a59b058ed450bJames Cook            mPrompt = prompt;
6652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the message informing the user of the problem, as per
6692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6716cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6726cf397508eb7edef13baefad942a59b058ed450bJames Cook        public VoiceInteractor.Prompt getVoicePrompt() {
6736cf397508eb7edef13baefad942a59b058ed450bJames Cook            return mPrompt;
6746cf397508eb7edef13baefad942a59b058ed450bJames Cook        }
6756cf397508eb7edef13baefad942a59b058ed450bJames Cook
6766cf397508eb7edef13baefad942a59b058ed450bJames Cook        /**
6776cf397508eb7edef13baefad942a59b058ed450bJames Cook         * Return the message informing the user of the problem, as per
6786cf397508eb7edef13baefad942a59b058ed450bJames Cook         * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
6796cf397508eb7edef13baefad942a59b058ed450bJames Cook         * @deprecated Prefer {@link #getVoicePrompt()} which allows a separate visual message.
6806cf397508eb7edef13baefad942a59b058ed450bJames Cook         */
6816cf397508eb7edef13baefad942a59b058ed450bJames Cook        @Nullable
6822ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public CharSequence getMessage() {
6836cf397508eb7edef13baefad942a59b058ed450bJames Cook            return (mPrompt != null ? mPrompt.getVoicePromptAt(0) : null);
6842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
6852ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
6862ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
6872ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report that the voice interactor has finished aborting the voice operation, resulting
6882ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * in a call to
6892ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.AbortVoiceRequest#onAbortResult
6901b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * VoiceInteractor.AbortVoiceRequest.onAbortResult}.  This finishes the request (it
6911b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * is no longer active).
6922ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
6932ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendAbortResult(Bundle result) {
694593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
695593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
696593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
697593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                finishRequest();
698593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverAbortVoiceResult(mInterface, result);
699593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
700593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
7012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
70257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
70357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
70457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
70557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mPrompt=");
70657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mPrompt);
70757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
7082ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
7092ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
7112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * A generic vendor-specific request, as per
7122ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
7132ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
7142ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public static final class CommandRequest extends Request {
7152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        final String mCommand;
7162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7172ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        CommandRequest(String packageName, int uid, IVoiceInteractorCallback callback,
7182ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                VoiceInteractionSession session, String command, Bundle extras) {
7192ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            super(packageName, uid, callback, session, extras);
7202ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            mCommand = command;
7212ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7232ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7242ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Return the command that is being executed, as per
7252ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
7262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7272ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public String getCommand() {
7282ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            return mCommand;
7292ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7302ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
731593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        void sendCommandResult(boolean finished, Bundle result) {
732593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            try {
733593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
734593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                        + " result=" + result);
735593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                if (finished) {
736593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                    finishRequest();
737593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                }
738593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn                mCallback.deliverCommandResult(mInterface, finished, result);
739593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            } catch (RemoteException e) {
740593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn            }
741593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        }
742593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn
7432ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7442ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report an intermediate result of the request, without completing it (the request
7452ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * is still active and the app is waiting for the final result), resulting in a call to
7462ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult
7472ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CommandRequest.onCommandResult} with false for isCompleted.
7482ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7492ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendIntermediateResult(Bundle result) {
7502ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendCommandResult(false, result);
7512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        }
7522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
7532ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        /**
7542ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * Report the final result of the request, completing the request and resulting in a call to
7552ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * {@link android.app.VoiceInteractor.CommandRequest#onCommandResult
7562ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         * VoiceInteractor.CommandRequest.onCommandResult} with true for isCompleted.
7571b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn         * This finishes the request (it is no longer active).
7582ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn         */
7592ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        public void sendResult(Bundle result) {
7602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn            sendCommandResult(true, result);
76191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
76257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
76357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
76457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            super.dump(prefix, fd, writer, args);
76557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.print("mCommand=");
76657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.println(mCommand);
76757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
76891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
76991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
77091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
7713d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_PICK_OPTION = 2;
7723d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMPLETE_VOICE = 3;
7733d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_ABORT_VOICE = 4;
7743d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_START_COMMAND = 5;
7753d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_SUPPORTS_COMMANDS = 6;
7763d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    static final int MSG_CANCEL = 7;
77791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
778c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
779c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
780c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
781c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
782ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    static final int MSG_HANDLE_ASSIST = 104;
78327eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HANDLE_SCREENSHOT = 105;
78427eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_SHOW = 106;
78527eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    static final int MSG_HIDE = 107;
78619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    static final int MSG_ON_LOCKSCREEN_SHOWN = 108;
787c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
788c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
78991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
79091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
791d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            SomeArgs args = null;
79291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
79391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
7942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + msg.obj);
7952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestConfirmation((ConfirmationRequest) msg.obj);
79691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
7973d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                case MSG_START_PICK_OPTION:
7982ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onPickOption: req=" + msg.obj);
7992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestPickOption((PickOptionRequest) msg.obj);
8003d07c94c393831091958fe6a98811843db8973bdDianne Hackborn                    break;
801d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                case MSG_START_COMPLETE_VOICE:
8022ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + msg.obj);
8032ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestCompleteVoice((CompleteVoiceRequest) msg.obj);
804d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    break;
805a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                case MSG_START_ABORT_VOICE:
8062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + msg.obj);
8072ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestAbortVoice((AbortVoiceRequest) msg.obj);
808a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    break;
80991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
8102ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + msg.obj);
8112ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onRequestCommand((CommandRequest) msg.obj);
81291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
81391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
814c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
8152ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg1);
8162ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    args.arg1 = onGetSupportedCommands((String[]) args.arg1);
817d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                    args.complete();
818d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                    args = null;
81991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
82091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
821ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request)msg.obj));
8222ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn                    onCancelRequest((Request) msg.obj);
82391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
824c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
825c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
826c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
827c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
828c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
829c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
830c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
831c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
832c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
833c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
834c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
835c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
836c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
837c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
838c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
839c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
840c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
841c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
842ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                case MSG_HANDLE_ASSIST:
84309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn                    args = (SomeArgs)msg.obj;
84409d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1
845e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                            + " structure=" + args.arg2 + " content=" + args.arg3
846e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                            + " activityIndex=" + args.argi5 + " activityCount=" + args.argi6);
847e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                    if (args.argi5 == 0) {
848e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                        doOnHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2,
849e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                                (Throwable) args.arg3, (AssistContent) args.arg4);
850e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                    } else {
851e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                        doOnHandleAssistSecondary((Bundle) args.arg1, (AssistStructure) args.arg2,
852e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                                (Throwable) args.arg3, (AssistContent) args.arg4,
853e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                                args.argi5, args.argi6);
854e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani                    }
855ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                    break;
85627eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                case MSG_HANDLE_SCREENSHOT:
85727eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj);
85827eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    onHandleScreenshot((Bitmap) msg.obj);
85927eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn                    break;
860ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_SHOW:
861225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    args = (SomeArgs)msg.obj;
862225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    if (DEBUG) Log.d(TAG, "doShow: args=" + args.arg1
863225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " flags=" + msg.arg1
864225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            + " showCallback=" + args.arg2);
865225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                    doShow((Bundle) args.arg1, msg.arg1,
866225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            (IVoiceInteractionSessionShowCallback) args.arg2);
867ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
868ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                case MSG_HIDE:
869ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doHide");
870ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    doHide();
871ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    break;
87219695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                case MSG_ON_LOCKSCREEN_SHOWN:
87319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    if (DEBUG) Log.d(TAG, "onLockscreenShown");
87419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    onLockscreenShown();
87519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi                    break;
87691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
877d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            if (args != null) {
878d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn                args.recycle();
879d0a159025a06a7400ab3dfca1d754494947092e0Dianne Hackborn            }
88091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
88191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
882c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
883c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
884c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
885c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
886c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
887c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
888c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
889c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
890c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
891c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
892c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
893c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
894c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
895e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
896c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
897c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
898c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
899c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
900c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
901c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
902e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
903c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
904c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
905c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
906c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
907c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
908c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
909c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
910c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
911c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
912c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
913c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
914c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
915c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
916c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
917c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
918c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
919c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
920c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
921c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
922c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
923c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
924c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
925c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
926c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
927c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
928c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
929c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
930c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
931c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
932c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
933c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
934c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
935c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
936c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
937c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
938c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
939c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
940c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
941c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
942c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
943c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
944e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
945e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
946c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
947c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
948c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
949c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
95091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
95191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
95291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
95391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
95491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
95591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
95691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
95791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
958c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
95991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
96091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
961d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    public Context getContext() {
962d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn        return mContext;
963d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    }
964d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn
9652ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    void addRequest(Request req) {
9661b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        synchronized (this) {
9671b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            mActiveRequests.put(req.mInterface.asBinder(), req);
9681b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
9691b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn    }
9701b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn
9711b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn    boolean isRequestActive(IBinder reqInterface) {
9721b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        synchronized (this) {
9731b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn            return mActiveRequests.containsKey(reqInterface);
9741b4447f728eab763beb2da28d3cf64574729c556Dianne Hackborn        }
975a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
976a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
977a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request removeRequest(IBinder reqInterface) {
97891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
9798ef92bd311e6faf602c9705db663abd451590fffAndreas Gampe            return mActiveRequests.remove(reqInterface);
98091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
98191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
98291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
983593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token) {
984c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
985c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
986593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        onCreate();
987c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
988c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
989225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi    void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) {
990ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
991ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
992ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
993ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mInShowWindow) {
994ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
995ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            return;
996ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
997ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
998ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
999ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = true;
1000ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
1001ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                if (!mWindowAdded) {
1002ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    mWindowAdded = true;
1003ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    View v = onCreateContentView();
1004ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    if (v != null) {
1005ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                        setContentView(v);
1006ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                    }
1007ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                }
1008ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
1009ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onShow(args, flags);
1010ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            if (!mWindowVisible) {
1011ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindowVisible = true;
1012ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn                mWindow.show();
1013ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            }
1014225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            if (showCallback != null) {
1015225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.invalidate();
1016225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                mRootView.getViewTreeObserver().addOnPreDrawListener(
1017225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        new ViewTreeObserver.OnPreDrawListener() {
1018225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            @Override
1019225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            public boolean onPreDraw() {
1020225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                mRootView.getViewTreeObserver().removeOnPreDrawListener(this);
1021225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                try {
1022225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    showCallback.onShown();
1023225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                } catch (RemoteException e) {
1024225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                    Log.w(TAG, "Error calling onShown", e);
1025225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                }
1026225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                                return true;
1027225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                            }
1028225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                        });
1029225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi            }
1030ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } finally {
1031ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowWasVisible = true;
1032ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mInShowWindow = false;
1033ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
1034ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1035ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1036ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    void doHide() {
1037ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        if (mWindowVisible) {
1038ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindow.hide();
1039ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mWindowVisible = false;
1040ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            onHide();
1041ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        }
1042ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1043ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1044c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
10459a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn        onDestroy();
1046c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
1047c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
1048c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
1049c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
1050c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
1051c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
1052c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
1053c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
1054c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1055c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1056c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1057c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
1058c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
1059c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1060c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
1061c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
1062c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
1063c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
1064225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
1065225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
1066c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
1067c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
1068c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1069c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
1070c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1071c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
107269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    /**
10731de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * Equivalent to {@link VoiceInteractionService#setDisabledShowContext
10741de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionService.setDisabledShowContext(int)}.
10751de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     */
10761de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    public void setDisabledShowContext(int flags) {
10771de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        try {
10781de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            mSystemService.setDisabledShowContext(flags);
10791de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        } catch (RemoteException e) {
10801de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        }
10811de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    }
10821de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn
10831de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    /**
10841de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * Equivalent to {@link VoiceInteractionService#getDisabledShowContext
10851de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionService.getDisabledShowContext}.
10861de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     */
10871de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    public int getDisabledShowContext() {
10881de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        try {
10891de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            return mSystemService.getDisabledShowContext();
10901de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        } catch (RemoteException e) {
10911de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn            return 0;
10921de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn        }
10931de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    }
10941de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn
10951de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn    /**
109617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * Return which show context flags have been disabled by the user through the system
109717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * settings UI, so the session will never get this data.  Returned flags are any combination of
109817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and
109917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT
110017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}.  Note that this only tells you about
110117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * global user settings, not about restrictions that may be applied contextual based on
110217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * the current application the user is in or other transient states.
110317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     */
110417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public int getUserDisabledShowContext() {
110517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        try {
110617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            return mSystemService.getUserDisabledShowContext();
110717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        } catch (RemoteException e) {
110817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            return 0;
110917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn        }
111017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    }
111117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn
111217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    /**
111369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Show the UI for this session.  This asks the system to go through the process of showing
111469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * your UI, which will eventually culminate in {@link #onShow}.  This is similar to calling
111569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
111669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * @param args Arbitrary arguments that will be propagated {@link #onShow}.
111769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * @param flags Indicates additional optional behavior that should be performed.  May
11181de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * be any combination of
11191de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_ASSIST VoiceInteractionSession.SHOW_WITH_ASSIST} and
11201de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * {@link VoiceInteractionSession#SHOW_WITH_SCREENSHOT
11211de1186d28f0ca7c0b6298edfa8ae497e651ba87Dianne Hackborn     * VoiceInteractionSession.SHOW_WITH_SCREENSHOT}
112269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * to request that the system generate and deliver assist data on the current foreground
112369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * app as part of showing the session UI.
112469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     */
112569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    public void show(Bundle args, int flags) {
112669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
112769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
112869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
1129ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        try {
113069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            mSystemService.showSessionFromSession(mToken, args, flags);
1131ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
1132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1133ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
113569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn    /**
113669c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Hide the session's UI, if currently shown.  Call this when you are done with your
113769c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * user interaction.
113869c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     */
1139ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void hide() {
114069c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
114169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
114269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
1143c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1144ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn            mSystemService.hideSessionFromSession(mToken);
1145ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        } catch (RemoteException e) {
1146c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1147c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1149c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
1150c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
1151c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
1152c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
1153c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
1154c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
1155c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
1156c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
1157c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
1158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1159c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
1160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1162a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1163a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Ask that a new activity be started for voice interaction.  This will create a
1164a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * new dedicated task in the activity manager for this voice interaction session;
1165a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK}
1166a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * will be set for you to make it a new task.
1167a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1168a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>The newly started activity will be displayed to the user in a special way, as
1169a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * a layer under the voice interaction UI.</p>
1170a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1171a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor}
1172a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * through which it can perform voice interactions through your session.  These requests
1173a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands},
11742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestConfirmation}, {@link #onRequestPickOption},
11752ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice},
11762ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * or {@link #onRequestCommand}
1177a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1178a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>You will receive a call to {@link #onTaskStarted} when the task starts up
1179a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * and {@link #onTaskFinished} when the last activity has finished.
1180a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1181a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The Intent to start this voice interaction.  The given Intent will
1182a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since
1183a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this is part of a voice interaction.
1184a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1185c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
1186c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
1187c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
1188c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1189c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1190e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
1191344744b49633a7f8aa0c8e43469bbfcf9d8e2cabJeff Sharkey            intent.prepareToLeaveProcess(mContext);
1192c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
1193c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
1194c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
1195c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
1196c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1197c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1198c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1199a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
12003d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Set whether this session will keep the device awake while it is running a voice
12013d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * activity.  By default, the system holds a wake lock for it while in this state,
12023d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * so that it can work even if the screen is off.  Setting this to false removes that
12033d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * wake lock, allowing the CPU to go to sleep.  This is typically used if the
12043d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * session decides it has been waiting too long for a response from the user and
12053d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * doesn't want to let this continue to drain the battery.
12063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
12073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * <p>Passing false here will release the wake lock, and you can call later with
12083d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * true to re-acquire it.  It will also be automatically re-acquired for you each
12093d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * time you start a new voice activity task -- that is when you call
12103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link #startVoiceActivity}.</p>
12113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
12123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    public void setKeepAwake(boolean keepAwake) {
121369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        if (mToken == null) {
121469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
121569c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn        }
12163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        try {
12173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn            mSystemService.setKeepAwake(mToken, keepAwake);
12183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        } catch (RemoteException e) {
12193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn        }
12203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    }
12213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
12223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
12234e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * Request that all system dialogs (and status bar shade etc) be closed, allowing
12244e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * access to the session's UI.  This will <em>not</em> cause the lock screen to be
12254e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     * dismissed.
12264e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn     */
12274e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    public void closeSystemDialogs() {
12284e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        if (mToken == null) {
12294e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
12304e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        }
12314e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        try {
12324e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn            mSystemService.closeSystemDialogs(mToken);
12334e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        } catch (RemoteException e) {
12344e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn        }
12354e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    }
12364e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn
12374e88bcd39918197c78b148afe40a08b6adcace1eDianne Hackborn    /**
1238a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Convenience for inflating views.
1239a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
1241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
1242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1244a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1245a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Retrieve the window being used to show the session's UI.
1246a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1247c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
1248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
1249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
125269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * Finish the session.  This completely destroys the session -- the next time it is shown,
125369c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * an entirely new one will be created.  You do not normally call this function; instead,
125469c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * use {@link #hide} and allow the system to destroy your session if it needs its RAM.
1255a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
1257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
1258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
1259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
1261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
1262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
1263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
1264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
12662ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    /**
12672ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * Initiatize a new session.  At this point you don't know exactly what this
12682ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * session will be used for; you will find that out in {@link #onShow}.
12692ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     */
12702ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onCreate() {
12712ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        doOnCreate();
12722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
12732ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn
12742ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    private void doOnCreate() {
1275c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
1276c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
1277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
1278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
1279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
1280e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
1281ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.BOTTOM, true);
1282225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi        mWindow.getWindow().addFlags(
1283225d3b5449d29b43e619d8538d024305f6e81ba9Jorim Jaggi                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED |
12842f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
12852f280d06396d7b8234197a3b1a35d5319f7d6951Stefan Kuhne                WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
1286c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
1287ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
1288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
1289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1291a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1292ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called when the session UI is going to be shown.  This is called after
1293ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link #onCreateContentView} (if the session's content UI needed to be created) and
1294ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * immediately prior to the window being shown.  This may be called while the window
1295ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * is already shown, if a show request has come in while it is shown, to allow you to
1296ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * update the UI to match the new show arguments.
1297ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     *
1298ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * @param args The arguments that were supplied to
1299ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
1300ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * @param showFlags The show flags originally provided to
1301ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * {@link VoiceInteractionService#showSession VoiceInteractionService.showSession}.
1302ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     */
1303ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onShow(Bundle args, int showFlags) {
1304ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    }
1305ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn
1306ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    /**
1307ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     * Called immediately after stopping to show the session UI.
1308ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn     */
1309ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn    public void onHide() {
1310ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    }
1311ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn
1312ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn    /**
1313a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Last callback to the session as it is being finished.
1314a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1315c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
1316c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1317c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1318a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1319a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Hook in which to create the session's UI.
1320a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1321c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
1322c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
1323c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1324c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1325c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
1326c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
1327c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
1328c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
1329ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT));
133041607d5a2b8cc4a3fde4a2f75e33a00e8d957b1dAdam Powell        mContentFrame.requestApplyInsets();
1331c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1332c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1333782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    void doOnHandleAssist(Bundle data, AssistStructure structure, Throwable failure,
1334782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            AssistContent content) {
1335782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        if (failure != null) {
1336782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn            onAssistStructureFailure(failure);
1337782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        }
1338782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn        onHandleAssist(data, structure, content);
1339782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    }
1340782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn
1341e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    void doOnHandleAssistSecondary(Bundle data, AssistStructure structure, Throwable failure,
1342e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani            AssistContent content, int index, int count) {
1343e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani        if (failure != null) {
1344e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani            onAssistStructureFailure(failure);
1345e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani        }
1346e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani        onHandleAssistSecondary(data, structure, content, index, count);
1347e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    }
1348e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani
1349782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1350782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called when there has been a failure transferring the {@link AssistStructure} to
1351782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * the assistant.  This may happen, for example, if the data is too large and results
1352782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * in an out of memory exception, or the client has provided corrupt data.  This will
1353782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * be called immediately before {@link #onHandleAssist} and the AssistStructure supplied
1354782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * there afterwards will be null.
1355782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     *
1356782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param failure The failure exception that was thrown when building the
1357782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link AssistStructure}.
1358782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
1359782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    public void onAssistStructureFailure(Throwable failure) {
1360782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    }
1361782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn
1362782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1363782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called to receive data from the application that the user was currently viewing when
136417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * an assist session is started.  If the original show request did not specify
136517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link #SHOW_WITH_ASSIST}, this method will not be called.
1366782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     *
1367782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param data Arbitrary data supplied by the app through
1368782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
136917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * May be null if assist data has been disabled by the user or device policy.
1370782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param structure If available, the structure definition of all windows currently
137117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * displayed by the app.  May be null if assist data has been disabled by the user
137217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * or device policy; will be an empty stub if the application has disabled assist
137317f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * by marking its window as secure.
1374782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * @param content Additional content data supplied by the app through
1375782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}.
137617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * May be null if assist data has been disabled by the user or device policy; will
137717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * not be automatically filled in with data from the app if the app has marked its
137817f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * window as secure.
1379782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
138017f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public void onHandleAssist(@Nullable Bundle data, @Nullable AssistStructure structure,
138117f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn            @Nullable AssistContent content) {
138209d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn    }
138309d57fe9b357495b7bc62be39a8befa00d9d7ffbDianne Hackborn
1384782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn    /**
1385e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * Called to receive data from other applications that the user was or is interacting with,
1386e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * that are currently on the screen in a multi-window display environment, not including the
1387e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * currently focused activity. This could be
1388e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * a free-form window, a picture-in-picture window, or another window in a split-screen display.
1389e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * <p>
1390e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * This method is very similar to
1391e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * {@link #onHandleAssist} except that it is called
1392e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * for additional non-focused activities along with an index and count that indicates
1393e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * which additional activity the data is for. {@code index} will be between 1 and
1394e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * {@code count}-1 and this method is called once for each additional window, in no particular
1395e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * order. The {@code count} indicates how many windows to expect assist data for, including the
1396e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * top focused activity, which continues to be returned via {@link #onHandleAssist}.
1397e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * <p>
1398e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * To be responsive to assist requests, process assist data as soon as it is received,
1399e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * without waiting for all queued activities to return assist data.
1400e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     *
1401e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * @param data Arbitrary data supplied by the app through
1402e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
1403e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * May be null if assist data has been disabled by the user or device policy.
1404e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * @param structure If available, the structure definition of all windows currently
1405e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * displayed by the app.  May be null if assist data has been disabled by the user
1406e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * or device policy; will be an empty stub if the application has disabled assist
1407e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * by marking its window as secure.
1408e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * @param content Additional content data supplied by the app through
1409e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}.
1410e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * May be null if assist data has been disabled by the user or device policy; will
1411e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * not be automatically filled in with data from the app if the app has marked its
1412e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * window as secure.
1413e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * @param index the index of the additional activity that this data
1414e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     *        is for.
1415e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     * @param count the total number of additional activities for which the assist data is being
1416e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     *        returned, including the focused activity that is returned via
1417e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     *        {@link #onHandleAssist}.
1418e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani     */
1419e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    public void onHandleAssistSecondary(@Nullable Bundle data, @Nullable AssistStructure structure,
1420e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani            @Nullable AssistContent content, int index, int count) {
1421e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    }
1422e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani
1423e8222e551f8abd2d82ca4f77ddb275e2e509751eAmith Yamasani    /**
1424782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     * Called to receive a screenshot of what the user was currently viewing when an assist
142517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * session is started.  May be null if screenshots are disabled by the user, policy,
142617f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * or application.  If the original show request did not specify
142717f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn     * {@link #SHOW_WITH_SCREENSHOT}, this method will not be called.
1428782d49826862cbdc9d020fc9d85f8a6f64675dcbDianne Hackborn     */
142917f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn    public void onHandleScreenshot(@Nullable Bitmap screenshot) {
143027eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn    }
143127eac1d58fe0b7ca3a2e27f5ed64eff232745f45Dianne Hackborn
1432c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
1433c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1434c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1435c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1436c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
1437c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1438c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
1441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1442c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1443c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1444c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
1445c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
1446c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1448d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn    /**
1449d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * Called when the user presses the back button while focus is in the session UI.  Note
1450d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * that this will only happen if the session UI has requested input focus in its window;
1451d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     * otherwise, the back key will go to whatever window has focus and do whatever behavior
145269c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * it normally has there.  The default implementation simply calls {@link #hide}.
1453d59a5d59df920d743723521a2afed9de1da3373bDianne Hackborn     */
1454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
1455ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
1456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1458a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1459a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Sessions automatically watch for requests that all system UI be closed (such as when
1460a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the user presses HOME), which will appear here.  The default implementation always
146169c6adc96eecfde74ceb83cf9177428dc08b6067Dianne Hackborn     * calls {@link #hide}.
1462a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
1464ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
146519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    }
146619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi
146719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    /**
146819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi     * Called when the lockscreen was shown.
146919695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi     */
147019695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    public void onLockscreenShown() {
147119695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        hide();
1472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
14741e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14751e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onConfigurationChanged(Configuration newConfig) {
14761e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14771e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
14781e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onLowMemory() {
14801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
14821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    @Override
14831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void onTrimMemory(int level) {
14841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
14851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
1486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
1487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
1488ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height
1489ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * of the window, meaning it should not adjust content underneath.  The default touchable
1490ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}, meaning it consumes all touch
1491ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn     * events within its window frame.
1492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
1493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
1494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
1495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
1496e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
1497e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
1498ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.right = 0;
1499ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
1500ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn        outInsets.contentInsets.top = decor.getHeight();
1501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
1502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
1503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1505a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1506a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)}
1507a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * has actually started.
1508a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1509a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
1510a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
1511a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the now running task.
1512a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1513c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
1514c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1515c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1516a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1517a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the last activity of a task initiated by
1518a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)} has finished.  The default
1519a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * implementation calls {@link #finish()} on the assumption that this represents
1520a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the completion of a voice action.  You can override the implementation if you would
1521a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * like a different behavior.
1522a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1523a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
1524a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
1525a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the finished task.
1526a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
1527c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
1528ffeecb1bfb9b71f4b62c9ef1fbf7b58a7a63f655Dianne Hackborn        hide();
1529c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
1530c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
1531a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1532a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to query for what extended commands the session supports.
1533a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1534a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param commands An array of commands that are being queried.
1535a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @return Return an array of booleans indicating which of each entry in the
1536a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * command array is supported.  A true entry in the array indicates the command
1537a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * is supported; false indicates it is not.  The default implementation returns
1538a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * an array of all false entries.
1539a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15402ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public boolean[] onGetSupportedCommands(String[] commands) {
1541593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn        return new boolean[commands.length];
1542a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
1543a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1544a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1545a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to confirm with the user before proceeding with an unrecoverable operation,
1546a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest
1547a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
1548a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1549a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1550a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15512ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestConfirmation(ConfirmationRequest request) {
15522ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
1553a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1554a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
15553d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * Request for the user to pick one of N options, corresponding to a
15563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * {@link android.app.VoiceInteractor.PickOptionRequest VoiceInteractor.PickOptionRequest}.
15573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     *
15583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     * @param request The active request.
15593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn     */
15602ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestPickOption(PickOptionRequest request) {
15612ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
15623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn
15633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn    /**
1564d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * Request to complete the voice interaction session because the voice activity successfully
1565d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * completed its interaction using voice.  Corresponds to
1566d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
1567d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.  The default implementation just sends an empty
1568d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * confirmation back to allow the activity to exit.
1569d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     *
1570d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param request The active request.
1571d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     */
15722ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestCompleteVoice(CompleteVoiceRequest request) {
1573d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    }
1574d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
1575d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    /**
1576a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to abort the voice interaction session because the voice activity can not
1577a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * complete its interaction using voice.  Corresponds to
1578a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest
1579a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.AbortVoiceRequest}.  The default implementation just sends an empty
1580a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * confirmation back to allow the activity to exit.
1581a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1582a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1583a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15842ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestAbortVoice(AbortVoiceRequest request) {
1585a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
1586a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1587a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1588a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Process an arbitrary extended command from the caller,
1589a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.CommandRequest
1590a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.CommandRequest}.
1591a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1592a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
1593a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
15942ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onRequestCommand(CommandRequest request) {
15952ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
1596a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
1597a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
1598593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn     * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
15992ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * that was previously delivered to {@link #onRequestConfirmation},
16002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice},
16012ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn     * or {@link #onRequestCommand}.
1602a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
1603a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The request that is being canceled.
1604a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
16052ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    public void onCancelRequest(Request request) {
16062ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn    }
160757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
160857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    /**
160957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * Print the Service's state into the given stream.  This gets invoked by
161057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * {@link VoiceInteractionSessionService} when its Service
161157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * {@link android.app.Service#dump} method is called.
161257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     *
161357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param prefix Text to print at the front of each line.
161457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
161557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param writer The PrintWriter to which you should dump your state.  This will be
161657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * closed for you after you return.
161757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     * @param args additional arguments to the dump request.
161857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn     */
161957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
162057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mToken="); writer.println(mToken);
162157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme));
162257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mInitialized="); writer.println(mInitialized);
162357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded);
162457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(" mWindowVisible="); writer.println(mWindowVisible);
162557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible);
162657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        writer.print(" mInShowWindow="); writer.println(mInShowWindow);
162757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        if (mActiveRequests.size() > 0) {
162857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            writer.print(prefix); writer.println("Active requests:");
162957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            String innerPrefix = prefix + "    ";
163057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            for (int i=0; i<mActiveRequests.size(); i++) {
163157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                Request req = mActiveRequests.valueAt(i);
163257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(prefix); writer.print("  #"); writer.print(i);
163357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.print(": ");
163457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                writer.println(req);
163557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn                req.dump(innerPrefix, fd, writer, args);
163657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn
163757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn            }
163857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn        }
163957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn    }
164091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
1641