Home | History | Annotate | Download | only in voice
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.service.voice;
     18 
     19 import android.Manifest;
     20 import android.app.AppGlobals;
     21 import android.content.ComponentName;
     22 import android.content.pm.PackageManager;
     23 import android.content.pm.ServiceInfo;
     24 import android.content.res.Resources;
     25 import android.content.res.TypedArray;
     26 import android.content.res.XmlResourceParser;
     27 import android.os.RemoteException;
     28 import android.util.AttributeSet;
     29 import android.util.Log;
     30 import android.util.Xml;
     31 import org.xmlpull.v1.XmlPullParser;
     32 import org.xmlpull.v1.XmlPullParserException;
     33 
     34 import java.io.IOException;
     35 
     36 /** @hide */
     37 public class VoiceInteractionServiceInfo {
     38     static final String TAG = "VoiceInteractionServiceInfo";
     39 
     40     private String mParseError;
     41 
     42     private ServiceInfo mServiceInfo;
     43     private String mSessionService;
     44     private String mRecognitionService;
     45     private String mSettingsActivity;
     46     private boolean mSupportsAssist;
     47     private boolean mSupportsLaunchFromKeyguard;
     48     private boolean mSupportsLocalInteraction;
     49 
     50     public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp)
     51             throws PackageManager.NameNotFoundException {
     52         this(pm, pm.getServiceInfo(comp, PackageManager.GET_META_DATA));
     53     }
     54 
     55     public VoiceInteractionServiceInfo(PackageManager pm, ComponentName comp, int userHandle)
     56             throws PackageManager.NameNotFoundException {
     57         this(pm, getServiceInfoOrThrow(comp, userHandle));
     58     }
     59 
     60     static ServiceInfo getServiceInfoOrThrow(ComponentName comp, int userHandle)
     61             throws PackageManager.NameNotFoundException {
     62         try {
     63             ServiceInfo si = AppGlobals.getPackageManager().getServiceInfo(comp,
     64                     PackageManager.GET_META_DATA
     65                             | PackageManager.MATCH_DIRECT_BOOT_AWARE
     66                             | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
     67                             | PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
     68                     userHandle);
     69             if (si != null) {
     70                 return si;
     71             }
     72         } catch (RemoteException e) {
     73         }
     74         throw new PackageManager.NameNotFoundException(comp.toString());
     75     }
     76 
     77     public VoiceInteractionServiceInfo(PackageManager pm, ServiceInfo si) {
     78         if (si == null) {
     79             mParseError = "Service not available";
     80             return;
     81         }
     82         if (!Manifest.permission.BIND_VOICE_INTERACTION.equals(si.permission)) {
     83             mParseError = "Service does not require permission "
     84                     + Manifest.permission.BIND_VOICE_INTERACTION;
     85             return;
     86         }
     87 
     88         XmlResourceParser parser = null;
     89         try {
     90             parser = si.loadXmlMetaData(pm, VoiceInteractionService.SERVICE_META_DATA);
     91             if (parser == null) {
     92                 mParseError = "No " + VoiceInteractionService.SERVICE_META_DATA
     93                         + " meta-data for " + si.packageName;
     94                 return;
     95             }
     96 
     97             Resources res = pm.getResourcesForApplication(si.applicationInfo);
     98 
     99             AttributeSet attrs = Xml.asAttributeSet(parser);
    100 
    101             int type;
    102             while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
    103                     && type != XmlPullParser.START_TAG) {
    104             }
    105 
    106             String nodeName = parser.getName();
    107             if (!"voice-interaction-service".equals(nodeName)) {
    108                 mParseError = "Meta-data does not start with voice-interaction-service tag";
    109                 return;
    110             }
    111 
    112             TypedArray array = res.obtainAttributes(attrs,
    113                     com.android.internal.R.styleable.VoiceInteractionService);
    114             mSessionService = array.getString(
    115                     com.android.internal.R.styleable.VoiceInteractionService_sessionService);
    116             mRecognitionService = array.getString(
    117                     com.android.internal.R.styleable.VoiceInteractionService_recognitionService);
    118             mSettingsActivity = array.getString(
    119                     com.android.internal.R.styleable.VoiceInteractionService_settingsActivity);
    120             mSupportsAssist = array.getBoolean(
    121                     com.android.internal.R.styleable.VoiceInteractionService_supportsAssist,
    122                     false);
    123             mSupportsLaunchFromKeyguard = array.getBoolean(com.android.internal.
    124                     R.styleable.VoiceInteractionService_supportsLaunchVoiceAssistFromKeyguard,
    125                     false);
    126             mSupportsLocalInteraction = array.getBoolean(com.android.internal.
    127                     R.styleable.VoiceInteractionService_supportsLocalInteraction, false);
    128             array.recycle();
    129             if (mSessionService == null) {
    130                 mParseError = "No sessionService specified";
    131                 return;
    132             }
    133             if (mRecognitionService == null) {
    134                 mParseError = "No recognitionService specified";
    135                 return;
    136             }
    137         } catch (XmlPullParserException e) {
    138             mParseError = "Error parsing voice interation service meta-data: " + e;
    139             Log.w(TAG, "error parsing voice interaction service meta-data", e);
    140             return;
    141         } catch (IOException e) {
    142             mParseError = "Error parsing voice interation service meta-data: " + e;
    143             Log.w(TAG, "error parsing voice interaction service meta-data", e);
    144             return;
    145         } catch (PackageManager.NameNotFoundException e) {
    146             mParseError = "Error parsing voice interation service meta-data: " + e;
    147             Log.w(TAG, "error parsing voice interaction service meta-data", e);
    148             return;
    149         } finally {
    150             if (parser != null) parser.close();
    151         }
    152         mServiceInfo = si;
    153     }
    154 
    155     public String getParseError() {
    156         return mParseError;
    157     }
    158 
    159     public ServiceInfo getServiceInfo() {
    160         return mServiceInfo;
    161     }
    162 
    163     public String getSessionService() {
    164         return mSessionService;
    165     }
    166 
    167     public String getRecognitionService() {
    168         return mRecognitionService;
    169     }
    170 
    171     public String getSettingsActivity() {
    172         return mSettingsActivity;
    173     }
    174 
    175     public boolean getSupportsAssist() {
    176         return mSupportsAssist;
    177     }
    178 
    179     public boolean getSupportsLaunchFromKeyguard() {
    180         return mSupportsLaunchFromKeyguard;
    181     }
    182 
    183     public boolean getSupportsLocalInteraction() {
    184         return mSupportsLocalInteraction;
    185     }
    186 }
    187