diff options
| -rw-r--r-- | nfc/api/system-current.txt | 1 | ||||
| -rw-r--r-- | nfc/java/android/nfc/INfcCardEmulation.aidl | 1 | ||||
| -rw-r--r-- | nfc/java/android/nfc/NfcAdapter.java | 7 | ||||
| -rw-r--r-- | nfc/java/android/nfc/cardemulation/ApduServiceInfo.java | 2 | ||||
| -rw-r--r-- | nfc/java/android/nfc/cardemulation/CardEmulation.java | 20 | ||||
| -rw-r--r-- | nfc/java/android/nfc/flags.aconfig | 10 |
6 files changed, 37 insertions, 4 deletions
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt index 0f97b2c8d443..cdf8f89f683a 100644 --- a/nfc/api/system-current.txt +++ b/nfc/api/system-current.txt @@ -97,6 +97,7 @@ package android.nfc.cardemulation { public final class CardEmulation { method @FlaggedApi("android.permission.flags.wallet_role_enabled") @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public static android.content.ComponentName getPreferredPaymentService(@NonNull android.content.Context); method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public java.util.List<android.nfc.cardemulation.ApduServiceInfo> getServices(@NonNull String, int); + method @FlaggedApi("android.nfc.enable_card_emulation_euicc") public boolean isEuiccSupported(); method @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public void overrideRoutingTable(@NonNull android.app.Activity, int, int); method @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public void recoverRoutingTable(@NonNull android.app.Activity); } diff --git a/nfc/java/android/nfc/INfcCardEmulation.aidl b/nfc/java/android/nfc/INfcCardEmulation.aidl index 79f1275ec629..19b9e0f0b515 100644 --- a/nfc/java/android/nfc/INfcCardEmulation.aidl +++ b/nfc/java/android/nfc/INfcCardEmulation.aidl @@ -50,4 +50,5 @@ interface INfcCardEmulation void overrideRoutingTable(int userHandle, String protocol, String technology, in String pkg); void recoverRoutingTable(int userHandle); + boolean isEuiccSupported(); } diff --git a/nfc/java/android/nfc/NfcAdapter.java b/nfc/java/android/nfc/NfcAdapter.java index 22ae612b5cfc..f47879385070 100644 --- a/nfc/java/android/nfc/NfcAdapter.java +++ b/nfc/java/android/nfc/NfcAdapter.java @@ -721,7 +721,7 @@ public final class NfcAdapter { * * @return List<String> containing secure elements on the device which supports * off host card emulation. eSE for Embedded secure element, - * SIM for UICC and so on. + * SIM for UICC, eSIM for EUICC and so on. * @hide */ public @NonNull List<String> getSupportedOffHostSecureElements() { @@ -741,6 +741,11 @@ public final class NfcAdapter { if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE)) { offHostSE.add("eSE"); } + if (Flags.enableCardEmulationEuicc() + && callServiceReturn( + () -> sCardEmulationService.isEuiccSupported(), false)) { + offHostSE.add("eSIM"); + } return offHostSE; } diff --git a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java index 3cf0a4dc4873..ea5a03613ddc 100644 --- a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -308,6 +308,8 @@ public final class ApduServiceInfo implements Parcelable { mOffHostName = "eSE1"; } else if (mOffHostName.equals("SIM")) { mOffHostName = "SIM1"; + } else if (Flags.enableCardEmulationEuicc() && mOffHostName.equals("eSIM")) { + mOffHostName = "eSIM1"; } } mStaticOffHostName = mOffHostName; diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java index 497309c12d8a..a72a8964203a 100644 --- a/nfc/java/android/nfc/cardemulation/CardEmulation.java +++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java @@ -548,11 +548,13 @@ public final class CardEmulation { List<String> validSE = adapter.getSupportedOffHostSecureElements(); if ((offHostSecureElement.startsWith("eSE") && !validSE.contains("eSE")) - || (offHostSecureElement.startsWith("SIM") && !validSE.contains("SIM"))) { + || (offHostSecureElement.startsWith("SIM") && !validSE.contains("SIM")) + || (offHostSecureElement.startsWith("eSIM") && !validSE.contains("eSIM"))) { return false; } - if (!offHostSecureElement.startsWith("eSE") && !offHostSecureElement.startsWith("SIM")) { + if (!offHostSecureElement.startsWith("eSE") && !offHostSecureElement.startsWith("SIM") + && !(Flags.enableCardEmulationEuicc() && offHostSecureElement.startsWith("eSIM"))) { return false; } @@ -560,6 +562,8 @@ public final class CardEmulation { offHostSecureElement = "eSE1"; } else if (offHostSecureElement.equals("SIM")) { offHostSecureElement = "SIM1"; + } else if (Flags.enableCardEmulationEuicc() && offHostSecureElement.equals("eSIM")) { + offHostSecureElement = "eSIM1"; } final String offHostSecureElementV = new String(offHostSecureElement); return callServiceReturn(() -> @@ -985,6 +989,18 @@ public final class CardEmulation { } /** + * Is EUICC supported as a Secure Element EE which supports off host card emulation. + * + * @return true if the device supports EUICC for off host card emulation, false otherwise. + * @hide + */ + @SystemApi + @FlaggedApi(android.nfc.Flags.FLAG_ENABLE_CARD_EMULATION_EUICC) + public boolean isEuiccSupported() { + return callServiceReturn(() -> sService.isEuiccSupported(), false); + } + + /** * Returns the value of {@link Settings.Secure#NFC_PAYMENT_DEFAULT_COMPONENT}. * * @param context A context diff --git a/nfc/java/android/nfc/flags.aconfig b/nfc/java/android/nfc/flags.aconfig index 9a4ee2fa22ab..f942911cb104 100644 --- a/nfc/java/android/nfc/flags.aconfig +++ b/nfc/java/android/nfc/flags.aconfig @@ -147,4 +147,12 @@ flag { namespace: "nfc" description: "Enable watchdog for the NFC system process" bug: "362937338" -}
\ No newline at end of file +} + +flag { + name: "enable_card_emulation_euicc" + is_exported: true + namespace: "nfc" + description: "Enable EUICC card emulation" + bug: "321314635" +} |