From 24e9e966a85c416a94482fcd10dbdd10ceeb9e6c Mon Sep 17 00:00:00 2001 From: Alex Klyubin Date: Thu, 30 Apr 2015 13:30:48 -0700 Subject: Fix thread affinity of FingerprintManager. FingerprintManager internally creates a Handler which needs to be bound to a Looper thread. Prior to this CL the Handler was bound to the Looper of the current thread. This caused issues: * Different instances of FingerprintManager could be bound to different Looper threads. * Callbacks from FingerprintManager were invoked on arbitrary threads (or not at all if the Looper was there but wasn't running). * FingerprintManager couldn't be obtained by apps on most non-main threads leading to java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare(). This CL fixes the issue by binding the FingerprintManager's Handler to the Looper running on the main thread. Bug: 20725228 Change-Id: I4a0382d6e11df9f23b8db9f0deec77369af31b5e --- core/java/android/hardware/fingerprint/FingerprintManager.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 779448b..cf96145 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -626,7 +626,13 @@ public class FingerprintManager { return 0; } - private Handler mHandler = new Handler() { + private Handler mHandler; + + private class MyHandler extends Handler { + private MyHandler(Context context) { + super(context.getMainLooper()); + } + public void handleMessage(android.os.Message msg) { switch(msg.what) { case MSG_ENROLL_RESULT: @@ -711,6 +717,7 @@ public class FingerprintManager { if (mService == null) { Slog.v(TAG, "FingerprintManagerService was null"); } + mHandler = new MyHandler(context); } private int getCurrentUserId() { -- cgit v1.1