mirror of
				https://github.com/topjohnwu/Magisk
				synced 2025-10-30 09:00:52 +01:00 
			
		
		
		
	Compare commits
	
		
			192 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | cfe32f1a70 | ||
|   | d877f5d5c6 | ||
|   | 0ab6ffefb4 | ||
|   | a292a1d23a | ||
|   | 3f87f6aee3 | ||
|   | 04bcd145d3 | ||
|   | 244e811291 | ||
|   | ac7467fb59 | ||
|   | 2c0436216f | ||
|   | 017fbf267b | ||
|   | e6afbf2ec0 | ||
|   | 906b4aad9e | ||
|   | 4cf8d41f6a | ||
|   | 47c860142e | ||
|   | 2fba3f213b | ||
|   | af7c6f9fce | ||
|   | 78534deab6 | ||
|   | 6710314832 | ||
|   | 0cd4fa6fa0 | ||
|   | 065949496e | ||
|   | 39c82576ae | ||
|   | 37221a508d | ||
|   | 6b43a32a10 | ||
|   | d7cd1ff142 | ||
|   | 659d947863 | ||
|   | 39be7a6288 | ||
|   | 8ac976c579 | ||
|   | 70fd432c57 | ||
|   | 00135f2f49 | ||
|   | 9b944bc29c | ||
|   | d520b3d2a0 | ||
|   | 6f41d9855b | ||
|   | 2d7c1da741 | ||
|   | c0f45b6b1e | ||
|   | 7a0025673c | ||
|   | ad7ec79903 | ||
|   | 0543239cca | ||
|   | ff3dad2457 | ||
|   | 298d5e197b | ||
|   | d73c0a998d | ||
|   | 1b79a3ddbf | ||
|   | a8478ace18 | ||
|   | 72cf5f3f9f | ||
|   | 6f9d493a18 | ||
|   | 08f7d5ebff | ||
|   | 1fe3675403 | ||
|   | a0f956d2c1 | ||
|   | 1560f91b4a | ||
|   | c20f362594 | ||
|   | 7ae8c26e50 | ||
|   | adfffe6121 | ||
|   | 64601baa76 | ||
|   | aa374b51f1 | ||
|   | 5c483745ff | ||
|   | 0c247110a0 | ||
|   | 1643638a78 | ||
|   | 4ace228fc2 | ||
|   | 25aa86a0dc | ||
|   | 70d3b24338 | ||
|   | 8664e9d19b | ||
|   | 50d9877446 | ||
|   | fe06352089 | ||
|   | 7b599419b5 | ||
|   | 491adf072e | ||
|   | f6aae2b048 | ||
|   | d2d5c94633 | ||
|   | 10581f9ef2 | ||
|   | c7e0e1c038 | ||
|   | a914d701eb | ||
|   | 0f9dee6e9c | ||
|   | aa383e2190 | ||
|   | 9bbfcf326c | ||
|   | 3948e67c8f | ||
|   | d56e1b2cc5 | ||
|   | bfac1f1bc2 | ||
|   | d4a956c355 | ||
|   | 6c71fefa58 | ||
|   | ad3003c00a | ||
|   | 0ad5dcb258 | ||
|   | d790309b02 | ||
|   | 1072faf309 | ||
|   | d2c196896d | ||
|   | e42b608444 | ||
|   | 89a501a3af | ||
|   | c19b78180c | ||
|   | c0b750a09a | ||
|   | c967e618a1 | ||
|   | 59f78d7dfc | ||
|   | d8405f0d05 | ||
|   | 0f34f0033c | ||
|   | 190646d50c | ||
|   | a46c6252c6 | ||
|   | 5c1886c8f5 | ||
|   | afcb3d8f34 | ||
|   | 9fbffafdbf | ||
|   | 075f0458f7 | ||
|   | d4568aa0a7 | ||
|   | 97588408a2 | ||
|   | 1def9b301b | ||
|   | 5bac442b18 | ||
|   | 6add682705 | ||
|   | 8b50d84a05 | ||
|   | d3858b81e2 | ||
|   | bdff9769be | ||
|   | c61df75e5e | ||
|   | a74bf2cc27 | ||
|   | ada0f93686 | ||
|   | ff36f2ba17 | ||
|   | 5164cfd399 | ||
|   | 5fa021503e | ||
|   | 7b5d79d313 | ||
|   | 3e3f38500d | ||
|   | 5109b9abfd | ||
|   | 7fb4777c1c | ||
|   | c38533e0f8 | ||
|   | 51ba99d09e | ||
|   | 9159f86a9e | ||
|   | e139f4fc13 | ||
|   | 2fbfeacb87 | ||
|   | ebb7a9fcda | ||
|   | 9e72317302 | ||
|   | d764c20c08 | ||
|   | 9c17b8a098 | ||
|   | 3084873154 | ||
|   | 32809e56d0 | ||
|   | 9f05b182a2 | ||
|   | 525484e834 | ||
|   | 65a4e69cae | ||
|   | e973f8bab9 | ||
|   | 92466671ff | ||
|   | 6d61106070 | ||
|   | ac13749fb8 | ||
|   | 7ec1a9a316 | ||
|   | cf17e21ad3 | ||
|   | 0e0240c4ab | ||
|   | d1b290b91a | ||
|   | a63696836c | ||
|   | 46aad00f16 | ||
|   | 252afe8932 | ||
|   | 9dd467a613 | ||
|   | 4c14df67cc | ||
|   | 20e0fe3ba1 | ||
|   | 6a005135f2 | ||
|   | 82e8375957 | ||
|   | bb25edc09e | ||
|   | 169c0fe4af | ||
|   | cd6918e6eb | ||
|   | 5be035fd44 | ||
|   | f1edc8443c | ||
|   | d9564bd04c | ||
|   | 35f1c396f2 | ||
|   | 6acb950990 | ||
|   | 27e0d1641a | ||
|   | 9ac71ff8af | ||
|   | 075737a4ec | ||
|   | 6d0e4a6a5e | ||
|   | a2544768a0 | ||
|   | 8574a14ed2 | ||
|   | e90c555c18 | ||
|   | 863b9a410f | ||
|   | 23c7bbc7d5 | ||
|   | f900189f90 | ||
|   | 7c74be2790 | ||
|   | 70dd2d4829 | ||
|   | 914b7ee056 | ||
|   | e39f83edbf | ||
|   | 52fe0c6abb | ||
|   | 5cb3e5937f | ||
|   | e0cd224831 | ||
|   | de225ac64a | ||
|   | 5807808a10 | ||
|   | 362877d18f | ||
|   | 88b8dd0149 | ||
|   | 1552f32e09 | ||
|   | 50b73a6720 | ||
|   | 53e51f1735 | ||
|   | 40b63bfebe | ||
|   | 89861eceef | ||
|   | b8eaff66fa | ||
|   | a747fdd27d | ||
|   | 27851bdefa | ||
|   | 3fdeb40ddf | ||
|   | 546c7cebd3 | ||
|   | 473902f5f4 | ||
|   | 41c0721159 | ||
|   | 413d4badfd | ||
|   | c5d67ebf72 | ||
|   | 91818cfa1a | ||
|   | 6263d684d9 | ||
|   | 07140d33a7 | ||
|   | 4ffc388491 | ||
|   | 0ef026c610 | 
							
								
								
									
										61
									
								
								README.MD
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README.MD
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| # Magisk | ||||
| [XDA Announcement Thread](https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445) | ||||
|  | ||||
| ## Building Environment Requirements | ||||
|  | ||||
| 1. Python 3.5+: run `build.py` script | ||||
| 2. Java Development Kit (JDK) 8: Compile Magisk Manager and sign zips | ||||
| 3. Latest Android SDK: set `ANDROID_HOME` environment variable to the path to Android SDK | ||||
| @@ -9,11 +9,19 @@ | ||||
| 5. (Windows Only) Python package Colorama: Install with `pip install colorama`, used for ANSI color codes | ||||
|  | ||||
| ## Building Notes and Instructions | ||||
| 1. Building is tested on macOS, Ubuntu, and Windows 10 using the latest stable NDK and NDK r10e. Officially released binaries were built with NDK r10e. | ||||
| 2. Set configurations in `config.prop`. A sample file `config.prop.sample` is provided as an example. | ||||
| 3. Run `build.py` with argument `-h` to see the built-in help message. The `-h` option also works for each supported actions, e.g. `./build.py binary -h` | ||||
| 4. By default, `build.py` build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the `--release` flag), you need a Java Keystore file `release-key.jks` to sign Magisk Manager's APK. For more information, check out [Google's Official Documentation](https://developer.android.com/studio/publish/app-signing.html#signing-manually). | ||||
| 5. The SafetyNet extension pack requires the full Magisk Manager as a `compileOnly` dependency. Build the **release** APK, convert it back to Java `.class` files (I use [dex2jar](https://github.com/pxb1988/dex2jar)), and place the converted JAR under `snet/libs` before compiling. | ||||
| 1. Clone sources with submodules: `git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git` | ||||
| 2. Building is supported on macOS, Linux, and Windows. Official releases are built and tested with [FrankeNDK](https://github.com/topjohnwu/FrankeNDK); point `ANDROID_NDK_HOME` to FrankeNDK if you want to use it for compiling. | ||||
| 3. Set configurations in `config.prop`. A sample file `config.prop.sample` is provided as an example. | ||||
| 4. Run `build.py` with argument `-h` to see the built-in help message. The `-h` option also works for each supported actions, e.g. `./build.py binary -h` | ||||
| 5. By default, `build.py` build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the `-r, --release` flag), you need a Java Keystore file `release-key.jks` (only `JKS` format is supported) to sign APKs and zips. For more information, check out [Google's Official Documentation](https://developer.android.com/studio/publish/app-signing.html#signing-manually). | ||||
|  | ||||
| ## Bug Reports | ||||
| **Make sure to install the latest [Canary Build](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337) before reporting any bugs!** Please **DO NOT** report bugs that is already fixed upstream. | ||||
|  | ||||
| Follow the instructions in the [Canary Channel XDA Thread](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337), and report a bug either by opening an issue on GitHub or directly in the thread. | ||||
|  | ||||
| ## Documentation | ||||
| [Link to Documentation](docs/README.MD) | ||||
|  | ||||
| ## License | ||||
|  | ||||
| @@ -31,44 +39,3 @@ GNU General Public License for more details. | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| ``` | ||||
|  | ||||
| ## Credits | ||||
|  | ||||
| **MagiskManager** (`app`) | ||||
|  | ||||
| * Copyright 2016-2018, John Wu (@topjohnwu) | ||||
| * All contributors and translators on Github | ||||
|  | ||||
| **MagiskSU** (`native/jni/su`) | ||||
|  | ||||
| * Copyright 2016-2018, John Wu (@topjohnwu) | ||||
| * Copyright 2015, Pierre-Hugues Husson (phh@phh.me) | ||||
| * Copyright 2013, Koushik Dutta (@koush) | ||||
| * Copyright 2010, Adam Shanks (@ChainsDD) | ||||
| * Copyright 2008, Zinx Verituse (@zinxv) | ||||
|  | ||||
| **MagiskPolicy** (`native/jni/magiskpolicy`) | ||||
|  | ||||
| * Copyright 2016-2018, John Wu (@topjohnwu) | ||||
| * Copyright 2015, Pierre-Hugues Husson (phh@phh.me) | ||||
| * Copyright 2015, Joshua Brindle (@joshua_brindle) | ||||
|  | ||||
| **MagiskHide** (`native/jni/magiskhide`) | ||||
|  | ||||
| * Copyright 2016-2018, John Wu (@topjohnwu) | ||||
| * Copyright 2016, Pierre-Hugues Husson (phh@phh.me) | ||||
|  | ||||
| **resetprop** (`native/jni/resetprop`) | ||||
|  | ||||
|  * Copyright 2016-2018 John Wu (@topjohnwu) | ||||
|  * Copyright 2016 nkk71 (nkk71x@gmail.com) | ||||
|  | ||||
| **External Dependencies** (`native/jni/external`) | ||||
|  | ||||
| * Makefile for busybox, generated by [ndk-busybox-kitchen](https://github.com/topjohnwu/ndk-busybox-kitchen) | ||||
| * Each dependencies has its own license/copyright information in each subdirectory.   | ||||
| All of them are either GPL or GPL compatible. | ||||
|  | ||||
| **Others Not Mentioned** | ||||
|  | ||||
| * Copyright 2016-2018, John Wu (@topjohnwu) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # Magisk Manager | ||||
| This repo is no longer an independent component. It is a submodule of the [Magisk Project](https://github.com/topjohnwu/Magisk). | ||||
| This repo is no longer an independent component. It is merged into the [Magisk Project](https://github.com/topjohnwu/Magisk). | ||||
|  | ||||
| # Translations | ||||
| The default (English) string resources are scattered in these files: `src/full/res/values/strings.xml`, `src/main/res/values/strings.xml`, `src/stub/res/values/strings.xml`.   | ||||
| Place the translated XMLs in the corresponding folder to the locale.   | ||||
| Translations are highly appreciated via pull requests here on Github. | ||||
| The default (English) strings are mainly in `src/full/res/values/strings.xml`; some are scattered in `src/main/res/values/strings.xml` and `src/stub/res/values/strings.xml`.   | ||||
| Translations are highly appreciated via pull requests here on Github.   | ||||
| Place translated XMLs in the corresponding locale folder. | ||||
|   | ||||
| @@ -1,5 +1,9 @@ | ||||
| apply plugin: 'com.android.application' | ||||
|  | ||||
| def configProps = new Properties() | ||||
| def configPath = project.hasProperty('configPath') ? project.configPath : rootProject.file('config.prop') | ||||
| configProps.load(new FileInputStream(configPath)) | ||||
|  | ||||
| android { | ||||
|     compileSdkVersion rootProject.ext.compileSdkVersion | ||||
|     buildToolsVersion rootProject.ext.buildToolsVersion | ||||
| @@ -8,18 +12,28 @@ android { | ||||
|         applicationId "com.topjohnwu.magisk" | ||||
|         minSdkVersion 21 | ||||
|         targetSdkVersion rootProject.ext.compileSdkVersion | ||||
|         javaCompileOptions { | ||||
|             annotationProcessorOptions { | ||||
|                 argument('butterknife.debuggable', 'false') | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     signingConfigs { | ||||
|         config { | ||||
|             storeFile rootProject.file('release-key.jks') | ||||
|             storePassword configProps['keyStorePass'] | ||||
|             keyAlias configProps['keyAlias'] | ||||
|             keyPassword configProps['keyPass'] | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     buildTypes { | ||||
|         debug { | ||||
|             // If keystore exists, sign the APK with custom signature | ||||
|             if (signingConfigs.config.storeFile.exists()) | ||||
|                 signingConfig signingConfigs.config | ||||
|         } | ||||
|         release { | ||||
|             minifyEnabled true | ||||
|             shrinkResources true | ||||
|             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | ||||
|             signingConfig signingConfigs.config | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -27,8 +41,13 @@ android { | ||||
|  | ||||
|     productFlavors { | ||||
|         full { | ||||
|             versionCode 129 | ||||
|             versionName "5.8.3" | ||||
|             versionName configProps['appVersion'] | ||||
|             versionCode configProps['appVersionCode'] as Integer | ||||
|             javaCompileOptions { | ||||
|                 annotationProcessorOptions { | ||||
|                     argument('butterknife.debuggable', 'false') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stub { | ||||
|             versionCode 1 | ||||
| @@ -52,14 +71,12 @@ android { | ||||
| dependencies { | ||||
|     implementation fileTree(include: ['*.jar'], dir: 'libs') | ||||
|     fullImplementation project(':utils') | ||||
|     implementation "com.android.support:support-core-utils:${rootProject.ext.supportLibVersion}" | ||||
|     fullImplementation "com.android.support:preference-v7:${rootProject.ext.supportLibVersion}" | ||||
|     fullImplementation "com.android.support:recyclerview-v7:${rootProject.ext.supportLibVersion}" | ||||
|     fullImplementation "com.android.support:cardview-v7:${rootProject.ext.supportLibVersion}" | ||||
|     fullImplementation "com.android.support:design:${rootProject.ext.supportLibVersion}" | ||||
|     fullImplementation 'com.github.topjohnwu:libsu:1.3.0' | ||||
|     implementation "androidx.core:core:${rootProject.ext.androidXVersion}" | ||||
|     fullImplementation "androidx.preference:preference:${rootProject.ext.androidXVersion}" | ||||
|     fullImplementation "androidx.recyclerview:recyclerview:${rootProject.ext.androidXVersion}" | ||||
|     fullImplementation "androidx.cardview:cardview:${rootProject.ext.androidXVersion}" | ||||
|     fullImplementation "com.google.android.material:material:${rootProject.ext.androidXVersion}" | ||||
|     fullImplementation 'com.github.topjohnwu:libsu:2.0.2' | ||||
|     fullImplementation 'com.atlassian.commonmark:commonmark:0.11.0' | ||||
|     fullImplementation 'org.kamranzafar:jtar:2.3' | ||||
|     fullImplementation 'com.jakewharton:butterknife:8.8.1' | ||||
|     annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' | ||||
| } | ||||
|   | ||||
							
								
								
									
										16
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							| @@ -16,14 +16,20 @@ | ||||
| #   public *; | ||||
| #} | ||||
|  | ||||
| # Keep all names, we are open source anyway :) | ||||
| -keepnames class ** { *; } | ||||
|  | ||||
| # BouncyCastle | ||||
| -keep class org.bouncycastle.jcajce.provider.asymmetric.rsa.**SHA1** { *; } | ||||
| -keep class org.bouncycastle.jcajce.provider.asymmetric.RSA** { *; } | ||||
| -keep class org.bouncycastle.jcajce.provider.digest.SHA1** { *; } | ||||
| -dontwarn javax.naming.** | ||||
|  | ||||
| # Gson | ||||
| -keepattributes Signature | ||||
| # Snet extention | ||||
| -keepclassmembers class com.topjohnwu.magisk.utils.ISafetyNetHelper { *; } | ||||
|  | ||||
| # Strip logging | ||||
| -assumenosideeffects class com.topjohnwu.magisk.utils.Logger { | ||||
|   public *** debug(...); | ||||
| } | ||||
|  | ||||
| # Excessive obfuscation | ||||
| -repackageclasses 'a' | ||||
| -allowaccessmodification | ||||
|   | ||||
| @@ -1,21 +1,26 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     package="com.topjohnwu.magisk"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.VIBRATE" /> | ||||
|     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> | ||||
|     <uses-permission android:name="android.permission.USE_FINGERPRINT" /> | ||||
|     <uses-permission android:name="android.permission.WAKE_LOCK" /> | ||||
|  | ||||
|     <application | ||||
|         android:name=".MagiskManager" | ||||
|         android:theme="@style/AppTheme"> | ||||
|         android:name="a.q" | ||||
|         android:theme="@style/AppTheme" | ||||
|         tools:ignore="GoogleAppIndexingWarning"> | ||||
|  | ||||
|         <!-- Activities --> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:name="a.b" | ||||
|             android:configChanges="orientation|screenSize" | ||||
|             android:exported="true" /> | ||||
|         <activity | ||||
|             android:name=".SplashActivity" | ||||
|             android:name="a.c" | ||||
|             android:configChanges="orientation|screenSize" | ||||
|             android:exported="true" | ||||
|             android:theme="@style/SplashTheme"> | ||||
| @@ -25,57 +30,75 @@ | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|         <activity | ||||
|             android:name=".AboutActivity" | ||||
|             android:name="a.d" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|         <activity | ||||
|             android:name=".SettingsActivity" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|             android:name="a.e" | ||||
|             android:theme="@style/AppTheme.StatusBar"/> | ||||
|         <activity | ||||
|             android:name=".FlashActivity" | ||||
|             android:name="a.f" | ||||
|             android:configChanges="keyboardHidden|orientation|screenSize" | ||||
|             android:screenOrientation="nosensor" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|         <activity | ||||
|             android:name=".NoUIActivity" | ||||
|             android:name="a.g" | ||||
|             android:theme="@style/AppTheme.Translucent" /> | ||||
|  | ||||
|         <!-- Superuser --> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".superuser.RequestActivity" | ||||
|             android:name="a.p" | ||||
|             android:excludeFromRecents="true" | ||||
|             android:launchMode="singleTask" | ||||
|             android:taskAffinity="internal.superuser" | ||||
|             android:theme="@style/SuRequest" /> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".superuser.RequestActivity" | ||||
|             android:excludeFromRecents="true" | ||||
|             android:launchMode="singleTask" | ||||
|             android:taskAffinity="internal.superuser" | ||||
|             android:theme="@style/AppTheme.Translucent" /> | ||||
|  | ||||
|         <receiver android:name=".superuser.SuReceiver" /> | ||||
|         <receiver android:name=".receivers.BootReceiver"> | ||||
|  | ||||
|         <!-- Receiver --> | ||||
|  | ||||
|         <receiver android:name="a.h"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.BOOT_COMPLETED" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <receiver android:name=".receivers.PackageReceiver"> | ||||
|         <receiver android:name="a.i"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.PACKAGE_REPLACED" /> | ||||
|                 <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> | ||||
|                 <data android:scheme="package" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <receiver android:name=".receivers.ManagerUpdate" /> | ||||
|         <receiver android:name=".receivers.RebootReceiver" /> | ||||
|         <receiver android:name=".receivers.ShortcutReceiver"> | ||||
|         <receiver android:name="a.j" /> | ||||
|         <receiver android:name="a.k" /> | ||||
|         <receiver android:name="a.l"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.LOCALE_CHANGED" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|  | ||||
|         <service android:name=".services.OnBootIntentService" /> | ||||
|         <!-- Service --> | ||||
|  | ||||
|         <service | ||||
|             android:name=".services.UpdateCheckService" | ||||
|             android:name="a.m" | ||||
|             android:exported="true" | ||||
|             android:permission="android.permission.BIND_JOB_SERVICE" /> | ||||
|         <service | ||||
|             android:name="a.n" | ||||
|             android:exported="true" | ||||
|             android:permission="android.permission.BIND_JOB_SERVICE" /> | ||||
|  | ||||
|         <!-- Hardcode GMS version --> | ||||
|         <meta-data | ||||
|             android:name="com.google.android.gms.version" | ||||
|             android:value="7095000" /> | ||||
|             android:value="12451000" /> | ||||
|  | ||||
|     </application> | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								app/src/full/java/a/a.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/full/java/a/a.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.utils.BootSigner; | ||||
|  | ||||
| import androidx.annotation.Keep; | ||||
|  | ||||
| @Keep | ||||
| public class a extends BootSigner { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/b.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/b.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.MainActivity; | ||||
|  | ||||
| public class b extends MainActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/c.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/c.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.SplashActivity; | ||||
|  | ||||
| public class c extends SplashActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/d.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/d.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.AboutActivity; | ||||
|  | ||||
| public class d extends AboutActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/e.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/e.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.DonationActivity; | ||||
|  | ||||
| public class e extends DonationActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/f.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/f.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.FlashActivity; | ||||
|  | ||||
| public class f extends FlashActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/h.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/h.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.receivers.BootReceiver; | ||||
|  | ||||
| public class h extends BootReceiver { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/i.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/i.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.receivers.PackageReceiver; | ||||
|  | ||||
| public class i extends PackageReceiver { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/j.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/j.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.receivers.ManagerUpdate; | ||||
|  | ||||
| public class j extends ManagerUpdate { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/k.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/k.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.receivers.RebootReceiver; | ||||
|  | ||||
| public class k extends RebootReceiver { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/l.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/l.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.receivers.ShortcutReceiver; | ||||
|  | ||||
| public class l extends ShortcutReceiver { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/m.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/m.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.services.OnBootService; | ||||
|  | ||||
| public class m extends OnBootService { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/n.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/n.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.services.UpdateCheckService; | ||||
|  | ||||
| public class n extends UpdateCheckService { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										22
									
								
								app/src/full/java/a/o.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								app/src/full/java/a/o.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| package a; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.util.AttributeSet; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.AboutCardRow; | ||||
|  | ||||
| public class o extends AboutCardRow { | ||||
|     /* stub */ | ||||
|  | ||||
|     public o(Context context) { | ||||
|         super(context); | ||||
|     } | ||||
|  | ||||
|     public o(Context context, AttributeSet attrs) { | ||||
|         super(context, attrs); | ||||
|     } | ||||
|  | ||||
|     public o(Context context, AttributeSet attrs, int defStyleAttr) { | ||||
|         super(context, attrs, defStyleAttr); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/p.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/p.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.SuRequestActivity; | ||||
|  | ||||
| public class p extends SuRequestActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/full/java/a/q.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/full/java/a/q.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.MagiskManager; | ||||
|  | ||||
| public class q extends MagiskManager { | ||||
|     /* stub */ | ||||
| } | ||||
| @@ -1,33 +1,30 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.content.Intent; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.v7.app.ActionBar; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.text.TextUtils; | ||||
| import android.view.View; | ||||
|  | ||||
| import com.topjohnwu.magisk.asyncs.MarkDownWindow; | ||||
| import com.topjohnwu.magisk.components.AboutCardRow; | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
|  | ||||
| import java.util.Locale; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
|  | ||||
| public class AboutActivity extends Activity { | ||||
| public class AboutActivity extends BaseActivity { | ||||
|  | ||||
|     @BindView(R.id.toolbar) Toolbar toolbar; | ||||
|     @BindView(R.id.app_version_info) AboutCardRow appVersionInfo; | ||||
|     @BindView(R.id.app_changelog) AboutCardRow appChangelog; | ||||
|     @BindView(R.id.app_translators) AboutCardRow appTranslators; | ||||
|     @BindView(R.id.app_source_code) AboutCardRow appSourceCode; | ||||
|     @BindView(R.id.support_thread) AboutCardRow supportThread; | ||||
|     @BindView(R.id.donation) AboutCardRow donation; | ||||
|     Toolbar toolbar; | ||||
|     AboutCardRow appVersionInfo; | ||||
|     AboutCardRow appChangelog; | ||||
|     AboutCardRow appTranslators; | ||||
|     AboutCardRow appSourceCode; | ||||
|     AboutCardRow supportThread; | ||||
|     AboutCardRow twitter; | ||||
|  | ||||
|     @Override | ||||
|     public int getDarkTheme() { | ||||
| @@ -38,7 +35,7 @@ public class AboutActivity extends Activity { | ||||
|     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_about); | ||||
|         ButterKnife.bind(this); | ||||
|         ViewBinder.bind(this); | ||||
|  | ||||
|         setSupportActionBar(toolbar); | ||||
|         toolbar.setNavigationOnClickListener(view -> finish()); | ||||
| @@ -52,7 +49,6 @@ public class AboutActivity extends Activity { | ||||
|         appVersionInfo.setSummary(String.format(Locale.US, "%s (%d) (%s)", | ||||
|                 BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, getPackageName())); | ||||
|  | ||||
|         appChangelog.removeSummary(); | ||||
|         appChangelog.setOnClickListener(v -> { | ||||
|             new MarkDownWindow(this, getString(R.string.app_changelog), | ||||
|                     getResources().openRawResource(R.raw.changelog)).exec(); | ||||
| @@ -65,14 +61,9 @@ public class AboutActivity extends Activity { | ||||
|             appTranslators.setSummary(translators); | ||||
|         } | ||||
|  | ||||
|         appSourceCode.removeSummary(); | ||||
|         appSourceCode.setOnClickListener(view -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Const.Url.SOURCE_CODE_URL)))); | ||||
|  | ||||
|         supportThread.removeSummary(); | ||||
|         supportThread.setOnClickListener(view -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Const.Url.XDA_THREAD)))); | ||||
|  | ||||
|         donation.removeSummary(); | ||||
|         donation.setOnClickListener(view -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Const.Url.DONATION_URL)))); | ||||
|         appSourceCode.setOnClickListener(v -> Utils.openLink(this, Uri.parse(Const.Url.SOURCE_CODE_URL))); | ||||
|         supportThread.setOnClickListener(v -> Utils.openLink(this, Uri.parse(Const.Url.XDA_THREAD))); | ||||
|         twitter.setOnClickListener(v -> Utils.openLink(this, Uri.parse(Const.Url.TWITTER_URL))); | ||||
|  | ||||
|         setFloating(); | ||||
|     } | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| package com.topjohnwu.magisk.utils; | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.os.Environment; | ||||
| import android.os.Process; | ||||
|  | ||||
| import com.topjohnwu.magisk.BuildConfig; | ||||
| import com.topjohnwu.magisk.MagiskManager; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| @@ -34,21 +30,19 @@ public class Const { | ||||
|     public static final String BUSYBOX_PATH = "/sbin/.core/busybox"; | ||||
|     public static final String TMP_FOLDER_PATH = "/dev/tmp"; | ||||
|     public static final String MAGISK_LOG = "/cache/magisk.log"; | ||||
|     public static final File EXTERNAL_PATH = new File(Environment.getExternalStorageDirectory(), "MagiskManager"); | ||||
|     public static final String MANAGER_CONFIGS = ".tmp.magisk.config"; | ||||
|  | ||||
|     // Versions | ||||
|     public static final int UPDATE_SERVICE_VER = 1; | ||||
|     public static final int SNET_VER = 8; | ||||
|  | ||||
|     public static int MIN_MODULE_VER() { | ||||
|         return MagiskManager.get().magiskVersionCode >= MAGISK_VER.REMOVE_LEGACY_LINK ? 1500 : 1400; | ||||
|         return Data.magiskVersionCode >= MAGISK_VER.REMOVE_LEGACY_LINK ? 1500 : 1400; | ||||
|     } | ||||
|  | ||||
|     /* A list of apps that should not be shown as hide-able */ | ||||
|     public static final List<String> HIDE_BLACKLIST =  Arrays.asList( | ||||
|             "android", | ||||
|             MagiskManager.get().getPackageName(), | ||||
|             Data.MM().getPackageName(), | ||||
|             "com.google.android.gms" | ||||
|     ); | ||||
|  | ||||
| @@ -59,22 +53,22 @@ public class Const { | ||||
|         public static final int FBE_AWARE = 1410; | ||||
|         public static final int RESETPROP_PERSIST = 1436; | ||||
|         public static final int MANAGER_HIDE = 1440; | ||||
|         public static final int DTBO_SUPPORT = 1446; | ||||
|         public static final int HIDDEN_PATH = 1460; | ||||
|         public static final int REMOVE_LEGACY_LINK = 1630; | ||||
|         public static final int SEPOL_REFACTOR = 1640; | ||||
|         public static final int FIX_ENV = 1650; | ||||
|         public static final int DBVER_SIX = 17000; | ||||
|     } | ||||
|  | ||||
|     public static class ID { | ||||
|         public static final int UPDATE_SERVICE_ID = 1; | ||||
|         public static final int FETCH_ZIP = 2; | ||||
|         public static final int SELECT_BOOT = 3; | ||||
|         public static final int ONBOOT_SERVICE_ID = 6; | ||||
|  | ||||
|         // notifications | ||||
|         public static final int MAGISK_UPDATE_NOTIFICATION_ID = 4; | ||||
|         public static final int APK_UPDATE_NOTIFICATION_ID = 5; | ||||
|         public static final int ONBOOT_NOTIFICATION_ID = 6; | ||||
|         public static final int DTBO_NOTIFICATION_ID = 7; | ||||
|         public static final String NOTIFICATION_CHANNEL = "magisk_notification"; | ||||
|     } | ||||
| @@ -82,11 +76,12 @@ public class Const { | ||||
|     public static class Url { | ||||
|         public static final String STABLE_URL = "https://raw.githubusercontent.com/topjohnwu/magisk_files/master/stable.json"; | ||||
|         public static final String BETA_URL = "https://raw.githubusercontent.com/topjohnwu/magisk_files/master/beta.json"; | ||||
|         public static final String SNET_URL = "https://github.com/topjohnwu/magisk_files/raw/727aa3a8642bf5f0982e5ea89b3f818bd783d5a2/snet.apk"; | ||||
|         public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&page=%d"; | ||||
|         public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&sort=pushed&page=%d"; | ||||
|         public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s"; | ||||
|         public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip"; | ||||
|         public static final String DONATION_URL = "https://www.paypal.me/topjohnwu"; | ||||
|         public static final String PAYPAL_URL = "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=CC7FZ7526MNGG"; | ||||
|         public static final String PATREON_URL = "https://www.patreon.com/topjohnwu"; | ||||
|         public static final String TWITTER_URL = "https://twitter.com/topjohnwu"; | ||||
|         public static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; | ||||
|         public static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk"; | ||||
|     } | ||||
| @@ -108,7 +103,6 @@ public class Const { | ||||
|         public static final String OPEN_SECTION = "section"; | ||||
|         public static final String INTENT_SET_FILENAME = "filename"; | ||||
|         public static final String INTENT_SET_LINK = "link"; | ||||
|         public static final String INTENT_PERM = "perm_dialog"; | ||||
|         public static final String FLASH_ACTION = "action"; | ||||
|         public static final String FLASH_SET_BOOT = "boot"; | ||||
|  | ||||
| @@ -147,16 +141,13 @@ public class Const { | ||||
|         public static final int NAMESPACE_MODE_ISOLATE = 2; | ||||
|         public static final int NO_NOTIFICATION = 0; | ||||
|         public static final int NOTIFICATION_TOAST = 1; | ||||
|         public static final int NOTIFY_NORMAL_LOG = 0; | ||||
|         public static final int NOTIFY_USER_TOASTS = 1; | ||||
|         public static final int NOTIFY_USER_TO_OWNER = 2; | ||||
|         public static final int SU_PROMPT = 0; | ||||
|         public static final int SU_AUTO_DENY = 1; | ||||
|         public static final int SU_AUTO_ALLOW = 2; | ||||
|         public static final String FLASH_ZIP = "flash"; | ||||
|         public static final String PATCH_BOOT = "patch"; | ||||
|         public static final String FLASH_MAGISK = "magisk"; | ||||
|         public static final String FLASH_SECOND_SLOT = "slot"; | ||||
|         public static final String FLASH_INACTIVE_SLOT = "slot"; | ||||
|         public static final String UNINSTALL = "uninstall"; | ||||
|         public static final int[] timeoutList = {0, -1, 10, 20, 30, 60}; | ||||
|         public static final int ORDER_NAME = 0; | ||||
							
								
								
									
										218
									
								
								app/src/full/java/com/topjohnwu/magisk/Data.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								app/src/full/java/com/topjohnwu/magisk/Data.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,218 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.content.SharedPreferences; | ||||
| import android.os.Handler; | ||||
| import android.os.Looper; | ||||
| import android.util.Xml; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.AboutCardRow; | ||||
| import com.topjohnwu.magisk.receivers.BootReceiver; | ||||
| import com.topjohnwu.magisk.receivers.ManagerUpdate; | ||||
| import com.topjohnwu.magisk.receivers.PackageReceiver; | ||||
| import com.topjohnwu.magisk.receivers.RebootReceiver; | ||||
| import com.topjohnwu.magisk.receivers.ShortcutReceiver; | ||||
| import com.topjohnwu.magisk.services.OnBootService; | ||||
| import com.topjohnwu.magisk.services.UpdateCheckService; | ||||
| import com.topjohnwu.magisk.utils.FingerprintHelper; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
| import com.topjohnwu.superuser.ShellUtils; | ||||
| import com.topjohnwu.superuser.io.SuFile; | ||||
| import com.topjohnwu.superuser.io.SuFileInputStream; | ||||
|  | ||||
| import org.xmlpull.v1.XmlPullParser; | ||||
| import org.xmlpull.v1.XmlPullParserException; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| public class Data { | ||||
|     // Global app instance | ||||
|     public static WeakReference<MagiskManager> weakApp; | ||||
|     public static Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|     public static Map<Class, Class> classMap = new HashMap<>(); | ||||
|  | ||||
|     // Current status | ||||
|     public static String magiskVersionString; | ||||
|     public static int magiskVersionCode = -1; | ||||
|     public static boolean magiskHide; | ||||
|  | ||||
|     // Update Info | ||||
|     public static String remoteMagiskVersionString; | ||||
|     public static int remoteMagiskVersionCode = -1; | ||||
|     public static String magiskLink; | ||||
|     public static String magiskNoteLink; | ||||
|     public static String magiskMD5; | ||||
|     public static String remoteManagerVersionString; | ||||
|     public static int remoteManagerVersionCode = -1; | ||||
|     public static String managerLink; | ||||
|     public static String managerNoteLink; | ||||
|     public static String uninstallerLink; | ||||
|     public static int snetVersionCode; | ||||
|     public static String snetLink; | ||||
|  | ||||
|     // Install flags | ||||
|     public static boolean keepVerity = false; | ||||
|     public static boolean keepEnc = false; | ||||
|  | ||||
|     // Configs | ||||
|     public static boolean isDarkTheme; | ||||
|     public static int suRequestTimeout; | ||||
|     public static int suLogTimeout = 14; | ||||
|     public static int suAccessState; | ||||
|     public static boolean suFingerprint; | ||||
|     public static int multiuserMode; | ||||
|     public static int suResponseType; | ||||
|     public static int suNotificationType; | ||||
|     public static int suNamespaceMode; | ||||
|     public static int updateChannel; | ||||
|     public static int repoOrder; | ||||
|  | ||||
|     static { | ||||
|         classMap.put(MagiskManager.class, a.q.class); | ||||
|         classMap.put(MainActivity.class, a.b.class); | ||||
|         classMap.put(SplashActivity.class, a.c.class); | ||||
|         classMap.put(AboutActivity.class, a.d.class); | ||||
|         classMap.put(DonationActivity.class, a.e.class); | ||||
|         classMap.put(FlashActivity.class, a.f.class); | ||||
|         classMap.put(NoUIActivity.class, a.g.class); | ||||
|         classMap.put(BootReceiver.class, a.h.class); | ||||
|         classMap.put(PackageReceiver.class, a.i.class); | ||||
|         classMap.put(ManagerUpdate.class, a.j.class); | ||||
|         classMap.put(RebootReceiver.class, a.k.class); | ||||
|         classMap.put(ShortcutReceiver.class, a.l.class); | ||||
|         classMap.put(OnBootService.class, a.m.class); | ||||
|         classMap.put(UpdateCheckService.class, a.n.class); | ||||
|         classMap.put(AboutCardRow.class, a.o.class); | ||||
|         classMap.put(SuRequestActivity.class, a.p.class); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public static void loadMagiskInfo() { | ||||
|         try { | ||||
|             magiskVersionString = ShellUtils.fastCmd("magisk -v").split(":")[0]; | ||||
|             magiskVersionCode = Integer.parseInt(ShellUtils.fastCmd("magisk -V")); | ||||
|             String s = ShellUtils.fastCmd((magiskVersionCode >= Const.MAGISK_VER.RESETPROP_PERSIST ? | ||||
|                     "resetprop -p " : "getprop ") + Const.MAGISKHIDE_PROP); | ||||
|             magiskHide = s.isEmpty() || Integer.parseInt(s) != 0; | ||||
|         } catch (NumberFormatException ignored) {} | ||||
|     } | ||||
|  | ||||
|     public static MagiskManager MM() { | ||||
|         return weakApp.get(); | ||||
|     } | ||||
|  | ||||
|     public static void exportPrefs() { | ||||
|         // Flush prefs to disk | ||||
|         MagiskManager mm = MM(); | ||||
|         mm.prefs.edit().commit(); | ||||
|         File xml = new File(mm.getFilesDir().getParent() + "/shared_prefs", | ||||
|                 mm.getPackageName() + "_preferences.xml"); | ||||
|         Shell.su(Utils.fmt("for usr in /data/user/*; do cat %s > ${usr}/%s; done", xml, Const.MANAGER_CONFIGS)).exec(); | ||||
|     } | ||||
|  | ||||
|     public static void importPrefs() { | ||||
|         MagiskManager mm = MM(); | ||||
|         SuFile config = new SuFile(Utils.fmt("/data/user/%d/%s", Const.USER_ID, Const.MANAGER_CONFIGS)); | ||||
|         if (config.exists()) { | ||||
|             SharedPreferences.Editor editor = mm.prefs.edit(); | ||||
|             try { | ||||
|                 SuFileInputStream is = new SuFileInputStream(config); | ||||
|                 XmlPullParser parser = Xml.newPullParser(); | ||||
|                 parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); | ||||
|                 parser.setInput(is, "UTF-8"); | ||||
|                 parser.nextTag(); | ||||
|                 parser.require(XmlPullParser.START_TAG, null, "map"); | ||||
|                 while (parser.next() != XmlPullParser.END_TAG) { | ||||
|                     if (parser.getEventType() != XmlPullParser.START_TAG) | ||||
|                         continue; | ||||
|                     String key = parser.getAttributeValue(null, "name"); | ||||
|                     String value = parser.getAttributeValue(null, "value"); | ||||
|                     switch (parser.getName()) { | ||||
|                         case "string": | ||||
|                             parser.require(XmlPullParser.START_TAG, null, "string"); | ||||
|                             editor.putString(key, parser.nextText()); | ||||
|                             parser.require(XmlPullParser.END_TAG, null, "string"); | ||||
|                             break; | ||||
|                         case "boolean": | ||||
|                             parser.require(XmlPullParser.START_TAG, null, "boolean"); | ||||
|                             editor.putBoolean(key, Boolean.parseBoolean(value)); | ||||
|                             parser.nextTag(); | ||||
|                             parser.require(XmlPullParser.END_TAG, null, "boolean"); | ||||
|                             break; | ||||
|                         case "int": | ||||
|                             parser.require(XmlPullParser.START_TAG, null, "int"); | ||||
|                             editor.putInt(key, Integer.parseInt(value)); | ||||
|                             parser.nextTag(); | ||||
|                             parser.require(XmlPullParser.END_TAG, null, "int"); | ||||
|                             break; | ||||
|                         case "long": | ||||
|                             parser.require(XmlPullParser.START_TAG, null, "long"); | ||||
|                             editor.putLong(key, Long.parseLong(value)); | ||||
|                             parser.nextTag(); | ||||
|                             parser.require(XmlPullParser.END_TAG, null, "long"); | ||||
|                             break; | ||||
|                         case "float": | ||||
|                             parser.require(XmlPullParser.START_TAG, null, "int"); | ||||
|                             editor.putFloat(key, Float.parseFloat(value)); | ||||
|                             parser.nextTag(); | ||||
|                             parser.require(XmlPullParser.END_TAG, null, "int"); | ||||
|                             break; | ||||
|                         default: | ||||
|                             parser.next(); | ||||
|                     } | ||||
|                 } | ||||
|             } catch (IOException | XmlPullParserException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             editor.remove(Const.Key.ETAG_KEY); | ||||
|             editor.apply(); | ||||
|             loadConfig(); | ||||
|             config.delete(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void loadConfig() { | ||||
|         MagiskManager mm = MM(); | ||||
|         // su | ||||
|         suRequestTimeout = Utils.getPrefsInt(mm.prefs, Const.Key.SU_REQUEST_TIMEOUT, Const.Value.timeoutList[2]); | ||||
|         suResponseType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_AUTO_RESPONSE, Const.Value.SU_PROMPT); | ||||
|         suNotificationType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_NOTIFICATION, Const.Value.NOTIFICATION_TOAST); | ||||
|         suAccessState = mm.mDB.getSettings(Const.Key.ROOT_ACCESS, Const.Value.ROOT_ACCESS_APPS_AND_ADB); | ||||
|         multiuserMode = mm.mDB.getSettings(Const.Key.SU_MULTIUSER_MODE, Const.Value.MULTIUSER_MODE_OWNER_ONLY); | ||||
|         suNamespaceMode = mm.mDB.getSettings(Const.Key.SU_MNT_NS, Const.Value.NAMESPACE_MODE_REQUESTER); | ||||
|         suFingerprint = mm.mDB.getSettings(Const.Key.SU_FINGERPRINT, 0) != 0; | ||||
|         if (suFingerprint && !FingerprintHelper.canUseFingerprint()) { | ||||
|             // User revoked the fingerprint | ||||
|             mm.mDB.setSettings(Const.Key.SU_FINGERPRINT, 0); | ||||
|             suFingerprint = false; | ||||
|         } | ||||
|  | ||||
|         // config | ||||
|         isDarkTheme = mm.prefs.getBoolean(Const.Key.DARK_THEME, false); | ||||
|         updateChannel = Utils.getPrefsInt(mm.prefs, Const.Key.UPDATE_CHANNEL, Const.Value.STABLE_CHANNEL); | ||||
|         repoOrder = mm.prefs.getInt(Const.Key.REPO_ORDER, Const.Value.ORDER_DATE); | ||||
|     } | ||||
|  | ||||
|     public static void writeConfig() { | ||||
|         MM().prefs.edit() | ||||
|                 .putBoolean(Const.Key.DARK_THEME, isDarkTheme) | ||||
|                 .putBoolean(Const.Key.MAGISKHIDE, magiskHide) | ||||
|                 .putBoolean(Const.Key.HOSTS, Const.MAGISK_HOST_FILE.exists()) | ||||
|                 .putBoolean(Const.Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists()) | ||||
|                 .putBoolean(Const.Key.SU_FINGERPRINT, suFingerprint) | ||||
|                 .putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout)) | ||||
|                 .putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType)) | ||||
|                 .putString(Const.Key.SU_NOTIFICATION, String.valueOf(suNotificationType)) | ||||
|                 .putString(Const.Key.ROOT_ACCESS, String.valueOf(suAccessState)) | ||||
|                 .putString(Const.Key.SU_MULTIUSER_MODE, String.valueOf(multiuserMode)) | ||||
|                 .putString(Const.Key.SU_MNT_NS, String.valueOf(suNamespaceMode)) | ||||
|                 .putString(Const.Key.UPDATE_CHANNEL, String.valueOf(updateChannel)) | ||||
|                 .putInt(Const.Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER) | ||||
|                 .putInt(Const.Key.REPO_ORDER, repoOrder) | ||||
|                 .apply(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								app/src/full/java/com/topjohnwu/magisk/DonationActivity.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/src/full/java/com/topjohnwu/magisk/DonationActivity.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.AboutCardRow; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
|  | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
|  | ||||
| public class DonationActivity extends BaseActivity { | ||||
|  | ||||
|     Toolbar toolbar; | ||||
|     AboutCardRow paypal; | ||||
|     AboutCardRow patreon; | ||||
|  | ||||
|     @Override | ||||
|     public int getDarkTheme() { | ||||
|         return R.style.AppTheme_StatusBar_Dark; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_donation); | ||||
|         ViewBinder.bind(this); | ||||
|  | ||||
|         setSupportActionBar(toolbar); | ||||
|         toolbar.setNavigationOnClickListener(view -> finish()); | ||||
|  | ||||
|         ActionBar ab = getSupportActionBar(); | ||||
|         if (ab != null) { | ||||
|             ab.setTitle(R.string.donation); | ||||
|             ab.setDisplayHomeAsUpEnabled(true); | ||||
|         } | ||||
|  | ||||
|         paypal.setOnClickListener(v -> Utils.openLink(this, Uri.parse(Const.Url.PAYPAL_URL))); | ||||
|         patreon.setOnClickListener(v -> Utils.openLink(this, Uri.parse(Const.Url.PATREON_URL))); | ||||
|     } | ||||
| } | ||||
| @@ -1,11 +1,9 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.Manifest; | ||||
| import android.content.Intent; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.support.v7.app.ActionBar; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.text.TextUtils; | ||||
| import android.view.View; | ||||
| import android.widget.Button; | ||||
| @@ -16,9 +14,10 @@ import android.widget.Toast; | ||||
|  | ||||
| import com.topjohnwu.magisk.asyncs.FlashZip; | ||||
| import com.topjohnwu.magisk.asyncs.InstallMagisk; | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.utils.Download; | ||||
| import com.topjohnwu.magisk.utils.RootUtils; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.superuser.CallbackList; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| @@ -30,51 +29,48 @@ import java.util.Calendar; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import butterknife.OnClick; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
|  | ||||
| public class FlashActivity extends Activity { | ||||
| public class FlashActivity extends BaseActivity { | ||||
|  | ||||
|     @BindView(R.id.toolbar) Toolbar toolbar; | ||||
|     @BindView(R.id.txtLog) TextView flashLogs; | ||||
|     @BindView(R.id.button_panel) public LinearLayout buttonPanel; | ||||
|     @BindView(R.id.reboot) public Button reboot; | ||||
|     @BindView(R.id.scrollView) ScrollView sv; | ||||
|     Toolbar toolbar; | ||||
|     TextView flashLogs; | ||||
|     public LinearLayout buttonPanel; | ||||
|     public Button reboot; | ||||
|     ScrollView sv; | ||||
|  | ||||
|     private List<String> logs; | ||||
|  | ||||
|     @OnClick(R.id.no_thanks) | ||||
|     void dismiss() { | ||||
|         finish(); | ||||
|     } | ||||
|  | ||||
|     @OnClick(R.id.reboot) | ||||
|     void reboot() { | ||||
|         Shell.Async.su("/system/bin/reboot"); | ||||
|         Shell.su("/system/bin/reboot").submit(); | ||||
|     } | ||||
|  | ||||
|     @OnClick(R.id.save_logs) | ||||
|     void saveLogs() { | ||||
|         Calendar now = Calendar.getInstance(); | ||||
|         String filename = String.format(Locale.US, | ||||
|                 "install_log_%04d%02d%02d_%02d%02d%02d.log", | ||||
|                 now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, | ||||
|                 now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), | ||||
|                 now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); | ||||
|         runWithPermission(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, () -> { | ||||
|             Calendar now = Calendar.getInstance(); | ||||
|             String filename = String.format(Locale.US, | ||||
|                     "magisk_install_log_%04d%02d%02d_%02d%02d%02d.log", | ||||
|                     now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, | ||||
|                     now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), | ||||
|                     now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); | ||||
|  | ||||
|         File logFile = new File(Const.EXTERNAL_PATH + "/logs", filename); | ||||
|         logFile.getParentFile().mkdirs(); | ||||
|         try (FileWriter writer = new FileWriter(logFile)) { | ||||
|             for (String s : logs) { | ||||
|                 writer.write(s); | ||||
|                 writer.write('\n'); | ||||
|             File logFile = new File(Download.EXTERNAL_PATH, filename); | ||||
|             try (FileWriter writer = new FileWriter(logFile)) { | ||||
|                 for (String s : logs) { | ||||
|                     writer.write(s); | ||||
|                     writer.write('\n'); | ||||
|                 } | ||||
|             } catch (IOException e) { | ||||
|                 e.printStackTrace(); | ||||
|                 return; | ||||
|             } | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|             return; | ||||
|         } | ||||
|         MagiskManager.toast(logFile.getPath(), Toast.LENGTH_LONG); | ||||
|             Utils.toast(logFile.getPath(), Toast.LENGTH_LONG); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -86,7 +82,7 @@ public class FlashActivity extends Activity { | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_flash); | ||||
|         ButterKnife.bind(this); | ||||
|         ViewBinder.bind(this); | ||||
|         setSupportActionBar(toolbar); | ||||
|         ActionBar ab = getSupportActionBar(); | ||||
|         if (ab != null) { | ||||
| @@ -99,11 +95,23 @@ public class FlashActivity extends Activity { | ||||
|  | ||||
|         logs = new ArrayList<>(); | ||||
|         CallbackList<String> console = new CallbackList<String>(new ArrayList<>()) { | ||||
|  | ||||
|             private void updateUI() { | ||||
|                 flashLogs.setText(TextUtils.join("\n", this)); | ||||
|                 sv.postDelayed(() -> sv.fullScroll(ScrollView.FOCUS_DOWN), 10); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onAddElement(String s) { | ||||
|                 logs.add(s); | ||||
|                 flashLogs.setText(TextUtils.join("\n", this)); | ||||
|                 sv.postDelayed(() -> sv.fullScroll(ScrollView.FOCUS_DOWN), 10); | ||||
|                 updateUI(); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public String set(int i, String s) { | ||||
|                 String ret = super.set(i, s); | ||||
|                 Data.mainHandler.post(this::updateUI); | ||||
|                 return ret; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
| @@ -119,14 +127,15 @@ public class FlashActivity extends Activity { | ||||
|                 new UninstallMagisk(this, uri, console, logs).exec(); | ||||
|                 break; | ||||
|             case Const.Value.FLASH_MAGISK: | ||||
|                 new InstallMagisk(this, console, logs, uri, InstallMagisk.DIRECT_MODE).exec(); | ||||
|                 new InstallMagisk(this, console, logs, InstallMagisk.DIRECT_MODE).exec(); | ||||
|                 break; | ||||
|             case Const.Value.FLASH_SECOND_SLOT: | ||||
|                 new InstallMagisk(this, console, logs, uri, InstallMagisk.SECOND_SLOT_MODE).exec(); | ||||
|             case Const.Value.FLASH_INACTIVE_SLOT: | ||||
|                 new InstallMagisk(this, console, logs, InstallMagisk.SECOND_SLOT_MODE).exec(); | ||||
|                 break; | ||||
|             case Const.Value.PATCH_BOOT: | ||||
|                 new InstallMagisk(this, console, logs, uri, | ||||
|                         intent.getParcelableExtra(Const.Key.FLASH_SET_BOOT)).exec(); | ||||
|                 runWithPermission(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, | ||||
|                         () -> new InstallMagisk(this, console, logs, | ||||
|                                 intent.getParcelableExtra(Const.Key.FLASH_SET_BOOT)).exec()); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| @@ -138,14 +147,14 @@ public class FlashActivity extends Activity { | ||||
|  | ||||
|     private static class UninstallMagisk extends FlashZip { | ||||
|  | ||||
|         private UninstallMagisk(Activity context, Uri uri, List<String> console, List<String> logs) { | ||||
|         private UninstallMagisk(BaseActivity context, Uri uri, List<String> console, List<String> logs) { | ||||
|             super(context, uri, console, logs); | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected void onPostExecute(Integer result) { | ||||
|             if (result == 1) { | ||||
|                 new Handler().postDelayed(() -> | ||||
|                 Data.mainHandler.postDelayed(() -> | ||||
|                         RootUtils.uninstallPkg(getActivity().getPackageName()), 3000); | ||||
|             } else { | ||||
|                 super.onPostExecute(result); | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -3,37 +3,40 @@ package com.topjohnwu.magisk; | ||||
| import android.content.Intent; | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.design.widget.NavigationView; | ||||
| import android.support.v4.app.ActivityCompat; | ||||
| import android.support.v4.app.Fragment; | ||||
| import android.support.v4.app.FragmentTransaction; | ||||
| import android.support.v4.widget.DrawerLayout; | ||||
| import android.support.v7.app.ActionBarDrawerToggle; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.google.android.material.navigation.NavigationView; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.fragments.LogFragment; | ||||
| import com.topjohnwu.magisk.fragments.MagiskFragment; | ||||
| import com.topjohnwu.magisk.fragments.MagiskHideFragment; | ||||
| import com.topjohnwu.magisk.fragments.ModulesFragment; | ||||
| import com.topjohnwu.magisk.fragments.ReposFragment; | ||||
| import com.topjohnwu.magisk.fragments.SettingsFragment; | ||||
| import com.topjohnwu.magisk.fragments.SuperuserFragment; | ||||
| import com.topjohnwu.magisk.utils.Download; | ||||
| import com.topjohnwu.magisk.utils.Topic; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.appcompat.app.ActionBarDrawerToggle; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import androidx.drawerlayout.widget.DrawerLayout; | ||||
| import androidx.fragment.app.Fragment; | ||||
| import androidx.fragment.app.FragmentTransaction; | ||||
|  | ||||
| public class MainActivity extends Activity | ||||
| public class MainActivity extends BaseActivity | ||||
|         implements NavigationView.OnNavigationItemSelectedListener, Topic.Subscriber { | ||||
|  | ||||
|     private final Handler mDrawerHandler = new Handler(); | ||||
|     private int mDrawerItem; | ||||
|     private boolean fromShortcut = true; | ||||
|     private static boolean fromShortcut = false; | ||||
|  | ||||
|     @BindView(R.id.toolbar) Toolbar toolbar; | ||||
|     @BindView(R.id.drawer_layout) DrawerLayout drawer; | ||||
|     @BindView(R.id.nav_view) public NavigationView navigationView; | ||||
|     public Toolbar toolbar; | ||||
|     DrawerLayout drawer; | ||||
|     NavigationView navigationView; | ||||
|  | ||||
|     private float toolbarElevation; | ||||
|  | ||||
| @@ -44,27 +47,14 @@ public class MainActivity extends Activity | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(final Bundle savedInstanceState) { | ||||
|  | ||||
|         MagiskManager mm = getMagiskManager(); | ||||
|  | ||||
|         if (!mm.hasInit) { | ||||
|             Intent intent = new Intent(this, SplashActivity.class); | ||||
|             String section = getIntent().getStringExtra(Const.Key.OPEN_SECTION); | ||||
|             if (section != null) { | ||||
|                 intent.putExtra(Const.Key.OPEN_SECTION, section); | ||||
|             } | ||||
|             startActivity(intent); | ||||
|             startActivity(new Intent(this, Data.classMap.get(SplashActivity.class))); | ||||
|             finish(); | ||||
|         } | ||||
|  | ||||
|         String perm = getIntent().getStringExtra(Const.Key.INTENT_PERM); | ||||
|         if (perm != null) { | ||||
|             ActivityCompat.requestPermissions(this, new String[] { perm }, 0); | ||||
|         } | ||||
|  | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_main); | ||||
|         ButterKnife.bind(this); | ||||
|         ViewBinder.bind(this); | ||||
|  | ||||
|         setSupportActionBar(toolbar); | ||||
|  | ||||
| @@ -86,8 +76,11 @@ public class MainActivity extends Activity | ||||
|         drawer.addDrawerListener(toggle); | ||||
|         toggle.syncState(); | ||||
|  | ||||
|         if (savedInstanceState == null) | ||||
|             navigate(getIntent().getStringExtra(Const.Key.OPEN_SECTION)); | ||||
|         if (savedInstanceState == null) { | ||||
|             String section = getIntent().getStringExtra(Const.Key.OPEN_SECTION); | ||||
|             fromShortcut = section != null; | ||||
|             navigate(section); | ||||
|         } | ||||
|  | ||||
|         navigationView.setNavigationItemSelectedListener(this); | ||||
|     } | ||||
| @@ -118,28 +111,21 @@ public class MainActivity extends Activity | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onTopicPublished(Topic topic) { | ||||
|     public void onPublish(int topic, Object[] result) { | ||||
|         recreate(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Topic[] getSubscription() { | ||||
|         return new Topic[] { getMagiskManager().reloadActivity }; | ||||
|     } | ||||
|  | ||||
|     public void checkHideSection() { | ||||
|         MagiskManager mm = getMagiskManager(); | ||||
|         Menu menu = navigationView.getMenu(); | ||||
|         menu.findItem(R.id.magiskhide).setVisible( | ||||
|                 Shell.rootAccess() && mm.magiskVersionCode >= Const.MAGISK_VER.UNIFIED | ||||
|                         && mm.prefs.getBoolean(Const.Key.MAGISKHIDE, false)); | ||||
|         menu.findItem(R.id.modules).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) && | ||||
|                 Shell.rootAccess() && mm.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.downloads).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) | ||||
|                 && Utils.checkNetworkStatus() && Shell.rootAccess() && mm.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.magiskhide).setVisible(Shell.rootAccess() && | ||||
|                 Data.magiskVersionCode >= Const.MAGISK_VER.UNIFIED && | ||||
|                 mm.prefs.getBoolean(Const.Key.MAGISKHIDE, false)); | ||||
|         menu.findItem(R.id.modules).setVisible(Shell.rootAccess() && Data.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.downloads).setVisible(Download.checkNetworkStatus(this) | ||||
|                 && Shell.rootAccess() && Data.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.log).setVisible(Shell.rootAccess()); | ||||
|         menu.findItem(R.id.superuser).setVisible(Shell.rootAccess() && | ||||
|                 !(Const.USER_ID > 0 && mm.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)); | ||||
|                 !(Const.USER_ID > 0 && Data.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)); | ||||
|     } | ||||
|  | ||||
|     public void navigate(String item) { | ||||
| @@ -167,6 +153,9 @@ public class MainActivity extends Activity | ||||
|                 case "about": | ||||
|                     itemId = R.id.app_about; | ||||
|                     break; | ||||
|                 case "donation": | ||||
|                     itemId = R.id.donation; | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         navigate(itemId); | ||||
| @@ -197,11 +186,14 @@ public class MainActivity extends Activity | ||||
|                 displayFragment(new LogFragment(), false); | ||||
|                 break; | ||||
|             case R.id.settings: | ||||
|                 startActivity(new Intent(this, SettingsActivity.class)); | ||||
|                 mDrawerItem = bak; | ||||
|                 displayFragment(new SettingsFragment(), true); | ||||
|                 break; | ||||
|             case R.id.app_about: | ||||
|                 startActivity(new Intent(this, AboutActivity.class)); | ||||
|                 startActivity(new Intent(this, Data.classMap.get(AboutActivity.class))); | ||||
|                 mDrawerItem = bak; | ||||
|                 break; | ||||
|             case R.id.donation: | ||||
|                 startActivity(new Intent(this, Data.classMap.get(DonationActivity.class))); | ||||
|                 mDrawerItem = bak; | ||||
|                 break; | ||||
|         } | ||||
|   | ||||
| @@ -1,23 +1,10 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.v4.app.ActivityCompat; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
|  | ||||
| public class NoUIActivity extends Activity { | ||||
|     @Override | ||||
|     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         String[] perms = getIntent().getStringArrayExtra(Const.Key.INTENT_PERM); | ||||
|         if (perms != null) { | ||||
|             ActivityCompat.requestPermissions(this, perms, 0); | ||||
|         } | ||||
|     } | ||||
| import androidx.annotation.NonNull; | ||||
|  | ||||
| public class NoUIActivity extends BaseActivity { | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||
|         super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||
|   | ||||
| @@ -1,126 +0,0 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.app.AlertDialog; | ||||
| import android.os.Bundle; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.v4.widget.SwipeRefreshLayout; | ||||
| import android.support.v7.widget.RecyclerView; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.SearchView; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| import com.topjohnwu.magisk.adapters.ReposAdapter; | ||||
| import com.topjohnwu.magisk.asyncs.UpdateRepos; | ||||
| import com.topjohnwu.magisk.components.Fragment; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.topjohnwu.magisk.utils.Topic; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import butterknife.Unbinder; | ||||
|  | ||||
| public class ReposFragment extends Fragment implements Topic.Subscriber { | ||||
|  | ||||
|     private Unbinder unbinder; | ||||
|     private MagiskManager mm; | ||||
|     @BindView(R.id.recyclerView) RecyclerView recyclerView; | ||||
|     @BindView(R.id.empty_rv) TextView emptyRv; | ||||
|     @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; | ||||
|  | ||||
|     public static ReposAdapter adapter; | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setHasOptionsMenu(true); | ||||
|     } | ||||
|  | ||||
|     @Nullable | ||||
|     @Override | ||||
|     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | ||||
|         View view = inflater.inflate(R.layout.fragment_repos, container, false); | ||||
|         unbinder = ButterKnife.bind(this, view); | ||||
|         mm = getApplication(); | ||||
|  | ||||
|         mSwipeRefreshLayout.setRefreshing(mm.repoLoadDone.isPending()); | ||||
|  | ||||
|         mSwipeRefreshLayout.setOnRefreshListener(() -> { | ||||
|             recyclerView.setVisibility(View.VISIBLE); | ||||
|             emptyRv.setVisibility(View.GONE); | ||||
|             new UpdateRepos(true).exec(); | ||||
|         }); | ||||
|  | ||||
|         getActivity().setTitle(R.string.downloads); | ||||
|  | ||||
|         return view; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         adapter = new ReposAdapter(mm.repoDB, mm.moduleMap); | ||||
|         recyclerView.setAdapter(adapter); | ||||
|         super.onResume(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPause() { | ||||
|         super.onPause(); | ||||
|         adapter = null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onTopicPublished(Topic topic) { | ||||
|         mSwipeRefreshLayout.setRefreshing(false); | ||||
|         recyclerView.setVisibility(adapter.getItemCount() == 0 ? View.GONE : View.VISIBLE); | ||||
|         emptyRv.setVisibility(adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Topic[] getSubscription() { | ||||
|         return new Topic[] { mm.repoLoadDone }; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | ||||
|         inflater.inflate(R.menu.menu_repo, menu); | ||||
|         SearchView search = (SearchView) menu.findItem(R.id.repo_search).getActionView(); | ||||
|         search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { | ||||
|             @Override | ||||
|             public boolean onQueryTextSubmit(String query) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public boolean onQueryTextChange(String newText) { | ||||
|                 adapter.filter(newText); | ||||
|                 return false; | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         if (item.getItemId() == R.id.repo_sort) { | ||||
|             new AlertDialog.Builder(getActivity()) | ||||
|                 .setTitle(R.string.sorting_order) | ||||
|                 .setSingleChoiceItems(R.array.sorting_orders, mm.repoOrder, (d, which) -> { | ||||
|                     mm.repoOrder = which; | ||||
|                     mm.prefs.edit().putInt(Const.Key.REPO_ORDER, mm.repoOrder).apply(); | ||||
|                     adapter.notifyDBChanged(); | ||||
|                     d.dismiss(); | ||||
|                 }).show(); | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroyView() { | ||||
|         super.onDestroyView(); | ||||
|         unbinder.unbind(); | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -7,33 +7,34 @@ import android.os.Build; | ||||
| import android.os.Bundle; | ||||
|  | ||||
| import com.topjohnwu.magisk.asyncs.CheckUpdates; | ||||
| import com.topjohnwu.magisk.asyncs.LoadModules; | ||||
| import com.topjohnwu.magisk.asyncs.ParallelTask; | ||||
| import com.topjohnwu.magisk.asyncs.UpdateRepos; | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.database.RepoDatabaseHelper; | ||||
| import com.topjohnwu.magisk.receivers.ShortcutReceiver; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.topjohnwu.magisk.utils.RootUtils; | ||||
| import com.topjohnwu.magisk.utils.Download; | ||||
| import com.topjohnwu.magisk.utils.LocaleManager; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| public class SplashActivity extends Activity { | ||||
| public class SplashActivity extends BaseActivity { | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         RootUtils.init(); | ||||
|         MagiskManager mm = getMagiskManager(); | ||||
|         // Magisk working as expected | ||||
|         if (Shell.rootAccess() && Data.magiskVersionCode > 0) { | ||||
|             // Update check service | ||||
|             Utils.setupUpdateCheck(); | ||||
|             // Load modules | ||||
|             Utils.loadModules(); | ||||
|         } | ||||
|  | ||||
|         mm.repoDB = new RepoDatabaseHelper(this); | ||||
|         mm.loadMagiskInfo(); | ||||
|         mm.getDefaultInstallFlags(); | ||||
|         mm.loadPrefs(); | ||||
|         Data.importPrefs(); | ||||
|  | ||||
|         // Dynamic detect all locales | ||||
|         new LoadLocale().exec(); | ||||
|         LocaleManager.loadAvailableLocales(); | ||||
|  | ||||
|         // Create notification channel on Android O | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||||
| @@ -43,46 +44,24 @@ public class SplashActivity extends Activity { | ||||
|         } | ||||
|  | ||||
|         // Setup shortcuts | ||||
|         sendBroadcast(new Intent(this, ShortcutReceiver.class)); | ||||
|         sendBroadcast(new Intent(this, Data.classMap.get(ShortcutReceiver.class))); | ||||
|  | ||||
|         LoadModules loadModuleTask = new LoadModules(); | ||||
|  | ||||
|         if (Utils.checkNetworkStatus()) { | ||||
|         if (Download.checkNetworkStatus(this)) { | ||||
|             // Fire update check | ||||
|             new CheckUpdates().exec(); | ||||
|             // Add repo update check | ||||
|             loadModuleTask.setCallBack(() -> new UpdateRepos(false).exec()); | ||||
|         } | ||||
|  | ||||
|         // Magisk working as expected | ||||
|         if (Shell.rootAccess() && mm.magiskVersionCode > 0) { | ||||
|             // Update check service | ||||
|             mm.setupUpdateCheck(); | ||||
|             // Fire asynctasks | ||||
|             loadModuleTask.exec(); | ||||
|             CheckUpdates.check(); | ||||
|             // Repo update check | ||||
|             new UpdateRepos().exec(); | ||||
|         } | ||||
|  | ||||
|         // Write back default values | ||||
|         mm.writeConfig(); | ||||
|         Data.writeConfig(); | ||||
|  | ||||
|         mm.hasInit = true; | ||||
|  | ||||
|         Intent intent = new Intent(this, MainActivity.class); | ||||
|         Intent intent = new Intent(this, Data.classMap.get(MainActivity.class)); | ||||
|         intent.putExtra(Const.Key.OPEN_SECTION, getIntent().getStringExtra(Const.Key.OPEN_SECTION)); | ||||
|         intent.putExtra(Const.Key.INTENT_PERM, getIntent().getStringExtra(Const.Key.INTENT_PERM)); | ||||
|         intent.putExtra(BaseActivity.INTENT_PERM, getIntent().getStringExtra(BaseActivity.INTENT_PERM)); | ||||
|         startActivity(intent); | ||||
|         finish(); | ||||
|     } | ||||
|  | ||||
|     static class LoadLocale extends ParallelTask<Void, Void, Void> { | ||||
|         @Override | ||||
|         protected Void doInBackground(Void... voids) { | ||||
|             MagiskManager.get().locales = Utils.getAvailableLocale(); | ||||
|             return null; | ||||
|         } | ||||
|         @Override | ||||
|         protected void onPostExecute(Void aVoid) { | ||||
|             MagiskManager.get().localeDone.publish(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user