VoiceInteractionSession.java revision e30e02f5d9a9141c9ee70c712d4f9d52c88ea969
191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/**
291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project
391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License.
691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at
791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn *
1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and
1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License.
1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */
1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage android.service.voice;
1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
19c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Dialog;
20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.app.Instrumentation;
2191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
22c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.Intent;
23c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.res.Resources;
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
51c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
52c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
53c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
54c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornpublic abstract class VoiceInteractionSession implements KeyEvent.Callback {
5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final String TAG = "VoiceInteractionSession";
5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final boolean DEBUG = true;
5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
58c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Context mContext;
59c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final HandlerCaller mHandlerCaller;
60c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
61c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState();
62c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
63c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IVoiceInteractionManagerService mSystemService;
64c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    IBinder mToken;
65c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
66c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    int mTheme = 0;
67c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    LayoutInflater mInflater;
68c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    TypedArray mThemeAttrs;
69c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    View mRootView;
70c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    FrameLayout mContentFrame;
71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    SoftInputWindow mWindow;
72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInitialized;
74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowAdded;
75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowVisible;
76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mWindowWasVisible;
77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    boolean mInShowWindow;
78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>();
80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final Insets mTmpInsets = new Insets();
82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final int[] mTmpLocation = new int[2];
83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
8491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() {
8591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
8691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startConfirmation(String callingPackage,
8791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String prompt, Bundle extras) {
8891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Request request = findRequest(callback, true);
8991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_CONFIRMATION,
9091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
9191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    prompt, extras));
9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
9391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
9591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
9691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public IVoiceInteractorRequest startCommand(String callingPackage,
9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                IVoiceInteractorCallback callback, String command, Bundle extras) {
9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Request request = findRequest(callback, true);
9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_START_COMMAND,
10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    new Caller(callingPackage, Binder.getCallingUid()), request,
10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    command, extras));
10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return request.mInterface;
10391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
10491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
10591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
10691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public boolean[] supportsCommands(String callingPackage, String[] commands) {
10791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Message msg = mHandlerCaller.obtainMessageIOO(MSG_SUPPORTS_COMMANDS,
10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, new Caller(callingPackage, Binder.getCallingUid()), commands);
10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            SomeArgs args = mHandlerCaller.sendMessageAndWait(msg);
11091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (args != null) {
11191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                boolean[] res = (boolean[])args.arg1;
11291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                args.recycle();
11391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return res;
11491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
11591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return new boolean[commands.length];
11691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
11791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
11891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
11991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() {
120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskStarted(Intent intent, int taskId) {
122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED,
123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
125c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
126c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
127c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void taskFinished(Intent intent, int taskId) {
128c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED,
129c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    taskId, intent));
130c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
131c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
132c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void closeSystemDialogs() {
134c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS));
135c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
136c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
137c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
138c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void destroy() {
139c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY));
140c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
14191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
14291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Request {
14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            @Override
14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            public void cancel() throws RemoteException {
14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_CANCEL, Request.this));
14891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        };
15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final IVoiceInteractorCallback mCallback;
15191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final HandlerCaller mHandlerCaller;
15291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        Request(IVoiceInteractorCallback callback, HandlerCaller handlerCaller) {
15391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mCallback = callback;
15491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mHandlerCaller = handlerCaller;
15591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
15691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
15791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendConfirmResult(boolean confirmed, Bundle result) {
15891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
15991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " confirmed=" + confirmed + " result=" + result);
16191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverConfirmationResult(mInterface, confirmed, result);
16291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
16391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
16491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
16618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void sendCommandResult(boolean complete, Bundle result) {
16791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
16891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
16991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        + " result=" + result);
17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mCallback.deliverCommandResult(mInterface, complete, result);
17191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
17291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
17391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
17491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void sendCancelResult() {
17691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
17791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (DEBUG) Log.d(TAG, "sendCancelResult: req=" + mInterface);
17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mCallback.deliverCancel(mInterface);
17991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
18091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
18191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
18291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static class Caller {
18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final String packageName;
18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int uid;
18791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
18891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        Caller(String _packageName, int _uid) {
18991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            packageName = _packageName;
19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            uid = _uid;
19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_CONFIRMATION = 1;
19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_START_COMMAND = 2;
19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_SUPPORTS_COMMANDS = 3;
19791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    static final int MSG_CANCEL = 4;
19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_STARTED = 100;
200c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_TASK_FINISHED = 101;
201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_CLOSE_SYSTEM_DIALOGS = 102;
202c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    static final int MSG_DESTROY = 103;
203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
204c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback {
20591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void executeMessage(Message msg) {
207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            SomeArgs args;
20891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            switch (msg.what) {
20991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_CONFIRMATION:
210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface
21291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " prompt=" + args.arg3 + " extras=" + args.arg4);
21391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onConfirm((Caller)args.arg1, (Request)args.arg2, (String)args.arg3,
21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle)args.arg4);
21591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_START_COMMAND:
217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
21891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface
21991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " command=" + args.arg3 + " extras=" + args.arg4);
22091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3,
22191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            (Bundle) args.arg4);
22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
22391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_SUPPORTS_COMMANDS:
224c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
22591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2);
22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2);
22791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
22891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                case MSG_CANCEL:
229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    args = (SomeArgs)msg.obj;
23091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request) args.arg1).mInterface);
23191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    onCancel((Request)args.arg1);
23291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    break;
233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_STARTED:
234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj
235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskStarted((Intent) msg.obj, msg.arg1);
237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_TASK_FINISHED:
239c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj
240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            + " taskId=" + msg.arg1);
241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onTaskFinished((Intent) msg.obj, msg.arg1);
242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_CLOSE_SYSTEM_DIALOGS:
244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "onCloseSystemDialogs");
245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    onCloseSystemDialogs();
246c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
247c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                case MSG_DESTROY:
248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (DEBUG) Log.d(TAG, "doDestroy");
249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    doDestroy();
250c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    break;
25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
254c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onBackPressed() {
256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            VoiceInteractionSession.this.onBackPressed();
257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final MyCallbacks mCallbacks = new MyCallbacks();
261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Information about where interesting parts of the input method UI appear.
264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public static final class Insets {
266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
267e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn         * This is the part of the UI that is the main content.  It is
268c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * used to determine the basic space needed, to resize/pan the
269c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * application behind.  It is assumed that this inset does not
270c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * change very much, since any change will cause a full resize/pan
271c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the application behind.  This value is relative to the top edge
272c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * of the input method window.
273c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
274e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        public final Rect contentInsets = new Rect();
275c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
276c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
277c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * This is the region of the UI that is touchable.  It is used when
278c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}.
279c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * The region should be specified relative to the origin of the window frame.
280c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
281c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public final Region touchableRegion = new Region();
282c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
283c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
284c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the entire window frame
285c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * can be touched.
286c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
287c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_FRAME
288c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
289c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
290c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
291c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the area inside of
292c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * the content insets can be touched.
293c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
294c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_CONTENT
295c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
296c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Option for {@link #touchableInsets}: the region specified by
299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #touchableRegion} can be touched.
300c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
301c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public static final int TOUCHABLE_INSETS_REGION
302c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
303c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
304c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        /**
305c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * Determine which area of the window is touchable by the user.  May
306c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * be one of: {@link #TOUCHABLE_INSETS_FRAME},
307c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}.
308c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn         */
309c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public int touchableInsets;
310c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
311c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
312c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
313c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            new ViewTreeObserver.OnComputeInternalInsetsListener() {
314c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
315c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            onComputeInsets(mTmpInsets);
316e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.contentInsets.set(mTmpInsets.contentInsets);
317e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            info.visibleInsets.set(mTmpInsets.contentInsets);
318c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.touchableRegion.set(mTmpInsets.touchableRegion);
319c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            info.setTouchableInsets(mTmpInsets.touchableInsets);
320c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
321c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
32291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
32391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context) {
32491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        this(context, new Handler());
32591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
32691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
32791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public VoiceInteractionSession(Context context, Handler handler) {
32891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
32991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandlerCaller = new HandlerCaller(context, handler.getLooper(),
330c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mCallbacks, true);
33191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
33291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
33391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    Request findRequest(IVoiceInteractorCallback callback, boolean newRequest) {
33491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        synchronized (this) {
33591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Request req = mActiveRequests.get(callback.asBinder());
33691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if (req != null) {
33791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (newRequest) {
33891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    throw new IllegalArgumentException("Given request callback " + callback
33991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            + " is already active");
34091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
34191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                return req;
34291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
34391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            req = new Request(callback, mHandlerCaller);
34491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mActiveRequests.put(callback.asBinder(), req);
34591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return req;
34691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
34791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
34891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
349c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args) {
350c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mSystemService = service;
351c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mToken = token;
352c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        onCreate(args);
353c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
354c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
355c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void doDestroy() {
356c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInitialized) {
357c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
358c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mInsetsComputer);
359c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mWindowAdded) {
360c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.dismiss();
361c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowAdded = false;
362c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
363c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInitialized = false;
364c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
365c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
366c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
367c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    void initViews() {
368c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInitialized = true;
369c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
370c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession);
371c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView = mInflater.inflate(
372c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                com.android.internal.R.layout.voice_interaction_session, null);
373c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.setSystemUiVisibility(
374c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
375c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setContentView(mRootView);
376c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
377c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
378c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
379c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
380c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
381c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void showWindow() {
382c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded
383c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                + " mWindowVisible=" + mWindowVisible);
384c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
385c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mInShowWindow) {
386c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Log.w(TAG, "Re-entrance in to showWindow");
387c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return;
388c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
389c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
390c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
391c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInShowWindow = true;
392c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (!mWindowVisible) {
393c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindowVisible = true;
394c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                if (!mWindowAdded) {
395c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mWindowAdded = true;
396c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    View v = onCreateContentView();
397c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (v != null) {
398c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        setContentView(v);
399c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    }
400c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
401c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                mWindow.show();
402c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
403c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } finally {
404c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindowWasVisible = true;
405c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mInShowWindow = false;
406c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
407c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
408c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
409c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void hideWindow() {
410c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindowVisible) {
411c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindow.hide();
412c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mWindowVisible = false;
413c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
414c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
415c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
416c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
417c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * You can call this to customize the theme used by your IME's window.
418c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * This must be set before {@link #onCreate}, so you
419c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * will typically call it in your constructor with the resource ID
420c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * of your custom theme.
421c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
422c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setTheme(int theme) {
423c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mWindow != null) {
424c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Must be called before onCreate()");
425c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
426c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = theme;
427c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
428c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
429c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startVoiceActivity(Intent intent) {
430c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
431c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
432c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
433c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
434e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.migrateExtraStreamToClipData();
435e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn            intent.prepareToLeaveProcess();
436c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            int res = mSystemService.startVoiceActivity(mToken, intent,
437c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent.resolveType(mContext.getContentResolver()));
438c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Instrumentation.checkStartActivityResult(res, intent);
439c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
440c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
441c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
442c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
443c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public LayoutInflater getLayoutInflater() {
444c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mInflater;
445c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
446c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
447c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public Dialog getWindow() {
448c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return mWindow;
449c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
450c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
451c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finish() {
452c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mToken == null) {
453c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            throw new IllegalStateException("Can't call before onCreate()");
454c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
455c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        hideWindow();
456c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        try {
457c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mSystemService.finish(mToken);
458c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        } catch (RemoteException e) {
459c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
460c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
461c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
462c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCreate(Bundle args) {
463c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mTheme = mTheme != 0 ? mTheme
464c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
465c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mInflater = (LayoutInflater)mContext.getSystemService(
466c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Context.LAYOUT_INFLATER_SERVICE);
467c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme,
468e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                mCallbacks, this, mDispatcherState,
469e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                WindowManager.LayoutParams.TYPE_VOICE_INTERACTION, Gravity.TOP, true);
470c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
471c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        initViews();
472c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
473c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mWindow.setToken(mToken);
474c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
475c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
476c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onDestroy() {
477c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
478c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
479c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public View onCreateContentView() {
480c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return null;
481c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
482c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
483c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void setContentView(View view) {
484c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.removeAllViews();
485c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContentFrame.addView(view, new FrameLayout.LayoutParams(
486c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.MATCH_PARENT,
487c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ViewGroup.LayoutParams.WRAP_CONTENT));
488c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
489c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
490c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
491c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyDown(int keyCode, KeyEvent event) {
492c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
493c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
494c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
495c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
496c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
497c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
498c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
499c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyUp(int keyCode, KeyEvent event) {
500c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
501c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
502c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
503c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
504c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return false;
505c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
506c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
507c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onBackPressed() {
508c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
509c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
510c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
511c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onCloseSystemDialogs() {
512c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
513c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
514c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
515c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    /**
516c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * Compute the interesting insets into your UI.  The default implementation
517c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * uses the entire window frame as the insets.  The default touchable
518c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}.
519c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     *
520c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     * @param outInsets Fill in with the current UI insets.
521c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn     */
522c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onComputeInsets(Insets outInsets) {
523c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        int[] loc = mTmpLocation;
524c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        View decor = getWindow().getWindow().getDecorView();
525c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        decor.getLocationInWindow(loc);
526e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.top = 0;
527e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.left = 0;
528e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.right = 0;
529e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn        outInsets.contentInsets.bottom = 0;
530c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME;
531c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        outInsets.touchableRegion.setEmpty();
532c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
533c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
534c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskStarted(Intent intent, int taskId) {
535c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
536c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
537c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void onTaskFinished(Intent intent, int taskId) {
538c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        finish();
539c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
540c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
54191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract boolean[] onGetSupportedCommands(Caller caller, String[] commands);
54291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onConfirm(Caller caller, Request request, String prompt, Bundle extras);
54391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCommand(Caller caller, Request request, String command, Bundle extras);
54491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public abstract void onCancel(Request request);
54591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
546