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
19d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackbornimport android.annotation.SystemApi;
20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
2291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
24c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.TypedArray;
25e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.graphics.Rect;
26c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.graphics.Region;
27c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.inputmethodservice.SoftInputWindow;
2891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Binder;
2991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Bundle;
3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Message;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.ArrayMap;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log;
36e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackbornimport android.view.Gravity;
37c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.KeyEvent;
38c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.LayoutInflater;
39c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.View;
40c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewGroup;
41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.ViewTreeObserver;
42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.widget.FrameLayout;
44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService;
4591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
4691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorCallback;
4791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractorRequest;
4891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.HandlerCaller;
4991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.os.SomeArgs;
5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
51a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackbornimport java.lang.ref.WeakReference;
52a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
53c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
55c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
56a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn/**
57d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn * An active interaction session, started by a {@link VoiceInteractionService}.
58a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn */
59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback {
6091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
6191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final boolean DEBUG = true;
6291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
63c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
68c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
69c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
70c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
85c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final int[] mTmpLocation = new int[2];
88c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
89a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    final WeakReference<VoiceInteractionSession> mWeakRef
90a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            = new WeakReference<VoiceInteractionSession>(this);
91a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
9391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
95a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence prompt, Bundle extras) {
96a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION,
9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    prompt, extras));
10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
104d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public IVoiceInteractorRequest startCompleteVoice(String callingPackage,
105d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
106d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            Request request = newRequest(callback);
107d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMPLETE_VOICE,
108d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    new Caller(callingPackage, Binder.getCallingUid()), request,
109d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    message, extras));
110d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            return request.mInterface;
111d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
112d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
113d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        @Override
114a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public IVoiceInteractorRequest startAbortVoice(String callingPackage,
115a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                IVoiceInteractorCallback callback, CharSequence message, Bundle extras) {
116a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
117a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_ABORT_VOICE,
118a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
119a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    message, extras));
120a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return request.mInterface;
121a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
122a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
123a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        @Override
12491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
12591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
126a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request request = newRequest(callback);
12791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND,
12891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
12991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    command, extras));
13091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
13191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
13291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
13391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
13491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
13591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
13691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, new Caller(callingPackage, Binder.getCallingUid()), commands);
13791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
13891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
13991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
14091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
14191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
149c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
150c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
151c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
152c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
153c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
154c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
155c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
156c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
157c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
159c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
162c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
163c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
164c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
165c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
167c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
168c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
17091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
171d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
172d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
173d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
174d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Request {
17691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
17791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
179a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                VoiceInteractionSession session = mSession.get();
180a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (session != null) {
181a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    session.mHandlerCaller.sendMessage(
182a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            session.mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
183a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                }
18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
187a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        final WeakReference<VoiceInteractionSession> mSession;
188a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
189a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        Request(IVoiceInteractorCallback callback, VoiceInteractionSession session) {
19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
191a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mSession = session.mWeakRef;
192a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
193a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
194a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        void finishRequest() {
195a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            VoiceInteractionSession session = mSession.get();
196a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (session == null) {
197a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("VoiceInteractionSession has been destroyed");
198a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
199a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = session.removeRequest(mInterface.asBinder());
200a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            if (req == null) {
201a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Request not active: " + this);
202a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } else if (req != this) {
203a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                throw new IllegalStateException("Current active request " + req
204a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " not same as calling request " + this);
205a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendConfirmResult(boolean confirmed, Bundle result) {
20991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
21091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
212a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
21791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
218d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        public void sendCompleteVoiceResult(Bundle result) {
219d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            try {
220d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
221d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                        + " result=" + result);
222d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                finishRequest();
223d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                mCallback.deliverCompleteVoiceResult(mInterface, result);
224d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            } catch (RemoteException e) {
225d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James            }
226d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        }
227d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
228a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        public void sendAbortVoiceResult(Bundle result) {
229a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            try {
230a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
231a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                        + " result=" + result);
232a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
233a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                mCallback.deliverAbortVoiceResult(mInterface, result);
234a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            } catch (RemoteException e) {
235a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            }
236a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
237a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
23818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void sendCommandResult(boolean complete, Bundle result) {
23991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
24091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
24191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " result=" + result);
242a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
24318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mCallback.deliverCommandResult(mInterface, complete, result);
24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
24591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
24791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
24891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendCancelResult() {
24991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
25091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
251a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                finishRequest();
25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
25591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
25691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
25791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
258d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
259d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
260d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
261d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
26291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Caller {
26391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final String packageName;
26491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int uid;
26591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
26691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        Caller(String _packageName, int _uid) {
26791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            packageName = _packageName;
26891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            uid = _uid;
26991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
27091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
27291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
273d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    static final int MSG_START_COMPLETE_VOICE = 2;
274d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    static final int MSG_START_ABORT_VOICE = 3;
275d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    static final int MSG_START_COMMAND = 4;
276d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    static final int MSG_SUPPORTS_COMMANDS = 5;
277d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    static final int MSG_CANCEL = 6;
27891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
28591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
28691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            SomeArgs args;
28891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
28991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
29191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface
29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " prompt=" + args.arg3 + " extras=" + args.arg4);
293a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onConfirm((Caller)args.arg1, (Request)args.arg2, (CharSequence)args.arg3,
29491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle)args.arg4);
29591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
296d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                case MSG_START_COMPLETE_VOICE:
297d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    args = (SomeArgs)msg.obj;
298d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    if (DEBUG) Log.d(TAG, "onCompleteVoice: req=" + ((Request) args.arg2).mInterface
299d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            + " message=" + args.arg3 + " extras=" + args.arg4);
300d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    onCompleteVoice((Caller) args.arg1, (Request) args.arg2,
301d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                            (CharSequence) args.arg3, (Bundle) args.arg4);
302d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James                    break;
303a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                case MSG_START_ABORT_VOICE:
304a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    args = (SomeArgs)msg.obj;
305a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onAbortVoice: req=" + ((Request) args.arg2).mInterface
306a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            + " message=" + args.arg3 + " extras=" + args.arg4);
307a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    onAbortVoice((Caller) args.arg1, (Request) args.arg2, (CharSequence) args.arg3,
308a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                            (Bundle) args.arg4);
309a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                    break;
31091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
311c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface
31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " command=" + args.arg3 + " extras=" + args.arg4);
31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3,
31591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle) args.arg4);
31691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
31791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
318c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
31991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2);
32091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2);
32191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
323c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request) args.arg1).mInterface);
32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCancel((Request)args.arg1);
32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
327c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
328c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
329c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
331c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
332c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
333c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
334c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
335c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
336c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
337c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
338c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
339c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
340c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
341c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
342c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
343c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
344c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
348c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
350c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
351c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
352c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
353c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
356c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
357d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
360d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
363e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
370e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
374c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
376c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
377c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
378c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
379c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
381c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
384c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
385c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
386c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
387c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
388c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
412e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
413e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
41891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
41991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
42091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
42191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
42291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
42391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
42491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
42591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
426c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
42791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
42891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
429a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request newRequest(IVoiceInteractorCallback callback) {
430a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        synchronized (this) {
431a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = new Request(callback, this);
432a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            mActiveRequests.put(req.mInterface.asBinder(), req);
433a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            return req;
434a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        }
435a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
436a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
437a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    Request removeRequest(IBinder reqInterface) {
43891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
439a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Request req = mActiveRequests.get(reqInterface);
44091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (req != null) {
441a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn                mActiveRequests.remove(req);
44291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
44391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return req;
44491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
44591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
44691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args) {
448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        onCreate(args);
451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
4549a35d78cad1a4cf9639053c24139147e658ec055Dianne Hackborn        onDestroy();
455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
468c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
469c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
480d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
481d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
482d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
483d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void showWindow() {
485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInShowWindow) {
489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return;
491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInShowWindow = true;
495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (!mWindowVisible) {
496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowVisible = true;
497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                if (!mWindowAdded) {
498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mWindowAdded = true;
499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    View v = onCreateContentView();
500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (v != null) {
501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        setContentView(v);
502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    }
503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.show();
505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } finally {
507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindowWasVisible = true;
508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInShowWindow = false;
509c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
510c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
512d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
513d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
514d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
515d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
516c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void hideWindow() {
517c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindowVisible) {
518c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindow.hide();
519c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindowVisible = false;
520c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
521c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
522c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
524d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
525c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
526c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
527c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
528c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
529c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
530d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
531c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
532c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
533c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
534c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
535c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
536c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
537c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
538a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
539d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
540a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Ask that a new activity be started for voice interaction.  This will create a
541a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * new dedicated task in the activity manager for this voice interaction session;
542a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this means that {@link Intent#FLAG_ACTIVITY_NEW_TASK Intent.FLAG_ACTIVITY_NEW_TASK}
543a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * will be set for you to make it a new task.
544a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
545a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>The newly started activity will be displayed to the user in a special way, as
546a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * a layer under the voice interaction UI.</p>
547a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
548a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>As the voice activity runs, it can retrieve a {@link android.app.VoiceInteractor}
549a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * through which it can perform voice interactions through your session.  These requests
550a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * for voice interactions will appear as callbacks on {@link #onGetSupportedCommands},
551a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #onConfirm}, {@link #onCommand}, and {@link #onCancel}.
552a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
553a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * <p>You will receive a call to {@link #onTaskStarted} when the task starts up
554a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * and {@link #onTaskFinished} when the last activity has finished.
555a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
556a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The Intent to start this voice interaction.  The given Intent will
557a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * always have {@link Intent#CATEGORY_VOICE Intent.CATEGORY_VOICE} added to it, since
558a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * this is part of a voice interaction.
559a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
560d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
561c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
562c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
563c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
564c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
565c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
566e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
567e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.prepareToLeaveProcess();
568c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
569c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
570c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
571c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
572c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
573c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
574c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
575a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
576d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
577a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Convenience for inflating views.
578a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
579d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
580c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
581c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
582c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
583c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
584a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
585d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
586a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Retrieve the window being used to show the session's UI.
587a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
588d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
589c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
590c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
591c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
592c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
593a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
594a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Finish the session.
595a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
596c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
597c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
598c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
599c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
600c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        hideWindow();
601c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
602c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
603c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
604c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
605c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
606c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
607a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
608a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Initiatize a new session.
609a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
610a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param args The arguments that were supplied to
611a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link VoiceInteractionService#startSession VoiceInteractionService.startSession}.
612a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
613c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCreate(Bundle args) {
614c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
615c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
616c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
617c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
618c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
619e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
620e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.TOP, true);
621c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
623c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
624c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
625c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
626c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
627a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
628a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Last callback to the session as it is being finished.
629a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
630c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
631c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
632c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
633a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
634d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
635a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Hook in which to create the session's UI.
636a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
637d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
638c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
639c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
640c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
641c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
642c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
643c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
644c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
645c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
646c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.WRAP_CONTENT));
647c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
648c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
649c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
650d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
651d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
652d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
653d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
654c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
655c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
656c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
657c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
658d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
659d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
660d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
661d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
662c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
663c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
664c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
665c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
666d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
667d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
668d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
669d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
670c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
671c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
672c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
673c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
674d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
675d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
676d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
677d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
678c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
679c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
680c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
681c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
682d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    /**
683d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
684d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     */
685d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
686c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
687c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
688c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
689c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
690a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
691a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Sessions automatically watch for requests that all system UI be closed (such as when
692a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the user presses HOME), which will appear here.  The default implementation always
693a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * calls {@link #finish}.
694a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
695c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
696c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
697c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
698c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
699c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
700d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
701c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
702c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * uses the entire window frame as the insets.  The default touchable
703c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}.
704c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
705c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
706c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
707d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn    @SystemApi
708c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
709c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        int[] loc = mTmpLocation;
710c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
711c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        decor.getLocationInWindow(loc);
712e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.top = 0;
713e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
714e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.right = 0;
715e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
716c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
717c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
718c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
719c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
720a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
721d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
722d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
723a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when a task initiated by {@link #startVoiceActivity(android.content.Intent)}
724a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * has actually started.
725a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
726a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
727a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
728a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the now running task.
729a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
730c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
731c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
732c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
733a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
734d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
735d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
736a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the last activity of a task initiated by
737a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)} has finished.  The default
738a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * implementation calls {@link #finish()} on the assumption that this represents
739a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * the completion of a voice action.  You can override the implementation if you would
740a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * like a different behavior.
741a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
742a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param intent The original {@link Intent} supplied to
743a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link #startVoiceActivity(android.content.Intent)}.
744a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param taskId Unique ID of the finished task.
745a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
746c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
747c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
748c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
749c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
750a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
751d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
752d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
753a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to query for what extended commands the session supports.
754a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
755a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
756a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param commands An array of commands that are being queried.
757a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @return Return an array of booleans indicating which of each entry in the
758a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * command array is supported.  A true entry in the array indicates the command
759a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * is supported; false indicates it is not.  The default implementation returns
760a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * an array of all false entries.
761a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
762a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public boolean[] onGetSupportedCommands(Caller caller, String[] commands) {
763a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        return new boolean[commands.length];
764a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
765a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
766a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
767d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
768d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
769a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to confirm with the user before proceeding with an unrecoverable operation,
770a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.ConfirmationRequest
771a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.ConfirmationRequest}.
772a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
773a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
774a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
775a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param prompt The prompt informing the user of what will happen, as per
776a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
777a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
778a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.ConfirmationRequest VoiceInteractor.ConfirmationRequest}.
779a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
780a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public abstract void onConfirm(Caller caller, Request request, CharSequence prompt,
781a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn            Bundle extras);
782a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
783a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
784d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
785d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
786d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * Request to complete the voice interaction session because the voice activity successfully
787d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * completed its interaction using voice.  Corresponds to
788d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
789d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.  The default implementation just sends an empty
790d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * confirmation back to allow the activity to exit.
791d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     *
792d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param caller Who is making the request.
793d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param request The active request.
794d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param message The message informing the user of the problem, as per
795d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
796d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
797d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * @param extras Any additional information, as per
798d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * {@link android.app.VoiceInteractor.CompleteVoiceRequest
799d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     * VoiceInteractor.CompleteVoiceRequest}.
800d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James     */
801d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    public void onCompleteVoice(Caller caller, Request request, CharSequence message,
802d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James           Bundle extras) {
803d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James        request.sendCompleteVoiceResult(null);
804d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    }
805d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James
806d3fdb8bed8e836786253f9cd5ab640c7c5ed8501Barnaby James    /**
807d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
808d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
809a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Request to abort the voice interaction session because the voice activity can not
810a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * complete its interaction using voice.  Corresponds to
811a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest
812a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.AbortVoiceRequest}.  The default implementation just sends an empty
813a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * confirmation back to allow the activity to exit.
814a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
815a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
816a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
817a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param message The message informing the user of the problem, as per
818a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
819a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
820a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.AbortVoiceRequest VoiceInteractor.AbortVoiceRequest}.
821a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
822a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
823a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn        request.sendAbortVoiceResult(null);
824a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    }
825a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
826a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
827d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
828d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
829a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Process an arbitrary extended command from the caller,
830a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * corresponding to a {@link android.app.VoiceInteractor.CommandRequest
831a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * VoiceInteractor.CommandRequest}.
832a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
833a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param caller Who is making the request.
834a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The active request.
835a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param command The command that is being executed, as per
836a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
837a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param extras Any additional information, as per
838a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * {@link android.app.VoiceInteractor.CommandRequest VoiceInteractor.CommandRequest}.
839a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
84091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCommand(Caller caller, Request request, String command, Bundle extras);
841a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn
842a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn    /**
843d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @hide
844d7c0395d26694c594c3e64b16ab647c971aeb422Dianne Hackborn     * @SystemApi
845a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
846a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * that was previously delivered to {@link #onConfirm} or {@link #onCommand}.
847a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     *
848a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     * @param request The request that is being canceled.
849a2c076d54048258cf88ab14551ce5fdf5a09c6e8Dianne Hackborn     */
85091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCancel(Request request);
85191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
852