Loading Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ LOCAL_SRC_FILES += \ core/java/android/nfc/INfcTag.aidl \ core/java/android/nfc/INfcCardEmulation.aidl \ core/java/android/nfc/INfcLockscreenDispatch.aidl \ core/java/android/nfc/INfcUnlockHandler.aidl \ core/java/android/os/IBatteryPropertiesListener.aidl \ core/java/android/os/IBatteryPropertiesRegistrar.aidl \ core/java/android/os/ICancellationSignal.aidl \ Loading core/java/android/nfc/INfcAdapter.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.nfc.INfcAdapterExtras; import android.nfc.INfcTag; import android.nfc.INfcCardEmulation; import android.nfc.INfcLockscreenDispatch; import android.nfc.INfcUnlockHandler; import android.os.Bundle; /** Loading Loading @@ -57,4 +58,6 @@ interface INfcAdapter void setP2pModes(int initatorModes, int targetModes); void registerLockscreenDispatch(INfcLockscreenDispatch lockscreenDispatch, in int[] techList); void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList); void removeNfcUnlockHandler(IBinder b); } core/java/android/nfc/INfcUnlockHandler.aidl 0 → 100644 +12 −0 Original line number Diff line number Diff line package android.nfc; import android.nfc.Tag; /** * @hide */ interface INfcUnlockHandler { boolean onUnlockAttempted(in Tag tag); } core/java/android/nfc/NfcAdapter.java +87 −2 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.net.Uri; import android.nfc.BeamShareData; import android.nfc.tech.MifareClassic; import android.nfc.tech.Ndef; import android.nfc.tech.NfcA; Loading Loading @@ -312,6 +311,8 @@ public final class NfcAdapter { final NfcActivityManager mNfcActivityManager; final Context mContext; final HashMap<NfcUnlockHandler, IBinder> mNfcUnlockHandlers; final Object mLock; /** * A callback to be invoked when the system finds a tag while the foreground activity is Loading Loading @@ -393,6 +394,22 @@ public final class NfcAdapter { } /** * A callback to be invoked when an application has registered as a * handler to unlock the device given an NFC tag at the lockscreen. * @hide */ @SystemApi public interface NfcUnlockHandler { /** * Called at the lock screen to attempt to unlock the device with the given tag. * @param tag the detected tag, to be used to unlock the device * @return true if the device was successfully unlocked */ public boolean onUnlockAttempted(Tag tag); } /** * Helper to check if this device has FEATURE_NFC, but without using * a context. Loading Loading @@ -525,6 +542,8 @@ public final class NfcAdapter { NfcAdapter(Context context) { mContext = context; mNfcActivityManager = new NfcActivityManager(this); mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, IBinder>(); mLock = new Object(); } /** Loading Loading @@ -1457,7 +1476,7 @@ public final class NfcAdapter { public boolean onTagDetected(Tag tag) throws RemoteException { return lockscreenDispatch.onTagDetected(tag); } }, Tag.techListFromStrings(techList)); }, Tag.getTechCodesFromStrings(techList)); } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; Loading @@ -1469,6 +1488,72 @@ public final class NfcAdapter { return true; } /** * Registers a new NFC unlock handler with the NFC service. * * <p />NFC unlock handlers are intended to unlock the keyguard in the presence of a trusted * NFC device. The handler should return true if it successfully authenticates the user and * unlocks the keyguard. * * <p /> The parameter {@code tagTechnologies} determines which Tag technologies will be polled for * at the lockscreen. Polling for less tag technologies reduces latency, and so it is * strongly recommended to only provide the Tag technologies that the handler is expected to * receive. * * @hide */ @SystemApi public boolean addNfcUnlockHandler(final NfcUnlockHandler unlockHandler, String[] tagTechnologies) { try { INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() { @Override public boolean onUnlockAttempted(Tag tag) throws RemoteException { return unlockHandler.onUnlockAttempted(tag); } }; synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { return true; } sService.addNfcUnlockHandler(iHandler, Tag.getTechCodesFromStrings(tagTechnologies)); mNfcUnlockHandlers.put(unlockHandler, iHandler.asBinder()); } } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } catch (IllegalArgumentException e) { Log.e(TAG, "Unable to register LockscreenDispatch", e); return false; } return true; } /** * Removes a previously registered unlock handler. Also removes the tag technologies * associated with the removed unlock handler. * * @hide */ @SystemApi public boolean removeNfcUnlockHandler(NfcUnlockHandler unlockHandler) { try { synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler)); mNfcUnlockHandlers.remove(unlockHandler); } return true; } } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } } /** * @hide */ Loading core/java/android/nfc/Tag.java +1 −1 Original line number Diff line number Diff line Loading @@ -196,7 +196,7 @@ public final class Tag implements Parcelable { return strings; } static int[] techListFromStrings(String[] techStringList) throws IllegalArgumentException { static int[] getTechCodesFromStrings(String[] techStringList) throws IllegalArgumentException { if (techStringList == null) { throw new IllegalArgumentException("List cannot be null"); } Loading Loading
Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ LOCAL_SRC_FILES += \ core/java/android/nfc/INfcTag.aidl \ core/java/android/nfc/INfcCardEmulation.aidl \ core/java/android/nfc/INfcLockscreenDispatch.aidl \ core/java/android/nfc/INfcUnlockHandler.aidl \ core/java/android/os/IBatteryPropertiesListener.aidl \ core/java/android/os/IBatteryPropertiesRegistrar.aidl \ core/java/android/os/ICancellationSignal.aidl \ Loading
core/java/android/nfc/INfcAdapter.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.nfc.INfcAdapterExtras; import android.nfc.INfcTag; import android.nfc.INfcCardEmulation; import android.nfc.INfcLockscreenDispatch; import android.nfc.INfcUnlockHandler; import android.os.Bundle; /** Loading Loading @@ -57,4 +58,6 @@ interface INfcAdapter void setP2pModes(int initatorModes, int targetModes); void registerLockscreenDispatch(INfcLockscreenDispatch lockscreenDispatch, in int[] techList); void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList); void removeNfcUnlockHandler(IBinder b); }
core/java/android/nfc/INfcUnlockHandler.aidl 0 → 100644 +12 −0 Original line number Diff line number Diff line package android.nfc; import android.nfc.Tag; /** * @hide */ interface INfcUnlockHandler { boolean onUnlockAttempted(in Tag tag); }
core/java/android/nfc/NfcAdapter.java +87 −2 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.net.Uri; import android.nfc.BeamShareData; import android.nfc.tech.MifareClassic; import android.nfc.tech.Ndef; import android.nfc.tech.NfcA; Loading Loading @@ -312,6 +311,8 @@ public final class NfcAdapter { final NfcActivityManager mNfcActivityManager; final Context mContext; final HashMap<NfcUnlockHandler, IBinder> mNfcUnlockHandlers; final Object mLock; /** * A callback to be invoked when the system finds a tag while the foreground activity is Loading Loading @@ -393,6 +394,22 @@ public final class NfcAdapter { } /** * A callback to be invoked when an application has registered as a * handler to unlock the device given an NFC tag at the lockscreen. * @hide */ @SystemApi public interface NfcUnlockHandler { /** * Called at the lock screen to attempt to unlock the device with the given tag. * @param tag the detected tag, to be used to unlock the device * @return true if the device was successfully unlocked */ public boolean onUnlockAttempted(Tag tag); } /** * Helper to check if this device has FEATURE_NFC, but without using * a context. Loading Loading @@ -525,6 +542,8 @@ public final class NfcAdapter { NfcAdapter(Context context) { mContext = context; mNfcActivityManager = new NfcActivityManager(this); mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, IBinder>(); mLock = new Object(); } /** Loading Loading @@ -1457,7 +1476,7 @@ public final class NfcAdapter { public boolean onTagDetected(Tag tag) throws RemoteException { return lockscreenDispatch.onTagDetected(tag); } }, Tag.techListFromStrings(techList)); }, Tag.getTechCodesFromStrings(techList)); } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; Loading @@ -1469,6 +1488,72 @@ public final class NfcAdapter { return true; } /** * Registers a new NFC unlock handler with the NFC service. * * <p />NFC unlock handlers are intended to unlock the keyguard in the presence of a trusted * NFC device. The handler should return true if it successfully authenticates the user and * unlocks the keyguard. * * <p /> The parameter {@code tagTechnologies} determines which Tag technologies will be polled for * at the lockscreen. Polling for less tag technologies reduces latency, and so it is * strongly recommended to only provide the Tag technologies that the handler is expected to * receive. * * @hide */ @SystemApi public boolean addNfcUnlockHandler(final NfcUnlockHandler unlockHandler, String[] tagTechnologies) { try { INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() { @Override public boolean onUnlockAttempted(Tag tag) throws RemoteException { return unlockHandler.onUnlockAttempted(tag); } }; synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { return true; } sService.addNfcUnlockHandler(iHandler, Tag.getTechCodesFromStrings(tagTechnologies)); mNfcUnlockHandlers.put(unlockHandler, iHandler.asBinder()); } } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } catch (IllegalArgumentException e) { Log.e(TAG, "Unable to register LockscreenDispatch", e); return false; } return true; } /** * Removes a previously registered unlock handler. Also removes the tag technologies * associated with the removed unlock handler. * * @hide */ @SystemApi public boolean removeNfcUnlockHandler(NfcUnlockHandler unlockHandler) { try { synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler)); mNfcUnlockHandlers.remove(unlockHandler); } return true; } } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } } /** * @hide */ Loading
core/java/android/nfc/Tag.java +1 −1 Original line number Diff line number Diff line Loading @@ -196,7 +196,7 @@ public final class Tag implements Parcelable { return strings; } static int[] techListFromStrings(String[] techStringList) throws IllegalArgumentException { static int[] getTechCodesFromStrings(String[] techStringList) throws IllegalArgumentException { if (techStringList == null) { throw new IllegalArgumentException("List cannot be null"); } Loading