VoiceInteractionManagerServiceImpl.java revision 6ea0d0a2592395b8980c24304733daec628e947e
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                }
1536ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                if (mSession != null) {
1546ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    try {
1556ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                        mAm.finishVoiceTask(mSession);
1566ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    } catch (RemoteException e) {
1576ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    }
1586ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                }
15918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mContext.unbindService(this);
160c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                try {
161c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mIWindowManager.removeWindowToken(mToken);
162c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                } catch (RemoteException e) {
163c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    Slog.w(TAG, "Failed removing window token", e);
164c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
16518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mBound = false;
16618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = null;
16718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mSession = null;
16818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInteractor = null;
16918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
17118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
17218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void dump(String prefix, PrintWriter pw) {
17318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
17418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mArgs="); pw.println(mArgs);
17518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mBound="); pw.println(mBound);
17618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
17718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mService="); pw.println(mService);
17818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mSession="); pw.println(mSession);
17918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mInteractor="); pw.println(mInteractor);
18018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
18118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
18218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    };
18318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
18491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    VoiceInteractionManagerServiceImpl(Context context, Handler handler, Object lock,
18591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int userHandle, ComponentName service) {
18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
18791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandler = handler;
18891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mLock = lock;
18991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mUser = userHandle;
19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mComponent = service;
19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mAm = ActivityManagerNative.getDefault();
19218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        VoiceInteractionServiceInfo info;
19318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
19418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            info = new VoiceInteractionServiceInfo(context.getPackageManager(), service);
19518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
19618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Voice interaction service not found: " + service);
19718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mInfo = null;
19818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
199c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
20018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
20118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
20291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mInfo = info;
20418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mInfo.getParseError() != null) {
20518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Bad voice interaction service: " + mInfo.getParseError());
20618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
207c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
20818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
20918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
21091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
21118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mValid = true;
21218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mSessionComponentName = new ComponentName(service.getPackageName(),
21318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInfo.getSessionService());
214c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
215c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
216c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        IntentFilter filter = new IntentFilter();
217c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContext.registerReceiver(mBroadcastReceiver, filter, null, handler);
21918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
22018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startSessionLocked(int callingPid, int callingUid, Bundle args) {
22291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mActiveSession != null) {
22318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.cancel();
22418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession = null;
22591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
226c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = new SessionConnection(args);
22718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
22818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
229c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean deliverNewSessionLocked(int callingPid, int callingUid, IBinder token,
23018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            IVoiceInteractionSession session, IVoiceInteractor interactor) {
231c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
232c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "deliverNewSession does not match active session");
233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return false;
234c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mSession = session;
236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mInteractor = interactor;
237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return true;
238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
239c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public int startVoiceActivityLocked(int callingPid, int callingUid, IBinder token,
241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Intent intent, String resolvedType) {
24291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        try {
24318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mActiveSession == null || token != mActiveSession.mToken) {
244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Slog.w(TAG, "startVoiceActivity does not match active session");
24518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return ActivityManager.START_CANCELED;
24618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
247c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent = new Intent(intent);
248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addCategory(Intent.CATEGORY_VOICE);
249c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
25091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
251c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor,
25291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, null, null, null, mUser);
25391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        } catch (RemoteException e) {
25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            throw new IllegalStateException("Unexpected remote error", e);
25591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
25691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
25791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
258c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
259c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finishLocked(int callingPid, int callingUid, IBinder token) {
260c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
261c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "finish does not match active session");
262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return;
263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.cancel();
265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = null;
266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
267c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
26818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
26918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mValid) {
27018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print("  NOT VALID: ");
27118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mInfo == null) {
27218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println("no info");
27318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            } else {
27418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println(mInfo.getParseError());
27591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
27691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return;
27791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
27818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mComponent="); pw.println(mComponent.flattenToShortString());
27918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Session service="); pw.println(mInfo.getSessionService());
28018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Settings activity="); pw.println(mInfo.getSettingsActivity());
28118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mBound="); pw.print(mBound);  pw.print(" mService="); pw.println(mService);
28218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mActiveSession != null) {
28318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.println("  Active session:");
28418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.dump("    ", pw);
28518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
28618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
28718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
28818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    void startLocked() {
28918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
29018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        intent.setComponent(mComponent);
29118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mBound = mContext.bindServiceAsUser(intent, mConnection,
29291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                Context.BIND_AUTO_CREATE, new UserHandle(mUser));
29318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mBound) {
29418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Failed binding to voice interaction service " + mComponent);
29518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
29691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
29791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
29891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    void shutdownLocked() {
29991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mBound) {
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mContext.unbindService(mConnection);
30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mBound = false;
30291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
303c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mValid) {
304c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mContext.unregisterReceiver(mBroadcastReceiver);
305c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
30691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
30791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
308