OSDN Git Service

Settings: Set root access options appropriately
authorTom Marshall <tdm@cyngn.com>
Mon, 27 Jun 2016 21:31:57 +0000 (14:31 -0700)
committerGerrit Code Review <gerrit@cyanogenmod.org>
Wed, 29 Jun 2016 18:33:41 +0000 (11:33 -0700)
It is possible to be running a user build with a debuggable boot image.
In this case, "su" will not be available.  So only show none/adb.

Jira: BACON-4461

Change-Id: Iaa7df8311b9ea81eabb1566ba6f9159fdc9fab34

res/values/cm_arrays.xml
res/xml/development_prefs.xml
src/com/android/settings/DevelopmentSettings.java

index c439175..06d237b 100644 (file)
         <item>3</item>
     </string-array>
 
+    <string-array name="root_access_entries_adb" translatable="false">
+        <item>@string/root_access_none</item>
+        <item>@string/root_access_adb</item>
+    </string-array>
+
+    <string-array name="root_access_values_adb" translatable="false">
+        <item>0</item>
+        <item>2</item>
+    </string-array>
+
     <!-- Profile lock mode summaries. Do not translate. -->
     <string-array name="profile_lockmode_entries" translatable="false">
         <item>@string/profile_action_system</item>
index 0c9856f..a332ee5 100644 (file)
@@ -82,9 +82,7 @@
     <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" />
+        android:persistent="false" />
 
     <SwitchPreference
         android:key="update_recovery"
index cfdf921..5ae3b1b 100644 (file)
@@ -85,6 +85,7 @@ import com.android.settings.search.Indexable;
 import com.android.settings.widget.SwitchBar;
 import cyanogenmod.providers.CMSettings;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -210,6 +211,9 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
     private static final int[] MOCK_LOCATION_APP_OPS = new int[] {AppOpsManager.OP_MOCK_LOCATION};
 
     private static final String MULTI_WINDOW_SYSTEM_PROPERTY = "persist.sys.debug.multi_window";
+
+    private static final String SUPERUSER_BINARY_PATH = "/system/xbin/su";
+
     private IWindowManager mWindowManager;
     private IBackupManager mBackupManager;
     private DevicePolicyManager mDpm;
@@ -474,6 +478,13 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
         mRootAccess = (ListPreference) findPreference(ROOT_ACCESS_KEY);
         mRootAccess.setOnPreferenceChangeListener(this);
         if (!removeRootOptionsIfRequired()) {
+            if (isRootForAppsAvailable()) {
+                mRootAccess.setEntries(R.array.root_access_entries);
+                mRootAccess.setEntryValues(R.array.root_access_values);
+            } else {
+                mRootAccess.setEntries(R.array.root_access_entries_adb);
+                mRootAccess.setEntryValues(R.array.root_access_values_adb);
+            }
             mAllPrefs.add(mRootAccess);
         }
 
@@ -832,6 +843,17 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
                 .getStringArray(R.array.root_access_entries)[Integer.valueOf(value)]);
     }
 
+    private boolean isRootForAppsAvailable() {
+        boolean exists = false;
+        try {
+            File f = new File(SUPERUSER_BINARY_PATH);
+            exists = f.exists();
+        } catch (SecurityException e) {
+            // Ignore
+        }
+        return exists;
+    }
+
     public static boolean isRootForAppsEnabled() {
         int value = SystemProperties.getInt(ROOT_ACCESS_PROPERTY, 0);
         boolean daemonState =