VoiceInteractionServiceInfo.java revision fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7
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;
2018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.ComponentName;
2118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.pm.PackageManager;
2218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.pm.ServiceInfo;
2318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.Resources;
2418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.TypedArray;
2518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.content.res.XmlResourceParser;
2618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.speech.RecognitionService;
2718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.AttributeSet;
2818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.Log;
2918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport android.util.Xml;
3018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport org.xmlpull.v1.XmlPullParser;
3118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
3218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
3318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornimport java.io.IOException;
3418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
3518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn/** @hide */
3618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackbornpublic class VoiceInteractionServiceInfo {
3718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    static final String TAG = "VoiceInteractionServiceInfo";
3818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
3918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mParseError;
4018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private ServiceInfo mServiceInfo;
4218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mSessionService;
43fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    private String mRecognitionService;
4418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    private String mSettingsActivity;
4518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp)
4718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            throws PackageManager.NameNotFoundException {
4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        this(pm, pm.getServiceInfo(comp, PackageManager.GET_META_DATA));
4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ServiceInfo si) {
5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!Manifest.permission.BIND_VOICE_INTERACTION.equals(si.permission)) {
5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Service does not require permission "
5418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    + Manifest.permission.BIND_VOICE_INTERACTION;
5518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
5618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
5718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
5818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        XmlResourceParser parser = null;
5918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            parser = si.loadXmlMetaData(pm, VoiceInteractionService.SERVICE_META_DATA);
6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser == null) {
6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No " + VoiceInteractionService.SERVICE_META_DATA
6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        + " meta-data for " + si.packageName;
6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Resources res = pm.getResourcesForApplication(si.applicationInfo);
6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            int type;
7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    && type != XmlPullParser.START_TAG) {
7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            String nodeName = parser.getName();
7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (!"voice-interaction-service".equals(nodeName)) {
7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "Meta-data does not start with voice-interaction-service tag";
7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
8018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
8118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
8218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            TypedArray array = res.obtainAttributes(attrs,
8318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService);
8418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionService = array.getString(
8518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_sessionService);
86fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            mRecognitionService = array.getString(
87fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_recognitionService);
8818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSettingsActivity = array.getString(
8918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_settingsActivity);
9018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            array.recycle();
9118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mSessionService == null) {
9218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No sessionService specified";
9318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
9418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
9518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (XmlPullParserException e) {
9618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
9718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
9818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
9918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (IOException e) {
10018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
10118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
10218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
10318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
10418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
10618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
10718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } finally {
10818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser != null) parser.close();
10918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
11018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mServiceInfo = si;
11118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
11218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
11318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getParseError() {
11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mParseError;
11518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
11618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
11718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public ServiceInfo getServiceInfo() {
11818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mServiceInfo;
11918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
12018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
12118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSessionService() {
12218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSessionService;
12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
12418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
125fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    public String getRecognitionService() {
126fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        return mRecognitionService;
127fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    }
128fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSettingsActivity() {
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSettingsActivity;
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn}
133