diff options
author | Geoffrey Borggaard <geoffreyb@google.com> | 2013-08-02 18:16:27 -0400 |
---|---|---|
committer | Geoffrey Borggaard <geoffreyb@google.com> | 2013-08-06 17:24:37 -0400 |
commit | fe21d9aaa8a8c7f8a759805ba021b59dd821e4fe (patch) | |
tree | 6ff78c7c639f19c38e8e9af211b27155eea0f3b9 /src/com/android | |
parent | d98d2abda6ce097c6473bb40e36810fa13a66403 (diff) | |
download | packages_apps_Settings-fe21d9aaa8a8c7f8a759805ba021b59dd821e4fe.tar.gz packages_apps_Settings-fe21d9aaa8a8c7f8a759805ba021b59dd821e4fe.tar.bz2 packages_apps_Settings-fe21d9aaa8a8c7f8a759805ba021b59dd821e4fe.zip |
Pin protect more screens.
When these screens are locked down with user restrictions,
it should prompt the user for the restrictions pin before allowing
access to the settings screen.
Change-Id: Iadbb087da2d9470b855ea0bea89f2da1ffb9e854
Diffstat (limited to 'src/com/android')
8 files changed, 159 insertions, 44 deletions
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index 8ed9a7e14..dd04cd9c1 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -79,7 +79,7 @@ import java.util.List; /* * Displays preferences for application developers. */ -public class DevelopmentSettings extends PreferenceFragment +public class DevelopmentSettings extends RestrictedSettingsFragment implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener, OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener { private static final String TAG = "DevelopmentSettings"; @@ -210,6 +210,7 @@ public class DevelopmentSettings extends PreferenceFragment = new ArrayList<CheckBoxPreference>(); private final HashSet<Preference> mDisabledPrefs = new HashSet<Preference>(); + private final HashSet<Preference> mProtectedByRestrictionsPrefs = new HashSet<Preference>(); // To track whether a confirmation dialog was clicked. private boolean mDialogClicked; @@ -219,6 +220,10 @@ public class DevelopmentSettings extends PreferenceFragment private boolean mUnavailable; + public DevelopmentSettings() { + super(null /* Don't ask for restrictions pin on creation. */); + } + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -268,6 +273,13 @@ public class DevelopmentSettings extends PreferenceFragment disableForUser(mPassword); } + if (shouldBePinProtected(RESTRICTIONS_PIN_SET)) { + protectByRestrictions(mEnableAdb); + protectByRestrictions(mClearAdbKeys); + protectByRestrictions(mEnableTerminal); + protectByRestrictions(mPassword); + } + mDebugAppPref = findPreference(DEBUG_APP_KEY); mAllPrefs.add(mDebugAppPref); mWaitForDebugger = findAndInitCheckboxPref(WAIT_FOR_DEBUGGER_KEY); @@ -350,6 +362,12 @@ public class DevelopmentSettings extends PreferenceFragment } } + private void protectByRestrictions(Preference pref) { + if (pref != null) { + mProtectedByRestrictionsPrefs.add(pref); + } + } + private CheckBoxPreference findAndInitCheckboxPref(String key) { CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); if (pref == null) { @@ -793,7 +811,7 @@ public class DevelopmentSettings extends PreferenceFragment if (flinger != null) { Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); - final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0; + final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0; data.writeInt(showUpdates); flinger.transact(1002, data, null, 0); data.recycle(); @@ -810,7 +828,7 @@ public class DevelopmentSettings extends PreferenceFragment if (flinger != null) { Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); - final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0; + final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0; data.writeInt(disableOverlays); flinger.transact(1008, data, null, 0); data.recycle(); @@ -824,7 +842,7 @@ public class DevelopmentSettings extends PreferenceFragment private void updateHardwareUiOptions() { updateCheckBox(mForceHardwareUi, SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false)); } - + private void writeHardwareUiOptions() { SystemProperties.set(HARDWARE_UI_PROPERTY, mForceHardwareUi.isChecked() ? "true" : "false"); pokeSystemProperties(); @@ -952,7 +970,7 @@ public class DevelopmentSettings extends PreferenceFragment updateCheckBox(mShowCpuUsage, Settings.Global.getInt(getActivity().getContentResolver(), Settings.Global.SHOW_PROCESSES, 0) != 0); } - + private void writeCpuUsageOptions() { boolean value = mShowCpuUsage.isChecked(); Settings.Global.putInt(getActivity().getContentResolver(), @@ -1160,6 +1178,10 @@ public class DevelopmentSettings extends PreferenceFragment @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (mProtectedByRestrictionsPrefs.contains(preference) + && !restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { + return false; + } if (Utils.isMonkeyRunning()) { return false; @@ -1198,12 +1220,12 @@ public class DevelopmentSettings extends PreferenceFragment : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); } else if (preference == mBugreportInPower) { Settings.Secure.putInt(getActivity().getContentResolver(), - Settings.Secure.BUGREPORT_IN_POWER_MENU, + Settings.Secure.BUGREPORT_IN_POWER_MENU, mBugreportInPower.isChecked() ? 1 : 0); } else if (preference == mKeepScreenOn) { Settings.Global.putInt(getActivity().getContentResolver(), Settings.Global.STAY_ON_WHILE_PLUGGED_IN, - mKeepScreenOn.isChecked() ? + mKeepScreenOn.isChecked() ? (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0); } else if (preference == mBtHciSnoopLog) { writeBtHciSnoopLogOptions(); diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java index 55c264c3e..ebf2bcf34 100644 --- a/src/com/android/settings/RestrictedSettingsFragment.java +++ b/src/com/android/settings/RestrictedSettingsFragment.java @@ -25,11 +25,16 @@ import android.os.UserManager; /** * Base class for settings activities that should be pin protected when in restricted mode. * The constructor for this class will take the restriction key that this screen should be - * locked by. If {@link UserManager.hasRestrictionsPin()} and {@link UserManager.hasUserRestriction(String)} returns true for the - * restriction key, then the user will hav + * locked by. If {@link UserManager.hasRestrictionsPin()} and + * {@link UserManager.hasUserRestriction(String)} returns true for the restriction key, then + * the user will have to enter the restrictions pin before seeing the Settings screen. * + * If this settings screen should be pin protected whenever + * {@link UserManager.hasUserRestriction(String)} returns true, pass in + * {@link RESTRICTIONS_PIN_SET} to the constructor instead of a restrictions key. */ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { + protected static final String RESTRICTIONS_PIN_SET = "restrictions_pin_set"; // Should be unique across all settings screens that use this. private static final int REQUEST_PIN_CHALLENGE = 12309; @@ -45,21 +50,22 @@ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { private final String mRestrictionKey; - public RestrictedSettingsFragment(String restrictedFlag) { - mRestrictionKey = restrictedFlag; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); + /** + * @param restrictionKey The restriction key to check before pin protecting + * this settings page. Pass in {@link RESTRICTIONS_PIN_SET} if it should + * be PIN protected whenever a restrictions pin is set. Pass in + * null if it should never be PIN protected. + */ + public RestrictedSettingsFragment(String restrictionKey) { + mRestrictionKey = restrictionKey; } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); + if (icicle != null) { mChallengeSucceeded = icicle.getBoolean(KEY_CHALLENGE_SUCCEEDED, false); mChallengeRequested = icicle.getBoolean(KEY_CHALLENGE_REQUESTED, false); @@ -79,8 +85,7 @@ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { @Override public void onResume() { super.onResume(); - if (mUserManager.hasUserRestriction(mRestrictionKey) - && mUserManager.hasRestrictionsPin()) { + if (shouldBePinProtected(mRestrictionKey)) { ensurePin(); } } @@ -121,7 +126,40 @@ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { * Used to determine if the settings UI should disable UI. */ protected boolean isRestrictedAndNotPinProtected() { + if (mRestrictionKey == null || RESTRICTIONS_PIN_SET.equals(mRestrictionKey)) { + return false; + } return mUserManager.hasUserRestriction(mRestrictionKey) && !mUserManager.hasRestrictionsPin(); } + + /** + * Called to trigger the pin entry if the given restriction key is locked down. + * @param restrictionsKey The restriction key or {@link RESTRICTIONS_PIN_SET} if + * pin entry should get triggered if there is a pin set. + */ + protected boolean restrictionsPinCheck(String restrictionsKey) { + if (shouldBePinProtected(restrictionsKey) && !mChallengeSucceeded) { + ensurePin(); + return false; + } else { + return true; + } + } + + protected boolean hasChallengeSucceeded() { + return mChallengeSucceeded; + } + + /** + * Returns true if this restrictions key is locked down. + */ + protected boolean shouldBePinProtected(String restrictionKey) { + if (restrictionKey == null) { + return false; + } + boolean restricted = RESTRICTIONS_PIN_SET.equals(restrictionKey) + || mUserManager.hasUserRestriction(restrictionKey); + return restricted && mUserManager.hasRestrictionsPin(); + } } diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 948aded98..7a442a9b7 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -45,14 +45,14 @@ import android.util.Log; import com.android.internal.widget.LockPatternUtils; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; /** * Gesture lock pattern settings. */ -public class SecuritySettings extends SettingsPreferenceFragment +public class SecuritySettings extends RestrictedSettingsFragment implements OnPreferenceChangeListener, DialogInterface.OnClickListener { - static final String TAG = "SecuritySettings"; // Lock Settings @@ -82,6 +82,8 @@ public class SecuritySettings extends SettingsPreferenceFragment private static final String KEY_NOTIFICATION_ACCESS = "manage_notification_access"; private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; + private final HashSet<Preference> mProtectedByRestictionsPrefs = new HashSet<Preference>(); + private PackageManager mPM; DevicePolicyManager mDPM; @@ -106,6 +108,10 @@ public class SecuritySettings extends SettingsPreferenceFragment private boolean mIsPrimary; + public SecuritySettings() { + super(null /* Don't ask for restrictions pin on creation. */); + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -303,9 +309,19 @@ public class SecuritySettings extends SettingsPreferenceFragment } } + if (shouldBePinProtected(RESTRICTIONS_PIN_SET)) { + protectByRestrictions(mToggleAppInstallation); + protectByRestrictions(mToggleVerifyApps); + } return root; } + private void protectByRestrictions(Preference pref) { + if (pref != null) { + mProtectedByRestictionsPrefs.add(pref); + } + } + private int getNumEnabledNotificationListeners() { final String flat = Settings.Secure.getString(getContentResolver(), Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); @@ -471,6 +487,11 @@ public class SecuritySettings extends SettingsPreferenceFragment @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (mProtectedByRestictionsPrefs.contains(preference) + && !restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { + return false; + } + final String key = preference.getKey(); final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index 1f2992708..ecb984d33 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -16,6 +16,8 @@ package com.android.settings; +import java.util.HashSet; + import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -44,7 +46,7 @@ import com.android.internal.telephony.TelephonyProperties; import com.android.settings.nfc.NfcEnabler; import com.android.settings.NsdEnabler; -public class WirelessSettings extends SettingsPreferenceFragment { +public class WirelessSettings extends RestrictedSettingsFragment { private static final String TAG = "WirelessSettings"; private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane"; @@ -73,7 +75,11 @@ public class WirelessSettings extends SettingsPreferenceFragment { private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1; private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage"; + private final HashSet<Preference> mProtectedByRestictionsPrefs = new HashSet<Preference>(); + public WirelessSettings() { + super(null); + } /** * Invoked on each preference click in this hierarchy, overrides * PreferenceActivity's implementation. Used to make sure we track the @@ -81,6 +87,10 @@ public class WirelessSettings extends SettingsPreferenceFragment { */ @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (mProtectedByRestictionsPrefs.contains(preference) && !hasChallengeSucceeded()) { + restrictionsPinCheck(RESTRICTIONS_PIN_SET); + return false; + } log("onPreferenceTreeClick: preference=" + preference); if (preference == mAirplaneModePreference && Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { @@ -145,6 +155,13 @@ public class WirelessSettings extends SettingsPreferenceFragment { } } + private void protectByRestrictions(String key) { + Preference pref = findPreference(key); + if (pref != null) { + mProtectedByRestictionsPrefs.add(pref); + } + } + @Override public Dialog onCreateDialog(int dialogId) { log("onCreateDialog: dialogId=" + dialogId); @@ -225,6 +242,8 @@ public class WirelessSettings extends SettingsPreferenceFragment { ps.setDependency(KEY_TOGGLE_AIRPLANE); } } + protectByRestrictions(KEY_WIMAX_SETTINGS); + // Manually set dependencies for Wifi when not toggleable. if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_WIFI)) { findPreference(KEY_VPN_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE); @@ -232,7 +251,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { if (isSecondaryUser) { // Disable VPN removePreference(KEY_VPN_SETTINGS); } - + protectByRestrictions(KEY_VPN_SETTINGS); // Manually set dependencies for Bluetooth when not toggleable. if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_BLUETOOTH)) { // No bluetooth-dependent items in the list. Code kept in case one is added later. @@ -257,6 +276,8 @@ public class WirelessSettings extends SettingsPreferenceFragment { removePreference(KEY_MOBILE_NETWORK_SETTINGS); removePreference(KEY_MANAGE_MOBILE_PLAN); } + protectByRestrictions(KEY_MOBILE_NETWORK_SETTINGS); + protectByRestrictions(KEY_MANAGE_MOBILE_PLAN); // Remove Airplane Mode settings if it's a stationary device such as a TV. if (getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)) { @@ -280,6 +301,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { Preference p = findPreference(KEY_TETHER_SETTINGS); p.setTitle(Utils.getTetheringLabel(cm)); } + protectByRestrictions(KEY_TETHER_SETTINGS); // Enable link to CMAS app settings depending on the value in config.xml. boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean( @@ -300,6 +322,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { Preference ps = findPreference(KEY_CELL_BROADCAST_SETTINGS); if (ps != null) root.removePreference(ps); } + protectByRestrictions(KEY_CELL_BROADCAST_SETTINGS); } @Override @@ -345,6 +368,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { mAirplaneModeEnabler.setAirplaneModeInECM(isChoiceYes, mAirplaneModePreference.isChecked()); } + super.onActivityResult(requestCode, resultCode, data); } @Override diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java index ab657e07e..529ee7971 100755 --- a/src/com/android/settings/bluetooth/BluetoothSettings.java +++ b/src/com/android/settings/bluetooth/BluetoothSettings.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; -import android.os.UserManager; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; @@ -74,7 +73,6 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { private final IntentFilter mIntentFilter; - private UserManager mUserManager; // accessed from inner class (not private to avoid thunks) Preference mMyDevicePreference; @@ -96,13 +94,13 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { }; public BluetoothSettings() { + super(DISALLOW_CONFIG_BLUETOOTH); mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); mActivityStarted = (savedInstanceState == null); // don't auto start scan after rotation mEmptyView = (TextView) getView().findViewById(android.R.id.empty); @@ -171,7 +169,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (mLocalAdapter == null) return; // If the user is not allowed to configure bluetooth, do not show the menu. - if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return; + if (isRestrictedAndNotPinProtected()) return; boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON; boolean isDiscovering = mLocalAdapter.isDiscovering(); @@ -219,7 +217,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { } private void startScanning() { - if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return; + if (isRestrictedAndNotPinProtected()) return; if (!mAvailableDevicesCategoryIsPresent) { getPreferenceScreen().addPreference(mAvailableDevicesCategory); } @@ -266,7 +264,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { mMyDevicePreference.setEnabled(true); preferenceScreen.addPreference(mMyDevicePreference); - if (! mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) { + if (!isRestrictedAndNotPinProtected()) { if (mDiscoverableEnabler == null) { mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(), mLocalAdapter, mMyDevicePreference); @@ -297,7 +295,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { } else { mAvailableDevicesCategory.removeAll(); } - if (! mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) { + if (!isRestrictedAndNotPinProtected()) { addDeviceCategory(mAvailableDevicesCategory, R.string.bluetooth_preference_found_devices, BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER); @@ -366,7 +364,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { public void onClick(View v) { // User clicked on advanced options icon for a device in the list if (v.getTag() instanceof CachedBluetoothDevice) { - if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return; + if (isRestrictedAndNotPinProtected()) return; CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag(); diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java index 7fc1b65de..e2faf7fd5 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java @@ -26,6 +26,7 @@ import android.preference.PreferenceScreen; import android.util.Log; import com.android.settings.ProgressCategory; +import com.android.settings.RestrictedSettingsFragment; import com.android.settings.SettingsPreferenceFragment; import java.util.Collection; @@ -39,7 +40,7 @@ import java.util.WeakHashMap; * @see DevicePickerFragment */ public abstract class DeviceListPreferenceFragment extends - SettingsPreferenceFragment implements BluetoothCallback { + RestrictedSettingsFragment implements BluetoothCallback { private static final String TAG = "DeviceListPreferenceFragment"; @@ -58,7 +59,8 @@ public abstract class DeviceListPreferenceFragment extends final WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap = new WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference>(); - DeviceListPreferenceFragment() { + DeviceListPreferenceFragment(String restrictedKey) { + super(restrictedKey); mFilter = BluetoothDeviceFilter.ALL_FILTER; } diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java index 027ceedbe..de8202b0f 100644 --- a/src/com/android/settings/bluetooth/DevicePickerFragment.java +++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java @@ -34,6 +34,10 @@ import com.android.settings.R; */ public final class DevicePickerFragment extends DeviceListPreferenceFragment { + DevicePickerFragment() { + super(null /* Not tied to any user restrictions. */); + } + private boolean mNeedAuth; private String mLaunchPackage; private String mLaunchClass; diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index c236b6dd1..1c2c5f72a 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -16,6 +16,10 @@ package com.android.settings.users; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; @@ -42,8 +46,8 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.preference.Preference; -import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; @@ -59,19 +63,13 @@ import android.widget.SimpleAdapter; import com.android.internal.widget.LockPatternUtils; import com.android.settings.ChooseLockGeneric; -import com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment; import com.android.settings.OwnerInfoSettings; import com.android.settings.R; +import com.android.settings.RestrictedSettingsFragment; import com.android.settings.SelectableEditTextPreference; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class UserSettings extends SettingsPreferenceFragment +public class UserSettings extends RestrictedSettingsFragment implements OnPreferenceClickListener, OnClickListener, DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener { @@ -136,6 +134,9 @@ public class UserSettings extends SettingsPreferenceFragment private SparseArray<Bitmap> mUserIcons = new SparseArray<Bitmap>(); private boolean mIsOwner = UserHandle.myUserId() == UserHandle.USER_OWNER; + public UserSettings() { + super(null); + } private Handler mHandler = new Handler() { @Override @@ -717,6 +718,9 @@ public class UserSettings extends SettingsPreferenceFragment @Override public boolean onPreferenceClick(Preference pref) { + if (pref == mAddUser && !restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { + return false; + } if (pref == mMePreference) { Intent editProfile; if (!mProfileExists) { @@ -776,7 +780,9 @@ public class UserSettings extends SettingsPreferenceFragment int userId = ((UserPreference) v.getTag()).getUserId(); switch (v.getId()) { case UserPreference.DELETE_ID: - onRemoveUserClicked(userId); + if (restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { + onRemoveUserClicked(userId); + } break; case UserPreference.SETTINGS_ID: onManageUserClicked(userId, false); |