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