From a63b22c0b8ec4e0aa6ce82eeee1efa41d56af36c Mon Sep 17 00:00:00 2001 From: Jeff Pu Date: Thu, 13 Apr 2023 14:22:14 +0000 Subject: Avoid likely deadlock in the calltree under alarm manager by switching execution thread here in Fingerprint Service Bug: 273440002 Test: Manuelly by introducing lockout on a hidl fps sensor device (e.g. Sunfish) Change-Id: I7e5c759825048183c561c830ed198d5a7b169d3d --- .../biometrics/sensors/fingerprint/hidl/LockoutFrameworkImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/LockoutFrameworkImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/LockoutFrameworkImpl.java index a0befea8e085..36d56c8a1544 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/LockoutFrameworkImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/LockoutFrameworkImpl.java @@ -24,6 +24,8 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Handler; +import android.os.Looper; import android.os.SystemClock; import android.util.Slog; import android.util.SparseBooleanArray; @@ -69,6 +71,7 @@ public class LockoutFrameworkImpl implements LockoutTracker { private final SparseIntArray mFailedAttempts; private final AlarmManager mAlarmManager; private final LockoutReceiver mLockoutReceiver; + private final Handler mHandler; public LockoutFrameworkImpl(Context context, LockoutResetCallback lockoutResetCallback) { mContext = context; @@ -77,6 +80,7 @@ public class LockoutFrameworkImpl implements LockoutTracker { mFailedAttempts = new SparseIntArray(); mAlarmManager = context.getSystemService(AlarmManager.class); mLockoutReceiver = new LockoutReceiver(); + mHandler = new Handler(Looper.getMainLooper()); context.registerReceiver(mLockoutReceiver, new IntentFilter(ACTION_LOCKOUT_RESET), RESET_FINGERPRINT_LOCKOUT, null /* handler */, Context.RECEIVER_EXPORTED); @@ -127,9 +131,11 @@ public class LockoutFrameworkImpl implements LockoutTracker { } private void scheduleLockoutResetForUser(int userId) { - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, + mHandler.post(() -> { + mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS, getLockoutResetIntentForUser(userId)); + }); } private PendingIntent getLockoutResetIntentForUser(int userId) { -- cgit v1.2.3-59-g8ed1b