Add padlocks to preferences that can be disabled by policy.

Change-Id: I43b6b5954ef6ec65b86d99321cabab9f49df842d
diff --git a/src/com/android/settings/DimmableIconPreference.java b/src/com/android/settings/DimmableIconPreference.java
index 57cdc8d..98bf551 100644
--- a/src/com/android/settings/DimmableIconPreference.java
+++ b/src/com/android/settings/DimmableIconPreference.java
@@ -25,16 +25,22 @@
 import android.util.AttributeSet;
 import android.widget.TextView;
 
+import com.android.settingslib.RestrictedPreference;
+
 /**
  * A preference item that can dim the icon when it's disabled, either directly or because its parent
  * is disabled.
  */
-public class DimmableIconPreference extends Preference {
+public class DimmableIconPreference extends RestrictedPreference {
     private static final int ICON_ALPHA_ENABLED = 255;
     private static final int ICON_ALPHA_DISABLED = 102;
 
     private final CharSequence mContentDescription;
 
+    public DimmableIconPreference(Context context) {
+        this(context, (AttributeSet) null);
+    }
+
     public DimmableIconPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContentDescription = null;
@@ -54,23 +60,12 @@
     }
 
     @Override
-    public void onParentChanged(Preference parent, boolean disableChild) {
-        dimIcon(disableChild);
-        super.onParentChanged(parent, disableChild);
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        dimIcon(!enabled);
-        super.setEnabled(enabled);
-    }
-
-    @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         super.onBindViewHolder(view);
         if (!TextUtils.isEmpty(mContentDescription)) {
             final TextView titleView = (TextView) view.findViewById(android.R.id.title);
             titleView.setContentDescription(mContentDescription);
         }
+        dimIcon(!isEnabled());
     }
 }
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 0735b11..dbceb2b 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -38,6 +38,7 @@
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.RestrictedPreference;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -167,6 +168,12 @@
         mConfigure.setEnabled(configureEnabled);
         mConfigure.setIntent(configIntent);
         setConfigureSummary(configSummary);
+
+        RestrictedPreference networkResetPref = (RestrictedPreference) findPreference(
+                NETWORK_RESET);
+        if (networkResetPref != null) {
+            networkResetPref.checkRestrictionAndSetDisabled(UserManager.DISALLOW_NETWORK_RESET);
+        }
     }
 
     private void setConfigureSummary(String summary) {
@@ -290,9 +297,5 @@
             nonVisibleKeys.add(AUTO_RESTORE);
             nonVisibleKeys.add(CONFIGURE_ACCOUNT);
         }
-        if (UserManager.get(context).hasUserRestriction(
-                UserManager.DISALLOW_NETWORK_RESET)) {
-            nonVisibleKeys.add(NETWORK_RESET);
-        }
     }
 }
diff --git a/src/com/android/settings/SeekBarPreference.java b/src/com/android/settings/SeekBarPreference.java
index f225967..ef28ed7 100644
--- a/src/com/android/settings/SeekBarPreference.java
+++ b/src/com/android/settings/SeekBarPreference.java
@@ -28,10 +28,12 @@
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 
+import com.android.settingslib.RestrictedPreference;
+
 /**
  * Based on android.preference.SeekBarPreference, but uses support preference as base.
  */
-public class SeekBarPreference extends Preference
+public class SeekBarPreference extends RestrictedPreference
         implements OnSeekBarChangeListener, View.OnKeyListener {
 
     private int mProgress;
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index f5a9dec..63455d8 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -51,6 +51,7 @@
 import com.android.settings.nfc.NfcEnabler;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.RestrictedPreference;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -226,7 +227,8 @@
         final Activity activity = getActivity();
         mAirplaneModePreference = (SwitchPreference) findPreference(KEY_TOGGLE_AIRPLANE);
         SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC);
-        PreferenceScreen androidBeam = (PreferenceScreen) findPreference(KEY_ANDROID_BEAM_SETTINGS);
+        RestrictedPreference androidBeam = (RestrictedPreference) findPreference(
+                KEY_ANDROID_BEAM_SETTINGS);
 
         mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
         mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
@@ -258,7 +260,7 @@
         }
         // Disable VPN.
         // TODO: http://b/23693383
-        if (!isAdmin || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) {
+        if (!isAdmin) {
             removePreference(KEY_VPN_SETTINGS);
         }
 
@@ -315,10 +317,10 @@
         // Disable Tethering if it's not allowed or if it's a wifi-only device
         final ConnectivityManager cm =
                 (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
-        if (!isAdmin || !cm.isTetheringSupported()
-                || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) {
+
+        if (!isAdmin || !cm.isTetheringSupported()) {
             getPreferenceScreen().removePreference(findPreference(KEY_TETHER_SETTINGS));
-        } else {
+        } else if (!mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) {
             Preference p = findPreference(KEY_TETHER_SETTINGS);
             p.setTitle(com.android.settingslib.Utils.getTetheringLabel(cm));
 
@@ -347,6 +349,19 @@
         } else {
             removePreference(KEY_WFC_SETTINGS);
         }
+
+        RestrictedPreference tetherSettingsPref = (RestrictedPreference) findPreference(
+                KEY_TETHER_SETTINGS);
+        if (tetherSettingsPref != null) {
+            tetherSettingsPref.checkRestrictionAndSetDisabled(
+                    UserManager.DISALLOW_CONFIG_TETHERING);
+        }
+
+        RestrictedPreference vpnSettingsPref = (RestrictedPreference) findPreference(
+                KEY_VPN_SETTINGS);
+        if (vpnSettingsPref != null) {
+            vpnSettingsPref.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_VPN);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 4296689..c8e0322 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -53,6 +53,7 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.AccessiblePreferenceCategory;
+import com.android.settings.DimmableIconPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -113,7 +114,7 @@
         /**
          * The preference that displays the add account button.
          */
-        public Preference addAccountPreference;
+        public DimmableIconPreference addAccountPreference;
         /**
          * The preference that displays the button to toggle work profile.
          */
@@ -324,17 +325,17 @@
         if (userInfo.isEnabled()) {
             profileData.authenticatorHelper = new AuthenticatorHelper(context,
                     userInfo.getUserHandle(), this);
-            if (!mUm.hasUserRestriction(DISALLOW_MODIFY_ACCOUNTS, userInfo.getUserHandle())) {
-                profileData.addAccountPreference = newAddAccountPreference(context);
-            }
+            profileData.addAccountPreference = newAddAccountPreference(context);
+            profileData.addAccountPreference.checkRestrictionAndSetDisabled(
+                    DISALLOW_MODIFY_ACCOUNTS, userInfo.id);
         }
         mProfiles.put(userInfo.id, profileData);
         Index.getInstance(getActivity()).updateFromClassNameResource(
                 AccountSettings.class.getName(), true, true);
     }
 
-    private Preference newAddAccountPreference(Context context) {
-        Preference preference = new Preference(getPrefContext());
+    private DimmableIconPreference newAddAccountPreference(Context context) {
+        DimmableIconPreference preference = new DimmableIconPreference(getPrefContext());
         preference.setTitle(R.string.add_account_label);
         preference.setIcon(R.drawable.ic_menu_add);
         preference.setOnPreferenceClickListener(this);
@@ -714,16 +715,13 @@
             for (int i = 0; i < profilesCount; i++) {
                 UserInfo userInfo = profiles.get(i);
                 if (userInfo.isEnabled()) {
-                    if (!um.hasUserRestriction(
-                            DISALLOW_MODIFY_ACCOUNTS, userInfo.getUserHandle())) {
-                        SearchIndexableRaw data = new SearchIndexableRaw(context);
-                        data = new SearchIndexableRaw(context);
-                        data.title = res.getString(R.string.add_account_label);
-                        data.screenTitle = screenTitle;
-                        result.add(data);
-                    }
+                    SearchIndexableRaw data = new SearchIndexableRaw(context);
+                    data = new SearchIndexableRaw(context);
+                    data.title = res.getString(R.string.add_account_label);
+                    data.screenTitle = screenTitle;
+                    result.add(data);
                     if (userInfo.isManagedProfile()) {
-                        SearchIndexableRaw data = new SearchIndexableRaw(context);
+                        data = new SearchIndexableRaw(context);
                         data = new SearchIndexableRaw(context);
                         data.title = res.getString(R.string.remove_managed_profile_label);
                         data.screenTitle = screenTitle;
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index c58c325..b81d342 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -27,6 +27,7 @@
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settingslib.RestrictedPreference;
 
 /**
  * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is
@@ -36,10 +37,9 @@
 public class NfcEnabler implements Preference.OnPreferenceChangeListener {
     private final Context mContext;
     private final SwitchPreference mSwitch;
-    private final PreferenceScreen mAndroidBeam;
+    private final RestrictedPreference mAndroidBeam;
     private final NfcAdapter mNfcAdapter;
     private final IntentFilter mIntentFilter;
-    private boolean mBeamDisallowed;
 
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -53,13 +53,11 @@
     };
 
     public NfcEnabler(Context context, SwitchPreference switchPreference,
-            PreferenceScreen androidBeam) {
+            RestrictedPreference androidBeam) {
         mContext = context;
         mSwitch = switchPreference;
         mAndroidBeam = androidBeam;
         mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
-        mBeamDisallowed = ((UserManager) mContext.getSystemService(Context.USER_SERVICE))
-                .hasUserRestriction(UserManager.DISALLOW_OUTGOING_BEAM);
 
         if (mNfcAdapter == null) {
             // NFC is not supported
@@ -68,9 +66,6 @@
             mIntentFilter = null;
             return;
         }
-        if (mBeamDisallowed) {
-            mAndroidBeam.setEnabled(false);
-        }
         mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
     }
 
@@ -117,8 +112,8 @@
         case NfcAdapter.STATE_ON:
             mSwitch.setChecked(true);
             mSwitch.setEnabled(true);
-            mAndroidBeam.setEnabled(!mBeamDisallowed);
-            if (mNfcAdapter.isNdefPushEnabled() && !mBeamDisallowed) {
+            mAndroidBeam.checkRestrictionAndSetDisabled(UserManager.DISALLOW_OUTGOING_BEAM);
+            if (mNfcAdapter.isNdefPushEnabled() && mAndroidBeam.isEnabled()) {
                 mAndroidBeam.setSummary(R.string.android_beam_on_summary);
             } else {
                 mAndroidBeam.setSummary(R.string.android_beam_off_summary);
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index dae492f..4eb4f7d 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -37,6 +37,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.Vibrator;
 import android.preference.SeekBarVolumizer;
@@ -57,6 +58,8 @@
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
 
 import java.text.NumberFormat;
 import java.util.ArrayList;
@@ -64,6 +67,8 @@
 import java.util.List;
 import java.util.Objects;
 
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
 public class SoundSettings extends SettingsPreferenceFragment implements Indexable {
     private static final String TAG = "SoundSettings";
 
@@ -164,8 +169,7 @@
         } catch (IllegalArgumentException ignored) {
             isCellBroadcastAppLinkEnabled = false;  // CMAS app not installed
         }
-        if (!mUserManager.isAdminUser() || !isCellBroadcastAppLinkEnabled
-                || mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
+        if (!mUserManager.isAdminUser() || !isCellBroadcastAppLinkEnabled) {
             removePreference(KEY_CELL_BROADCAST_SETTINGS);
         }
         initRingtones();
@@ -186,13 +190,23 @@
         for (VolumeSeekBarPreference volumePref : mVolumePrefs) {
             volumePref.onActivityResume();
         }
-        boolean isRestricted = mUserManager.hasUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME);
+
+        final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
+                UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId());
         for (String key : RESTRICTED_KEYS) {
             Preference pref = findPreference(key);
-            if (pref != null) {
-                pref.setEnabled(!isRestricted);
+            if (pref instanceof RestrictedPreference) {
+                ((RestrictedPreference) pref).setDisabledByAdmin(admin);
+            } else if (pref != null) {
+                pref.setEnabled(admin == null);
             }
         }
+        RestrictedPreference broadcastSettingsPref = (RestrictedPreference) findPreference(
+                KEY_CELL_BROADCAST_SETTINGS);
+        if (broadcastSettingsPref != null) {
+            broadcastSettingsPref.checkRestrictionAndSetDisabled(
+                    UserManager.DISALLOW_CONFIG_CELL_BROADCASTS);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index 9a81d16..07d03ee 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -29,6 +29,7 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settingslib.RestrictedPreference;
 
 import java.util.List;
 
@@ -59,7 +60,7 @@
 
     private UserManager mUserManager;
     private SwitchPreference mPhonePref;
-    private Preference mRemoveUserPref;
+    private RestrictedPreference mRemoveUserPref;
 
     private UserInfo mUserInfo;
     private boolean mGuestUser;
@@ -79,7 +80,7 @@
 
         addPreferencesFromResource(R.xml.user_details_settings);
         mPhonePref = (SwitchPreference) findPreference(KEY_ENABLE_TELEPHONY);
-        mRemoveUserPref = findPreference(KEY_REMOVE_USER);
+        mRemoveUserPref = (RestrictedPreference) findPreference(KEY_REMOVE_USER);
 
         mGuestUser = getArguments().getBoolean(EXTRA_USER_GUEST, false);
 
@@ -102,13 +103,16 @@
             mPhonePref.setChecked(
                     !mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS));
         }
-        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)) {
-            removePreference(KEY_REMOVE_USER);
-        }
         mPhonePref.setOnPreferenceChangeListener(this);
     }
 
     @Override
+    public void onResume() {
+        super.onResume();
+        mRemoveUserPref.checkRestrictionAndSetDisabled(UserManager.DISALLOW_REMOVE_USER);
+    }
+
+    @Override
     public boolean onPreferenceClick(Preference preference) {
         if (preference == mRemoveUserPref) {
             if (!mUserManager.isAdminUser()) {
diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java
index 2daf1ef..61ad6df 100644
--- a/src/com/android/settings/users/UserPreference.java
+++ b/src/com/android/settings/users/UserPreference.java
@@ -17,6 +17,7 @@
 package com.android.settings.users;
 
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
@@ -24,12 +25,18 @@
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.widget.ImageView;
 
 import com.android.settings.R;
+import com.android.settingslib.RestrictedPreference;
 
 import java.util.Comparator;
 
-public class UserPreference extends Preference {
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+public class UserPreference extends RestrictedPreference {
+    private static final int ALPHA_ENABLED = 255;
+    private static final int ALPHA_DISABLED = 102;
 
     public static final int USERID_UNKNOWN = -10;
     public static final int USERID_GUEST_DEFAULTS = -11;
@@ -71,6 +78,14 @@
         mUserId = userId;
     }
 
+    private void dimIcon(boolean dimmed) {
+        Drawable icon = getIcon();
+        if (icon != null) {
+            icon.mutate().setAlpha(dimmed ? ALPHA_DISABLED : ALPHA_ENABLED);
+            setIcon(icon);
+        }
+    }
+
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
@@ -87,7 +102,8 @@
                 deleteDividerView.setVisibility(View.GONE);
             }
         }
-        View manageView = view.findViewById(R.id.manage_user);
+        final boolean disabledByAdmin = isDisabledByAdmin();
+        ImageView manageView = (ImageView) view.findViewById(R.id.manage_user);
         if (manageView != null) {
             if (mSettingsClickListener != null) {
                 manageView.setOnClickListener(mSettingsClickListener);
@@ -99,8 +115,10 @@
                 manageView.setVisibility(View.GONE);
                 manageDividerView.setVisibility(View.GONE);
             }
+            manageView.setImageAlpha(disabledByAdmin ? ALPHA_DISABLED : ALPHA_ENABLED);
         }
         super.onBindViewHolder(view);
+        dimIcon(disabledByAdmin);
     }
 
     private int getSerialNumber() {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 7e0711e..06ec966 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -56,6 +56,7 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.ChooseLockGeneric;
+import com.android.settings.DimmableIconPreference;
 import com.android.settings.OwnerInfoSettings;
 import com.android.settings.R;
 import com.android.settings.SelectableEditTextPreference;
@@ -66,6 +67,8 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedSwitchPreference;
 import com.android.settingslib.drawable.CircleFramedDrawable;
 
 import java.util.ArrayList;
@@ -73,6 +76,8 @@
 import java.util.HashMap;
 import java.util.List;
 
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
 /**
  * Screen that manages the list of users on the device.
  * Guest user is an always visible entry, even if the guest is not currently
@@ -126,9 +131,9 @@
 
     private PreferenceGroup mUserListCategory;
     private UserPreference mMePreference;
-    private Preference mAddUser;
+    private DimmableIconPreference mAddUser;
     private PreferenceGroup mLockScreenSettings;
-    private SwitchPreference mAddUserWhenLocked;
+    private RestrictedSwitchPreference mAddUserWhenLocked;
     private int mRemovingUserId = -1;
     private int mAddedUserId = 0;
     private boolean mAddingUser;
@@ -213,7 +218,7 @@
         if (mUserCaps.mIsAdmin) {
             mMePreference.setSummary(R.string.user_admin);
         }
-        mAddUser = findPreference(KEY_ADD_USER);
+        mAddUser = (DimmableIconPreference) findPreference(KEY_ADD_USER);
         // Determine if add user/profile button should be visible
         if (mUserCaps.mCanAddUser) {
             mAddUser.setOnPreferenceClickListener(this);
@@ -223,7 +228,7 @@
             }
         }
         mLockScreenSettings = (PreferenceGroup) findPreference("lock_screen_settings");
-        mAddUserWhenLocked = (SwitchPreference) findPreference("add_users_when_locked");
+        mAddUserWhenLocked = (RestrictedSwitchPreference) findPreference("add_users_when_locked");
         loadProfile();
         setHasOptionsMenu(true);
         IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
@@ -745,7 +750,8 @@
             userPreferences.add(pref);
         }
 
-        if (!mUserCaps.mIsGuest && (mUserCaps.mCanAddGuest || findGuest() != null)) {
+        if (!mUserCaps.mIsGuest &&
+                (mUserCaps.mCanAddGuest || findGuest() != null || mUserCaps.mDisallowAddUser)) {
             // Add a virtual Guest user for guest defaults
             UserPreference pref = new UserPreference(getPrefContext(), null,
                     UserPreference.USERID_GUEST_DEFAULTS,
@@ -755,6 +761,8 @@
             pref.setIcon(getEncircledDefaultIcon());
             pref.setOnPreferenceClickListener(this);
             userPreferences.add(pref);
+            pref.setDisabledByAdmin(
+                    mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
         }
 
         // Sort list of users by serialNum
@@ -788,7 +796,7 @@
         }
 
         // Append Add user to the end of the list
-        if (mUserCaps.mCanAddUser) {
+        if (mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUser) {
             boolean moreUsers = mUserManager.canAddMoreUsers();
             mAddUser.setOrder(Preference.DEFAULT_ORDER);
             preferenceScreen.addPreference(mAddUser);
@@ -798,13 +806,19 @@
             } else {
                 mAddUser.setSummary(null);
             }
+            if (mAddUser.isEnabled()) {
+                mAddUser.setDisabledByAdmin(
+                        mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
+            }
         }
-        if (mUserCaps.mIsAdmin && !mUserCaps.mDisallowAddUser) {
+        if (mUserCaps.mIsAdmin) {
             mLockScreenSettings.setOrder(Preference.DEFAULT_ORDER);
             preferenceScreen.addPreference(mLockScreenSettings);
             mAddUserWhenLocked.setChecked(Settings.Global.getInt(getContentResolver(),
                     Settings.Global.ADD_USERS_WHEN_LOCKED, 0) == 1);
             mAddUserWhenLocked.setOnPreferenceChangeListener(this);
+            mAddUserWhenLocked.setDisabledByAdmin(
+                    mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
         }
     }
 
@@ -998,6 +1012,7 @@
         boolean mIsGuest;
         boolean mCanAddGuest;
         boolean mDisallowAddUser;
+        EnforcedAdmin mEnforcedAdmin;
 
         private UserCapabilities() {}
 
@@ -1012,8 +1027,9 @@
             final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId());
             caps.mIsGuest = myUserInfo.isGuest();
             caps.mIsAdmin = myUserInfo.isAdmin();
-            caps.mDisallowAddUser = userManager.hasUserRestriction(
-                    UserManager.DISALLOW_ADD_USER);
+            caps.mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(context,
+                    UserManager.DISALLOW_ADD_USER, UserHandle.myUserId());
+            caps.mDisallowAddUser = (caps.mEnforcedAdmin != null);
             if (!caps.mIsAdmin || UserManager.getMaxSupportedUsers() < 2
                     || !UserManager.supportsMultipleUsers()
                     || caps.mDisallowAddUser) {
@@ -1040,6 +1056,9 @@
                     ", mCanAddRestrictedProfile=" + mCanAddRestrictedProfile +
                     ", mIsAdmin=" + mIsAdmin +
                     ", mIsGuest=" + mIsGuest +
+                    ", mCanAddGuest=" + mCanAddGuest +
+                    ", mDisallowAddUser=" + mDisallowAddUser +
+                    ", mEnforcedAdmin=" + mEnforcedAdmin +
                     '}';
         }
     }
@@ -1090,7 +1109,7 @@
                     data.screenTitle = res.getString(R.string.user_settings_title);
                     result.add(data);
 
-                    if (userCaps.mCanAddUser) {
+                    if (userCaps.mCanAddUser || userCaps.mDisallowAddUser) {
                         data = new SearchIndexableRaw(context);
                         data.title = res.getString(userCaps.mCanAddRestrictedProfile ?
                                 R.string.user_add_user_or_profile_menu