diff options
| author | 2022-12-13 18:12:28 +0000 | |
|---|---|---|
| committer | 2022-12-13 18:12:28 +0000 | |
| commit | db37a06c60f4d0424154e86ca8362cb00abd6f85 (patch) | |
| tree | cd282aecb2dad02e03d4bb866b0ff37ecbf396c5 | |
| parent | 0d3977c185ea15250928524daa4e8cfa252f44ee (diff) | |
Revert "Get PackageManager from Context"
Revert submission 2264526
Reason for revert: Droidfood blocking bug: 262191143
Reverted changes: /q/submissionid:2264526
Change-Id: I34c81e2044827cd858d67c37e491967baf701759
| -rw-r--r-- | core/java/android/nfc/NfcAdapter.java | 105 | ||||
| -rw-r--r-- | core/java/android/nfc/cardemulation/CardEmulation.java | 13 | ||||
| -rw-r--r-- | core/java/android/nfc/cardemulation/NfcFCardEmulation.java | 13 | 
3 files changed, 102 insertions, 29 deletions
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index c38626cf67dd..64c121194932 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -29,6 +29,7 @@ import android.app.PendingIntent;  import android.compat.annotation.UnsupportedAppUsage;  import android.content.Context;  import android.content.IntentFilter; +import android.content.pm.IPackageManager;  import android.content.pm.PackageManager;  import android.net.Uri;  import android.nfc.tech.MifareClassic; @@ -524,6 +525,66 @@ public final class NfcAdapter {      }      /** +     * Helper to check if this device has FEATURE_NFC_BEAM, but without using +     * a context. +     * Equivalent to +     * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_BEAM) +     */ +    private static boolean hasBeamFeature() { +        IPackageManager pm = ActivityThread.getPackageManager(); +        if (pm == null) { +            Log.e(TAG, "Cannot get package manager, assuming no Android Beam feature"); +            return false; +        } +        try { +            return pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM, 0); +        } catch (RemoteException e) { +            Log.e(TAG, "Package manager query failed, assuming no Android Beam feature", e); +            return false; +        } +    } + +    /** +     * Helper to check if this device has FEATURE_NFC, but without using +     * a context. +     * Equivalent to +     * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC) +     */ +    private static boolean hasNfcFeature() { +        IPackageManager pm = ActivityThread.getPackageManager(); +        if (pm == null) { +            Log.e(TAG, "Cannot get package manager, assuming no NFC feature"); +            return false; +        } +        try { +            return pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0); +        } catch (RemoteException e) { +            Log.e(TAG, "Package manager query failed, assuming no NFC feature", e); +            return false; +        } +    } + +    /** +     * Helper to check if this device is NFC HCE capable, by checking for +     * FEATURE_NFC_HOST_CARD_EMULATION and/or FEATURE_NFC_HOST_CARD_EMULATION_NFCF, +     * but without using a context. +     */ +    private static boolean hasNfcHceFeature() { +        IPackageManager pm = ActivityThread.getPackageManager(); +        if (pm == null) { +            Log.e(TAG, "Cannot get package manager, assuming no NFC feature"); +            return false; +        } +        try { +            return pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0) +                || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0); +        } catch (RemoteException e) { +            Log.e(TAG, "Package manager query failed, assuming no NFC feature", e); +            return false; +        } +    } + +    /**       * Return list of Secure Elements which support off host card emulation.       *       * @return List<String> containing secure elements on the device which supports @@ -532,21 +593,23 @@ public final class NfcAdapter {       * @hide       */      public @NonNull List<String> getSupportedOffHostSecureElements() { -        if (mContext == null) { -            throw new UnsupportedOperationException("You need a context on NfcAdapter to use the " -                    + " getSupportedOffHostSecureElements APIs"); -        }          List<String> offHostSE = new ArrayList<String>(); -        PackageManager pm = mContext.getPackageManager(); +        IPackageManager pm = ActivityThread.getPackageManager();          if (pm == null) {              Log.e(TAG, "Cannot get package manager, assuming no off-host CE feature");              return offHostSE;          } -        if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC)) { -            offHostSE.add("SIM"); -        } -        if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE)) { -            offHostSE.add("eSE"); +        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;      } @@ -558,20 +621,10 @@ public final class NfcAdapter {       */      @UnsupportedAppUsage      public static synchronized NfcAdapter getNfcAdapter(Context context) { -        if (context == null) { -            if (sNullContextNfcAdapter == null) { -                sNullContextNfcAdapter = new NfcAdapter(null); -            } -            return sNullContextNfcAdapter; -        }          if (!sIsInitialized) { -            PackageManager pm; -            pm = context.getPackageManager(); -            sHasNfcFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC); -            sHasBeamFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM); -            boolean hasHceFeature = -                    pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION) -                    || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF); +            sHasNfcFeature = hasNfcFeature(); +            sHasBeamFeature = hasBeamFeature(); +            boolean hasHceFeature = hasNfcHceFeature();              /* is this device meant to have NFC */              if (!sHasNfcFeature && !hasHceFeature) {                  Log.v(TAG, "this device does not have NFC support"); @@ -607,6 +660,12 @@ public final class NfcAdapter {              sIsInitialized = true;          } +        if (context == null) { +            if (sNullContextNfcAdapter == null) { +                sNullContextNfcAdapter = new NfcAdapter(null); +            } +            return sNullContextNfcAdapter; +        }          NfcAdapter adapter = sNfcAdapters.get(context);          if (adapter == null) {              adapter = new NfcAdapter(context); diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index 6a4209135c66..0b56d19201fb 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -22,9 +22,11 @@ import android.annotation.RequiresPermission;  import android.annotation.SdkConstant;  import android.annotation.SdkConstant.SdkConstantType;  import android.app.Activity; +import android.app.ActivityThread;  import android.content.ComponentName;  import android.content.Context;  import android.content.Intent; +import android.content.pm.IPackageManager;  import android.content.pm.PackageManager;  import android.nfc.INfcCardEmulation;  import android.nfc.NfcAdapter; @@ -156,13 +158,18 @@ public final class CardEmulation {              throw new UnsupportedOperationException();          }          if (!sIsInitialized) { -            PackageManager pm = context.getPackageManager(); +            IPackageManager pm = ActivityThread.getPackageManager();              if (pm == null) {                  Log.e(TAG, "Cannot get PackageManager");                  throw new UnsupportedOperationException();              } -            if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) { -                Log.e(TAG, "This device does not support card emulation"); +            try { +                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)) { +                    Log.e(TAG, "This device does not support card emulation"); +                    throw new UnsupportedOperationException(); +                } +            } catch (RemoteException e) { +                Log.e(TAG, "PackageManager query failed.");                  throw new UnsupportedOperationException();              }              sIsInitialized = true; diff --git a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java index 48bbf5b61052..3c924556365e 100644 --- a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java +++ b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java @@ -17,8 +17,10 @@  package android.nfc.cardemulation;  import android.app.Activity; +import android.app.ActivityThread;  import android.content.ComponentName;  import android.content.Context; +import android.content.pm.IPackageManager;  import android.content.pm.PackageManager;  import android.nfc.INfcFCardEmulation;  import android.nfc.NfcAdapter; @@ -68,13 +70,18 @@ public final class NfcFCardEmulation {              throw new UnsupportedOperationException();          }          if (!sIsInitialized) { -            PackageManager pm = context.getPackageManager(); +            IPackageManager pm = ActivityThread.getPackageManager();              if (pm == null) {                  Log.e(TAG, "Cannot get PackageManager");                  throw new UnsupportedOperationException();              } -            if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF)) { -                Log.e(TAG, "This device does not support NFC-F card emulation"); +            try { +                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0)) { +                    Log.e(TAG, "This device does not support NFC-F card emulation"); +                    throw new UnsupportedOperationException(); +                } +            } catch (RemoteException e) { +                Log.e(TAG, "PackageManager query failed.");                  throw new UnsupportedOperationException();              }              sIsInitialized = true;  |