From 4366d817304e7131e82aeb4d63839c1ae9920bb2 Mon Sep 17 00:00:00 2001 From: George Chang Date: Wed, 26 May 2021 00:37:28 +0800 Subject: [PATCH] Fix getSelectionModeForCategory NFC_PAYMENT_DEFAULT_COMPONENT is not accessable for market apps Check if default payment name already registered in settings by NfcService. Add a new AIDL interface isDefaultPaymentRegistered in INfcCardEmulation.aidl Bug: 189178386 Test: atest CtsNfcTestCases Change-Id: I0a09c9763d39c8e0b9b28df85603bdc7f281669d --- core/java/android/nfc/INfcCardEmulation.aidl | 1 + .../nfc/cardemulation/CardEmulation.java | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/java/android/nfc/INfcCardEmulation.aidl b/core/java/android/nfc/INfcCardEmulation.aidl index 848b6d52c47f9..53843fe73d33e 100644 --- a/core/java/android/nfc/INfcCardEmulation.aidl +++ b/core/java/android/nfc/INfcCardEmulation.aidl @@ -40,4 +40,5 @@ interface INfcCardEmulation boolean unsetPreferredService(); boolean supportsAidPrefixRegistration(); ApduServiceInfo getPreferredPaymentService(int userHandle); + boolean isDefaultPaymentRegistered(); } diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index b138a3f01f492..d498535ce52c4 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -294,9 +294,23 @@ public final class CardEmulation { */ public int getSelectionModeForCategory(String category) { if (CATEGORY_PAYMENT.equals(category)) { - String defaultComponent = Settings.Secure.getString(mContext.getContentResolver(), - Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT); - if (defaultComponent != null) { + boolean paymentRegistered = false; + try { + paymentRegistered = sService.isDefaultPaymentRegistered(); + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover CardEmulationService."); + return SELECTION_MODE_ALWAYS_ASK; + } + try { + paymentRegistered = sService.isDefaultPaymentRegistered(); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach CardEmulationService."); + return SELECTION_MODE_ALWAYS_ASK; + } + } + if (paymentRegistered) { return SELECTION_MODE_PREFER_DEFAULT; } else { return SELECTION_MODE_ALWAYS_ASK;