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