blob: 8d2b249a6f5a1d9620569db7bce6e9ca2d5dc4bf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
package com.android.nfc;
import android.nfc.INfcUnlockHandler;
import android.nfc.Tag;
import android.os.IBinder;
import android.util.Log;
import java.util.HashMap;
import java.util.Iterator;
/**
* Singleton for handling NFC Unlock related logic and state.
*/
class NfcUnlockManager {
private static final String TAG = "NfcUnlockManager";
private final HashMap<IBinder, UnlockHandlerWrapper> mUnlockHandlers;
private int mLockscreenPollMask;
private static class UnlockHandlerWrapper {
final INfcUnlockHandler mUnlockHandler;
final int mPollMask;
private UnlockHandlerWrapper(INfcUnlockHandler unlockHandler, int pollMask) {
mUnlockHandler = unlockHandler;
mPollMask = pollMask;
}
}
public static NfcUnlockManager getInstance() {
return Singleton.INSTANCE;
}
synchronized int addUnlockHandler(INfcUnlockHandler unlockHandler, int pollMask) {
if (mUnlockHandlers.containsKey(unlockHandler.asBinder())) {
return mLockscreenPollMask;
}
mUnlockHandlers.put(unlockHandler.asBinder(),
new UnlockHandlerWrapper(unlockHandler, pollMask));
return (mLockscreenPollMask |= pollMask);
}
synchronized int removeUnlockHandler(IBinder unlockHandler) {
if (mUnlockHandlers.containsKey(unlockHandler)) {
mUnlockHandlers.remove(unlockHandler);
mLockscreenPollMask = recomputePollMask();
}
return mLockscreenPollMask;
}
synchronized boolean tryUnlock(Tag tag) {
Iterator<IBinder> iterator = mUnlockHandlers.keySet().iterator();
while (iterator.hasNext()) {
try {
IBinder binder = iterator.next();
UnlockHandlerWrapper handlerWrapper = mUnlockHandlers.get(binder);
if (handlerWrapper.mUnlockHandler.onUnlockAttempted(tag)) {
return true;
}
} catch (Exception e) {
Log.e(TAG, "failed to communicate with unlock handler, removing", e);
iterator.remove();
mLockscreenPollMask = recomputePollMask();
}
}
return false;
}
private int recomputePollMask() {
int pollMask = 0;
for (UnlockHandlerWrapper wrapper : mUnlockHandlers.values()) {
pollMask |= wrapper.mPollMask;
}
return pollMask;
}
synchronized int getLockscreenPollMask() {
return mLockscreenPollMask;
}
synchronized boolean isLockscreenPollingEnabled() {
return mLockscreenPollMask != 0;
}
private static class Singleton {
private static final NfcUnlockManager INSTANCE = new NfcUnlockManager();
}
private NfcUnlockManager() {
mUnlockHandlers = new HashMap<IBinder, UnlockHandlerWrapper>();
mLockscreenPollMask = 0;
}
}
|