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