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