diff options
author | Steve Kondik <shade@chemlab.org> | 2012-01-14 17:05:59 -0800 |
---|---|---|
committer | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2012-11-20 00:45:52 +0000 |
commit | 4e5f8cefea6a2b65cc4db45853a0502de165cb63 (patch) | |
tree | 7fab98e2423544f8cf66d768f280f3e6080f2877 /src/com/android/settings | |
parent | 79bf08d246aa24b5d5330630c66b71b9f2f57228 (diff) | |
download | packages_apps_settings-4e5f8cefea6a2b65cc4db45853a0502de165cb63.zip packages_apps_settings-4e5f8cefea6a2b65cc4db45853a0502de165cb63.tar.gz packages_apps_settings-4e5f8cefea6a2b65cc4db45853a0502de165cb63.tar.bz2 |
Add preference for enabling root access (3/3)
* Root over ADB is now disabled by default on non-eng builds
* Requires support in su binary and adbd
* Root access can be configured to use ADB only, apps only, or all
Change-Id: I132a35a31c676511db954ff19120fa6d3c795b23
Diffstat (limited to 'src/com/android/settings')
-rw-r--r-- | src/com/android/settings/DevelopmentSettings.java | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index aeedb0c..aa6f326 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -121,6 +121,9 @@ public class DevelopmentSettings extends PreferenceFragment private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category"; private static final String OPENGL_TRACES_KEY = "enable_opengl_traces"; + private static final String ROOT_ACCESS_KEY = "root_access"; + private static final String ROOT_ACCESS_PROPERTY = "persist.sys.root_access"; + private static final String ENABLE_TRACES_KEY = "enable_traces"; private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY @@ -182,6 +185,9 @@ public class DevelopmentSettings extends PreferenceFragment private CheckBoxPreference mShowAllANRs; + private ListPreference mRootAccess; + private Object mSelectedRootValue; + private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>(); private final ArrayList<CheckBoxPreference> mResetCbPrefs = new ArrayList<CheckBoxPreference>(); @@ -192,6 +198,7 @@ public class DevelopmentSettings extends PreferenceFragment private boolean mDialogClicked; private Dialog mEnableDialog; private Dialog mAdbDialog; + private Dialog mRootDialog; @Override public void onCreate(Bundle icicle) { @@ -282,6 +289,10 @@ public class DevelopmentSettings extends PreferenceFragment mAllPrefs.add(hdcpChecking); } removeHdcpOptionsForProduction(); + + mRootAccess = (ListPreference) findPreference(ROOT_ACCESS_KEY); + mRootAccess.setOnPreferenceChangeListener(this); + removeRootOptionsIfRequired(); } private CheckBoxPreference findAndInitCheckboxPref(String key) { @@ -294,6 +305,15 @@ public class DevelopmentSettings extends PreferenceFragment return pref; } + private void removeRootOptionsIfRequired() { + // user builds don't get root, and eng always gets root + if (!Build.IS_DEBUGGABLE || "eng".equals(Build.TYPE)) { + if (mRootAccess != null) { + getPreferenceScreen().removePreference(mRootAccess); + } + } + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -421,6 +441,7 @@ public class DevelopmentSettings extends PreferenceFragment updateShowAllANRsOptions(); updateVerifyAppsOverUsbOptions(); updateBugreportOptions(); + updateRootAccessOptions(); } private void resetDangerousOptions() { @@ -445,6 +466,27 @@ public class DevelopmentSettings extends PreferenceFragment pokeSystemProperties(); } + private void updateRootAccessOptions() { + String value = SystemProperties.get(ROOT_ACCESS_PROPERTY, "1"); + mRootAccess.setValue(value); + mRootAccess.setSummary(getResources() + .getStringArray(R.array.root_access_entries)[Integer.valueOf(value)]); + } + + private void writeRootAccessOptions(Object newValue) { + String oldValue = SystemProperties.get(ROOT_ACCESS_PROPERTY, "1"); + SystemProperties.set(ROOT_ACCESS_PROPERTY, newValue.toString()); + if (Integer.valueOf(newValue.toString()) < 2 && !oldValue.equals(newValue) + && "1".equals(SystemProperties.get("service.adb.root", "0"))) { + SystemProperties.set("service.adb.root", "0"); + Settings.Secure.putInt(getActivity().getContentResolver(), + Settings.Secure.ADB_ENABLED, 0); + Settings.Secure.putInt(getActivity().getContentResolver(), + Settings.Secure.ADB_ENABLED, 1); + } + updateRootAccessOptions(); + } + private void updateHdcpValues() { int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY); @@ -1101,6 +1143,25 @@ public class DevelopmentSettings extends PreferenceFragment } else if (preference == mAppProcessLimit) { writeAppProcessLimitOptions(newValue); return true; + } else if (preference == mRootAccess) { + if ("0".equals(SystemProperties.get(ROOT_ACCESS_PROPERTY, "1")) + && !"0".equals(newValue)) { + mSelectedRootValue = newValue; + mDialogClicked = false; + if (mRootDialog != null) { + dismissDialogs(); + } + mRootDialog = new AlertDialog.Builder(getActivity()) + .setMessage(getResources().getString(R.string.root_access_warning_message)) + .setTitle(R.string.root_access_warning_title) + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(android.R.string.yes, this) + .setNegativeButton(android.R.string.no, this).show(); + mRootDialog.setOnDismissListener(this); + } else { + writeRootAccessOptions(newValue); + } + return true; } return false; } @@ -1114,6 +1175,10 @@ public class DevelopmentSettings extends PreferenceFragment mEnableDialog.dismiss(); mEnableDialog = null; } + if (mRootDialog != null) { + mRootDialog.dismiss(); + mRootDialog = null; + } } public void onClick(DialogInterface dialog, int which) { @@ -1140,6 +1205,13 @@ public class DevelopmentSettings extends PreferenceFragment // Reset the toggle mEnabledSwitch.setChecked(false); } + } else if (dialog == mRootDialog) { + if (which == DialogInterface.BUTTON_POSITIVE) { + writeRootAccessOptions(mSelectedRootValue); + } else { + // Reset the option + writeRootAccessOptions("0"); + } } } |