From 7a3bf7c46e54cf226f86e3eeedb100a159f08d00 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Tue, 12 Jul 2016 15:31:55 -0700 Subject: [PATCH] Allow LockPatternUtils usage on non-looper threads Fixes an issue where LPU could no longer be used on a non-looper thread even though the looper is only used for a certain callback. Now only using that callback mechanism is fatal on a non-looper thread. Change-Id: I2d766bd6c913e345ed6a3500b486263c8bc12b07 Fixes: 30076804 --- .../com/android/internal/widget/LockPatternUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index eff116b7570ce..0059d4df79f7a 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -149,7 +149,7 @@ public class LockPatternUtils { private DevicePolicyManager mDevicePolicyManager; private ILockSettings mLockSettingsService; private UserManager mUserManager; - private final Handler mHandler = new Handler(); + private final Handler mHandler; /** * Use {@link TrustManager#isTrustUsuallyManaged(int)}. @@ -231,6 +231,9 @@ public class LockPatternUtils { public LockPatternUtils(Context context) { mContext = context; mContentResolver = context.getContentResolver(); + + Looper looper = Looper.myLooper(); + mHandler = looper != null ? new Handler(looper) : null; } private ILockSettings getLockSettings() { @@ -1506,6 +1509,10 @@ public class LockPatternUtils { if (callback == null) { return null; } else { + if (mHandler == null) { + throw new IllegalStateException("Must construct LockPatternUtils on a looper thread" + + " to use progress callbacks."); + } return new ICheckCredentialProgressCallback.Stub() { @Override