Merge "Update data usage UX"
diff --git a/res/drawable/ic_signal_workmode_enable.xml b/res/drawable/ic_signal_workmode_enable.xml
new file mode 100644
index 0000000..49af897
--- /dev/null
+++ b/res/drawable/ic_signal_workmode_enable.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="root"
+ android:height="42dp"
+ android:width="42dp"
+ android:viewportHeight="42"
+ android:viewportWidth="42" >
+ <group
+ android:name="ic_signal_briefcase"
+ android:translateX="21.9995"
+ android:translateY="25.73401" >
+ <group
+ android:name="ic_signal_briefcase_pivot"
+ android:translateX="-23.21545"
+ android:translateY="-18.86649" >
+ <clip-path
+ android:name="mask"
+ android:pathData="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" />
+ <group
+ android:name="cross" >
+ <path
+ android:name="cross_1"
+ android:pathData="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
+ android:strokeColor="#FFFFFFFF"
+ android:strokeAlpha="1"
+ android:strokeWidth="3.5"
+ android:fillColor="#00000000" />
+ </group>
+ <group
+ android:name="briefcase"
+ android:translateX="23.481"
+ android:translateY="18.71151" >
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="1"
+ android:pathData="M-4.83333,-14.3333 L-7.16667,-11.8333 L-7.16667,-9.5 L-4.83333,-9.5 L-4.83333,-11.8333 L4.83333,-11.8333 L4.83333,-9.5 L7.16667,-9.5 L7.16667,-11.8333 L4.83333,-14.3333 Z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="1"
+ android:pathData="M13.1667,-9.5 L-13.1667,-9.5 C-14.5,-9.5,-15.5,-8.5,-15.5,-7.16666 L-15.5,0.00000286102 C-15.5,1.33334,-14.5,2.33334,-13.1667,2.33334 L-3.66667,2.33334 L-3.66667,0.00000286102 L3.5,0.00000286102 L3.5,2.33334 L13,2.33334 C14.3333,2.33334,15.3333,1.33334,15.3333,0 L15.3333,-7.16666 C15.5,-8.5,14.3333,-9.5,13.1667,-9.5 Z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="1"
+ android:pathData="M-3.5,7.16667 L-3.5,4.83334 L-14.3333,4.83334 L-14.3333,10.8333 C-14.3333,12.1667,-13.3333,13.1667,-12,13.1667 L11.8333,13.1667 C13.1667,13.1667,14.1667,12.1667,14.1667,10.8333 L14.1667,4.83334 L3.5,4.83334 L3.5,7.16667 L-3.5,7.16667 Z" />
+ </group>
+ </group>
+ </group>
+</vector>
diff --git a/res/layout/redaction_interstitial.xml b/res/layout/redaction_interstitial.xml
index 14e57f8..73a9e5c 100644
--- a/res/layout/redaction_interstitial.xml
+++ b/res/layout/redaction_interstitial.xml
@@ -24,7 +24,7 @@
android:paddingEnd="?attr/side_margin">
<TextView
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/redaction_vertical_margins"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
diff --git a/res/layout/setup_redaction_interstitial.xml b/res/layout/setup_redaction_interstitial.xml
index f5954a1..6eef9ce 100644
--- a/res/layout/setup_redaction_interstitial.xml
+++ b/res/layout/setup_redaction_interstitial.xml
@@ -36,7 +36,7 @@
<TextView
style="@style/SuwDescription"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
diff --git a/res/values/config.xml b/res/values/config.xml
index f96662c..3f25fc6 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -35,4 +35,7 @@
<!-- Carrier_enabled editable -->
<bool name="config_allow_edit_carrier_enabled" translatable="false">false</bool>
+ <!-- When true enable color temperature setting. -->
+ <bool name="config_enableColorTemperature">false</bool>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f0f75e4..dea1620 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4621,6 +4621,10 @@
<string name="add_account_label">Add account</string>
<!-- Label for the state of the work profile [CHAR LIMIT=80] -->
<string name="managed_profile_not_available_label">Work profile isn\u2019t available yet</string>
+ <!-- Account Settings. The preference title for enabling work mode -->
+ <string name="work_mode_label">Work mode</string>
+ <!-- Account Settings. The preference summary for enabling work mode -->
+ <string name="work_mode_summary">Allow work profile to function, including apps, background sync, and related features</string>
<!-- Button label to remove the work profile [CHAR LIMIT=35] -->
<string name="remove_managed_profile_label">Remove work profile</string>
<!-- Data synchronization settings screen, title of setting that controls whether background data should be used [CHAR LIMIT=30] -->
@@ -6798,6 +6802,12 @@
<!-- Summary of condition that background data is off [CHAR LIMIT=NONE] -->
<string name="condition_bg_data_summary">Background data is only available via Wi-Fi. This may affect some apps or services when Wi-Fi is not available.</string>
+ <!-- Title of condition that work mode is off [CHAR LIMIT=30] -->
+ <string name="condition_work_title">Work profile is off</string>
+
+ <!-- Summary of condition that work mode is off [CHAR LIMIT=NONE] -->
+ <string name="condition_work_summary">Apps, background sync, and other features related to your work profile are turned off.</string>
+
<!-- Title for the suggestions section on the dashboard [CHAR LIMIT=30] -->
<string name="suggestions_title">Suggestions (<xliff:g name="count" example="3">%1$d</xliff:g>)</string>
diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml
index d359d84..0aec43f 100644
--- a/res/xml/date_time_prefs.xml
+++ b/res/xml/date_time_prefs.xml
@@ -19,7 +19,7 @@
android:title="@string/date_and_time"
settings:keywords="@string/keywords_date_and_time">
- <SwitchPreference android:key="auto_time"
+ <com.android.settingslib.RestrictedSwitchPreference android:key="auto_time"
android:title="@string/date_time_auto"
android:summaryOn="@string/date_time_auto_summaryOn"
android:summaryOff="@string/date_time_auto_summaryOff"
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index ea4750e..6335c4e 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -86,6 +86,12 @@
android:dialogTitle="@string/select_webview_provider_dialog_title"
android:summary="%s" />
+ <SwitchPreference
+ android:key="color_temperature"
+ android:title="@string/color_temperature"
+ android:summary="@string/color_temperature_desc"
+ android:persistent="false" />
+
<PreferenceCategory android:key="debug_debugging_category"
android:title="@string/debug_debugging_category">
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index e0828e5..a437547 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -64,10 +64,8 @@
android:title="@string/credentials_title"
android:persistent="false">
- <Preference android:key="credential_storage_type"
+ <com.android.settingslib.RestrictedPreference android:key="credential_storage_type"
android:title="@string/credential_storage_type"
- android:enabled="false"
- android:shouldDisableView="false"
android:persistent="false" />
<Preference android:key="trusted_credentials"
@@ -82,7 +80,7 @@
android:persistent="false"
android:fragment="com.android.settings.UserCredentialsSettings"/>
- <Preference android:key="credentials_install"
+ <com.android.settingslib.RestrictedPreference android:key="credentials_install"
android:title="@string/credentials_install"
android:summary="@string/credentials_install_summary"
android:persistent="false">
@@ -91,9 +89,9 @@
android:targetPackage="com.android.certinstaller"
android:targetClass="com.android.certinstaller.CertInstallerMain"/>
- </Preference>
+ </com.android.settingslib.RestrictedPreference>
- <Preference android:key="credentials_reset"
+ <com.android.settingslib.RestrictedPreference android:key="credentials_reset"
android:title="@string/credentials_reset"
android:summary="@string/credentials_reset_summary"
android:persistent="false">
@@ -102,7 +100,7 @@
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.CredentialStorage"/>
- </Preference>
+ </com.android.settingslib.RestrictedPreference>
</PreferenceCategory>
diff --git a/res/xml/security_settings_picker.xml b/res/xml/security_settings_picker.xml
index e0c5185..3a45697 100644
--- a/res/xml/security_settings_picker.xml
+++ b/res/xml/security_settings_picker.xml
@@ -18,27 +18,27 @@
android:title="@string/lock_settings_picker_title"
android:key="lock_settings_picker">
- <PreferenceScreen
+ <com.android.settingslib.RestrictedPreference
android:key="unlock_set_off"
android:title="@string/unlock_set_unlock_off_title"
android:persistent="false"/>
- <PreferenceScreen
+ <com.android.settingslib.RestrictedPreference
android:key="unlock_set_none"
android:title="@string/unlock_set_unlock_none_title"
android:persistent="false"/>
- <PreferenceScreen
+ <com.android.settingslib.RestrictedPreference
android:key="unlock_set_pattern"
android:title="@string/unlock_set_unlock_pattern_title"
android:persistent="false"/>
- <PreferenceScreen
+ <com.android.settingslib.RestrictedPreference
android:key="unlock_set_pin"
android:title="@string/unlock_set_unlock_pin_title"
android:persistent="false"/>
- <PreferenceScreen
+ <com.android.settingslib.RestrictedPreference
android:key="unlock_set_password"
android:title="@string/unlock_set_unlock_password_title"
android:persistent="false"/>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index bd46456..3d35bc8 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -45,6 +45,10 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.widget.LockPatternUtils;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
public class ChooseLockGeneric extends SettingsActivity {
public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
@@ -367,39 +371,60 @@
boolean hideDisabled) {
final PreferenceScreen entries = getPreferenceScreen();
+ int adminEnforcedQuality = mDPM.getPasswordQuality(null);
+ EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
+ getActivity());
for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
Preference pref = entries.getPreference(i);
- if (pref instanceof PreferenceScreen) {
+ if (pref instanceof RestrictedPreference) {
final String key = pref.getKey();
boolean enabled = true;
boolean visible = true;
+ boolean disabledByAdmin = false;
if (KEY_UNLOCK_SET_OFF.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
if (getResources().getBoolean(R.bool.config_hide_none_security_option)) {
enabled = false;
visible = false;
}
+ disabledByAdmin = adminEnforcedQuality
+ > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
} else if (KEY_UNLOCK_SET_NONE.equals(key)) {
if (mUserId != UserHandle.myUserId()) {
// Swipe doesn't make sense for profiles.
visible = false;
}
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ disabledByAdmin = adminEnforcedQuality
+ > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
} else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ disabledByAdmin = adminEnforcedQuality
+ > DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
} else if (KEY_UNLOCK_SET_PIN.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
+ disabledByAdmin = adminEnforcedQuality
+ > DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
} else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+ disabledByAdmin = adminEnforcedQuality
+ > DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
}
if (hideDisabled) {
visible = enabled;
}
if (!visible) {
entries.removePreference(pref);
+ } else if (disabledByAdmin && enforcedAdmin != null) {
+ ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
} else if (!enabled) {
+ // we need to setDisabledByAdmin to null first to disable the padlock
+ // in case it was set earlier.
+ ((RestrictedPreference) pref).setDisabledByAdmin(null);
pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
pref.setEnabled(false);
+ } else {
+ ((RestrictedPreference) pref).setDisabledByAdmin(null);
}
}
}
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index d92d610..6602c3e 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -39,11 +39,15 @@
import com.android.internal.logging.MetricsLogger;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.datetime.ZoneGetter;
import java.util.Calendar;
import java.util.Date;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
public class DateTimeSettings extends SettingsPreferenceFragment
implements OnSharedPreferenceChangeListener,
TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
@@ -64,7 +68,7 @@
// have we been launched from the setup wizard?
protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
- private SwitchPreference mAutoTimePref;
+ private RestrictedSwitchPreference mAutoTimePref;
private Preference mTimePref;
private Preference mTime24Pref;
private SwitchPreference mAutoTimeZonePref;
@@ -89,23 +93,17 @@
boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
- mAutoTimePref = (SwitchPreference) findPreference(KEY_AUTO_TIME);
-
- DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context
- .DEVICE_POLICY_SERVICE);
- if (dpm.getAutoTimeRequired()) {
- mAutoTimePref.setEnabled(false);
-
- // If Settings.Global.AUTO_TIME is false it will be set to true
- // by the device policy manager very soon.
- // Note that this app listens to that change.
- }
+ mAutoTimePref = (RestrictedSwitchPreference) findPreference(KEY_AUTO_TIME);
+ EnforcedAdmin admin = RestrictedLockUtils.checkIfAutoTimeRequired(getActivity());
+ mAutoTimePref.setDisabledByAdmin(admin);
Intent intent = getActivity().getIntent();
boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
mDummyDate = Calendar.getInstance();
+ // If device admin requires auto time device policy manager will set
+ // Settings.Global.AUTO_TIME to true. Note that this app listens to that change.
mAutoTimePref.setChecked(autoTimeEnabled);
mAutoTimeZonePref = (SwitchPreference) findPreference(KEY_AUTO_TIME_ZONE);
// Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 34bf00e..a1d9750 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -124,6 +124,7 @@
private static final String BUGREPORT_IN_POWER_KEY = "bugreport_in_power";
private static final String OPENGL_TRACES_PROPERTY = "debug.egl.trace";
private static final String TUNER_UI_KEY = "tuner_ui";
+ private static final String COLOR_TEMPERATURE_PROPERTY = "persist.sys.debug.color_temp";
private static final String DEBUG_APP_KEY = "debug_app";
private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger";
@@ -177,6 +178,7 @@
private static final String KEY_COLOR_MODE = "color_mode";
private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
private static final String ENABLE_FREEFORM_SUPPORT_KEY = "enable_freeform_support";
+ private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
private static final String INACTIVE_APPS_KEY = "inactive_apps";
@@ -285,6 +287,8 @@
private SwitchPreference mEnableFreeformSupport;
+ private SwitchPreference mColorTemperaturePreference;
+
private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>();
private final ArrayList<SwitchPreference> mResetSwitchPrefs
@@ -480,6 +484,15 @@
mColorModePreference = null;
}
updateWebViewProviderOptions();
+
+ mColorTemperaturePreference = (SwitchPreference) findPreference(COLOR_TEMPERATURE_KEY);
+ if (getResources().getBoolean(R.bool.config_enableColorTemperature)) {
+ mAllPrefs.add(mColorTemperaturePreference);
+ mResetSwitchPrefs.add(mColorTemperaturePreference);
+ } else {
+ removePreference(COLOR_TEMPERATURE_KEY);
+ mColorTemperaturePreference = null;
+ }
}
private ListPreference addListPreference(String prefKey) {
@@ -690,6 +703,9 @@
updateForceResizableOptions();
updateEnableFreeformWindowsSupportOptions();
updateWebViewProviderOptions();
+ if (mColorTemperaturePreference != null) {
+ updateColorTemperature();
+ }
}
private void resetDangerousOptions() {
@@ -1257,6 +1273,17 @@
}
}
+ private void updateColorTemperature() {
+ updateSwitchPreference(mColorTemperaturePreference,
+ SystemProperties.getBoolean(COLOR_TEMPERATURE_PROPERTY, false));
+ }
+
+ private void writeColorTemperature() {
+ SystemProperties.set(COLOR_TEMPERATURE_PROPERTY,
+ mColorTemperaturePreference.isChecked() ? "1" : "0");
+ pokeSystemProperties();
+ }
+
private void updateUSBAudioOptions() {
updateSwitchPreference(mUSBAudio, Settings.Secure.getInt(getContentResolver(),
Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED, 0) != 0);
@@ -1762,12 +1789,12 @@
} else if (preference == mBtHciSnoopLog) {
writeBtHciSnoopLogOptions();
} else if (preference == mEnableOemUnlock) {
- if (!showKeyguardConfirmation(getResources(), REQUEST_CODE_ENABLE_OEM_UNLOCK)) {
- if (mEnableOemUnlock.isChecked()) {
+ if (mEnableOemUnlock.isChecked()) {
+ if (!showKeyguardConfirmation(getResources(), REQUEST_CODE_ENABLE_OEM_UNLOCK)) {
confirmEnableOemUnlock();
- } else {
- Utils.setOemUnlockEnabled(getActivity(), false);
}
+ } else {
+ Utils.setOemUnlockEnabled(getActivity(), false);
}
} else if (preference == mMockLocationAppPref) {
Intent intent = new Intent(getActivity(), AppPicker.class);
@@ -1830,6 +1857,8 @@
writeLegacyDhcpClientOptions();
} else if (preference == mMobileDataAlwaysOn) {
writeMobileDataAlwaysOnOptions();
+ } else if (preference == mColorTemperaturePreference) {
+ writeColorTemperature();
} else if (preference == mUSBAudio) {
writeUSBAudioOptions();
} else if (preference == mForceResizable) {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 1221624..d39203d 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -61,6 +61,7 @@
import com.android.settings.search.Index;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
+import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.RestrictedSwitchPreference;
import java.util.ArrayList;
@@ -130,7 +131,7 @@
private SwitchPreference mShowPassword;
private KeyStore mKeyStore;
- private Preference mResetCredentials;
+ private RestrictedPreference mResetCredentials;
private RestrictedSwitchPreference mToggleAppInstallation;
private DialogInterface mWarnInstallApps;
@@ -310,25 +311,26 @@
// Show password
mShowPassword = (SwitchPreference) root.findPreference(KEY_SHOW_PASSWORD);
- mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);
+ mResetCredentials = (RestrictedPreference) root.findPreference(KEY_RESET_CREDENTIALS);
// Credential storage
final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
mKeyStore = KeyStore.getInstance(); // needs to be initialized for onResume()
- if (!um.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
- Preference credentialStorageType = root.findPreference(KEY_CREDENTIAL_STORAGE_TYPE);
- final int storageSummaryRes =
+ RestrictedPreference credentialStorageType = (RestrictedPreference) root.findPreference(
+ KEY_CREDENTIAL_STORAGE_TYPE);
+ credentialStorageType.checkRestrictionAndSetDisabled(
+ UserManager.DISALLOW_CONFIG_CREDENTIALS);
+ RestrictedPreference installCredentials = (RestrictedPreference) root.findPreference(
+ KEY_CREDENTIALS_INSTALL);
+ installCredentials.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_CREDENTIALS);
+ mResetCredentials.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_CREDENTIALS);
+
+ final int storageSummaryRes =
mKeyStore.isHardwareBacked() ? R.string.credential_storage_type_hardware
: R.string.credential_storage_type_software;
- credentialStorageType.setSummary(storageSummaryRes);
- } else {
- PreferenceGroup credentialsManager = (PreferenceGroup)
- root.findPreference(KEY_CREDENTIALS_MANAGER);
- credentialsManager.removePreference(root.findPreference(KEY_RESET_CREDENTIALS));
- credentialsManager.removePreference(root.findPreference(KEY_CREDENTIALS_INSTALL));
- credentialsManager.removePreference(root.findPreference(KEY_CREDENTIAL_STORAGE_TYPE));
- }
+ credentialStorageType.setSummary(storageSummaryRes);
+
// Application install
PreferenceGroup deviceAdminCategory = (PreferenceGroup)
@@ -649,7 +651,7 @@
Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
}
- if (mResetCredentials != null) {
+ if (mResetCredentials != null && !mResetCredentials.isDisabledByAdmin()) {
mResetCredentials.setEnabled(!mKeyStore.isEmpty());
}
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 7aa5a76..f56ebe0 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -52,6 +52,8 @@
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.accessibility.AccessibilityUtils;
import java.util.ArrayList;
@@ -61,6 +63,8 @@
import java.util.Map;
import java.util.Set;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
/**
* Activity with the accessibility settings.
*/
@@ -476,8 +480,7 @@
for (int i = 0, count = installedServices.size(); i < count; ++i) {
AccessibilityServiceInfo info = installedServices.get(i);
- PreferenceScreen preference = getPreferenceManager().createPreferenceScreen(
- getActivity());
+ RestrictedPreference preference = new RestrictedPreference(getActivity());
String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();
ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
@@ -500,7 +503,17 @@
String packageName = serviceInfo.packageName;
boolean serviceAllowed =
permittedServices == null || permittedServices.contains(packageName);
- preference.setEnabled(serviceAllowed || serviceEnabled);
+ if (!serviceAllowed && !serviceEnabled) {
+ EnforcedAdmin admin =
+ RestrictedLockUtils.getProfileOrDeviceOwnerOnCallingUser(getActivity());
+ if (admin != null) {
+ preference.setDisabledByAdmin(admin);
+ } else {
+ preference.setEnabled(false);
+ }
+ } else {
+ preference.setEnabled(true);
+ }
String summaryString;
if (serviceAllowed) {
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 3942fbb..4296689 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -39,8 +39,10 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.SearchIndexableResource;
+import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
@@ -80,7 +82,7 @@
*/
public class AccountSettings extends SettingsPreferenceFragment
implements AuthenticatorHelper.OnAccountsUpdateListener,
- OnPreferenceClickListener, Indexable {
+ OnPreferenceClickListener, OnPreferenceChangeListener, Indexable {
public static final String TAG = "AccountSettings";
private static final String KEY_ACCOUNT = "account";
@@ -88,8 +90,9 @@
private static final String ADD_ACCOUNT_ACTION = "android.settings.ADD_ACCOUNT_SETTINGS";
private static final String TAG_CONFIRM_AUTO_SYNC_CHANGE = "confirmAutoSyncChange";
- private static final int ORDER_LAST = 1001;
- private static final int ORDER_NEXT_TO_LAST = 1000;
+ private static final int ORDER_LAST = 1002;
+ private static final int ORDER_NEXT_TO_LAST = 1001;
+ private static final int ORDER_NEXT_TO_NEXT_TO_LAST = 1000;
private UserManager mUm;
private SparseArray<ProfileData> mProfiles = new SparseArray<ProfileData>();
@@ -112,6 +115,10 @@
*/
public Preference addAccountPreference;
/**
+ * The preference that displays the button to toggle work profile.
+ */
+ public SwitchPreference workModeSwitch;
+ /**
* The preference that displays the button to remove the managed profile
*/
public Preference removeWorkProfilePreference;
@@ -234,6 +241,21 @@
return false;
}
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ // Check the preference
+ final int count = mProfiles.size();
+ for (int i = 0; i < count; i++) {
+ ProfileData profileData = mProfiles.valueAt(i);
+ if (preference == profileData.workModeSwitch) {
+ final int userId = profileData.userInfo.id;
+ mUm.setQuietModeEnabled(userId, !((boolean) newValue));
+ return true;
+ }
+ }
+ return false;
+ }
+
void updateUi() {
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.account_settings);
@@ -286,6 +308,9 @@
profileData.preferenceGroup.setSummary(workGroupSummary);
((AccessiblePreferenceCategory) profileData.preferenceGroup).setContentDescription(
getString(R.string.accessibility_category_work, workGroupSummary));
+ profileData.workModeSwitch = newWorkModeSwitchPreference(context);
+ final UserHandle userHandle = profileData.userInfo.getUserHandle();
+ profileData.workModeSwitch.setChecked(!mUm.isQuietModeEnabled(userHandle));
profileData.removeWorkProfilePreference = newRemoveWorkProfilePreference(context);
} else {
profileData.preferenceGroup.setTitle(R.string.category_personal);
@@ -313,6 +338,15 @@
preference.setTitle(R.string.add_account_label);
preference.setIcon(R.drawable.ic_menu_add);
preference.setOnPreferenceClickListener(this);
+ preference.setOrder(ORDER_NEXT_TO_NEXT_TO_LAST);
+ return preference;
+ }
+
+ private SwitchPreference newWorkModeSwitchPreference(Context context) {
+ SwitchPreference preference = new SwitchPreference(getPrefContext());
+ preference.setTitle(R.string.work_mode_label);
+ preference.setSummary(R.string.work_mode_summary);
+ preference.setOnPreferenceChangeListener(this);
preference.setOrder(ORDER_NEXT_TO_LAST);
return preference;
}
@@ -385,6 +419,9 @@
R.string.managed_profile_not_available_label);
profileData.preferenceGroup.addPreference(mProfileNotAvailablePreference);
}
+ if (profileData.workModeSwitch != null) {
+ profileData.preferenceGroup.addPreference(profileData.workModeSwitch);
+ }
if (profileData.removeWorkProfilePreference != null) {
profileData.preferenceGroup.addPreference(profileData.removeWorkProfilePreference);
}
@@ -533,9 +570,9 @@
@Override
public void onReceive(Context context, Intent intent) {
+ Log.v(TAG, "Received broadcast: " + intent.getAction());
if (intent.getAction().equals(Intent.ACTION_MANAGED_PROFILE_REMOVED)
|| intent.getAction().equals(Intent.ACTION_MANAGED_PROFILE_ADDED)) {
- Log.v(TAG, "Received broadcast: " + intent.getAction());
// Clean old state
stopListeningToAccountUpdates();
cleanUpPreferences();
@@ -547,6 +584,17 @@
getActivity().invalidateOptionsMenu();
return;
}
+
+ if (intent.getAction().equals(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED)) {
+ // We assume there's only one managed profile, otherwise this needs to change.
+ ProfileData profileData = mProfiles.valueAt(1);
+ if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
+ UserHandle.USER_NULL) == profileData.userInfo.id) {
+ profileData.workModeSwitch.setChecked(
+ !mUm.isQuietModeEnabled(profileData.userInfo.getUserHandle()));
+ }
+ return;
+ }
Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction());
}
@@ -555,6 +603,7 @@
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
+ intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
context.registerReceiver(this, intentFilter);
listeningToManagedProfileEvents = true;
}
diff --git a/src/com/android/settings/accounts/ChooseAccountActivity.java b/src/com/android/settings/accounts/ChooseAccountActivity.java
index f2f1f86..489a165 100644
--- a/src/com/android/settings/accounts/ChooseAccountActivity.java
+++ b/src/com/android/settings/accounts/ChooseAccountActivity.java
@@ -169,6 +169,7 @@
Drawable drawable = getDrawableForType(pref.type);
ProviderPreference p = new ProviderPreference(getPreferenceScreen().getContext(),
pref.type, drawable, pref.name);
+ p.checkAccountManagementAndSetDisabled();
mAddAccountGroup.addPreference(p);
}
} else {
diff --git a/src/com/android/settings/accounts/ProviderPreference.java b/src/com/android/settings/accounts/ProviderPreference.java
index 9a63062..863fef4 100644
--- a/src/com/android/settings/accounts/ProviderPreference.java
+++ b/src/com/android/settings/accounts/ProviderPreference.java
@@ -20,11 +20,16 @@
import android.graphics.drawable.Drawable;
import android.support.v7.preference.Preference;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
/**
* ProviderPreference is used to display an image to the left of a provider name.
* The preference ultimately calls AccountManager.addAccount() for the account type.
*/
-public class ProviderPreference extends Preference {
+public class ProviderPreference extends RestrictedPreference {
private String mAccountType;
public ProviderPreference(
@@ -39,4 +44,10 @@
public String getAccountType() {
return mAccountType;
}
+
+ public void checkAccountManagementAndSetDisabled() {
+ EnforcedAdmin admin = RestrictedLockUtils.checkIfAccountManagementDisabled(
+ getContext(), getAccountType());
+ setDisabledByAdmin(admin);
+ }
}
diff --git a/src/com/android/settings/dashboard/conditional/ConditionManager.java b/src/com/android/settings/dashboard/conditional/ConditionManager.java
index a245222..cd044ac 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionManager.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionManager.java
@@ -132,6 +132,7 @@
addIfMissing(BatterySaverCondition.class);
addIfMissing(CellularDataCondition.class);
addIfMissing(BackgroundDataCondition.class);
+ addIfMissing(WorkModeCondition.class);
}
private void addIfMissing(Class<? extends Condition> clz) {
@@ -154,6 +155,8 @@
return new CellularDataCondition(this);
} else if (BackgroundDataCondition.class == clz) {
return new BackgroundDataCondition(this);
+ } else if (WorkModeCondition.class == clz) {
+ return new WorkModeCondition(this);
}
throw new RuntimeException("Unexpected Condition " + clz);
}
diff --git a/src/com/android/settings/dashboard/conditional/WorkModeCondition.java b/src/com/android/settings/dashboard/conditional/WorkModeCondition.java
new file mode 100644
index 0000000..be333ea
--- /dev/null
+++ b/src/com/android/settings/dashboard/conditional/WorkModeCondition.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.dashboard.conditional;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.graphics.drawable.Icon;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.settings.R;
+import com.android.settings.Settings;
+
+import java.util.List;
+
+public class WorkModeCondition extends Condition {
+
+ private UserManager mUm;
+ private UserHandle mUserHandle;
+
+ public WorkModeCondition(ConditionManager conditionManager) {
+ super(conditionManager);
+ mUm = (UserManager) mManager.getContext().getSystemService(Context.USER_SERVICE);
+ }
+
+ private void updateUserHandle() {
+ List<UserInfo> profiles = mUm.getProfiles(UserHandle.myUserId());
+ final int profilesCount = profiles.size();
+ mUserHandle = null;
+ for (int i = 0; i < profilesCount; i++) {
+ UserInfo userInfo = profiles.get(i);
+ if (userInfo.isManagedProfile()) {
+ // We assume there's only one managed profile, otherwise UI needs to change.
+ mUserHandle = userInfo.getUserHandle();
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void refreshState() {
+ updateUserHandle();
+ setActive(mUserHandle != null && mUm.isQuietModeEnabled(mUserHandle));
+ }
+
+ @Override
+ public Icon getIcon() {
+ return Icon.createWithResource(mManager.getContext(),
+ R.drawable.ic_signal_workmode_enable);
+ }
+
+ @Override
+ public CharSequence getTitle() {
+ return mManager.getContext().getString(R.string.condition_work_title);
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ return mManager.getContext().getString(R.string.condition_work_summary);
+ }
+
+ @Override
+ public CharSequence[] getActions() {
+ return new CharSequence[] {
+ mManager.getContext().getString(R.string.condition_turn_on)
+ };
+ }
+
+ @Override
+ public void onPrimaryClick() {
+ mManager.getContext().startActivity(new Intent(mManager.getContext(),
+ Settings.AccountSettingsActivity.class));
+ }
+
+ @Override
+ public void onActionClick(int index) {
+ if (index == 0) {
+ mUm.setQuietModeEnabled(mUserHandle.getIdentifier(), false);
+ setActive(false);
+ } else {
+ throw new IllegalArgumentException("Unexpected index " + index);
+ }
+ }
+}
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index 0d812e5..8c87080 100755
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -34,11 +34,15 @@
import com.android.internal.inputmethod.InputMethodUtils;
import com.android.settings.R;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedSwitchPreference;
import java.text.Collator;
import java.util.ArrayList;
import java.util.List;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
/**
* Input method preference.
*
@@ -46,7 +50,7 @@
* is used to enable or disable the IME. 2) An instance without a switch is used to invoke the
* setting activity of the IME.
*/
-class InputMethodPreference extends SwitchPreference implements OnPreferenceClickListener,
+class InputMethodPreference extends RestrictedSwitchPreference implements OnPreferenceClickListener,
OnPreferenceChangeListener {
private static final String TAG = InputMethodPreference.class.getSimpleName();
private static final String EMPTY_TEXT = "";
@@ -80,7 +84,7 @@
* @param isImeEnabler true if this preference is the IME enabler that has enable/disable
* switches for all available IMEs, not the list of enabled IMEs.
* @param isAllowedByOrganization false if the IME has been disabled by a device or profile
- owner.
+ * owner.
* @param onSaveListener The listener called when this preference has been changed and needs
* to save the state to shared preference.
*/
@@ -115,6 +119,11 @@
&& mInputMethodSettingValues.isValidSystemNonAuxAsciiCapableIme(imi, context);
setOnPreferenceClickListener(this);
setOnPreferenceChangeListener(this);
+ if (!isAllowedByOrganization) {
+ EnforcedAdmin admin =
+ RestrictedLockUtils.getProfileOrDeviceOwnerOnCallingUser(context);
+ setDisabledByAdmin(admin);
+ }
}
public InputMethodInfo getInputMethodInfo() {
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 9974e89..047fcbb 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -46,6 +46,7 @@
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.location.RecentLocationApps;
import java.util.ArrayList;
@@ -53,6 +54,8 @@
import java.util.Comparator;
import java.util.List;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
/**
* System location settings (Settings > Location). The screen has three parts:
* <ul>
@@ -373,9 +376,15 @@
// corner cases, the location might still be enabled. In such case the master switch should
// be disabled but checked.
final boolean enabled = (mode != android.provider.Settings.Secure.LOCATION_MODE_OFF);
+ EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(getActivity(),
+ UserManager.DISALLOW_SHARE_LOCATION, UserHandle.myUserId());
// Disable the whole switch bar instead of the switch itself. If we disabled the switch
// only, it would be re-enabled again if the switch bar is not disabled.
- mSwitchBar.setEnabled(!restricted);
+ if (admin != null) {
+ mSwitchBar.setDisabledByAdmin(admin);
+ } else {
+ mSwitchBar.setEnabled(!restricted);
+ }
mLocationMode.setEnabled(enabled && !restricted);
mCategoryRecentLocationRequests.setEnabled(enabled);
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index d5f469c..b096cc4 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -35,6 +35,9 @@
import android.widget.TextView;
import com.android.settings.R;
+import com.android.settingslib.RestrictedLockUtils;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import java.util.ArrayList;
@@ -58,6 +61,9 @@
private String mLabel;
private String mSummary;
+ private boolean mDisabledByAdmin = false;
+ private EnforcedAdmin mEnforcedAdmin = null;
+
private ArrayList<OnSwitchChangeListener> mSwitchChangeListeners =
new ArrayList<OnSwitchChangeListener>();
@@ -153,11 +159,35 @@
}
public void setEnabled(boolean enabled) {
+ if (enabled && mDisabledByAdmin) {
+ setDisabledByAdmin(null);
+ return;
+ }
super.setEnabled(enabled);
mTextView.setEnabled(enabled);
mSwitch.setEnabled(enabled);
}
+ /**
+ * If admin is not null, disables the text and switch but keeps the view clickable.
+ * Otherwise, calls setEnabled which will enables the entire view including
+ * the text and switch.
+ */
+ public void setDisabledByAdmin(EnforcedAdmin admin) {
+ mEnforcedAdmin = admin;
+ if (admin != null) {
+ super.setEnabled(true);
+ mDisabledByAdmin = true;
+ RestrictedLockUtils.setTextViewPadlock(mContext, mTextView, true);
+ mTextView.setEnabled(false);
+ mSwitch.setEnabled(false);
+ } else {
+ mDisabledByAdmin = false;
+ RestrictedLockUtils.setTextViewPadlock(mContext, mTextView, false);
+ setEnabled(true);
+ }
+ }
+
public final ToggleSwitch getSwitch() {
return mSwitch;
}
@@ -182,8 +212,12 @@
@Override
public void onClick(View v) {
- final boolean isChecked = !mSwitch.isChecked();
- setChecked(isChecked);
+ if (mDisabledByAdmin) {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, mEnforcedAdmin);
+ } else {
+ final boolean isChecked = !mSwitch.isChecked();
+ setChecked(isChecked);
+ }
}
public void propagateChecked(boolean isChecked) {
diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java
index b15a6e4..af723c3 100644
--- a/src/com/android/settings/wifi/WifiDialogActivity.java
+++ b/src/com/android/settings/wifi/WifiDialogActivity.java
@@ -61,6 +61,12 @@
}
@Override
+ public void finish() {
+ super.finish();
+ overridePendingTransition(0, 0);
+ }
+
+ @Override
public void onForget(WifiDialog dialog) {
final WifiManager wifiManager = getSystemService(WifiManager.class);
final AccessPoint accessPoint = dialog.getController().getAccessPoint();