118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn/** 218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * Copyright (C) 2014 The Android Open Source Project 318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * 418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * you may not use this file except in compliance with the License. 618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * You may obtain a copy of the License at 718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * 818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * 1018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * See the License for the specific language governing permissions and 1418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn * limitations under the License. 1518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn */ 1618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 1718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpackage android.service.voice; 1818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 1918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.app.Service; 2018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.Context; 2118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.Intent; 2218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Bundle; 2318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.IBinder; 2418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Looper; 2518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Message; 2618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.RemoteException; 2718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.ServiceManager; 2818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.os.HandlerCaller; 3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.os.SomeArgs; 3118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 32c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn/** 33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * An active voice interaction session, initiated by a {@link VoiceInteractionService}. 34c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 3518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpublic abstract class VoiceInteractionSessionService extends Service { 3618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 3718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn static final int MSG_NEW_SESSION = 1; 3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionManagerService mSystemService; 40c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession mSession; 4118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionSessionService mInterface = new IVoiceInteractionSessionService.Stub() { 4318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void newSession(IBinder token, Bundle args) { 4418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOO(MSG_NEW_SESSION, 4518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn token, args)); 4618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn HandlerCaller mHandlerCaller; 5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { 5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void executeMessage(Message msg) { 5418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn SomeArgs args = (SomeArgs)msg.obj; 5518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn switch (msg.what) { 5618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn case MSG_NEW_SESSION: 5718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn doNewSession((IBinder)args.arg1, (Bundle)args.arg2); 5818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn break; 5918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void onCreate() { 6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn super.onCreate(); 6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mSystemService = IVoiceInteractionManagerService.Stub.asInterface( 6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); 6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCaller = new HandlerCaller(this, Looper.myLooper(), 6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCallerCallback, true); 7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public abstract VoiceInteractionSession onNewSession(Bundle args); 7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public IBinder onBind(Intent intent) { 7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn return mInterface.asBinder(); 7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn void doNewSession(IBinder token, Bundle args) { 80c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mSession != null) { 81c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession.doDestroy(); 82c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = null; 83c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 84c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = onNewSession(args); 8518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn try { 86c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor); 87c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession.doCreate(mSystemService, token, args); 8818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } catch (RemoteException e) { 8918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 9018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 9118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn} 92