VoiceInteractionManagerServiceImpl.java revision 18f0d357f9693fe787a3e3777d8fdf01357a6e3f
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;
2291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.ComponentName;
2391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Context;
2491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Intent;
2591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.ServiceConnection;
2691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.pm.PackageManager;
2791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.pm.ServiceInfo;
2818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Binder;
2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Bundle;
3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.Handler;
3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.IBinder;
3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.RemoteException;
3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.os.UserHandle;
3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionService;
3591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
3618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.IVoiceInteractionSessionService;
3791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.VoiceInteractionService;
3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.service.voice.VoiceInteractionServiceInfo;
3991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Slog;
4091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
4191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.FileDescriptor;
4318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.PrintWriter;
4418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornclass VoiceInteractionManagerServiceImpl {
4691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final static String TAG = "VoiceInteractionServiceManager";
4791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final boolean mValid;
4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
5091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Context mContext;
5191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Handler mHandler;
5291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final Object mLock;
5391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final int mUser;
5491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final ComponentName mComponent;
5591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final IActivityManager mAm;
5618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final VoiceInteractionServiceInfo mInfo;
5718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final ComponentName mSessionComponentName;
5891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    boolean mBound = false;
5991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    IVoiceInteractionService mService;
6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    SessionConnection mActiveSession;
6291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
6391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    final ServiceConnection mConnection = new ServiceConnection() {
6491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
6591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
6691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            synchronized (mLock) {
6791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                mService = IVoiceInteractionService.Stub.asInterface(service);
6891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
6991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
7091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
7191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        @Override
7291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
7391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mService = null;
7491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
7591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    };
7691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    final class SessionConnection implements ServiceConnection {
7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final IBinder mToken = new Binder();
7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final Intent mIntent;
8018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final String mResolvedType;
8118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        final Bundle mArgs;
8218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        boolean mBound;
8318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSessionService mService;
8418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractionSession mSession;
8518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        IVoiceInteractor mInteractor;
8618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
8718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        SessionConnection(Intent intent, String resolvedType, Bundle args) {
8818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mIntent = intent;
8918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mResolvedType = resolvedType;
9018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mArgs = args;
9118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Intent serviceIntent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
9218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            serviceIntent.setComponent(mSessionComponentName);
9318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mBound = mContext.bindServiceAsUser(serviceIntent, this,
9418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    Context.BIND_AUTO_CREATE, new UserHandle(mUser));
9518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (!mBound) {
9618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                Slog.w(TAG, "Failed binding to voice interaction session service " + mComponent);
9718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
9818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
9918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
10018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
10118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
10218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            synchronized (mLock) {
10318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = IVoiceInteractionSessionService.Stub.asInterface(service);
10418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                if (mActiveSession == this) {
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    try {
10618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        mService.newSession(mToken, mArgs);
10718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    } catch (RemoteException e) {
10818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        Slog.w(TAG, "Failed making new session", e);
10918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    }
11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                }
11118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
11218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
11318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        @Override
11518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void onServiceDisconnected(ComponentName name) {
11618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mService = null;
11718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
11818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
11918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void cancel() {
12018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
12118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mContext.unbindService(this);
12218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mBound = false;
12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mService = null;
12418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mSession = null;
12518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInteractor = null;
12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        public void dump(String prefix, PrintWriter pw) {
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mIntent="); pw.println(mIntent);
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    pw.print(" mResolvedType="); pw.println(mResolvedType);
13318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mArgs="); pw.println(mArgs);
13418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print(prefix); pw.print("mBound="); pw.println(mBound);
13518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mBound) {
13618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mService="); pw.println(mService);
13718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mSession="); pw.println(mSession);
13818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.print(prefix); pw.print("mInteractor="); pw.println(mInteractor);
13918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
14018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
14118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    };
14218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
14391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    VoiceInteractionManagerServiceImpl(Context context, Handler handler, Object lock,
14491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int userHandle, ComponentName service) {
14591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mContext = context;
14691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mHandler = handler;
14791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mLock = lock;
14891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mUser = userHandle;
14991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mComponent = service;
15091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        mAm = ActivityManagerNative.getDefault();
15118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        VoiceInteractionServiceInfo info;
15218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
15318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            info = new VoiceInteractionServiceInfo(context.getPackageManager(), service);
15418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
15518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Voice interaction service not found: " + service);
15618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mInfo = null;
15718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
15818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
15918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
16091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mInfo = info;
16218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mInfo.getParseError() != null) {
16318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Bad voice interaction service: " + mInfo.getParseError());
16418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionComponentName = null;
16518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mValid = false;
16618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
16791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
16818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mValid = true;
16918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mSessionComponentName = new ComponentName(service.getPackageName(),
17018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mInfo.getSessionService());
17118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
17218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
17318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public void startVoiceActivityLocked(int callingPid, int callingUid, Intent intent,
17418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            String resolvedType, Bundle args) {
17591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mActiveSession != null) {
17618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.cancel();
17718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession = null;
17891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
17918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mActiveSession = new SessionConnection(intent, resolvedType, args);
18091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        intent.addCategory(Intent.CATEGORY_VOICE);
18191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
18218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
18318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
18418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public int deliverNewSessionLocked(int callingPid, int callingUid, IBinder token,
18518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            IVoiceInteractionSession session, IVoiceInteractor interactor) {
18691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        try {
18718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mActiveSession == null || token != mActiveSession.mToken) {
18818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                Slog.w(TAG, "deliverNewSession does not match active session");
18918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return ActivityManager.START_CANCELED;
19018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
19118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.mSession = session;
19218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.mInteractor = interactor;
19391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
19418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    mActiveSession.mIntent, mActiveSession.mResolvedType,
19518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    mActiveSession.mSession, mActiveSession.mInteractor,
19691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    0, null, null, null, mUser);
19791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        } catch (RemoteException e) {
19891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            throw new IllegalStateException("Unexpected remote error", e);
19991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
20091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
20191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
20218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
20318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mValid) {
20418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.print("  NOT VALID: ");
20518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mInfo == null) {
20618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println("no info");
20718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            } else {
20818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                pw.println(mInfo.getParseError());
20991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
21091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return;
21191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
21218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mComponent="); pw.println(mComponent.flattenToShortString());
21318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Session service="); pw.println(mInfo.getSessionService());
21418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  Settings activity="); pw.println(mInfo.getSettingsActivity());
21518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        pw.print("  mBound="); pw.print(mBound);  pw.print(" mService="); pw.println(mService);
21618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (mActiveSession != null) {
21718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            pw.println("  Active session:");
21818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mActiveSession.dump("    ", pw);
21918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
22018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
22118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
22218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    void startLocked() {
22318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
22418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        intent.setComponent(mComponent);
22518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mBound = mContext.bindServiceAsUser(intent, mConnection,
22691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                Context.BIND_AUTO_CREATE, new UserHandle(mUser));
22718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!mBound) {
22818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Slog.w(TAG, "Failed binding to voice interaction service " + mComponent);
22918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
23091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
23191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
23291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    void shutdownLocked() {
23391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (mBound) {
23491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mContext.unbindService(mConnection);
23591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            mBound = false;
23691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
23791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    }
23891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn}
239