Fix timer bug in TrustManagerService.
Previously, anytime a device was unlocked, we would refresh the trustable timers. Now, we should ensure that there actually is a trustable timer running before refreshing (since updating trust will start it anyways). We also make sure to destroy the timers when we move to UNTRUSTED Fixes:273550297 Fixes:264684930 Change-Id: I75d58e09848d4123bb55ea9a36cab739504ca6e8 Test: Tested that this fixes 273550297 by justinkchung@
This commit is contained in:
@@ -393,6 +393,23 @@ public class TrustManagerService extends SystemService {
|
||||
true /* overrideHardTimeout */);
|
||||
}
|
||||
|
||||
private void cancelBothTrustableAlarms(int userId) {
|
||||
TrustableTimeoutAlarmListener idleTimeout =
|
||||
mIdleTrustableTimeoutAlarmListenerForUser.get(
|
||||
userId);
|
||||
TrustableTimeoutAlarmListener trustableTimeout =
|
||||
mTrustableTimeoutAlarmListenerForUser.get(
|
||||
userId);
|
||||
if (idleTimeout != null && idleTimeout.isQueued()) {
|
||||
idleTimeout.setQueued(false);
|
||||
mAlarmManager.cancel(idleTimeout);
|
||||
}
|
||||
if (trustableTimeout != null && trustableTimeout.isQueued()) {
|
||||
trustableTimeout.setQueued(false);
|
||||
mAlarmManager.cancel(trustableTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleScheduleTrustedTimeout(int userId, boolean shouldOverride) {
|
||||
long when = SystemClock.elapsedRealtime() + TRUST_TIMEOUT_IN_MILLIS;
|
||||
TrustedTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
|
||||
@@ -657,6 +674,11 @@ public class TrustManagerService extends SystemService {
|
||||
resultCallback.complete(new GrantTrustResult(STATUS_UNLOCKED_BY_GRANT));
|
||||
}
|
||||
}
|
||||
|
||||
if ((wasTrusted || wasTrustable) && pendingTrustState == TrustState.UNTRUSTED) {
|
||||
if (DEBUG) Slog.d(TAG, "Trust was revoked, destroy trustable alarms");
|
||||
cancelBothTrustableAlarms(userId);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTrustUsuallyManaged(int userId, boolean managed) {
|
||||
@@ -1908,7 +1930,11 @@ public class TrustManagerService extends SystemService {
|
||||
handleScheduleTrustTimeout(shouldOverride, timeoutType);
|
||||
break;
|
||||
case MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH:
|
||||
refreshTrustableTimers(msg.arg1);
|
||||
TrustableTimeoutAlarmListener trustableAlarm =
|
||||
mTrustableTimeoutAlarmListenerForUser.get(msg.arg1);
|
||||
if (trustableAlarm != null && trustableAlarm.isQueued()) {
|
||||
refreshTrustableTimers(msg.arg1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2160,7 +2186,7 @@ public class TrustManagerService extends SystemService {
|
||||
TrustedTimeoutAlarmListener otherAlarm;
|
||||
boolean otherAlarmPresent;
|
||||
if (ENABLE_ACTIVE_UNLOCK_FLAG) {
|
||||
cancelBothTrustableAlarms();
|
||||
cancelBothTrustableAlarms(mUserId);
|
||||
otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId);
|
||||
otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued();
|
||||
if (otherAlarmPresent) {
|
||||
@@ -2172,23 +2198,6 @@ public class TrustManagerService extends SystemService {
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelBothTrustableAlarms() {
|
||||
TrustableTimeoutAlarmListener idleTimeout =
|
||||
mIdleTrustableTimeoutAlarmListenerForUser.get(
|
||||
mUserId);
|
||||
TrustableTimeoutAlarmListener trustableTimeout =
|
||||
mTrustableTimeoutAlarmListenerForUser.get(
|
||||
mUserId);
|
||||
if (idleTimeout != null && idleTimeout.isQueued()) {
|
||||
idleTimeout.setQueued(false);
|
||||
mAlarmManager.cancel(idleTimeout);
|
||||
}
|
||||
if (trustableTimeout != null && trustableTimeout.isQueued()) {
|
||||
trustableTimeout.setQueued(false);
|
||||
mAlarmManager.cancel(trustableTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
private void disableRenewableTrustWhileNonrenewableTrustIsPresent() {
|
||||
// if non-renewable trust is running, we need to temporarily prevent
|
||||
// renewable trust from being used
|
||||
|
||||
Reference in New Issue
Block a user