From 3c2fc6f7427e84d32a8c0ca59b4b0b981da2f1a8 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Thu, 22 Oct 2020 17:46:41 +0800 Subject: Add attr for nfc applications to configure support power states Use requireDeviceUnlock and requireDeviceScreenOn to configure the power state for the AIDs of the nfc applications. Bug: 171460473 Test: build pass Merged-In: I03bd537082117e595a7badfb2d8ca6ee7cae08cf Change-Id: I03bd537082117e595a7badfb2d8ca6ee7cae08cf --- core/api/current.txt | 1 + .../android/nfc/cardemulation/ApduServiceInfo.java | 41 ++++++++++++++++++++-- core/res/res/values/attrs.xml | 9 +++++ core/res/res/values/public.xml | 1 + 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 717e3bd02994..bbaaf4603486 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -1142,6 +1142,7 @@ package android { field public static final int reqNavigation = 16843306; // 0x101022a field public static final int reqTouchScreen = 16843303; // 0x1010227 field public static final int requestLegacyExternalStorage = 16844291; // 0x1010603 + field public static final int requireDeviceScreenOn = 16844312; // 0x1010618 field public static final int requireDeviceUnlock = 16843756; // 0x10103ec field public static final int required = 16843406; // 0x101028e field public static final int requiredAccountType = 16843734; // 0x10103d6 diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index d7c2e0522b0f..64ab074f397a 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -96,6 +96,11 @@ public final class ApduServiceInfo implements Parcelable { */ final boolean mRequiresDeviceUnlock; + /** + * Whether this service should only be started when the device is screen on. + */ + final boolean mRequiresDeviceScreenOn; + /** * The id of the service banner specified in XML. */ @@ -119,6 +124,18 @@ public final class ApduServiceInfo implements Parcelable { ArrayList staticAidGroups, ArrayList dynamicAidGroups, boolean requiresUnlock, int bannerResource, int uid, String settingsActivityName, String offHost, String staticOffHost) { + this(info, onHost, description, staticAidGroups, dynamicAidGroups, + requiresUnlock, onHost ? true : false, bannerResource, uid, + settingsActivityName, offHost, staticOffHost); + } + + /** + * @hide + */ + public ApduServiceInfo(ResolveInfo info, boolean onHost, String description, + ArrayList staticAidGroups, ArrayList dynamicAidGroups, + boolean requiresUnlock, boolean requiresScreenOn, int bannerResource, int uid, + String settingsActivityName, String offHost, String staticOffHost) { this.mService = info; this.mDescription = description; this.mStaticAidGroups = new HashMap(); @@ -127,6 +144,7 @@ public final class ApduServiceInfo implements Parcelable { this.mStaticOffHostName = staticOffHost; this.mOnHost = onHost; this.mRequiresDeviceUnlock = requiresUnlock; + this.mRequiresDeviceScreenOn = requiresScreenOn; for (AidGroup aidGroup : staticAidGroups) { this.mStaticAidGroups.put(aidGroup.category, aidGroup); } @@ -183,6 +201,9 @@ public final class ApduServiceInfo implements Parcelable { mRequiresDeviceUnlock = sa.getBoolean( com.android.internal.R.styleable.HostApduService_requireDeviceUnlock, false); + mRequiresDeviceScreenOn = sa.getBoolean( + com.android.internal.R.styleable.HostApduService_requireDeviceScreenOn, + true); mBannerResourceId = sa.getResourceId( com.android.internal.R.styleable.HostApduService_apduServiceBanner, -1); mSettingsActivityName = sa.getString( @@ -196,7 +217,12 @@ public final class ApduServiceInfo implements Parcelable { mService = info; mDescription = sa.getString( com.android.internal.R.styleable.OffHostApduService_description); - mRequiresDeviceUnlock = false; + mRequiresDeviceUnlock = sa.getBoolean( + com.android.internal.R.styleable.OffHostApduService_requireDeviceUnlock, + false); + mRequiresDeviceScreenOn = sa.getBoolean( + com.android.internal.R.styleable.OffHostApduService_requireDeviceScreenOn, + false); mBannerResourceId = sa.getResourceId( com.android.internal.R.styleable.OffHostApduService_apduServiceBanner, -1); mSettingsActivityName = sa.getString( @@ -419,6 +445,13 @@ public final class ApduServiceInfo implements Parcelable { return mRequiresDeviceUnlock; } + /** + * Returns whether this service should only be started when the device is screen on. + */ + public boolean requiresScreenOn() { + return mRequiresDeviceScreenOn; + } + @UnsupportedAppUsage public String getDescription() { return mDescription; @@ -542,6 +575,7 @@ public final class ApduServiceInfo implements Parcelable { dest.writeTypedList(new ArrayList(mDynamicAidGroups.values())); } dest.writeInt(mRequiresDeviceUnlock ? 1 : 0); + dest.writeInt(mRequiresDeviceScreenOn ? 1 : 0); dest.writeInt(mBannerResourceId); dest.writeInt(mUid); dest.writeString(mSettingsActivityName); @@ -568,11 +602,12 @@ public final class ApduServiceInfo implements Parcelable { source.readTypedList(dynamicAidGroups, AidGroup.CREATOR); } boolean requiresUnlock = source.readInt() != 0; + boolean requiresScreenOn = source.readInt() != 0; int bannerResource = source.readInt(); int uid = source.readInt(); String settingsActivityName = source.readString(); return new ApduServiceInfo(info, onHost, description, staticAidGroups, - dynamicAidGroups, requiresUnlock, bannerResource, uid, + dynamicAidGroups, requiresUnlock, requiresScreenOn, bannerResource, uid, settingsActivityName, offHostName, staticOffHostName); } @@ -607,6 +642,8 @@ public final class ApduServiceInfo implements Parcelable { } } pw.println(" Settings Activity: " + mSettingsActivityName); + pw.println(" Requires Device Unlock: " + mRequiresDeviceUnlock); + pw.println(" Requires Device ScreenOn: " + mRequiresDeviceScreenOn); } /** diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 4b3d82a04b8b..9cc0690126e9 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3856,6 +3856,9 @@ + + + + + + + -- cgit v1.2.3-59-g8ed1b