ApduServiceInfopublic final class ApduServiceInfo extends Object implements android.os.Parcelable
Fields Summary |
---|
static final String | TAG | final android.content.pm.ResolveInfo | mServiceThe service that implements this | final String | mDescriptionDescription of the service | final boolean | mOnHostWhether this service represents AIDs running on the host CPU | final HashMap | mStaticAidGroupsMapping from category to static AID group | final HashMap | mDynamicAidGroupsMapping from category to dynamic AID group | final boolean | mRequiresDeviceUnlockWhether this service should only be started when the device is unlocked. | final int | mBannerResourceIdThe id of the service banner specified in XML. | final int | mUidThe uid of the package the service belongs to | public static final Parcelable.Creator | CREATOR |
Constructors Summary |
---|
public ApduServiceInfo(android.content.pm.ResolveInfo info, boolean onHost, String description, ArrayList staticAidGroups, ArrayList dynamicAidGroups, boolean requiresUnlock, int bannerResource, int uid)
this.mService = info;
this.mDescription = description;
this.mStaticAidGroups = new HashMap<String, AidGroup>();
this.mDynamicAidGroups = new HashMap<String, AidGroup>();
this.mOnHost = onHost;
this.mRequiresDeviceUnlock = requiresUnlock;
for (AidGroup aidGroup : staticAidGroups) {
this.mStaticAidGroups.put(aidGroup.category, aidGroup);
}
for (AidGroup aidGroup : dynamicAidGroups) {
this.mDynamicAidGroups.put(aidGroup.category, aidGroup);
}
this.mBannerResourceId = bannerResource;
this.mUid = uid;
| public ApduServiceInfo(android.content.pm.PackageManager pm, android.content.pm.ResolveInfo info, boolean onHost)
ServiceInfo si = info.serviceInfo;
XmlResourceParser parser = null;
try {
if (onHost) {
parser = si.loadXmlMetaData(pm, HostApduService.SERVICE_META_DATA);
if (parser == null) {
throw new XmlPullParserException("No " + HostApduService.SERVICE_META_DATA +
" meta-data");
}
} else {
parser = si.loadXmlMetaData(pm, OffHostApduService.SERVICE_META_DATA);
if (parser == null) {
throw new XmlPullParserException("No " + OffHostApduService.SERVICE_META_DATA +
" meta-data");
}
}
int eventType = parser.getEventType();
while (eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_DOCUMENT) {
eventType = parser.next();
}
String tagName = parser.getName();
if (onHost && !"host-apdu-service".equals(tagName)) {
throw new XmlPullParserException(
"Meta-data does not start with <host-apdu-service> tag");
} else if (!onHost && !"offhost-apdu-service".equals(tagName)) {
throw new XmlPullParserException(
"Meta-data does not start with <offhost-apdu-service> tag");
}
Resources res = pm.getResourcesForApplication(si.applicationInfo);
AttributeSet attrs = Xml.asAttributeSet(parser);
if (onHost) {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.HostApduService);
mService = info;
mDescription = sa.getString(
com.android.internal.R.styleable.HostApduService_description);
mRequiresDeviceUnlock = sa.getBoolean(
com.android.internal.R.styleable.HostApduService_requireDeviceUnlock,
false);
mBannerResourceId = sa.getResourceId(
com.android.internal.R.styleable.HostApduService_apduServiceBanner, -1);
sa.recycle();
} else {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.OffHostApduService);
mService = info;
mDescription = sa.getString(
com.android.internal.R.styleable.OffHostApduService_description);
mRequiresDeviceUnlock = false;
mBannerResourceId = sa.getResourceId(
com.android.internal.R.styleable.OffHostApduService_apduServiceBanner, -1);
sa.recycle();
}
mStaticAidGroups = new HashMap<String, AidGroup>();
mDynamicAidGroups = new HashMap<String, AidGroup>();
mOnHost = onHost;
final int depth = parser.getDepth();
AidGroup currentGroup = null;
// Parsed values for the current AID group
while (((eventType = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
&& eventType != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
if (eventType == XmlPullParser.START_TAG && "aid-group".equals(tagName) &&
currentGroup == null) {
final TypedArray groupAttrs = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AidGroup);
// Get category of AID group
String groupCategory = groupAttrs.getString(
com.android.internal.R.styleable.AidGroup_category);
String groupDescription = groupAttrs.getString(
com.android.internal.R.styleable.AidGroup_description);
if (!CardEmulation.CATEGORY_PAYMENT.equals(groupCategory)) {
groupCategory = CardEmulation.CATEGORY_OTHER;
}
currentGroup = mStaticAidGroups.get(groupCategory);
if (currentGroup != null) {
if (!CardEmulation.CATEGORY_OTHER.equals(groupCategory)) {
Log.e(TAG, "Not allowing multiple aid-groups in the " +
groupCategory + " category");
currentGroup = null;
}
} else {
currentGroup = new AidGroup(groupCategory, groupDescription);
}
groupAttrs.recycle();
} else if (eventType == XmlPullParser.END_TAG && "aid-group".equals(tagName) &&
currentGroup != null) {
if (currentGroup.aids.size() > 0) {
if (!mStaticAidGroups.containsKey(currentGroup.category)) {
mStaticAidGroups.put(currentGroup.category, currentGroup);
}
} else {
Log.e(TAG, "Not adding <aid-group> with empty or invalid AIDs");
}
currentGroup = null;
} else if (eventType == XmlPullParser.START_TAG && "aid-filter".equals(tagName) &&
currentGroup != null) {
final TypedArray a = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AidFilter);
String aid = a.getString(com.android.internal.R.styleable.AidFilter_name).
toUpperCase();
if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) {
currentGroup.aids.add(aid);
} else {
Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid);
}
a.recycle();
} else if (eventType == XmlPullParser.START_TAG &&
"aid-prefix-filter".equals(tagName) && currentGroup != null) {
final TypedArray a = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AidFilter);
String aid = a.getString(com.android.internal.R.styleable.AidFilter_name).
toUpperCase();
// Add wildcard char to indicate prefix
aid = aid.concat("*");
if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) {
currentGroup.aids.add(aid);
} else {
Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid);
}
a.recycle();
}
}
} catch (NameNotFoundException e) {
throw new XmlPullParserException("Unable to create context for: " + si.packageName);
} finally {
if (parser != null) parser.close();
}
// Set uid
mUid = si.applicationInfo.uid;
|
Methods Summary |
---|
public int | describeContents()
return 0;
| public void | dump(java.io.FileDescriptor fd, java.io.PrintWriter pw, java.lang.String[] args)
pw.println(" " + getComponent() +
" (Description: " + getDescription() + ")");
pw.println(" Static AID groups:");
for (AidGroup group : mStaticAidGroups.values()) {
pw.println(" Category: " + group.category);
for (String aid : group.aids) {
pw.println(" AID: " + aid);
}
}
pw.println(" Dynamic AID groups:");
for (AidGroup group : mDynamicAidGroups.values()) {
pw.println(" Category: " + group.category);
for (String aid : group.aids) {
pw.println(" AID: " + aid);
}
}
| public boolean | equals(java.lang.Object o)
if (this == o) return true;
if (!(o instanceof ApduServiceInfo)) return false;
ApduServiceInfo thatService = (ApduServiceInfo) o;
return thatService.getComponent().equals(this.getComponent());
| public java.util.ArrayList | getAidGroups()Returns a consolidated list of AID groups
registered by this service. Note that if a service has both
a static (manifest-based) AID group for a category and a dynamic
AID group, only the dynamically registered AID group will be returned
for that category.
final ArrayList<AidGroup> groups = new ArrayList<AidGroup>();
for (Map.Entry<String, AidGroup> entry : mDynamicAidGroups.entrySet()) {
groups.add(entry.getValue());
}
for (Map.Entry<String, AidGroup> entry : mStaticAidGroups.entrySet()) {
if (!mDynamicAidGroups.containsKey(entry.getKey())) {
// Consolidate AID groups - don't return static ones
// if a dynamic group exists for the category.
groups.add(entry.getValue());
}
}
return groups;
| public java.util.ArrayList | getAids()Returns a consolidated list of AIDs from the AID groups
registered by this service. Note that if a service has both
a static (manifest-based) AID group for a category and a dynamic
AID group, only the dynamically registered AIDs will be returned
for that category.
final ArrayList<String> aids = new ArrayList<String>();
for (AidGroup group : getAidGroups()) {
aids.addAll(group.aids);
}
return aids;
| public java.lang.String | getCategoryForAid(java.lang.String aid)Returns the category to which this service has attributed the AID that is passed in,
or null if we don't know this AID.
ArrayList<AidGroup> groups = getAidGroups();
for (AidGroup group : groups) {
if (group.aids.contains(aid.toUpperCase())) {
return group.category;
}
}
return null;
| public android.content.ComponentName | getComponent()
return new ComponentName(mService.serviceInfo.packageName,
mService.serviceInfo.name);
| public java.lang.String | getDescription()
return mDescription;
| public AidGroup | getDynamicAidGroupForCategory(java.lang.String category)Returns the registered AID group for this category.
return mDynamicAidGroups.get(category);
| public int | getUid()
return mUid;
| public boolean | hasCategory(java.lang.String category)
return (mStaticAidGroups.containsKey(category) || mDynamicAidGroups.containsKey(category));
| public int | hashCode()
return getComponent().hashCode();
| public boolean | isOnHost()
return mOnHost;
| public android.graphics.drawable.Drawable | loadBanner(android.content.pm.PackageManager pm)
Resources res;
try {
res = pm.getResourcesForApplication(mService.serviceInfo.packageName);
Drawable banner = res.getDrawable(mBannerResourceId);
return banner;
} catch (NotFoundException e) {
Log.e(TAG, "Could not load banner.");
return null;
} catch (NameNotFoundException e) {
Log.e(TAG, "Could not load banner.");
return null;
}
| public android.graphics.drawable.Drawable | loadIcon(android.content.pm.PackageManager pm)
return mService.loadIcon(pm);
| public java.lang.CharSequence | loadLabel(android.content.pm.PackageManager pm)
return mService.loadLabel(pm);
| public boolean | removeDynamicAidGroupForCategory(java.lang.String category)
return (mDynamicAidGroups.remove(category) != null);
| public boolean | requiresUnlock()
return mRequiresDeviceUnlock;
| public void | setOrReplaceDynamicAidGroup(AidGroup aidGroup)
mDynamicAidGroups.put(aidGroup.getCategory(), aidGroup);
| public java.lang.String | toString()
StringBuilder out = new StringBuilder("ApduService: ");
out.append(getComponent());
out.append(", description: " + mDescription);
out.append(", Static AID Groups: ");
for (AidGroup aidGroup : mStaticAidGroups.values()) {
out.append(aidGroup.toString());
}
out.append(", Dynamic AID Groups: ");
for (AidGroup aidGroup : mDynamicAidGroups.values()) {
out.append(aidGroup.toString());
}
return out.toString();
| public void | writeToParcel(android.os.Parcel dest, int flags)
mService.writeToParcel(dest, flags);
dest.writeString(mDescription);
dest.writeInt(mOnHost ? 1 : 0);
dest.writeInt(mStaticAidGroups.size());
if (mStaticAidGroups.size() > 0) {
dest.writeTypedList(new ArrayList<AidGroup>(mStaticAidGroups.values()));
}
dest.writeInt(mDynamicAidGroups.size());
if (mDynamicAidGroups.size() > 0) {
dest.writeTypedList(new ArrayList<AidGroup>(mDynamicAidGroups.values()));
}
dest.writeInt(mRequiresDeviceUnlock ? 1 : 0);
dest.writeInt(mBannerResourceId);
dest.writeInt(mUid);
|
|