Adjust logging NFC_CARDEMULATION_OCCURRED

Bug: 247436942
Test: statsd_testdrive
Change-Id: I7b9ee488017ffb5eaaa3f623561ac3a70ecd5a2c
Merged-In: I7b9ee488017ffb5eaaa3f623561ac3a70ecd5a2c
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 95df870..85db450 100644
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -34,6 +34,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.pm.UserInfo;
 import android.content.res.Resources.NotFoundException;
 import android.media.AudioAttributes;
@@ -456,8 +457,6 @@
     public void onNfcTransactionEvent(byte[] aid, byte[] data, String seName) {
         byte[][] dataObj = {aid, data, seName.getBytes()};
         sendMessage(NfcService.MSG_TRANSACTION_EVENT, dataObj);
-        NfcStatsLog.write(NfcStatsLog.NFC_CARDEMULATION_OCCURRED,
-                NfcStatsLog.NFC_CARDEMULATION_OCCURRED__CATEGORY__OFFHOST, seName);
     }
 
     @Override
@@ -2955,6 +2954,7 @@
 
             try {
                 String reader = new String(readerByteArray, "UTF-8");
+                int uid = -1;
                 for (int userId : mNfcEventInstalledPackages.keySet()) {
                     List<String> packagesOfUser = mNfcEventInstalledPackages.get(userId);
                     String[] installedPackages = new String[packagesOfUser.size()];
@@ -2979,14 +2979,40 @@
 
                     final BroadcastOptions options = BroadcastOptions.makeBasic();
                     options.setBackgroundActivityStartsAllowed(true);
+
+                    Map<String, Integer> hasIntentPackages = mContext
+                            .getPackageManager()
+                            .queryBroadcastReceiversAsUser(intent, 0, UserHandle.of(userId))
+                            .stream()
+                            .collect(Collectors.toMap(
+                                      activity -> activity.activityInfo.applicationInfo.packageName,
+                                      activity -> activity.activityInfo.applicationInfo.uid));
+                    if (DBG) {
+                        String[] packageNames = hasIntentPackages
+                                .keySet().toArray(new String[hasIntentPackages.size()]);
+                        Log.d(TAG,
+                                "queryBroadcastReceiversAsUser: " + Arrays.toString(packageNames));
+                    }
+
                     for (int i = 0; i < nfcAccess.length; i++) {
                         if (nfcAccess[i]) {
+                            if (DBG) {
+                                Log.d(TAG,
+                                        "sendOffHostTransactionEvent to " + packagesOfUser.get(i));
+                            }
+                            if (uid == -1 && hasIntentPackages.containsKey(packagesOfUser.get(i))) {
+                                uid = hasIntentPackages.get(packagesOfUser.get(i));
+                            }
                             intent.setPackage(packagesOfUser.get(i));
                             mContext.sendBroadcastAsUser(intent, UserHandle.of(userId), null,
                                     options.toBundle());
                         }
                     }
                 }
+                NfcStatsLog.write(NfcStatsLog.NFC_CARDEMULATION_OCCURRED,
+                        NfcStatsLog.NFC_CARDEMULATION_OCCURRED__CATEGORY__OFFHOST,
+                        reader,
+                        uid);
             } catch (RemoteException e) {
                 Log.e(TAG, "Error in isNfcEventAllowed() " + e);
             } catch (UnsupportedEncodingException e) {
diff --git a/src/com/android/nfc/cardemulation/HostEmulationManager.java b/src/com/android/nfc/cardemulation/HostEmulationManager.java
index 185f1a1..ae708b4 100644
--- a/src/com/android/nfc/cardemulation/HostEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/HostEmulationManager.java
@@ -233,8 +233,9 @@
             switch (mState) {
                 case STATE_W4_SELECT:
                     if (selectAid != null) {
+                        int uid = resolvedServiceInfo.getUid();
                         UserHandle user =
-                                UserHandle.getUserHandleForUid(resolvedServiceInfo.getUid());
+                                UserHandle.getUserHandleForUid(uid);
                         Messenger existingService =
                                 bindServiceIfNeededLocked(user.getIdentifier(), resolvedService);
                         if (existingService != null) {
@@ -251,11 +252,13 @@
                         if (CardEmulation.CATEGORY_PAYMENT.equals(resolveInfo.category)) {
                             NfcStatsLog.write(NfcStatsLog.NFC_CARDEMULATION_OCCURRED,
                                     NfcStatsLog.NFC_CARDEMULATION_OCCURRED__CATEGORY__HCE_PAYMENT,
-                                    "HCE");
+                                    "HCE",
+                                    uid);
                         } else {
                             NfcStatsLog.write(NfcStatsLog.NFC_CARDEMULATION_OCCURRED,
                                     NfcStatsLog.NFC_CARDEMULATION_OCCURRED__CATEGORY__HCE_OTHER,
-                                    "HCE");
+                                    "HCE",
+                                    uid);
                         }
                     } else {
                         Log.d(TAG, "Dropping non-select APDU in STATE_W4_SELECT");
diff --git a/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java b/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java
index acb3629..8822a49 100644
--- a/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java
@@ -151,9 +151,15 @@
                         mPendingPacket = data;
                         mState = STATE_W4_SERVICE;
                     }
+
+                    int uid = -1;
+                    if(resolvedService != null) {
+                        uid = resolvedService.getUid();
+                    }
                     NfcStatsLog.write(NfcStatsLog.NFC_CARDEMULATION_OCCURRED,
                             NfcStatsLog.NFC_CARDEMULATION_OCCURRED__CATEGORY__HCE_PAYMENT,
-                            "HCEF");
+                            "HCEF",
+                            uid);
                     break;
                 case STATE_W4_SERVICE:
                     Log.d(TAG, "Unexpected packet in STATE_W4_SERVICE");