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;
465f560d056243638a83a4e7770035fdb66004c9d7Jorim Jaggi    private boolean mSupportsAssist;
47e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek    private boolean mSupportsLaunchFromKeyguard;
4818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
4918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp)
5018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            throws PackageManager.NameNotFoundException {
5118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        this(pm, pm.getServiceInfo(comp, PackageManager.GET_META_DATA));
5218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
5318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
54a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp, int userHandle)
55a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn            throws PackageManager.NameNotFoundException, RemoteException {
56a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn        this(pm, AppGlobals.getPackageManager().getServiceInfo(comp,
57a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn                PackageManager.GET_META_DATA, userHandle));
58a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn    }
59a351ab96987381ffe7ea29a7cdec1e7fbd1497d5Dianne Hackborn
6018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public VoiceInteractionServiceInfo(PackageManager pm, ServiceInfo si) {
6118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        if (!Manifest.permission.BIND_VOICE_INTERACTION.equals(si.permission)) {
6218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Service does not require permission "
6318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    + Manifest.permission.BIND_VOICE_INTERACTION;
6418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
6518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
6618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
6718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        XmlResourceParser parser = null;
6818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        try {
6918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            parser = si.loadXmlMetaData(pm, VoiceInteractionService.SERVICE_META_DATA);
7018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser == null) {
7118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No " + VoiceInteractionService.SERVICE_META_DATA
7218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                        + " meta-data for " + si.packageName;
7318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
7418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
7518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Resources res = pm.getResourcesForApplication(si.applicationInfo);
7718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
7818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
7918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
8018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            int type;
8118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
8218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    && type != XmlPullParser.START_TAG) {
8318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
8418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
8518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            String nodeName = parser.getName();
8618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (!"voice-interaction-service".equals(nodeName)) {
8718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "Meta-data does not start with voice-interaction-service tag";
8818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
8918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
9018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
9118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            TypedArray array = res.obtainAttributes(attrs,
9218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService);
9318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSessionService = array.getString(
9418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_sessionService);
95fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            mRecognitionService = array.getString(
96fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_recognitionService);
9718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mSettingsActivity = array.getString(
9818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                    com.android.internal.R.styleable.VoiceInteractionService_settingsActivity);
995f560d056243638a83a4e7770035fdb66004c9d7Jorim Jaggi            mSupportsAssist = array.getBoolean(
1005f560d056243638a83a4e7770035fdb66004c9d7Jorim Jaggi                    com.android.internal.R.styleable.VoiceInteractionService_supportsAssist,
1010b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi                    false);
102e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek            mSupportsLaunchFromKeyguard = array.getBoolean(com.android.internal.
103e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek                    R.styleable.VoiceInteractionService_supportsLaunchVoiceAssistFromKeyguard,
104e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek                    false);
10518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            array.recycle();
10618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (mSessionService == null) {
10718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                mParseError = "No sessionService specified";
10818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn                return;
10918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            }
110ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            if (mRecognitionService == null) {
111ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                mParseError = "No recognitionService specified";
112ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn                return;
113ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn            }
11418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } catch (XmlPullParserException 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 (IOException 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        } catch (PackageManager.NameNotFoundException e) {
12318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            mParseError = "Error parsing voice interation service meta-data: " + e;
12418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            Log.w(TAG, "error parsing voice interaction service meta-data", e);
12518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            return;
12618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        } finally {
12718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn            if (parser != null) parser.close();
12818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        }
12918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        mServiceInfo = si;
13018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
13218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getParseError() {
13318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mParseError;
13418f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13518f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
13618f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public ServiceInfo getServiceInfo() {
13718f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mServiceInfo;
13818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
13918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
14018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSessionService() {
14118f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSessionService;
14218f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
14318f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn
144fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    public String getRecognitionService() {
145fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        return mRecognitionService;
146fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    }
147fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn
14818f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    public String getSettingsActivity() {
14918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn        return mSettingsActivity;
15018f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn    }
1510b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi
1525f560d056243638a83a4e7770035fdb66004c9d7Jorim Jaggi    public boolean getSupportsAssist() {
1535f560d056243638a83a4e7770035fdb66004c9d7Jorim Jaggi        return mSupportsAssist;
1540b68ff45125e449dd0b4120f530240093aa6253eJorim Jaggi    }
155e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek
156e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek    public boolean getSupportsLaunchFromKeyguard() {
157e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek        return mSupportsLaunchFromKeyguard;
158e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek    }
15918f0d357f9693fe787a3e3777d8fdf01357a6e3fDianne Hackborn}
160