PrintServiceInfo.java revision b669917825a49421ee79be4819ead765f5de8aae
1/* 2 * Copyright (C) 2013 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 17package android.printservice; 18 19import android.content.ComponentName; 20import android.content.Context; 21import android.content.pm.PackageManager; 22import android.content.pm.PackageManager.NameNotFoundException; 23import android.content.pm.ResolveInfo; 24import android.content.res.Resources; 25import android.content.res.TypedArray; 26import android.content.res.XmlResourceParser; 27import android.os.Parcel; 28import android.os.Parcelable; 29import android.util.AttributeSet; 30import android.util.Log; 31import android.util.Xml; 32 33import org.xmlpull.v1.XmlPullParser; 34import org.xmlpull.v1.XmlPullParserException; 35 36import java.io.IOException; 37 38/** 39 * This class describes a {@link PrintService}. A print service knows 40 * how to communicate with one or more printers over one or more protocols 41 * and exposes printers for use by the applications via the platform print 42 * APIs. 43 * 44 * @see PrintService 45 * @see android.print.PrintManager 46 * 47 * @hide 48 */ 49public final class PrintServiceInfo implements Parcelable { 50 51 private static final String LOG_TAG = PrintServiceInfo.class.getSimpleName(); 52 53 private static final String TAG_PRINT_SERVICE = "print-service"; 54 55 private final String mId; 56 57 private final ResolveInfo mResolveInfo; 58 59 private final String mSettingsActivityName; 60 61 private final String mAddPrintersActivityName; 62 63 /** 64 * Creates a new instance. 65 * 66 * @hide 67 */ 68 public PrintServiceInfo(Parcel parcel) { 69 mId = parcel.readString(); 70 mResolveInfo = parcel.readParcelable(null); 71 mSettingsActivityName = parcel.readString(); 72 mAddPrintersActivityName = parcel.readString(); 73 } 74 75 /** 76 * Creates a new instance. 77 * 78 * @param resolveInfo The service resolve info. 79 * @param settingsActivityName Optional settings activity name. 80 * @param addPrintersActivityName Optional add printers activity name. 81 */ 82 public PrintServiceInfo(ResolveInfo resolveInfo, String settingsActivityName, 83 String addPrintersActivityName) { 84 mId = new ComponentName(resolveInfo.serviceInfo.packageName, 85 resolveInfo.serviceInfo.name).flattenToString(); 86 mResolveInfo = resolveInfo; 87 mSettingsActivityName = settingsActivityName; 88 mAddPrintersActivityName = addPrintersActivityName; 89 } 90 91 /** 92 * Creates a new instance. 93 * 94 * @param resolveInfo The service resolve info. 95 * @param context Context for accessing resources. 96 * @throws XmlPullParserException If a XML parsing error occurs. 97 * @throws IOException If a I/O error occurs. 98 */ 99 public static PrintServiceInfo create(ResolveInfo resolveInfo, Context context) { 100 String settingsActivityName = null; 101 String addPrintersActivityName = null; 102 103 XmlResourceParser parser = null; 104 PackageManager packageManager = context.getPackageManager(); 105 parser = resolveInfo.serviceInfo.loadXmlMetaData(packageManager, 106 PrintService.SERVICE_META_DATA); 107 if (parser != null) { 108 try { 109 int type = 0; 110 while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { 111 type = parser.next(); 112 } 113 114 String nodeName = parser.getName(); 115 if (!TAG_PRINT_SERVICE.equals(nodeName)) { 116 Log.e(LOG_TAG, "Ignoring meta-data that does not start with " 117 + TAG_PRINT_SERVICE + " tag"); 118 } else { 119 Resources resources = packageManager.getResourcesForApplication( 120 resolveInfo.serviceInfo.applicationInfo); 121 AttributeSet allAttributes = Xml.asAttributeSet(parser); 122 TypedArray attributes = resources.obtainAttributes(allAttributes, 123 com.android.internal.R.styleable.PrintService); 124 125 settingsActivityName = attributes.getString( 126 com.android.internal.R.styleable.PrintService_settingsActivity); 127 128 addPrintersActivityName = attributes.getString( 129 com.android.internal.R.styleable.PrintService_addPrintersActivity); 130 131 attributes.recycle(); 132 } 133 } catch (IOException ioe) { 134 Log.w(LOG_TAG, "Error reading meta-data:" + ioe); 135 } catch (XmlPullParserException xppe) { 136 Log.w(LOG_TAG, "Error reading meta-data:" + xppe); 137 } catch (NameNotFoundException e) { 138 Log.e(LOG_TAG, "Unable to load resources for: " 139 + resolveInfo.serviceInfo.packageName); 140 } finally { 141 if (parser != null) { 142 parser.close(); 143 } 144 } 145 } 146 147 return new PrintServiceInfo(resolveInfo, settingsActivityName, addPrintersActivityName); 148 } 149 150 /** 151 * The accessibility service id. 152 * <p> 153 * <strong>Generated by the system.</strong> 154 * </p> 155 * 156 * @return The id. 157 */ 158 public String getId() { 159 return mId; 160 } 161 162 /** 163 * The service {@link ResolveInfo}. 164 * 165 * @return The info. 166 */ 167 public ResolveInfo getResolveInfo() { 168 return mResolveInfo; 169 } 170 171 /** 172 * The settings activity name. 173 * <p> 174 * <strong>Statically set from 175 * {@link PrintService#SERVICE_META_DATA meta-data}.</strong> 176 * </p> 177 * 178 * @return The settings activity name. 179 */ 180 public String getSettingsActivityName() { 181 return mSettingsActivityName; 182 } 183 184 /** 185 * The add printers activity name. 186 * <p> 187 * <strong>Statically set from 188 * {@link PrintService#SERVICE_META_DATA meta-data}.</strong> 189 * </p> 190 * 191 * @return The add printers activity name. 192 */ 193 public String getAddPrintersActivityName() { 194 return mAddPrintersActivityName; 195 } 196 197 /** 198 * {@inheritDoc} 199 */ 200 public int describeContents() { 201 return 0; 202 } 203 204 public void writeToParcel(Parcel parcel, int flagz) { 205 parcel.writeString(mId); 206 parcel.writeParcelable(mResolveInfo, 0); 207 parcel.writeString(mSettingsActivityName); 208 parcel.writeString(mAddPrintersActivityName); 209 } 210 211 @Override 212 public int hashCode() { 213 return 31 + ((mId == null) ? 0 : mId.hashCode()); 214 } 215 216 @Override 217 public boolean equals(Object obj) { 218 if (this == obj) { 219 return true; 220 } 221 if (obj == null) { 222 return false; 223 } 224 if (getClass() != obj.getClass()) { 225 return false; 226 } 227 PrintServiceInfo other = (PrintServiceInfo) obj; 228 if (mId == null) { 229 if (other.mId != null) { 230 return false; 231 } 232 } else if (!mId.equals(other.mId)) { 233 return false; 234 } 235 return true; 236 } 237 238 @Override 239 public String toString() { 240 StringBuilder builder = new StringBuilder(); 241 builder.append("PrintServiceInfo{"); 242 builder.append("id=").append(mId); 243 builder.append(", resolveInfo=").append(mResolveInfo); 244 builder.append(", settingsActivityName=").append(mSettingsActivityName); 245 builder.append(", addPrintersActivityName=").append(mAddPrintersActivityName); 246 builder.append("}"); 247 return builder.toString(); 248 } 249 250 public static final Parcelable.Creator<PrintServiceInfo> CREATOR = 251 new Parcelable.Creator<PrintServiceInfo>() { 252 public PrintServiceInfo createFromParcel(Parcel parcel) { 253 return new PrintServiceInfo(parcel); 254 } 255 256 public PrintServiceInfo[] newArray(int size) { 257 return new PrintServiceInfo[size]; 258 } 259 }; 260} 261