VoiceInteractionSessionService.java revision ae6688b09649447e57468b3e7935691bc09ec9b9
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/** 265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2014 The Android Open Source Project 365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License. 665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at 765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software 1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and 1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License. 1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpackage android.service.voice; 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.app.Service; 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.content.Context; 2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.content.Intent; 2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.os.Bundle; 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.os.IBinder; 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.os.Looper; 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.os.Message; 2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport android.os.RemoteException; 279ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wangimport android.os.ServiceManager; 2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport com.android.internal.app.IVoiceInteractionManagerService; 2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport com.android.internal.os.HandlerCaller; 3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianimport com.android.internal.os.SomeArgs; 3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/** 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * An active voice interaction session, initiated by a {@link VoiceInteractionService}. 3438ccae2c0324daa305f3fe77d25fdf5edec0b0e1Eric Laurent */ 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic abstract class VoiceInteractionSessionService extends Service { 36fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static final int MSG_NEW_SESSION = 1; 38f6b1678f8f508b447155a81b44e214475ab634a8Glenn Kasten 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian IVoiceInteractionManagerService mSystemService; 409ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang VoiceInteractionSession mSession; 4125b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian IVoiceInteractionSessionService mInterface = new IVoiceInteractionSessionService.Stub() { 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public void newSession(IBinder token, Bundle args, int startFlags) { 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_NEW_SESSION, 45fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin startFlags, token, args)); 4664760240f931714858a59c1579f07264d7182ba2Dima Zavin 477394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin } 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian HandlerCaller mHandlerCaller; 5144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian @Override 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public void executeMessage(Message msg) { 546d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent SomeArgs args = (SomeArgs)msg.obj; 5559bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent switch (msg.what) { 5659bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent case MSG_NEW_SESSION: 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian doNewSession((IBinder)args.arg1, (Bundle)args.arg2, args.argi1); 583b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten break; 593b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten } 604d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten } 61feb0db689c17dced50afaee54c659f1676e2d505Eric Laurent }; 624d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten 634d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten @Override 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public void onCreate() { 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian super.onCreate(); 66de070137f11d346fba77605bd76a44c040a618fcEric Laurent mSystemService = IVoiceInteractionManagerService.Stub.asInterface( 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); 6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mHandlerCaller = new HandlerCaller(this, Looper.myLooper(), 69ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten mHandlerCallerCallback, true); 70ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten } 7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public abstract VoiceInteractionSession onNewSession(Bundle args); 7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 74b1cf75c4935001f61057989ee3cf27bbf09ecd9cGlenn Kasten @Override 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public IBinder onBind(Intent intent) { 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return mInterface.asBinder(); 7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void doNewSession(IBinder token, Bundle args, int startFlags) { 8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (mSession != null) { 8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mSession.doDestroy(); 8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mSession = null; 8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mSession = onNewSession(args); 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian try { 867dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor); 8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mSession.doCreate(mSystemService, token, args, startFlags); 887dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten } catch (RemoteException e) { 897dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten } 9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 917c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent} 927c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent