From 1d18d453d8574f351b4ff82f171d32b787cb8ab5 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 6 Mar 2013 11:22:02 -0800 Subject: [PATCH 01/10] Guard against missing terminal app. Bug: 8328852 Change-Id: Icbc8942729af5a525f55b8c90513ff724c6f90e0 --- .../android/settings/DevelopmentSettings.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index a1c6c903316..89dc8bac82d 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -34,6 +34,7 @@ import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.hardware.usb.IUsbManager; import android.os.AsyncTask; @@ -211,16 +212,21 @@ public class DevelopmentSettings extends PreferenceFragment addPreferencesFromResource(R.xml.development_prefs); + final PreferenceGroup debugDebuggingCategory = (PreferenceGroup) + findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); + mEnableAdb = findAndInitCheckboxPref(ENABLE_ADB); mClearAdbKeys = findPreference(CLEAR_ADB_KEYS); if (!SystemProperties.getBoolean("ro.adb.secure", false)) { - PreferenceGroup debugDebuggingCategory = (PreferenceGroup) - findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); if (debugDebuggingCategory != null) { debugDebuggingCategory.removePreference(mClearAdbKeys); } } mEnableTerminal = findAndInitCheckboxPref(ENABLE_TERMINAL); + if (!isPackageInstalled(getActivity(), TERMINAL_APP_PACKAGE)) { + debugDebuggingCategory.removePreference(mEnableTerminal); + mEnableTerminal = null; + } mBugreport = findPreference(BUGREPORT); mBugreportInPower = findAndInitCheckboxPref(BUGREPORT_IN_POWER_KEY); @@ -242,8 +248,6 @@ public class DevelopmentSettings extends PreferenceFragment mWaitForDebugger = findAndInitCheckboxPref(WAIT_FOR_DEBUGGER_KEY); mVerifyAppsOverUsb = findAndInitCheckboxPref(VERIFY_APPS_OVER_USB_KEY); if (!showVerifierSetting()) { - PreferenceGroup debugDebuggingCategory = (PreferenceGroup) - findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); if (debugDebuggingCategory != null) { debugDebuggingCategory.removePreference(mVerifyAppsOverUsb); } else { @@ -408,9 +412,11 @@ public class DevelopmentSettings extends PreferenceFragment mHaveDebugSettings = false; updateCheckBox(mEnableAdb, Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0); - updateCheckBox(mEnableTerminal, - context.getPackageManager().getApplicationEnabledSetting(TERMINAL_APP_PACKAGE) - == PackageManager.COMPONENT_ENABLED_STATE_ENABLED); + if (mEnableTerminal != null) { + updateCheckBox(mEnableTerminal, + context.getPackageManager().getApplicationEnabledSetting(TERMINAL_APP_PACKAGE) + == PackageManager.COMPONENT_ENABLED_STATE_ENABLED); + } updateCheckBox(mBugreportInPower, Settings.Secure.getInt(cr, Settings.Secure.BUGREPORT_IN_POWER_MENU, 0) != 0); updateCheckBox(mKeepScreenOn, Settings.Global.getInt(cr, @@ -1298,4 +1304,12 @@ public class DevelopmentSettings extends PreferenceFragment throw new RuntimeException("Problem talking with PackageManager", e); } } + + private static boolean isPackageInstalled(Context context, String packageName) { + try { + return context.getPackageManager().getPackageInfo(packageName, 0) != null; + } catch (NameNotFoundException e) { + return false; + } + } } From 4bba940721845d1fc886cedf748d8ce9c982b081 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 5 Jun 2013 17:51:38 -0700 Subject: [PATCH 02/10] Always allow formatting of physical storage. Also rebuild UI when volume state changes after a format finishes. Bug: 8985206 Change-Id: I6208e385711b883fb6fc77cc76cbe425d740b0a8 --- .../deviceinfo/StorageVolumePreferenceCategory.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java index 61188ec1c2c..1992facf60e 100644 --- a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java +++ b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java @@ -137,6 +137,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { public void init() { final Context context = getContext(); + removeAll(); + final UserInfo currentUser; try { currentUser = ActivityManagerNative.getDefault().getCurrentUser(); @@ -242,9 +244,6 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mItemAvailable.setTitle(R.string.memory_available_read_only); - if (mFormatPreference != null) { - removePreference(mFormatPreference); - } } else { mItemAvailable.setTitle(R.string.memory_available); } @@ -269,9 +268,6 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { removePreference(mUsageBarPreference); removePreference(mItemTotal); removePreference(mItemAvailable); - if (mFormatPreference != null) { - removePreference(mFormatPreference); - } } if (mUsbConnected && (UsbManager.USB_FUNCTION_MTP.equals(mUsbFunction) || @@ -374,6 +370,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { } public void onStorageStateChanged() { + init(); measure(); } From 9a424cc8cc7072c530019e7c49563413e34c0295 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Mon, 24 Jun 2013 17:49:38 -0700 Subject: [PATCH 03/10] Fix broken strings in Settings Change-Id: I97b3b140b96894982d5d7753b6b3fc6dde2994a8 --- res/values/strings.xml | 13 +++++++++---- src/com/android/settings/AccessibilitySettings.java | 4 ++-- src/com/android/settings/PrintingSettings.java | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 87b191167cd..e5aa0f8036e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3189,10 +3189,10 @@ Settings - - On - - Off + + On + + Off @@ -3261,6 +3261,11 @@ Add printers + + On + + Off + diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java index 5d3fb425c26..f4188f1ae6d 100644 --- a/src/com/android/settings/AccessibilitySettings.java +++ b/src/com/android/settings/AccessibilitySettings.java @@ -405,9 +405,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements final boolean serviceEnabled = accessibilityEnabled && enabledServices.contains(componentName); if (serviceEnabled) { - preference.setSummary(getString(R.string.feature_state_on)); + preference.setSummary(getString(R.string.accessibility_feature_state_on)); } else { - preference.setSummary(getString(R.string.feature_state_off)); + preference.setSummary(getString(R.string.accessibility_feature_state_off)); } preference.setOrder(i); diff --git a/src/com/android/settings/PrintingSettings.java b/src/com/android/settings/PrintingSettings.java index cd22366db0f..723bdc92858 100644 --- a/src/com/android/settings/PrintingSettings.java +++ b/src/com/android/settings/PrintingSettings.java @@ -159,9 +159,9 @@ public class PrintingSettings extends SettingsPreferenceFragment implements Dial final boolean serviceEnabled = sEnabledServiceNameSet.contains(componentName); if (serviceEnabled) { - preference.setSummary(getString(R.string.feature_state_on)); + preference.setSummary(getString(R.string.print_feature_state_on)); } else { - preference.setSummary(getString(R.string.feature_state_off)); + preference.setSummary(getString(R.string.print_feature_state_off)); } preference.setOrder(i); From 0fa0239b7d7fa8f0bcfe621c3a19f91825ba440a Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 9 Jul 2013 11:28:40 -0700 Subject: [PATCH 04/10] Fix accidental creation of restriction entry for required apps When entering Settings->Restrictions, don't automatically query restriction entries for required apps. Bug: 9681399 Change-Id: Idcc773bf4793b3e7e2b328a15881b7ecf930c6c3 --- src/com/android/settings/users/AppRestrictionsFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java index 827458ff9b6..2f99d115f78 100644 --- a/src/com/android/settings/users/AppRestrictionsFragment.java +++ b/src/com/android/settings/users/AppRestrictionsFragment.java @@ -601,7 +601,8 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen if (!hasSettings && !isSettingsApp) continue; // Get and populate the defaults, since the user is not going to be // able to toggle this app ON (it's ON by default and immutable). - if (hasSettings) { + // Only do this for restricted profiles, not single-user restrictions + if (hasSettings && mRestrictedProfile) { requestRestrictionsForApp(packageName, p); } } else if (!mNewUser && isAppEnabledForUser(pi)) { /*appInfoListHasPackage(mUserApps, packageName)*/ From c838e3a59d04b77fa55789816ffc0b94ba5354b0 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Mon, 15 Jul 2013 15:35:29 -0700 Subject: [PATCH 05/10] Potential fix for Settings instability on x-large. Bug: 9752185 Change-Id: I1b2af6661a601e1d487a35a53f5d01e58529a34d --- src/com/android/settings/users/RestrictionSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/users/RestrictionSettings.java b/src/com/android/settings/users/RestrictionSettings.java index adcfb1faa79..789cee42490 100644 --- a/src/com/android/settings/users/RestrictionSettings.java +++ b/src/com/android/settings/users/RestrictionSettings.java @@ -109,7 +109,7 @@ public class RestrictionSettings extends AppRestrictionsFragment { if (resultCode == Activity.RESULT_OK) { getListView().setEnabled(true); mChallengeSucceeded = true; - } else { + } else if (!isDetached()) { finishFragment(); } return; From 00d7a0ce0717f370d2adc4c6bed11d3ae5aa4974 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Mon, 5 Aug 2013 11:02:16 -0700 Subject: [PATCH 06/10] Add some missing fragments to the whitelist Bug: 10184429 Change-Id: I4b4da5d5f2f4ec64992012e9d15799d195870a8a --- src/com/android/settings/Settings.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 5d9349171d1..720af590373 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -325,6 +325,8 @@ public class Settings extends PreferenceActivity DreamSettings.class.getName(), UserSettings.class.getName(), NotificationAccessSettings.class.getName(), + ManageAccountsSettings.class.getName(), + PrintingSettings.class.getName() }; @Override From 90e68b95f597cd1ad4cccbbaeaeba8fe58744f87 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 6 Aug 2013 10:46:51 -0700 Subject: [PATCH 07/10] Remove Restrictions UI Bug: 10200097 Change-Id: Ifaa8aaa9aa5ad17a948bf18f184a131295112a30 --- res/xml/settings_headers.xml | 8 - src/com/android/settings/Settings.java | 6 - .../settings/users/RestrictionSettings.java | 152 ------------------ 3 files changed, 166 deletions(-) delete mode 100644 src/com/android/settings/users/RestrictionSettings.java diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml index 9a1d3b830e2..867fc191832 100644 --- a/res/xml/settings_headers.xml +++ b/res/xml/settings_headers.xml @@ -97,13 +97,6 @@ android:title="@string/applications_settings" android:id="@+id/application_settings" /> - -
-
-
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 720af590373..4221059b6a7 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -136,7 +136,6 @@ public class Settings extends PreferenceActivity R.id.location_settings, R.id.security_settings, R.id.language_settings, - R.id.restriction_settings, R.id.user_settings, R.id.account_settings, R.id.account_add, @@ -560,11 +559,6 @@ public class Settings extends PreferenceActivity if (um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) { target.remove(i); } - } else if (id == R.id.restriction_settings) { - if (um.isLinkedUser() - || um.hasUserRestriction(UserManager.DISALLOW_APP_RESTRICTIONS)) { - target.remove(i); - } } if (i < target.size() && target.get(i) == header diff --git a/src/com/android/settings/users/RestrictionSettings.java b/src/com/android/settings/users/RestrictionSettings.java deleted file mode 100644 index 91b8bd3dbca..00000000000 --- a/src/com/android/settings/users/RestrictionSettings.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2013 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.users; - -import android.app.Activity; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.os.UserHandle; -import android.os.UserManager; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import com.android.settings.R; - -import java.util.List; - -/** - * Used for restricting regular users, including single-user devices. - */ -public class RestrictionSettings extends AppRestrictionsFragment { - - private static final int REQUEST_PIN_CHALLENGE = 10; - - private static final int MENU_RESET = Menu.FIRST + 1; - private static final int MENU_CHANGE_PIN = Menu.FIRST + 2; - - private static final String KEY_CHALLENGE_SUCCEEDED = "chsc"; - private static final String KEY_CHALLENGE_REQUESTED = "chrq"; - - private boolean mChallengeSucceeded; - private boolean mChallengeRequested; - private boolean mDisableSelf; - - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - if (UserManager.get(getActivity()).hasUserRestriction( - UserManager.DISALLOW_APP_RESTRICTIONS)) { - mDisableSelf = true; - return; - } - init(icicle); - if (icicle != null) { - mChallengeSucceeded = icicle.getBoolean(KEY_CHALLENGE_SUCCEEDED, false); - mChallengeRequested = icicle.getBoolean(KEY_CHALLENGE_REQUESTED, false); - } - setHasOptionsMenu(true); - } - - public void onResume() { - super.onResume(); - if (!mDisableSelf) { - ensurePin(); - } - } - - private void ensurePin() { - if (!mChallengeSucceeded) { - getListView().setEnabled(false); - final UserManager um = UserManager.get(getActivity()); - if (!mChallengeRequested) { - if (um.hasRestrictionsPin()) { - Intent requestPin = - new Intent(Intent.ACTION_RESTRICTIONS_PIN_CHALLENGE); - startActivityForResult(requestPin, REQUEST_PIN_CHALLENGE); - } else { - Intent requestPin = - new Intent("android.intent.action.RESTRICTIONS_PIN_CREATE"); - startActivityForResult(requestPin, REQUEST_PIN_CHALLENGE); - } - mChallengeRequested = true; - } - } - mChallengeSucceeded = false; - } - - private void resetAndRemovePin() { - final UserManager um = UserManager.get(getActivity()); - um.removeRestrictions(); - clearSelectedApps(); - finishFragment(); - } - - private void changePin() { - final UserManager um = UserManager.get(getActivity()); - Intent requestPin = new Intent("android.intent.action.RESTRICTIONS_PIN_CREATE"); - startActivityForResult(requestPin, REQUEST_PIN_CHALLENGE); - } - - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_PIN_CHALLENGE) { - mChallengeRequested = false; - if (resultCode == Activity.RESULT_OK) { - getListView().setEnabled(true); - mChallengeSucceeded = true; - } else if (!isDetached()) { - finishFragment(); - } - return; - } - - super.onActivityResult(requestCode, resultCode, data); - } - - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putBoolean(KEY_CHALLENGE_REQUESTED, mChallengeRequested); - if (getActivity().isChangingConfigurations()) { - outState.putBoolean(KEY_CHALLENGE_SUCCEEDED, mChallengeSucceeded); - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (!mDisableSelf) { - menu.add(0, MENU_RESET, 0, R.string.restriction_menu_reset); - menu.add(0, MENU_CHANGE_PIN, 0, R.string.restriction_menu_change_pin); - } - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case MENU_RESET: - resetAndRemovePin(); - return true; - case MENU_CHANGE_PIN: - changePin(); - return true; - } - - return super.onOptionsItemSelected(item); - } -} From 1de42eb9725076e034c67b91a14be8a7c7d95bac Mon Sep 17 00:00:00 2001 From: Geoffrey Borggaard Date: Wed, 7 Aug 2013 14:57:43 -0400 Subject: [PATCH 08/10] Restriction pin changes. Fixed bug in WirelessSettings where it was asking users for a PIN when they weren't restricted. Did this by refactoring the preference level pin checking into the superclass, where it checks for the restricted mode first. Also pin protected changes to certificates for restricted users. Change-Id: I8310fd39f0862159668318fc1360ec6859cc00d5 --- res/xml/security_settings_misc.xml | 3 +- .../android/settings/DevelopmentSettings.java | 14 +---- .../settings/RestrictedSettingsFragment.java | 32 +++++++++++ .../android/settings/SecuritySettings.java | 20 +++---- .../settings/SettingsPreferenceFragment.java | 2 +- .../settings/TrustedCredentialsSettings.java | 53 +++++++++++++++++++ .../android/settings/WirelessSettings.java | 14 +---- 7 files changed, 98 insertions(+), 40 deletions(-) diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml index 1ead7a9ff3f..dbbeb1df4fe 100644 --- a/res/xml/security_settings_misc.xml +++ b/res/xml/security_settings_misc.xml @@ -80,7 +80,8 @@ android:persistent="false" android:fragment="com.android.settings.TrustedCredentialsSettings"/> - (); private final HashSet mDisabledPrefs = new HashSet(); - private final HashSet mProtectedByRestrictionsPrefs = new HashSet(); // To track whether a confirmation dialog was clicked. private boolean mDialogClicked; @@ -362,12 +360,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment } } - private void protectByRestrictions(Preference pref) { - if (pref != null) { - mProtectedByRestrictionsPrefs.add(pref); - } - } - private CheckBoxPreference findAndInitCheckboxPref(String key) { CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); if (pref == null) { @@ -1178,11 +1170,9 @@ public class DevelopmentSettings extends RestrictedSettingsFragment @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - if (mProtectedByRestrictionsPrefs.contains(preference) - && !restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { - return false; + if (super.onPreferenceTreeClick(preferenceScreen, preference)) { + return true; } - if (Utils.isMonkeyRunning()) { return false; } diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java index ebf2bcf345b..e25570ed5a9 100644 --- a/src/com/android/settings/RestrictedSettingsFragment.java +++ b/src/com/android/settings/RestrictedSettingsFragment.java @@ -16,11 +16,15 @@ package com.android.settings; +import java.util.HashSet; + import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.UserManager; +import android.preference.Preference; +import android.preference.PreferenceScreen; /** * Base class for settings activities that should be pin protected when in restricted mode. @@ -50,6 +54,8 @@ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { private final String mRestrictionKey; + private final HashSet mProtectedByRestictionsPrefs = new HashSet(); + /** * @param restrictionKey The restriction key to check before pin protecting * this settings page. Pass in {@link RESTRICTIONS_PIN_SET} if it should @@ -162,4 +168,30 @@ public class RestrictedSettingsFragment extends SettingsPreferenceFragment { || mUserManager.hasUserRestriction(restrictionKey); return restricted && mUserManager.hasRestrictionsPin(); } + + /** + * If the preference is one that was added by protectByRestrictions(), then it will + * prompt the user for the restrictions pin if they haven't entered it already. + * Intended to be called at the top of onPreferenceTreeClick. If this function returns + * true, then onPreferenceTreeClick should return true. + */ + boolean ensurePinRestrictedPreference(Preference preference) { + return mProtectedByRestictionsPrefs.contains(preference) + && !restrictionsPinCheck(RESTRICTIONS_PIN_SET); + } + + /** + * Call this with any preferences that should require the PIN to be entered + * before they are accessible. + */ + protected void protectByRestrictions(Preference pref) { + if (pref != null) { + mProtectedByRestictionsPrefs.add(pref); + } + } + + protected void protectByRestrictions(String key) { + Preference pref = findPreference(key); + protectByRestrictions(pref); + } } diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 7a442a9b7ea..f893c3645cd 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -45,7 +45,6 @@ import android.util.Log; import com.android.internal.widget.LockPatternUtils; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; /** @@ -75,6 +74,7 @@ public class SecuritySettings extends RestrictedSettingsFragment private static final String KEY_SHOW_PASSWORD = "show_password"; private static final String KEY_CREDENTIAL_STORAGE_TYPE = "credential_storage_type"; private static final String KEY_RESET_CREDENTIALS = "reset_credentials"; + private static final String KEY_CREDENTIALS_INSTALL = "credentials_install"; private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications"; private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications"; private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; @@ -82,8 +82,6 @@ public class SecuritySettings extends RestrictedSettingsFragment 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 mProtectedByRestictionsPrefs = new HashSet(); - private PackageManager mPM; DevicePolicyManager mDPM; @@ -245,6 +243,7 @@ public class SecuritySettings extends RestrictedSettingsFragment // Show password mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD); + mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS); // Credential storage final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); @@ -257,7 +256,6 @@ public class SecuritySettings extends RestrictedSettingsFragment : R.string.credential_storage_type_software; credentialStorageType.setSummary(storageSummaryRes); - mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS); } else { removePreference(KEY_CREDENTIALS_MANAGER); } @@ -312,16 +310,12 @@ public class SecuritySettings extends RestrictedSettingsFragment if (shouldBePinProtected(RESTRICTIONS_PIN_SET)) { protectByRestrictions(mToggleAppInstallation); protectByRestrictions(mToggleVerifyApps); + protectByRestrictions(mResetCredentials); + protectByRestrictions(root.findPreference(KEY_CREDENTIALS_INSTALL)); } 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); @@ -487,11 +481,9 @@ public class SecuritySettings extends RestrictedSettingsFragment @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - if (mProtectedByRestictionsPrefs.contains(preference) - && !restrictionsPinCheck(RESTRICTIONS_PIN_SET)) { - return false; + if (ensurePinRestrictedPreference(preference)) { + return true; } - final String key = preference.getKey(); final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 60765a99da0..0a382b57892 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -241,7 +241,7 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di mParentFragment = getFragmentManager().findFragmentById(mParentFragmentId); if (!(mParentFragment instanceof DialogCreatable)) { throw new IllegalArgumentException( - (mParentFragment != null + (mParentFragment != null ? mParentFragment.getClass().getName() : mParentFragmentId) + " must implement " diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java index cdfe7cd303a..b3716e36b8d 100644 --- a/src/com/android/settings/TrustedCredentialsSettings.java +++ b/src/com/android/settings/TrustedCredentialsSettings.java @@ -16,14 +16,18 @@ package com.android.settings; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Fragment; +import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.net.http.SslCertificate; import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; +import android.os.UserManager; import android.security.IKeyChainService; import android.security.KeyChain; import android.security.KeyChain.KeyChainConnection; @@ -52,6 +56,14 @@ public class TrustedCredentialsSettings extends Fragment { private static final String TAG = "TrustedCredentialsSettings"; + private UserManager mUserManager; + + private static final int REQUEST_PIN_CHALLENGE = 12309; + // If the restriction PIN is entered correctly. + private boolean mChallengeSucceeded; + private boolean mChallengeRequested; + + private enum Tab { SYSTEM("system", R.string.trusted_credentials_system_tab, @@ -142,6 +154,13 @@ public class TrustedCredentialsSettings extends Fragment { private TabHost mTabHost; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); + } + + @Override public View onCreateView( LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { mTabHost = (TabHost) inflater.inflate(R.layout.trusted_credentials, parent, false); @@ -355,6 +374,11 @@ public class TrustedCredentialsSettings extends Fragment { removeButton.setText(certHolder.mTab.getButtonLabel(certHolder)); removeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + if (mUserManager.hasRestrictionsPin() && !mChallengeSucceeded) { + ensurePin(); + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(certHolder.mTab.getButtonConfirmation(certHolder)); builder.setPositiveButton( @@ -379,6 +403,35 @@ public class TrustedCredentialsSettings extends Fragment { certDialog.show(); } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_PIN_CHALLENGE) { + mChallengeRequested = false; + if (resultCode == Activity.RESULT_OK) { + mChallengeSucceeded = true; + } + return; + } + + super.onActivityResult(requestCode, resultCode, data); + } + + private void ensurePin() { + if (!mChallengeSucceeded) { + final UserManager um = UserManager.get(getActivity()); + if (!mChallengeRequested) { + if (um.hasRestrictionsPin()) { + Intent requestPin = + new Intent(Intent.ACTION_RESTRICTIONS_PIN_CHALLENGE); + startActivityForResult(requestPin, REQUEST_PIN_CHALLENGE); + mChallengeRequested = true; + } + } + } + mChallengeSucceeded = false; + } + + private class AliasOperation extends AsyncTask { private final CertHolder mCertHolder; private AliasOperation(CertHolder certHolder) { diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index ecb984d3381..81c17941c80 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -16,7 +16,6 @@ package com.android.settings; -import java.util.HashSet; import android.app.Activity; import android.app.AlertDialog; @@ -75,7 +74,6 @@ public class WirelessSettings extends RestrictedSettingsFragment { private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1; private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage"; - private final HashSet mProtectedByRestictionsPrefs = new HashSet(); public WirelessSettings() { super(null); @@ -87,9 +85,8 @@ public class WirelessSettings extends RestrictedSettingsFragment { */ @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - if (mProtectedByRestictionsPrefs.contains(preference) && !hasChallengeSucceeded()) { - restrictionsPinCheck(RESTRICTIONS_PIN_SET); - return false; + if (ensurePinRestrictedPreference(preference)) { + return true; } log("onPreferenceTreeClick: preference=" + preference); if (preference == mAirplaneModePreference && Boolean.parseBoolean( @@ -155,13 +152,6 @@ public class WirelessSettings extends RestrictedSettingsFragment { } } - 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); From 72f078a31020ddf3a69a1f9cb6083ef1a2577d04 Mon Sep 17 00:00:00 2001 From: Przemyslaw Szczepaniak Date: Tue, 13 Aug 2013 13:05:48 +0100 Subject: [PATCH 09/10] Fix for TTS settings crash. Play an example is wrongly enabled before TTS engine is initialized. Bug: 10288565 Change-Id: I9204d8dda7f8de5c67aba2bb73b25589eeac5cef --- src/com/android/settings/tts/TextToSpeechSettings.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java index fa48a3f35ad..c6976612de3 100644 --- a/src/com/android/settings/tts/TextToSpeechSettings.java +++ b/src/com/android/settings/tts/TextToSpeechSettings.java @@ -140,6 +140,7 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements mPlayExample = findPreference(KEY_PLAY_EXAMPLE); mPlayExample.setOnPreferenceClickListener(this); + mPlayExample.setEnabled(false); mEnginePreferenceCategory = (PreferenceCategory) findPreference( KEY_ENGINE_PREFERENCE_SECTION); @@ -363,6 +364,9 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements private boolean isNetworkRequiredForSynthesis() { Set features = mTts.getFeatures(mCurrentDefaultLocale); + if (features == null) { + return false; + } return features.contains(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS) && !features.contains(TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS); } From d0e9f6ada3a58ce32970290152d84e57ea49d45e Mon Sep 17 00:00:00 2001 From: Maggie Benthall Date: Mon, 12 Aug 2013 18:40:45 -0400 Subject: [PATCH 10/10] Fix bug when sharing to bluetooth. Bug:10259347 Change-Id: I860a758333947c4207d7acda41e43b8bd1d671df --- src/com/android/settings/bluetooth/DevicePickerFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java index de8202b0fef..4b6a6b04206 100644 --- a/src/com/android/settings/bluetooth/DevicePickerFragment.java +++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java @@ -34,7 +34,7 @@ import com.android.settings.R; */ public final class DevicePickerFragment extends DeviceListPreferenceFragment { - DevicePickerFragment() { + public DevicePickerFragment() { super(null /* Not tied to any user restrictions. */); }