Use waitForService() istead of getService()

SystemManager.waitForService() is a system interface

Bug: 244264995
Test: read a tag, on/off
Change-Id: Ifcde87f4021238b4ebc67466f2d9b2e363586707
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index c38626c..3282d56 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -565,8 +565,7 @@
             return sNullContextNfcAdapter;
         }
         if (!sIsInitialized) {
-            PackageManager pm;
-            pm = context.getPackageManager();
+            PackageManager pm = context.getPackageManager();
             sHasNfcFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC);
             sHasBeamFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM);
             boolean hasHceFeature =
@@ -617,8 +616,12 @@
 
     /** get handle to NFC service interface */
     private static INfcAdapter getServiceInterface() {
+        if (!sHasNfcFeature) {
+            /* NFC is not supported */
+            return null;
+        }
         /* get a handle to NFC service */
-        IBinder b = ServiceManager.getService("nfc");
+        IBinder b = ServiceManager.waitForService("nfc");
         if (b == null) {
             return null;
         }
@@ -648,6 +651,15 @@
                     "context not associated with any application (using a mock context?)");
         }
 
+        synchronized (NfcAdapter.class) {
+            if (!sIsInitialized) {
+                PackageManager pm = context.getPackageManager();
+                sHasNfcFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC);
+            }
+            if (!sHasNfcFeature) {
+                return null;
+            }
+        }
         if (getServiceInterface() == null) {
             // NFC is not available
             return null;