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

Commit 7f98aa4a authored by Fyodor Kupolov's avatar Fyodor Kupolov
Browse files

Added getProfileIds method returning array of userIds

Previously many usages of UserManager.getProfiles and getEnabledProfiles
were only using ids of returned users. Given that the list of users needs
to be parceled and unparceled for Binder calls, returning array of ids
minimizes memory usage and serialization time.

A new method getProfileIds was introduced which returns an array of userIds.
Existing method calls were updated where appropriate.

Bug: 27705805
Change-Id: Ic5d5decd77567ba0f749e48837a2c6fa10e812c0
parent 8b704d44
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ interface IUserManager {
    UserInfo getPrimaryUser();
    List<UserInfo> getUsers(boolean excludeDying);
    List<UserInfo> getProfiles(int userHandle, boolean enabledOnly);
    int[] getProfileIds(int userId, boolean enabledOnly);
    boolean canAddMoreManagedProfiles(int userHandle, boolean allowedToRemoveOne);
    UserInfo getProfileParent(int userHandle);
    boolean isSameProfileGroup(int userHandle, int otherUserHandle);
+36 −8
Original line number Diff line number Diff line
@@ -1590,18 +1590,46 @@ public class UserManager {
     * @return A non-empty list of UserHandles associated with the calling user.
     */
    public List<UserHandle> getUserProfiles() {
        ArrayList<UserHandle> profiles = new ArrayList<UserHandle>();
        List<UserInfo> users;
        int[] userIds = getProfileIds(UserHandle.myUserId(), true /* enabledOnly */);
        List<UserHandle> result = new ArrayList<>(userIds.length);
        for (int userId : userIds) {
            result.add(UserHandle.of(userId));
        }
        return result;
    }

    /**
     * Returns a list of ids for profiles associated with the specified user including the user
     * itself.
     *
     * @param userId      id of the user to return profiles for
     * @param enabledOnly whether return only {@link UserInfo#isEnabled() enabled} profiles
     * @return A non-empty list of ids of profiles associated with the specified user.
     *
     * @hide
     */
    public int[] getProfileIds(@UserIdInt int userId, boolean enabledOnly) {
        try {
            users = mService.getProfiles(UserHandle.myUserId(), true /* enabledOnly */);
            return mService.getProfileIds(userId, enabledOnly);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
        for (UserInfo info : users) {
            UserHandle userHandle = new UserHandle(info.id);
            profiles.add(userHandle);
    }
        return profiles;

    /**
     * @see #getProfileIds(int, boolean)
     * @hide
     */
    public int[] getProfileIdsWithDisabled(@UserIdInt int userId) {
        return getProfileIds(userId, false /* enabledOnly */);
    }

    /**
     * @see #getProfileIds(int, boolean)
     * @hide
     */
    public int[] getEnabledProfileIds(@UserIdInt int userId) {
        return getProfileIds(userId, true /* enabledOnly */);
    }

    /**
+3 −6
Original line number Diff line number Diff line
@@ -1831,14 +1831,11 @@ public class SettingsProvider extends ContentProvider {
        private void maybeNotifyProfiles(int userId, Uri uri, String name,
                Set<String> keysCloned) {
            if (keysCloned.contains(name)) {
                List<UserInfo> profiles = mUserManager.getProfiles(userId);
                int size = profiles.size();
                for (int i = 0; i < size; i++) {
                    UserInfo profile = profiles.get(i);
                for (int profileId : mUserManager.getProfileIdsWithDisabled(userId)) {
                    // the notification for userId has already been sent.
                    if (profile.id != userId) {
                    if (profileId != userId) {
                        mHandler.obtainMessage(MyHandler.MSG_NOTIFY_URI_CHANGED,
                                profile.id, 0, uri).sendToTarget();
                                profileId, 0, uri).sendToTarget();
                    }
                }
            }
+9 −12
Original line number Diff line number Diff line
@@ -847,17 +847,16 @@ public class KeyguardViewMediator extends SystemUI {

    private void doKeyguardLaterForChildProfilesLocked() {
        UserManager um = UserManager.get(mContext);
        List<UserInfo> profiles = um.getEnabledProfiles(UserHandle.myUserId());
        for (UserInfo info : profiles) {
            if (mLockPatternUtils.isSeparateProfileChallengeEnabled(info.id)) {
                long userTimeout = getLockTimeout(info.id);
        for (int profileId : um.getEnabledProfileIds(UserHandle.myUserId())) {
            if (mLockPatternUtils.isSeparateProfileChallengeEnabled(profileId)) {
                long userTimeout = getLockTimeout(profileId);
                if (userTimeout == 0) {
                    doKeyguardForChildProfilesLocked();
                } else {
                    long userWhen = SystemClock.elapsedRealtime() + userTimeout;
                    Intent lockIntent = new Intent(DELAYED_LOCK_PROFILE_ACTION);
                    lockIntent.putExtra("seq", mDelayedProfileShowingSequence);
                    lockIntent.putExtra(Intent.EXTRA_USER_ID, info.id);
                    lockIntent.putExtra(Intent.EXTRA_USER_ID, profileId);
                    PendingIntent lockSender = PendingIntent.getBroadcast(
                            mContext, 0, lockIntent, PendingIntent.FLAG_CANCEL_CURRENT);
                    mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
@@ -869,10 +868,9 @@ public class KeyguardViewMediator extends SystemUI {

    private void doKeyguardForChildProfilesLocked() {
        UserManager um = UserManager.get(mContext);
        List<UserInfo> profiles = um.getEnabledProfiles(UserHandle.myUserId());
        for (UserInfo info : profiles) {
            if (mLockPatternUtils.isSeparateProfileChallengeEnabled(info.id)) {
                lockProfile(info.id);
        for (int profileId : um.getEnabledProfileIds(UserHandle.myUserId())) {
            if (mLockPatternUtils.isSeparateProfileChallengeEnabled(profileId)) {
                lockProfile(profileId);
            }
        }
    }
@@ -1482,9 +1480,8 @@ public class KeyguardViewMediator extends SystemUI {
                final UserHandle currentUser = new UserHandle(KeyguardUpdateMonitor.getCurrentUser());
                final UserManager um = (UserManager) mContext.getSystemService(
                        Context.USER_SERVICE);
                List <UserInfo> userHandles = um.getProfiles(currentUser.getIdentifier());
                for (UserInfo ui : userHandles) {
                    mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, ui.getUserHandle());
                for (int profileId : um.getProfileIdsWithDisabled(currentUser.getIdentifier())) {
                    mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, UserHandle.of(profileId));
                }
            } else {
                mBootSendUserPresent = true;
+8 −8
Original line number Diff line number Diff line
@@ -114,8 +114,8 @@ public class SecurityControllerImpl implements SecurityController {

    @Override
    public String getProfileOwnerName() {
        for (UserInfo profile : mUserManager.getProfiles(mCurrentUserId)) {
            String name = mDevicePolicyManager.getProfileOwnerNameAsUser(profile.id);
        for (int profileId : mUserManager.getProfileIdsWithDisabled(mCurrentUserId)) {
            String name = mDevicePolicyManager.getProfileOwnerNameAsUser(profileId);
            if (name != null) {
                return name;
            }
@@ -135,13 +135,13 @@ public class SecurityControllerImpl implements SecurityController {

    @Override
    public String getProfileVpnName() {
        for (UserInfo profile : mUserManager.getProfiles(mVpnUserId)) {
            if (profile.id == mVpnUserId) {
        for (int profileId : mUserManager.getProfileIdsWithDisabled(mVpnUserId)) {
            if (profileId == mVpnUserId) {
                continue;
            }
            VpnConfig cfg = mCurrentVpns.get(profile.id);
            VpnConfig cfg = mCurrentVpns.get(profileId);
            if (cfg != null) {
                return getNameForVpnConfig(cfg, profile.getUserHandle());
                return getNameForVpnConfig(cfg, UserHandle.of(profileId));
            }
        }
        return null;
@@ -149,8 +149,8 @@ public class SecurityControllerImpl implements SecurityController {

    @Override
    public boolean isVpnEnabled() {
        for (UserInfo profile : mUserManager.getProfiles(mVpnUserId)) {
            if (mCurrentVpns.get(profile.id) != null) {
        for (int profileId : mUserManager.getProfileIdsWithDisabled(mVpnUserId)) {
            if (mCurrentVpns.get(profileId) != null) {
                return true;
            }
        }
Loading