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