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