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

Commit 0f311e11 authored by Tetiana Meronyk's avatar Tetiana Meronyk
Browse files

Add handling of admin enforced restrictions in Users Settings

Before, when the restrictions were applied, the preferences that were restricted were hidden.

After this change, if admin applies a restriction, the preference is displayed as disabled and Policy Transparency Dialog is displayed

Bug: 338226475
Test: atest UserSettingsTest && atest UserDetailsSettingsTest
Flag: android.multiuser.new_multiuser_settings_ux
Change-Id: I1b5aeeeec7accde278ff3e46ea3d64c91d8400db
parent caef61b5
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -42,11 +42,14 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
        if (!isAvailable()) {
            restrictedSwitchPreference.setVisible(false);
        } else {
            restrictedSwitchPreference.setDisabledByAdmin(
                    mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
            if (android.multiuser.Flags.newMultiuserSettingsUx()) {
                if (mUserCaps.mDisallowAddUserSetByAdmin) {
                    restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
                }
                restrictedSwitchPreference.setVisible(true);
            } else {
                restrictedSwitchPreference.setDisabledByAdmin(
                        mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
                restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
            }
        }
@@ -56,16 +59,14 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
    public int getAvailabilityStatus() {
        if (!mUserCaps.isAdmin()) {
            return DISABLED_FOR_USER;
        } else if (android.multiuser.Flags.newMultiuserSettingsUx()) {
            return AVAILABLE;
        } else if (mUserCaps.disallowAddUser() || mUserCaps.disallowAddUserSetByAdmin()) {
            return DISABLED_FOR_USER;
        } else {
            if (android.multiuser.Flags.newMultiuserSettingsUx()) {
                return AVAILABLE;
        } else {
            return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
        }
    }
    }

    @Override
    public boolean isChecked() {
+9 −4
Original line number Diff line number Diff line
@@ -43,14 +43,19 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll

    @Override
    public int getAvailabilityStatus() {
        if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
        if (android.multiuser.Flags.newMultiuserSettingsUx()) {
            if (!mUserCaps.isAdmin()) {
                return DISABLED_FOR_USER;
        } else if (android.multiuser.Flags.newMultiuserSettingsUx()) {
            }
            return AVAILABLE;
        } else {
            if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
                return DISABLED_FOR_USER;
            } else {
                return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
            }
        }
    }

    @Override
    public boolean isChecked() {
+0 −5
Original line number Diff line number Diff line
@@ -57,11 +57,6 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw
            mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
                    .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH,
                            UserHandle.myUserId()));

        } else if (mUserCapabilities.mDisallowAddUser) {
            mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
                    .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_ADD_USER,
                            UserHandle.myUserId()));
        } else {
            mSwitchBar.setEnabled(mUserCapabilities.mIsMain);
        }
+23 −10
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.DialogInterface;
import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
@@ -33,6 +34,8 @@ import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedSwitchPreference;

/**
@@ -70,11 +73,15 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
        if (!isAvailable()) {
            restrictedSwitchPreference.setVisible(false);
        } else {
            restrictedSwitchPreference.setDisabledByAdmin(
                    mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
            if (android.multiuser.Flags.newMultiuserSettingsUx()) {
                final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin =
                        RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
                                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
                restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin);
                restrictedSwitchPreference.setVisible(true);
            } else {
                restrictedSwitchPreference.setDisabledByAdmin(
                        mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
                restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
            }
        }
@@ -86,15 +93,21 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
        // then disable this controller
        // also disable this controller for non-admin users
        // also disable when config_guestUserAllowEphemeralStateChange is false
        if (android.multiuser.Flags.newMultiuserSettingsUx()) {
            if (mUserManager.isGuestUserAlwaysEphemeral()
                    || !UserManager.isGuestUserAllowEphemeralStateChange()
                    || !mUserCaps.isAdmin()) {
                return DISABLED_FOR_USER;
            } else {
                return AVAILABLE;
            }
        } else {
            if (mUserManager.isGuestUserAlwaysEphemeral()
                    || !UserManager.isGuestUserAllowEphemeralStateChange()
                    || !mUserCaps.isAdmin()
                    || mUserCaps.disallowAddUser()
                    || mUserCaps.disallowAddUserSetByAdmin()) {
                return DISABLED_FOR_USER;
        } else {
            if (android.multiuser.Flags.newMultiuserSettingsUx()) {
                return AVAILABLE;
            } else {
                return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
            }
+18 −14
Original line number Diff line number Diff line
@@ -463,7 +463,8 @@ public class UserSettings extends SettingsPreferenceFragment
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        int pos = 0;
        if (!isCurrentUserAdmin() && canSwitchUserNow() && !isCurrentUserGuest()) {
        if (!isCurrentUserAdmin() && (canSwitchUserNow() || Flags.newMultiuserSettingsUx())
                && !isCurrentUserGuest()) {
            String nickname = mUserManager.getUserName();
            MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, pos++,
                    getResources().getString(R.string.user_remove_user_menu, nickname));
@@ -1198,7 +1199,7 @@ public class UserSettings extends SettingsPreferenceFragment
        }

        List<UserInfo> users;
        if (android.multiuser.Flags.newMultiuserSettingsUx()) {
        if (Flags.newMultiuserSettingsUx()) {
            // Only users that can be switched to should show up here.
            // e.g. Managed profiles appear under Accounts Settings instead
            users = mUserManager.getAliveUsers().stream()
@@ -1265,7 +1266,10 @@ public class UserSettings extends SettingsPreferenceFragment
                    pref.setSummary(R.string.user_summary_not_set_up);
                    // Disallow setting up user which results in user switching when the
                    // restriction is set.
                    pref.setEnabled(!mUserCaps.mDisallowSwitchUser && canSwitchUserNow());
                    // If newMultiuserSettingsUx flag is enabled, allow opening user details page
                    // since switch to user will be disabled
                    pref.setEnabled((!mUserCaps.mDisallowSwitchUser && canSwitchUserNow())
                            || Flags.newMultiuserSettingsUx());
                }
            } else if (user.isRestricted()) {
                pref.setSummary(R.string.user_summary_restricted_profile);
@@ -1425,13 +1429,13 @@ public class UserSettings extends SettingsPreferenceFragment
                            getContext().getResources(), icon)));
            pref.setKey(KEY_USER_GUEST);
            pref.setOrder(Preference.DEFAULT_ORDER);
            if (mUserCaps.mDisallowSwitchUser) {
            if (mUserCaps.mDisallowSwitchUser && !Flags.newMultiuserSettingsUx()) {
                pref.setDisabledByAdmin(
                        RestrictedLockUtilsInternal.getDeviceOwner(context));
            } else {
                pref.setDisabledByAdmin(null);
            }
            if (android.multiuser.Flags.newMultiuserSettingsUx()) {
            if (Flags.newMultiuserSettingsUx()) {
                mGuestUserCategory.addPreference(pref);
                // guest user preference is shown hence also make guest category visible
                mGuestUserCategory.setVisible(true);
@@ -1464,11 +1468,11 @@ public class UserSettings extends SettingsPreferenceFragment

    private boolean updateAddGuestPreference(Context context, boolean isGuestAlreadyCreated) {
        boolean isVisible = false;
        if (!isGuestAlreadyCreated && mUserCaps.mCanAddGuest
        if (!isGuestAlreadyCreated && (mUserCaps.mCanAddGuest
                || (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin))
                && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST)
                && WizardManagerHelper.isDeviceProvisioned(context)
                && (mUserCaps.mUserSwitcherEnabled
                || android.multiuser.Flags.newMultiuserSettingsUx())) {
                && (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
            Drawable icon = context.getDrawable(
                    com.android.settingslib.R.drawable.ic_account_circle);
            mAddGuest.setIcon(centerAndTint(icon));
@@ -1481,11 +1485,11 @@ public class UserSettings extends SettingsPreferenceFragment
                mAddGuest.setEnabled(false);
            } else {
                mAddGuest.setTitle(com.android.settingslib.R.string.guest_new_guest);
                if (android.multiuser.Flags.newMultiuserSettingsUx()
                if (Flags.newMultiuserSettingsUx()
                        && mUserCaps.mDisallowAddUserSetByAdmin) {
                    mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
                } else {
                    mAddGuest.setEnabled(canSwitchUserNow());
                    mAddGuest.setEnabled(canSwitchUserNow() || Flags.newMultiuserSettingsUx());
                }
            }
        } else {
@@ -1516,15 +1520,15 @@ public class UserSettings extends SettingsPreferenceFragment
            boolean canAddRestrictedProfile) {
        if ((mUserCaps.mCanAddUser && !mUserCaps.mDisallowAddUserSetByAdmin)
                && WizardManagerHelper.isDeviceProvisioned(context)
                && (mUserCaps.mUserSwitcherEnabled
                || android.multiuser.Flags.newMultiuserSettingsUx())) {
                && (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
            addUser.setVisible(true);
            addUser.setSelectable(true);
            final boolean canAddMoreUsers =
                    mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY)
                            || (canAddRestrictedProfile
                            && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_RESTRICTED));
            addUser.setEnabled(canAddMoreUsers && !mAddingUser && canSwitchUserNow());
            addUser.setEnabled(canAddMoreUsers && !mAddingUser
                    && (canSwitchUserNow() || Flags.newMultiuserSettingsUx()));

            if (!canAddMoreUsers) {
                addUser.setSummary(getString(R.string.user_add_max_count));
@@ -1535,7 +1539,7 @@ public class UserSettings extends SettingsPreferenceFragment
                addUser.setDisabledByAdmin(
                        mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
            }
        } else if (android.multiuser.Flags.newMultiuserSettingsUx()
        } else if (Flags.newMultiuserSettingsUx()
                && mUserCaps.mDisallowAddUserSetByAdmin) {
            addUser.setVisible(true);
            addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
Loading