VoiceInteractionSessionService.java revision 1e38382b542f5cef9957a89692b02c55a3dd351c
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; 221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackbornimport android.content.res.Configuration; 2318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Bundle; 2418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.IBinder; 2518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Looper; 2618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.Message; 2718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.RemoteException; 2818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.os.ServiceManager; 2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.app.IVoiceInteractionManagerService; 3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.os.HandlerCaller; 3118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport com.android.internal.os.SomeArgs; 3218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 33c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn/** 34c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * An active voice interaction session, initiated by a {@link VoiceInteractionService}. 35c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 3618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpublic abstract class VoiceInteractionSessionService extends Service { 3718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn static final int MSG_NEW_SESSION = 1; 3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionManagerService mSystemService; 41c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession mSession; 4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionSessionService mInterface = new IVoiceInteractionSessionService.Stub() { 44ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void newSession(IBinder token, Bundle args, int startFlags) { 45ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_NEW_SESSION, 46ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn startFlags, token, args)); 4718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn HandlerCaller mHandlerCaller; 5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { 5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 5418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void executeMessage(Message msg) { 5518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn SomeArgs args = (SomeArgs)msg.obj; 5618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn switch (msg.what) { 5718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn case MSG_NEW_SESSION: 58ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn doNewSession((IBinder)args.arg1, (Bundle)args.arg2, args.argi1); 5918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn break; 6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void onCreate() { 6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn super.onCreate(); 6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mSystemService = IVoiceInteractionManagerService.Stub.asInterface( 6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); 6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCaller = new HandlerCaller(this, Looper.myLooper(), 7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCallerCallback, true); 7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public abstract VoiceInteractionSession onNewSession(Bundle args); 7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public IBinder onBind(Intent intent) { 7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn return mInterface.asBinder(); 7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onConfigurationChanged(newConfig); 831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onConfigurationChanged(newConfig); 851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 891e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 901e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onLowMemory(); 911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 921e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onLowMemory(); 931e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 941e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 951e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 961e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 971e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 981e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onTrimMemory(level); 991e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 1001e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onTrimMemory(level); 1011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 1021e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 1031e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 104ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn void doNewSession(IBinder token, Bundle args, int startFlags) { 105c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mSession != null) { 106c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession.doDestroy(); 107c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = null; 108c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 109c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = onNewSession(args); 11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn try { 111c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor); 112ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mSession.doCreate(mSystemService, token, args, startFlags); 11318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } catch (RemoteException e) { 11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 11518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 11618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn} 117