VoiceInteractionManagerServiceImpl.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 com.android.server.voiceinteraction;
1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.app.ActivityManager;
2091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.app.ActivityManagerNative;
2191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.app.IActivityManager;
22c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.BroadcastReceiver;
2391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.ComponentName;
2491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
2591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Intent;
26c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.content.IntentFilter;
2791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.ServiceConnection;
2891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.pm.PackageManager;
2991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.pm.ServiceInfo;
3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Binder;
3118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Bundle;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
35c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.os.ServiceManager;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.UserHandle;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionService;
3891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.IVoiceInteractionSessionService;
4091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.VoiceInteractionService;
4118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.VoiceInteractionServiceInfo;
4291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Slog;
43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.IWindowManager;
44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
4591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
4691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.FileDescriptor;
4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.PrintWriter;
4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornclass VoiceInteractionManagerServiceImpl {
5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final static String TAG = "VoiceInteractionServiceManager";
5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final boolean mValid;
5418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Context mContext;
5691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Handler mHandler;
5791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Object mLock;
5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final int mUser;
5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final ComponentName mComponent;
6091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IActivityManager mAm;
6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final VoiceInteractionServiceInfo mInfo;
6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final ComponentName mSessionComponentName;
63c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final IWindowManager mIWindowManager;
6491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    boolean mBound = false;
6591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    IVoiceInteractionService mService;
6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    SessionConnection mActiveSession;
6891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
69c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
70c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        @Override
71c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        public void onReceive(Context context, Intent intent) {
72c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
73c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                synchronized (mLock) {
74c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    if (mActiveSession != null && mActiveSession.mSession != null) {
75c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        try {
76c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                            mActiveSession.mSession.closeSystemDialogs();
77c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        } catch (RemoteException e) {
78c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        }
79c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    }
80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            }
82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    };
84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
8591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final ServiceConnection mConnection = new ServiceConnection() {
8691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
8791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
8891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            synchronized (mLock) {
8991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mService = IVoiceInteractionService.Stub.asInterface(service);
9091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
9191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
9391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
9591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mService = null;
9691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
9918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final class SessionConnection implements ServiceConnection {
10018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final IBinder mToken = new Binder();
10118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final Bundle mArgs;
10218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        boolean mBound;
10318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSessionService mService;
10418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSession mSession;
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractor mInteractor;
10618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        SessionConnection(Bundle args) {
10818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mArgs = args;
10918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Intent serviceIntent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            serviceIntent.setComponent(mSessionComponentName);
11118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mBound = mContext.bindServiceAsUser(serviceIntent, this,
11218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    Context.BIND_AUTO_CREATE, new UserHandle(mUser));
113c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mBound) {
114c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                try {
115c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mIWindowManager.addWindowToken(mToken,
116e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                            WindowManager.LayoutParams.TYPE_VOICE_INTERACTION);
117c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                } catch (RemoteException e) {
118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    Slog.w(TAG, "Failed adding window token", e);
119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            } else {
12118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                Slog.w(TAG, "Failed binding to voice interaction session service " + mComponent);
12218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
12418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
12518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            synchronized (mLock) {
12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = IVoiceInteractionSessionService.Stub.asInterface(service);
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                if (mActiveSession == this) {
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    try {
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        mService.newSession(mToken, mArgs);
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    } catch (RemoteException e) {
133c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        Slog.w(TAG, "Failed adding window token", e);
13418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    }
13518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                }
13618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
13718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
13818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
13918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
14018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceDisconnected(ComponentName name) {
14118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mService = null;
14218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
14318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
14418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void cancel() {
14518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
146c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                if (mSession != null) {
147c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    try {
148c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        mSession.destroy();
149c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    } catch (RemoteException e) {
150c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        Slog.w(TAG, "Voice interation session already dead");
151c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    }
152c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
15318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mContext.unbindService(this);
154c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                try {
155c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mIWindowManager.removeWindowToken(mToken);
156c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                } catch (RemoteException e) {
157c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    Slog.w(TAG, "Failed removing window token", e);
158c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
15918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mBound = false;
16018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = null;
16118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mSession = null;
16218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInteractor = null;
16318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
16418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
16518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
16618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void dump(String prefix, PrintWriter pw) {
16718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
16818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mArgs="); pw.println(mArgs);
16918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mBound="); pw.println(mBound);
17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
17118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mService="); pw.println(mService);
17218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mSession="); pw.println(mSession);
17318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mInteractor="); pw.println(mInteractor);
17418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
17518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
17618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    };
17718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    VoiceInteractionManagerServiceImpl(Context context, Handler handler, Object lock,
17991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int userHandle, ComponentName service) {
18091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
18191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandler = handler;
18291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mLock = lock;
18391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mUser = userHandle;
18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mComponent = service;
18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mAm = ActivityManagerNative.getDefault();
18618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        VoiceInteractionServiceInfo info;
18718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
18818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            info = new VoiceInteractionServiceInfo(context.getPackageManager(), service);
18918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
19018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Voice interaction service not found: " + service);
19118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mInfo = null;
19218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
193c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
19418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
19518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
19718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mInfo = info;
19818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mInfo.getParseError() != null) {
19918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Bad voice interaction service: " + mInfo.getParseError());
20018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
201c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
20218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
20318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
20491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mValid = true;
20618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mSessionComponentName = new ComponentName(service.getPackageName(),
20718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInfo.getSessionService());
208c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
209c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
210c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        IntentFilter filter = new IntentFilter();
211c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
212c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContext.registerReceiver(mBroadcastReceiver, filter, null, handler);
21318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
21418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startSessionLocked(int callingPid, int callingUid, Bundle args) {
21691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mActiveSession != null) {
21718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.cancel();
21818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession = null;
21991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = new SessionConnection(args);
22118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
22218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
223c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean deliverNewSessionLocked(int callingPid, int callingUid, IBinder token,
22418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            IVoiceInteractionSession session, IVoiceInteractor interactor) {
225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "deliverNewSession does not match active session");
227c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return false;
228c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mSession = session;
230c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mInteractor = interactor;
231c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return true;
232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public int startVoiceActivityLocked(int callingPid, int callingUid, IBinder token,
235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Intent intent, String resolvedType) {
23691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        try {
23718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mActiveSession == null || token != mActiveSession.mToken) {
238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Slog.w(TAG, "startVoiceActivity does not match active session");
23918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return ActivityManager.START_CANCELED;
24018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent = new Intent(intent);
242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addCategory(Intent.CATEGORY_VOICE);
243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
24491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor,
24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, null, null, null, mUser);
24791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        } catch (RemoteException e) {
24891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            throw new IllegalStateException("Unexpected remote error", e);
24991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
25091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
25191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
252c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
253c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finishLocked(int callingPid, int callingUid, IBinder token) {
254c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "finish does not match active session");
256c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return;
257c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.cancel();
259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = null;
260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
26218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
26318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mValid) {
26418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print("  NOT VALID: ");
26518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mInfo == null) {
26618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println("no info");
26718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            } else {
26818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println(mInfo.getParseError());
26991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
27091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return;
27191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
27218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mComponent="); pw.println(mComponent.flattenToShortString());
27318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Session service="); pw.println(mInfo.getSessionService());
27418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Settings activity="); pw.println(mInfo.getSettingsActivity());
27518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mBound="); pw.print(mBound);  pw.print(" mService="); pw.println(mService);
27618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mActiveSession != null) {
27718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.println("  Active session:");
27818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.dump("    ", pw);
27918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
28018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
28118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
28218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    void startLocked() {
28318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
28418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        intent.setComponent(mComponent);
28518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mBound = mContext.bindServiceAsUser(intent, mConnection,
28691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                Context.BIND_AUTO_CREATE, new UserHandle(mUser));
28718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mBound) {
28818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Failed binding to voice interaction service " + mComponent);
28918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
29091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
29191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    void shutdownLocked() {
29391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mBound) {
29491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mContext.unbindService(mConnection);
29591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mBound = false;
29691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
297c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mValid) {
298c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mContext.unregisterReceiver(mBroadcastReceiver);
299c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
302