VoiceInteractionManagerServiceImpl.java revision 1b012d302b56b4adf950035136d1d191a1936d5a
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;
2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Binder;
3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Bundle;
3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
34c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.os.ServiceManager;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.UserHandle;
3691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionService;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.IVoiceInteractionSessionService;
3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.VoiceInteractionService;
4018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.VoiceInteractionServiceInfo;
4191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Slog;
42c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.IWindowManager;
43c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.view.WindowManager;
44d7018200312e4e4dc3f67cf33dc90bf7ce585844Sandeep
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);
90fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                try {
91fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                    mService.ready();
92fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                } catch (RemoteException e) {
93fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                }
9491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
9591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
9691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
9791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
9891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mService = null;
10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
10318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final class SessionConnection implements ServiceConnection {
10418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final IBinder mToken = new Binder();
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final Bundle mArgs;
10618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        boolean mBound;
10718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSessionService mService;
10818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSession mSession;
10918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractor mInteractor;
11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
111c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        SessionConnection(Bundle args) {
11218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mArgs = args;
11318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Intent serviceIntent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            serviceIntent.setComponent(mSessionComponentName);
11518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mBound = mContext.bindServiceAsUser(serviceIntent, this,
11618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    Context.BIND_AUTO_CREATE, new UserHandle(mUser));
117c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            if (mBound) {
118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                try {
119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mIWindowManager.addWindowToken(mToken,
120e30e02f5d9a9141c9ee70c712d4f9d52c88ea969Dianne Hackborn                            WindowManager.LayoutParams.TYPE_VOICE_INTERACTION);
121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                } catch (RemoteException e) {
122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    Slog.w(TAG, "Failed adding window token", e);
123c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            } else {
12518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                Slog.w(TAG, "Failed binding to voice interaction session service " + mComponent);
12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            synchronized (mLock) {
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = IVoiceInteractionSessionService.Stub.asInterface(service);
13318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                if (mActiveSession == this) {
13418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    try {
13518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        mService.newSession(mToken, mArgs);
13618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    } catch (RemoteException e) {
137c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        Slog.w(TAG, "Failed adding window token", e);
13818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    }
13918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                }
14018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
14118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
14218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
14318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
14418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceDisconnected(ComponentName name) {
14518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mService = null;
14618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
14718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
14818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void cancel() {
14918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
150c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                if (mSession != null) {
151c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    try {
152c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        mSession.destroy();
153c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    } catch (RemoteException e) {
154c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                        Slog.w(TAG, "Voice interation session already dead");
155c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    }
156c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
1576ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                if (mSession != null) {
1586ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    try {
1596ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                        mAm.finishVoiceTask(mSession);
1606ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    } catch (RemoteException e) {
1616ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                    }
1626ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                }
16318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mContext.unbindService(this);
164c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                try {
165c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    mIWindowManager.removeWindowToken(mToken);
166c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                } catch (RemoteException e) {
167c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    Slog.w(TAG, "Failed removing window token", e);
168c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                }
16918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mBound = false;
17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = null;
17118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mSession = null;
17218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInteractor = null;
17318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
17418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
17518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
17618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void dump(String prefix, PrintWriter pw) {
17718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
17818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mArgs="); pw.println(mArgs);
17918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mBound="); pw.println(mBound);
18018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
18118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mService="); pw.println(mService);
18218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mSession="); pw.println(mSession);
18318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mInteractor="); pw.println(mInteractor);
18418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
18518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
18618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    };
18718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
18891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    VoiceInteractionManagerServiceImpl(Context context, Handler handler, Object lock,
18991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int userHandle, ComponentName service) {
19091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
19191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandler = handler;
19291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mLock = lock;
19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mUser = userHandle;
19491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mComponent = service;
19591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mAm = ActivityManagerNative.getDefault();
19618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        VoiceInteractionServiceInfo info;
19718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
19818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            info = new VoiceInteractionServiceInfo(context.getPackageManager(), service);
19918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
20018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Voice interaction service not found: " + service);
20118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mInfo = null;
20218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
203c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
20418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
20518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
20691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mInfo = info;
20818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mInfo.getParseError() != null) {
20918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Bad voice interaction service: " + mInfo.getParseError());
21018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
211c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mIWindowManager = null;
21218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
21318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
21491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
21518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mValid = true;
21618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mSessionComponentName = new ComponentName(service.getPackageName(),
21718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInfo.getSessionService());
218c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
219c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
220c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        IntentFilter filter = new IntentFilter();
221c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
222c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mContext.registerReceiver(mBroadcastReceiver, filter, null, handler);
22318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
22418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
225c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void startSessionLocked(int callingPid, int callingUid, Bundle args) {
22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mActiveSession != null) {
22718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.cancel();
22818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession = null;
22991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
230c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = new SessionConnection(args);
23118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
23218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
233c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public boolean deliverNewSessionLocked(int callingPid, int callingUid, IBinder token,
23418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            IVoiceInteractionSession session, IVoiceInteractor interactor) {
235c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
236c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "deliverNewSession does not match active session");
237c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return false;
238c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
239c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mSession = session;
240c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.mInteractor = interactor;
241c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        return true;
242c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
243c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
244c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public int startVoiceActivityLocked(int callingPid, int callingUid, IBinder token,
245c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Intent intent, String resolvedType) {
24691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        try {
24718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mActiveSession == null || token != mActiveSession.mToken) {
248c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                Slog.w(TAG, "startVoiceActivity does not match active session");
24918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return ActivityManager.START_CANCELED;
25018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
251c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent = new Intent(intent);
252c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addCategory(Intent.CATEGORY_VOICE);
253c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
25491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
255c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn                    intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor,
2561b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    0, null, null, mUser);
25791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        } catch (RemoteException e) {
25891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            throw new IllegalStateException("Unexpected remote error", e);
25991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
26091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
26191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
262c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
263c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    public void finishLocked(int callingPid, int callingUid, IBinder token) {
264c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mActiveSession == null || token != mActiveSession.mToken) {
265c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            Slog.w(TAG, "finish does not match active session");
266c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            return;
267c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
268c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession.cancel();
269c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        mActiveSession = null;
270c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn    }
271c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn
27218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
27318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mValid) {
27418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print("  NOT VALID: ");
27518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mInfo == null) {
27618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println("no info");
27718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            } else {
27818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println(mInfo.getParseError());
27991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
28091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return;
28191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
28218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mComponent="); pw.println(mComponent.flattenToShortString());
28318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Session service="); pw.println(mInfo.getSessionService());
28418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Settings activity="); pw.println(mInfo.getSettingsActivity());
28518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mBound="); pw.print(mBound);  pw.print(" mService="); pw.println(mService);
28618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mActiveSession != null) {
28718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.println("  Active session:");
28818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.dump("    ", pw);
28918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
29018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
29118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
29218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    void startLocked() {
29318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
29418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        intent.setComponent(mComponent);
29518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mBound = mContext.bindServiceAsUser(intent, mConnection,
29691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                Context.BIND_AUTO_CREATE, new UserHandle(mUser));
29718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mBound) {
29818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Failed binding to voice interaction service " + mComponent);
29918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
30091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
30191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
30291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    void shutdownLocked() {
3038ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha        try {
3048ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha            if (mService != null) {
3058ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha                mService.shutdown();
3068ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha            }
3078ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha        } catch (RemoteException e) {
3088ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha            Slog.w(TAG, "RemoteException in shutdown", e);
3098ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha        }
3108ef360f34893771ee22a8ec7a1dc9c9aedc4b38cSandeep Siddhartha
31191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mBound) {
31291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mContext.unbindService(mConnection);
31391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mBound = false;
31491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
315c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        if (mValid) {
316c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn            mContext.unregisterReceiver(mBroadcastReceiver);
317c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        }
31891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
3196daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha
3206daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha    void notifySoundModelsChangedLocked() {
3216daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha        if (mService == null) {
3226daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha            Slog.w(TAG, "Not bound to voice interaction service " + mComponent);
3236daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha        }
3246daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha        try {
3256daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha            mService.soundModelsChanged();
3266daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha        } catch (RemoteException e) {
3276daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha            Slog.w(TAG, "RemoteException while calling soundModelsChanged", e);
3286daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha        }
3296daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha    }
33091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
331