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 3357dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.FileDescriptor; 3457dd737443a174379eb638450e4888500d8e4a23Dianne Hackbornimport java.io.PrintWriter; 3557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 36c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn/** 37c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn * An active voice interaction session, initiated by a {@link VoiceInteractionService}. 38c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn */ 3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpublic abstract class VoiceInteractionSessionService extends Service { 4018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn static final int MSG_NEW_SESSION = 1; 4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionManagerService mSystemService; 44c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn VoiceInteractionSession mSession; 4518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 4618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn IVoiceInteractionSessionService mInterface = new IVoiceInteractionSessionService.Stub() { 47ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void newSession(IBinder token, Bundle args, int startFlags) { 48ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIOO(MSG_NEW_SESSION, 49ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn startFlags, token, args)); 5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 5418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn HandlerCaller mHandlerCaller; 5518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { 5618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 5718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void executeMessage(Message msg) { 5818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn SomeArgs args = (SomeArgs)msg.obj; 5918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn switch (msg.what) { 6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn case MSG_NEW_SESSION: 61ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn doNewSession((IBinder)args.arg1, (Bundle)args.arg2, args.argi1); 6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn break; 6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn }; 6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public void onCreate() { 6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn super.onCreate(); 7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mSystemService = IVoiceInteractionManagerService.Stub.asInterface( 7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); 7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCaller = new HandlerCaller(this, Looper.myLooper(), 7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn mHandlerCallerCallback, true); 7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public abstract VoiceInteractionSession onNewSession(Bundle args); 7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn @Override 7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn public IBinder onBind(Intent intent) { 8018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn return mInterface.asBinder(); 8118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 8218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn 831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onConfigurationChanged(newConfig); 861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onConfigurationChanged(newConfig); 881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 891e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 901e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 921e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onLowMemory() { 931e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onLowMemory(); 941e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 951e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onLowMemory(); 961e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 971e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 981e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 991e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn @Override 1001e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void onTrimMemory(int level) { 1011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn super.onTrimMemory(level); 1021e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mSession != null) { 1031e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mSession.onTrimMemory(level); 1041e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 1051e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 1061e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 10757dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn @Override 10857dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 10957dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn if (mSession == null) { 11057dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println("(no active session)"); 11157dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } else { 11257dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn writer.println("VoiceInteractionSession:"); 11357dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn mSession.dump(" ", fd, writer, args); 11457dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 11557dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn } 11657dd737443a174379eb638450e4888500d8e4a23Dianne Hackborn 117ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn void doNewSession(IBinder token, Bundle args, int startFlags) { 118c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn if (mSession != null) { 119c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession.doDestroy(); 120c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = null; 121c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn } 122c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSession = onNewSession(args); 12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn try { 124c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor); 125593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn mSession.doCreate(mSystemService, token); 12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } catch (RemoteException e) { 12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn } 12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn} 130