Skip to content

Commit 4a4de01

Browse files
koushhmtheboy154
authored andcommitted
Settings: Add Superuser entry
Amended for r-x86 porting by electrikjesus. Squashed commit of the following: Author: Koushik Dutta <[email protected]> Switch to new Superuser Change-Id: I9d91392ad6fbc9953d19059ab59b91d214c00e0c Author: Danny Baumann <[email protected]> Hide Superuser entry if root access for apps is disabled. Change-Id: Ibb77ba5a0fccf22564a26b8b1e13f7762c65718e Author: Ricardo Cerqueira <[email protected]> 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 Conflicts: Android.bp AndroidManifest.xml res/xml/development_settings.xml src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
1 parent 36278d1 commit 4a4de01

13 files changed

+139
-2
lines changed

Android.bp

+11-2
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,21 @@ android_library {
2929

3030
srcs: ["src/**/*.java",
3131
"SakuraSettings/src/**/*.java",
32+
"koush/Widgets/Widgets/src/**/*.java",
33+
"koush/Superuser/Superuser/src/**/*.java",
34+
"src/com/android/settings/cyanogenmod/superuser/*.java",
3235
],
3336

34-
aaptflags: ["--extra-packages com.sakura.settings"],
37+
aaptflags: ["--extra-packages com.sakura.settings",
38+
"--extra-packages com.koushikdutta.superuser",
39+
"--extra-packages com.koushikdutta.widgets",
40+
],
3541

3642
resource_dirs: ["res",
37-
"SakuraSettings/res"
43+
"SakuraSettings/res",
44+
"koush/Widgets/WidgetsSample/res",
45+
"koush/Widgets/Widgets/res",
46+
"koush/Superuser/Superuser/res",
3847
],
3948

4049
static_libs: [

AndroidManifest.xml

+89
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,31 @@
109109
<uses-permission android:name="android.permission.READ_DREAM_STATE" />
110110
<uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" />
111111

112+
113+
<permission
114+
android:name="android.permission.REQUEST_SUPERUSER"
115+
android:protectionLevel="signature" />
116+
117+
<permission
118+
android:name="android.permission.REPORT_SUPERUSER"
119+
android:protectionLevel="signature" />
120+
121+
<permission-group
122+
android:name="android.permission-group.SUPERUSER"
123+
android:description="@string/superuser_description_more"
124+
android:icon="@drawable/ic_action_permission"
125+
android:label="@string/superuser"
126+
android:priority="10000" />
127+
128+
<permission
129+
android:name="android.permission.ACCESS_SUPERUSER"
130+
android:description="@string/superuser_description_more"
131+
android:icon="@drawable/ic_action_permission"
132+
android:label="@string/superuser_description"
133+
android:logo="@drawable/ic_action_permission"
134+
android:permissionGroup="android.permission-group.SUPERUSER"
135+
android:protectionLevel="dangerous" />
136+
112137
<application android:label="@string/settings_label"
113138
android:icon="@mipmap/ic_launcher"
114139
android:theme="@style/Theme.Settings"
@@ -122,6 +147,48 @@
122147
android:appComponentFactory="androidx.core.app.CoreComponentFactory">
123148

124149
<uses-library android:name="org.apache.http.legacy" />
150+
151+
<!-- Only system/su can open this activity -->
152+
<!-- This activity will then call the MultitaskSuRequestActivity to create a new task stack -->
153+
<activity
154+
android:name=".cyanogenmod.superuser.RequestActivity"
155+
android:configChanges="keyboardHidden|orientation|screenSize"
156+
android:label="@string/superuser"
157+
android:launchMode="singleTask"
158+
android:excludeFromRecents="true"
159+
android:permission="android.permission.REQUEST_SUPERUSER"
160+
android:process=":superuser"
161+
android:taskAffinity="com.android.settings.superuser"
162+
android:theme="@style/RequestThemeDark" />
163+
<!-- Only system/su can open this activity -->
164+
<!-- This is activity is started in multiuser mode when the user invoking su -->
165+
<!-- is not the device owner (user id 0). -->
166+
<activity
167+
android:name=".cyanogenmod.superuser.NotifyActivity"
168+
android:configChanges="keyboardHidden|orientation|screenSize"
169+
android:label="@string/superuser"
170+
android:launchMode="singleTask"
171+
android:excludeFromRecents="true"
172+
android:permission="android.permission.REQUEST_SUPERUSER"
173+
android:process=":superuser"
174+
android:taskAffinity="com.android.settings.superuser"
175+
android:theme="@style/RequestThemeDark" />
176+
177+
<!-- Multiple instances of this activity can be running for multiple su requests -->
178+
<activity
179+
android:name=".cyanogenmod.superuser.MultitaskSuRequestActivity"
180+
android:configChanges="keyboardHidden|orientation|screenSize"
181+
android:excludeFromRecents="true"
182+
android:exported="false"
183+
android:label="@string/request"
184+
android:process=":superuser"
185+
android:taskAffinity="com.android.settings.superuser"
186+
android:theme="@style/RequestThemeDark" />
187+
188+
<receiver
189+
android:name=".cyanogenmod.superuser.SuReceiver"
190+
android:permission="android.permission.REPORT_SUPERUSER" />
191+
125192
<!-- Settings -->
126193

127194
<activity android:name=".homepage.SettingsHomepageActivity"
@@ -2003,6 +2070,28 @@
20032070
android:value="com.android.settings.print.PrintJobSettingsFragment" />
20042071
</activity>
20052072

2073+
<activity android:name="Settings$SuperuserActivity"
2074+
android:label="@string/superuser"
2075+
android:icon="@drawable/ic_action_permission"
2076+
android:taskAffinity="com.android.settings"
2077+
android:parentActivityName="Settings$AccountDashboardActivity">
2078+
<intent-filter>
2079+
<action android:name="android.intent.action.MAIN" />
2080+
<category android:name="android.intent.category.DEFAULT" />
2081+
</intent-filter>
2082+
<intent-filter android:priority="3">
2083+
<action android:name="com.android.settings.action.SETTINGS" />
2084+
</intent-filter>
2085+
<meta-data android:name="com.android.settings.summary"
2086+
android:resource="@string/superuser_description"/>
2087+
<meta-data android:name="com.android.settings.category"
2088+
android:value="com.android.settings.category.ia.accounts" />
2089+
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
2090+
android:value="com.android.settings.cyanogenmod.superuser.PolicyNativeFragment" />
2091+
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
2092+
android:value="true" />
2093+
</activity>
2094+
20062095
<activity android:name=".development.AppPicker"
20072096
android:label="@string/select_application" />
20082097

koush

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../external/koush

proguard.flags

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
# Keep all Fragments in this package, which are used by reflection.
99
-keep public class com.android.settings.** extends androidx.fragment.app.Fragment
10+
-keep public class com.android.settings.cyanogenmod.superuser.**
11+
-keep public class com.koushikdutta.**
1012

1113
# Keep all preference controllers needed by slice and DashboardFragment.
1214
-keep class * extends com.android.settings.core.BasePreferenceController {

src/com/android/settings/Settings.java

+1
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ public static class TrustedCredentialsSettingsActivity extends SettingsActivity
151151
public static class PaymentSettingsActivity extends SettingsActivity { /* empty */ }
152152
public static class PrintSettingsActivity extends SettingsActivity { /* empty */ }
153153
public static class PrintJobSettingsActivity extends SettingsActivity { /* empty */ }
154+
public static class SuperuserActivity extends SettingsActivity { /* empty */ }
154155
public static class ZenModeSettingsActivity extends SettingsActivity { /* empty */ }
155156
public static class ZenModeBehaviorSettingsActivity extends SettingsActivity { /* empty */ }
156157
public static class ZenModeBlockedEffectsSettingsActivity extends SettingsActivity { /* empty */ }

src/com/android/settings/SettingsActivity.java

+6
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import com.android.settings.core.SubSettingLauncher;
5959
import com.android.settings.core.gateway.SettingsGateway;
6060
import com.android.settings.dashboard.DashboardFeatureProvider;
61+
import com.android.settings.development.RootAccessPreferenceController;
6162
import com.android.settings.homepage.TopLevelSettings;
6263
import com.android.settings.overlay.FeatureFactory;
6364
import com.android.settings.wfd.WifiDisplaySettings;
@@ -639,6 +640,11 @@ private void doUpdateTilesList() {
639640
&& !Utils.isMonkeyRunning(), isAdmin)
640641
|| somethingChanged;
641642

643+
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
644+
Settings.SuperuserActivity.class.getName()),
645+
RootAccessPreferenceController.isRootForAppsEnabled(), isAdmin)
646+
|| somethingChanged;
647+
642648
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
643649
&& !Utils.isMonkeyRunning();
644650
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,

src/com/android/settings/core/gateway/SettingsGateway.java

+2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
6666
import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment;
6767
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
68+
import com.android.settings.cyanogenmod.superuser.PolicyNativeFragment;
6869
import com.android.settings.datausage.DataSaverSummary;
6970
import com.android.settings.datausage.DataUsageList;
7071
import com.android.settings.datausage.DataUsageSummary;
@@ -244,6 +245,7 @@ public class SettingsGateway {
244245
ZenAccessSettings.class.getName(),
245246
ZenAccessDetails.class.getName(),
246247
ZenModeAutomationSettings.class.getName(),
248+
PolicyNativeFragment.class.getName(),
247249
PrintSettingsFragment.class.getName(),
248250
PrintJobSettingsFragment.class.getName(),
249251
TrustedCredentialsSettings.class.getName(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.android.settings.cyanogenmod.superuser;
2+
3+
public class MultitaskSuRequestActivity extends com.koushikdutta.superuser.MultitaskSuRequestActivity {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.android.settings.cyanogenmod.superuser;
2+
3+
public class NotifyActivity extends com.koushikdutta.superuser.NotifyActivity {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.android.settings.cyanogenmod.superuser;
2+
3+
public class PolicyNativeFragment extends com.koushikdutta.superuser.PolicyNativeFragment {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.android.settings.cyanogenmod.superuser;
2+
3+
public class RequestActivity extends com.koushikdutta.superuser.RequestActivity {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.android.settings.cyanogenmod.superuser;
2+
3+
public class SuReceiver extends com.koushikdutta.superuser.SuReceiver {
4+
}

src/com/android/settings/development/RootAccessPreferenceController.java

+7
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ public void onRootAccessDialogDismissed() {
108108
updatePreference();
109109
}
110110

111+
public static boolean isRootForAppsEnabled() {
112+
int value = SystemProperties.getInt(ROOT_ACCESS_PROPERTY, 0);
113+
boolean daemonState =
114+
SystemProperties.get("init.svc.su_daemon", "absent").equals("running");
115+
return daemonState && (value == 1 || value == 3);
116+
}
117+
111118
private void writeRootAccessOptions(Object newValue) {
112119
String oldValue = SystemProperties.get(ROOT_ACCESS_PROPERTY, "0");
113120
SystemProperties.set(ROOT_ACCESS_PROPERTY, newValue.toString());

0 commit comments

Comments
 (0)