From ebf267a2a4cf76df95dfe72902919d38411e934c Mon Sep 17 00:00:00 2001 From: Ruchi Kandoi Date: Tue, 16 Oct 2018 17:29:16 -0700 Subject: Add Off-Host Card Emulation Features Test: CTS test; manual Bug: 117253962 Change-Id: I7c35b1bffbc57870bb8c67704811a2649854d94e --- api/current.txt | 3 +++ core/java/android/content/pm/PackageManager.java | 17 +++++++++++++ core/java/android/nfc/NfcAdapter.java | 32 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/api/current.txt b/api/current.txt index 7b48a5b60dc3..84582dcee68f 100755 --- a/api/current.txt +++ b/api/current.txt @@ -11317,6 +11317,8 @@ package android.content.pm { field public static final java.lang.String FEATURE_NFC = "android.hardware.nfc"; field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce"; field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef"; + field public static final java.lang.String FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE = "android.hardware.nfc.ese"; + field public static final java.lang.String FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC = "android.hardware.nfc.uicc"; field public static final java.lang.String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep"; field public static final java.lang.String FEATURE_PC = "android.hardware.type.pc"; field public static final java.lang.String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture"; @@ -29159,6 +29161,7 @@ package android.nfc { method public deprecated void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage); method public void enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle); method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context); + method public java.util.List getSupportedOffHostSecureElements(); method public boolean ignore(android.nfc.Tag, int, android.nfc.NfcAdapter.OnTagRemovedListener, android.os.Handler); method public boolean invokeBeam(android.app.Activity); method public boolean isEnabled(); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 1394c358868c..25edf9cff5c7 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1912,6 +1912,23 @@ public abstract class PackageManager { @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef"; + /** + * Feature for {@link #getSystemAvailableFeatures} and + * {@link #hasSystemFeature}: The device supports uicc- + * based NFC card emulation. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC = + "android.hardware.nfc.uicc"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and + * {@link #hasSystemFeature}: The device supports eSE- + * based NFC card emulation. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE = "android.hardware.nfc.ese"; + /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports any diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 21fed48189eb..877187053486 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -16,6 +16,7 @@ package android.nfc; +import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -42,7 +43,9 @@ import android.os.ServiceManager; import android.util.Log; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; /** * Represents the local NFC adapter. @@ -487,6 +490,35 @@ public final class NfcAdapter { } } + /** + * Return list of Secure Elements which support off host card emulation. + * + * @return List containing secure elements on the device which supports + * off host card emulation. eSE for Embedded secure element, + * SIM for UICC and so on. + */ + public @NonNull List getSupportedOffHostSecureElements() { + List offHostSE = new ArrayList(); + IPackageManager pm = ActivityThread.getPackageManager(); + if (pm == null) { + Log.e(TAG, "Cannot get package manager, assuming no off-host CE feature"); + return offHostSE; + } + try { + if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC, 0)) { + offHostSE.add("SIM"); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE, 0)) { + offHostSE.add("eSE"); + } + } catch (RemoteException e) { + Log.e(TAG, "Package manager query failed, assuming no off-host CE feature", e); + offHostSE.clear(); + return offHostSE; + } + return offHostSE; + } + /** * Returns the NfcAdapter for application context, * or throws if NFC is not available. -- cgit v1.2.3-59-g8ed1b