diff options
author | Andres Morales <anmorales@google.com> | 2014-08-14 15:43:30 -0700 |
---|---|---|
committer | Andres Morales <anmorales@google.com> | 2014-08-15 17:08:24 +0000 |
commit | f9a97942e1b530cb87a8d7b28551889bc438a744 (patch) | |
tree | 1896d04a27de27c9c0273945444c5495255b3531 /core/java/android/nfc | |
parent | 9fde9a250fffc15c6bcdfc985de12c8646a9813c (diff) | |
download | frameworks_base-f9a97942e1b530cb87a8d7b28551889bc438a744.zip frameworks_base-f9a97942e1b530cb87a8d7b28551889bc438a744.tar.gz frameworks_base-f9a97942e1b530cb87a8d7b28551889bc438a744.tar.bz2 |
Fix issue where unlock handlers are not properly updated
If an unlock handler already exists, we need to try
to update the tech mask for it. Don't permit unlock
handlers with no tech mask.
Bug: 17054331
Change-Id: I54a885d28bdd8ce41d8646d968621c7d6abc9387
Diffstat (limited to 'core/java/android/nfc')
-rw-r--r-- | core/java/android/nfc/INfcAdapter.aidl | 2 | ||||
-rw-r--r-- | core/java/android/nfc/NfcAdapter.java | 39 |
2 files changed, 25 insertions, 16 deletions
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index ee4d45e..5815fa6 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -59,5 +59,5 @@ interface INfcAdapter void registerLockscreenDispatch(INfcLockscreenDispatch lockscreenDispatch, in int[] techList); void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList); - void removeNfcUnlockHandler(IBinder b); + void removeNfcUnlockHandler(INfcUnlockHandler unlockHandler); } diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index dde2cf1..6bd5a32 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -311,7 +311,7 @@ public final class NfcAdapter { final NfcActivityManager mNfcActivityManager; final Context mContext; - final HashMap<NfcUnlockHandler, IBinder> mNfcUnlockHandlers; + final HashMap<NfcUnlockHandler, INfcUnlockHandler> mNfcUnlockHandlers; final Object mLock; /** @@ -542,7 +542,7 @@ public final class NfcAdapter { NfcAdapter(Context context) { mContext = context; mNfcActivityManager = new NfcActivityManager(this); - mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, IBinder>(); + mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, INfcUnlockHandler>(); mLock = new Object(); } @@ -1498,27 +1498,37 @@ public final class NfcAdapter { * <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. + * receive. There must be at least one tag technology provided, otherwise the unlock handler + * is ignored. * * @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); - } - }; + // If there are no tag technologies, don't bother adding unlock handler + if (tagTechnologies.length == 0) { + return false; + } + try { synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { - return true; + // update the tag technologies + sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler)); + mNfcUnlockHandlers.remove(unlockHandler); } - sService.addNfcUnlockHandler(iHandler, Tag.getTechCodesFromStrings(tagTechnologies)); - mNfcUnlockHandlers.put(unlockHandler, iHandler.asBinder()); + + INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() { + @Override + public boolean onUnlockAttempted(Tag tag) throws RemoteException { + return unlockHandler.onUnlockAttempted(tag); + } + }; + + sService.addNfcUnlockHandler(iHandler, + Tag.getTechCodesFromStrings(tagTechnologies)); + mNfcUnlockHandlers.put(unlockHandler, iHandler); } } catch (RemoteException e) { attemptDeadServiceRecovery(e); @@ -1542,8 +1552,7 @@ public final class NfcAdapter { try { synchronized (mLock) { if (mNfcUnlockHandlers.containsKey(unlockHandler)) { - sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler)); - mNfcUnlockHandlers.remove(unlockHandler); + sService.removeNfcUnlockHandler(mNfcUnlockHandlers.remove(unlockHandler)); } return true; |