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

Commit 11c0cc84 authored by Piyush Singhania's avatar Piyush Singhania
Browse files

Reduce multiple calls to the UserManager API to reduce binder calls.

Flag: EXEMPT bugfix
Test: atest LauncherAppsServiceTest
Bug: 402358575
Change-Id: I2244810402e7ba7089eee5fd16b360a5b086615c
parent cc219cbe
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
@@ -379,9 +379,10 @@ public class LauncherAppsService extends SystemService {
        public List<UserHandle> getUserProfiles() {
            int[] userIds;
            if (!canAccessHiddenProfile(getCallingUid(), getCallingPid())) {
                userIds = mUm.getProfileIdsExcludingHidden(getCallingUserId(), /* enabled= */ true);
                userIds = mUserManagerInternal.getProfileIdsExcludingHidden(getCallingUserId(),
                        /* enabled= */ true);
            } else {
                userIds = mUm.getEnabledProfileIds(getCallingUserId());
                userIds = mUserManagerInternal.getProfileIds(getCallingUserId(), true);
            }
            final List<UserHandle> result = new ArrayList<>(userIds.length);
            for (int userId : userIds) {
@@ -398,9 +399,10 @@ public class LauncherAppsService extends SystemService {

            int[] userIds;
            if (!canAccessHiddenProfile(callingUid, Binder.getCallingPid())) {
                userIds = mUm.getProfileIdsExcludingHidden(getCallingUserId(), /* enabled= */ true);
                userIds = mUserManagerInternal.getProfileIdsExcludingHidden(getCallingUserId(),
                        /* enabled= */ true);
            } else {
                userIds = mUm.getEnabledProfileIds(getCallingUserId());
                userIds = mUserManagerInternal.getProfileIds(getCallingUserId(), true);
            }

            final long token = Binder.clearCallingIdentity();
@@ -503,17 +505,12 @@ public class LauncherAppsService extends SystemService {
                return true;
            }

            long ident = injectClearCallingIdentity();
            try {
                final UserInfo callingUserInfo = mUm.getUserInfo(callingUserId);
            final UserInfo callingUserInfo = mUserManagerInternal.getUserInfo(callingUserId);
            if (callingUserInfo != null && callingUserInfo.isProfile()) {
                Slog.w(TAG, message + " for another profile "
                        + targetUserId + " from " + callingUserId + " not allowed");
                return false;
            }
            } finally {
                injectRestoreCallingIdentity(ident);
            }

            if (isHiddenProfile(UserHandle.of(targetUserId))
                    && !canAccessHiddenProfile(callingUid, callingPid)) {
@@ -529,9 +526,9 @@ public class LauncherAppsService extends SystemService {
                return false;
            }

            long identity = injectClearCallingIdentity();
            try {
                UserProperties properties = mUm.getUserProperties(targetUser);
                UserProperties properties = mUserManagerInternal
                        .getUserProperties(targetUser.getIdentifier());
                if (properties == null) {
                    return false;
                }
@@ -540,8 +537,6 @@ public class LauncherAppsService extends SystemService {
                        == UserProperties.PROFILE_API_VISIBILITY_HIDDEN;
            } catch (IllegalArgumentException e) {
                return false;
            } finally {
                injectRestoreCallingIdentity(identity);
            }
        }

@@ -686,7 +681,7 @@ public class LauncherAppsService extends SystemService {
            final int callingUid = injectBinderCallingUid();
            final long ident = injectClearCallingIdentity();
            try {
                if (mUm.getUserInfo(user.getIdentifier()).isManagedProfile()) {
                if (mUserManagerInternal.getUserInfo(user.getIdentifier()).isManagedProfile()) {
                    // Managed profile should not show hidden apps
                    return launcherActivities;
                }
@@ -1713,7 +1708,7 @@ public class LauncherAppsService extends SystemService {
            }
            final long identity = Binder.clearCallingIdentity();
            try {
                String userType = mUm.getUserInfo(user.getIdentifier()).userType;
                String userType = mUserManagerInternal.getUserInfo(user.getIdentifier()).userType;
                Set<String> preInstalledPackages = mUm.getPreInstallableSystemPackages(userType);
                if (preInstalledPackages == null) {
                    return new ArrayList<>();
+15 −0
Original line number Diff line number Diff line
@@ -367,6 +367,21 @@ public abstract class UserManagerInternal {
     */
    public abstract @NonNull int[] getProfileIds(@UserIdInt int userId, boolean enabledOnly);

    /**
     * Returns a list of the users that are associated with the specified user, including the user
     * itself. This includes the user, its profiles, its parent, and its parent's other profiles,
     * as applicable.
     *
     * <p>Note that this includes only profile types that are not hidden.
     *
     * @param userId      id of the user to return profiles for
     * @param enabledOnly whether return only {@link UserInfo#isEnabled() enabled} profiles
     * @return A non-empty array of ids of profiles associated with the specified user if the user
     *         exists. Otherwise, an empty array.
     */
    public abstract @NonNull int[] getProfileIdsExcludingHidden(@UserIdInt int userId,
            boolean enabledOnly);

    /**
     * Checks if the {@code callingUserId} and {@code targetUserId} are same or in same group
     * and that the {@code callingUserId} is not a profile and {@code targetUserId} is enabled.
+8 −0
Original line number Diff line number Diff line
@@ -8048,6 +8048,14 @@ public class UserManagerService extends IUserManager.Stub {
            }
        }

        @Override
        public int[] getProfileIdsExcludingHidden(@UserIdInt int userId, boolean enabledOnly) {
            synchronized (mUsersLock) {
                return getProfileIdsLU(userId, null /* userType */, enabledOnly, /* excludeHidden */
                        true).toArray();
            }
        }

        @Override
        public @Nullable LauncherUserInfo getLauncherUserInfo(@UserIdInt int userId) {
            UserInfo userInfo;