From 788d66597969e388efd2a7b2317f859694269474 Mon Sep 17 00:00:00 2001 From: Ilya Matyukhin Date: Wed, 26 May 2021 18:09:04 -0700 Subject: [PATCH] Return immediately from isHardwareDetected If the service is not available at the time of the call, do not call ServiceManager.waitForDeclaredService(halFqn) as this call will wait indefinitely for the HAL to start if the HAL is declared. This is important because isHardwareDetected is used in SystemUI (Keyguard) to determine whether certain UI elements should be available. If the HAL crashes and cannot restart, this can cause a SystemUI ANR. Bug: 189275305 Test: on device with a declared HAL that never registers itself. Change-Id: Ia768bf5b1bc124fd789cbe8e5fe523e1fa2becca --- .../biometrics/sensors/face/aidl/FaceProvider.java | 9 ++++++++- .../sensors/fingerprint/aidl/FingerprintProvider.java | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index 6a7d201d9f253..36a1292e0e7ed 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -160,6 +160,13 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { return "FaceProvider/" + mHalInstanceName; } + boolean hasHalInstance() { + if (mTestHalEnabled) { + return true; + } + return ServiceManager.checkService(IFace.DESCRIPTOR + "/" + mHalInstanceName) != null; + } + @Nullable @VisibleForTesting synchronized IFace getHalInstance() { @@ -291,7 +298,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { @Override public boolean isHardwareDetected(int sensorId) { - return getHalInstance() != null; + return hasHalInstance(); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 14024d0e74789..293b9e41a169e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -172,6 +172,14 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi return "FingerprintProvider/" + mHalInstanceName; } + boolean hasHalInstance() { + if (mTestHalEnabled) { + return true; + } + return (ServiceManager.checkService(IFingerprint.DESCRIPTOR + "/" + mHalInstanceName) + != null); + } + @Nullable @VisibleForTesting synchronized IFingerprint getHalInstance() { @@ -454,7 +462,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @Override public boolean isHardwareDetected(int sensorId) { - return getHalInstance() != null; + return hasHalInstance(); } @Override