diff options
| -rw-r--r-- | services/core/java/com/android/server/fingerprint/FingerprintService.java | 93 | ||||
| -rw-r--r-- | services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java | 9 |
2 files changed, 48 insertions, 54 deletions
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index b1c165ef048d..60f8cc4e486b 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -81,7 +81,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; @@ -89,14 +88,14 @@ import java.util.concurrent.CopyOnWriteArrayList; /** * A service to manage multiple clients that want to access the fingerprint HAL API. * The service is responsible for maintaining a list of clients and dispatching all - * fingerprint -related events. + * fingerprint-related events. * * @hide */ public class FingerprintService extends SystemService implements IHwBinder.DeathRecipient { static final String TAG = "FingerprintService"; static final boolean DEBUG = true; - private static final boolean CLEANUP_UNUSED_FP = false; + private static final boolean CLEANUP_UNUSED_FP = true; private static final String FP_DATA_DIR = "fpdata"; private static final int MSG_USER_SWITCHING = 10; private static final String ACTION_LOCKOUT_RESET = @@ -139,10 +138,8 @@ public class FingerprintService extends SystemService implements IHwBinder.Death private ClientMonitor mPendingClient; private PerformanceStats mPerformanceStats; - private IBinder mToken = new Binder(); // used for internal FingerprintService enumeration - private LinkedList<Integer> mEnumeratingUserIds = new LinkedList<>(); - private ArrayList<UserFingerprint> mUnknownFingerprints = new ArrayList<>(); // hw finterprints + private ArrayList<UserFingerprint> mUnknownFingerprints = new ArrayList<>(); // hw fingerprints private class UserFingerprint { Fingerprint f; @@ -233,7 +230,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death public synchronized IBiometricsFingerprint getFingerprintDaemon() { if (mDaemon == null) { - Slog.v(TAG, "mDeamon was null, reconnect to fingerprint"); + Slog.v(TAG, "mDaemon was null, reconnect to fingerprint"); try { mDaemon = IBiometricsFingerprint.getService(); } catch (java.util.NoSuchElementException e) { @@ -259,7 +256,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death if (mHalDeviceId != 0) { loadAuthenticatorIds(); updateActiveGroup(ActivityManager.getCurrentUser(), null); - doFingerprintCleanup(ActivityManager.getCurrentUser()); + doFingerprintCleanupForUser(ActivityManager.getCurrentUser()); } else { Slog.w(TAG, "Failed to open Fingerprint HAL!"); MetricsLogger.count(mContext, "fingerprintd_openhal_error", 1); @@ -288,52 +285,41 @@ public class FingerprintService extends SystemService implements IHwBinder.Death } } - private void doFingerprintCleanup(int userId) { + /** + * This method should be called upon connection to the daemon, and when user switches. + * @param userId + */ + private void doFingerprintCleanupForUser(int userId) { if (CLEANUP_UNUSED_FP) { - resetEnumerateState(); - mEnumeratingUserIds.push(userId); - enumerateNextUser(); + enumerateUser(userId); } } - private void resetEnumerateState() { - if (DEBUG) Slog.v(TAG, "Enumerate cleaning up"); - mEnumeratingUserIds.clear(); + private void clearEnumerateState() { + if (DEBUG) Slog.v(TAG, "clearEnumerateState()"); mUnknownFingerprints.clear(); } - private void enumerateNextUser() { - int nextUser = mEnumeratingUserIds.getFirst(); - updateActiveGroup(nextUser, null); + private void enumerateUser(int userId) { + if (DEBUG) Slog.v(TAG, "Enumerating user(" + userId + ")"); boolean restricted = !hasPermission(MANAGE_FINGERPRINT); - - if (DEBUG) Slog.v(TAG, "Enumerating user id " + nextUser + " of " - + mEnumeratingUserIds.size() + " remaining users"); - - startEnumerate(mToken, nextUser, null, restricted, true /* internal */); + startEnumerate(mToken, userId, null, restricted, true /* internal */); } // Remove unknown fingerprints from hardware private void cleanupUnknownFingerprints() { if (!mUnknownFingerprints.isEmpty()) { - Slog.w(TAG, "unknown fingerprint size: " + mUnknownFingerprints.size()); UserFingerprint uf = mUnknownFingerprints.get(0); mUnknownFingerprints.remove(uf); boolean restricted = !hasPermission(MANAGE_FINGERPRINT); - updateActiveGroup(uf.userId, null); startRemove(mToken, uf.f.getFingerId(), uf.f.getGroupId(), uf.userId, null, restricted, true /* internal */); } else { - resetEnumerateState(); + clearEnumerateState(); } } protected void handleEnumerate(long deviceId, int fingerId, int groupId, int remaining) { - if (DEBUG) Slog.w(TAG, "Enumerate: fid=" + fingerId - + ", gid=" + groupId - + ", dev=" + deviceId - + ", rem=" + remaining); - ClientMonitor client = mCurrentClient; if ( !(client instanceof InternalRemovalClient) && !(client instanceof EnumerateClient) ) { @@ -343,24 +329,21 @@ public class FingerprintService extends SystemService implements IHwBinder.Death // All fingerprints in hardware for this user were enumerated if (remaining == 0) { - mEnumeratingUserIds.poll(); - if (client instanceof InternalEnumerateClient) { - List<Fingerprint> enrolled = ((InternalEnumerateClient) client).getEnumeratedList(); - Slog.w(TAG, "Added " + enrolled.size() + " enumerated fingerprints for deletion"); - for (Fingerprint f : enrolled) { + List<Fingerprint> unknownFingerprints = + ((InternalEnumerateClient) client).getUnknownFingerprints(); + + if (!unknownFingerprints.isEmpty()) { + Slog.w(TAG, "Adding " + unknownFingerprints.size() + + " fingerprints for deletion"); + } + for (Fingerprint f : unknownFingerprints) { mUnknownFingerprints.add(new UserFingerprint(f, client.getTargetUserId())); } - } - - removeClient(client); - - if (!mEnumeratingUserIds.isEmpty()) { - enumerateNextUser(); - } else if (client instanceof InternalEnumerateClient) { - if (DEBUG) Slog.v(TAG, "Finished enumerating all users"); - // This will start a chain of InternalRemovalClients + removeClient(client); cleanupUnknownFingerprints(); + } else { + removeClient(client); } } } @@ -368,7 +351,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death protected void handleError(long deviceId, int error, int vendorCode) { ClientMonitor client = mCurrentClient; if (client instanceof InternalRemovalClient || client instanceof InternalEnumerateClient) { - resetEnumerateState(); + clearEnumerateState(); } if (client != null && client.onError(error, vendorCode)) { removeClient(client); @@ -412,7 +395,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death if (client instanceof InternalRemovalClient && !mUnknownFingerprints.isEmpty()) { cleanupUnknownFingerprints(); } else if (client instanceof InternalRemovalClient){ - resetEnumerateState(); + clearEnumerateState(); } } @@ -466,8 +449,14 @@ public class FingerprintService extends SystemService implements IHwBinder.Death } void handleUserSwitching(int userId) { + if (mCurrentClient instanceof InternalRemovalClient + || mCurrentClient instanceof InternalEnumerateClient) { + Slog.w(TAG, "User switched while performing cleanup"); + removeClient(mCurrentClient); + clearEnumerateState(); + } updateActiveGroup(userId, null); - doFingerprintCleanup(userId); + doFingerprintCleanupForUser(userId); } private void removeClient(ClientMonitor client) { @@ -555,6 +544,12 @@ public class FingerprintService extends SystemService implements IHwBinder.Death // This condition means we're currently running internal diagnostics to // remove extra fingerprints in the hardware and/or the software // TODO: design an escape hatch in case client never finishes + if (newClient != null) { + Slog.w(TAG, "Internal cleanup in progress but trying to start client " + + newClient.getClass().getSuperclass().getSimpleName() + + "(" + newClient.getOwnerString() + ")" + + ", initiatedByClient = " + initiatedByClient); + } } else { currentClient.stop(initiatedByClient); @@ -567,7 +562,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death if (DEBUG) Slog.v(TAG, "starting client " + newClient.getClass().getSuperclass().getSimpleName() + "(" + newClient.getOwnerString() + ")" - + ", initiatedByClient = " + initiatedByClient + ")"); + + ", initiatedByClient = " + initiatedByClient); notifyClientActiveCallbacks(true); newClient.start(); diff --git a/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java b/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java index 88d9ef43e02f..434db98ad373 100644 --- a/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java +++ b/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java @@ -30,7 +30,7 @@ import java.util.List; public abstract class InternalEnumerateClient extends EnumerateClient { private List<Fingerprint> mEnrolledList; - private List<Fingerprint> mEnumeratedList = new ArrayList<>(); // list of fp to delete + private List<Fingerprint> mUnknownFingerprints = new ArrayList<>(); // list of fp to delete public InternalEnumerateClient(Context context, long halDeviceId, IBinder token, IFingerprintServiceReceiver receiver, int groupId, int userId, @@ -47,7 +47,6 @@ public abstract class InternalEnumerateClient extends EnumerateClient { if (mEnrolledList.get(i).getFingerId() == fingerId) { mEnrolledList.remove(i); matched = true; - Slog.e(TAG, "Matched fingerprint fid=" + fingerId); break; } } @@ -55,7 +54,7 @@ public abstract class InternalEnumerateClient extends EnumerateClient { // fingerId 0 means no fingerprints are in hardware if (!matched && fingerId != 0) { Fingerprint fingerprint = new Fingerprint("", groupId, fingerId, getHalDeviceId()); - mEnumeratedList.add(fingerprint); + mUnknownFingerprints.add(fingerprint); } } @@ -76,8 +75,8 @@ public abstract class InternalEnumerateClient extends EnumerateClient { mEnrolledList.clear(); } - public List<Fingerprint> getEnumeratedList() { - return mEnumeratedList; + public List<Fingerprint> getUnknownFingerprints() { + return mUnknownFingerprints; } @Override |