diff options
| author | 2017-02-06 18:32:24 +0000 | |
|---|---|---|
| committer | 2017-02-06 18:32:28 +0000 | |
| commit | 96c44c48ac641df11b7bec57ab9c3d858da73d8a (patch) | |
| tree | 9f16fc51b91d77e12d410a1ac39ad905a0d99a9e | |
| parent | 391b1b82d291aa4e5a301397b4138a31abd2b3b5 (diff) | |
| parent | b15b1b4bd8fd1e7ccc2a243158aa55fe7623d15b (diff) | |
Merge "Schedule strong auth timeout in handler to avoid deadlock."
| -rw-r--r-- | services/core/java/com/android/server/LockSettingsStrongAuth.java | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/LockSettingsStrongAuth.java b/services/core/java/com/android/server/LockSettingsStrongAuth.java index 131411060625..f5fe3db5216c 100644 --- a/services/core/java/com/android/server/LockSettingsStrongAuth.java +++ b/services/core/java/com/android/server/LockSettingsStrongAuth.java @@ -51,6 +51,7 @@ public class LockSettingsStrongAuth { private static final int MSG_REGISTER_TRACKER = 2; private static final int MSG_UNREGISTER_TRACKER = 3; private static final int MSG_REMOVE_USER = 4; + private static final int MSG_SCHEDULE_STRONG_AUTH_TIMEOUT = 5; private static final String STRONG_AUTH_TIMEOUT_ALARM_TAG = "LockSettingsStrongAuth.timeoutForUser"; @@ -128,6 +129,23 @@ public class LockSettingsStrongAuth { } } + private void handleScheduleStrongAuthTimeout(int userId) { + final DevicePolicyManager dpm = + (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + long when = SystemClock.elapsedRealtime() + dpm.getRequiredStrongAuthTimeout(null, userId); + // cancel current alarm listener for the user (if there was one) + StrongAuthTimeoutAlarmListener alarm = mStrongAuthTimeoutAlarmListenerForUser.get(userId); + if (alarm != null) { + mAlarmManager.cancel(alarm); + } else { + alarm = new StrongAuthTimeoutAlarmListener(userId); + mStrongAuthTimeoutAlarmListenerForUser.put(userId, alarm); + } + // schedule a new alarm listener for the user + mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when, STRONG_AUTH_TIMEOUT_ALARM_TAG, + alarm, mHandler); + } + private void notifyStrongAuthTrackers(int strongAuthReason, int userId) { for (int i = 0; i < mStrongAuthTrackers.size(); i++) { try { @@ -151,7 +169,8 @@ public class LockSettingsStrongAuth { } public void removeUser(int userId) { - mHandler.obtainMessage(MSG_REMOVE_USER, userId, 0).sendToTarget(); + final int argNotUsed = 0; + mHandler.obtainMessage(MSG_REMOVE_USER, userId, argNotUsed).sendToTarget(); } public void requireStrongAuth(int strongAuthReason, int userId) { @@ -169,29 +188,8 @@ public class LockSettingsStrongAuth { } public void reportSuccessfulStrongAuthUnlock(int userId) { - scheduleStrongAuthTimeout(userId); - } - - private void scheduleStrongAuthTimeout(int userId) { - final DevicePolicyManager dpm = - (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); - long when = SystemClock.elapsedRealtime() + dpm.getRequiredStrongAuthTimeout(null, userId); - // cancel current alarm listener for the user (if there was one) - StrongAuthTimeoutAlarmListener alarm = mStrongAuthTimeoutAlarmListenerForUser.get(userId); - if (alarm != null) { - mAlarmManager.cancel(alarm); - } else { - alarm = new StrongAuthTimeoutAlarmListener(userId); - mStrongAuthTimeoutAlarmListenerForUser.put(userId, alarm); - } - // schedule a new alarm listener for the user - final long ident = Binder.clearCallingIdentity(); - try { - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when, STRONG_AUTH_TIMEOUT_ALARM_TAG, - alarm, mHandler); - } finally { - Binder.restoreCallingIdentity(ident); - } + final int argNotUsed = 0; + mHandler.obtainMessage(MSG_SCHEDULE_STRONG_AUTH_TIMEOUT, userId, argNotUsed).sendToTarget(); } private class StrongAuthTimeoutAlarmListener implements OnAlarmListener { @@ -224,6 +222,9 @@ public class LockSettingsStrongAuth { case MSG_REMOVE_USER: handleRemoveUser(msg.arg1); break; + case MSG_SCHEDULE_STRONG_AUTH_TIMEOUT: + handleScheduleStrongAuthTimeout(msg.arg1); + break; } } }; |