From 4752b0772fb41d11bc206ab5d45264de7cd7a2cb Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 6 Aug 2016 00:58:05 +0800 Subject: [PATCH 0001/1036] Initial Commit --- .gitignore | 8 + .idea/.name | 1 + .idea/compiler.xml | 22 +++ .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 6 + .idea/gradle.xml | 24 +++ .idea/misc.xml | 46 +++++ .idea/modules.xml | 9 + .idea/runConfigurations.xml | 12 ++ .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 25 +++ app/proguard-rules.pro | 17 ++ .../com/topjohnwu/magisk/ApplicationTest.java | 13 ++ app/src/main/AndroidManifest.xml | 20 +++ app/src/main/ic_launcher-web.png | Bin 0 -> 204846 bytes .../com/topjohnwu/magisk/MainActivity.java | 140 +++++++++++++++ app/src/main/res/layout/activity_main.xml | 105 ++++++++++++ app/src/main/res/layout/no_root.xml | 14 ++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5737 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2829 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 9275 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 19125 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 32424 bytes app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 5 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 6 + .../com/topjohnwu/magisk/ExampleUnitTest.java | 15 ++ build.gradle | 23 +++ gradle.properties | 18 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 ++++++++++++++++++ gradlew.bat | 90 ++++++++++ settings.gradle | 1 + 37 files changed, 811 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/topjohnwu/magisk/ApplicationTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/topjohnwu/magisk/MainActivity.java create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/no_root.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/topjohnwu/magisk/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c6cbe562a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 000000000..14992600a --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +MagiskManager \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 000000000..96cc43efa --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..e7bedf337 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..97626ba45 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 000000000..58992cc7d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..5d1998103 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..fa3d8c775 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 000000000..7f68460d8 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 000000000..6e0179dc7 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 24 + buildToolsVersion "24.0.0" + + defaultConfig { + applicationId "com.topjohnwu.magisk" + minSdkVersion 21 + targetSdkVersion 24 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 000000000..124d5dc1f --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/topjohnwu/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/com/topjohnwu/magisk/ApplicationTest.java b/app/src/androidTest/java/com/topjohnwu/magisk/ApplicationTest.java new file mode 100644 index 000000000..3f3732cc9 --- /dev/null +++ b/app/src/androidTest/java/com/topjohnwu/magisk/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..326ddfc55 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b66d75fc1c1c458df8ba619921bddea0ad1d95 GIT binary patch literal 204846 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

0L*CJ1B@)%Dbk|f(#RWD`n4XVa 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≻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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java new file mode 100644 index 000000000..6318afe3a --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java @@ -0,0 +1,140 @@ +package com.topjohnwu.magisk; + +import android.app.Activity; +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.View; +import android.widget.Switch; +import android.widget.TextView; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; + +public class MainActivity extends Activity { + + private String suPATH; + private String xbinPATH; + + private Switch rootSwitch, selinuxSwitch; + private TextView rootStatus, selinuxStatus, safetyNet, permissive; + + protected class callSU extends AsyncTask { + + @Override + protected String[] doInBackground(String... params) { + String[] results = new String[2]; + try { + Process su = Runtime.getRuntime().exec(suPATH); + DataOutputStream out = new DataOutputStream(su.getOutputStream()); + DataInputStream in = new DataInputStream(su.getInputStream()); + for(int i = 0; i < params.length; ++i) { + out.writeBytes(params[i] + "\n"); + out.flush(); + } + out.writeBytes("if [ -z $(which su) ]; then echo 0; else echo 1; fi;\n"); + out.flush(); + results[0] = in.readLine(); + out.writeBytes("getenforce\n"); + out.flush(); + results[1] = in.readLine(); + out.writeBytes("exit\n"); + out.flush(); + } catch (IOException e) { e.printStackTrace(); } + return results; + } + @Override + protected void onPostExecute(String[] results) { + if(results[0].equals("1")) { + rootStatus.setText("Mounted"); + rootStatus.setTextColor(Color.RED); + rootSwitch.setChecked(true); + safetyNet.setText("Root mounted and enabled. Safety Net (Android Pay) will NOT work"); + safetyNet.setTextColor(Color.RED); + } else { + rootStatus.setText("Not Mounted"); + rootStatus.setTextColor(Color.GREEN); + rootSwitch.setChecked(false); + safetyNet.setText("Safety Net (Android Pay) should work, but no root temporarily"); + safetyNet.setTextColor(Color.GREEN); + } + + selinuxStatus.setText(results[1]); + + if(results[1].equals("Enforcing")) { + selinuxStatus.setTextColor(Color.GREEN); + selinuxSwitch.setChecked(true); + permissive.setText("SELinux is enforced"); + permissive.setTextColor(Color.GREEN); + } else { + selinuxStatus.setTextColor(Color.RED); + selinuxSwitch.setChecked(false); + permissive.setText("Only turn off SELinux if necessary!"); + permissive.setTextColor(Color.RED); + } + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + boolean rooted = true; + + File phh = new File("/magisk/phh/su"); + File supersu = new File("/su/bin/su"); + + if(!supersu.exists()) { + if(!phh.exists()) { + setContentView(R.layout.no_root); + rooted = false; + } else { + suPATH = "/magisk/phh/su"; + xbinPATH = "/magisk/phh/xbin"; + } + } else { + suPATH = "/su/bin/su"; + xbinPATH = "/su/xbin"; + } + + if(rooted) { + + setContentView(R.layout.activity_main); + + rootSwitch = (Switch) findViewById(R.id.root_switch); + selinuxSwitch = (Switch) findViewById(R.id.permissive_switch); + rootStatus = (TextView) findViewById(R.id.root_status); + selinuxStatus = (TextView) findViewById(R.id.selinux_status); + safetyNet = (TextView) findViewById(R.id.safety_net); + permissive = (TextView) findViewById(R.id.permissive); + + (new callSU()).execute(); + + rootSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Switch s = (Switch) view; + if(s.isChecked()) { + (new callSU()).execute("mount -o bind " + xbinPATH + " /system/xbin"); + } else { + (new callSU()).execute("umount /system/xbin"); + } + } + }); + + selinuxSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Switch s = (Switch) view; + if(s.isChecked()) { + (new callSU()).execute("setenforce 1"); + } else { + (new callSU()).execute("setenforce 0"); + } + } + }); + } + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..51abb8153 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/no_root.xml b/app/src/main/res/layout/no_root.xml new file mode 100644 index 000000000..f73f786e3 --- /dev/null +++ b/app/src/main/res/layout/no_root.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8f06d3c6ceb38ed601c252f37cfaeeeb22496ea3 GIT binary patch literal 5737 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 b{o}s?I+3AV&OeD_00000NkvXXu0mjft1b*w literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d5a55573a88da2bf6178b96381f0889b5360a8 GIT binary patch literal 2829 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..678a8b652dff58972cdc0e50dce3393316d9471b GIT binary patch literal 19125 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 Ef_)Y_qyPW_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..00b9e8c25ffc23f0e145b44fa0bb5f390d3e767d GIT binary patch literal 32424 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%0AF>6F z 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

  • +o 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 JPDHLkV1ltQX5Rn+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 000000000..63fc81644 --- /dev/null +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ + + + 64dp + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..9ad7e369a --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3f51b5 + #303F9F + #FF4081 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 000000000..47c822467 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 16dp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..7dbe54742 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Magisk Manager + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..06cad6b40 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/build.gradle b/build.gradle index 77ce66ea3..4ec4cf5f1 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,11 @@ buildscript { repositories { jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java index f575e0dd1..8f20a5608 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java @@ -17,8 +17,9 @@ package org.sufficientlysecure.rootcommands; +import android.util.Log; + import org.sufficientlysecure.rootcommands.command.SimpleCommand; -import org.sufficientlysecure.rootcommands.util.Log; import java.io.File; import java.io.FileReader; diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java index 67e583757..a4036e20a 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java @@ -16,7 +16,7 @@ package org.sufficientlysecure.rootcommands; -import org.sufficientlysecure.rootcommands.util.Log; +import android.util.Log; public class RootCommands { public static final String TAG = "RootCommands"; diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java index 74aa0bfe3..88a65537c 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java @@ -17,8 +17,9 @@ package org.sufficientlysecure.rootcommands; +import android.util.Log; + import org.sufficientlysecure.rootcommands.command.Command; -import org.sufficientlysecure.rootcommands.util.Log; import org.sufficientlysecure.rootcommands.util.RootAccessDeniedException; import org.sufficientlysecure.rootcommands.util.Utils; diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java index 9f2a7fbd0..b36546fbb 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java @@ -19,12 +19,12 @@ package org.sufficientlysecure.rootcommands; import android.os.StatFs; import android.os.SystemClock; +import android.util.Log; import org.sufficientlysecure.rootcommands.command.Command; import org.sufficientlysecure.rootcommands.command.ExecutableCommand; import org.sufficientlysecure.rootcommands.command.SimpleCommand; import org.sufficientlysecure.rootcommands.util.BrokenBusyboxException; -import org.sufficientlysecure.rootcommands.util.Log; import java.io.File; import java.io.FileNotFoundException; diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java index e7e54781c..ce02f9ea2 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java @@ -17,10 +17,11 @@ package org.sufficientlysecure.rootcommands.command; +import android.util.Log; + import org.sufficientlysecure.rootcommands.RootCommands; import org.sufficientlysecure.rootcommands.Shell; import org.sufficientlysecure.rootcommands.util.BrokenBusyboxException; -import org.sufficientlysecure.rootcommands.util.Log; import java.io.IOException; import java.io.OutputStream; diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Log.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Log.java deleted file mode 100644 index 337c49d41..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Log.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.util; - -import org.sufficientlysecure.rootcommands.RootCommands; - -/** - * Wraps Android Logging to enable or disable debug output using Constants - */ -public final class Log { - - public static void v(String tag, String msg) { - if (RootCommands.DEBUG) { - android.util.Log.v(tag, msg); - } - } - - public static void v(String tag, String msg, Throwable tr) { - if (RootCommands.DEBUG) { - android.util.Log.v(tag, msg, tr); - } - } - - public static void d(String tag, String msg) { - if (RootCommands.DEBUG) { - android.util.Log.d(tag, msg); - } - } - - public static void d(String tag, String msg, Throwable tr) { - if (RootCommands.DEBUG) { - android.util.Log.d(tag, msg, tr); - } - } - - public static void i(String tag, String msg) { - if (RootCommands.DEBUG) { - android.util.Log.i(tag, msg); - } - } - - public static void i(String tag, String msg, Throwable tr) { - if (RootCommands.DEBUG) { - android.util.Log.i(tag, msg, tr); - } - } - - public static void w(String tag, String msg) { - android.util.Log.w(tag, msg); - } - - public static void w(String tag, String msg, Throwable tr) { - android.util.Log.w(tag, msg, tr); - } - - public static void w(String tag, Throwable tr) { - android.util.Log.w(tag, tr); - } - - public static void e(String tag, String msg) { - android.util.Log.e(tag, msg); - } - - public static void e(String tag, String msg, Throwable tr) { - android.util.Log.e(tag, msg, tr); - } - -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java index e04d4dbd0..1aab0a0a1 100644 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java +++ b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java @@ -18,6 +18,8 @@ package org.sufficientlysecure.rootcommands.util; +import android.util.Log; + import org.sufficientlysecure.rootcommands.RootCommands; import java.io.File; From 31b552ab514fd33308bb7dbfd078e2df4f831047 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 21 Aug 2016 16:08:45 +0200 Subject: [PATCH 0009/1036] Module fragment with menu; remove and disable buttons --- .idea/.name | 1 - .idea/compiler.xml | 22 ------ .idea/encodings.xml | 6 -- .idea/gradle.xml | 28 -------- .idea/misc.xml | 62 ----------------- .idea/modules.xml | 11 --- .idea/runConfigurations.xml | 12 ---- .../com/topjohnwu/magisk/model/Module.java | 22 +++++- .../magisk/rv/ItemClickListener.java | 9 +++ .../topjohnwu/magisk/rv/ModulesAdapter.java | 28 ++++---- .../topjohnwu/magisk/ui/ModulesFragment.java | 69 +++++++++++++++---- app/src/main/res/drawable/ic_block.xml | 9 +++ .../ic_bug_report.xml | 0 app/src/main/res/drawable/ic_delete.xml | 9 +++ .../ic_extension.xml | 0 .../drawable/ic_menu_overflow_material.xml | 25 +++++++ app/src/main/res/layout/modules_fragment.xml | 6 ++ app/src/main/res/layout/row.xml | 2 +- app/src/main/res/menu/module_popup.xml | 14 ++++ app/src/main/res/values/strings.xml | 4 ++ 20 files changed, 163 insertions(+), 176 deletions(-) delete mode 100644 .idea/.name delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/runConfigurations.xml create mode 100644 app/src/main/java/com/topjohnwu/magisk/rv/ItemClickListener.java create mode 100644 app/src/main/res/drawable/ic_block.xml rename app/src/main/res/{drawable-anydpi => drawable}/ic_bug_report.xml (100%) create mode 100644 app/src/main/res/drawable/ic_delete.xml rename app/src/main/res/{drawable-anydpi => drawable}/ic_extension.xml (100%) create mode 100644 app/src/main/res/drawable/ic_menu_overflow_material.xml create mode 100644 app/src/main/res/menu/module_popup.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 14992600a..000000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -MagiskManager \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b42dd7204..000000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba45..000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 6d530c3d5..000000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 471660067..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.8 - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 106f29ccb..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8..000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/model/Module.java index 3958c79ca..84734b548 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/model/Module.java @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.model; +import com.topjohnwu.magisk.ui.utils.Utils; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -8,6 +10,10 @@ public class Module { private final boolean isValid; private final boolean isCache; + + private File mRemoveFile; + private File mDisableFile; + private File mPropFile; private String mName; @@ -18,9 +24,11 @@ public class Module { this.isCache = file.getPath().contains("cache"); this.isValid = new File(file + "/module.prop").exists(); - if (isValid) { - mPropFile = new File(file + "/module.prop"); - } + if (!isValid) return; + + mPropFile = new File(file + "/module.prop"); + mRemoveFile = new File(file + "/remove"); + mDisableFile = new File(file + "/disable"); } public boolean isValid() { @@ -43,6 +51,14 @@ public class Module { return mDescription; } + public void createRemoveFile() { + Utils.executeCommand("echo \"\" > " + mRemoveFile.getPath()); + } + + public void createDisableFile() { + Utils.executeCommand("echo \"\" > " + mDisableFile.getPath()); + } + public void parse() throws Exception { BufferedReader reader = new BufferedReader(new FileReader(mPropFile)); String line; diff --git a/app/src/main/java/com/topjohnwu/magisk/rv/ItemClickListener.java b/app/src/main/java/com/topjohnwu/magisk/rv/ItemClickListener.java new file mode 100644 index 000000000..eeb0e80d1 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/rv/ItemClickListener.java @@ -0,0 +1,9 @@ +package com.topjohnwu.magisk.rv; + +import android.view.View; + +public interface ItemClickListener { + + void onItemClick(View view, int position); + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java index 1ad675623..9446f146a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java @@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import com.topjohnwu.magisk.R; @@ -17,37 +18,34 @@ import butterknife.ButterKnife; public class ModulesAdapter extends RecyclerView.Adapter { private final List mList; + private final ItemClickListener mListener; - public ModulesAdapter(List mList) { - this.mList = mList; + public ModulesAdapter(List list, ItemClickListener listener) { + this.mList = list; + this.mListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); -/*FIXME - final ViewHolder viewHolder = new ViewHolder(view); - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - listener.onItemClick(viewHolder.getAdapterPosition()); - } - });*/ return new ViewHolder(view); } @Override - public void onBindViewHolder(ViewHolder holder, int position) { + public void onBindViewHolder(final ViewHolder holder, int position) { Module module = mList.get(position); holder.title.setText(module.getName()); holder.versionName.setText(module.getVersion()); holder.description.setText(module.getDescription()); - //FIXME - - //holder.cache.setText("" + module.isCache()); + holder.overflowButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mListener.onItemClick(holder.overflowButton, holder.getAdapterPosition()); + } + }); } @Override @@ -60,7 +58,7 @@ public class ModulesAdapter extends RecyclerView.Adapter listModules = new ArrayList<>(); + private ItemClickListener moduleActions = new ItemClickListener() { + @Override + public void onItemClick(final View view, final int position) { + PopupMenu popup = new PopupMenu(getContext(), view); + try { + Field[] fields = popup.getClass().getDeclaredFields(); + for (Field field : fields) { + if ("mPopup".equals(field.getName())) { + field.setAccessible(true); + Object menuPopupHelper = field.get(popup); + Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); + Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); + setForceIcons.invoke(menuPopupHelper, true); + break; + } + } + } catch (Exception ignored) { + } + + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.remove: + listModules.get(position).createRemoveFile(); + Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); + break; + case R.id.disable: + listModules.get(position).createDisableFile(); + Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); + break; + } + + return false; + } + }); + popup.inflate(R.menu.module_popup); + popup.show(); + } + }; + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.modules_fragment, container, false); - ButterKnife.bind(this, v); + View view = inflater.inflate(R.layout.modules_fragment, container, false); + ButterKnife.bind(this, view); new CheckFolders().execute(); - return v; + return view; } private class CheckFolders extends AsyncTask { - private ProgressDialog progress; - - @Override - protected void onPreExecute() { - super.onPreExecute(); - - progress = ProgressDialog.show(getContext(), null, getString(R.string.loading), true, false); - } - @Override protected Boolean doInBackground(Void... voids) { File[] magisk = new File(MAGISK_PATH).listFiles(new FileFilter() { @@ -104,9 +143,9 @@ public class ModulesFragment extends android.support.v4.app.Fragment { protected void onPostExecute(Boolean result) { super.onPostExecute(result); - progress.dismiss(); + progressBar.setVisibility(View.GONE); - recyclerView.setAdapter(new ModulesAdapter(listModules)); + recyclerView.setAdapter(new ModulesAdapter(listModules, moduleActions)); } } diff --git a/app/src/main/res/drawable/ic_block.xml b/app/src/main/res/drawable/ic_block.xml new file mode 100644 index 000000000..ea9660ac2 --- /dev/null +++ b/app/src/main/res/drawable/ic_block.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_bug_report.xml b/app/src/main/res/drawable/ic_bug_report.xml similarity index 100% rename from app/src/main/res/drawable-anydpi/ic_bug_report.xml rename to app/src/main/res/drawable/ic_bug_report.xml diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..a8d8089bf --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_extension.xml b/app/src/main/res/drawable/ic_extension.xml similarity index 100% rename from app/src/main/res/drawable-anydpi/ic_extension.xml rename to app/src/main/res/drawable/ic_extension.xml diff --git a/app/src/main/res/drawable/ic_menu_overflow_material.xml b/app/src/main/res/drawable/ic_menu_overflow_material.xml new file mode 100644 index 000000000..4ab8f2f1d --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_overflow_material.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index 1495adf5c..d898a4d96 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -6,6 +6,12 @@ android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> + + + android:src="@drawable/ic_menu_overflow_material"/> diff --git a/app/src/main/res/menu/module_popup.xml b/app/src/main/res/menu/module_popup.xml new file mode 100644 index 000000000..2cf1d7804 --- /dev/null +++ b/app/src/main/res/menu/module_popup.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 969b5bd76..e376e260d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,4 +28,8 @@ Root Modules Log + Remove + Disable + Module will be removed at next reboot + Module will be disabled at next reboot From 5279226f3615b5a3f1ae433c6896e7b9a062ae80 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 21 Aug 2016 16:42:50 +0200 Subject: [PATCH 0010/1036] Two-tabs layout: non-cache and cache modules --- .../com/topjohnwu/magisk/WelcomeActivity.java | 2 + .../com/topjohnwu/magisk/model/Module.java | 6 - .../magisk/ui/BaseModuleFragment.java | 84 +++++++++++ .../topjohnwu/magisk/ui/ModulesFragment.java | 139 ++++++++++-------- app/src/main/res/layout/modules_fragment.xml | 22 ++- .../res/layout/single_module_fragment.xml | 14 ++ 6 files changed, 194 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java create mode 100644 app/src/main/res/layout/single_module_fragment.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index 3532d1505..5036696ad 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -113,6 +113,8 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); try { + toolbar.setElevation(navFragment instanceof ModulesFragment ? 0 : 10); + transaction.replace(R.id.content_frame, navFragment).commit(); } catch (IllegalStateException ignored) { } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/model/Module.java index 84734b548..0d2c89d2c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/model/Module.java @@ -9,7 +9,6 @@ import java.io.FileReader; public class Module { private final boolean isValid; - private final boolean isCache; private File mRemoveFile; private File mDisableFile; @@ -21,7 +20,6 @@ public class Module { private String mDescription; public Module(File file) { - this.isCache = file.getPath().contains("cache"); this.isValid = new File(file + "/module.prop").exists(); if (!isValid) return; @@ -35,10 +33,6 @@ public class Module { return isValid && mPropFile != null; } - public boolean isCache() { - return isCache; - } - public String getName() { return mName; } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java new file mode 100644 index 000000000..1b13cc84e --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java @@ -0,0 +1,84 @@ +package com.topjohnwu.magisk.ui; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v7.widget.PopupMenu; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.model.Module; +import com.topjohnwu.magisk.rv.ItemClickListener; +import com.topjohnwu.magisk.rv.ModulesAdapter; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public abstract class BaseModuleFragment extends Fragment { + + @BindView(R.id.recyclerView) RecyclerView recyclerView; + + private ItemClickListener moduleActions = new ItemClickListener() { + @Override + public void onItemClick(final View view, final int position) { + PopupMenu popup = new PopupMenu(getContext(), view); + + // Force show icons + try { + Field[] fields = popup.getClass().getDeclaredFields(); + for (Field field : fields) { + if ("mPopup".equals(field.getName())) { + field.setAccessible(true); + Object menuPopupHelper = field.get(popup); + Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); + Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); + setForceIcons.invoke(menuPopupHelper, true); + break; + } + } + } catch (Exception ignored) { + } + + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.remove: + listModules().get(position).createRemoveFile(); + Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); + break; + case R.id.disable: + listModules().get(position).createDisableFile(); + Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); + break; + } + + return false; + } + }); + popup.inflate(R.menu.module_popup); + popup.show(); + } + }; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.single_module_fragment, container, false); + ButterKnife.bind(this, view); + + recyclerView.setAdapter(new ModulesAdapter(listModules(), moduleActions)); + return view; + } + + protected abstract List listModules(); +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java index e1e689528..a17b970bf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java @@ -3,25 +3,22 @@ package com.topjohnwu.magisk.ui; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v7.widget.PopupMenu; -import android.support.v7.widget.RecyclerView; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.model.Module; -import com.topjohnwu.magisk.rv.ItemClickListener; -import com.topjohnwu.magisk.rv.ModulesAdapter; import com.topjohnwu.magisk.ui.utils.Utils; import java.io.File; import java.io.FileFilter; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -33,51 +30,20 @@ public class ModulesFragment extends android.support.v4.app.Fragment { private static final String MAGISK_PATH = "/magisk"; private static final String MAGISK_CACHE_PATH = "/cache/magisk"; - @BindView(R.id.recyclerView) RecyclerView recyclerView; + private static List listModulesNoCache = new ArrayList<>(); + private static List listModulesCache = new ArrayList<>(); + @BindView(R.id.progressBar) ProgressBar progressBar; + @BindView(R.id.pager) ViewPager viewPager; + @BindView(R.id.tab_layout) TabLayout tabLayout; - private List listModules = new ArrayList<>(); + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - private ItemClickListener moduleActions = new ItemClickListener() { - @Override - public void onItemClick(final View view, final int position) { - PopupMenu popup = new PopupMenu(getContext(), view); - try { - Field[] fields = popup.getClass().getDeclaredFields(); - for (Field field : fields) { - if ("mPopup".equals(field.getName())) { - field.setAccessible(true); - Object menuPopupHelper = field.get(popup); - Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); - Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); - setForceIcons.invoke(menuPopupHelper, true); - break; - } - } - } catch (Exception ignored) { - } - - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.remove: - listModules.get(position).createRemoveFile(); - Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); - break; - case R.id.disable: - listModules.get(position).createDisableFile(); - Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); - break; - } - - return false; - } - }); - popup.inflate(R.menu.module_popup); - popup.show(); - } - }; + listModulesCache.clear(); + listModulesNoCache.clear(); + } @Nullable @Override @@ -85,11 +51,32 @@ public class ModulesFragment extends android.support.v4.app.Fragment { View view = inflater.inflate(R.layout.modules_fragment, container, false); ButterKnife.bind(this, view); + viewPager.setAdapter(new TabsAdapter(getChildFragmentManager())); + tabLayout.setupWithViewPager(viewPager); + new CheckFolders().execute(); return view; } + public static class NoCacheModuleFragment extends BaseModuleFragment { + + @Override + protected List listModules() { + return listModulesNoCache; + } + + } + + public static class CacheModuleFragment extends BaseModuleFragment { + + @Override + protected List listModules() { + return listModulesCache; + } + + } + private class CheckFolders extends AsyncTask { @Override @@ -114,7 +101,11 @@ public class ModulesFragment extends android.support.v4.app.Fragment { for (File mod : magisk) { Module m = new Module(mod); if (m.isValid()) { - listModules.add(m); + try { + m.parse(); + listModulesNoCache.add(m); + } catch (Exception ignored) { + } } } } @@ -123,19 +114,15 @@ public class ModulesFragment extends android.support.v4.app.Fragment { for (File mod : magiskCache) { Module m = new Module(mod); if (m.isValid()) { - listModules.add(m); + try { + m.parse(); + listModulesCache.add(m); + } catch (Exception ignored) { + } } } } - //noinspection Convert2streamapi - for (Module module : listModules) { - try { - module.parse(); - } catch (Exception ignored) { - } - } - return true; } @@ -144,9 +131,37 @@ public class ModulesFragment extends android.support.v4.app.Fragment { super.onPostExecute(result); progressBar.setVisibility(View.GONE); - - recyclerView.setAdapter(new ModulesAdapter(listModules, moduleActions)); } } + private class TabsAdapter extends FragmentPagerAdapter { + + String[] tabTitles = new String[]{ + "_no_cache", "_cache" + // TODO stringify + }; + + public TabsAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public int getCount() { + return tabTitles.length; + } + + @Override + public String getPageTitle(int position) { + return tabTitles[position]; + } + + @Override + public Fragment getItem(int position) { + if (position == 0) { + return new NoCacheModuleFragment(); + } else { + return new CacheModuleFragment(); + } + } + } } diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index d898a4d96..0f9714854 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -6,16 +6,28 @@ android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> + + - + android:layout_height="0dp" + android:layout_weight="1"/> \ No newline at end of file diff --git a/app/src/main/res/layout/single_module_fragment.xml b/app/src/main/res/layout/single_module_fragment.xml new file mode 100644 index 000000000..42e252d5e --- /dev/null +++ b/app/src/main/res/layout/single_module_fragment.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file From e6b951c62af7840c8ef12600b9e85faedbff8137 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 21 Aug 2016 17:21:37 +0200 Subject: [PATCH 0011/1036] Log fragment completed --- app/src/main/AndroidManifest.xml | 12 +- .../com/topjohnwu/magisk/WelcomeActivity.java | 24 +- .../topjohnwu/magisk/rv/ModulesAdapter.java | 2 +- .../com/topjohnwu/magisk/ui/LogFragment.java | 274 +++++++++++++++++- .../topjohnwu/magisk/ui/ModulesFragment.java | 2 +- .../com/topjohnwu/magisk/ui/RootFragment.java | 4 +- app/src/main/res/drawable/ic_delete.xml | 4 +- app/src/main/res/drawable/ic_delete_black.xml | 9 + app/src/main/res/drawable/ic_refresh.xml | 9 + app/src/main/res/drawable/ic_save.xml | 9 + app/src/main/res/drawable/ic_send.xml | 9 + app/src/main/res/layout/activity_modules.xml | 14 - .../layout/{row.xml => list_item_module.xml} | 5 +- app/src/main/res/layout/log_fragment.xml | 43 +++ app/src/main/res/menu/menu_log.xml | 30 ++ app/src/main/res/values/strings.xml | 15 +- app/src/main/res/values/styles.xml | 2 +- 17 files changed, 432 insertions(+), 35 deletions(-) create mode 100644 app/src/main/res/drawable/ic_delete_black.xml create mode 100644 app/src/main/res/drawable/ic_refresh.xml create mode 100644 app/src/main/res/drawable/ic_save.xml create mode 100644 app/src/main/res/drawable/ic_send.xml delete mode 100644 app/src/main/res/layout/activity_modules.xml rename app/src/main/res/layout/{row.xml => list_item_module.xml} (94%) create mode 100644 app/src/main/res/layout/log_fragment.xml create mode 100644 app/src/main/res/menu/menu_log.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5d0b66b3..0344417bc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,13 +1,17 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + + android:theme="@style/AppTheme" + tools:ignore="AllowBackup,GoogleAppIndexingWarning"> @@ -15,7 +19,9 @@ - + diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index 5036696ad..26997a56b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -2,6 +2,7 @@ package com.topjohnwu.magisk; import android.os.Bundle; import android.os.Handler; +import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; @@ -30,6 +31,9 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView @BindView(R.id.drawer_layout) DrawerLayout drawer; @BindView(R.id.nav_view) NavigationView navigationView; + @IdRes + private int mSelectedId = R.id.modules;// for now + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -51,21 +55,31 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView } }; - drawer.setDrawerListener(toggle); + drawer.addDrawerListener(toggle); toggle.syncState(); - navigationView.setNavigationItemSelectedListener(this); + //noinspection ResourceType + mSelectedId = savedInstanceState == null ? mSelectedId : savedInstanceState.getInt(SELECTED_ITEM_ID); + navigationView.setCheckedItem(mSelectedId); - if (savedInstanceState != null) { + if (savedInstanceState == null) { mDrawerHandler.removeCallbacksAndMessages(null); mDrawerHandler.postDelayed(new Runnable() { @Override public void run() { - navigate(savedInstanceState.getInt(SELECTED_ITEM_ID)); + navigate(mSelectedId); } }, 250); } + navigationView.setNavigationItemSelectedListener(this); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putInt(SELECTED_ITEM_ID, mSelectedId); } @Override @@ -79,7 +93,7 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView @Override public boolean onNavigationItemSelected(@NonNull final MenuItem menuItem) { - menuItem.setChecked(true); + mSelectedId = menuItem.getItemId(); mDrawerHandler.removeCallbacksAndMessages(null); mDrawerHandler.postDelayed(new Runnable() { @Override diff --git a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java index 9446f146a..7245c5c54 100644 --- a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java @@ -27,7 +27,7 @@ public class ModulesAdapter extends RecyclerView.Adapter 0) { + out.write(buffer, 0, len); + } + in.close(); + out.close(); + + Toast.makeText(getActivity(), targetFile.toString(), Toast.LENGTH_LONG).show(); + return targetFile; + } catch (IOException e) { + Toast.makeText(getActivity(), getResources().getString(R.string.logs_save_failed) + "\n" + e.getMessage(), Toast.LENGTH_LONG).show(); + return null; + } + } + + private class LogsReader extends AsyncTask { + + private static final int MAX_LOG_SIZE = 1000 * 1024; // 1000 KB + + private long skipLargeFile(BufferedReader is, long length) throws IOException { + if (length < MAX_LOG_SIZE) + return 0; + + long skipped = length - MAX_LOG_SIZE; + long yetToSkip = skipped; + do { + yetToSkip -= is.skip(yetToSkip); + } while (yetToSkip > 0); + + int c; + do { + c = is.read(); + if (c == -1) + break; + skipped++; + } while (c != '\n'); + + return skipped; + + } + + @Override + protected void onPreExecute() { + Utils.executeCommand("chmod 777 /cache"); + Utils.executeCommand("chmod 777 /cache/magisk.log"); + txtLog.setText(""); + } + + @Override + protected String doInBackground(File... log) { + Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 2); + + StringBuilder llog = new StringBuilder(15 * 10 * 1024); + try { + File logfile = log[0]; + BufferedReader br; + br = new BufferedReader(new FileReader(logfile)); + long skipped = skipLargeFile(br, logfile.length()); + if (skipped > 0) { + llog.append("-----------------\n"); + llog.append("Log too long"); + llog.append("\n-----------------\n\n"); + } + + char[] temp = new char[1024]; + int read; + while ((read = br.read(temp)) > 0) { + llog.append(temp, 0, read); + } + br.close(); + } catch (IOException e) { + llog.append("Cannot read log:\n"); + llog.append(e.getMessage()); + } + + return llog.toString(); + } + + @Override + protected void onPostExecute(String llog) { + progressBar.setVisibility(View.GONE); + txtLog.setText(llog); + + if (llog.length() == 0) + txtLog.setText(R.string.log_is_empty); + } + + } + } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java index a17b970bf..b065db2d2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java @@ -25,7 +25,7 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -public class ModulesFragment extends android.support.v4.app.Fragment { +public class ModulesFragment extends Fragment { private static final String MAGISK_PATH = "/magisk"; private static final String MAGISK_CACHE_PATH = "/cache/magisk"; diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/RootFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/RootFragment.java index 14608b94a..b609325ce 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/RootFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/RootFragment.java @@ -1,4 +1,6 @@ package com.topjohnwu.magisk.ui; -public class RootFragment extends android.support.v4.app.Fragment { +import android.support.v4.app.Fragment; + +public class RootFragment extends Fragment { } diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml index a8d8089bf..830a171b1 100644 --- a/app/src/main/res/drawable/ic_delete.xml +++ b/app/src/main/res/drawable/ic_delete.xml @@ -1,8 +1,8 @@ + android:viewportHeight="24.0" + android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_delete_black.xml b/app/src/main/res/drawable/ic_delete_black.xml new file mode 100644 index 000000000..7de27c6a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 000000000..47859659e --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml new file mode 100644 index 000000000..485fe9fcc --- /dev/null +++ b/app/src/main/res/drawable/ic_save.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 000000000..a55465776 --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_modules.xml b/app/src/main/res/layout/activity_modules.xml deleted file mode 100644 index c844df6d2..000000000 --- a/app/src/main/res/layout/activity_modules.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/row.xml b/app/src/main/res/layout/list_item_module.xml similarity index 94% rename from app/src/main/res/layout/row.xml rename to app/src/main/res/layout/list_item_module.xml index a8b7e07f3..284bf2044 100644 --- a/app/src/main/res/layout/row.xml +++ b/app/src/main/res/layout/list_item_module.xml @@ -1,6 +1,7 @@ - + android:src="@drawable/ic_menu_overflow_material" + tools:ignore="ContentDescription"/> diff --git a/app/src/main/res/layout/log_fragment.xml b/app/src/main/res/layout/log_fragment.xml new file mode 100644 index 000000000..6ca9092d5 --- /dev/null +++ b/app/src/main/res/layout/log_fragment.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_log.xml b/app/src/main/res/menu/menu_log.xml new file mode 100644 index 000000000..1b5c0ea5b --- /dev/null +++ b/app/src/main/res/menu/menu_log.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e376e260d..4c066fc5a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,13 +18,11 @@ Safety Net (Android Pay) should work Magisk v%1$s Samsung do not support switching SELinux status! - Loading... - WelcomeActivity + Loading… Open navigation drawer Close navigation drawer - Settings Root Modules Log @@ -32,4 +30,15 @@ Disable Module will be removed at next reboot Module will be disabled at next reboot + Save to SD + Send + Reload + SD card not found or not writable + Clear log now + Log successfully cleared + Could not clear the log: + Log is empty + Could not write log to SD card: + This feature will not work without permission to write external storage. + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a639011f3..9e0353ff7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -17,7 +17,7 @@ @color/primary 4dp @color/primary_text - @color/secondary_text + @color/primary_text @color/icons From e66496eae72c32bfb1321d5c8bc43d8f19c94bdc Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 21 Aug 2016 17:42:42 +0200 Subject: [PATCH 0012/1036] Small UI improvement --- app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index 26997a56b..d5b64b2ed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -1,5 +1,6 @@ package com.topjohnwu.magisk; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.IdRes; @@ -39,6 +40,9 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); ButterKnife.bind(this); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } setSupportActionBar(toolbar); From c68e37a8c46440d81b002066a7fa0ac2aaf907c6 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Mon, 22 Aug 2016 10:09:36 +0200 Subject: [PATCH 0013/1036] Use libsuperuser lib --- app/build.gradle | 3 +- .../com/topjohnwu/magisk/ui/MainActivity.java | 1 - .../com/topjohnwu/magisk/ui/utils/Utils.java | 24 +- lib/RootCommands/.gitignore | 2 - lib/RootCommands/build.gradle | 20 - lib/RootCommands/src/main/AndroidManifest.xml | 6 - .../rootcommands/Mount.java | 58 -- .../rootcommands/Remounter.java | 189 ----- .../rootcommands/RootCommands.java | 49 -- .../rootcommands/Shell.java | 348 -------- .../rootcommands/SystemCommands.java | 120 --- .../rootcommands/Toolbox.java | 772 ------------------ .../rootcommands/command/Command.java | 170 ---- .../command/ExecutableCommand.java | 65 -- .../rootcommands/command/SimpleCommand.java | 43 - .../command/SimpleExecutableCommand.java | 45 - .../util/BrokenBusyboxException.java | 32 - .../rootcommands/util/Utils.java | 107 --- settings.gradle | 2 +- 19 files changed, 11 insertions(+), 2045 deletions(-) delete mode 100644 lib/RootCommands/.gitignore delete mode 100644 lib/RootCommands/build.gradle delete mode 100644 lib/RootCommands/src/main/AndroidManifest.xml delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Mount.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/SystemCommands.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/ExecutableCommand.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleCommand.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleExecutableCommand.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/BrokenBusyboxException.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java diff --git a/app/build.gradle b/app/build.gradle index ccbc5c99a..ed84c8b87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,10 +22,11 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':lib:RootCommands') compile 'com.android.support:recyclerview-v7:24.2.0' compile 'com.android.support:cardview-v7:24.2.0' compile 'com.android.support:design:24.2.0' + compile 'eu.chainfire:libsuperuser:1.0.0.201607041850' + compile 'com.jakewharton:butterknife:8.2.1' apt 'com.jakewharton:butterknife-compiler:8.2.1' } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java index 78e415df9..5047d681d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java @@ -60,7 +60,6 @@ public class MainActivity extends Activity { magiskVersion.setText(getString(R.string.magisk_version, executeCommand("getprop magisk.version"))); selinuxStatus.setText(selinux); - assert selinux != null; if (selinux.equals("Enforcing")) { selinuxStatus.setTextColor(Color.GREEN); selinuxToggle.setChecked(true); diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java index c36b4eaaf..a61ebfd1d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java @@ -1,28 +1,20 @@ package com.topjohnwu.magisk.ui.utils; -import org.sufficientlysecure.rootcommands.Shell; -import org.sufficientlysecure.rootcommands.command.SimpleCommand; +import java.util.List; -import java.io.IOException; -import java.util.concurrent.TimeoutException; +import eu.chainfire.libsuperuser.Shell; public class Utils { public static String executeCommand(String... commands) { - try { - Shell shell = Shell.startRootShell(); - SimpleCommand command = new SimpleCommand(commands); - shell.add(command).waitForFinish(); + List result = Shell.SU.run(commands); - String output = command.getOutput(); - output = output.replaceAll("\n", ""); - - shell.close(); - - return output; - } catch (IOException | TimeoutException e) { - return ""; + StringBuilder builder = new StringBuilder(); + for (String s : result) { + builder.append(s); } + + return builder.toString(); } } diff --git a/lib/RootCommands/.gitignore b/lib/RootCommands/.gitignore deleted file mode 100644 index 7b00bbcae..000000000 --- a/lib/RootCommands/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build/ -*.iml \ No newline at end of file diff --git a/lib/RootCommands/build.gradle b/lib/RootCommands/build.gradle deleted file mode 100644 index cf69447c3..000000000 --- a/lib/RootCommands/build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -apply plugin: 'com.android.library' -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' - } -} - -android { - compileSdkVersion 24 - buildToolsVersion "24.0.1" - - defaultConfig { - minSdkVersion 7 - targetSdkVersion 24 - } -} - diff --git a/lib/RootCommands/src/main/AndroidManifest.xml b/lib/RootCommands/src/main/AndroidManifest.xml deleted file mode 100644 index 27e53a652..000000000 --- a/lib/RootCommands/src/main/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Mount.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Mount.java deleted file mode 100644 index 30c887bf4..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Mount.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import java.io.File; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -public class Mount { - protected final File mDevice; - protected final File mMountPoint; - protected final String mType; - protected final Set mFlags; - - Mount(File device, File path, String type, String flagsStr) { - mDevice = device; - mMountPoint = path; - mType = type; - mFlags = new HashSet(Arrays.asList(flagsStr.split(","))); - } - - public File getDevice() { - return mDevice; - } - - public File getMountPoint() { - return mMountPoint; - } - - public String getType() { - return mType; - } - - public Set getFlags() { - return mFlags; - } - - @Override - public String toString() { - return String.format("%s on %s type %s %s", mDevice, mMountPoint, mType, mFlags); - } -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java deleted file mode 100644 index 8f20a5608..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Remounter.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import android.util.Log; - -import org.sufficientlysecure.rootcommands.command.SimpleCommand; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.LineNumberReader; -import java.util.ArrayList; -import java.util.Locale; - -//no modifier, this means it is package-private. Only our internal classes can use this. -class Remounter { - - private Shell shell; - - public Remounter(Shell shell) { - super(); - this.shell = shell; - } - - /** - * This will return an ArrayList of the class Mount. The class mount contains the following - * property's: device mountPoint type flags - *

    - * These will provide you with any information you need to work with the mount points. - * - * @return ArrayList an ArrayList of the class Mount. - * @throws Exception if we cannot return the mount points. - */ - protected static ArrayList getMounts() throws Exception { - - final String tempFile = "/data/local/RootToolsMounts"; - - // copy /proc/mounts to tempfile. Directly reading it does not work on 4.3 - Shell shell = Shell.startRootShell(); - Toolbox tb = new Toolbox(shell); - tb.copyFile("/proc/mounts", tempFile, false, false); - tb.setFilePermissions(tempFile, "777"); - shell.close(); - - LineNumberReader lnr = null; - lnr = new LineNumberReader(new FileReader(tempFile)); - String line; - ArrayList mounts = new ArrayList(); - while ((line = lnr.readLine()) != null) { - - Log.d(RootCommands.TAG, line); - - String[] fields = line.split(" "); - mounts.add(new Mount(new File(fields[0]), // device - new File(fields[1]), // mountPoint - fields[2], // fstype - fields[3] // flags - )); - } - lnr.close(); - - return mounts; - } - - /** - * This will take a path, which can contain the file name as well, and attempt to remount the - * underlying partition. - *

    - * For example, passing in the following string: - * "/system/bin/some/directory/that/really/would/never/exist" will result in /system ultimately - * being remounted. However, keep in mind that the longer the path you supply, the more work - * this has to do, and the slower it will run. - * - * @param file file path - * @param mountType mount type: pass in RO (Read only) or RW (Read Write) - * @return a boolean which indicates whether or not the partition has been - * remounted as specified. - */ - protected boolean remount(String file, String mountType) { - - // if the path has a trailing slash get rid of it. - if (file.endsWith("/") && !file.equals("/")) { - file = file.substring(0, file.lastIndexOf("/")); - } - // Make sure that what we are trying to remount is in the mount list. - boolean foundMount = false; - while (!foundMount) { - try { - for (Mount mount : getMounts()) { - Log.d(RootCommands.TAG, mount.getMountPoint().toString()); - - if (file.equals(mount.getMountPoint().toString())) { - foundMount = true; - break; - } - } - } catch (Exception e) { - Log.e(RootCommands.TAG, "Exception", e); - return false; - } - if (!foundMount) { - try { - file = (new File(file).getParent()).toString(); - } catch (Exception e) { - Log.e(RootCommands.TAG, "Exception", e); - return false; - } - } - } - Mount mountPoint = findMountPointRecursive(file); - - Log.d(RootCommands.TAG, "Remounting " + mountPoint.getMountPoint().getAbsolutePath() - + " as " + mountType.toLowerCase(Locale.US)); - final boolean isMountMode = mountPoint.getFlags().contains(mountType.toLowerCase(Locale.US)); - - if (!isMountMode) { - // grab an instance of the internal class - try { - SimpleCommand command = new SimpleCommand("busybox mount -o remount," - + mountType.toLowerCase(Locale.US) + " " + mountPoint.getDevice().getAbsolutePath() - + " " + mountPoint.getMountPoint().getAbsolutePath(), - "toolbox mount -o remount," + mountType.toLowerCase(Locale.US) + " " - + mountPoint.getDevice().getAbsolutePath() + " " - + mountPoint.getMountPoint().getAbsolutePath(), "mount -o remount," - + mountType.toLowerCase(Locale.US) + " " - + mountPoint.getDevice().getAbsolutePath() + " " - + mountPoint.getMountPoint().getAbsolutePath(), - "/system/bin/toolbox mount -o remount," + mountType.toLowerCase(Locale.US) + " " - + mountPoint.getDevice().getAbsolutePath() + " " - + mountPoint.getMountPoint().getAbsolutePath()); - - // execute on shell - shell.add(command).waitForFinish(); - - } catch (Exception e) { - } - - mountPoint = findMountPointRecursive(file); - } - - if (mountPoint != null) { - Log.d(RootCommands.TAG, mountPoint.getFlags() + " AND " + mountType.toLowerCase(Locale.US)); - if (mountPoint.getFlags().contains(mountType.toLowerCase(Locale.US))) { - Log.d(RootCommands.TAG, mountPoint.getFlags().toString()); - return true; - } else { - Log.d(RootCommands.TAG, mountPoint.getFlags().toString()); - } - } else { - Log.d(RootCommands.TAG, "mountPoint is null"); - } - return false; - } - - private Mount findMountPointRecursive(String file) { - try { - ArrayList mounts = getMounts(); - for (File path = new File(file); path != null; ) { - for (Mount mount : mounts) { - if (mount.getMountPoint().equals(path)) { - return mount; - } - } - } - return null; - } catch (IOException e) { - throw new RuntimeException(e); - } catch (Exception e) { - Log.e(RootCommands.TAG, "Exception", e); - } - return null; - } -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java deleted file mode 100644 index a4036e20a..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/RootCommands.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import android.util.Log; - -public class RootCommands { - public static final String TAG = "RootCommands"; - public static boolean DEBUG = false; - public static int DEFAULT_TIMEOUT = 10000; - - /** - * General method to check if user has su binary and accepts root access for this program! - * - * @return true if everything worked - */ - public static boolean rootAccessGiven() { - boolean rootAccess = false; - - try { - Shell rootShell = Shell.startRootShell(); - - Toolbox tb = new Toolbox(rootShell); - if (tb.isRootAccessGiven()) { - rootAccess = true; - } - - rootShell.close(); - } catch (Exception e) { - Log.e(TAG, "Problem while checking for root access!", e); - } - - return rootAccess; - } -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java deleted file mode 100644 index 88a65537c..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Shell.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks, Jeremy Lakeman (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import android.util.Log; - -import org.sufficientlysecure.rootcommands.command.Command; -import org.sufficientlysecure.rootcommands.util.RootAccessDeniedException; -import org.sufficientlysecure.rootcommands.util.Utils; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -public class Shell implements Closeable { - private static final String LD_LIBRARY_PATH = System.getenv("LD_LIBRARY_PATH"); - private static final String token = "F*D^W@#FGF"; - private final Process shellProcess; - private final BufferedReader stdOutErr; - private final DataOutputStream outputStream; - private final List commands = new ArrayList(); - private boolean close = false; - private Runnable inputRunnable = new Runnable() { - public void run() { - try { - writeCommands(); - } catch (IOException e) { - Log.e(RootCommands.TAG, "IO Exception", e); - } - } - }; - private Runnable outputRunnable = new Runnable() { - public void run() { - try { - readOutput(); - } catch (IOException e) { - Log.e(RootCommands.TAG, "IOException", e); - } catch (InterruptedException e) { - Log.e(RootCommands.TAG, "InterruptedException", e); - } - } - }; - - private Shell(String shell, ArrayList customEnv, String baseDirectory) - throws IOException { - Log.d(RootCommands.TAG, "Starting shell: " + shell); - - // start shell process! - shellProcess = Utils.runWithEnv(shell, customEnv, baseDirectory); - - // StdErr is redirected to StdOut, defined in Command.getCommand() - stdOutErr = new BufferedReader(new InputStreamReader(shellProcess.getInputStream())); - outputStream = new DataOutputStream(shellProcess.getOutputStream()); - - outputStream.write("echo Started\n".getBytes()); - outputStream.flush(); - - while (true) { - String line = stdOutErr.readLine(); - if (line == null) - throw new RootAccessDeniedException( - "stdout line is null! Access was denied or this executeable is not a shell!"); - if ("".equals(line)) - continue; - if ("Started".equals(line)) - break; - - destroyShellProcess(); - throw new IOException("Unable to start shell, unexpected output \"" + line + "\""); - } - - new Thread(inputRunnable, "Shell Input").start(); - new Thread(outputRunnable, "Shell Output").start(); - } - - /** - * Start root shell - * - * @param customEnv - * @param baseDirectory - * @return - * @throws IOException - */ - public static Shell startRootShell(ArrayList customEnv, String baseDirectory) - throws IOException { - Log.d(RootCommands.TAG, "Starting Root Shell!"); - - // On some versions of Android (ICS) LD_LIBRARY_PATH is unset when using su - // We need to pass LD_LIBRARY_PATH over su for some commands to work correctly. - if (customEnv == null) { - customEnv = new ArrayList(); - } - customEnv.add("LD_LIBRARY_PATH=" + LD_LIBRARY_PATH); - - Shell shell = new Shell(Utils.getSuPath(), customEnv, baseDirectory); - - return shell; - } - - /** - * Start root shell without custom environment and base directory - * - * @return - * @throws IOException - */ - public static Shell startRootShell() throws IOException { - return startRootShell(null, null); - } - - /** - * Start default sh shell - * - * @param customEnv - * @param baseDirectory - * @return - * @throws IOException - */ - public static Shell startShell(ArrayList customEnv, String baseDirectory) - throws IOException { - Log.d(RootCommands.TAG, "Starting Shell!"); - Shell shell = new Shell("sh", customEnv, baseDirectory); - return shell; - } - - /** - * Start default sh shell without custom environment and base directory - * - * @return - * @throws IOException - */ - public static Shell startShell() throws IOException { - return startShell(null, null); - } - - /** - * Start custom shell defined by shellPath - * - * @param shellPath - * @param customEnv - * @param baseDirectory - * @return - * @throws IOException - */ - public static Shell startCustomShell(String shellPath, ArrayList customEnv, - String baseDirectory) throws IOException { - Log.d(RootCommands.TAG, "Starting Custom Shell!"); - Shell shell = new Shell(shellPath, customEnv, baseDirectory); - - return shell; - } - - /** - * Start custom shell without custom environment and base directory - * - * @param shellPath - * @return - * @throws IOException - */ - public static Shell startCustomShell(String shellPath) throws IOException { - return startCustomShell(shellPath, null, null); - } - - /** - * Destroy shell process considering that the process could already be terminated - */ - private void destroyShellProcess() { - try { - // Yes, this really is the way to check if the process is - // still running. - shellProcess.exitValue(); - } catch (IllegalThreadStateException e) { - // Only call destroy() if the process is still running; - // Calling it for a terminated process will not crash, but - // (starting with at least ICS/4.0) spam the log with INFO - // messages ala "Failed to destroy process" and "kill - // failed: ESRCH (No such process)". - shellProcess.destroy(); - } - - Log.d(RootCommands.TAG, "Shell destroyed"); - } - - /** - * Writes queued commands one after another into the opened shell. After an execution a token is - * written to seperate command output on read - * - * @throws IOException - */ - private void writeCommands() throws IOException { - try { - int commandIndex = 0; - while (true) { - DataOutputStream out; - synchronized (commands) { - while (!close && commandIndex >= commands.size()) { - commands.wait(); - } - out = this.outputStream; - } - if (commandIndex < commands.size()) { - Command next = commands.get(commandIndex); - next.writeCommand(out); - String line = "\necho " + token + " " + commandIndex + " $?\n"; - out.write(line.getBytes()); - out.flush(); - commandIndex++; - } else if (close) { - out.write("\nexit 0\n".getBytes()); - out.flush(); - Log.d(RootCommands.TAG, "Closing shell"); - shellProcess.waitFor(); - out.close(); - return; - } else { - Thread.sleep(50); - } - } - } catch (InterruptedException e) { - Log.e(RootCommands.TAG, "interrupted while writing command", e); - } - } - - /** - * Reads output line by line, seperated by token written after every command - * - * @throws IOException - * @throws InterruptedException - */ - private void readOutput() throws IOException, InterruptedException { - Command command = null; - - // index of current command - int commandIndex = 0; - while (true) { - String lineStdOut = stdOutErr.readLine(); - - // terminate on EOF - if (lineStdOut == null) - break; - - if (command == null) { - - // break on close after last command - if (commandIndex >= commands.size()) { - if (close) - break; - continue; - } - - // get current command - command = commands.get(commandIndex); - } - - int pos = lineStdOut.indexOf(token); - if (pos > 0) { - command.processOutput(lineStdOut.substring(0, pos)); - } - if (pos >= 0) { - lineStdOut = lineStdOut.substring(pos); - String fields[] = lineStdOut.split(" "); - int id = Integer.parseInt(fields[1]); - if (id == commandIndex) { - command.setExitCode(Integer.parseInt(fields[2])); - - // go to next command - commandIndex++; - command = null; - continue; - } - } - command.processOutput(lineStdOut); - } - Log.d(RootCommands.TAG, "Read all output"); - shellProcess.waitFor(); - stdOutErr.close(); - destroyShellProcess(); - - while (commandIndex < commands.size()) { - if (command == null) { - command = commands.get(commandIndex); - } - command.terminated("Unexpected Termination!"); - commandIndex++; - command = null; - } - } - - /** - * Add command to shell queue - * - * @param command - * @return - * @throws IOException - */ - public Command add(Command command) throws IOException { - if (close) - throw new IOException("Unable to add commands to a closed shell"); - synchronized (commands) { - commands.add(command); - // set shell on the command object, to know where the command is running on - command.addedToShell(this, (commands.size() - 1)); - commands.notifyAll(); - } - - return command; - } - - /** - * Close shell - * - * @throws IOException - */ - public void close() throws IOException { - synchronized (commands) { - this.close = true; - commands.notifyAll(); - } - } - - /** - * Returns number of queued commands - * - * @return - */ - public int getCommandsSize() { - return commands.size(); - } - -} \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/SystemCommands.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/SystemCommands.java deleted file mode 100644 index 1fa6b169d..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/SystemCommands.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import android.annotation.TargetApi; -import android.content.ContentResolver; -import android.content.Context; -import android.location.LocationManager; -import android.os.PowerManager; -import android.provider.Settings; - -/** - * This methods work when the apk is installed as a system app (under /system/app) - */ -public class SystemCommands { - Context context; - - public SystemCommands(Context context) { - super(); - this.context = context; - } - - /** - * Get GPS status - */ - public boolean getGPS() { - return ((LocationManager) context.getSystemService(Context.LOCATION_SERVICE)) - .isProviderEnabled(LocationManager.GPS_PROVIDER); - } - - /** - * Enable/Disable GPS - * - * @param value - */ - @TargetApi(8) - public void setGPS(boolean value) { - ContentResolver localContentResolver = context.getContentResolver(); - Settings.Secure.setLocationProviderEnabled(localContentResolver, - LocationManager.GPS_PROVIDER, value); - } - - /** - * TODO: Not ready yet - */ - @TargetApi(8) - public void reboot() { - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - pm.reboot("recovery"); - pm.reboot(null); - - // not working: - // reboot(null); - } - - /** - * Reboot the device immediately, passing 'reason' (may be null) to the underlying __reboot - * system call. Should not return. - * - * Taken from com.android.server.PowerManagerService.reboot - */ - // public void reboot(String reason) { - // - // // final String finalReason = reason; - // Runnable runnable = new Runnable() { - // public void run() { - // synchronized (this) { - // // ShutdownThread.reboot(mContext, finalReason, false); - // try { - // Class clazz = Class.forName("com.android.internal.app.ShutdownThread"); - // - // // if (mReboot) { - // Method method = clazz.getMethod("reboot", Context.class, String.class, - // Boolean.TYPE); - // method.invoke(null, context, null, false); - // - // // if (mReboot) { - // // Method method = clazz.getMethod("reboot", Context.class, String.class, - // // Boolean.TYPE); - // // method.invoke(null, mContext, mReason, mConfirm); - // // } else { - // // Method method = clazz.getMethod("shutdown", Context.class, Boolean.TYPE); - // // method.invoke(null, mContext, mConfirm); - // // } - // } catch (Exception e) { - // e.printStackTrace(); - // } - // } - // - // } - // }; - // // ShutdownThread must run on a looper capable of displaying the UI. - // mHandler.post(runnable); - // - // // PowerManager.reboot() is documented not to return so just wait for the inevitable. - // // synchronized (runnable) { - // // while (true) { - // // try { - // // runnable.wait(); - // // } catch (InterruptedException e) { - // // } - // // } - // // } - // } - -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java deleted file mode 100644 index b36546fbb..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/Toolbox.java +++ /dev/null @@ -1,772 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands; - -import android.os.StatFs; -import android.os.SystemClock; -import android.util.Log; - -import org.sufficientlysecure.rootcommands.command.Command; -import org.sufficientlysecure.rootcommands.command.ExecutableCommand; -import org.sufficientlysecure.rootcommands.command.SimpleCommand; -import org.sufficientlysecure.rootcommands.util.BrokenBusyboxException; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.concurrent.TimeoutException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * All methods in this class are working with Androids toolbox. Toolbox is similar to busybox, but - * normally shipped on every Android OS. You can find toolbox commands on - * https://github.com/CyanogenMod/android_system_core/tree/ics/toolbox - *

    - * This means that these commands are designed to work on every Android OS, with a _working_ toolbox - * binary on it. They don't require busybox! - */ -public class Toolbox { - public static final int REBOOT_HOTREBOOT = 1; - public static final int REBOOT_REBOOT = 2; - public static final int REBOOT_SHUTDOWN = 3; - public static final int REBOOT_RECOVERY = 4; - private Shell shell; - - /** - * All methods in this class are working with Androids toolbox. Toolbox is similar to busybox, - * but normally shipped on every Android OS. - * - * @param shell where to execute commands on - */ - public Toolbox(Shell shell) { - super(); - this.shell = shell; - } - - /** - * Checks if user accepted root access - *

    - * (commands: id) - * - * @return true if user has given root access - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public boolean isRootAccessGiven() throws TimeoutException, IOException { - SimpleCommand idCommand = new SimpleCommand("id"); - shell.add(idCommand).waitForFinish(); - - return idCommand.getOutput().contains("uid=0"); - } - - /** - * This method can be used to kill a running process - *

    - * (commands: ps, kill) - * - * @param processName name of process to kill - * @return true if process was found and killed successfully - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public boolean killAll(String processName) throws TimeoutException, - IOException { - Log.d(RootCommands.TAG, "Killing process " + processName); - - PsCommand psCommand = new PsCommand(processName); - shell.add(psCommand).waitForFinish(); - - // kill processes - if (!psCommand.getPids().isEmpty()) { - // example: kill -9 1234 1222 5343 - SimpleCommand killCommand = new SimpleCommand("kill -9 " - + psCommand.getPidsString()); - shell.add(killCommand).waitForFinish(); - - return killCommand.getExitCode() == 0; - } else { - Log.d(RootCommands.TAG, "No pid found! Nothing was killed!"); - return false; - } - } - - /** - * Kill a running executable - *

    - * See README for more information how to use your own executables! - * - * @param executableName - * @return - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public boolean killAllExecutable(String executableName) throws - TimeoutException, IOException { - return killAll(ExecutableCommand.EXECUTABLE_PREFIX + executableName + ExecutableCommand.EXECUTABLE_SUFFIX); - } - - /** - * This method can be used to to check if a process is running - * - * @param processName name of process to check - * @return true if process was found - * @throws IOException - * @throws BrokenBusyboxException - * @throws TimeoutException (Could not determine if the process is running) - */ - public boolean isProcessRunning(String processName) throws - TimeoutException, IOException { - PsCommand psCommand = new PsCommand(processName); - shell.add(psCommand).waitForFinish(); - - // if pids are available process is running! - return !psCommand.getPids().isEmpty(); - } - - /** - * Checks if binary is running - * - * @param binaryName - * @return - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public boolean isBinaryRunning(String binaryName) throws - TimeoutException, IOException { - return isProcessRunning(ExecutableCommand.EXECUTABLE_PREFIX + binaryName - + ExecutableCommand.EXECUTABLE_SUFFIX); - } - - /** - * @param file String that represent the file, including the full path to the file and its name. - * @return File permissions as String, for example: 777, returns null on error - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public String getFilePermissions(String file) throws TimeoutException, - IOException { - Log.d(RootCommands.TAG, "Checking permissions for " + file); - - String permissions = null; - - if (fileExists(file)) { - Log.d(RootCommands.TAG, file + " was found."); - - LsCommand lsCommand = new LsCommand(file); - shell.add(lsCommand).waitForFinish(); - - permissions = lsCommand.getPermissions(); - } - - return permissions; - } - - /** - * Sets permission of file - * - * @param file absolute path to file - * @param permissions String like 777 - * @return true if command worked - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public boolean setFilePermissions(String file, String permissions) - throws TimeoutException, IOException { - Log.d(RootCommands.TAG, "Set permissions of " + file + " to " + permissions); - - SimpleCommand chmodCommand = new SimpleCommand("chmod " + permissions + " " + file); - shell.add(chmodCommand).waitForFinish(); - - return chmodCommand.getExitCode() == 0; - } - - /** - * This will return a String that represent the symlink for a specified file. - * - * @param file The path to the file to get the Symlink for. (must have absolute path) - * @return A String that represent the symlink for a specified file or null if no symlink - * exists. - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public String getSymlink(String file) throws TimeoutException, - IOException { - Log.d(RootCommands.TAG, "Find symlink for " + file); - - String symlink = null; - - LsCommand lsCommand = new LsCommand(file); - shell.add(lsCommand).waitForFinish(); - - symlink = lsCommand.getSymlink(); - - return symlink; - } - - /** - * Copys a file to a destination. Because cp is not available on all android devices, we use dd - * or cat. - * - * @param source example: /data/data/org.adaway/files/hosts - * @param destination example: /system/etc/hosts - * @param remountAsRw remounts the destination as read/write before writing to it - * @return true if it was successfully copied - * @throws BrokenBusyboxException - * @throws IOException - * @throws TimeoutException - */ - public boolean copyFile(String source, String destination, boolean remountAsRw, - boolean preservePermissions) throws IOException, - TimeoutException { - - /* - * dd can only copy files, but we can not check if the source is a file without invoking - * shell commands, because from Java we probably have no read access, thus we only check if - * they are ending with trailing slashes - */ - if (source.endsWith("/") || destination.endsWith("/")) { - throw new FileNotFoundException("dd can only copy files!"); - } - - // remount destination as read/write before copying to it - if (remountAsRw) { - if (!remount(destination, "RW")) { - Log.d(RootCommands.TAG, - "Remounting failed! There is probably no need to remount this partition!"); - } - } - - // get permissions of source before overwriting - String permissions = null; - if (preservePermissions) { - permissions = getFilePermissions(source); - } - - boolean commandSuccess = false; - - SimpleCommand ddCommand = new SimpleCommand("dd if=" + source + " of=" - + destination); - shell.add(ddCommand).waitForFinish(); - - if (ddCommand.getExitCode() == 0) { - commandSuccess = true; - } else { - // try cat if dd fails - SimpleCommand catCommand = new SimpleCommand("cat " + source + " > " - + destination); - shell.add(catCommand).waitForFinish(); - - if (catCommand.getExitCode() == 0) { - commandSuccess = true; - } - } - - // set back permissions from source to destination - if (preservePermissions) { - setFilePermissions(destination, permissions); - } - - // remount destination back to read only - if (remountAsRw) { - if (!remount(destination, "RO")) { - Log.d(RootCommands.TAG, - "Remounting failed! There is probably no need to remount this partition!"); - } - } - - return commandSuccess; - } - - /** - * Shutdown or reboot device. Possible actions are REBOOT_HOTREBOOT, REBOOT_REBOOT, - * REBOOT_SHUTDOWN, REBOOT_RECOVERY - * - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public void reboot(int action) throws TimeoutException, IOException { - if (action == REBOOT_HOTREBOOT) { - killAll("system_server"); - // or: killAll("zygote"); - } else { - String command; - switch (action) { - case REBOOT_REBOOT: - command = "reboot"; - break; - case REBOOT_SHUTDOWN: - command = "reboot -p"; - break; - case REBOOT_RECOVERY: - command = "reboot recovery"; - break; - default: - command = "reboot"; - break; - } - - SimpleCommand rebootCommand = new SimpleCommand(command); - shell.add(rebootCommand).waitForFinish(); - - if (rebootCommand.getExitCode() == -1) { - Log.e(RootCommands.TAG, "Reboot failed!"); - } - } - } - - /** - * Use this to check whether or not a file exists on the filesystem. - * - * @param file String that represent the file, including the full path to the file and its name. - * @return a boolean that will indicate whether or not the file exists. - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public boolean fileExists(String file) throws TimeoutException, - IOException { - FileExistsCommand fileExistsCommand = new FileExistsCommand(file); - shell.add(fileExistsCommand).waitForFinish(); - - return fileExistsCommand.isFileExists(); - } - - /** - * Execute user defined Java code while having temporary permissions on a file - * - * @param file - * @param withPermissions - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public void withPermission(String file, String permission, WithPermissions withPermissions) - throws TimeoutException, IOException { - String oldPermissions = getFilePermissions(file); - - // set permissions (If set to 666, then Dalvik VM can also write to that file!) - setFilePermissions(file, permission); - - // execute user defined code - withPermissions.whileHavingPermissions(); - - // set back to old permissions - setFilePermissions(file, oldPermissions); - } - - /** - * Execute user defined Java code while having temporary write permissions on a file using chmod - * 666 - * - * @param file - * @param withWritePermissions - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public void withWritePermissions(String file, WithPermissions withWritePermissions) - throws TimeoutException, IOException { - withPermission(file, "666", withWritePermissions); - } - - /** - * Sets system clock using /dev/alarm - * - * @param millis - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public void setSystemClock(final long millis) throws TimeoutException, - IOException { - withWritePermissions("/dev/alarm", new WithPermissions() { - - @Override - void whileHavingPermissions() { - SystemClock.setCurrentTimeMillis(millis); - } - }); - } - - /** - * Adjust system clock by offset using /dev/alarm - * - * @param offset - * @throws BrokenBusyboxException - * @throws TimeoutException - * @throws IOException - */ - public void adjustSystemClock(final long offset) throws - TimeoutException, IOException { - withWritePermissions("/dev/alarm", new WithPermissions() { - - @Override - void whileHavingPermissions() { - SystemClock.setCurrentTimeMillis(System.currentTimeMillis() + offset); - } - }); - } - - /** - * This will take a path, which can contain the file name as well, and attempt to remount the - * underlying partition. - *

    - * For example, passing in the following string: - * "/system/bin/some/directory/that/really/would/never/exist" will result in /system ultimately - * being remounted. However, keep in mind that the longer the path you supply, the more work - * this has to do, and the slower it will run. - * - * @param file file path - * @param mountType mount type: pass in RO (Read only) or RW (Read Write) - * @return a boolean which indicates whether or not the partition has been - * remounted as specified. - */ - public boolean remount(String file, String mountType) { - // Recieved a request, get an instance of Remounter - Remounter remounter = new Remounter(shell); - // send the request - return (remounter.remount(file, mountType)); - } - - /** - * This will tell you how the specified mount is mounted. rw, ro, etc... - * - * @return String What the mount is mounted as. - * @throws Exception if we cannot determine how the mount is mounted. - */ - public String getMountedAs(String path) throws Exception { - ArrayList mounts = Remounter.getMounts(); - if (mounts != null) { - for (Mount mount : mounts) { - if (path.contains(mount.getMountPoint().getAbsolutePath())) { - Log.d(RootCommands.TAG, (String) mount.getFlags().toArray()[0]); - return (String) mount.getFlags().toArray()[0]; - } - } - - throw new Exception(); - } else { - throw new Exception(); - } - } - - /** - * Check if there is enough space on partition where target is located - * - * @param size size of file to put on partition - * @param target path where to put the file - * @return true if it will fit on partition of target, false if it will not fit. - */ - public boolean hasEnoughSpaceOnPartition(String target, long size) { - try { - // new File(target).getFreeSpace() (API 9) is not working on data partition - - // get directory without file - String directory = new File(target).getParent().toString(); - - StatFs stat = new StatFs(directory); - long blockSize = stat.getBlockSize(); - long availableBlocks = stat.getAvailableBlocks(); - long availableSpace = availableBlocks * blockSize; - - Log.i(RootCommands.TAG, "Checking for enough space: Target: " + target - + ", directory: " + directory + " size: " + size + ", availableSpace: " - + availableSpace); - - if (size < availableSpace) { - return true; - } else { - Log.e(RootCommands.TAG, "Not enough space on partition!"); - return false; - } - } catch (Exception e) { - // if new StatFs(directory) fails catch IllegalArgumentException and just return true as - // workaround - Log.e(RootCommands.TAG, "Problem while getting available space on partition!", e); - return true; - } - } - - /** - * TODO: Not tested! - * - * @param toggle - * @throws IOException - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public void toggleAdbDaemon(boolean toggle) throws TimeoutException, - IOException { - SimpleCommand disableAdb = new SimpleCommand("setprop persist.service.adb.enable 0", - "stop adbd"); - SimpleCommand enableAdb = new SimpleCommand("setprop persist.service.adb.enable 1", - "stop adbd", "sleep 1", "start adbd"); - - if (toggle) { - shell.add(enableAdb).waitForFinish(); - } else { - shell.add(disableAdb).waitForFinish(); - } - } - - /** - * This command class gets all pids to a given process name - */ - private class PsCommand extends Command { - private String processName; - private ArrayList pids; - private String psRegex; - private Pattern psPattern; - - public PsCommand(String processName) { - super("ps"); - this.processName = processName; - pids = new ArrayList(); - - /** - * regex to get pid out of ps line, example: - * - *

    -             *  root    24736    1   12140  584   ffffffff 40010d14 S /data/data/org.adaway/files/blank_webserver
    -             * ^\\S \\s ([0-9]+)                          .*                                      processName    $
    -             * 
    - */ - psRegex = "^\\S+\\s+([0-9]+).*" + Pattern.quote(processName) + "$"; - psPattern = Pattern.compile(psRegex); - } - - public ArrayList getPids() { - return pids; - } - - public String getPidsString() { - StringBuilder sb = new StringBuilder(); - for (String s : pids) { - sb.append(s); - sb.append(" "); - } - - return sb.toString(); - } - - @Override - public void output(int id, String line) { - // general check if line contains processName - if (line.contains(processName)) { - Matcher psMatcher = psPattern.matcher(line); - - // try to match line exactly - try { - if (psMatcher.find()) { - String pid = psMatcher.group(1); - // add to pids list - pids.add(pid); - Log.d(RootCommands.TAG, "Found pid: " + pid); - } else { - Log.d(RootCommands.TAG, "Matching in ps command failed!"); - } - } catch (Exception e) { - Log.e(RootCommands.TAG, "Error with regex!", e); - } - } - } - - @Override - public void afterExecution(int id, int exitCode) { - } - - } - - /** - * Ls command to get permissions or symlinks - */ - private class LsCommand extends Command { - private String fileName; - private String permissionRegex; - private Pattern permissionPattern; - private String symlinkRegex; - private Pattern symlinkPattern; - - private String symlink; - private String permissions; - - public LsCommand(String file) { - super("ls -l " + file); - - // get only filename: - this.fileName = (new File(file)).getName(); - Log.d(RootCommands.TAG, "fileName: " + fileName); - - /** - * regex to get pid out of ps line, example: - * - *
    -             * with busybox:
    -             *     lrwxrwxrwx     1 root root            15 Aug 13 12:14 dev/stdin -> /proc/self/fd/0
    -             *
    -             * with toolbox:
    -             *     lrwxrwxrwx root root            15 Aug 13 12:14 stdin -> /proc/self/fd/0
    -             *
    -             * Regex:
    -             * ^.*?(\\S{10})                     .*                                                  $
    -             * 
    - */ - permissionRegex = "^.*?(\\S{10}).*$"; - permissionPattern = Pattern.compile(permissionRegex); - - /** - * regex to get symlink - * - *
    -             *     ->           /proc/self/fd/0
    -             * ^.*?\\-\\> \\s+  (.*)           $
    -             * 
    - */ - symlinkRegex = "^.*?\\-\\>\\s+(.*)$"; - symlinkPattern = Pattern.compile(symlinkRegex); - } - - public String getSymlink() { - return symlink; - } - - public String getPermissions() { - return permissions; - } - - /** - * Converts permission string from ls command to numerical value. Example: -rwxrwxrwx gets - * to 777 - * - * @param permissions - * @return - */ - private String convertPermissions(String permissions) { - int owner = getGroupPermission(permissions.substring(1, 4)); - int group = getGroupPermission(permissions.substring(4, 7)); - int world = getGroupPermission(permissions.substring(7, 10)); - - return "" + owner + group + world; - } - - /** - * Calculates permission for one group - * - * @param permission - * @return value of permission string - */ - private int getGroupPermission(String permission) { - int value = 0; - - if (permission.charAt(0) == 'r') { - value += 4; - } - if (permission.charAt(1) == 'w') { - value += 2; - } - if (permission.charAt(2) == 'x') { - value += 1; - } - - return value; - } - - @Override - public void output(int id, String line) { - // general check if line contains file - if (line.contains(fileName)) { - - // try to match line exactly - try { - Matcher permissionMatcher = permissionPattern.matcher(line); - if (permissionMatcher.find()) { - permissions = convertPermissions(permissionMatcher.group(1)); - - Log.d(RootCommands.TAG, "Found permissions: " + permissions); - } else { - Log.d(RootCommands.TAG, "Permissions were not found in ls command!"); - } - - // try to parse for symlink - Matcher symlinkMatcher = symlinkPattern.matcher(line); - if (symlinkMatcher.find()) { - /* - * TODO: If symlink points to a file in the same directory the path is not - * absolute!!! - */ - symlink = symlinkMatcher.group(1); - Log.d(RootCommands.TAG, "Symlink found: " + symlink); - } else { - Log.d(RootCommands.TAG, "No symlink found!"); - } - } catch (Exception e) { - Log.e(RootCommands.TAG, "Error with regex!", e); - } - } - } - - @Override - public void afterExecution(int id, int exitCode) { - } - - } - - /** - * This command checks if a file exists - */ - private class FileExistsCommand extends Command { - private String file; - private boolean fileExists = false; - - public FileExistsCommand(String file) { - super("ls " + file); - this.file = file; - } - - public boolean isFileExists() { - return fileExists; - } - - @Override - public void output(int id, String line) { - if (line.trim().equals(file)) { - fileExists = true; - } - } - - @Override - public void afterExecution(int id, int exitCode) { - } - - } - - public abstract class WithPermissions { - abstract void whileHavingPermissions(); - } - -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java deleted file mode 100644 index ce02f9ea2..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/Command.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks, Jeremy Lakeman (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.command; - -import android.util.Log; - -import org.sufficientlysecure.rootcommands.RootCommands; -import org.sufficientlysecure.rootcommands.Shell; -import org.sufficientlysecure.rootcommands.util.BrokenBusyboxException; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.concurrent.TimeoutException; - -public abstract class Command { - final String command[]; - boolean finished = false; - boolean brokenBusyboxDetected = false; - int exitCode; - int id; - int timeout = RootCommands.DEFAULT_TIMEOUT; - Shell shell = null; - - public Command(String... command) { - this.command = command; - } - - public Command(int timeout, String... command) { - this.command = command; - this.timeout = timeout; - } - - /** - * This is called from Shell after adding it - * - * @param shell - * @param id - */ - public void addedToShell(Shell shell, int id) { - this.shell = shell; - this.id = id; - } - - /** - * Gets command string executed on the shell - * - * @return - */ - public String getCommand() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < command.length; i++) { - // redirect stderr to stdout - sb.append(command[i] + " 2>&1"); - sb.append('\n'); - } - Log.d(RootCommands.TAG, "Sending command(s): " + sb.toString()); - return sb.toString(); - } - - public void writeCommand(OutputStream out) throws IOException { - out.write(getCommand().getBytes()); - } - - public void processOutput(String line) { - Log.d(RootCommands.TAG, "ID: " + id + ", Output: " + line); - - /* - * Try to detect broken toolbox/busybox binaries (see - * https://code.google.com/p/busybox-android/issues/detail?id=1) - * - * It is giving "Value too large for defined data type" on certain file operations (e.g. ls - * and chown) in certain directories (e.g. /data/data) - */ - if (line.contains("Value too large for defined data type")) { - Log.e(RootCommands.TAG, "Busybox is broken with high probability due to line: " + line); - brokenBusyboxDetected = true; - } - - // now execute specific output parsing - output(id, line); - } - - public abstract void output(int id, String line); - - public void processAfterExecution(int exitCode) { - Log.d(RootCommands.TAG, "ID: " + id + ", ExitCode: " + exitCode); - - afterExecution(id, exitCode); - } - - public abstract void afterExecution(int id, int exitCode); - - public void commandFinished(int id) { - Log.d(RootCommands.TAG, "Command " + id + " finished."); - } - - public void setExitCode(int code) { - synchronized (this) { - exitCode = code; - finished = true; - commandFinished(id); - this.notifyAll(); - } - } - - /** - * Close the shell - * - * @param reason - */ - public void terminate(String reason) { - try { - shell.close(); - Log.d(RootCommands.TAG, "Terminating the shell."); - terminated(reason); - } catch (IOException e) { - } - } - - public void terminated(String reason) { - setExitCode(-1); - Log.d(RootCommands.TAG, "Command " + id + " did not finish, because of " + reason); - } - - /** - * Waits for this command to finish and forwards exitCode into afterExecution method - * - * @throws TimeoutException - * @throws BrokenBusyboxException - */ - public void waitForFinish() throws TimeoutException, BrokenBusyboxException { - synchronized (this) { - while (!finished) { - try { - this.wait(timeout); - } catch (InterruptedException e) { - Log.e(RootCommands.TAG, "InterruptedException in waitForFinish()", e); - } - - if (!finished) { - finished = true; - terminate("Timeout"); - throw new TimeoutException("Timeout has occurred."); - } - } - - if (brokenBusyboxDetected) { - throw new BrokenBusyboxException(); - } - - processAfterExecution(exitCode); - } - } - -} \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/ExecutableCommand.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/ExecutableCommand.java deleted file mode 100644 index 6c008a212..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/ExecutableCommand.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.command; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.os.Build; - -import java.io.File; - -public abstract class ExecutableCommand extends Command { - public static final String EXECUTABLE_PREFIX = "lib"; - public static final String EXECUTABLE_SUFFIX = "_exec.so"; - - /** - * This class provides a way to use your own binaries! - *

    - * Include your own executables, renamed from * to lib*_exec.so, in your libs folder under the - * architecture directories. Now they will be deployed by Android the same way libraries are - * deployed! - *

    - * See README for more information how to use your own executables! - * - * @param context - * @param executableName - * @param parameters - */ - public ExecutableCommand(Context context, String executableName, String parameters) { - super(getLibDirectory(context) + File.separator + EXECUTABLE_PREFIX + executableName - + EXECUTABLE_SUFFIX + " " + parameters); - } - - /** - * Get full path to lib directory of app - * - * @return dir as String - */ - @SuppressLint("NewApi") - private static String getLibDirectory(Context context) { - if (Build.VERSION.SDK_INT >= 9) { - return context.getApplicationInfo().nativeLibraryDir; - } else { - return context.getApplicationInfo().dataDir + File.separator + "lib"; - } - } - - public abstract void output(int id, String line); - - public abstract void afterExecution(int id, int exitCode); - -} \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleCommand.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleCommand.java deleted file mode 100644 index 9049040f0..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.command; - -public class SimpleCommand extends Command { - private StringBuilder sb = new StringBuilder(); - - public SimpleCommand(String... command) { - super(command); - } - - @Override - public void output(int id, String line) { - sb.append(line).append('\n'); - } - - @Override - public void afterExecution(int id, int exitCode) { - } - - public String getOutput() { - return sb.toString(); - } - - public int getExitCode() { - return exitCode; - } - -} \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleExecutableCommand.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleExecutableCommand.java deleted file mode 100644 index 95d2faefb..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/command/SimpleExecutableCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.command; - -import android.content.Context; - -public class SimpleExecutableCommand extends ExecutableCommand { - private StringBuilder sb = new StringBuilder(); - - public SimpleExecutableCommand(Context context, String executableName, String parameters) { - super(context, executableName, parameters); - } - - @Override - public void output(int id, String line) { - sb.append(line).append('\n'); - } - - @Override - public void afterExecution(int id, int exitCode) { - } - - public String getOutput() { - return sb.toString(); - } - - public int getExitCode() { - return exitCode; - } - -} \ No newline at end of file diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/BrokenBusyboxException.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/BrokenBusyboxException.java deleted file mode 100644 index e982b2421..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/BrokenBusyboxException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.util; - -import java.io.IOException; - -public class BrokenBusyboxException extends IOException { - private static final long serialVersionUID = 8337358201589488409L; - - public BrokenBusyboxException() { - super(); - } - - public BrokenBusyboxException(String detailMessage) { - super(detailMessage); - } - -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java deleted file mode 100644 index 1aab0a0a1..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/Utils.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * Copyright (c) 2012 Michael Elsdörfer (Android Autostarts) - * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Adam Shanks (RootTools) - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.util; - -import android.util.Log; - -import org.sufficientlysecure.rootcommands.RootCommands; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Map; - -public class Utils { - /* - * The emulator and ADP1 device both have a su binary in /system/xbin/su, but it doesn't allow - * apps to use it (su app_29 $ su su: uid 10029 not allowed to su). - * - * Cyanogen used to have su in /system/bin/su, in newer versions it's a symlink to - * /system/xbin/su. - * - * The Archos tablet has it in /data/bin/su, since they don't have write access to /system yet. - */ - static final String[] BinaryPlaces = {"/data/bin/", "/system/bin/", "/system/xbin/", "/sbin/", - "/data/local/xbin/", "/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", - "/data/local/"}; - - /** - * Determine the path of the su executable. - *

    - * Code from https://github.com/miracle2k/android-autostarts, use under Apache License was - * agreed by Michael Elsdörfer - */ - public static String getSuPath() { - for (String p : BinaryPlaces) { - File su = new File(p + "su"); - if (su.exists()) { - Log.d(RootCommands.TAG, "su found at: " + p); - return su.getAbsolutePath(); - } else { - Log.v(RootCommands.TAG, "No su in: " + p); - } - } - Log.d(RootCommands.TAG, "No su found in a well-known location, " + "will just use \"su\"."); - return "su"; - } - - /** - * This code is adapted from java.lang.ProcessBuilder.start(). - *

    - * The problem is that Android doesn't allow us to modify the map returned by - * ProcessBuilder.environment(), even though the docstring indicates that it should. This is - * because it simply returns the SystemEnvironment object that System.getenv() gives us. The - * relevant portion in the source code is marked as "// android changed", so presumably it's not - * the case in the original version of the Apache Harmony project. - *

    - * Note that simply passing the environment variables we want to Process.exec won't be good - * enough, since that would override the environment we inherited completely. - *

    - * We needed to be able to set a CLASSPATH environment variable for our new process in order to - * use the "app_process" command directly. Note: "app_process" takes arguments passed on to the - * Dalvik VM as well; this might be an alternative way to set the class path. - *

    - * Code from https://github.com/miracle2k/android-autostarts, use under Apache License was - * agreed by Michael Elsdörfer - */ - public static Process runWithEnv(String command, ArrayList customAddedEnv, - String baseDirectory) throws IOException { - - Map environment = System.getenv(); - String[] envArray = new String[environment.size() - + (customAddedEnv != null ? customAddedEnv.size() : 0)]; - int i = 0; - for (Map.Entry entry : environment.entrySet()) { - envArray[i++] = entry.getKey() + "=" + entry.getValue(); - } - if (customAddedEnv != null) { - for (String entry : customAddedEnv) { - envArray[i++] = entry; - } - } - - Process process; - if (baseDirectory == null) { - process = Runtime.getRuntime().exec(command, envArray, null); - } else { - process = Runtime.getRuntime().exec(command, envArray, new File(baseDirectory)); - } - return process; - } -} diff --git a/settings.gradle b/settings.gradle index 1ae406402..9d495b34f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':lib:RootCommands' \ No newline at end of file +include ':app' \ No newline at end of file From 3ad06c406c8d44b1ef3af03ba15a372560f1a4c9 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Mon, 22 Aug 2016 12:30:13 +0200 Subject: [PATCH 0014/1036] [WIP] Use checkbox and delete button instead of a popup menu --- .../com/topjohnwu/magisk/model/Module.java | 24 +++++-- .../topjohnwu/magisk/rv/ModulesAdapter.java | 45 +++++++++--- .../magisk/ui/BaseModuleFragment.java | 69 ++++++------------- app/src/main/res/drawable/ic_block.xml | 9 --- app/src/main/res/layout/list_item_module.xml | 24 ++++++- app/src/main/res/menu/module_popup.xml | 14 ---- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../util/RootAccessDeniedException.java | 32 --------- .../UnsupportedArchitectureException.java | 30 -------- 10 files changed, 102 insertions(+), 147 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_block.xml delete mode 100644 app/src/main/res/menu/module_popup.xml delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/RootAccessDeniedException.java delete mode 100644 lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/UnsupportedArchitectureException.java diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/model/Module.java index 0d2c89d2c..c358abbc4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/model/Module.java @@ -45,12 +45,28 @@ public class Module { return mDescription; } - public void createRemoveFile() { - Utils.executeCommand("echo \"\" > " + mRemoveFile.getPath()); + public void createDisableFile() { + Utils.executeCommand("touch " + mDisableFile.getPath()); } - public void createDisableFile() { - Utils.executeCommand("echo \"\" > " + mDisableFile.getPath()); + public boolean removeDisableFile() { + return mDisableFile.delete(); + } + + public boolean isEnabled() { + return mDisableFile.exists(); + } + + public void createRemoveFile() { + Utils.executeCommand("touch " + mRemoveFile.getPath()); + } + + public boolean deleteRemoveFile() { + return mRemoveFile.delete(); + } + + public boolean willBeRemoved() { + return mRemoveFile.exists(); } public void parse() throws Exception { diff --git a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java index 7245c5c54..78da35655 100644 --- a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java @@ -4,6 +4,8 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; @@ -18,11 +20,13 @@ import butterknife.ButterKnife; public class ModulesAdapter extends RecyclerView.Adapter { private final List mList; - private final ItemClickListener mListener; + private final ItemClickListener chboxListener; + private final ItemClickListener deleteBtnListener; - public ModulesAdapter(List list, ItemClickListener listener) { + public ModulesAdapter(List list, ItemClickListener chboxListener, ItemClickListener deleteBtnListener) { this.mList = list; - this.mListener = listener; + this.chboxListener = chboxListener; + this.deleteBtnListener = deleteBtnListener; } @Override @@ -34,18 +38,38 @@ public class ModulesAdapter extends RecyclerView.Adapter classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); - Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); - setForceIcons.invoke(menuPopupHelper, true); - break; - } - } - } catch (Exception ignored) { - } - - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.remove: - listModules().get(position).createRemoveFile(); - Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); - break; - case R.id.disable: - listModules().get(position).createDisableFile(); - Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); - break; - } - - return false; - } - }); - popup.inflate(R.menu.module_popup); - popup.show(); - } - }; - @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.single_module_fragment, container, false); ButterKnife.bind(this, view); - recyclerView.setAdapter(new ModulesAdapter(listModules(), moduleActions)); + recyclerView.setAdapter(new ModulesAdapter(listModules(), new ItemClickListener() { + @Override + public void onItemClick(View view, int position) { + CheckBox chbox = (CheckBox) view; + + if (!chbox.isChecked()) { + listModules().get(position).createDisableFile(); + Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); + } else { + listModules().get(position).removeDisableFile(); + Snackbar.make(view, R.string.disable_file_removed, Snackbar.LENGTH_SHORT).show(); + } + } + }, new ItemClickListener() { + @Override + public void onItemClick(View view, int position) { + listModules().get(position).createRemoveFile(); + Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); + } + })); return view; } diff --git a/app/src/main/res/drawable/ic_block.xml b/app/src/main/res/drawable/ic_block.xml deleted file mode 100644 index ea9660ac2..000000000 --- a/app/src/main/res/drawable/ic_block.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/list_item_module.xml b/app/src/main/res/layout/list_item_module.xml index 284bf2044..cc8e8f6b9 100644 --- a/app/src/main/res/layout/list_item_module.xml +++ b/app/src/main/res/layout/list_item_module.xml @@ -64,10 +64,20 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:textIsSelectable="false"/> + + - + + \ No newline at end of file diff --git a/app/src/main/res/menu/module_popup.xml b/app/src/main/res/menu/module_popup.xml deleted file mode 100644 index 2cf1d7804..000000000 --- a/app/src/main/res/menu/module_popup.xml +++ /dev/null @@ -1,14 +0,0 @@ - -

    - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 63eda8419..6656f4156 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,5 +9,6 @@ #757575 #FFFFFF #BDBDBD + #F44336 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4c066fc5a..43951331e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,5 +40,6 @@ Log is empty Could not write log to SD card: This feature will not work without permission to write external storage. + Module will be enabled at next reboot diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/RootAccessDeniedException.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/RootAccessDeniedException.java deleted file mode 100644 index 35f353d1b..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/RootAccessDeniedException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.util; - -import java.io.IOException; - -public class RootAccessDeniedException extends IOException { - private static final long serialVersionUID = 9088998884166225540L; - - public RootAccessDeniedException() { - super(); - } - - public RootAccessDeniedException(String detailMessage) { - super(detailMessage); - } - -} diff --git a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/UnsupportedArchitectureException.java b/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/UnsupportedArchitectureException.java deleted file mode 100644 index 96ad0309e..000000000 --- a/lib/RootCommands/src/main/java/org/sufficientlysecure/rootcommands/util/UnsupportedArchitectureException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2012 Dominik Schürmann - * - * 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. - */ - -package org.sufficientlysecure.rootcommands.util; - -public class UnsupportedArchitectureException extends Exception { - private static final long serialVersionUID = 7826528799780001655L; - - public UnsupportedArchitectureException() { - super(); - } - - public UnsupportedArchitectureException(String detailMessage) { - super(detailMessage); - } - -} From 7eadc74f6c3b3ce71ebb0a94302552370bb20659 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 23 Aug 2016 01:44:34 +0800 Subject: [PATCH 0015/1036] Proper module management --- .../com/topjohnwu/magisk/model/Module.java | 14 +++--- .../com/topjohnwu/magisk/ui/LogFragment.java | 4 +- .../com/topjohnwu/magisk/ui/MainActivity.java | 12 ++--- .../topjohnwu/magisk/ui/ModulesFragment.java | 2 +- .../com/topjohnwu/magisk/ui/utils/Utils.java | 46 ++++++++++++++++++- 5 files changed, 60 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/model/Module.java index c358abbc4..38b425375 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/model/Module.java @@ -46,23 +46,23 @@ public class Module { } public void createDisableFile() { - Utils.executeCommand("touch " + mDisableFile.getPath()); + Utils.su("touch " + mDisableFile.getPath()); } - public boolean removeDisableFile() { - return mDisableFile.delete(); + public void removeDisableFile() { + Utils.su("rm -f " + mDisableFile.getPath()); } public boolean isEnabled() { - return mDisableFile.exists(); + return ! mDisableFile.exists(); } public void createRemoveFile() { - Utils.executeCommand("touch " + mRemoveFile.getPath()); + Utils.su("touch " + mRemoveFile.getPath()); } - public boolean deleteRemoveFile() { - return mRemoveFile.delete(); + public void deleteRemoveFile() { + Utils.su("rm -f " + mRemoveFile.getPath()); } public boolean willBeRemoved() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java index 344a61d24..4616ad4d6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java @@ -226,8 +226,8 @@ public class LogFragment extends Fragment { @Override protected void onPreExecute() { - Utils.executeCommand("chmod 777 /cache"); - Utils.executeCommand("chmod 777 /cache/magisk.log"); + Utils.su("chmod 755 /cache"); + Utils.su("chmod 644 /cache/magisk.log"); txtLog.setText(""); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java index 5047d681d..364027bb7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java @@ -11,7 +11,7 @@ import com.topjohnwu.magisk.R; import java.io.File; -import static com.topjohnwu.magisk.ui.utils.Utils.executeCommand; +import static com.topjohnwu.magisk.ui.utils.Utils.su; public class MainActivity extends Activity { @@ -32,13 +32,13 @@ public class MainActivity extends Activity { safetyNet = (TextView) findViewById(R.id.safety_net); permissive = (TextView) findViewById(R.id.permissive); - suPath = executeCommand("getprop magisk.supath"); + suPath = su("getprop magisk.supath"); updateStatus(); rootToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - executeCommand(b ? "setprop magisk.root 1" : "setprop magisk.root 0"); + su(b ? "setprop magisk.root 1" : "setprop magisk.root 0"); updateStatus(); } }); @@ -46,7 +46,7 @@ public class MainActivity extends Activity { selinuxToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - executeCommand(b ? "setenforce 1" : "setenforce 0"); + su(b ? "setenforce 1" : "setenforce 0"); updateStatus(); } }); @@ -55,9 +55,9 @@ public class MainActivity extends Activity { } private void updateStatus() { - String selinux = executeCommand("getenforce"); + String selinux = su("getenforce"); - magiskVersion.setText(getString(R.string.magisk_version, executeCommand("getprop magisk.version"))); + magiskVersion.setText(getString(R.string.magisk_version, su("getprop magisk.version"))); selinuxStatus.setText(selinux); if (selinux.equals("Enforcing")) { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java index b065db2d2..2b3027803 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java @@ -88,7 +88,7 @@ public class ModulesFragment extends Fragment { } }); - Utils.executeCommand("chmod 777 /cache"); + Utils.su("chmod 755 /cache"); File[] magiskCache = new File(MAGISK_CACHE_PATH).listFiles(new FileFilter() { @Override diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java index a61ebfd1d..48588823f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java @@ -6,8 +6,11 @@ import eu.chainfire.libsuperuser.Shell; public class Utils { - public static String executeCommand(String... commands) { - List result = Shell.SU.run(commands); + public static final String suPath = sh("getprop magisk.supath"); + public static final boolean rootAccess = isRoot(); + + public static String sh(String... commands) { + List result = Shell.SH.run(commands); StringBuilder builder = new StringBuilder(); for (String s : result) { @@ -17,4 +20,43 @@ public class Utils { return builder.toString(); } + public static String su(String... commands) { + List result = Shell.run(Utils.suPath + "/su", commands, null, false); + + StringBuilder builder = new StringBuilder(); + for (String s : result) { + builder.append(s); + } + + Shell.SU.available(); + + return builder.toString(); + } + + public static boolean isRoot() { + String [] availableTestCommands = new String[] {"echo -BOC-", "id"}; + List ret = Shell.run(Utils.suPath + "/su", availableTestCommands, null, false); + if (ret == null) + return false; + + // Taken from libsuperuser + + // this is only one of many ways this can be done + boolean echo_seen = false; + + for (String line : ret) { + if (line.contains("uid=")) { + // id command is working, let's see if we are actually root + return line.contains("uid=0"); + } else if (line.contains("-BOC-")) { + // if we end up here, at least the su command starts some kind + // of shell, let's hope it has root privileges - no way to know without + // additional native binaries + echo_seen = true; + } + } + + return echo_seen; + } + } From 36c575023eae67bba30690c49e641f8344b80e50 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 23 Aug 2016 03:50:46 +0800 Subject: [PATCH 0016/1036] Remove unnecessary root calls --- app/src/main/AndroidManifest.xml | 12 +++++------ .../com/topjohnwu/magisk/WelcomeActivity.java | 4 ++++ .../com/topjohnwu/magisk/ui/LogFragment.java | 10 +++++++-- .../topjohnwu/magisk/ui/ModulesFragment.java | 10 +++++++-- .../com/topjohnwu/magisk/ui/utils/Utils.java | 21 ++++++++++++++++--- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0344417bc..007ea3fdc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,13 +12,13 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="AllowBackup,GoogleAppIndexingWarning"> - - - + + + - - - + + + diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index d5b64b2ed..141f2329a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -19,6 +19,7 @@ import android.view.View; import com.topjohnwu.magisk.ui.LogFragment; import com.topjohnwu.magisk.ui.ModulesFragment; import com.topjohnwu.magisk.ui.RootFragment; +import com.topjohnwu.magisk.ui.utils.Utils; import butterknife.BindView; import butterknife.ButterKnife; @@ -44,6 +45,9 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + Utils.initialize.execute(); + + setSupportActionBar(toolbar); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java index 4616ad4d6..a5235d785 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java @@ -35,6 +35,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.util.Calendar; +import java.util.concurrent.ExecutionException; import butterknife.BindView; import butterknife.ButterKnife; @@ -226,13 +227,18 @@ public class LogFragment extends Fragment { @Override protected void onPreExecute() { - Utils.su("chmod 755 /cache"); - Utils.su("chmod 644 /cache/magisk.log"); txtLog.setText(""); } @Override protected String doInBackground(File... log) { + // Ensure initialize is done + try { + Utils.initialize.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 2); StringBuilder llog = new StringBuilder(15 * 10 * 1024); diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java index 2b3027803..4dee33a3b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; import butterknife.BindView; import butterknife.ButterKnife; @@ -81,6 +82,13 @@ public class ModulesFragment extends Fragment { @Override protected Boolean doInBackground(Void... voids) { + // Ensure initialize is done + try { + Utils.initialize.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + File[] magisk = new File(MAGISK_PATH).listFiles(new FileFilter() { @Override public boolean accept(File file) { @@ -88,8 +96,6 @@ public class ModulesFragment extends Fragment { } }); - Utils.su("chmod 755 /cache"); - File[] magiskCache = new File(MAGISK_CACHE_PATH).listFiles(new FileFilter() { @Override public boolean accept(File file) { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java index 48588823f..f4572f487 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/utils/Utils.java @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.ui.utils; +import android.os.AsyncTask; + import java.util.List; import eu.chainfire.libsuperuser.Shell; @@ -7,7 +9,22 @@ import eu.chainfire.libsuperuser.Shell; public class Utils { public static final String suPath = sh("getprop magisk.supath"); - public static final boolean rootAccess = isRoot(); + public static boolean rootAccess = false; + public static Init initialize = new Init(); + + public static class Init extends AsyncTask { + + @Override + protected Void doInBackground(Void... voids) { + // Check root access + rootAccess = isRoot(); + // Permission for java code to read /cache files + if (rootAccess) { + su("chmod 755 /cache", "chmod 644 /cache/magisk.log"); + } + return null; + } + } public static String sh(String... commands) { List result = Shell.SH.run(commands); @@ -28,8 +45,6 @@ public class Utils { builder.append(s); } - Shell.SU.available(); - return builder.toString(); } From 7bf83371d52cc8c8f62a51ab67bd177e38cff0c4 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 23 Aug 2016 05:18:28 +0800 Subject: [PATCH 0017/1036] Add root fragment and refactor --- app/src/main/AndroidManifest.xml | 7 --- .../magisk/{ui => }/BaseModuleFragment.java | 4 +- .../magisk/{ui => }/LogFragment.java | 6 +-- .../magisk/{ui => }/ModulesFragment.java | 32 ++++++------ .../MainActivity.java => RootFragment.java} | 51 ++++++++++--------- .../com/topjohnwu/magisk/WelcomeActivity.java | 35 +++++++++++-- .../magisk/{model => module}/Module.java | 4 +- .../topjohnwu/magisk/rv/ModulesAdapter.java | 7 ++- .../com/topjohnwu/magisk/ui/RootFragment.java | 6 --- .../magisk/{ui => }/utils/Utils.java | 31 ++--------- .../{activity_main.xml => root_fragment.xml} | 12 +---- app/src/main/res/values/strings.xml | 1 + 12 files changed, 92 insertions(+), 104 deletions(-) rename app/src/main/java/com/topjohnwu/magisk/{ui => }/BaseModuleFragment.java (96%) rename app/src/main/java/com/topjohnwu/magisk/{ui => }/LogFragment.java (98%) rename app/src/main/java/com/topjohnwu/magisk/{ui => }/ModulesFragment.java (85%) rename app/src/main/java/com/topjohnwu/magisk/{ui/MainActivity.java => RootFragment.java} (67%) rename app/src/main/java/com/topjohnwu/magisk/{model => module}/Module.java (96%) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/RootFragment.java rename app/src/main/java/com/topjohnwu/magisk/{ui => }/utils/Utils.java (66%) rename app/src/main/res/layout/{activity_main.xml => root_fragment.xml} (92%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 007ea3fdc..e5e871072 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,13 +12,6 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="AllowBackup,GoogleAppIndexingWarning"> - - - - - - - diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java b/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java similarity index 96% rename from app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java rename to app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java index e7465c2a6..4a418b89e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui; +package com.topjohnwu.magisk; import android.os.Bundle; import android.support.annotation.Nullable; @@ -11,7 +11,7 @@ import android.view.ViewGroup; import android.widget.CheckBox; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.model.Module; +import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.rv.ItemClickListener; import com.topjohnwu.magisk.rv.ModulesAdapter; diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java similarity index 98% rename from app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java rename to app/src/main/java/com/topjohnwu/magisk/LogFragment.java index a5235d785..581db13b3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/LogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui; +package com.topjohnwu.magisk; import android.Manifest; import android.annotation.SuppressLint; @@ -26,7 +26,7 @@ import android.widget.TextView; import android.widget.Toast; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.ui.utils.Utils; +import com.topjohnwu.magisk.WelcomeActivity; import java.io.BufferedReader; import java.io.File; @@ -234,7 +234,7 @@ public class LogFragment extends Fragment { protected String doInBackground(File... log) { // Ensure initialize is done try { - Utils.initialize.get(); + WelcomeActivity.initialize.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java similarity index 85% rename from app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java rename to app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index 4dee33a3b..67e5018dd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui; +package com.topjohnwu.magisk; import android.os.AsyncTask; import android.os.Bundle; @@ -13,9 +13,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; -import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.model.Module; -import com.topjohnwu.magisk.ui.utils.Utils; +import com.topjohnwu.magisk.module.Module; import java.io.File; import java.io.FileFilter; @@ -31,7 +29,7 @@ public class ModulesFragment extends Fragment { private static final String MAGISK_PATH = "/magisk"; private static final String MAGISK_CACHE_PATH = "/cache/magisk"; - private static List listModulesNoCache = new ArrayList<>(); + private static List listModules = new ArrayList<>(); private static List listModulesCache = new ArrayList<>(); @BindView(R.id.progressBar) ProgressBar progressBar; @@ -42,8 +40,8 @@ public class ModulesFragment extends Fragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + listModules.clear(); listModulesCache.clear(); - listModulesNoCache.clear(); } @Nullable @@ -60,11 +58,11 @@ public class ModulesFragment extends Fragment { return view; } - public static class NoCacheModuleFragment extends BaseModuleFragment { + public static class NormalModuleFragment extends BaseModuleFragment { @Override protected List listModules() { - return listModulesNoCache; + return listModules; } } @@ -78,13 +76,13 @@ public class ModulesFragment extends Fragment { } - private class CheckFolders extends AsyncTask { + private class CheckFolders extends AsyncTask { @Override - protected Boolean doInBackground(Void... voids) { + protected Void doInBackground(Void... voids) { // Ensure initialize is done try { - Utils.initialize.get(); + WelcomeActivity.initialize.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } @@ -109,7 +107,7 @@ public class ModulesFragment extends Fragment { if (m.isValid()) { try { m.parse(); - listModulesNoCache.add(m); + listModules.add(m); } catch (Exception ignored) { } } @@ -129,12 +127,12 @@ public class ModulesFragment extends Fragment { } } - return true; + return null; } @Override - protected void onPostExecute(Boolean result) { - super.onPostExecute(result); + protected void onPostExecute(Void v) { + super.onPostExecute(v); progressBar.setVisibility(View.GONE); } @@ -143,7 +141,7 @@ public class ModulesFragment extends Fragment { private class TabsAdapter extends FragmentPagerAdapter { String[] tabTitles = new String[]{ - "_no_cache", "_cache" + "Modules", "Cache Modules" // TODO stringify }; @@ -164,7 +162,7 @@ public class ModulesFragment extends Fragment { @Override public Fragment getItem(int position) { if (position == 0) { - return new NoCacheModuleFragment(); + return new NormalModuleFragment(); } else { return new CacheModuleFragment(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java similarity index 67% rename from app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java rename to app/src/main/java/com/topjohnwu/magisk/RootFragment.java index 364027bb7..28779f8ad 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java @@ -1,44 +1,45 @@ -package com.topjohnwu.magisk.ui; +package com.topjohnwu.magisk; -import android.app.Activity; import android.graphics.Color; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.utils.Utils; import java.io.File; -import static com.topjohnwu.magisk.ui.utils.Utils.su; - -public class MainActivity extends Activity { +public class RootFragment extends Fragment { private Switch rootToggle, selinuxToggle; private TextView magiskVersion, rootStatus, selinuxStatus, safetyNet, permissive; - private String suPath; + @Nullable @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.root_fragment, container, false); - magiskVersion = (TextView) findViewById(R.id.magisk_version); - rootToggle = (Switch) findViewById(R.id.root_toggle); - selinuxToggle = (Switch) findViewById(R.id.selinux_toggle); - rootStatus = (TextView) findViewById(R.id.root_status); - selinuxStatus = (TextView) findViewById(R.id.selinux_status); - safetyNet = (TextView) findViewById(R.id.safety_net); - permissive = (TextView) findViewById(R.id.permissive); + magiskVersion = (TextView) view.findViewById(R.id.magisk_version); + rootToggle = (Switch) view.findViewById(R.id.root_toggle); + selinuxToggle = (Switch) view.findViewById(R.id.selinux_toggle); + rootStatus = (TextView) view.findViewById(R.id.root_status); + selinuxStatus = (TextView) view.findViewById(R.id.selinux_status); + safetyNet = (TextView) view.findViewById(R.id.safety_net); + permissive = (TextView) view.findViewById(R.id.permissive); - suPath = su("getprop magisk.supath"); updateStatus(); rootToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - su(b ? "setprop magisk.root 1" : "setprop magisk.root 0"); + Utils.su(b ? "setprop magisk.root 1" : "setprop magisk.root 0"); updateStatus(); } }); @@ -46,18 +47,19 @@ public class MainActivity extends Activity { selinuxToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - su(b ? "setenforce 1" : "setenforce 0"); + Utils.su(b ? "setenforce 1" : "setenforce 0"); updateStatus(); } }); - //findViewById(R.id.modules).setOnClickListener(view -> startActivity(new Intent(this, ModulesActivity.class))); + return view; } private void updateStatus() { - String selinux = su("getenforce"); + String selinux = Utils.sh("getenforce"); + String version = Utils.sh("getprop magisk.version"); - magiskVersion.setText(getString(R.string.magisk_version, su("getprop magisk.version"))); + magiskVersion.setText(getString(R.string.magisk_version, version)); selinuxStatus.setText(selinux); if (selinux.equals("Enforcing")) { @@ -82,7 +84,7 @@ public class MainActivity extends Activity { safetyNet.setTextColor(Color.RED); rootToggle.setChecked(true); - if (!new File(suPath + "/su").exists()) { + if (!Utils.rootAccess) { rootStatus.setText(R.string.root_system); safetyNet.setText(R.string.root_system_info); rootToggle.setEnabled(false); @@ -96,7 +98,7 @@ public class MainActivity extends Activity { safetyNet.setTextColor(Color.GREEN); rootToggle.setChecked(false); - if (!new File(suPath + "/su").exists()) { + if (!Utils.rootAccess) { rootStatus.setText(R.string.root_none); safetyNet.setText(R.string.root_none_info); rootToggle.setEnabled(false); @@ -107,5 +109,4 @@ public class MainActivity extends Activity { } } } - } diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index 141f2329a..01a86f12a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -1,11 +1,13 @@ package com.topjohnwu.magisk; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; +import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; @@ -16,10 +18,7 @@ import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; -import com.topjohnwu.magisk.ui.LogFragment; -import com.topjohnwu.magisk.ui.ModulesFragment; -import com.topjohnwu.magisk.ui.RootFragment; -import com.topjohnwu.magisk.ui.utils.Utils; +import com.topjohnwu.magisk.utils.Utils; import butterknife.BindView; import butterknife.ButterKnife; @@ -28,6 +27,8 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID"; private final Handler mDrawerHandler = new Handler(); + public static Init initialize = new Init(); + public static View view; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.drawer_layout) DrawerLayout drawer; @@ -36,16 +37,40 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView @IdRes private int mSelectedId = R.id.modules;// for now + public static class Init extends AsyncTask { + + @Override + protected Void doInBackground(Void... voids) { + // Check root access + Utils.checkRoot(); + // Permission for java code to read /cache files + if (Utils.rootAccess) { + Utils.su("chmod 755 /cache", "chmod 644 /cache/magisk.log"); + } + return null; + } + + @Override + protected void onPostExecute(Void v) { + super.onPostExecute(v); + + if (!Utils.rootAccess) { + Snackbar.make(view, R.string.no_root_access, Snackbar.LENGTH_LONG).show(); + } + } + } + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); + view = findViewById(R.id.toolbar); ButterKnife.bind(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } - Utils.initialize.execute(); + initialize.execute(); setSupportActionBar(toolbar); diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/module/Module.java similarity index 96% rename from app/src/main/java/com/topjohnwu/magisk/model/Module.java rename to app/src/main/java/com/topjohnwu/magisk/module/Module.java index 38b425375..4c6dbec4e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/Module.java @@ -1,6 +1,6 @@ -package com.topjohnwu.magisk.model; +package com.topjohnwu.magisk.module; -import com.topjohnwu.magisk.ui.utils.Utils; +import com.topjohnwu.magisk.utils.Utils; import java.io.BufferedReader; import java.io.File; diff --git a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java index 78da35655..191c909b4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/rv/ModulesAdapter.java @@ -10,7 +10,8 @@ import android.widget.ImageView; import android.widget.TextView; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.model.Module; +import com.topjohnwu.magisk.module.Module; +import com.topjohnwu.magisk.utils.Utils; import java.util.List; @@ -92,6 +93,10 @@ public class ModulesAdapter extends RecyclerView.Adapter { - - @Override - protected Void doInBackground(Void... voids) { - // Check root access - rootAccess = isRoot(); - // Permission for java code to read /cache files - if (rootAccess) { - su("chmod 755 /cache", "chmod 644 /cache/magisk.log"); - } - return null; - } - } public static String sh(String... commands) { List result = Shell.SH.run(commands); @@ -48,30 +30,27 @@ public class Utils { return builder.toString(); } - public static boolean isRoot() { + public static void checkRoot() { String [] availableTestCommands = new String[] {"echo -BOC-", "id"}; List ret = Shell.run(Utils.suPath + "/su", availableTestCommands, null, false); if (ret == null) - return false; + return; // Taken from libsuperuser // this is only one of many ways this can be done - boolean echo_seen = false; for (String line : ret) { if (line.contains("uid=")) { // id command is working, let's see if we are actually root - return line.contains("uid=0"); + rootAccess = line.contains("uid=0"); } else if (line.contains("-BOC-")) { // if we end up here, at least the su command starts some kind // of shell, let's hope it has root privileges - no way to know without // additional native binaries - echo_seen = true; + rootAccess = true; } } - - return echo_seen; } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/root_fragment.xml similarity index 92% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/root_fragment.xml index 5ef991c60..b9ef7dca2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/root_fragment.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:focusableInTouchMode="true" - tools:context=".ui.MainActivity"> + android:layout_marginTop="?attr/actionBarSize" + android:focusableInTouchMode="true"> -