Trust: Track separate user has authenticated since boot
Bug: 22115393
Change-Id: Ieb907ec988da1b92c7178c00ecdc40c48d1348db
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 726db4e..15da829 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -105,7 +105,7 @@
private final ArraySet<AgentInfo> mActiveAgents = new ArraySet<AgentInfo>();
private final ArrayList<ITrustListener> mTrustListeners = new ArrayList<ITrustListener>();
private final Receiver mReceiver = new Receiver();
- private final SparseBooleanArray mUserHasAuthenticatedSinceBoot = new SparseBooleanArray();
+ private final SparseBooleanArray mUserHasAuthenticated = new SparseBooleanArray();
/* package */ final TrustArchive mArchive = new TrustArchive();
private final Context mContext;
private final LockPatternUtils mLockPatternUtils;
@@ -118,6 +118,9 @@
@GuardedBy("mDeviceLockedForUser")
private final SparseBooleanArray mDeviceLockedForUser = new SparseBooleanArray();
+ @GuardedBy("mUserHasAuthenticatedSinceBoot")
+ private final SparseBooleanArray mUserHasAuthenticatedSinceBoot = new SparseBooleanArray();
+
private boolean mTrustAgentsCanRun = false;
private int mCurrentUser = UserHandle.USER_OWNER;
@@ -556,31 +559,34 @@
}
private boolean getUserHasAuthenticated(int userId) {
- synchronized (mUserHasAuthenticatedSinceBoot) {
- return mUserHasAuthenticatedSinceBoot.get(userId);
- }
+ return mUserHasAuthenticated.get(userId);
}
/**
* @return whether the value has changed
*/
private boolean setUserHasAuthenticated(int userId) {
- synchronized (mUserHasAuthenticatedSinceBoot) {
- if (!mUserHasAuthenticatedSinceBoot.get(userId)) {
+ if (!mUserHasAuthenticated.get(userId)) {
+ mUserHasAuthenticated.put(userId, true);
+ synchronized (mUserHasAuthenticatedSinceBoot) {
mUserHasAuthenticatedSinceBoot.put(userId, true);
- return true;
}
- return false;
+ return true;
}
+ return false;
}
private void clearUserHasAuthenticated(int userId) {
+ if (userId == UserHandle.USER_ALL) {
+ mUserHasAuthenticated.clear();
+ } else {
+ mUserHasAuthenticated.put(userId, false);
+ }
+ }
+
+ private boolean getUserHasAuthenticatedSinceBoot(int userId) {
synchronized (mUserHasAuthenticatedSinceBoot) {
- if (userId == UserHandle.USER_ALL) {
- mUserHasAuthenticatedSinceBoot.clear();
- } else {
- mUserHasAuthenticatedSinceBoot.put(userId, false);
- }
+ return mUserHasAuthenticatedSinceBoot.get(userId);
}
}
@@ -734,7 +740,7 @@
Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE, null);
long token = Binder.clearCallingIdentity();
try {
- return getUserHasAuthenticated(userId);
+ return getUserHasAuthenticatedSinceBoot(userId);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -788,6 +794,9 @@
fout.print(": trusted=" + dumpBool(aggregateIsTrusted(user.id)));
fout.print(", trustManaged=" + dumpBool(aggregateIsTrustManaged(user.id)));
fout.print(", deviceLocked=" + dumpBool(isDeviceLockedInner(user.id)));
+ fout.print(", hasAuthenticated=" + dumpBool(getUserHasAuthenticated(user.id)));
+ fout.print(", hasAuthenticatedSinceBoot="
+ + dumpBool(getUserHasAuthenticatedSinceBoot(user.id)));
fout.println();
fout.println(" Enabled agents:");
boolean duplicateSimpleNames = false;
@@ -909,7 +918,7 @@
} else if (Intent.ACTION_USER_REMOVED.equals(action)) {
int userId = getUserId(intent);
if (userId > 0) {
- mUserHasAuthenticatedSinceBoot.delete(userId);
+ mUserHasAuthenticated.delete(userId);
synchronized (mUserIsTrusted) {
mUserIsTrusted.delete(userId);
}