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