summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2012-01-14 17:05:59 -0800
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2012-11-20 00:45:52 +0000
commit4e5f8cefea6a2b65cc4db45853a0502de165cb63 (patch)
tree7fab98e2423544f8cf66d768f280f3e6080f2877 /src/com/android/settings
parent79bf08d246aa24b5d5330630c66b71b9f2f57228 (diff)
downloadpackages_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.java72
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");
+ }
}
}