Add padlocks to preferences that can be disabled by policy.

Change-Id: I43b6b5954ef6ec65b86d99321cabab9f49df842d
This commit is contained in:
Sudheer Shanka
2016-01-13 22:10:18 +00:00
parent b484d74d73
commit 682a916836
15 changed files with 145 additions and 80 deletions

View File

@@ -47,7 +47,7 @@
android:selectable="false" /> android:selectable="false" />
<!-- Network reset --> <!-- Network reset -->
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:key="network_reset" android:key="network_reset"
android:title="@string/reset_network_title" android:title="@string/reset_network_title"
settings:keywords="@string/keywords_network_reset" settings:keywords="@string/keywords_network_reset"

View File

@@ -59,7 +59,7 @@
android:summaryOff="@string/master_mono_off" /> android:summaryOff="@string/master_mono_off" />
<!-- Interruptions --> <!-- Interruptions -->
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:key="zen_mode" android:key="zen_mode"
android:title="@string/zen_mode_settings_title" android:title="@string/zen_mode_settings_title"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions" settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
@@ -89,14 +89,14 @@
android:persistent="false" android:persistent="false"
android:ringtoneType="alarm" /> android:ringtoneType="alarm" />
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:key="cell_broadcast_settings" android:key="cell_broadcast_settings"
android:title="@string/cell_broadcast_settings" > android:title="@string/cell_broadcast_settings" >
<intent <intent
android:action="android.intent.action.MAIN" android:action="android.intent.action.MAIN"
android:targetPackage="com.android.cellbroadcastreceiver" android:targetPackage="com.android.cellbroadcastreceiver"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" /> android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" />
</PreferenceScreen> </com.android.settingslib.RestrictedPreference>
<!-- Other sounds --> <!-- Other sounds -->
<Preference <Preference

View File

@@ -21,7 +21,7 @@
android:key="enable_calling" android:key="enable_calling"
android:title="@string/user_enable_calling_sms" android:title="@string/user_enable_calling_sms"
android:persistent="false" /> android:persistent="false" />
<Preference <com.android.settingslib.RestrictedPreference
android:key="remove_user" android:key="remove_user"
android:title="@string/user_remove_user" /> android:title="@string/user_remove_user" />

View File

@@ -31,7 +31,9 @@
<PreferenceCategory <PreferenceCategory
android:key="lock_screen_settings" android:key="lock_screen_settings"
android:title="@string/user_lockscreen_settings"> android:title="@string/user_lockscreen_settings">
<SwitchPreference android:key="add_users_when_locked" android:title="@string/user_add_on_lockscreen_menu" <com.android.settingslib.RestrictedSwitchPreference
android:key="add_users_when_locked"
android:title="@string/user_add_on_lockscreen_menu"
android:summary="@string/user_add_on_lockscreen_menu_summary" /> android:summary="@string/user_add_on_lockscreen_menu_summary" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -36,17 +36,17 @@
settings:keywords="@string/keywords_wifi_calling" settings:keywords="@string/keywords_wifi_calling"
android:fragment="com.android.settings.WifiCallingSettings" /> android:fragment="com.android.settings.WifiCallingSettings" />
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.nfc.AndroidBeam" android:fragment="com.android.settings.nfc.AndroidBeam"
android:key="android_beam_settings" android:key="android_beam_settings"
android:title="@string/android_beam_settings_title" /> android:title="@string/android_beam_settings_title" />
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.TetherSettings" android:fragment="com.android.settings.TetherSettings"
android:key="tether_settings" android:key="tether_settings"
android:title="@string/tether_settings_title_all" /> android:title="@string/tether_settings_title_all" />
<PreferenceScreen <com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.vpn2.VpnSettings" android:fragment="com.android.settings.vpn2.VpnSettings"
android:key="vpn_settings" android:key="vpn_settings"
android:title="@string/vpn_settings_title" /> android:title="@string/vpn_settings_title" />

View File

@@ -25,16 +25,22 @@ import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.TextView; 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 * A preference item that can dim the icon when it's disabled, either directly or because its parent
* is disabled. * 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_ENABLED = 255;
private static final int ICON_ALPHA_DISABLED = 102; private static final int ICON_ALPHA_DISABLED = 102;
private final CharSequence mContentDescription; private final CharSequence mContentDescription;
public DimmableIconPreference(Context context) {
this(context, (AttributeSet) null);
}
public DimmableIconPreference(Context context, AttributeSet attrs) { public DimmableIconPreference(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mContentDescription = null; mContentDescription = null;
@@ -53,18 +59,6 @@ public class DimmableIconPreference extends Preference {
} }
} }
@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 @Override
public void onBindViewHolder(PreferenceViewHolder view) { public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view); super.onBindViewHolder(view);
@@ -72,5 +66,6 @@ public class DimmableIconPreference extends Preference {
final TextView titleView = (TextView) view.findViewById(android.R.id.title); final TextView titleView = (TextView) view.findViewById(android.R.id.title);
titleView.setContentDescription(mContentDescription); titleView.setContentDescription(mContentDescription);
} }
dimIcon(!isEnabled());
} }
} }

View File

@@ -38,6 +38,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settingslib.RestrictedPreference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -167,6 +168,12 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index
mConfigure.setEnabled(configureEnabled); mConfigure.setEnabled(configureEnabled);
mConfigure.setIntent(configIntent); mConfigure.setIntent(configIntent);
setConfigureSummary(configSummary); setConfigureSummary(configSummary);
RestrictedPreference networkResetPref = (RestrictedPreference) findPreference(
NETWORK_RESET);
if (networkResetPref != null) {
networkResetPref.checkRestrictionAndSetDisabled(UserManager.DISALLOW_NETWORK_RESET);
}
} }
private void setConfigureSummary(String summary) { private void setConfigureSummary(String summary) {
@@ -290,9 +297,5 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index
nonVisibleKeys.add(AUTO_RESTORE); nonVisibleKeys.add(AUTO_RESTORE);
nonVisibleKeys.add(CONFIGURE_ACCOUNT); nonVisibleKeys.add(CONFIGURE_ACCOUNT);
} }
if (UserManager.get(context).hasUserRestriction(
UserManager.DISALLOW_NETWORK_RESET)) {
nonVisibleKeys.add(NETWORK_RESET);
}
} }
} }

View File

@@ -28,10 +28,12 @@ import android.view.View;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener;
import com.android.settingslib.RestrictedPreference;
/** /**
* Based on android.preference.SeekBarPreference, but uses support preference as base. * 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 { implements OnSeekBarChangeListener, View.OnKeyListener {
private int mProgress; private int mProgress;

View File

@@ -51,6 +51,7 @@ import com.android.internal.telephony.TelephonyProperties;
import com.android.settings.nfc.NfcEnabler; import com.android.settings.nfc.NfcEnabler;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settingslib.RestrictedPreference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -226,7 +227,8 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
final Activity activity = getActivity(); final Activity activity = getActivity();
mAirplaneModePreference = (SwitchPreference) findPreference(KEY_TOGGLE_AIRPLANE); mAirplaneModePreference = (SwitchPreference) findPreference(KEY_TOGGLE_AIRPLANE);
SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC); 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); mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam); mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
@@ -258,7 +260,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
} }
// Disable VPN. // Disable VPN.
// TODO: http://b/23693383 // TODO: http://b/23693383
if (!isAdmin || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) { if (!isAdmin) {
removePreference(KEY_VPN_SETTINGS); removePreference(KEY_VPN_SETTINGS);
} }
@@ -315,10 +317,10 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
// Disable Tethering if it's not allowed or if it's a wifi-only device // Disable Tethering if it's not allowed or if it's a wifi-only device
final ConnectivityManager cm = final ConnectivityManager cm =
(ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); (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)); getPreferenceScreen().removePreference(findPreference(KEY_TETHER_SETTINGS));
} else { } else if (!mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) {
Preference p = findPreference(KEY_TETHER_SETTINGS); Preference p = findPreference(KEY_TETHER_SETTINGS);
p.setTitle(com.android.settingslib.Utils.getTetheringLabel(cm)); p.setTitle(com.android.settingslib.Utils.getTetheringLabel(cm));
@@ -347,6 +349,19 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
} else { } else {
removePreference(KEY_WFC_SETTINGS); 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 @Override

View File

@@ -53,6 +53,7 @@ import android.view.MenuItem;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.settings.AccessiblePreferenceCategory; import com.android.settings.AccessiblePreferenceCategory;
import com.android.settings.DimmableIconPreference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils; import com.android.settings.Utils;
@@ -113,7 +114,7 @@ public class AccountSettings extends SettingsPreferenceFragment
/** /**
* The preference that displays the add account button. * The preference that displays the add account button.
*/ */
public Preference addAccountPreference; public DimmableIconPreference addAccountPreference;
/** /**
* The preference that displays the button to toggle work profile. * The preference that displays the button to toggle work profile.
*/ */
@@ -324,17 +325,17 @@ public class AccountSettings extends SettingsPreferenceFragment
if (userInfo.isEnabled()) { if (userInfo.isEnabled()) {
profileData.authenticatorHelper = new AuthenticatorHelper(context, profileData.authenticatorHelper = new AuthenticatorHelper(context,
userInfo.getUserHandle(), this); 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); mProfiles.put(userInfo.id, profileData);
Index.getInstance(getActivity()).updateFromClassNameResource( Index.getInstance(getActivity()).updateFromClassNameResource(
AccountSettings.class.getName(), true, true); AccountSettings.class.getName(), true, true);
} }
private Preference newAddAccountPreference(Context context) { private DimmableIconPreference newAddAccountPreference(Context context) {
Preference preference = new Preference(getPrefContext()); DimmableIconPreference preference = new DimmableIconPreference(getPrefContext());
preference.setTitle(R.string.add_account_label); preference.setTitle(R.string.add_account_label);
preference.setIcon(R.drawable.ic_menu_add); preference.setIcon(R.drawable.ic_menu_add);
preference.setOnPreferenceClickListener(this); preference.setOnPreferenceClickListener(this);
@@ -714,16 +715,13 @@ public class AccountSettings extends SettingsPreferenceFragment
for (int i = 0; i < profilesCount; i++) { for (int i = 0; i < profilesCount; i++) {
UserInfo userInfo = profiles.get(i); UserInfo userInfo = profiles.get(i);
if (userInfo.isEnabled()) { if (userInfo.isEnabled()) {
if (!um.hasUserRestriction(
DISALLOW_MODIFY_ACCOUNTS, userInfo.getUserHandle())) {
SearchIndexableRaw data = new SearchIndexableRaw(context); SearchIndexableRaw data = new SearchIndexableRaw(context);
data = new SearchIndexableRaw(context); data = new SearchIndexableRaw(context);
data.title = res.getString(R.string.add_account_label); data.title = res.getString(R.string.add_account_label);
data.screenTitle = screenTitle; data.screenTitle = screenTitle;
result.add(data); result.add(data);
}
if (userInfo.isManagedProfile()) { if (userInfo.isManagedProfile()) {
SearchIndexableRaw data = new SearchIndexableRaw(context); data = new SearchIndexableRaw(context);
data = new SearchIndexableRaw(context); data = new SearchIndexableRaw(context);
data.title = res.getString(R.string.remove_managed_profile_label); data.title = res.getString(R.string.remove_managed_profile_label);
data.screenTitle = screenTitle; data.screenTitle = screenTitle;

View File

@@ -27,6 +27,7 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.RestrictedPreference;
/** /**
* NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is
@@ -36,10 +37,9 @@ import com.android.settings.R;
public class NfcEnabler implements Preference.OnPreferenceChangeListener { public class NfcEnabler implements Preference.OnPreferenceChangeListener {
private final Context mContext; private final Context mContext;
private final SwitchPreference mSwitch; private final SwitchPreference mSwitch;
private final PreferenceScreen mAndroidBeam; private final RestrictedPreference mAndroidBeam;
private final NfcAdapter mNfcAdapter; private final NfcAdapter mNfcAdapter;
private final IntentFilter mIntentFilter; private final IntentFilter mIntentFilter;
private boolean mBeamDisallowed;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override @Override
@@ -53,13 +53,11 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
}; };
public NfcEnabler(Context context, SwitchPreference switchPreference, public NfcEnabler(Context context, SwitchPreference switchPreference,
PreferenceScreen androidBeam) { RestrictedPreference androidBeam) {
mContext = context; mContext = context;
mSwitch = switchPreference; mSwitch = switchPreference;
mAndroidBeam = androidBeam; mAndroidBeam = androidBeam;
mNfcAdapter = NfcAdapter.getDefaultAdapter(context); mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
mBeamDisallowed = ((UserManager) mContext.getSystemService(Context.USER_SERVICE))
.hasUserRestriction(UserManager.DISALLOW_OUTGOING_BEAM);
if (mNfcAdapter == null) { if (mNfcAdapter == null) {
// NFC is not supported // NFC is not supported
@@ -68,9 +66,6 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
mIntentFilter = null; mIntentFilter = null;
return; return;
} }
if (mBeamDisallowed) {
mAndroidBeam.setEnabled(false);
}
mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
} }
@@ -117,8 +112,8 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
case NfcAdapter.STATE_ON: case NfcAdapter.STATE_ON:
mSwitch.setChecked(true); mSwitch.setChecked(true);
mSwitch.setEnabled(true); mSwitch.setEnabled(true);
mAndroidBeam.setEnabled(!mBeamDisallowed); mAndroidBeam.checkRestrictionAndSetDisabled(UserManager.DISALLOW_OUTGOING_BEAM);
if (mNfcAdapter.isNdefPushEnabled() && !mBeamDisallowed) { if (mNfcAdapter.isNdefPushEnabled() && mAndroidBeam.isEnabled()) {
mAndroidBeam.setSummary(R.string.android_beam_on_summary); mAndroidBeam.setSummary(R.string.android_beam_on_summary);
} else { } else {
mAndroidBeam.setSummary(R.string.android_beam_off_summary); mAndroidBeam.setSummary(R.string.android_beam_off_summary);

View File

@@ -37,6 +37,7 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.os.Vibrator; import android.os.Vibrator;
import android.preference.SeekBarVolumizer; import android.preference.SeekBarVolumizer;
@@ -57,6 +58,8 @@ import com.android.settings.Utils;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedPreference;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.ArrayList; import java.util.ArrayList;
@@ -64,6 +67,8 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
public class SoundSettings extends SettingsPreferenceFragment implements Indexable { public class SoundSettings extends SettingsPreferenceFragment implements Indexable {
private static final String TAG = "SoundSettings"; private static final String TAG = "SoundSettings";
@@ -164,8 +169,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements Indexab
} catch (IllegalArgumentException ignored) { } catch (IllegalArgumentException ignored) {
isCellBroadcastAppLinkEnabled = false; // CMAS app not installed isCellBroadcastAppLinkEnabled = false; // CMAS app not installed
} }
if (!mUserManager.isAdminUser() || !isCellBroadcastAppLinkEnabled if (!mUserManager.isAdminUser() || !isCellBroadcastAppLinkEnabled) {
|| mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
removePreference(KEY_CELL_BROADCAST_SETTINGS); removePreference(KEY_CELL_BROADCAST_SETTINGS);
} }
initRingtones(); initRingtones();
@@ -186,13 +190,23 @@ public class SoundSettings extends SettingsPreferenceFragment implements Indexab
for (VolumeSeekBarPreference volumePref : mVolumePrefs) { for (VolumeSeekBarPreference volumePref : mVolumePrefs) {
volumePref.onActivityResume(); 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) { for (String key : RESTRICTED_KEYS) {
Preference pref = findPreference(key); Preference pref = findPreference(key);
if (pref != null) { if (pref instanceof RestrictedPreference) {
pref.setEnabled(!isRestricted); ((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 @Override

View File

@@ -29,6 +29,7 @@ import android.support.v7.preference.Preference;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settingslib.RestrictedPreference;
import java.util.List; import java.util.List;
@@ -59,7 +60,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
private UserManager mUserManager; private UserManager mUserManager;
private SwitchPreference mPhonePref; private SwitchPreference mPhonePref;
private Preference mRemoveUserPref; private RestrictedPreference mRemoveUserPref;
private UserInfo mUserInfo; private UserInfo mUserInfo;
private boolean mGuestUser; private boolean mGuestUser;
@@ -79,7 +80,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
addPreferencesFromResource(R.xml.user_details_settings); addPreferencesFromResource(R.xml.user_details_settings);
mPhonePref = (SwitchPreference) findPreference(KEY_ENABLE_TELEPHONY); mPhonePref = (SwitchPreference) findPreference(KEY_ENABLE_TELEPHONY);
mRemoveUserPref = findPreference(KEY_REMOVE_USER); mRemoveUserPref = (RestrictedPreference) findPreference(KEY_REMOVE_USER);
mGuestUser = getArguments().getBoolean(EXTRA_USER_GUEST, false); mGuestUser = getArguments().getBoolean(EXTRA_USER_GUEST, false);
@@ -102,12 +103,15 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mPhonePref.setChecked( mPhonePref.setChecked(
!mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS)); !mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS));
} }
if (mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)) {
removePreference(KEY_REMOVE_USER);
}
mPhonePref.setOnPreferenceChangeListener(this); mPhonePref.setOnPreferenceChangeListener(this);
} }
@Override
public void onResume() {
super.onResume();
mRemoveUserPref.checkRestrictionAndSetDisabled(UserManager.DISALLOW_REMOVE_USER);
}
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
if (preference == mRemoveUserPref) { if (preference == mRemoveUserPref) {

View File

@@ -17,6 +17,7 @@
package com.android.settings.users; package com.android.settings.users;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
@@ -24,12 +25,18 @@ import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.ImageView;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.RestrictedPreference;
import java.util.Comparator; 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_UNKNOWN = -10;
public static final int USERID_GUEST_DEFAULTS = -11; public static final int USERID_GUEST_DEFAULTS = -11;
@@ -71,6 +78,14 @@ public class UserPreference extends Preference {
mUserId = userId; mUserId = userId;
} }
private void dimIcon(boolean dimmed) {
Drawable icon = getIcon();
if (icon != null) {
icon.mutate().setAlpha(dimmed ? ALPHA_DISABLED : ALPHA_ENABLED);
setIcon(icon);
}
}
@Override @Override
public void onBindViewHolder(PreferenceViewHolder view) { public void onBindViewHolder(PreferenceViewHolder view) {
UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE); UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
@@ -87,7 +102,8 @@ public class UserPreference extends Preference {
deleteDividerView.setVisibility(View.GONE); 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 (manageView != null) {
if (mSettingsClickListener != null) { if (mSettingsClickListener != null) {
manageView.setOnClickListener(mSettingsClickListener); manageView.setOnClickListener(mSettingsClickListener);
@@ -99,8 +115,10 @@ public class UserPreference extends Preference {
manageView.setVisibility(View.GONE); manageView.setVisibility(View.GONE);
manageDividerView.setVisibility(View.GONE); manageDividerView.setVisibility(View.GONE);
} }
manageView.setImageAlpha(disabledByAdmin ? ALPHA_DISABLED : ALPHA_ENABLED);
} }
super.onBindViewHolder(view); super.onBindViewHolder(view);
dimIcon(disabledByAdmin);
} }
private int getSerialNumber() { private int getSerialNumber() {

View File

@@ -56,6 +56,7 @@ import android.widget.SimpleAdapter;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.settings.ChooseLockGeneric; import com.android.settings.ChooseLockGeneric;
import com.android.settings.DimmableIconPreference;
import com.android.settings.OwnerInfoSettings; import com.android.settings.OwnerInfoSettings;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SelectableEditTextPreference; import com.android.settings.SelectableEditTextPreference;
@@ -66,6 +67,8 @@ import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.settingslib.drawable.CircleFramedDrawable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -73,6 +76,8 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
/** /**
* Screen that manages the list of users on the device. * Screen that manages the list of users on the device.
* Guest user is an always visible entry, even if the guest is not currently * Guest user is an always visible entry, even if the guest is not currently
@@ -126,9 +131,9 @@ public class UserSettings extends SettingsPreferenceFragment
private PreferenceGroup mUserListCategory; private PreferenceGroup mUserListCategory;
private UserPreference mMePreference; private UserPreference mMePreference;
private Preference mAddUser; private DimmableIconPreference mAddUser;
private PreferenceGroup mLockScreenSettings; private PreferenceGroup mLockScreenSettings;
private SwitchPreference mAddUserWhenLocked; private RestrictedSwitchPreference mAddUserWhenLocked;
private int mRemovingUserId = -1; private int mRemovingUserId = -1;
private int mAddedUserId = 0; private int mAddedUserId = 0;
private boolean mAddingUser; private boolean mAddingUser;
@@ -213,7 +218,7 @@ public class UserSettings extends SettingsPreferenceFragment
if (mUserCaps.mIsAdmin) { if (mUserCaps.mIsAdmin) {
mMePreference.setSummary(R.string.user_admin); 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 // Determine if add user/profile button should be visible
if (mUserCaps.mCanAddUser) { if (mUserCaps.mCanAddUser) {
mAddUser.setOnPreferenceClickListener(this); mAddUser.setOnPreferenceClickListener(this);
@@ -223,7 +228,7 @@ public class UserSettings extends SettingsPreferenceFragment
} }
} }
mLockScreenSettings = (PreferenceGroup) findPreference("lock_screen_settings"); mLockScreenSettings = (PreferenceGroup) findPreference("lock_screen_settings");
mAddUserWhenLocked = (SwitchPreference) findPreference("add_users_when_locked"); mAddUserWhenLocked = (RestrictedSwitchPreference) findPreference("add_users_when_locked");
loadProfile(); loadProfile();
setHasOptionsMenu(true); setHasOptionsMenu(true);
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
@@ -745,7 +750,8 @@ public class UserSettings extends SettingsPreferenceFragment
userPreferences.add(pref); 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 // Add a virtual Guest user for guest defaults
UserPreference pref = new UserPreference(getPrefContext(), null, UserPreference pref = new UserPreference(getPrefContext(), null,
UserPreference.USERID_GUEST_DEFAULTS, UserPreference.USERID_GUEST_DEFAULTS,
@@ -755,6 +761,8 @@ public class UserSettings extends SettingsPreferenceFragment
pref.setIcon(getEncircledDefaultIcon()); pref.setIcon(getEncircledDefaultIcon());
pref.setOnPreferenceClickListener(this); pref.setOnPreferenceClickListener(this);
userPreferences.add(pref); userPreferences.add(pref);
pref.setDisabledByAdmin(
mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
} }
// Sort list of users by serialNum // Sort list of users by serialNum
@@ -788,7 +796,7 @@ public class UserSettings extends SettingsPreferenceFragment
} }
// Append Add user to the end of the list // Append Add user to the end of the list
if (mUserCaps.mCanAddUser) { if (mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUser) {
boolean moreUsers = mUserManager.canAddMoreUsers(); boolean moreUsers = mUserManager.canAddMoreUsers();
mAddUser.setOrder(Preference.DEFAULT_ORDER); mAddUser.setOrder(Preference.DEFAULT_ORDER);
preferenceScreen.addPreference(mAddUser); preferenceScreen.addPreference(mAddUser);
@@ -798,13 +806,19 @@ public class UserSettings extends SettingsPreferenceFragment
} else { } else {
mAddUser.setSummary(null); 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); mLockScreenSettings.setOrder(Preference.DEFAULT_ORDER);
preferenceScreen.addPreference(mLockScreenSettings); preferenceScreen.addPreference(mLockScreenSettings);
mAddUserWhenLocked.setChecked(Settings.Global.getInt(getContentResolver(), mAddUserWhenLocked.setChecked(Settings.Global.getInt(getContentResolver(),
Settings.Global.ADD_USERS_WHEN_LOCKED, 0) == 1); Settings.Global.ADD_USERS_WHEN_LOCKED, 0) == 1);
mAddUserWhenLocked.setOnPreferenceChangeListener(this); mAddUserWhenLocked.setOnPreferenceChangeListener(this);
mAddUserWhenLocked.setDisabledByAdmin(
mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
} }
} }
@@ -998,6 +1012,7 @@ public class UserSettings extends SettingsPreferenceFragment
boolean mIsGuest; boolean mIsGuest;
boolean mCanAddGuest; boolean mCanAddGuest;
boolean mDisallowAddUser; boolean mDisallowAddUser;
EnforcedAdmin mEnforcedAdmin;
private UserCapabilities() {} private UserCapabilities() {}
@@ -1012,8 +1027,9 @@ public class UserSettings extends SettingsPreferenceFragment
final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId()); final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId());
caps.mIsGuest = myUserInfo.isGuest(); caps.mIsGuest = myUserInfo.isGuest();
caps.mIsAdmin = myUserInfo.isAdmin(); caps.mIsAdmin = myUserInfo.isAdmin();
caps.mDisallowAddUser = userManager.hasUserRestriction( caps.mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(context,
UserManager.DISALLOW_ADD_USER); UserManager.DISALLOW_ADD_USER, UserHandle.myUserId());
caps.mDisallowAddUser = (caps.mEnforcedAdmin != null);
if (!caps.mIsAdmin || UserManager.getMaxSupportedUsers() < 2 if (!caps.mIsAdmin || UserManager.getMaxSupportedUsers() < 2
|| !UserManager.supportsMultipleUsers() || !UserManager.supportsMultipleUsers()
|| caps.mDisallowAddUser) { || caps.mDisallowAddUser) {
@@ -1040,6 +1056,9 @@ public class UserSettings extends SettingsPreferenceFragment
", mCanAddRestrictedProfile=" + mCanAddRestrictedProfile + ", mCanAddRestrictedProfile=" + mCanAddRestrictedProfile +
", mIsAdmin=" + mIsAdmin + ", mIsAdmin=" + mIsAdmin +
", mIsGuest=" + mIsGuest + ", mIsGuest=" + mIsGuest +
", mCanAddGuest=" + mCanAddGuest +
", mDisallowAddUser=" + mDisallowAddUser +
", mEnforcedAdmin=" + mEnforcedAdmin +
'}'; '}';
} }
} }
@@ -1090,7 +1109,7 @@ public class UserSettings extends SettingsPreferenceFragment
data.screenTitle = res.getString(R.string.user_settings_title); data.screenTitle = res.getString(R.string.user_settings_title);
result.add(data); result.add(data);
if (userCaps.mCanAddUser) { if (userCaps.mCanAddUser || userCaps.mDisallowAddUser) {
data = new SearchIndexableRaw(context); data = new SearchIndexableRaw(context);
data.title = res.getString(userCaps.mCanAddRestrictedProfile ? data.title = res.getString(userCaps.mCanAddRestrictedProfile ?
R.string.user_add_user_or_profile_menu R.string.user_add_user_or_profile_menu