Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb054c9d authored by Amith Yamasani's avatar Amith Yamasani
Browse files

Fix new user creation regression due to vold remount calls

When creating a new user, there's no need to call into vold when
setting up default system permissions for storage. This was otherwise
adding 2 seconds to the user creation time, causing a frozen screen
before showing "Switching to user ...".

Fix is to call the permission setup code synchronously and not
call into vold if the user hasn't been initialized yet.

Bug: 22356546
Change-Id: I4c8632813e8c0f2ac90da386691af439521bb25a
parent 607a040d
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -3429,8 +3429,12 @@ public class PackageManagerService extends IPackageManager.Stub {
            mSettings.writeRuntimePermissionsForUserLPr(userId, false);
        }
        if (READ_EXTERNAL_STORAGE.equals(name)
                || WRITE_EXTERNAL_STORAGE.equals(name)) {
        // Only need to do this if user is initialized. Otherwise it's a new user
        // and there are no processes running as the user yet and there's no need
        // to make an expensive call to remount processes for the changed permissions.
        if ((READ_EXTERNAL_STORAGE.equals(name)
                || WRITE_EXTERNAL_STORAGE.equals(name))
                && sUserManager.isInitialized(userId)) {
            final long token = Binder.clearCallingIdentity();
            try {
                final StorageManager storage = mContext.getSystemService(StorageManager.class);
@@ -15924,17 +15928,9 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }
    void newUserCreatedLILPw(final int userHandle) {
        // We cannot grant the default permissions with a lock held as
        // we query providers from other components for default handlers
        // such as enabled IMEs, etc.
        mHandler.post(new Runnable() {
            @Override
            public void run() {
    void newUserCreated(final int userHandle) {
        mDefaultPermissionPolicy.grantDefaultPermissions(userHandle);
    }
        });
    }
    @Override
    public VerifierDeviceIdentity getVerifierDeviceIdentity() throws RemoteException {
+11 −2
Original line number Diff line number Diff line
@@ -1220,6 +1220,7 @@ public class UserManagerService extends IUserManager.Stub {
        final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;
        final long ident = Binder.clearCallingIdentity();
        UserInfo userInfo = null;
        final int userId;
        try {
            synchronized (mInstallLock) {
                synchronized (mPackagesLock) {
@@ -1240,7 +1241,7 @@ public class UserManagerService extends IUserManager.Stub {
                    if (isGuest && findCurrentGuestUserLocked() != null) {
                        return null;
                    }
                    int userId = getNextAvailableIdLocked();
                    userId = getNextAvailableIdLocked();
                    userInfo = new UserInfo(userId, name, null, flags);
                    userInfo.serialNumber = mNextSerialNumber++;
                    long now = System.currentTimeMillis();
@@ -1274,9 +1275,9 @@ public class UserManagerService extends IUserManager.Stub {
                    updateUserIdsLocked();
                    Bundle restrictions = new Bundle();
                    mUserRestrictions.append(userId, restrictions);
                    mPm.newUserCreatedLILPw(userId);
                }
            }
            mPm.newUserCreated(userId);
            if (userInfo != null) {
                Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED);
                addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userInfo.id);
@@ -2015,4 +2016,12 @@ public class UserManagerService extends IUserManager.Stub {
            }
        }
    }

    /**
     * @param userId
     * @return whether the user has been initialized yet
     */
    boolean isInitialized(int userId) {
        return (getUserInfo(userId).flags & UserInfo.FLAG_INITIALIZED) != 0;
    }
}