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);
                     }