summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/hardware/fingerprint/FingerprintManager.java148
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintDaemon.aidl40
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintDaemonCallback.aidl29
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintService.aidl3
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl7
5 files changed, 122 insertions, 105 deletions
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index aa109de752e3..4b5707890518 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -62,6 +62,7 @@ public class FingerprintManager {
private static final int MSG_AUTHENTICATION_FAILED = 103;
private static final int MSG_ERROR = 104;
private static final int MSG_REMOVED = 105;
+ private static final int MSG_ENUMERATED = 106;
//
// Error messages from fingerprint hardware during initilization, enrollment, authentication or
@@ -116,6 +117,10 @@ public class FingerprintManager {
* the above categories. Vendors are responsible for providing error strings for these errors.
* @hide
*/
+ public static final int FINGERPRINT_ERROR_VENDOR = 8;
+ /**
+ * @hide
+ */
public static final int FINGERPRINT_ERROR_VENDOR_BASE = 1000;
//
@@ -167,6 +172,10 @@ public class FingerprintManager {
* the above categories. Vendors are responsible for providing error strings for these errors.
* @hide
*/
+ public static final int FINGERPRINT_ACQUIRED_VENDOR = 6;
+ /**
+ * @hide
+ */
public static final int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
private IFingerprintService mService;
@@ -175,6 +184,7 @@ public class FingerprintManager {
private AuthenticationCallback mAuthenticationCallback;
private EnrollmentCallback mEnrollmentCallback;
private RemovalCallback mRemovalCallback;
+ private EnumerateCallback mEnumerateCallback;
private CryptoObject mCryptoObject;
private Fingerprint mRemovalFingerprint;
private Handler mHandler;
@@ -403,6 +413,29 @@ public class FingerprintManager {
};
/**
+ * Callback structure provided to {@link FingerprintManager#enumerate(int). Users of
+ * {@link #FingerprintManager()} may optionally provide an implementation of this to
+ * {@link FingerprintManager#enumerate(int, int, EnumerateCallback)} for listening to
+ * fingerprint template removal events.
+ *
+ * @hide
+ */
+ public static abstract class EnumerateCallback {
+ /**
+ * Called when the given fingerprint can't be removed.
+ * @param errMsgId An associated error message id
+ * @param errString An error message indicating why the fingerprint id can't be removed
+ */
+ public void onEnumerateError(int errMsgId, CharSequence errString) { }
+
+ /**
+ * Called when a given fingerprint is successfully removed.
+ * @param fingerprint the fingerprint template that was removed.
+ */
+ public void onEnumerate(Fingerprint fingerprint) { }
+ };
+
+ /**
* @hide
*/
public static abstract class LockoutResetCallback {
@@ -484,7 +517,7 @@ public class FingerprintManager {
// Though this may not be a hardware issue, it will cause apps to give up or try
// again later.
callback.onAuthenticationError(FINGERPRINT_ERROR_HW_UNAVAILABLE,
- getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE));
+ getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
}
}
}
@@ -534,7 +567,7 @@ public class FingerprintManager {
// Though this may not be a hardware issue, it will cause apps to give up or try
// again later.
callback.onEnrollmentError(FINGERPRINT_ERROR_HW_UNAVAILABLE,
- getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE));
+ getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
}
}
}
@@ -604,7 +637,29 @@ public class FingerprintManager {
Log.w(TAG, "Remote exception in remove: ", e);
if (callback != null) {
callback.onRemovalError(fp, FINGERPRINT_ERROR_HW_UNAVAILABLE,
- getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE));
+ getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
+ }
+ }
+ }
+
+ /**
+ * Enumerate all fingerprint templates stored in hardware and/or protected storage.
+ * @param userId the user who this fingerprint belongs to
+ * @param callback an optional callback to verify that fingerprint templates have been
+ * successfully removed. May be null of no callback is required.
+ *
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FINGERPRINT)
+ public void enumerate(int userId, @NonNull EnumerateCallback callback) {
+ if (mService != null) try {
+ mEnumerateCallback = callback;
+ mService.enumerate(mToken, userId, mServiceReceiver);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Remote exception in enumerate: ", e);
+ if (callback != null) {
+ callback.onEnumerateError(FINGERPRINT_ERROR_HW_UNAVAILABLE,
+ getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
}
}
}
@@ -800,7 +855,8 @@ public class FingerprintManager {
sendEnrollResult((Fingerprint) msg.obj, msg.arg1 /* remaining */);
break;
case MSG_ACQUIRED:
- sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */);
+ sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */,
+ msg.arg2 /* vendorCode */);
break;
case MSG_AUTHENTICATION_SUCCEEDED:
sendAuthenticatedSucceeded((Fingerprint) msg.obj, msg.arg1 /* userId */);
@@ -809,11 +865,15 @@ public class FingerprintManager {
sendAuthenticatedFailed();
break;
case MSG_ERROR:
- sendErrorResult((Long) msg.obj /* deviceId */, msg.arg1 /* errMsgId */);
+ sendErrorResult((Long) msg.obj /* deviceId */, msg.arg1 /* errMsgId */,
+ msg.arg2 /* vendorCode */);
break;
case MSG_REMOVED:
sendRemovedResult((Long) msg.obj /* deviceId */, msg.arg1 /* fingerId */,
msg.arg2 /* groupId */);
+ case MSG_ENUMERATED:
+ sendEnumeratedResult((Long) msg.obj /* deviceId */, msg.arg1 /* fingerId */,
+ msg.arg2 /* groupId */);
}
}
@@ -834,14 +894,28 @@ public class FingerprintManager {
}
}
- private void sendErrorResult(long deviceId, int errMsgId) {
+ private void sendEnumeratedResult(long deviceId, int fingerId, int groupId) {
+ if (mEnumerateCallback != null) {
+ mEnumerateCallback.onEnumerate(new Fingerprint(null, groupId, fingerId, deviceId));
+ }
+ }
+
+ private void sendErrorResult(long deviceId, int errMsgId, int vendorCode) {
+ // emulate HAL 2.1 behavior and send real errMsgId
+ final int clientErrMsgId = errMsgId == FINGERPRINT_ERROR_VENDOR
+ ? (vendorCode + FINGERPRINT_ERROR_VENDOR_BASE) : errMsgId;
if (mEnrollmentCallback != null) {
- mEnrollmentCallback.onEnrollmentError(errMsgId, getErrorString(errMsgId));
+ mEnrollmentCallback.onEnrollmentError(clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
} else if (mAuthenticationCallback != null) {
- mAuthenticationCallback.onAuthenticationError(errMsgId, getErrorString(errMsgId));
+ mAuthenticationCallback.onAuthenticationError(clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
} else if (mRemovalCallback != null) {
- mRemovalCallback.onRemovalError(mRemovalFingerprint, errMsgId,
- getErrorString(errMsgId));
+ mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
+ } else if (mEnumerateCallback != null) {
+ mEnumerateCallback.onEnumerateError(clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
}
}
@@ -865,18 +939,21 @@ public class FingerprintManager {
}
}
- private void sendAcquiredResult(long deviceId, int acquireInfo) {
+ private void sendAcquiredResult(long deviceId, int acquireInfo, int vendorCode) {
if (mAuthenticationCallback != null) {
mAuthenticationCallback.onAuthenticationAcquired(acquireInfo);
}
- final String msg = getAcquiredString(acquireInfo);
+ final String msg = getAcquiredString(acquireInfo, vendorCode);
if (msg == null) {
return;
}
+ // emulate HAL 2.1 behavior and send real acquiredInfo
+ final int clientInfo = acquireInfo == FINGERPRINT_ACQUIRED_VENDOR
+ ? (vendorCode + FINGERPRINT_ACQUIRED_VENDOR_BASE) : acquireInfo;
if (mEnrollmentCallback != null) {
- mEnrollmentCallback.onEnrollmentHelp(acquireInfo, msg);
+ mEnrollmentCallback.onEnrollmentHelp(clientInfo, msg);
} else if (mAuthenticationCallback != null) {
- mAuthenticationCallback.onAuthenticationHelp(acquireInfo, msg);
+ mAuthenticationCallback.onAuthenticationHelp(clientInfo, msg);
}
}
};
@@ -917,7 +994,7 @@ public class FingerprintManager {
}
}
- private String getErrorString(int errMsg) {
+ private String getErrorString(int errMsg, int vendorCode) {
switch (errMsg) {
case FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
return mContext.getString(
@@ -934,20 +1011,19 @@ public class FingerprintManager {
return mContext.getString(com.android.internal.R.string.fingerprint_error_canceled);
case FINGERPRINT_ERROR_LOCKOUT:
return mContext.getString(com.android.internal.R.string.fingerprint_error_lockout);
- default:
- if (errMsg >= FINGERPRINT_ERROR_VENDOR_BASE) {
- int msgNumber = errMsg - FINGERPRINT_ERROR_VENDOR_BASE;
+ case FINGERPRINT_ERROR_VENDOR: {
String[] msgArray = mContext.getResources().getStringArray(
com.android.internal.R.array.fingerprint_error_vendor);
- if (msgNumber < msgArray.length) {
- return msgArray[msgNumber];
+ if (vendorCode < msgArray.length) {
+ return msgArray[vendorCode];
}
}
- return null;
}
+ Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode);
+ return null;
}
- private String getAcquiredString(int acquireInfo) {
+ private String getAcquiredString(int acquireInfo, int vendorCode) {
switch (acquireInfo) {
case FINGERPRINT_ACQUIRED_GOOD:
return null;
@@ -966,17 +1042,16 @@ public class FingerprintManager {
case FINGERPRINT_ACQUIRED_TOO_FAST:
return mContext.getString(
com.android.internal.R.string.fingerprint_acquired_too_fast);
- default:
- if (acquireInfo >= FINGERPRINT_ACQUIRED_VENDOR_BASE) {
- int msgNumber = acquireInfo - FINGERPRINT_ACQUIRED_VENDOR_BASE;
+ case FINGERPRINT_ACQUIRED_VENDOR: {
String[] msgArray = mContext.getResources().getStringArray(
com.android.internal.R.array.fingerprint_acquired_vendor);
- if (msgNumber < msgArray.length) {
- return msgArray[msgNumber];
+ if (vendorCode < msgArray.length) {
+ return msgArray[vendorCode];
}
}
- return null;
}
+ Slog.w(TAG, "Invalid acquired message: " + acquireInfo + ", " + vendorCode);
+ return null;
}
private IFingerprintServiceReceiver mServiceReceiver = new IFingerprintServiceReceiver.Stub() {
@@ -988,8 +1063,8 @@ public class FingerprintManager {
}
@Override // binder call
- public void onAcquired(long deviceId, int acquireInfo) {
- mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, 0, deviceId).sendToTarget();
+ public void onAcquired(long deviceId, int acquireInfo, int vendorCode) {
+ mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, vendorCode, deviceId).sendToTarget();
}
@Override // binder call
@@ -1003,14 +1078,21 @@ public class FingerprintManager {
}
@Override // binder call
- public void onError(long deviceId, int error) {
- mHandler.obtainMessage(MSG_ERROR, error, 0, deviceId).sendToTarget();
+ public void onError(long deviceId, int error, int vendorCode) {
+ mHandler.obtainMessage(MSG_ERROR, error, vendorCode, deviceId).sendToTarget();
}
@Override // binder call
- public void onRemoved(long deviceId, int fingerId, int groupId) {
+ public void onRemoved(long deviceId, int fingerId, int groupId, int remaining) {
+ // TODO: propagate remaining
mHandler.obtainMessage(MSG_REMOVED, fingerId, groupId, deviceId).sendToTarget();
}
+
+ @Override // binder call
+ public void onEnumerated(long deviceId, int fingerId, int groupId, int remaining) {
+ // TODO: propagate remaining
+ mHandler.obtainMessage(MSG_ENUMERATED, fingerId, groupId, deviceId).sendToTarget();
+ }
};
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintDaemon.aidl b/core/java/android/hardware/fingerprint/IFingerprintDaemon.aidl
deleted file mode 100644
index f40f8a3fdbf2..000000000000
--- a/core/java/android/hardware/fingerprint/IFingerprintDaemon.aidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.fingerprint;
-
-import android.hardware.fingerprint.IFingerprintDaemonCallback;
-
-/**
- * Communication channel from FingerprintService to FingerprintDaemon (fingerprintd)
- * @hide
- */
-
-interface IFingerprintDaemon {
- int authenticate(long sessionId, int groupId);
- int cancelAuthentication();
- int enroll(in byte [] token, int groupId, int timeout);
- int cancelEnrollment();
- long preEnroll();
- int remove(int fingerId, int groupId);
- long getAuthenticatorId();
- int setActiveGroup(int groupId, in byte[] path);
- long openHal();
- int closeHal();
- void init(IFingerprintDaemonCallback callback);
- int postEnroll();
- int enumerate();
- int cancelEnumeration();
-}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintDaemonCallback.aidl b/core/java/android/hardware/fingerprint/IFingerprintDaemonCallback.aidl
deleted file mode 100644
index bd8ad6e50172..000000000000
--- a/core/java/android/hardware/fingerprint/IFingerprintDaemonCallback.aidl
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.fingerprint;
-
-/**
- * Communication channel from the fingerprintd back to FingerprintService.
- * @hide
- */
- interface IFingerprintDaemonCallback {
- void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining);
- void onAcquired(long deviceId, int acquiredInfo);
- void onAuthenticated(long deviceId, int fingerId, int groupId);
- void onError(long deviceId, int error);
- void onRemoved(long deviceId, int fingerId, int groupId);
- void onEnumerate(long deviceId, in int [] fingerIds, in int [] groupIds);
-}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index a83397a17734..ae3fc374c9a5 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -79,4 +79,7 @@ interface IFingerprintService {
// Explicitly set the active user (for enrolling work profile)
void setActiveUser(int uid);
+
+ // Enumerate all fingerprints
+ void enumerate(IBinder token, int userId, IFingerprintServiceReceiver receiver);
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
index b024b29fef06..370383f4a909 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
@@ -25,9 +25,10 @@ import android.os.UserHandle;
*/
oneway interface IFingerprintServiceReceiver {
void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining);
- void onAcquired(long deviceId, int acquiredInfo);
+ void onAcquired(long deviceId, int acquiredInfo, int vendorCode);
void onAuthenticationSucceeded(long deviceId, in Fingerprint fp, int userId);
void onAuthenticationFailed(long deviceId);
- void onError(long deviceId, int error);
- void onRemoved(long deviceId, int fingerId, int groupId);
+ void onError(long deviceId, int error, int vendorCode);
+ void onRemoved(long deviceId, int fingerId, int groupId, int remaining);
+ void onEnumerated(long deviceId, int fingerId, int groupId, int remaining);
}