VoiceInteractionServiceInfo.java revision 0b68ff45125e449dd0b4120f530240093aa6253e
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.Manifest;
20a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackbornimport android.app.AppGlobals;
2118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.ComponentName;
2218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.pm.PackageManager;
2318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.pm.ServiceInfo;
2418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.Resources;
2518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.TypedArray;
2618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.XmlResourceParser;
27a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackbornimport android.os.RemoteException;
2818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.AttributeSet;
2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.Log;
3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.Xml;
3118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport org.xmlpull.v1.XmlPullParser;
3218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
3318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
3418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.IOException;
3518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
3618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn/** @hide */
3718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpublic class VoiceInteractionServiceInfo {
3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    static final String TAG = "VoiceInteractionServiceInfo";
3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mParseError;
4118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private ServiceInfo mServiceInfo;
4318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mSessionService;
44fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    private String mRecognitionService;
4518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mSettingsActivity;
460b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi    private boolean mSupportsAssistGesture;
4718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp)
4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            throws PackageManager.NameNotFoundException {
5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        this(pm, pm.getServiceInfo(comp, PackageManager.GET_META_DATA));
5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
53a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp, int userHandle)
54a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn            throws PackageManager.NameNotFoundException, RemoteException {
55a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn        this(pm, AppGlobals.getPackageManager().getServiceInfo(comp,
56a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn                PackageManager.GET_META_DATA, userHandle));
57a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn    }
58a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn
5918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ServiceInfo si) {
6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!Manifest.permission.BIND_VOICE_INTERACTION.equals(si.permission)) {
6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Service does not require permission "
6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    + Manifest.permission.BIND_VOICE_INTERACTION;
6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        XmlResourceParser parser = null;
6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            parser = si.loadXmlMetaData(pm, VoiceInteractionService.SERVICE_META_DATA);
6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser == null) {
7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No " + VoiceInteractionService.SERVICE_META_DATA
7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        + " meta-data for " + si.packageName;
7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Resources res = pm.getResourcesForApplication(si.applicationInfo);
7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            int type;
8018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
8118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    && type != XmlPullParser.START_TAG) {
8218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
8318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
8418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            String nodeName = parser.getName();
8518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (!"voice-interaction-service".equals(nodeName)) {
8618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "Meta-data does not start with voice-interaction-service tag";
8718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
8818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
8918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
9018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            TypedArray array = res.obtainAttributes(attrs,
9118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService);
9218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionService = array.getString(
9318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_sessionService);
94fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            mRecognitionService = array.getString(
95fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_recognitionService);
9618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSettingsActivity = array.getString(
9718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_settingsActivity);
980b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi            mSupportsAssistGesture = array.getBoolean(
990b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi                    com.android.internal.R.styleable.VoiceInteractionService_supportsAssistGesture,
1000b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi                    false);
10118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            array.recycle();
10218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mSessionService == null) {
10318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No sessionService specified";
10418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
106ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            if (mRecognitionService == null) {
107ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                mParseError = "No recognitionService specified";
108ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                return;
109ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            }
11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (XmlPullParserException e) {
11118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
11218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
11318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (IOException e) {
11518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
11618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
11718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
11818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
11918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
12018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
12118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
12218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } finally {
12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser != null) parser.close();
12418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
12518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mServiceInfo = si;
12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getParseError() {
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mParseError;
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public ServiceInfo getServiceInfo() {
13318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mServiceInfo;
13418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
13618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSessionService() {
13718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSessionService;
13818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
140fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    public String getRecognitionService() {
141fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        return mRecognitionService;
142fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    }
143fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn
14418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSettingsActivity() {
14518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSettingsActivity;
14618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
1470b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi
1480b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi    public boolean getSupportsAssistGesture() {
1490b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi        return mSupportsAssistGesture;
1500b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi    }
15118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn}
152