OSDN Git Service

Settings: Add Superuser entry
authorKoushik Dutta <koushd@gmail.com>
Thu, 28 Feb 2013 22:49:24 +0000 (14:49 -0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 13 Nov 2019 11:13:30 +0000 (19:13 +0800)
Amended for oreo-x86 porting by cwhuang.

Squashed commit of the following:

Author: Koushik Dutta <koushd@gmail.com>
Switch to new Superuser
Change-Id: I9d91392ad6fbc9953d19059ab59b91d214c00e0c

Author: Danny Baumann <dannybaumann@web.de>
Hide Superuser entry if root access for apps is disabled.
Change-Id: Ibb77ba5a0fccf22564a26b8b1e13f7762c65718e

Author: Ricardo Cerqueira <cyanogenmod@cerqueira.org>
Development: Root for apps is unavailable if the su daemon isn't running

The superuser options are tied to the Superuser app variant we use,
which in turn is tied to the su daemon. No daemon, no menu options.
Change-Id: I41d58e62986759336ab38e67f26a558c2eed5aa3

Change-Id: I9d91392ad6fbc9953d19059ab59b91d214c00e0c

12 files changed:
Android.mk
AndroidManifest.xml
proguard.flags
src/com/android/settings/Settings.java
src/com/android/settings/SettingsActivity.java
src/com/android/settings/core/gateway/SettingsGateway.java
src/com/android/settings/cyanogenmod/superuser/MultitaskSuRequestActivity.java [new file with mode: 0644]
src/com/android/settings/cyanogenmod/superuser/NotifyActivity.java [new file with mode: 0644]
src/com/android/settings/cyanogenmod/superuser/PolicyNativeFragment.java [new file with mode: 0644]
src/com/android/settings/cyanogenmod/superuser/RequestActivity.java [new file with mode: 0644]
src/com/android/settings/cyanogenmod/superuser/SuReceiver.java [new file with mode: 0644]
src/com/android/settings/development/RootAccessPreferenceController.java

index e37e9fb..401dc96 100644 (file)
@@ -18,7 +18,9 @@ LOCAL_PRIVILEGED_MODULE := true
 LOCAL_MODULE_TAGS := optional
 LOCAL_USE_AAPT2 := true
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    $(call all-java-files-under,../../../external/koush/Widgets/Widgets/src) \
+    $(call all-java-files-under,../../../external/koush/Superuser/Superuser/src)
 
 LOCAL_STATIC_ANDROID_LIBRARIES := \
     android-slices-builders \
@@ -47,6 +49,15 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
+    external/koush/Widgets/Widgets/res \
+    external/koush/Superuser/Superuser/res
+
+LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true
+
+LOCAL_AAPT_FLAGS := --auto-add-overlay \
+    --extra-packages com.koushikdutta.superuser:com.koushikdutta.widgets
+
 ifneq ($(INCREMENTAL_BUILDS),)
     LOCAL_PROGUARD_ENABLED := disabled
     LOCAL_JACK_ENABLED := incremental
index 4456aa0..6655fce 100644 (file)
     <uses-permission android:name="android.permission.USE_RESERVED_DISK" />
     <uses-permission android:name="android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS" />
 
+    <permission
+        android:name="android.permission.REQUEST_SUPERUSER"
+        android:protectionLevel="signature" />
+
+    <permission
+        android:name="android.permission.REPORT_SUPERUSER"
+        android:protectionLevel="signature" />
+
+    <permission-group
+        android:name="android.permission-group.SUPERUSER"
+        android:description="@string/superuser_description_more"
+        android:icon="@drawable/ic_action_permission"
+        android:label="@string/superuser"
+        android:priority="10000" />
+
+    <permission
+        android:name="android.permission.ACCESS_SUPERUSER"
+        android:description="@string/superuser_description_more"
+        android:icon="@drawable/ic_action_permission"
+        android:label="@string/superuser_description"
+        android:logo="@drawable/ic_action_permission"
+        android:permissionGroup="android.permission-group.SUPERUSER"
+        android:protectionLevel="dangerous" />
+
     <application android:label="@string/settings_label"
             android:icon="@drawable/ic_launcher_settings"
             android:taskAffinity=""
             android:appComponentFactory="android.support.v4.app.CoreComponentFactory">
 
         <uses-library android:name="org.apache.http.legacy" />
+
+        <!-- Only system/su can open this activity -->
+        <!-- This activity will then call the MultitaskSuRequestActivity to create a new task stack -->
+        <activity
+            android:name=".cyanogenmod.superuser.RequestActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:label="@string/superuser"
+            android:launchMode="singleTask"
+            android:excludeFromRecents="true"
+            android:permission="android.permission.REQUEST_SUPERUSER"
+            android:process=":superuser"
+            android:taskAffinity="com.android.settings.superuser"
+            android:theme="@style/RequestThemeDark" />
+        <!-- Only system/su can open this activity -->
+        <!-- This is activity is started in multiuser mode when the user invoking su -->
+        <!-- is not the device owner (user id 0). -->
+        <activity
+            android:name=".cyanogenmod.superuser.NotifyActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:label="@string/superuser"
+            android:launchMode="singleTask"
+            android:excludeFromRecents="true"
+            android:permission="android.permission.REQUEST_SUPERUSER"
+            android:process=":superuser"
+            android:taskAffinity="com.android.settings.superuser"
+            android:theme="@style/RequestThemeDark" />
+
+        <!-- Multiple instances of this activity can be running for multiple su requests -->
+        <activity
+            android:name=".cyanogenmod.superuser.MultitaskSuRequestActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:excludeFromRecents="true"
+            android:exported="false"
+            android:label="@string/request"
+            android:process=":superuser"
+            android:taskAffinity="com.android.settings.superuser"
+            android:theme="@style/RequestThemeDark" />
+
+        <receiver
+            android:name=".cyanogenmod.superuser.SuReceiver"
+            android:permission="android.permission.REPORT_SUPERUSER" />
+
         <!-- Settings -->
 
         <activity android:name="Settings"
                 android:value="com.android.settings.print.PrintJobSettingsFragment" />
         </activity>
 
+        <activity android:name="Settings$SuperuserActivity"
+                android:label="@string/superuser"
+                android:icon="@drawable/ic_action_permission"
+                android:taskAffinity="com.android.settings"
+                android:parentActivityName="Settings$UserAndAccountDashboardActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter android:priority="3">
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.summary"
+                android:resource="@string/superuser_description"/>
+            <meta-data android:name="com.android.settings.category"
+                android:value="com.android.settings.category.ia.accounts" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.cyanogenmod.superuser.PolicyNativeFragment" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                android:value="true" />
+        </activity>
+
         <activity android:name=".development.AppPicker"
                   android:label="@string/select_application"
                   android:theme="@android:style/Theme.DeviceDefault.Light.Dialog" />
index 43a038b..537b3d9 100644 (file)
@@ -3,6 +3,8 @@
 
 # Keep all Fragments in this package, which are used by reflection.
 -keep public class com.android.settings.** extends android.app.Fragment
+-keep public class com.android.settings.cyanogenmod.superuser.**
+-keep public class com.koushikdutta.**
 
 # Keep all preference controllers needed by slice and DashboardFragment.
 -keep class * extends com.android.settings.core.BasePreferenceController {
index 0ad964b..6828e49 100644 (file)
@@ -99,6 +99,7 @@ public class Settings extends SettingsActivity {
     public static class PaymentSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PrintSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PrintJobSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class SuperuserActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeBehaviorSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeBlockedEffectsSettingsActivity extends SettingsActivity { /* empty */ }
index 29cd77a..06eda8d 100644 (file)
@@ -63,6 +63,7 @@ import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardSummary;
+import com.android.settings.development.RootAccessPreferenceController;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.DeviceIndexFeatureProvider;
 import com.android.settings.wfd.WifiDisplaySettings;
@@ -694,6 +695,11 @@ public class SettingsActivity extends SettingsDrawerActivity
                 !UserManager.isDeviceInDemoMode(this), isAdmin)
                 || somethingChanged;
 
+        somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
+                         Settings.SuperuserActivity.class.getName()),
+                RootAccessPreferenceController.isRootForAppsEnabled(), isAdmin)
+                || somethingChanged;
+
         final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
                 && !Utils.isMonkeyRunning();
         final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
index a8cb61c..4dd0a33 100644 (file)
@@ -57,6 +57,7 @@ import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFrag
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment;
 import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
+import com.android.settings.cyanogenmod.superuser.PolicyNativeFragment;
 import com.android.settings.datausage.DataUsageList;
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.datausage.DataUsageSummaryLegacy;
@@ -202,6 +203,7 @@ public class SettingsGateway {
             NotificationAccessSettings.class.getName(),
             ZenAccessSettings.class.getName(),
             ZenModeAutomationSettings.class.getName(),
+            PolicyNativeFragment.class.getName(),
             PrintSettingsFragment.class.getName(),
             PrintJobSettingsFragment.class.getName(),
             TrustedCredentialsSettings.class.getName(),
diff --git a/src/com/android/settings/cyanogenmod/superuser/MultitaskSuRequestActivity.java b/src/com/android/settings/cyanogenmod/superuser/MultitaskSuRequestActivity.java
new file mode 100644 (file)
index 0000000..0103076
--- /dev/null
@@ -0,0 +1,4 @@
+package com.android.settings.cyanogenmod.superuser;
+
+public class MultitaskSuRequestActivity extends com.koushikdutta.superuser.MultitaskSuRequestActivity {
+}
\ No newline at end of file
diff --git a/src/com/android/settings/cyanogenmod/superuser/NotifyActivity.java b/src/com/android/settings/cyanogenmod/superuser/NotifyActivity.java
new file mode 100644 (file)
index 0000000..23aa6a7
--- /dev/null
@@ -0,0 +1,4 @@
+package com.android.settings.cyanogenmod.superuser;
+
+public class NotifyActivity extends com.koushikdutta.superuser.NotifyActivity {
+}
\ No newline at end of file
diff --git a/src/com/android/settings/cyanogenmod/superuser/PolicyNativeFragment.java b/src/com/android/settings/cyanogenmod/superuser/PolicyNativeFragment.java
new file mode 100644 (file)
index 0000000..1c74543
--- /dev/null
@@ -0,0 +1,4 @@
+package com.android.settings.cyanogenmod.superuser;
+
+public class PolicyNativeFragment extends com.koushikdutta.superuser.PolicyNativeFragment {
+}
\ No newline at end of file
diff --git a/src/com/android/settings/cyanogenmod/superuser/RequestActivity.java b/src/com/android/settings/cyanogenmod/superuser/RequestActivity.java
new file mode 100644 (file)
index 0000000..e6deca4
--- /dev/null
@@ -0,0 +1,4 @@
+package com.android.settings.cyanogenmod.superuser;
+
+public class RequestActivity extends com.koushikdutta.superuser.RequestActivity {
+}
\ No newline at end of file
diff --git a/src/com/android/settings/cyanogenmod/superuser/SuReceiver.java b/src/com/android/settings/cyanogenmod/superuser/SuReceiver.java
new file mode 100644 (file)
index 0000000..c4f9174
--- /dev/null
@@ -0,0 +1,4 @@
+package com.android.settings.cyanogenmod.superuser;
+
+public class SuReceiver extends com.koushikdutta.superuser.SuReceiver {
+}
\ No newline at end of file
index 805dd22..683a9f9 100644 (file)
@@ -109,6 +109,13 @@ public class RootAccessPreferenceController extends DeveloperOptionsPreferenceCo
         updatePreference();
     }
 
+    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());