Update removeAll path

1) Make the resulting face/fingerprint can be @Nullable. Not all
   removal callers care about the template that was removed, just
   that they were all removed.

2) FingerprintService/FaceService should wait for all providers to
   finish removing before notifying the upper layer of completion

Fixes: 183758063
Test: atest CtsBiometricsTestCases, notice
      testLockoutResetRequestedAfterCredentialUnlock finishes
      10 seconds quicker now (latch in LSS doesn't time out anymore)
Change-Id: I87c50ccf5524fd5440c9a6c2c7a0fd4cc61e684d
This commit is contained in:
Kevin Chyn
2021-03-29 23:06:03 -07:00
parent 17681607d9
commit 15e1d3f7e7
6 changed files with 219 additions and 9 deletions

View File

@@ -1059,7 +1059,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
*
* @param face The face template that was removed.
*/
public void onRemovalSucceeded(Face face, int remaining) {
public void onRemovalSucceeded(@Nullable Face face, int remaining) {
}
}
@@ -1258,10 +1258,6 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
if (mRemovalCallback == null) {
return;
}
if (face == null) {
Slog.e(TAG, "Received MSG_REMOVED, but face is null");
return;
}
mRemovalCallback.onRemovalSucceeded(face, remaining);
}

View File

@@ -0,0 +1,97 @@
/*
* Copyright (C) 2021 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.face;
import android.os.RemoteException;
/**
* Provides default methods for callers who only need a subset of the functionality.
* @hide
*/
public class FaceServiceReceiver extends IFaceServiceReceiver.Stub {
@Override
public void onEnrollResult(Face face, int remaining) throws RemoteException {
}
@Override
public void onAcquired(int acquiredInfo, int vendorCode) throws RemoteException {
}
@Override
public void onAuthenticationSucceeded(Face face, int userId, boolean isStrongBiometric)
throws RemoteException {
}
@Override
public void onFaceDetected(int sensorId, int userId, boolean isStrongBiometric)
throws RemoteException {
}
@Override
public void onAuthenticationFailed() throws RemoteException {
}
@Override
public void onError(int error, int vendorCode) throws RemoteException {
}
@Override
public void onRemoved(Face face, int remaining) throws RemoteException {
}
@Override
public void onFeatureSet(boolean success, int feature) throws RemoteException {
}
@Override
public void onFeatureGet(boolean success, int feature, boolean value) throws RemoteException {
}
@Override
public void onChallengeGenerated(int sensorId, long challenge) throws RemoteException {
}
@Override
public void onChallengeInterrupted(int sensorId) throws RemoteException {
}
@Override
public void onChallengeInterruptFinished(int sensorId) throws RemoteException {
}
@Override
public void onAuthenticationFrame(FaceAuthenticationFrame frame) throws RemoteException {
}
@Override
public void onEnrollmentFrame(FaceEnrollFrame frame) throws RemoteException {
}
}

View File

@@ -452,7 +452,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
* {@link #remove} is called on a group, this should be the number of remaining
* fingerprints in the group, and 0 after the last fingerprint is removed.
*/
public void onRemovalSucceeded(Fingerprint fp, int remaining) { }
public void onRemovalSucceeded(@Nullable Fingerprint fp, int remaining) { }
}
/**

View File

@@ -0,0 +1,77 @@
/*
* Copyright (C) 2021 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.os.RemoteException;
/**
* Provides default methods for callers who only need a subset of the functionality.
* @hide
*/
public class FingerprintServiceReceiver extends IFingerprintServiceReceiver.Stub {
@Override
public void onEnrollResult(Fingerprint fp, int remaining) throws RemoteException {
}
@Override
public void onAcquired(int acquiredInfo, int vendorCode) throws RemoteException {
}
@Override
public void onAuthenticationSucceeded(Fingerprint fp, int userId, boolean isStrongBiometric)
throws RemoteException {
}
@Override
public void onFingerprintDetected(int sensorId, int userId, boolean isStrongBiometric)
throws RemoteException {
}
@Override
public void onAuthenticationFailed() throws RemoteException {
}
@Override
public void onError(int error, int vendorCode) throws RemoteException {
}
@Override
public void onRemoved(Fingerprint fp, int remaining) throws RemoteException {
}
@Override
public void onChallengeGenerated(int sensorId, long challenge) throws RemoteException {
}
@Override
public void onUdfpsPointerDown(int sensorId) throws RemoteException {
}
@Override
public void onUdfpsPointerUp(int sensorId) throws RemoteException {
}
}

View File

@@ -36,6 +36,7 @@ import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
import android.hardware.face.Face;
import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.face.FaceServiceReceiver;
import android.hardware.face.IFaceService;
import android.hardware.face.IFaceServiceReceiver;
import android.os.Binder;
@@ -394,10 +395,29 @@ public class FaceService extends SystemService implements BiometricServiceCallba
final IFaceServiceReceiver receiver, final String opPackageName) {
Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
final FaceServiceReceiver internalReceiver = new FaceServiceReceiver() {
int sensorsFinishedRemoving = 0;
final int numSensors = getSensorPropertiesInternal(
getContext().getOpPackageName()).size();
@Override
public void onRemoved(Face face, int remaining) throws RemoteException {
if (remaining == 0) {
sensorsFinishedRemoving++;
Slog.d(TAG, "sensorsFinishedRemoving: " + sensorsFinishedRemoving
+ ", numSensors: " + numSensors);
if (sensorsFinishedRemoving == numSensors) {
receiver.onRemoved(null, 0 /* remaining */);
}
}
}
};
// This effectively iterates through all sensors, but has to do so by finding all
// sensors under each provider.
for (ServiceProvider provider : mServiceProviders) {
List<FaceSensorPropertiesInternal> props = provider.getSensorProperties();
for (FaceSensorPropertiesInternal prop : props) {
provider.scheduleRemoveAll(prop.sensorId, token, userId, receiver,
provider.scheduleRemoveAll(prop.sensorId, token, userId, internalReceiver,
opPackageName);
}
}

View File

@@ -49,6 +49,7 @@ import android.hardware.biometrics.fingerprint.SensorProps;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
@@ -505,12 +506,31 @@ public class FingerprintService extends SystemService implements BiometricServic
@Override // Binder call
public void removeAll(final IBinder token, final int userId,
final IFingerprintServiceReceiver receiver, final String opPackageName) {
Utils.checkPermission(getContext(), MANAGE_FINGERPRINT);
Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
final FingerprintServiceReceiver internalReceiver = new FingerprintServiceReceiver() {
int sensorsFinishedRemoving = 0;
final int numSensors = getSensorPropertiesInternal(
getContext().getOpPackageName()).size();
@Override
public void onRemoved(Fingerprint fp, int remaining) throws RemoteException {
if (remaining == 0) {
sensorsFinishedRemoving++;
Slog.d(TAG, "sensorsFinishedRemoving: " + sensorsFinishedRemoving
+ ", numSensors: " + numSensors);
if (sensorsFinishedRemoving == numSensors) {
receiver.onRemoved(null, 0 /* remaining */);
}
}
}
};
// This effectively iterates through all sensors, but has to do so by finding all
// sensors under each provider.
for (ServiceProvider provider : mServiceProviders) {
List<FingerprintSensorPropertiesInternal> props = provider.getSensorProperties();
for (FingerprintSensorPropertiesInternal prop : props) {
provider.scheduleRemoveAll(prop.sensorId, token, receiver, userId,
provider.scheduleRemoveAll(prop.sensorId, token, internalReceiver, userId,
opPackageName);
}
}