Fix the race condition between fingerprint ennrollment sync command

and the internal cleanup operations

Bug: 273948472
Test: adb shell cmd fingerprint sync
Change-Id: Ieaebf17609e36061e875e4ce87c3bea9f13f64c9
This commit is contained in:
Jeff Pu
2023-03-28 18:22:55 +00:00
parent a99778190c
commit 3d280bf5f8

View File

@@ -82,7 +82,9 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.server.SystemService;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -97,7 +99,9 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -1138,12 +1142,28 @@ public class FingerprintService extends SystemService {
if (Utils.isVirtualEnabled(getContext())) {
Slog.i(TAG, "Sync virtual enrollments");
final int userId = ActivityManager.getCurrentUser();
final CountDownLatch latch = new CountDownLatch(mRegistry.getProviders().size());
for (ServiceProvider provider : mRegistry.getProviders()) {
for (FingerprintSensorPropertiesInternal props : provider.getSensorProperties()) {
provider.scheduleInternalCleanup(props.sensorId, userId, null /* callback */,
true /* favorHalEnrollments */);
provider.scheduleInternalCleanup(props.sensorId, userId,
new ClientMonitorCallback() {
@Override
public void onClientFinished(
@NonNull BaseClientMonitor clientMonitor,
boolean success) {
latch.countDown();
if (!success) {
Slog.e(TAG, "Sync virtual enrollments failed");
}
}
}, true /* favorHalEnrollments */);
}
}
try {
latch.await(3, TimeUnit.SECONDS);
} catch (Exception e) {
Slog.e(TAG, "Failed to wait for sync finishing", e);
}
}
}
}