diff options
author | Steve Kondik <steve@cyngn.com> | 2015-10-18 23:46:41 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-10-18 23:47:07 -0700 |
commit | 587efed7f64c32d822baead8651c1f47067b59c1 (patch) | |
tree | a9de8890a44f43feacbc32985707862866445f02 | |
parent | 584a7b64ad7468ae8f790d9d24cbf373dc869d38 (diff) | |
download | packages_apps_Settings-587efed7f64c32d822baead8651c1f47067b59c1.zip packages_apps_Settings-587efed7f64c32d822baead8651c1f47067b59c1.tar.gz packages_apps_Settings-587efed7f64c32d822baead8651c1f47067b59c1.tar.bz2 |
settings: Add developer setting for root access
Change-Id: If96219d893c0dfdcf4ad36e1cd8de3a413db0e8b
-rw-r--r-- | res/values/cm_arrays.xml | 32 | ||||
-rw-r--r-- | res/values/cm_strings.xml | 26 | ||||
-rw-r--r-- | res/xml/development_prefs.xml | 7 | ||||
-rw-r--r-- | src/com/android/settings/DevelopmentSettings.java | 101 |
4 files changed, 166 insertions, 0 deletions
diff --git a/res/values/cm_arrays.xml b/res/values/cm_arrays.xml new file mode 100644 index 0000000..2692f43 --- /dev/null +++ b/res/values/cm_arrays.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012-2015 The CyanogenMod 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. +--> +<resources> + <!-- Arrays for root access capability --> + <string-array name="root_access_entries" translatable="false"> + <item>@string/root_access_none</item> + <item>@string/root_access_apps</item> + <item>@string/root_access_adb</item> + <item>@string/root_access_all</item> + </string-array> + + <string-array name="root_access_values" translatable="false"> + <item>0</item> + <item>1</item> + <item>2</item> + <item>3</item> + </string-array> +</resources> diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml new file mode 100644 index 0000000..49560fc --- /dev/null +++ b/res/values/cm_strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012-2015 The CyanogenMod 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. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Setting checkbox title for root access --> + <string name="root_access">Root access</string> + <string name="root_access_warning_title">Allow root access?</string> + <string name="root_access_warning_message">Allowing apps to request root access is very dangerous and could compromise the security of your system!</string> + <string name="root_access_none">Disabled</string> + <string name="root_access_apps">Apps only</string> + <string name="root_access_adb">ADB only</string> + <string name="root_access_all">Apps and ADB</string> +</resources> diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml index 01f3ba5..22a6cbf 100644 --- a/res/xml/development_prefs.xml +++ b/res/xml/development_prefs.xml @@ -60,6 +60,13 @@ android:summary="@string/runningservices_settings_summary" android:fragment="com.android.settings.applications.RunningServices" /> + <ListPreference + android:key="root_access" + android:title="@string/root_access" + android:persistent="false" + android:entries="@array/root_access_entries" + android:entryValues="@array/root_access_values" /> + <PreferenceCategory android:key="debug_debugging_category" android:title="@string/debug_debugging_category"> diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index 4a4c51d..5d1f417 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -161,6 +161,9 @@ public class DevelopmentSettings extends SettingsPreferenceFragment 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 IMMEDIATELY_DESTROY_ACTIVITIES_KEY = "immediately_destroy_activities"; private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit"; @@ -253,6 +256,10 @@ public class DevelopmentSettings extends SettingsPreferenceFragment private SwitchPreference mShowAllANRs; + private PreferenceScreen mProcessStats; + private ListPreference mRootAccess; + private Object mSelectedRootValue; + private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>(); private final ArrayList<SwitchPreference> mResetSwitchPrefs @@ -266,6 +273,7 @@ public class DevelopmentSettings extends SettingsPreferenceFragment private Dialog mAdbKeysDialog; private boolean mUnavailable; + private Dialog mRootDialog; @Override protected int getMetricsCategory() { @@ -407,6 +415,12 @@ public class DevelopmentSettings extends SettingsPreferenceFragment mAllPrefs.add(hdcpChecking); removePreferenceForProduction(hdcpChecking); } + + mRootAccess = (ListPreference) findPreference(ROOT_ACCESS_KEY); + mRootAccess.setOnPreferenceChangeListener(this); + if (!removeRootOptionsIfRequired()) { + mAllPrefs.add(mRootAccess); + } } private ListPreference addListPreference(String prefKey) { @@ -433,6 +447,18 @@ public class DevelopmentSettings extends SettingsPreferenceFragment return pref; } + private boolean 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); + return true; + } + } + + return false; + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -601,6 +627,7 @@ public class DevelopmentSettings extends SettingsPreferenceFragment updateMobileDataAlwaysOnOptions(); updateSimulateColorSpace(); updateUSBAudioOptions(); + updateUSBAudioOptions(); } private void resetDangerousOptions() { @@ -614,6 +641,7 @@ public class DevelopmentSettings extends SettingsPreferenceFragment } resetDebuggerOptions(); writeLogdSizeOption(null); + resetRootAccessOptions(); writeAnimationScaleOption(0, mWindowAnimationScale, null); writeAnimationScaleOption(1, mTransitionAnimationScale, null); writeAnimationScaleOption(2, mAnimatorDurationScale, null); @@ -629,6 +657,47 @@ public class DevelopmentSettings extends SettingsPreferenceFragment pokeSystemProperties(); } + private void updateRootAccessOptions() { + String value = SystemProperties.get(ROOT_ACCESS_PROPERTY, "0"); + mRootAccess.setValue(value); + mRootAccess.setSummary(getResources() + .getStringArray(R.array.root_access_entries)[Integer.valueOf(value)]); + } + + public static boolean isRootForAppsEnabled() { + int value = SystemProperties.getInt(ROOT_ACCESS_PROPERTY, 0); + boolean daemonState = + SystemProperties.get("init.svc.su_daemon", "absent").equals("running"); + return daemonState && (value == 1 || value == 3); + } + + private void writeRootAccessOptions(Object newValue) { + String oldValue = SystemProperties.get(ROOT_ACCESS_PROPERTY, "0"); + 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 resetRootAccessOptions() { + String oldValue = SystemProperties.get(ROOT_ACCESS_PROPERTY, "0"); + SystemProperties.set(ROOT_ACCESS_PROPERTY, "0"); + if (!oldValue.equals("0") && "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() { ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY); if (hdcpChecking != null) { @@ -1743,6 +1812,24 @@ public class DevelopmentSettings extends SettingsPreferenceFragment } else if (preference == mSimulateColorSpace) { writeSimulateColorSpace(newValue); return true; + } else if (preference == mRootAccess) { + if ("0".equals(SystemProperties.get(ROOT_ACCESS_PROPERTY, "0")) + && !"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) + .setPositiveButton(android.R.string.yes, this) + .setNegativeButton(android.R.string.no, this).show(); + mRootDialog.setOnDismissListener(this); + } else { + writeRootAccessOptions(newValue); + } + return true; } return false; } @@ -1760,6 +1847,10 @@ public class DevelopmentSettings extends SettingsPreferenceFragment mEnableDialog.dismiss(); mEnableDialog = null; } + if (mRootDialog != null) { + mRootDialog.dismiss(); + mRootDialog = null; + } } public void onClick(DialogInterface dialog, int which) { @@ -1796,6 +1887,13 @@ public class DevelopmentSettings extends SettingsPreferenceFragment // Reset the toggle mSwitchBar.setChecked(false); } + } else if (dialog == mRootDialog) { + if (which == DialogInterface.BUTTON_POSITIVE) { + writeRootAccessOptions(mSelectedRootValue); + } else { + // Reset the option + writeRootAccessOptions("0"); + } } } @@ -1811,6 +1909,9 @@ public class DevelopmentSettings extends SettingsPreferenceFragment mSwitchBar.setChecked(false); } mEnableDialog = null; + } else if (dialog == mRootDialog) { + updateRootAccessOptions(); + mRootDialog = null; } } |