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