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