diff options
| -rw-r--r-- | services/core/java/com/android/server/biometrics/Utils.java | 28 | ||||
| -rw-r--r-- | services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java | 40 |
2 files changed, 35 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java index 06417d725e7e..f51b62d77ab9 100644 --- a/services/core/java/com/android/server/biometrics/Utils.java +++ b/services/core/java/com/android/server/biometrics/Utils.java @@ -66,7 +66,6 @@ import com.android.internal.R; import com.android.internal.widget.LockPatternUtils; import com.android.server.biometrics.sensors.BaseClientMonitor; -import java.util.ArrayList; import java.util.List; public class Utils { @@ -98,33 +97,6 @@ public class Utils { } /** - * Get the enabled HAL instances. If virtual is enabled and available it will be returned as - * the only instance, otherwise all other instances will be returned. - * - * @param context system context - * @param declaredInstances known instances - * @return filtered list of enabled instances - */ - @NonNull - public static List<String> filterAvailableHalInstances(@NonNull Context context, - @NonNull List<String> declaredInstances) { - if (declaredInstances.size() <= 1) { - return declaredInstances; - } - - final int virtualAt = declaredInstances.indexOf("virtual"); - if (isVirtualEnabled(context) && virtualAt != -1) { - return List.of(declaredInstances.get(virtualAt)); - } - - declaredInstances = new ArrayList<>(declaredInstances); - if (virtualAt != -1) { - declaredInstances.remove(virtualAt); - } - return declaredInstances; - } - - /** * Combines {@link PromptInfo#setDeviceCredentialAllowed(boolean)} with * {@link PromptInfo#setAuthenticators(int)}, as the former is not flexible enough. */ diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 28cb7d9445ee..7cc6940f4b9d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -871,19 +871,22 @@ public class FingerprintService extends SystemService { super.registerAuthenticators_enforcePermission(); mRegistry.registerAll(() -> { - final List<ServiceProvider> providers = new ArrayList<>(); - providers.addAll(getHidlProviders(hidlSensors)); List<String> aidlSensors = new ArrayList<>(); final String[] instances = mAidlInstanceNameSupplier.get(); if (instances != null) { aidlSensors.addAll(Lists.newArrayList(instances)); } - providers.addAll(getAidlProviders( - Utils.filterAvailableHalInstances(getContext(), aidlSensors))); + + final Pair<List<FingerprintSensorPropertiesInternal>, List<String>> + filteredInstances = filterAvailableHalInstances(hidlSensors, aidlSensors); + + final List<ServiceProvider> providers = new ArrayList<>(); + providers.addAll(getHidlProviders(filteredInstances.first)); + providers.addAll(getAidlProviders(filteredInstances.second)); + return providers; }); } - @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL) @Override public void addAuthenticatorsRegisteredCallback( @@ -1038,6 +1041,33 @@ public class FingerprintService extends SystemService { }); } + private Pair<List<FingerprintSensorPropertiesInternal>, List<String>> + filterAvailableHalInstances( + @NonNull List<FingerprintSensorPropertiesInternal> hidlInstances, + @NonNull List<String> aidlInstances) { + if ((hidlInstances.size() + aidlInstances.size()) <= 1) { + return new Pair(hidlInstances, aidlInstances); + } + + final int virtualAt = aidlInstances.indexOf("virtual"); + if (Utils.isVirtualEnabled(getContext())) { + if (virtualAt != -1) { + //only virtual instance should be returned + return new Pair(new ArrayList<>(), List.of(aidlInstances.get(virtualAt))); + } else { + Slog.e(TAG, "Could not find virtual interface while it is enabled"); + return new Pair(hidlInstances, aidlInstances); + } + } else { + //remove virtual instance + aidlInstances = new ArrayList<>(aidlInstances); + if (virtualAt != -1) { + aidlInstances.remove(virtualAt); + } + return new Pair(hidlInstances, aidlInstances); + } + } + @NonNull private List<ServiceProvider> getHidlProviders( @NonNull List<FingerprintSensorPropertiesInternal> hidlSensors) { |