OSDN Git Service

Verify NFC permission immediately on API calls.
authorMartijn Coenen <maco@google.com>
Thu, 13 Nov 2014 23:00:56 +0000 (15:00 -0800)
committerMartijn Coenen <maco@google.com>
Fri, 14 Nov 2014 18:51:14 +0000 (10:51 -0800)
Bug: 18358968
Change-Id: I648494e6435e107337e0c5bc4c6328774f9a54be

core/java/android/nfc/INfcAdapter.aidl
core/java/android/nfc/NfcActivityManager.java

index 5b926ad..961a3f4 100644 (file)
@@ -60,4 +60,6 @@ interface INfcAdapter
 
     void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList);
     void removeNfcUnlockHandler(INfcUnlockHandler unlockHandler);
+
+    void verifyNfcPermission();
 }
index 8643f2e..7309054 100644 (file)
@@ -252,7 +252,11 @@ public final class NfcActivityManager extends IAppCallback.Stub
             isResumed = state.resumed;
         }
         if (isResumed) {
+            // requestNfcServiceCallback() verifies permission also
             requestNfcServiceCallback();
+        } else {
+            // Crash API calls early in case NFC permission is missing
+            verifyNfcPermission();
         }
     }
 
@@ -266,7 +270,11 @@ public final class NfcActivityManager extends IAppCallback.Stub
             isResumed = state.resumed;
         }
         if (isResumed) {
+            // requestNfcServiceCallback() verifies permission also
             requestNfcServiceCallback();
+        } else {
+            // Crash API calls early in case NFC permission is missing
+            verifyNfcPermission();
         }
     }
 
@@ -279,7 +287,11 @@ public final class NfcActivityManager extends IAppCallback.Stub
             isResumed = state.resumed;
         }
         if (isResumed) {
+            // requestNfcServiceCallback() verifies permission also
             requestNfcServiceCallback();
+        } else {
+            // Crash API calls early in case NFC permission is missing
+            verifyNfcPermission();
         }
     }
 
@@ -293,7 +305,11 @@ public final class NfcActivityManager extends IAppCallback.Stub
             isResumed = state.resumed;
         }
         if (isResumed) {
+            // requestNfcServiceCallback() verifies permission also
             requestNfcServiceCallback();
+        } else {
+            // Crash API calls early in case NFC permission is missing
+            verifyNfcPermission();
         }
     }
 
@@ -306,7 +322,11 @@ public final class NfcActivityManager extends IAppCallback.Stub
             isResumed = state.resumed;
         }
         if (isResumed) {
+            // requestNfcServiceCallback() verifies permission also
             requestNfcServiceCallback();
+        } else {
+            // Crash API calls early in case NFC permission is missing
+            verifyNfcPermission();
         }
     }
 
@@ -322,6 +342,14 @@ public final class NfcActivityManager extends IAppCallback.Stub
         }
     }
 
+    void verifyNfcPermission() {
+        try {
+            NfcAdapter.sService.verifyNfcPermission();
+        } catch (RemoteException e) {
+            mAdapter.attemptDeadServiceRecovery(e);
+        }
+    }
+
     /** Callback from NFC service, usually on binder thread */
     @Override
     public BeamShareData createBeamShareData() {