OSDN Git Service

Maintain mSetupCompletedUsers for profiles correctly
authorRubin Xu <rubinxu@google.com>
Fri, 12 Feb 2016 13:47:04 +0000 (13:47 +0000)
committerRubin Xu <rubinxu@google.com>
Fri, 12 Feb 2016 14:11:27 +0000 (14:11 +0000)
When listening for USER_SETUP_COMPLETE changes, refresh the state for
the affected user instead of the current foreground user which excludes
the active managed profile.

Bug: 27061092
Change-Id: Iae525464d3d3faab9afb76aaf4304b9f10382e01

services/core/java/com/android/server/am/UserController.java

index a355fa4..b552121 100644 (file)
@@ -165,15 +165,15 @@ final class UserController {
         void register(ContentResolver resolver) {
             resolver.registerContentObserver(mUserSetupComplete, false, this, UserHandle.USER_ALL);
             synchronized (mService) {
-                updateCurrentUserSetupCompleteLocked();
+                updateUserSetupCompleteLocked(UserHandle.USER_ALL);
             }
         }
 
         @Override
-        public void onChange(boolean selfChange, Uri uri) {
+        public void onChange(boolean selfChange, Uri uri, int userId) {
             if (mUserSetupComplete.equals(uri)) {
                 synchronized (mService) {
-                    updateCurrentUserSetupCompleteLocked();
+                    updateUserSetupCompleteLocked(userId);
                 }
             }
         }
@@ -655,7 +655,7 @@ final class UserController {
                 final Integer userIdInt = userId;
                 mUserLru.remove(userIdInt);
                 mUserLru.add(userIdInt);
-                updateCurrentUserSetupCompleteLocked();
+                updateUserSetupCompleteLocked(userId);
 
                 if (foreground) {
                     mCurrentUserId = userId;
@@ -870,11 +870,22 @@ final class UserController {
         mUserSwitchObservers.finishBroadcast();
     }
 
-    void updateCurrentUserSetupCompleteLocked() {
+    void updateUserSetupCompleteLocked(int userId) {
+        int[] users;
+        if (userId != UserHandle.USER_ALL) {
+            users = new int[] {userId};
+        } else {
+            users = new int[mStartedUsers.size()];
+            for (int i = mStartedUsers.size() - 1; i >= 0; i--) {
+                users[i] = mStartedUsers.keyAt(i);
+            }
+        }
         final ContentResolver cr = mService.mContext.getContentResolver();
-        final boolean setupComplete =
-                Settings.Secure.getIntForUser(cr, USER_SETUP_COMPLETE, 0, mCurrentUserId) != 0;
-        mSetupCompletedUsers.put(mCurrentUserId, setupComplete);
+        for (int i = 0; i < users.length; i++) {
+            final boolean setupComplete =
+                    Settings.Secure.getIntForUser(cr, USER_SETUP_COMPLETE, 0, users[i]) != 0;
+            mSetupCompletedUsers.put(users[i], setupComplete);
+        }
     }
 
     boolean isUserSetupCompleteLocked(int userId) {