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