├── .idea
├── .name
├── copyright
│ └── profiles_settings.xml
├── encodings.xml
├── vcs.xml
├── modules.xml
├── runConfigurations.xml
├── compiler.xml
├── gradle.xml
└── misc.xml
├── app
├── .gitignore
├── src
│ └── main
│ │ ├── assets
│ │ └── xposed_init
│ │ ├── res
│ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── values
│ │ │ ├── styles.xml
│ │ │ ├── dimen.xml
│ │ │ └── strings.xml
│ │ ├── values-v21
│ │ │ └── styles.xml
│ │ ├── menu
│ │ │ └── menu_main.xml
│ │ ├── drawable
│ │ │ ├── ic_content_copy_black_24dp.xml
│ │ │ ├── ic_colorize_black_24dp.xml
│ │ │ └── ic_extension_black_24dp.xml
│ │ └── xml
│ │ │ ├── pref_experimental.xml
│ │ │ ├── pref_headers.xml
│ │ │ ├── pref_cyanogenmod.xml
│ │ │ ├── pref_copycats.xml
│ │ │ ├── pref_thirdparty.xml
│ │ │ ├── pref_tweaks.xml
│ │ │ └── pref_s5.xml
│ │ ├── java
│ │ └── com
│ │ │ └── smartmadsoft
│ │ │ └── xposed
│ │ │ └── aio
│ │ │ ├── IntentReceiver.java
│ │ │ ├── tweaks
│ │ │ ├── PacMan.java
│ │ │ ├── touchwiz
│ │ │ │ ├── NoVoLteIcon.java
│ │ │ │ ├── No2G.java
│ │ │ │ ├── S7AlwaysAllowMTP.java
│ │ │ │ ├── GentleHapticFeedbackTouchWiz.java
│ │ │ │ ├── S7TouchKeyLight.java
│ │ │ │ ├── S7DetailedBatteryUsage.java
│ │ │ │ ├── S7sRGBVideo.java
│ │ │ │ ├── RemapRedialToNextTrack.java
│ │ │ │ ├── NoPasswordAfterBootTW.java
│ │ │ │ ├── S5ReaderMode.java
│ │ │ │ ├── LedOffDuringDnD.java
│ │ │ │ ├── S7MTPWithoutUnlocking.java
│ │ │ │ └── S5TouchWizJunk.java
│ │ │ ├── DisableAdbNotification.java
│ │ │ ├── DisableUsbNotification.java
│ │ │ ├── cyanogenmod
│ │ │ │ ├── DisableSuIndicator.java
│ │ │ │ ├── AlwaysSoftwareMenu.java
│ │ │ │ ├── NoToastIcons.java
│ │ │ │ ├── OneWayBrightness.java
│ │ │ │ ├── BatteryLightDisabler.java
│ │ │ │ └── RemapVolume.java
│ │ │ ├── DisableNetworkMonitoredNotification.java
│ │ │ ├── DisableHorizontalScrollAR.java
│ │ │ ├── MediaStreamDefault.java
│ │ │ ├── copycat
│ │ │ │ ├── NoSafeVolumeWarning.java
│ │ │ │ ├── NoOverlayWarning.java
│ │ │ │ ├── HideNetworkIndicators.java
│ │ │ │ ├── GentleHapticFeedback.java
│ │ │ │ └── QuickUnlock.java
│ │ │ ├── GMSDisabler.java
│ │ │ ├── MinimumBrightnessMX.java
│ │ │ ├── GMapsMinimizedBar.java
│ │ │ ├── NoExitConfirmation.java
│ │ │ ├── PocketFirst.java
│ │ │ ├── NoWakeOnCharge.java
│ │ │ ├── onehandzoomenabler
│ │ │ │ ├── AR.java
│ │ │ │ └── Common.java
│ │ │ ├── VolumeKeysCursorControl.java
│ │ │ ├── Chrome.java
│ │ │ ├── obsolete
│ │ │ │ └── K920Cardboard.java
│ │ │ ├── CompactVolumePanel.java
│ │ │ ├── NativeFreezer.java
│ │ │ └── MediaKeys.java
│ │ │ ├── TwoLinePreference.java
│ │ │ ├── FlashlightService.java
│ │ │ ├── DisableBatteryPrediction.java
│ │ │ └── Loader.java
│ │ └── AndroidManifest.xml
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .gitignore
├── gradle.properties
├── gradlew.bat
├── README.md
└── gradlew
/.idea/.name:
--------------------------------------------------------------------------------
1 | AllMy
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/app/src/main/assets/xposed_init:
--------------------------------------------------------------------------------
1 | com.smartmadsoft.xposed.aio.Loader
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moneytoo/AllMy.../HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 89dp
5 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Oct 25 20:14:26 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_content_copy_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_colorize_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/IntentReceiver.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 |
7 | public class IntentReceiver extends BroadcastReceiver {
8 | @Override
9 | public void onReceive(Context context, Intent intent) {
10 |
11 | if(intent.getAction().equals("com.smartmadsoft.xposed.aio.FLASHLIGHT_TOGGLE")){
12 | Intent intentService = new Intent(context, FlashlightService.class);
13 | context.startService(intentService);
14 | }
15 |
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_extension_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /home/mdop/Android/Sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 27
5 |
6 | defaultConfig {
7 | applicationId "com.smartmadsoft.xposed.aio"
8 | minSdkVersion 14
9 | targetSdkVersion 23
10 | versionCode 54
11 | versionName "0.8.1"
12 | project.ext.set("archivesBaseName", "AllMy.v" + defaultConfig.versionName + "-" + defaultConfig.versionCode)
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | implementation fileTree(dir: 'libs', include: ['*.jar'])
24 |
25 | compileOnly 'de.robv.android.xposed:api:82'
26 | compileOnly 'de.robv.android.xposed:api:82:sources'
27 | }
28 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_experimental.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
13 |
14 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/PacMan.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class PacMan {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.pm.PackageManagerService", lpparam.classLoader), "checkDowngrade", new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/NoVoLteIcon.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class NoVoLteIcon {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedHelpers.findAndHookMethod("com.sec.internal.ims.imsservice.ImsIconManager", lpparam.classLoader, "updateRegistrationIcon", boolean.class, new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/DisableAdbNotification.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class DisableAdbNotification {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.usb.UsbDeviceManager$UsbHandler", lpparam.classLoader), "updateAdbNotification", new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/DisableUsbNotification.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class DisableUsbNotification {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.usb.UsbDeviceManager$UsbHandler", lpparam.classLoader), "updateUsbNotification", new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/DisableSuIndicator.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class DisableSuIndicator {
9 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", lpparam.classLoader), "updateSu", new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/DisableNetworkMonitoredNotification.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class DisableNetworkMonitoredNotification {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.devicepolicy.DevicePolicyManagerService$MonitoringCertNotificationTask", lpparam.classLoader), "doInBackground", new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
14 | param.setResult(null);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log(t);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/TwoLinePreference.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio;
2 |
3 | import android.content.Context;
4 | import android.preference.Preference;
5 | import android.util.AttributeSet;
6 | import android.view.View;
7 | import android.widget.TextView;
8 |
9 | // from http://stackoverflow.com/questions/9220039/android-preferencescreen-title-in-two-lines
10 |
11 | public class TwoLinePreference extends Preference {
12 |
13 | public TwoLinePreference(Context ctx, AttributeSet attrs, int defStyle) {
14 | super(ctx, attrs, defStyle);
15 | }
16 |
17 | public TwoLinePreference(Context ctx, AttributeSet attrs) {
18 | super(ctx, attrs);
19 | }
20 |
21 | public TwoLinePreference(Context ctx) {
22 | super(ctx);
23 | }
24 |
25 | @Override
26 | protected void onBindView(View view) {
27 | super.onBindView(view);
28 |
29 | TextView textView = (TextView) view.findViewById(android.R.id.title);
30 | if (textView != null) {
31 | textView.setSingleLine(false);
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/No2G.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class No2G {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedHelpers.findAndHookMethod("com.android.phone.TeleServiceFeature", lpparam.classLoader, "hasFeature", String.class, new XC_MethodHook() {
12 | @Override
13 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
14 | //XposedBridge.log("AIO: hasFeature: " + (String) param.args[0] + "=" + Boolean.toString((boolean)param.getResult()));
15 | if (((String) param.args[0]).equals("cust_network_sel_menu4_add_ltewcdma"))
16 | param.setResult(true);
17 | }
18 | });
19 | } catch (Throwable t) {
20 | XposedBridge.log(t);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/AlwaysSoftwareMenu.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import android.os.Build;
4 |
5 | import de.robv.android.xposed.XC_MethodReplacement;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class AlwaysSoftwareMenu {
11 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | String methodName = "hasMenuKeyEnabled";
14 |
15 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
16 | methodName = "hasPermanentMenuKey";
17 |
18 | XposedHelpers.findAndHookMethod("com.android.server.wm.WindowManagerService", lpparam.classLoader, methodName, new XC_MethodReplacement() {
19 | @Override
20 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
21 | return false;
22 | }
23 | });
24 | } catch (Throwable t) {
25 | XposedBridge.log(t);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/DisableHorizontalScrollAR.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class DisableHorizontalScrollAR {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedHelpers.findAndHookMethod("com.adobe.reader.viewer.ARPageView", lpparam.classLoader, "handleScroll", int.class, int.class, new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
14 | param.args[0] = 0;
15 | }
16 | });
17 |
18 | XposedHelpers.findAndHookMethod("com.adobe.reader.viewer.ARPageView", lpparam.classLoader, "handleFling", float.class, float.class, new XC_MethodHook() {
19 | @Override
20 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
21 | param.args[0] = 0;
22 | }
23 | });
24 | } catch (Throwable t) {
25 | XposedBridge.log(t);
26 | }
27 |
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S7AlwaysAllowMTP.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.app.AlertDialog;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class S7AlwaysAllowMTP {
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedHelpers.findAndHookMethod("com.samsung.android.MtpApplication.USBConnection", lpparam.classLoader, "showDiaglog", new XC_MethodHook() {
14 | @Override
15 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
16 | //XposedBridge.log("AIO: showDiaglog");
17 | AlertDialog dialog = (AlertDialog) XposedHelpers.getObjectField(param.thisObject, "dialog");
18 | Object mReceiver = XposedHelpers.getObjectField(param.thisObject, "mReceiver");
19 | dialog.dismiss();
20 | XposedHelpers.callMethod(mReceiver, "changeMtpMode");
21 | }
22 | });
23 | } catch (Throwable t) {
24 | XposedBridge.log(t);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/FlashlightService.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio;
2 |
3 | import android.app.Service;
4 | import android.content.Intent;
5 | import android.hardware.Camera;
6 | import android.os.IBinder;
7 |
8 | public class FlashlightService extends Service {
9 |
10 | Camera camera;
11 | Camera.Parameters params;
12 |
13 | @Override
14 | public IBinder onBind(Intent intent) {
15 | return null;
16 | }
17 |
18 | @Override
19 | public int onStartCommand(Intent intent, int flags, int startId) {
20 | try {
21 | if (camera == null) {
22 | camera = Camera.open();
23 | params = camera.getParameters();
24 | params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
25 | camera.setParameters(params);
26 | camera.startPreview();
27 | } else {
28 | params = camera.getParameters();
29 | params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
30 | camera.setParameters(params);
31 | camera.stopPreview();
32 | camera.release();
33 | camera = null;
34 | stopSelf();
35 | }
36 | } catch (RuntimeException e) {
37 | // Camera is used by other process
38 | e.printStackTrace();
39 | }
40 | return super.onStartCommand(intent, flags, startId);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/MediaStreamDefault.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.media.AudioManager;
4 | import android.os.Build;
5 |
6 | import de.robv.android.xposed.XC_MethodHook;
7 | import de.robv.android.xposed.XposedBridge;
8 | import de.robv.android.xposed.XposedHelpers;
9 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
10 |
11 | public class MediaStreamDefault {
12 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
13 | try {
14 | String pkg = "com.android.server.audio";
15 | if (Build.VERSION.SDK_INT < 23)
16 | pkg = "android.media";
17 |
18 | XposedHelpers.findAndHookMethod(pkg + ".AudioService", lpparam.classLoader, "getActiveStreamType", int.class, new XC_MethodHook() {
19 | @Override
20 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
21 | int suggestedStreamType = (int) param.args[0];
22 | int result = (int) param.getResult();
23 | if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE && (result == AudioManager.STREAM_RING || result == AudioManager.STREAM_NOTIFICATION))
24 | param.setResult(AudioManager.STREAM_MUSIC);
25 | }
26 | });
27 | } catch (Throwable t) {
28 | XposedBridge.log(t);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/GentleHapticFeedbackTouchWiz.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.os.Vibrator;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class GentleHapticFeedbackTouchWiz {
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.internal.policy.impl.sec.SamsungPhoneWindowManager", lpparam.classLoader), "performHapticFeedbackLw", new XC_MethodHook() {
14 | @Override
15 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
16 | int n = (int) param.args[1];
17 | //XposedBridge.log("AIO: SEC performHapticFeedbackLw n=" + n);
18 | if (n == 14) {
19 | Vibrator mVibrator = (Vibrator) XposedHelpers.getObjectField(param.thisObject, "mVibrator");
20 | if (mVibrator.hasVibrator())
21 | mVibrator.vibrate(10);
22 | param.setResult(true);
23 | }
24 | }
25 | });
26 | } catch (Throwable t) {
27 | XposedBridge.log(t);
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/DisableBatteryPrediction.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio;
2 |
3 | import android.content.Intent;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class DisableBatteryPrediction {
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | Class batteryStats = XposedHelpers.findClass("android.os.BatteryStats", lpparam.classLoader);
14 |
15 | XposedHelpers.findAndHookMethod("com.android.settings.fuelgauge.BatteryHistoryChart", lpparam.classLoader, "setStats", batteryStats, Intent.class, new XC_MethodHook() {
16 | @Override
17 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
18 | long mHistDataEnd = (long) XposedHelpers.getObjectField(param.thisObject, "mHistDataEnd");
19 | long mEndDataWallTime = (long) XposedHelpers.getObjectField(param.thisObject, "mEndDataWallTime");
20 |
21 | XposedHelpers.setObjectField(param.thisObject, "mHistEnd", mHistDataEnd);
22 | XposedHelpers.setObjectField(param.thisObject, "mEndWallTime", mEndDataWallTime);
23 | }
24 | });
25 | } catch (Throwable t) {
26 | XposedBridge.log(t);
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_headers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
13 |
17 |
18 |
22 |
23 |
27 |
28 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/copycat/NoSafeVolumeWarning.java:
--------------------------------------------------------------------------------
1 | /*
2 | from https://github.com/pylerSM/NoSafeVolumeWarning
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks.copycat;
6 |
7 | import android.os.Build;
8 |
9 | import de.robv.android.xposed.XC_MethodHook;
10 | import de.robv.android.xposed.XposedBridge;
11 | import de.robv.android.xposed.XposedHelpers;
12 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
13 |
14 | public class NoSafeVolumeWarning {
15 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
16 | try {
17 | String pkg = "com.android.server.audio";
18 | if (Build.VERSION.SDK_INT < 23)
19 | pkg = "android.media";
20 |
21 | XposedBridge.hookAllMethods(XposedHelpers.findClass(pkg + ".AudioService", lpparam.classLoader), "enforceSafeMediaVolume", new XC_MethodHook() {
22 | @Override
23 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
24 | param.setResult(null);
25 | }
26 | });
27 |
28 | XposedHelpers.findAndHookMethod(pkg + ".AudioService", lpparam.classLoader, "checkSafeMediaVolume", int.class, int.class, int.class, new XC_MethodHook() {
29 | @Override
30 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
31 | param.setResult(true);
32 | }
33 | });
34 | } catch (Throwable t) {
35 | XposedBridge.log(t);
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/GMSDisabler.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 | import android.os.Bundle;
6 |
7 | import de.robv.android.xposed.XC_MethodHook;
8 | import de.robv.android.xposed.XposedBridge;
9 | import de.robv.android.xposed.XposedHelpers;
10 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
11 |
12 | public class GMSDisabler {
13 |
14 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
15 | try {
16 | XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
17 | @Override
18 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
19 | // alternatively just disable an activity:
20 | // adb shell su -c "pm disable com.google.android.gms/com.google.android.location.settings.LocationSettingsCheckerActivity"
21 | XposedHelpers.findAndHookMethod("com.google.android.location.settings.LocationSettingsCheckerChimeraActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
22 | @Override
23 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
24 | XposedHelpers.callMethod(param.thisObject, "finish");
25 | }
26 | });
27 | }
28 | });
29 |
30 | } catch (Throwable t) {
31 | XposedBridge.log(t);
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/MinimumBrightnessMX.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
6 |
7 | import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
8 |
9 | public class MinimumBrightnessMX {
10 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
11 | try {
12 | findAndHookMethod("com.mxtech.videoplayer.widget.BrightnessBar", lpparam.classLoader, "a", int.class, int.class, new XC_MethodHook() {
13 | @Override
14 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
15 | int n = (Integer) param.args[0];
16 | int n2 = (Integer) param.args[1];
17 |
18 | double d = 0.064 + 0.936 / (double) n * (double) n2;
19 | param.setResult(d * d);
20 | }
21 | });
22 |
23 | findAndHookMethod("com.mxtech.videoplayer.widget.BrightnessBar", lpparam.classLoader, "a", int.class, double.class, new XC_MethodHook() {
24 | @Override
25 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
26 | int n = (Integer) param.args[0];
27 | double d = (Double) param.args[1];
28 |
29 | param.setResult((int) Math.round((double) ((Math.sqrt((double) d) - 0.064) * (double) n / 0.936)));
30 | }
31 | });
32 | } catch (Throwable t) {
33 | XposedBridge.log(t);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/NoToastIcons.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import android.view.View;
4 | import android.view.WindowManager;
5 | import android.widget.ImageView;
6 | import android.widget.RelativeLayout;
7 |
8 | import de.robv.android.xposed.XC_MethodHook;
9 | import de.robv.android.xposed.XposedBridge;
10 | import de.robv.android.xposed.XposedHelpers;
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
12 |
13 | public class NoToastIcons {
14 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
15 | try {
16 | XposedBridge.hookAllMethods(XposedHelpers.findClass("android.widget.Toast.TN", lpparam.classLoader), "trySendAccessibilityEvent", new XC_MethodHook() {
17 | @Override
18 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
19 | View mView = (View) XposedHelpers.getObjectField(param.thisObject, "mView");
20 | RelativeLayout relativeLayout = (RelativeLayout) mView;
21 | ImageView icon = (ImageView) relativeLayout.getChildAt(1);
22 |
23 | WindowManager mWM = (WindowManager) XposedHelpers.getObjectField(param.thisObject, "mWM");
24 | WindowManager.LayoutParams mParams = (WindowManager.LayoutParams) XposedHelpers.getObjectField(param.thisObject, "mParams");
25 |
26 | mWM.removeView(mView);
27 | icon.setImageDrawable(null);
28 | mWM.addView(mView, mParams);
29 | }
30 | });
31 | } catch (Throwable t) {
32 | XposedBridge.log(t);
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/GMapsMinimizedBar.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.content.Context;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class GMapsMinimizedBar {
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.google.android.apps.gmm.base.app.GoogleMapsApplication", lpparam.classLoader), "attachBaseContext", Context.class, new XC_MethodHook() {
14 | @Override
15 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
16 | // >= 9.68.2
17 | try {
18 | XposedBridge.hookAllConstructors(XposedHelpers.findClass("com.google.android.apps.gmm.home.views.HomeBottomSheetView", lpparam.classLoader), new XC_MethodHook() {
19 | @Override
20 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
21 | // Black magic
22 | XposedHelpers.setObjectField(param.thisObject, "l", 0);
23 | XposedHelpers.setObjectField(param.thisObject, "m", 0);
24 | }
25 | });
26 | } catch (Throwable t) {
27 | XposedBridge.log(t);
28 | }
29 | }
30 | });
31 | } catch (Throwable t) {
32 | XposedBridge.log(t);
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/copycat/NoOverlayWarning.java:
--------------------------------------------------------------------------------
1 | /*
2 | from https://github.com/apsun/NoOverlayWarning
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks.copycat;
6 |
7 | import android.view.MotionEvent;
8 |
9 | import de.robv.android.xposed.XC_MethodHook;
10 | import de.robv.android.xposed.XposedBridge;
11 | import de.robv.android.xposed.XposedHelpers;
12 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
13 |
14 | public class NoOverlayWarning {
15 | // New flag secretly added in Android 6.0.1 it seems
16 | // https://android.googlesource.com/platform/frameworks/native/+/03a53d1c7765eeb3af0bc34c3dff02ada1953fbf%5E!/
17 | private static final int FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2;
18 |
19 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
20 | try {
21 | XposedHelpers.findAndHookMethod(MotionEvent.class, "getFlags", new XC_MethodHook() {
22 | @Override
23 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
24 | int flags = (Integer)param.getResult();
25 | if ((flags & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) {
26 | flags &= ~MotionEvent.FLAG_WINDOW_IS_OBSCURED;
27 | //XposedBridge.log("AIO: Cleared FLAG_WINDOW_IS_OBSCURED flag");
28 | }
29 |
30 | if ((flags & FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
31 | flags &= ~FLAG_WINDOW_IS_PARTIALLY_OBSCURED;
32 | //XposedBridge.log("AIO: Cleared FLAG_WINDOW_IS_PARTIALLY_OBSCURED flag");
33 | }
34 | param.setResult(flags);
35 | }
36 | });
37 | } catch (Throwable t) {
38 | XposedBridge.log(t);
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S7TouchKeyLight.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.os.Build;
4 | import android.os.Bundle;
5 |
6 | import de.robv.android.xposed.XC_MethodHook;
7 | import de.robv.android.xposed.XposedBridge;
8 | import de.robv.android.xposed.XposedHelpers;
9 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
10 |
11 | public class S7TouchKeyLight {
12 | public static boolean spoofATT = false;
13 |
14 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
15 | try {
16 | String clazz = "com.samsung.android.settings.display.SecDisplaySettings";
17 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
18 | clazz = "com.android.settings.DisplaySettings";
19 |
20 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass(clazz, lpparam.classLoader), "onCreate", Bundle.class, new XC_MethodHook() {
21 | @Override
22 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
23 | spoofATT = true;
24 | }
25 |
26 | @Override
27 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
28 | spoofATT = false;
29 | }
30 | });
31 |
32 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.android.settings.Utils", lpparam.classLoader), "readSalesCode", new XC_MethodHook() {
33 | @Override
34 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
35 | if (spoofATT)
36 | param.setResult("ATT");
37 | }
38 | });
39 | } catch (Throwable t) {
40 | XposedBridge.log(t);
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S7DetailedBatteryUsage.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.content.res.Resources;
4 | import android.os.Bundle;
5 | import android.os.Parcelable;
6 | import android.preference.PreferenceScreen;
7 |
8 | import de.robv.android.xposed.XC_MethodHook;
9 | import de.robv.android.xposed.XposedBridge;
10 | import de.robv.android.xposed.XposedHelpers;
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
12 |
13 | public class S7DetailedBatteryUsage {
14 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
15 | try {
16 | XposedHelpers.findAndHookMethod("com.android.settings.fuelgauge.BatteryHistoryPreference", lpparam.classLoader, "performClick", PreferenceScreen.class, new XC_MethodHook() {
17 | @Override
18 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
19 | Object mHelper = XposedHelpers.getObjectField(param.thisObject, "mHelper");
20 | Bundle args = new Bundle();
21 | args.putString("stats", "tmp_bat_history.bin");
22 | args.putParcelable("broadcast", (Parcelable) XposedHelpers.callMethod(mHelper, "getBatteryBroadcast"));
23 |
24 | Object sa = XposedHelpers.callMethod(param.thisObject, "getContext");
25 | Resources resources = (Resources) XposedHelpers.callMethod(sa, "getResources");
26 | int title = resources.getIdentifier("history_details_title", "string", "com.android.settings");
27 | XposedHelpers.callMethod(sa, "startPreferencePanel", "com.android.settings.fuelgauge.BatteryHistoryDetail", args, title, null, null, 0);
28 | }
29 | });
30 | } catch (Throwable t) {
31 | XposedBridge.log(t);
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | All My...
3 |
4 |
5 | - Off
6 | - 10 ms
7 | - 15 ms
8 | - 20 ms
9 | - 25 ms
10 | - 30 ms
11 |
12 |
13 | - -1
14 | - 10
15 | - 15
16 | - 20
17 | - 25
18 | - 30
19 |
20 |
21 |
22 | - Off
23 | - 1
24 | - 2
25 | - 3
26 | - 4
27 | - 5
28 | - 6
29 | - 7
30 | - 8
31 | - 9
32 |
33 |
34 | - -1
35 | - 1
36 | - 2
37 | - 3
38 | - 4
39 | - 5
40 | - 6
41 | - 7
42 | - 8
43 | - 9
44 |
45 |
46 |
47 | - Off
48 | - Vol+ = left
49 | - Vol+ = left (auto orientation)
50 | - Vol+ = right
51 | - Vol+ = right (auto orientation)
52 |
53 |
54 | - -1
55 | - 1
56 | - 3
57 | - 2
58 | - 4
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/OneWayBrightness.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class OneWayBrightness {
9 | public static float lastLux = 0.0f;
10 |
11 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedHelpers.findAndHookMethod("com.android.server.display.AutomaticBrightnessController", lpparam.classLoader, "handleLightSensorEvent", long.class, float.class, new XC_MethodHook() {
14 | @Override
15 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
16 | float lux = (float) param.args[1];
17 | //XposedBridge.log("onewaybrightness: handleLightSensorEvent: " + Float.toString(lux));
18 | if (lux < lastLux)
19 | param.setResult(null);
20 | else
21 | lastLux = lux;
22 | }
23 | });
24 |
25 | XposedHelpers.findAndHookMethod("com.android.server.display.AutomaticBrightnessController", lpparam.classLoader, "setLightSensorEnabled", boolean.class, new XC_MethodHook() {
26 | @Override
27 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
28 | boolean enable = (boolean) param.args[0];
29 | //XposedBridge.log("onewaybrightness: setLightSensorEnabled: " + Boolean.toString(enable));
30 | if (!enable)
31 | lastLux = 0.0f;
32 | }
33 | });
34 | } catch (Throwable t) {
35 | XposedBridge.log(t);
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S7sRGBVideo.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class S7sRGBVideo {
9 | public static boolean wasSetBasic = false;
10 |
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedHelpers.findAndHookMethod("com.samsung.android.mdnie.AdaptiveDisplayColorService", lpparam.classLoader, "monitorForegroundBrowser", String.class, int.class, int.class, new XC_MethodHook() {
14 | @Override
15 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
16 | String pkg = (String) param.args[0];
17 | //XposedBridge.log("AIO: monitorForegroundBrowser: " + pkg);
18 |
19 | if (pkg.startsWith("com.mxtech.videoplayer") || pkg.startsWith("com.google.android.youtube") || pkg.startsWith("com.google.android.videos")) {
20 | // Display modes:
21 | // 0 = AMOLED cinema
22 | // 1 = AMOLED photo
23 | // 2 = Basic
24 | // 4 = Adaptive display
25 |
26 | XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.sec.android.hardware.SecHardwareInterface", lpparam.classLoader), "setmDNIeUserMode", 2);
27 | wasSetBasic = true;
28 | } else if (wasSetBasic) {
29 | XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.sec.android.hardware.SecHardwareInterface", lpparam.classLoader), "setmDNIeUserMode", 4);
30 | wasSetBasic = false;
31 | }
32 | }
33 | });
34 | } catch (Throwable t) {
35 | XposedBridge.log(t);
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_cyanogenmod.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
20 |
23 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_copycats.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/copycat/HideNetworkIndicators.java:
--------------------------------------------------------------------------------
1 | /*
2 | from https://github.com/nadeemsultan/HideNetworkIndicators
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks.copycat;
6 |
7 | import android.view.View;
8 | import android.widget.ImageView;
9 |
10 | import de.robv.android.xposed.XposedBridge;
11 | import de.robv.android.xposed.callbacks.XC_InitPackageResources;
12 | import de.robv.android.xposed.callbacks.XC_LayoutInflated;
13 |
14 | public class HideNetworkIndicators {
15 | public static void hook(XC_InitPackageResources.InitPackageResourcesParam iprparam) {
16 | try {
17 | iprparam.res.hookLayout("com.android.systemui", "layout", "signal_cluster_view", new XC_LayoutInflated() {
18 | @Override
19 | public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
20 | ImageView wifi_inout = (ImageView) liparam.view.findViewById(liparam.res.getIdentifier("wifi_inout", "id", "com.android.systemui"));
21 | if (wifi_inout != null)
22 | wifi_inout.setVisibility(View.GONE);
23 | ImageView mobile_inout = (ImageView) liparam.view.findViewById(liparam.res.getIdentifier("mobile_inout", "id", "com.android.systemui"));
24 | if (mobile_inout != null)
25 | mobile_inout.setVisibility(View.GONE);
26 | }
27 | });
28 |
29 | iprparam.res.hookLayout("com.android.systemui", "layout", "mobile_signal_group", new XC_LayoutInflated() {
30 | @Override
31 | public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
32 | ImageView mobile_inout = (ImageView) liparam.view.findViewById(liparam.res.getIdentifier("mobile_inout", "id", "com.android.systemui"));
33 | if (mobile_inout != null)
34 | mobile_inout.setVisibility(View.GONE);
35 | }
36 | });
37 | } catch (Throwable t) {
38 | XposedBridge.log(t);
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/RemapRedialToNextTrack.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.annotation.TargetApi;
4 | import android.bluetooth.BluetoothDevice;
5 | import android.content.Intent;
6 | import android.media.AudioManager;
7 | import android.os.SystemClock;
8 | import android.view.KeyEvent;
9 |
10 | import de.robv.android.xposed.XC_MethodHook;
11 | import de.robv.android.xposed.XposedBridge;
12 | import de.robv.android.xposed.XposedHelpers;
13 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
14 |
15 | public class RemapRedialToNextTrack {
16 |
17 | @TargetApi(19)
18 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
19 | try {
20 | XposedHelpers.findAndHookMethod("com.android.bluetooth.hfp.HeadsetStateMachine", lpparam.classLoader, "processDialCall", String.class, BluetoothDevice.class, new XC_MethodHook() {
21 | @Override
22 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
23 | XposedHelpers.callMethod(param.thisObject, "atResponseCodeNative", 0, 0, XposedHelpers.callMethod(param.thisObject, "getByteAddress", param.args[1]));
24 |
25 | AudioManager mAudioManager = (AudioManager) XposedHelpers.getObjectField(param.thisObject, "mAudioManager");
26 |
27 | long eventtime = SystemClock.uptimeMillis();
28 | Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
29 | KeyEvent keyEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
30 | keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
31 | mAudioManager.dispatchMediaKeyEvent(keyEvent);
32 |
33 | keyEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_UP);
34 | keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
35 | mAudioManager.dispatchMediaKeyEvent(keyEvent);
36 |
37 | param.setResult(null);
38 | }
39 | });
40 | } catch (Throwable t) {
41 | XposedBridge.log(t);
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/NoPasswordAfterBootTW.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class NoPasswordAfterBootTW {
9 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
10 | try {
11 | XposedHelpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "isUnlockWithFingerprintPossible", int.class, new XC_MethodHook() {
12 | @Override
13 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
14 | param.setResult(true);
15 | }
16 | });
17 | } catch (Throwable t) {
18 | XposedBridge.log("KeyguardUpdateMonitor.isUnlockWithFingerprintPossible(int) not available");
19 | }
20 | try {
21 | XposedHelpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "isUnlockCompleted", new XC_MethodHook() {
22 | @Override
23 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
24 | param.setResult(true);
25 | }
26 | });
27 |
28 | XposedHelpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "isUnlockingWithFingerprintAllowed", new XC_MethodHook() {
29 | @Override
30 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
31 | param.setResult(true);
32 | }
33 | });
34 |
35 | XposedHelpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "isFingerprintDisabled", int.class, new XC_MethodHook() {
36 | @Override
37 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
38 | param.setResult(false);
39 | }
40 | });
41 | } catch (Throwable t) {
42 | XposedBridge.log(t);
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_thirdparty.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/copycat/GentleHapticFeedback.java:
--------------------------------------------------------------------------------
1 | /*
2 | from https://github.com/GravityBox/GravityBox
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks.copycat;
6 |
7 | import android.content.Context;
8 | import android.os.Build;
9 |
10 | import de.robv.android.xposed.XC_MethodHook;
11 | import de.robv.android.xposed.XposedBridge;
12 | import de.robv.android.xposed.XposedHelpers;
13 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
14 |
15 | public class GentleHapticFeedback {
16 | private static Object mPhoneWindowManager;
17 |
18 | static long vibePattern;
19 |
20 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam, int value) {
21 | try {
22 | vibePattern = value;
23 |
24 | String pkg = "com.android.internal.policy.impl";
25 | if (Build.VERSION.SDK_INT >= 23)
26 | pkg = "com.android.server.policy";
27 |
28 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass(pkg + ".PhoneWindowManager", lpparam.classLoader), "init", Context.class, "android.view.IWindowManager", "android.view.WindowManagerPolicy.WindowManagerFuncs", new XC_MethodHook() {
29 | @Override
30 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
31 | mPhoneWindowManager = param.thisObject;
32 |
33 | if (mPhoneWindowManager == null)
34 | return;
35 |
36 | try {
37 | XposedHelpers.setObjectField(mPhoneWindowManager, "mVirtualKeyVibePattern", new long[]{vibePattern});
38 | if (Build.MANUFACTURER.toLowerCase().contains("lenovo")) {
39 | XposedHelpers.setObjectField(mPhoneWindowManager, "mVirtualKeyVibePatternDown", new long[]{vibePattern});
40 | XposedHelpers.setObjectField(mPhoneWindowManager, "mKeyboardTapVibePattern", new long[]{vibePattern});
41 | XposedHelpers.setObjectField(mPhoneWindowManager, "mLongPressVibePattern", new long[]{vibePattern*2});
42 | }
43 | } catch (Throwable t) {
44 | XposedBridge.log(t);
45 | }
46 | }
47 | });
48 | } catch (Throwable t) {
49 | XposedBridge.log(t);
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/NoExitConfirmation.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.os.SystemClock;
4 | import android.view.KeyEvent;
5 |
6 | import de.robv.android.xposed.XC_MethodHook;
7 | import de.robv.android.xposed.XposedBridge;
8 | import de.robv.android.xposed.XposedHelpers;
9 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
10 |
11 | public class NoExitConfirmation {
12 | public static void hookBackup(final XC_LoadPackage.LoadPackageParam lpparam) {
13 | try {
14 | XposedHelpers.findAndHookMethod("mobi.infolife.appbackup.ui.screen.mainpage.ActivityBrPage", lpparam.classLoader, "onKeyDown", int.class, KeyEvent.class, new XC_MethodHook() {
15 | @Override
16 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
17 | if (((KeyEvent) param.args[1]).getKeyCode() == KeyEvent.KEYCODE_BACK) {
18 | XposedHelpers.callMethod(param.thisObject, "finish");
19 | param.setResult(true);
20 | }
21 | }
22 | });
23 | } catch (Throwable t) {
24 | XposedBridge.log(t);
25 | }
26 | }
27 |
28 | public static void hookCG(final XC_LoadPackage.LoadPackageParam lpparam) {
29 | try {
30 | XposedHelpers.findAndHookMethod("com.circlegate.tt.transit.android.activity.MainActivity", lpparam.classLoader, "onBackPressedAfterListeners", new XC_MethodHook() {
31 | @Override
32 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
33 | XposedHelpers.setObjectField(param.thisObject, "backTimeStamp", SystemClock.elapsedRealtime());
34 | }
35 | });
36 | } catch (Throwable t) {
37 | XposedBridge.log(t);
38 | }
39 | }
40 |
41 | public static void hookSolid(final XC_LoadPackage.LoadPackageParam lpparam) {
42 | try {
43 | XposedBridge.hookAllConstructors(XposedHelpers.findClass("pl.solidexplorer.SolidExplorer", lpparam.classLoader), new XC_MethodHook() {
44 | @Override
45 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
46 | XposedHelpers.setObjectField(param.thisObject, "b", true);
47 | }
48 | });
49 | } catch (Throwable t) {
50 | XposedBridge.log(t);
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/PocketFirst.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.content.ComponentName;
4 | import android.os.Build;
5 |
6 | import java.util.LinkedHashMap;
7 |
8 | import de.robv.android.xposed.XC_MethodHook;
9 | import de.robv.android.xposed.XposedBridge;
10 | import de.robv.android.xposed.XposedHelpers;
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
12 |
13 | public class PocketFirst {
14 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
15 | try {
16 | if (Build.VERSION.SDK_INT >= 23) {
17 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.internal.app.ResolverComparator", lpparam.classLoader), "compute", new XC_MethodHook() {
18 | @Override
19 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
20 | boolean modded = false;
21 | @SuppressWarnings("unchecked")
22 | LinkedHashMap map = (LinkedHashMap) XposedHelpers.getObjectField(param.thisObject, "mScoredTargets");
23 | for (ComponentName key : map.keySet()) {
24 | if (key.getPackageName().equals("com.ideashower.readitlater.pro")) {
25 | Object target = map.get(key);
26 | XposedHelpers.setObjectField(target, "score", Float.MAX_VALUE);
27 | map.put(key, target);
28 | modded = true;
29 | break;
30 | }
31 | }
32 | if (modded)
33 | XposedHelpers.setObjectField(param.thisObject, "mScoredTargets", map);
34 | }
35 | });
36 | } else {
37 | XposedHelpers.findAndHookMethod("com.android.internal.app.ResolverActivity.ResolverComparator", lpparam.classLoader, "getPackageTimeSpent", String.class, new XC_MethodHook() {
38 | @Override
39 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
40 | if (param.args[0].equals("com.ideashower.readitlater.pro"))
41 | param.setResult(Long.MAX_VALUE);
42 | }
43 | });
44 | }
45 | } catch (Throwable t) {
46 | XposedBridge.log(t);
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S5ReaderMode.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.os.Build;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class S5ReaderMode {
11 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
12 | try {
13 | XposedHelpers.findAndHookConstructor("dalvik.system.PathClassLoader", lpparam.classLoader, String.class, ClassLoader.class, new XC_MethodHook() {
14 | @Override
15 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
16 | String path = (String) param.args[0];
17 |
18 | if (path.equals("/system/framework/ssrm.jar")) {
19 | String cls = "d.bs";
20 | String fnc = "fX";
21 | if (Build.VERSION.SDK_INT < 23) {
22 | cls = "c.aB";
23 | fnc = "eK";
24 | }
25 |
26 | // this method calls addPackage("com.google.android.apps.books");
27 | try {
28 | XposedHelpers.findAndHookMethod(cls, (ClassLoader) param.thisObject, "gb", new XC_MethodHook() {
29 | @Override
30 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
31 | addPackages(param.thisObject);
32 | }
33 | });
34 | } catch (Throwable t) {
35 | XposedHelpers.findAndHookMethod(cls, (ClassLoader) param.thisObject, fnc, new XC_MethodHook() {
36 | @Override
37 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
38 | addPackages(param.thisObject);
39 | }
40 | });
41 | }
42 | }
43 | }
44 | });
45 | } catch (Throwable t) {
46 | XposedBridge.log(t);
47 | }
48 | }
49 |
50 | private static void addPackages(Object thisObject) {
51 | XposedHelpers.callMethod(thisObject, "addPackage", "com.flyersoft.moonreader");
52 | XposedHelpers.callMethod(thisObject, "addPackage", "com.flyersoft.moonreaderp");
53 | XposedHelpers.callMethod(thisObject, "addPackage", "com.adobe.reader");
54 | XposedBridge.log("AIO: added pkgs");
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/NoWakeOnCharge.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.os.Build;
4 |
5 | import de.robv.android.xposed.XC_MethodHook;
6 | import de.robv.android.xposed.XposedBridge;
7 | import de.robv.android.xposed.XposedHelpers;
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
9 |
10 | public class NoWakeOnCharge {
11 |
12 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
13 | try {
14 | XposedHelpers.findAndHookMethod("com.android.server.power.PowerManagerService", lpparam.classLoader, "shouldWakeUpWhenPluggedOrUnpluggedLocked", boolean.class, int.class, boolean.class, new XC_MethodHook() {
15 | @Override
16 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
17 | param.setResult(false);
18 | }
19 | });
20 | } catch (Throwable t) {
21 | XposedBridge.log(t);
22 | }
23 | }
24 |
25 | public static void hookUI(final XC_LoadPackage.LoadPackageParam lpparam) {
26 | try {
27 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N || !Build.MANUFACTURER.toLowerCase().contains("samsung"))
28 | return;
29 |
30 | XposedHelpers.findAndHookMethod("com.android.systemui.power.PowerNotificationWarnings", lpparam.classLoader, "playSound", int.class, new XC_MethodHook() {
31 | @Override
32 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
33 | int type = (int) param.args[0];
34 | if (type == 1) // SOUND_TYPE_CHARGER_CONNECTION
35 | param.setResult(null);
36 | }
37 | });
38 |
39 | // NoSuchMethodError on Galaxy S7, but not actually needed (or is it? showWirelessChargerInfoNotice())
40 | try {
41 | XposedHelpers.findAndHookMethod("com.android.systemui.power.PowerNotificationWarnings", lpparam.classLoader, "showWirelessChargingNotice", new XC_MethodHook() {
42 | @Override
43 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
44 | param.setResult(null);
45 | }
46 | });
47 | } catch (NoSuchMethodError e) {}
48 |
49 | XposedHelpers.findAndHookMethod("com.android.systemui.power.PowerNotificationWarnings", lpparam.classLoader, "showFullBatteryNotice", new XC_MethodHook() {
50 | @Override
51 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
52 | //XposedBridge.log("showFullBatteryNotice");
53 | param.setResult(null);
54 | }
55 | });
56 |
57 | /*
58 | XposedHelpers.findAndHookMethod("com.android.systemui.power.PowerNotificationWarnings", lpparam.classLoader, "showFullBatteryNotification", new XC_MethodHook() {
59 | @Override
60 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
61 | XposedBridge.log("showFullBatteryNotification");
62 | //param.setResult(null);
63 | }
64 | });
65 | */
66 | } catch (Throwable t) {
67 | XposedBridge.log(t);
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/BatteryLightDisabler.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import de.robv.android.xposed.XC_MethodHook;
4 | import de.robv.android.xposed.XposedBridge;
5 | import de.robv.android.xposed.XposedHelpers;
6 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
7 |
8 | public class BatteryLightDisabler {
9 | public static int mode;
10 | public static boolean screenOn = true;
11 |
12 | public static Object BatteryService;
13 | public static Object Led;
14 |
15 | public static Runnable runnable;
16 |
17 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
18 | try {
19 | runnable = new Runnable() {
20 | public void run() {
21 | XposedHelpers.callMethod(Led, "updateLightsLocked");
22 | }
23 | };
24 |
25 | XposedBridge.hookAllConstructors(XposedHelpers.findClass("com.android.server.BatteryService", lpparam.classLoader), new XC_MethodHook() {
26 | @Override
27 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
28 | BatteryService = param.thisObject;
29 | }
30 | });
31 |
32 | XposedBridge.hookAllConstructors(XposedHelpers.findClass("com.android.server.BatteryService.Led", lpparam.classLoader), new XC_MethodHook() {
33 | @Override
34 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
35 | Led = param.thisObject;
36 | }
37 | });
38 |
39 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.BatteryService.Led", lpparam.classLoader), "updateLightsLocked", new XC_MethodHook() {
40 | @Override
41 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
42 | if (mode > 0 || screenOn)
43 | XposedHelpers.setObjectField(BatteryService, "mLightEnabled", false);
44 | else
45 | XposedHelpers.setObjectField(BatteryService, "mLightEnabled", true);
46 | }
47 | });
48 |
49 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.notification.ZenModeHelper", lpparam.classLoader), "dispatchOnZenModeChanged", new XC_MethodHook() {
50 | @Override
51 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
52 | mode = (Integer) XposedHelpers.getObjectField(param.thisObject, "mZenMode");
53 | runnable.run();
54 | }
55 | });
56 |
57 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.power.PowerManagerService", lpparam.classLoader), "wakeUpNoUpdateLocked", new XC_MethodHook() {
58 | @Override
59 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
60 | screenOn = true;
61 | runnable.run();
62 | }
63 | });
64 |
65 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.power.PowerManagerService", lpparam.classLoader), "goToSleepNoUpdateLocked", new XC_MethodHook() {
66 | @Override
67 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
68 | screenOn = false;
69 | runnable.run();
70 | }
71 | });
72 | } catch (Throwable t) {
73 | XposedBridge.log(t);
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AllMy...
2 | Collection of various tweaks for CyanogenMod/LineageOS/AOSP/TouchWiz and few apps (Firefox, Adobe Reader, MX Player).
3 |
4 | List of tweaks:
5 | * Disable Su Indicator - Disable # (pound/hash) indicator in status bar
6 | * Always Software Menu - Allows to have both software menu button and menu mapped to key on CM. Workaround for this.
7 | * No Toast Icons
8 | * Pocket First - Make Pocket the first option when sharing
9 | * Desk Clock Alarm - Make Alarm the default tab in stock/Google Desk Clock
10 | * One Way Brightness - Make auto brightness go only up
11 | * Battery Light Disabler - Battery light will not shine when in downtime (Interruptions) or when the screen is on
12 | * One Hand Zoom Enabler (Firefox/Adobe Reader)
13 | * Battery History XXL - Enlarge the stock settings battery history - from 10 to 30 records
14 | * Native Freezer - Disable and re-enable any 3rd party app from System Settings
15 | * Minimum Brightness (MX Player/system) - Change the minimum brightness level from usual 10 to 1
16 | * Gentle Haptic Feedback
17 | * Compact Volume Panel
18 | * Chrome Tabs Toolbar On Phone - Enable tablet layout while keep mobile User Agent
19 | * Disable Horizontal Scroll (Adobe Reader)
20 | * Remap PREV button to PLAY/PAUSE - Allow use volume keys to change volume, advance to next song and play/pause
21 | * Remap NEXT button to Torch - Allow use volume up key (long press) to start flashlight (when music is off)
22 | * K920 Cardboard Fix - Fix screen resolution in Google Cardboard on Lenovo Vibe Z2 Pro (K920)
23 | * No Wake On Charge - Disable screen wake when cable is plugged in/unplugged on Samsung Galaxy S5 (stock Android 5.0)
24 | * Reader Mode (Adapt Display) - Enable Samsung screen ebook reading mode for Adobe Reader/Moon+ Reader on Samsung Galaxy S5 (stock Android 5.0)
25 | * Disable Android Wear Disconnected Notification
26 | * Media Stream Default - Prefer media instead of ringer during volume control
27 | * Advanced Volume Keys - Long press VOLUME -/+ for PLAY_PAUSE/NEXT when screen is off or showing lock screen
28 | * No Password After Boot - Disable the "Unable to use fingerprints. Device restarted. Enter backup password, then fingerprints can be used next time device locked." message
29 | * Touch key light - Re-enable the lost option to set buttons light timeout (Samsung Galaxy S7)
30 | * sRGB for video only - Switch to sRGB (Basic screen mode) for video (MX Player/YouTube) while keeping Adaptive for everything else (Samsung Galaxy S7)
31 | * MTP Without Unlock - Start MTP even with screen off or without unlocking unsecure keyguard (Samsung Galaxy S5/S7)
32 | * Allow MTP Access - Get rid of the "Allow access to device data" dialog (Samsung Galaxy S7)
33 | * Disable Battery Prediction - Hide the estimated battery usage in battery graph
34 | * Detailed Battery Usage - Enable detailed 'Wi-Fi/Awake/Screen on' battery usage stats
35 | * NEW! No Gboard Bar - Disable the top bar in Google's Gboard keyboard
36 | * NEW! Keep LED off during DnD (Samsung Galaxy S7)
37 | * NEW! 'LTE/3G(auto connect)' network mode - Enable network mode profile without 2G in the system settings (Samsung Galaxy S7)
38 | * NEW! Remap BT Redial to Next Track - Great for headsets like QCY Q26
39 | * NEW! Minimized bottom bar in Google Maps - It's no longer necessary to touch the screen
40 | * NEW! Disable Location Dialog in Google Maps - Get rid of the 'To continue, let your device turn on location using Google's Location Service' alert
41 |
42 |
43 |
44 | ... or Xposed repo: http://repo.xposed.info/module/com.smartmadsoft.xposed.aio
45 |
46 | Thread at xda: http://forum.xda-developers.com/xposed/modules/mod-xposed-tweaks-cm-t3279109
47 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/onehandzoomenabler/AR.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.onehandzoomenabler;
2 |
3 | import android.content.Context;
4 | import android.os.Build;
5 | import android.util.AttributeSet;
6 | import android.view.MotionEvent;
7 | import android.view.ScaleGestureDetector;
8 |
9 | import de.robv.android.xposed.XC_MethodHook;
10 | import de.robv.android.xposed.XposedBridge;
11 | import de.robv.android.xposed.XposedHelpers;
12 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
13 |
14 | public class AR {
15 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
16 | XposedHelpers.findAndHookConstructor("com.adobe.reader.viewer.ARPageView", lpparam.classLoader, Context.class, AttributeSet.class, int.class, new XC_MethodHook() {
17 | @Override
18 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
19 | // I have no idea why it's needed as it's fine on other devices
20 | if (Build.MANUFACTURER.toLowerCase().contains("lenovo") && Build.VERSION.SDK_INT == 21)
21 | Common.ignoreFirstScaleWorkaround = true;
22 | Common.mContext = (Context) param.args[0];
23 | Common.thisObject = param.thisObject;
24 | Common.mCurrTouchXform = XposedHelpers.getObjectField(param.thisObject, "mCurrTouchXform");
25 | Common.mScaleDetector = new ScaleGestureDetector(Common.mContext, new Common.ScaleListener());
26 | }
27 | });
28 |
29 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.adobe.reader.viewer.ARPageView", lpparam.classLoader), "onMultiTouchDragOrPinch", new XC_MethodHook() {
30 | @Override
31 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
32 | if (Common.isInScale)
33 | param.setResult(null);
34 | }
35 | });
36 |
37 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.adobe.reader.viewer.ARPageView", lpparam.classLoader), "onTouchEvent", new XC_MethodHook() {
38 | @Override
39 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
40 | MotionEvent motionEvent = (MotionEvent) param.args[0];
41 |
42 | if (Common.mScaleDetector != null)
43 | Common.mScaleDetector.onTouchEvent(motionEvent);
44 |
45 | if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
46 | if (Common.executeDoubleTap)
47 | XposedHelpers.callMethod(param.thisObject, "handleDoubleTap", Common.doubleTapParam1, Common.doubleTapParam2);
48 | }
49 | }
50 | });
51 |
52 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.adobe.reader.viewer.ARPageView", lpparam.classLoader), "handleDoubleTap", new XC_MethodHook() {
53 | @Override
54 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
55 | if (Common.executeDoubleTap) {
56 | Common.executeDoubleTap = false;
57 | } else {
58 | Common.executeDoubleTap = true;
59 | Common.doubleTapParam1 = (Double) param.args[0];
60 | Common.doubleTapParam2 = (Double) param.args[1];
61 | param.setResult(null);
62 | }
63 | }
64 | });
65 |
66 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.adobe.reader.viewer.ARPageViewGestureHandler", lpparam.classLoader), "handleLongPress", new XC_MethodHook() {
67 | @Override
68 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
69 | if (Common.isInScale)
70 | param.setResult(null);
71 | }
72 | });
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/LedOffDuringDnD.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.content.Context;
4 | import android.os.UserHandle;
5 | import android.provider.Settings;
6 |
7 | import de.robv.android.xposed.XC_MethodHook;
8 | import de.robv.android.xposed.XposedBridge;
9 | import de.robv.android.xposed.XposedHelpers;
10 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
11 |
12 | public class LedOffDuringDnD {
13 |
14 | private static boolean isZenModeOn = false;
15 |
16 | private static boolean tweakLED = false;
17 | private static boolean tweakVibrator = false;
18 |
19 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam, boolean handleLED, boolean handleVibrator) {
20 | tweakLED = handleLED;
21 | tweakVibrator = handleVibrator;
22 |
23 | try {
24 | // LED
25 | XposedHelpers.findAndHookMethod("com.android.server.notification.ZenModeHelper", lpparam.classLoader, "dispatchOnZenModeChanged", new XC_MethodHook() {
26 | @Override
27 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
28 | handleZenMode(param);
29 | }
30 | });
31 |
32 | XposedHelpers.findAndHookMethod("com.android.server.notification.ZenModeHelper", lpparam.classLoader, "onSystemReady", new XC_MethodHook() {
33 | @Override
34 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
35 | handleZenMode(param);
36 | }
37 | });
38 |
39 | // Vibrator
40 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.VibratorService", lpparam.classLoader), "vibrateMagnitude", new XC_MethodHook() {
41 | @Override
42 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
43 | if (tweakVibrator && isZenModeOn)
44 | param.setResult(null);
45 | }
46 | });
47 |
48 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.VibratorService", lpparam.classLoader), "vibrateCommonPatternMagnitude", new XC_MethodHook() {
49 | @Override
50 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
51 | if (tweakVibrator && isZenModeOn)
52 | param.setResult(null);
53 | }
54 | });
55 |
56 | /*
57 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.VibratorService", lpparam.classLoader), "vibratePatternMagnitude", new XC_MethodHook() {
58 | @Override
59 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
60 | // as well?
61 | }
62 | });
63 | */
64 | } catch (Throwable t) {
65 | XposedBridge.log(t);
66 | }
67 | }
68 |
69 | private static void handleZenMode(XC_MethodHook.MethodHookParam param) {
70 | Context mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext");
71 | isZenModeOn = ((int) XposedHelpers.getObjectField(param.thisObject, "mZenMode") > 0 ? true : false);
72 |
73 | if (tweakLED) {
74 | String prefs[] = {"led_indicator_charing", "led_indicator_low_battery", "led_indicator_missed_event", "led_indicator_voice_recording"};
75 | for (String pref : prefs) {
76 | int newVal = (isZenModeOn ? 0 : 1);
77 | XposedHelpers.callStaticMethod(Settings.System.class, "putIntForUser", mContext.getContentResolver(), pref, newVal, XposedHelpers.getStaticIntField(UserHandle.class, "USER_CURRENT"));
78 | }
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/VolumeKeysCursorControl.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.content.Context;
4 | import android.view.KeyEvent;
5 | import android.view.Surface;
6 | import android.view.WindowManager;
7 |
8 | import de.robv.android.xposed.XC_MethodHook;
9 | import de.robv.android.xposed.XposedBridge;
10 | import de.robv.android.xposed.XposedHelpers;
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
12 |
13 | public class VolumeKeysCursorControl {
14 | private static boolean volUpLeft = true;
15 | private static boolean orientationAware = false;
16 |
17 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam, int type) {
18 | if (type % 2 == 0)
19 | volUpLeft = false;
20 | if (type > 2)
21 | orientationAware = true;
22 |
23 | try {
24 | XposedHelpers.findAndHookMethod("android.inputmethodservice.InputMethodService", lpparam.classLoader, "onKeyDown", int.class, KeyEvent.class, new XC_MethodHook() {
25 | @Override
26 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
27 | KeyEvent event = (KeyEvent) param.args[1];
28 | int keyCode = event.getKeyCode();
29 |
30 | if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
31 | boolean isInputViewShown = (boolean) XposedHelpers.callMethod(param.thisObject, "isInputViewShown");
32 | if (isInputViewShown) {
33 | XposedHelpers.callMethod(param.thisObject, "sendDownUpKeyEvents", getKeyForVolume((keyCode == KeyEvent.KEYCODE_VOLUME_UP ? true : false), (Context) param.thisObject));
34 | param.setResult(true);
35 | } else
36 | param.setResult(false);
37 | }
38 | }
39 | });
40 |
41 | XposedHelpers.findAndHookMethod("android.inputmethodservice.InputMethodService", lpparam.classLoader, "onKeyUp", int.class, KeyEvent.class, new XC_MethodHook() {
42 | @Override
43 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
44 | KeyEvent event = (KeyEvent) param.args[1];
45 | int keyCode = event.getKeyCode();
46 |
47 | if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
48 | boolean isInputViewShown = (boolean) XposedHelpers.callMethod(param.thisObject, "isInputViewShown");
49 | if (isInputViewShown) {
50 | param.setResult(true);
51 | } else
52 | param.setResult(false);
53 | }
54 | }
55 | });
56 | } catch (Throwable t) {
57 | XposedBridge.log(t);
58 | }
59 | }
60 |
61 | private static int getKeyForVolume(boolean eventVolumeUp, Context context) {
62 | boolean volUpLeftNow = volUpLeft;
63 |
64 | if (orientationAware) {
65 | WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
66 | int rotation = wm.getDefaultDisplay().getRotation();
67 |
68 | switch (rotation) {
69 | case Surface.ROTATION_90:
70 | volUpLeftNow = true;
71 | break;
72 | case Surface.ROTATION_180:
73 | volUpLeftNow = !volUpLeftNow;
74 | break;
75 | case Surface.ROTATION_270:
76 | volUpLeftNow = false;
77 | break;
78 | }
79 | }
80 |
81 | if (eventVolumeUp == volUpLeftNow)
82 | return KeyEvent.KEYCODE_DPAD_LEFT;
83 | else
84 | return KeyEvent.KEYCODE_DPAD_RIGHT;
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_tweaks.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
56 |
57 |
65 |
66 |
71 |
72 |
77 |
78 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_s5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
56 |
57 |
62 |
63 |
68 |
69 |
74 |
75 |
80 |
81 |
86 |
87 |
92 |
93 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S7MTPWithoutUnlocking.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.annotation.TargetApi;
4 | import android.app.KeyguardManager;
5 | import android.content.BroadcastReceiver;
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.content.IntentFilter;
9 | import android.os.Message;
10 | import android.os.UserHandle;
11 |
12 | import java.util.UUID;
13 |
14 | import de.robv.android.xposed.XC_MethodHook;
15 | import de.robv.android.xposed.XposedBridge;
16 | import de.robv.android.xposed.XposedHelpers;
17 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
18 |
19 | public class S7MTPWithoutUnlocking {
20 | private static String postfix = "";
21 |
22 | @TargetApi(22)
23 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
24 | try {
25 | XposedHelpers.findAndHookMethod("com.samsung.android.MtpApplication.MtpReceiver$2", lpparam.classLoader, "handleMessage", Message.class, new XC_MethodHook() {
26 | @Override
27 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
28 | Message m = (Message) param.args[0];
29 | // opening mtp session
30 | if (m.what == 14) {
31 | Context mContext = (Context) XposedHelpers.getStaticObjectField(XposedHelpers.findClass("com.samsung.android.MtpApplication.MtpReceiver", lpparam.classLoader), "mContext");
32 | KeyguardManager keyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
33 |
34 | if (!keyguardManager.isDeviceLocked()) {
35 | Intent intent = new Intent("android.intent.action.USER_PRESENT." + postfix);
36 | UserHandle userHandle = (UserHandle) XposedHelpers.getStaticObjectField(UserHandle.class, "ALL");
37 | XposedHelpers.callMethod(mContext, "sendBroadcastAsUser", intent, userHandle);
38 | /*
39 | // shorter but potentially dangerously messing with other receivers
40 | final int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT = 0x08000000;
41 | Intent USER_PRESENT_INTENT = new Intent(Intent.ACTION_USER_PRESENT).addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
42 | XposedHelpers.callMethod(mContext, "sendBroadcastAsUser", USER_PRESENT_INTENT, userHandle);
43 | */
44 | }
45 | }
46 | }
47 | });
48 |
49 | XposedHelpers.findAndHookMethod("com.samsung.android.MtpApplication.MtpService$4", lpparam.classLoader, "onReceive", Context.class, Intent.class, new XC_MethodHook() {
50 | @Override
51 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
52 | Intent intent = (Intent) param.args[1];
53 | //XposedBridge.log("AIO: mtp onReceive action=" + intent.getAction());
54 | if (intent.getAction().equals("android.intent.action.USER_PRESENT." + postfix))
55 | param.args[1] = new Intent("android.intent.action.USER_PRESENT");
56 | }
57 | });
58 |
59 | XposedHelpers.findAndHookMethod("com.samsung.android.MtpApplication.MtpService", lpparam.classLoader, "registerBroadCastuserPresentRec", new XC_MethodHook() {
60 | @Override
61 | protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
62 | //XposedBridge.log("AIO: mtp registerBroadCastuserPresentRec");
63 | postfix = UUID.randomUUID().toString();
64 |
65 | IntentFilter intentFilter = new IntentFilter();
66 | intentFilter.addAction("android.intent.action.USER_PRESENT");
67 | intentFilter.addAction("android.intent.action.USER_PRESENT." + postfix);
68 | BroadcastReceiver mtpUserPresentReceiver = (BroadcastReceiver) XposedHelpers.getObjectField(param.thisObject, "mtpUserPresentReceiver");
69 | UserHandle userHandle = (UserHandle) XposedHelpers.getStaticObjectField(UserHandle.class, "ALL");
70 | XposedHelpers.callMethod(param.thisObject, "registerReceiverAsUser", mtpUserPresentReceiver, userHandle, intentFilter, null, null);
71 | XposedHelpers.setObjectField(param.thisObject, "userPresentRegistered", true);
72 | param.setResult(null);
73 | }
74 | });
75 | } catch (Throwable t) {
76 | XposedBridge.log(t);
77 | }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/touchwiz/S5TouchWizJunk.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.touchwiz;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.res.XModuleResources;
6 | import android.os.Build;
7 | import android.os.Bundle;
8 |
9 | import com.smartmadsoft.xposed.aio.R;
10 |
11 | import de.robv.android.xposed.XC_MethodHook;
12 | import de.robv.android.xposed.XposedBridge;
13 | import de.robv.android.xposed.XposedHelpers;
14 | import de.robv.android.xposed.callbacks.XC_InitPackageResources;
15 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
16 |
17 | public class S5TouchWizJunk {
18 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
19 | try {
20 | if (Build.DEVICE.startsWith("klte")) {
21 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.sec.android.app.popupuireceiver.PopupuiReceiver", lpparam.classLoader), "showBatteryCoverPopup", new XC_MethodHook() {
22 | @Override
23 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
24 | param.setResult(null);
25 | }
26 | });
27 |
28 | if (Build.VERSION.SDK_INT < 23) {
29 | XposedHelpers.findAndHookMethod("com.sec.android.app.popupuireceiver.PopupuiService", lpparam.classLoader, "showUSBCDetacheddDialog", Context.class, new XC_MethodHook() {
30 | @Override
31 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
32 | param.setResult(null);
33 | }
34 | });
35 | }
36 | }
37 | } catch (Throwable t) {
38 | XposedBridge.log(t);
39 | }
40 | }
41 |
42 | public static void hookUI(final XC_LoadPackage.LoadPackageParam lpparam) {
43 | try {
44 | XposedHelpers.findAndHookMethod("com.android.systemui.statusbar.phone.PhoneStatusBar", lpparam.classLoader, "showHideQConnectLayout", new XC_MethodHook() {
45 | @Override
46 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
47 | param.setResult(null);
48 | }
49 | });
50 | } catch (Throwable t) {}
51 |
52 | try {
53 | XposedHelpers.findAndHookMethod("com.android.systemui.qs.tiles.AirplaneModeTile", lpparam.classLoader, "showConfirmPopup", boolean.class, new XC_MethodHook() {
54 | @Override
55 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
56 | XposedHelpers.callMethod(param.thisObject, "setEnabled", param.args[0]);
57 | param.setResult(null);
58 | }
59 | });
60 | } catch (Throwable t) {}
61 |
62 | try {
63 | // Disable "Search phone and scan for nearby devices"
64 | XposedHelpers.findAndHookMethod("com.android.systemui.qs.QSSFinderView", lpparam.classLoader, "getBarVisibility", new XC_MethodHook() {
65 | @Override
66 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
67 | param.setResult(false);
68 | }
69 | });
70 | } catch (Throwable t) {}
71 | }
72 |
73 | public static void hookUIDND(final XC_LoadPackage.LoadPackageParam lpparam) {
74 | try {
75 | // disable priority mode notification
76 | XposedHelpers.findAndHookMethod("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", lpparam.classLoader, "updateVolumeZen", new XC_MethodHook() {
77 | @Override
78 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
79 | param.setResult(null);
80 | }
81 | });
82 | } catch (Throwable t) {
83 | XposedBridge.log(t);
84 | }
85 | }
86 |
87 | public static void hookSettings(final XC_LoadPackage.LoadPackageParam lpparam) {
88 | String secPkg = "";
89 | if (Build.VERSION.SDK_INT >= 24)
90 | secPkg = ".samsung";
91 |
92 | try {
93 | XposedHelpers.findAndHookMethod("com" + secPkg + ".android.settings.bluetooth.BluetoothScanDialog", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
94 | @Override
95 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
96 | ((Activity)param.thisObject).finish();
97 | }
98 | });
99 | } catch (Throwable t) {
100 | XposedBridge.log(t);
101 | }
102 |
103 | try {
104 | XposedHelpers.findAndHookMethod("com" + secPkg + ".android.settings.wifi.WifiPickerDialog", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
105 | @Override
106 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
107 | ((Activity)param.thisObject).finish();
108 | }
109 | });
110 | } catch (Throwable t) {
111 | XposedBridge.log(t);
112 | }
113 | }
114 |
115 | public static void hookThemes(final XC_LoadPackage.LoadPackageParam lpparam) {
116 | try {
117 | if (!Build.DEVICE.startsWith("klte")) {
118 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.samsung.android.thememanager.ThemeManager", lpparam.classLoader), "startTimerForTrial", new XC_MethodHook() {
119 | @Override
120 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
121 | param.setResult(null);
122 | }
123 | });
124 | }
125 | } catch (Throwable t) {
126 | XposedBridge.log(t);
127 | }
128 | }
129 |
130 | public static void hookRes(XC_InitPackageResources.InitPackageResourcesParam iprparam, XModuleResources xModuleResources) {
131 | try {
132 | iprparam.res.setReplacement("com.android.systemui", "dimen", "qs_page_indicator_layout_height", xModuleResources.fwd(R.dimen.sixteen));
133 | iprparam.res.setReplacement("com.android.systemui", "dimen", "qs_tile_height", xModuleResources.fwd(R.dimen.eightynine));
134 | } catch (Throwable t) { }
135 | }
136 | }
137 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/Chrome.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.app.AndroidAppHelper;
4 | import android.content.Context;
5 | import android.content.res.Configuration;
6 | import android.content.res.Resources;
7 | import android.content.res.XResources;
8 | import android.util.DisplayMetrics;
9 |
10 | import de.robv.android.xposed.XC_MethodHook;
11 | import de.robv.android.xposed.XposedBridge;
12 | import de.robv.android.xposed.XposedHelpers;
13 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
14 |
15 | public class Chrome {
16 | public static void hookTabsToolbar(final XC_LoadPackage.LoadPackageParam lpparam) {
17 | try {
18 | XposedHelpers.findAndHookMethod("org.chromium.content.browser.DeviceUtils", lpparam.classLoader, "addDeviceSpecificUserAgentSwitch", Context.class, new XC_MethodHook() {
19 | @Override
20 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
21 | Object commandLineInstance = XposedHelpers.callStaticMethod(XposedHelpers.findClass("org.chromium.base.CommandLine", lpparam.classLoader), "getInstance");
22 | XposedHelpers.callMethod(commandLineInstance, "appendSwitch", "use-mobile-user-agent");
23 | }
24 | });
25 |
26 | /*
27 | // https://codereview.chromium.org/1948143003
28 | // not enough, toolbar is all white now...
29 | final Class ClassToolbarLayout = XposedHelpers.findClass("org.chromium.chrome.browser.toolbar.ToolbarLayout", lpparam.classLoader);
30 | XposedBridge.hookAllMethods(XposedHelpers.findClass("org.chromium.chrome.browser.toolbar.ToolbarControlContainer", lpparam.classLoader), "getProgressBarDrawingInfo", new XC_MethodHook() {
31 | @Override
32 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
33 | Object mToolbar = XposedHelpers.getObjectField(param.thisObject, "mToolbar");
34 | Object progressBar = XposedHelpers.callMethod(ClassToolbarLayout.cast(mToolbar), "getProgressBar");
35 | if (progressBar == null)
36 | param.setResult(null);
37 | }
38 | });
39 | */
40 | } catch (Throwable t) {
41 | XposedBridge.log(t);
42 | }
43 | }
44 |
45 | public static void init() {
46 | try {
47 | // from https://github.com/rovo89/XposedAppSettings
48 | XposedHelpers.findAndHookMethod(Resources.class, "updateConfiguration", Configuration.class, DisplayMetrics.class, "android.content.res.CompatibilityInfo", new XC_MethodHook() {
49 | @Override
50 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
51 | if (param.args[0] == null)
52 | return;
53 |
54 | String packageName;
55 | Resources res = ((Resources) param.thisObject);
56 | if (res instanceof XResources) {
57 | packageName = ((XResources) res).getPackageName();
58 | } else {
59 | try {
60 | packageName = XResources.getPackageNameDuringConstruction();
61 | } catch (IllegalStateException e) {
62 | return;
63 | }
64 | }
65 |
66 | if (isChrome(packageName) || isChrome(AndroidAppHelper.currentPackageName())) {
67 | Configuration newConfig = new Configuration((Configuration) param.args[0]);
68 |
69 | if (param.args[1] != null) {
70 | DisplayMetrics newMetrics;
71 | newMetrics = new DisplayMetrics();
72 | newMetrics.setTo((DisplayMetrics) param.args[1]);
73 | param.args[1] = newMetrics;
74 | }
75 |
76 | newConfig.smallestScreenWidthDp = 600;
77 | newConfig.screenWidthDp = 600;
78 | newConfig.screenHeightDp = 1024;
79 |
80 | param.args[0] = newConfig;
81 | }
82 | }
83 | });
84 | } catch (Throwable t) {
85 | XposedBridge.log(t);
86 | }
87 | }
88 |
89 | public static boolean isChrome(String pkg) {
90 | if (pkg.equals("com.android.chrome") || pkg.equals("com.chrome.beta") || pkg.equals("com.chrome.dev") || pkg.equals("com.chrome.canary"))
91 | return true;
92 | return false;
93 | }
94 |
95 | public static void hookTopSites(final XC_LoadPackage.LoadPackageParam lpparam) {
96 | try {
97 | // Chrome 63 (stable)
98 | XposedHelpers.findAndHookMethod("org.chromium.chrome.browser.suggestions.MostVisitedSitesBridge", lpparam.classLoader, "onURLsAvailable",
99 | String[].class, String[].class, int[].class, String[].class, int[].class, int[].class, long[].class,
100 | new XC_MethodHook() {
101 | @Override
102 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
103 | param.args[0] = new String[0];
104 | param.args[1] = new String[0];
105 | param.args[2] = new int[0];
106 | param.args[3] = new String[0];
107 | param.args[4] = new int[0];
108 | param.args[5] = new int[0];
109 | param.args[6] = new long[0];
110 | }
111 | });
112 | } catch (Throwable t) {
113 | try {
114 | // Chrome 62 (stable)
115 | XposedHelpers.findAndHookMethod("org.chromium.chrome.browser.suggestions.MostVisitedSitesBridge", lpparam.classLoader, "onURLsAvailable",
116 | String[].class, String[].class, int[].class, String[].class, int[].class,
117 | new XC_MethodHook() {
118 | @Override
119 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
120 | param.args[0] = new String[0];
121 | param.args[1] = new String[0];
122 | param.args[2] = new int[0];
123 | param.args[3] = new String[0];
124 | param.args[4] = new int[0];
125 | }
126 | });
127 | } catch (Throwable th) {
128 | XposedBridge.log(th);
129 | }
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/copycat/QuickUnlock.java:
--------------------------------------------------------------------------------
1 | /*
2 | from https://github.com/GravityBox/GravityBox
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks.copycat;
6 |
7 | import android.os.AsyncTask;
8 | import android.os.Build;
9 | import android.os.Handler;
10 | import android.os.Looper;
11 | import android.text.Editable;
12 | import android.text.TextWatcher;
13 | import android.view.View;
14 | import android.widget.TextView;
15 |
16 | import de.robv.android.xposed.XC_MethodHook;
17 | import de.robv.android.xposed.XposedBridge;
18 | import de.robv.android.xposed.XposedHelpers;
19 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
20 |
21 | public class QuickUnlock {
22 |
23 | private static Object mMonitor;
24 |
25 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
26 | try {
27 | if (Build.VERSION.SDK_INT >= 23) {
28 | XposedBridge.hookAllConstructors(XposedHelpers.findClass("com.android.systemui.statusbar.policy.KeyguardMonitor", lpparam.classLoader), new XC_MethodHook() {
29 | @Override
30 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
31 | mMonitor = param.thisObject;
32 | }
33 | });
34 | }
35 |
36 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.android.keyguard.KeyguardPasswordView", lpparam.classLoader), "onFinishInflate", new XC_MethodHook() {
37 | @Override
38 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
39 | final TextView passwordEntry = (TextView) XposedHelpers.getObjectField(param.thisObject, "mPasswordEntry");
40 | if (passwordEntry == null) return;
41 |
42 | passwordEntry.addTextChangedListener(new TextWatcher() {
43 | @Override
44 | public void afterTextChanged(Editable s) {
45 | doQuickUnlock(param.thisObject, passwordEntry.getText().toString());
46 | }
47 | @Override
48 | public void beforeTextChanged(CharSequence arg0,int arg1, int arg2, int arg3) { }
49 | @Override
50 | public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
51 | });
52 | }
53 | });
54 |
55 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.android.keyguard.KeyguardPINView", lpparam.classLoader), "onFinishInflate", new XC_MethodHook() {
56 | @Override
57 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
58 | final View passwordEntry = (View) XposedHelpers.getObjectField(param.thisObject, "mPasswordEntry");
59 | if (passwordEntry != null) {
60 | XposedHelpers.setAdditionalInstanceField(passwordEntry, "gbPINView", param.thisObject);
61 | }
62 | }
63 | });
64 |
65 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.android.keyguard.PasswordTextView", lpparam.classLoader), "append", char.class, new XC_MethodHook() {
66 | @Override
67 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
68 | Object pinView = XposedHelpers.getAdditionalInstanceField(param.thisObject, "gbPINView");
69 | if (pinView != null) {
70 | String entry = (String) XposedHelpers.getObjectField(param.thisObject, "mText");
71 | doQuickUnlock(pinView, entry);
72 | }
73 | }
74 | });
75 | } catch (Throwable t) {
76 | XposedBridge.log(t);
77 | }
78 | }
79 |
80 | private static void doQuickUnlockMM(final Object securityView, final String entry) {
81 | if (entry.length() != 4) return;
82 |
83 | AsyncTask.execute(new Runnable() {
84 | @Override
85 | public void run() {
86 | try {
87 | final Object lockPatternUtils = XposedHelpers.getObjectField(securityView, "mLockPatternUtils");
88 | final Object lockSettings = XposedHelpers.callMethod(lockPatternUtils, "getLockSettings");
89 | //final int userId = mKgMonitor.getCurrentUserId();
90 | final int userId = XposedHelpers.getIntField(mMonitor, "mCurrentUser");
91 |
92 | Object response;
93 | if (Build.VERSION.SDK_INT >= 25)
94 | response = XposedHelpers.callMethod(lockSettings, "checkPassword", entry, userId, null);
95 | else
96 | response = XposedHelpers.callMethod(lockSettings, "checkPassword", entry, userId);
97 |
98 | final int code = (int)XposedHelpers.callMethod(response, "getResponseCode");
99 | if (code == 0) {
100 | final Object callback = XposedHelpers.getObjectField(securityView, "mCallback");
101 | new Handler(Looper.getMainLooper()).post(new Runnable() {
102 | @Override
103 | public void run() {
104 | try {
105 | if (Build.VERSION.SDK_INT >= 24)
106 | XposedHelpers.callMethod(callback, "reportUnlockAttempt", userId, true, 0);
107 | else
108 | XposedHelpers.callMethod(callback, "reportUnlockAttempt", true, userId);
109 | XposedHelpers.callMethod(callback, "dismiss", true);
110 | } catch (Throwable t) {
111 | //log("Error dimissing keyguard: " + t.getMessage());
112 | }
113 | }
114 | });
115 | }
116 | } catch (Throwable t) {
117 | XposedBridge.log(t);
118 | }
119 | }
120 | });
121 | }
122 |
123 | private static void doQuickUnlockLP(Object securityView, String entry) {
124 | try {
125 | final Object callback = XposedHelpers.getObjectField(securityView, "mCallback");
126 | final Object lockPatternUtils = XposedHelpers.getObjectField(securityView, "mLockPatternUtils");
127 |
128 | if (callback != null && lockPatternUtils != null && entry.length() > 3 && (Boolean) XposedHelpers.callMethod(lockPatternUtils, "checkPassword", entry)) {
129 | XposedHelpers.callMethod(callback, "reportUnlockAttempt", true);
130 | XposedHelpers.callMethod(callback, "dismiss", true);
131 | }
132 | } catch (Throwable t) {
133 | XposedBridge.log(t);
134 | }
135 | }
136 |
137 | private static void doQuickUnlock(Object securityView, String entry) {
138 | if (Build.VERSION.SDK_INT >= 23)
139 | doQuickUnlockMM(securityView, entry);
140 | else
141 | doQuickUnlockLP(securityView, entry);
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/cyanogenmod/RemapVolume.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.cyanogenmod;
2 |
3 | import android.content.Context;
4 | import android.hardware.camera2.CameraAccessException;
5 | import android.hardware.camera2.CameraCharacteristics;
6 | import android.hardware.camera2.CameraManager;
7 | import android.media.AudioManager;
8 | import android.os.Build;
9 | import android.os.Message;
10 | import android.os.PowerManager;
11 | import android.view.KeyEvent;
12 |
13 | import de.robv.android.xposed.XC_MethodHook;
14 | import de.robv.android.xposed.XposedBridge;
15 | import de.robv.android.xposed.XposedHelpers;
16 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
17 |
18 | public class RemapVolume {
19 |
20 | static PowerManager mPowerManager;
21 | static Context mContext;
22 | static int MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK = -1;
23 |
24 | static CameraManager mCameraManager;
25 | static String mCameraId;
26 | static Object mTorchManager;
27 | static boolean isTorchOn = false;
28 |
29 | static String pkg;
30 | static boolean tweakTorch = false;
31 | static boolean tweakPlayPause = false;
32 |
33 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam, boolean enablePlayPause, boolean enableTorch) {
34 | try {
35 | tweakPlayPause = enablePlayPause;
36 | tweakTorch = enableTorch;
37 |
38 | pkg = "com.android.internal.policy.impl";
39 | if (Build.VERSION.SDK_INT >= 23)
40 | pkg = "com.android.server.policy";
41 |
42 | XposedHelpers.findAndHookMethod(pkg + ".PhoneWindowManager", lpparam.classLoader, "interceptKeyBeforeQueueing", KeyEvent.class, int.class, new XC_MethodHook() {
43 | @Override
44 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
45 | XposedBridge.log("interceptKeyBeforeQueueing");
46 | int keycode = ((KeyEvent) param.args[0]).getKeyCode();
47 |
48 | if (keycode == KeyEvent.KEYCODE_VOLUME_DOWN || keycode == KeyEvent.KEYCODE_VOLUME_UP) {
49 | if (mPowerManager == null)
50 | mPowerManager = (PowerManager) XposedHelpers.getObjectField(param.thisObject, "mPowerManager");
51 | if (mPowerManager != null) {
52 | PowerManager.WakeLock wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AllMy_ButtonRemap");
53 | wakeLock.acquire(1500);
54 | }
55 | }
56 | }
57 | });
58 |
59 | XposedHelpers.findAndHookMethod(pkg + ".PhoneWindowManager", lpparam.classLoader, "scheduleLongPressKeyEvent", KeyEvent.class, int.class, new XC_MethodHook() {
60 | @Override
61 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
62 | XposedBridge.log("scheduleLongPressKeyEvent");
63 |
64 | if (tweakPlayPause) {
65 | int keycode = (int) param.args[1];
66 | if (keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS)
67 | param.args[1] = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
68 | }
69 |
70 | if (mContext == null)
71 | mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext");
72 | }
73 | });
74 |
75 | XposedHelpers.findAndHookMethod(pkg + ".PhoneWindowManager", lpparam.classLoader, "isMusicActive", new XC_MethodHook() {
76 | @Override
77 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
78 | XposedBridge.log("isMusicActive");
79 | param.setResult(true);
80 | }
81 | });
82 |
83 | if (tweakTorch) {
84 | XposedHelpers.findAndHookMethod(pkg + ".PhoneWindowManager$PolicyHandler", lpparam.classLoader, "handleMessage", Message.class, new XC_MethodHook() {
85 | @Override
86 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
87 | XposedBridge.log("handleMessage");
88 | if (tweakTorch) {
89 | Message msg = (Message) param.args[0];
90 | if (MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK < 0) {
91 | MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK = XposedHelpers.getStaticIntField(XposedHelpers.findClass(pkg + ".PhoneWindowManager", lpparam.classLoader), "MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK");
92 | }
93 | if (msg.what == MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK) {
94 | KeyEvent event = (KeyEvent) msg.obj;
95 |
96 | if (event.getKeyCode() == KeyEvent.KEYCODE_MEDIA_NEXT) {
97 | if (!isMusicActive(mContext)) {
98 | toggleTorch(lpparam, param);
99 | param.setResult(null);
100 | }
101 | }
102 | }
103 | }
104 | }
105 | });
106 | }
107 |
108 | } catch (Throwable t) {
109 | XposedBridge.log(t);
110 | }
111 | }
112 |
113 | static void toggleTorch(final XC_LoadPackage.LoadPackageParam lpparam, XC_MethodHook.MethodHookParam param) {
114 | XposedBridge.log("toggleTorch");
115 | if (Build.VERSION.SDK_INT >= 23) {
116 | if (mCameraManager == null) {
117 | mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
118 | String cameraId = null;
119 | try {
120 | cameraId = getCameraId(mCameraManager);
121 | } catch (Throwable e) {
122 | return;
123 | } finally {
124 | mCameraId = cameraId;
125 | }
126 | }
127 | try {
128 | isTorchOn = !isTorchOn;
129 | mCameraManager.setTorchMode(mCameraId, isTorchOn);
130 | } catch (Throwable e) {
131 | return;
132 | }
133 | } else {
134 | if (mTorchManager == null)
135 | mTorchManager = XposedHelpers.callMethod(mContext, "getSystemService", XposedHelpers.getStaticObjectField(XposedHelpers.findClass("android.content.Context", lpparam.classLoader), "TORCH_SERVICE"));
136 | XposedHelpers.callMethod(mTorchManager, "toggleTorch");
137 | }
138 | }
139 |
140 | static String getCameraId(CameraManager cameraManager) throws CameraAccessException {
141 | if (Build.VERSION.SDK_INT >= 23) {
142 | String[] ids = cameraManager.getCameraIdList();
143 | for (String id : ids) {
144 | CameraCharacteristics c = cameraManager.getCameraCharacteristics(id);
145 | Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
146 | Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
147 | if (flashAvailable != null && flashAvailable && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
148 | return id;
149 | }
150 | }
151 | }
152 | return null;
153 | }
154 |
155 | static boolean isMusicActive(Context context) {
156 | final AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
157 | if (am == null)
158 | return false;
159 | return am.isMusicActive();
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/onehandzoomenabler/Common.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.onehandzoomenabler;
2 |
3 | import android.content.Context;
4 | import android.graphics.PointF;
5 | import android.view.MotionEvent;
6 | import android.view.ScaleGestureDetector;
7 |
8 | import de.robv.android.xposed.XposedHelpers;
9 |
10 | public class Common {
11 | public static ScaleGestureDetector mScaleDetector;
12 | private static float mScaleFactor = 1.f;
13 | public static boolean isInScale = false;
14 | public static boolean executeDoubleTap = false;
15 | public static double doubleTapParam1, doubleTapParam2;
16 | public static boolean ignoreFirstScaleWorkaround = false;
17 |
18 | public static MotionEvent doubleTapMotionEvent;
19 |
20 | public static Context mContext;
21 | public static Object mCurrTouchXform;
22 | public static Object thisObject;
23 |
24 | public static Class classSimpleScaleGestureDetector;
25 |
26 | public static class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
27 | @Override
28 | public boolean onScaleBegin(ScaleGestureDetector detector) {
29 | isInScale = true;
30 | executeDoubleTap = false;
31 | mScaleFactor = 1.f;
32 | return super.onScaleBegin(detector);
33 | }
34 |
35 | @Override
36 | public void onScaleEnd(ScaleGestureDetector detector) {
37 | isInScale = false;
38 | ignoreFirstScaleWorkaround = false;
39 | super.onScaleEnd(detector);
40 | }
41 |
42 | @Override
43 | public boolean onScale(ScaleGestureDetector detector) {
44 | if (ignoreFirstScaleWorkaround)
45 | return true;
46 |
47 | mScaleFactor *= detector.getScaleFactor();
48 | mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
49 |
50 | Object mCurrTouchPoint = XposedHelpers.getObjectField(thisObject, "mCurrTouchPoint");
51 | float x = (Float) XposedHelpers.callMethod(mCurrTouchPoint, "getX") - detector.getFocusX() * mScaleFactor;
52 | float y = (Float) XposedHelpers.callMethod(mCurrTouchPoint, "getY") - detector.getFocusY() * mScaleFactor;
53 |
54 | XposedHelpers.callMethod(mCurrTouchXform, "set", x, y, mScaleFactor);
55 | XposedHelpers.callMethod(thisObject, "invalidate");
56 |
57 | return true;
58 | }
59 | }
60 |
61 | public static Class extends Enum> enumPanZoomState;
62 | public static Class extends Enum> enumFullScreenState;
63 | public static Class classGeckoAppShell;
64 | public static Class classGeckoEvent;
65 | public static Class classFloatUtils;
66 |
67 | public static class ScaleListenerFF extends ScaleGestureDetector.SimpleOnScaleGestureListener {
68 | @Override
69 | public boolean onScaleBegin(ScaleGestureDetector detector) {
70 | isInScale = true;
71 | executeDoubleTap = false;
72 |
73 | float zoomFactor = (Float) XposedHelpers.getObjectField(XposedHelpers.callMethod(thisObject, "getMetrics"), "zoomFactor");
74 | mScaleFactor = zoomFactor;
75 |
76 | Object mState = XposedHelpers.getObjectField(thisObject, "mState");
77 | if (mState == Enum.valueOf(enumPanZoomState, "ANIMATED_ZOOM"))
78 | return false;
79 |
80 | //if (!mTarget.getZoomConstraints().getAllowZoom()) // different on old
81 | Object mTarget = XposedHelpers.getObjectField(thisObject, "mTarget");
82 | if (! (Boolean) XposedHelpers.getObjectField(XposedHelpers.callMethod(mTarget, "getZoomConstraints"), "mAllowZoom"))
83 | return false;
84 |
85 | XposedHelpers.callMethod(thisObject, "setState", Enum.valueOf(enumPanZoomState, "PINCHING"));
86 | XposedHelpers.setObjectField(thisObject, "mLastZoomFocus", new PointF(detector.getFocusX(), detector.getFocusY()));
87 | XposedHelpers.callMethod(thisObject, "cancelTouch");
88 |
89 | XposedHelpers.callStaticMethod(classGeckoAppShell, "sendEventToGecko",
90 | XposedHelpers.callStaticMethod(classGeckoEvent, "createNativeGestureEvent",
91 | XposedHelpers.getStaticObjectField(classGeckoEvent, "ACTION_MAGNIFY_START"),
92 | XposedHelpers.getObjectField(thisObject, "mLastZoomFocus"),
93 | XposedHelpers.getObjectField(XposedHelpers.callMethod(thisObject, "getMetrics"), "zoomFactor")
94 | )
95 | );
96 | return true;
97 | }
98 |
99 | @Override
100 | public void onScaleEnd(ScaleGestureDetector detector) {
101 | isInScale = false;
102 |
103 | Object mState = XposedHelpers.getObjectField(thisObject, "mState");
104 | if (mState == Enum.valueOf(enumPanZoomState, "ANIMATED_ZOOM"))
105 | return;
106 |
107 | XposedHelpers.callMethod(thisObject, "startTouch", detector.getFocusX(), detector.getFocusY(), detector.getEventTime());
108 | XposedHelpers.callMethod(XposedHelpers.getObjectField(thisObject, "mTarget"), "forceRedraw", (Object) null);
109 |
110 | PointF point = new PointF(detector.getFocusX(), detector.getFocusY());
111 | Object event = XposedHelpers.callStaticMethod(classGeckoEvent, "createNativeGestureEvent",
112 | XposedHelpers.getStaticObjectField(classGeckoEvent, "ACTION_MAGNIFY_END"),
113 | point,
114 | XposedHelpers.getObjectField(XposedHelpers.callMethod(thisObject, "getMetrics"), "zoomFactor"));
115 |
116 | if (event == null)
117 | return;
118 |
119 | XposedHelpers.callStaticMethod(classGeckoAppShell, "sendEventToGecko", event);
120 | }
121 |
122 | @Override
123 | public boolean onScale(ScaleGestureDetector detector) {
124 | mScaleFactor *= detector.getScaleFactor();
125 | mScaleFactor = Math.max(0.72f, Math.min(mScaleFactor, 4.0f));
126 |
127 | if (mScaleFactor < 0.72f)
128 | return true;
129 |
130 | Object mTarget = XposedHelpers.getObjectField(thisObject, "mTarget");
131 | if (XposedHelpers.callMethod(mTarget, "getFullScreenState") != Enum.valueOf(enumFullScreenState, "NONE"))
132 | return false;
133 |
134 | if (XposedHelpers.getObjectField(thisObject, "mState") != Enum.valueOf(enumPanZoomState, "PINCHING"))
135 | return false;
136 |
137 | float prevSpan = detector.getPreviousSpan();
138 | if ((Boolean) XposedHelpers.callStaticMethod(classFloatUtils, "fuzzyEquals", prevSpan, 0.0f))
139 | return true;
140 |
141 | Object mLastZoomFocus;
142 |
143 | synchronized (XposedHelpers.callMethod(mTarget, "getLock")) {
144 | mLastZoomFocus = XposedHelpers.getObjectField(thisObject, "mLastZoomFocus");
145 |
146 | XposedHelpers.callMethod(thisObject, "scrollBy",
147 | (Float) XposedHelpers.getObjectField(mLastZoomFocus, "x") - detector.getFocusX(),
148 | (Float) XposedHelpers.getObjectField(mLastZoomFocus, "y") - detector.getFocusY());
149 |
150 | XposedHelpers.callMethod(mLastZoomFocus, "set", detector.getFocusX(), detector.getFocusY());
151 | Object target = XposedHelpers.callMethod(XposedHelpers.callMethod(thisObject, "getMetrics"), "scaleTo", mScaleFactor, mLastZoomFocus);
152 |
153 | /*if ((Integer) XposedHelpers.callMethod(XposedHelpers.getObjectField(thisObject, "mX"), "getOverScrollMode") == View.OVER_SCROLL_NEVER ||
154 | (Integer) XposedHelpers.callMethod(XposedHelpers.getObjectField(thisObject, "mY"), "getOverScrollMode") == View.OVER_SCROLL_NEVER ) {
155 | //target = XposedHelpers.callMethod(thisObject, "getValidViewportMetrics", target);
156 | }*/
157 | XposedHelpers.callMethod(mTarget, "setViewportMetrics", target);
158 | }
159 |
160 | Object event = XposedHelpers.callStaticMethod(classGeckoEvent, "createNativeGestureEvent",
161 | XposedHelpers.getStaticObjectField(classGeckoEvent, "ACTION_MAGNIFY"),
162 | mLastZoomFocus,
163 | XposedHelpers.getObjectField(XposedHelpers.callMethod(thisObject, "getMetrics"), "zoomFactor"));
164 |
165 | XposedHelpers.callStaticMethod(classGeckoAppShell, "sendEventToGecko", event);
166 | return true;
167 | }
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/obsolete/K920Cardboard.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks.obsolete;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 | import android.os.Message;
6 | import android.util.DisplayMetrics;
7 |
8 | import de.robv.android.xposed.XC_MethodHook;
9 | import de.robv.android.xposed.XposedBridge;
10 | import de.robv.android.xposed.XposedHelpers;
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
12 |
13 | public class K920Cardboard {
14 | static boolean fakeAirplaneMode = false;
15 |
16 | public static void hookAll(final XC_LoadPackage.LoadPackageParam lpparam) {
17 | try {
18 | // Fixes DPI for Google Cardboard
19 | XposedHelpers.findAndHookMethod("android.view.Display", lpparam.classLoader, "getRealMetrics", DisplayMetrics.class, new XC_MethodHook() {
20 | @Override
21 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
22 | DisplayMetrics dm = (DisplayMetrics) param.args[0];
23 | dm.xdpi = dm.ydpi = dm.xdpi * 3.0f;
24 | param.args[0] = dm;
25 | }
26 | });
27 | } catch (Throwable t) {
28 | XposedBridge.log(t);
29 | }
30 | }
31 |
32 | public static void hookAndroid(final XC_LoadPackage.LoadPackageParam lpparam) {
33 | try {
34 | // Disables virtual key tap up feedback/vibration
35 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.internal.policy.impl.PhoneWindowManager", lpparam.classLoader), "performHapticFeedbackLw", new XC_MethodHook() {
36 | @Override
37 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
38 | int effectId = (int) param.args[1];
39 | if (effectId == 7) // mVirtualKeyVibePatternUp
40 | param.setResult(null);
41 |
42 | // Disable haptic feedback for events sent from AccessibilityManagerService
43 | StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
44 | for (StackTraceElement element : stackTraceElements) {
45 | if (element.toString().contains("sendDownAndUpKeyEvents")) {
46 | param.setResult(false);
47 | return;
48 | }
49 | }
50 | }
51 | });
52 |
53 | // Disables dialog offering to end airplane mode on power up
54 | XposedHelpers.findAndHookMethod("com.android.server.StartShutdownService", lpparam.classLoader, "loadSettings", new XC_MethodHook() {
55 | @Override
56 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
57 | fakeAirplaneMode = true;
58 | }
59 | });
60 |
61 | XposedHelpers.findAndHookMethod("com.android.server.StartShutdownService", lpparam.classLoader, "isAirplaneModeOn", new XC_MethodHook() {
62 | @Override
63 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
64 | if (fakeAirplaneMode) {
65 | fakeAirplaneMode = false;
66 | param.setResult(false);
67 | }
68 | }
69 | });
70 |
71 | // Disables red charging LED
72 | // TODO: Only block during downtime
73 | XposedHelpers.findAndHookMethod("com.android.server.BatteryService$Led", lpparam.classLoader, "updateLightsLocked", new XC_MethodHook() {
74 | @Override
75 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
76 | param.setResult(null);
77 | }
78 | });
79 | } catch (Throwable t) {
80 | XposedBridge.log(t);
81 | }
82 | }
83 |
84 | public static void hookUI(final XC_LoadPackage.LoadPackageParam lpparam) {
85 | try {
86 | // Disable automatic notification panel expansion if there are no notifications
87 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader), "isNeadToOpenQSPanel", new XC_MethodHook() {
88 | @Override
89 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
90 | param.setResult(null);
91 | }
92 | });
93 |
94 | XposedHelpers.findAndHookMethod("com.android.systemui.power.PowerNotificationWarnings", lpparam.classLoader, "showChargeCompletedNotification", new XC_MethodHook() {
95 | @Override
96 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
97 | param.setResult(null);
98 | }
99 | });
100 |
101 | XposedHelpers.findAndHookMethod("com.android.systemui.lenovo.usb.LenovoUsbChargeFeedback", lpparam.classLoader, "onReceive", Context.class, Intent.class, new XC_MethodHook() {
102 | @Override
103 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
104 | param.setResult(null);
105 | }
106 | });
107 |
108 | XposedHelpers.findAndHookMethod("com.android.systemui.lenovo.flashlight.SoundPlayer", lpparam.classLoader, "play", boolean.class, new XC_MethodHook() {
109 | @Override
110 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
111 | param.setResult(null);
112 | }
113 | });
114 | } catch (Throwable t) {
115 | XposedBridge.log(t);
116 | }
117 | }
118 |
119 | public static void hookTelecom(final XC_LoadPackage.LoadPackageParam lpparam) {
120 | try {
121 | // Fixes SIP calls - requires setting "Make calls with = Ask first" and using Google UI (or Dialer_G instead of LenovoInCallUI)
122 | XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.telecom.CallsManager", lpparam.classLoader), "phoneAccountSelected", new XC_MethodHook() {
123 | @Override
124 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
125 | Object call = param.args[0];
126 | Object account = param.args[1];
127 |
128 | Object mCalls = XposedHelpers.getObjectField(param.thisObject, "mCalls");
129 | if (!(boolean)XposedHelpers.callMethod(mCalls, "contains", call)) {
130 | //Log.i(this, "Attempted to add account to unknown call %s", call);
131 | } else {
132 | //Log.i(this, "phoneAccountSelected , id = %s", account.getId());
133 | XposedHelpers.callMethod(param.thisObject, "updateLchStatus", XposedHelpers.callMethod(account, "getId"));
134 | XposedHelpers.callMethod(call, "setTargetPhoneAccount", account);
135 | if ((boolean)XposedHelpers.callMethod(param.thisObject, "makeRoomForOutgoingCall", call, false)) {
136 | XposedHelpers.callMethod(call, "startCreateConnection", XposedHelpers.getObjectField(param.thisObject, "mPhoneAccountRegistrar"));
137 | } else {
138 | XposedHelpers.callMethod(call, "disconnect");
139 | }
140 | }
141 | param.setResult(null);
142 | }
143 | });
144 | } catch (Throwable t) {
145 | XposedBridge.log(t);
146 | }
147 | }
148 |
149 | public static void hookSettings(final XC_LoadPackage.LoadPackageParam lpparam) {
150 | try {
151 | // Disables popup when switching WiFi on
152 | XposedHelpers.findAndHookMethod("com.android.settings.wifi.WifiStatuListener$1", lpparam.classLoader, "handleMessage", Message.class, new XC_MethodHook() {
153 | @Override
154 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
155 | XposedBridge.log("AIO: handleMessage");
156 | param.setResult(null);
157 | }
158 | });
159 | } catch (Throwable t) {
160 | XposedBridge.log(t);
161 | }
162 | }
163 | }
164 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/CompactVolumePanel.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.annotation.TargetApi;
4 | import android.os.Build;
5 | import android.view.View;
6 | import android.widget.FrameLayout;
7 | import android.widget.ImageView;
8 | import android.widget.LinearLayout;
9 | import android.widget.RelativeLayout;
10 | import android.widget.SeekBar;
11 | import android.widget.TextView;
12 |
13 | import de.robv.android.xposed.XposedBridge;
14 | import de.robv.android.xposed.callbacks.XC_InitPackageResources;
15 | import de.robv.android.xposed.callbacks.XC_LayoutInflated;
16 |
17 | @TargetApi(17)
18 | public class CompactVolumePanel {
19 | public static final String PKG = "com.android.systemui";
20 |
21 | public static void hook(XC_InitPackageResources.InitPackageResourcesParam iprparam) {
22 | try {
23 | if (Build.VERSION.SDK_INT >= 23) {
24 | iprparam.res.hookLayout(PKG, "layout", "volume_dialog_row", new XC_LayoutInflated() {
25 | @Override
26 | public void handleLayoutInflated(XC_LayoutInflated.LayoutInflatedParam liparam) throws Throwable {
27 | final int volumeDialogRow = liparam.res.getIdentifier("volume_dialog_row", "id", PKG);
28 | RelativeLayout layoutVolumeDialogRow = (RelativeLayout) liparam.view.findViewById(volumeDialogRow);
29 | layoutVolumeDialogRow.setPadding(0, 0, 0, 0);
30 |
31 | final int volumeRowIcon = liparam.res.getIdentifier("volume_row_icon", "id", PKG);
32 | final ImageView imageVolumeRowIcon = (ImageView) liparam.view.findViewById(volumeRowIcon);
33 | imageVolumeRowIcon.getLayoutParams().height = imageVolumeRowIcon.getLayoutParams().height / 3 * 2;
34 |
35 | final int volumeSettingsButton = liparam.res.getIdentifier("volume_settings_button", "id", PKG);
36 | final ImageView imageVolumeSettingsButton = (ImageView) liparam.view.findViewById(volumeSettingsButton);
37 | if (imageVolumeSettingsButton != null)
38 | imageVolumeSettingsButton.getLayoutParams().height = imageVolumeSettingsButton.getLayoutParams().height / 3 * 2;
39 |
40 | // MM TW
41 | if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {
42 | final int volumeRowHeaderText = liparam.res.getIdentifier("volume_row_header", "id", PKG);
43 | TextView textVolumeRowHeader = (TextView) liparam.view.findViewById(volumeRowHeaderText);
44 | textVolumeRowHeader.getLayoutParams().height = 0;
45 |
46 | final int volumeRowSliderBar = liparam.res.getIdentifier("volume_row_slider", "id", PKG);
47 | SeekBar barVolumeRowSlider = (SeekBar) liparam.view.findViewById(volumeRowSliderBar);
48 | barVolumeRowSlider.setPadding(barVolumeRowSlider.getPaddingLeft() / 2, 0, barVolumeRowSlider.getPaddingLeft() / 2, 0);
49 |
50 | final RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) barVolumeRowSlider.getLayoutParams();
51 | params.removeRule(RelativeLayout.END_OF);
52 | params.removeRule(RelativeLayout.START_OF);
53 | params.addRule(RelativeLayout.END_OF, volumeRowIcon);
54 | params.addRule(RelativeLayout.START_OF, volumeSettingsButton);
55 | barVolumeRowSlider.setLayoutParams(params);
56 | }
57 | }
58 | });
59 | iprparam.res.hookLayout(PKG, "layout", "volume_dialog", new XC_LayoutInflated() {
60 | @Override
61 | public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
62 | final int volumeDialog = liparam.res.getIdentifier("volume_dialog", "id", PKG);
63 | final RelativeLayout layoutVolumeDialog = (RelativeLayout) liparam.view.findViewById(volumeDialog);
64 |
65 | FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) layoutVolumeDialog.getLayoutParams();
66 | layoutParams.setMargins(0, 0, 0, 0);
67 | layoutVolumeDialog.setLayoutParams(layoutParams);
68 |
69 | // S7 Nougat
70 | layoutVolumeDialog.setPadding(0, 0, 0, 0);
71 |
72 | final int volumeExpandButton = liparam.res.getIdentifier("volume_expand_button", "id", PKG);
73 | View viewVolumeExpandButton = (View) liparam.view.findViewById(volumeExpandButton);
74 | viewVolumeExpandButton.getLayoutParams().height = viewVolumeExpandButton.getLayoutParams().height / 3 * 2;
75 |
76 | final int volumeDialogContent = liparam.res.getIdentifier("volume_dialog_content", "id", PKG);
77 | final LinearLayout layoutVolumeDialogContent = (LinearLayout) liparam.view.findViewById(volumeDialogContent);
78 | layoutVolumeDialogContent.setPadding(0, 0, 0, 0);
79 |
80 | // S7 Nougat
81 | final int volumeDialogDnd = liparam.res.getIdentifier("volume_dialog_dnd", "id", PKG);
82 | final LinearLayout layoutVolumeDialogDnd = (LinearLayout) liparam.view.findViewById(volumeDialogDnd);
83 | if (layoutVolumeDialogDnd != null)
84 | layoutVolumeDialogDnd.getLayoutParams().height = 0;
85 | }
86 | });
87 | } else {
88 | iprparam.res.hookLayout(PKG, "layout", "volume_panel_item", new XC_LayoutInflated() {
89 | @Override
90 | public void handleLayoutInflated(XC_LayoutInflated.LayoutInflatedParam liparam) throws Throwable {
91 | final int streamIcon = liparam.res.getIdentifier("stream_icon", "id", PKG);
92 | final ImageView imageStreamIcon = (ImageView) liparam.view.findViewById(streamIcon);
93 | imageStreamIcon.getLayoutParams().height = imageStreamIcon.getLayoutParams().height / 3 * 2;
94 |
95 | final int furtherOptions = liparam.res.getIdentifier("further_options", "id", PKG);
96 | final ImageView imageFurtherOptions = (ImageView) liparam.view.findViewById(furtherOptions);
97 | imageFurtherOptions.getLayoutParams().height = imageFurtherOptions.getLayoutParams().height / 3 * 2;
98 | }
99 | });
100 |
101 | iprparam.res.hookLayout(PKG, "layout", "volume_panel", new XC_LayoutInflated() {
102 | @Override
103 | public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
104 | final int sliderPanel = liparam.res.getIdentifier("slider_panel", "id", PKG);
105 | final LinearLayout layoutSliderPanel = (LinearLayout) liparam.view.findViewById(sliderPanel);
106 | layoutSliderPanel.setPadding(0, 0, 0, 0);
107 | }
108 | });
109 |
110 | iprparam.res.hookLayout(PKG, "layout", "zen_mode_panel", new XC_LayoutInflated() {
111 | @Override
112 | public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
113 | int zenModePanelBgContainer = liparam.res.getIdentifier("zen_mode_panel_bg_container", "id", PKG);
114 | FrameLayout layoutZenModePanelBgContainer = (FrameLayout) liparam.view.findViewById(zenModePanelBgContainer);
115 | if (layoutZenModePanelBgContainer == null) {
116 | zenModePanelBgContainer = liparam.res.getIdentifier("zen_buttons_container", "id", PKG);
117 | layoutZenModePanelBgContainer = (FrameLayout) liparam.view.findViewById(zenModePanelBgContainer);
118 | }
119 | layoutZenModePanelBgContainer.setMinimumHeight(0);
120 |
121 | final int zenButtons = liparam.res.getIdentifier("zen_buttons", "id", PKG);
122 | final LinearLayout layoutZenButtons = (LinearLayout) liparam.view.findViewById(zenButtons);
123 | FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) layoutZenButtons.getLayoutParams();
124 | layoutParams.setMargins(0, 0, 0, 0);
125 | layoutZenButtons.setLayoutParams(layoutParams);
126 |
127 | final int zenSubheadCollapsed = liparam.res.getIdentifier("zen_subhead_collapsed", "id", PKG);
128 | final TextView textZenSubheadCollapsed = (TextView) liparam.view.findViewById(zenSubheadCollapsed);
129 |
130 | final int zenSubhead = liparam.res.getIdentifier("zen_subhead", "id", PKG);
131 | final RelativeLayout layoutZenSubhead = (RelativeLayout) liparam.view.findViewById(zenSubhead);
132 | layoutZenSubhead.getLayoutParams().height = textZenSubheadCollapsed.getLayoutParams().height;
133 |
134 | final int zenConditions = liparam.res.getIdentifier("zen_conditions", "id", PKG);
135 | final LinearLayout layoutZenConditions = (LinearLayout) liparam.view.findViewById(zenConditions);
136 | layoutZenConditions.setPadding(0, 0, 0, 0);
137 | }
138 | });
139 | }
140 | } catch (Throwable t) {
141 | XposedBridge.log(t);
142 | }
143 | }
144 | }
145 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/NativeFreezer.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio.tweaks;
2 |
3 | import android.content.pm.ApplicationInfo;
4 | import android.content.pm.PackageManager;
5 | import android.content.res.Resources;
6 | import android.os.Build;
7 | import android.view.View;
8 | import android.widget.Button;
9 |
10 | import de.robv.android.xposed.XC_MethodHook;
11 | import de.robv.android.xposed.XC_MethodReplacement;
12 | import de.robv.android.xposed.XposedBridge;
13 | import de.robv.android.xposed.XposedHelpers;
14 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
15 |
16 | import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
17 |
18 | public class NativeFreezer {
19 | private static Object mAppEntry;
20 | private static Object mAppEntry_info;
21 | private static boolean mAppEntry_info_enabled;
22 | private static int mAppEntry_info_flags;
23 | private static boolean isSystem;
24 |
25 | private static String textEnable = "Enable";
26 | private static String textDisable = "Disable";
27 |
28 | public static void hook(final XC_LoadPackage.LoadPackageParam lpparam) {
29 | try {
30 | if (Build.VERSION.SDK_INT < 23) {
31 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "initUninstallButtons", new XC_MethodHook() {
32 | @Override
33 | protected void afterHookedMethod(MethodHookParam param) {
34 | getAppInfo(param.thisObject);
35 |
36 | if (!isSystem) {
37 | Button mSpecialDisableButton = (Button) XposedHelpers.getObjectField(param.thisObject, "mSpecialDisableButton");
38 | XposedHelpers.callMethod(mSpecialDisableButton, "setOnClickListener", param.thisObject);
39 |
40 | getResourceStrings(param.thisObject);
41 |
42 | if (mAppEntry_info_enabled)
43 | mSpecialDisableButton.setText(textDisable);
44 | else
45 | mSpecialDisableButton.setText(textEnable);
46 |
47 | try {
48 | View mMoreControlButtons = (View) XposedHelpers.getObjectField(param.thisObject, "mMoreControlButtons");
49 | mMoreControlButtons.setVisibility(View.VISIBLE);
50 | } catch (NoSuchFieldError e) {
51 | // AOSPA
52 | mSpecialDisableButton.setVisibility(View.VISIBLE);
53 | }
54 | }
55 | }
56 | });
57 |
58 | final Class> ClassDisableChanger = XposedHelpers.findClass("com.android.settings.applications.InstalledAppDetails.DisableChanger", lpparam.classLoader);
59 |
60 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "onClick", View.class, new XC_MethodReplacement() {
61 | @Override
62 | protected Object replaceHookedMethod(MethodHookParam param) {
63 | Object v = param.args[0];
64 | Object mSpecialDisableButton = XposedHelpers.getObjectField(param.thisObject, "mSpecialDisableButton");
65 |
66 | if (v == mSpecialDisableButton) {
67 | getAppInfo(param.thisObject);
68 |
69 | if (!mAppEntry_info_enabled) {
70 | Object DisableChanger = XposedHelpers.newInstance(ClassDisableChanger, param.thisObject, mAppEntry_info, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
71 | XposedHelpers.callMethod(DisableChanger, "execute", (Object) null);
72 | return null;
73 | }
74 | }
75 | try {
76 | return XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
77 | } catch (Exception e) {
78 | e.printStackTrace();
79 | }
80 | return null;
81 | }
82 | });
83 |
84 | try {
85 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "showDialogInner", int.class, int.class, new XC_MethodHook() {
86 | @Override
87 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
88 | // DLG_SPECIAL_DISABLE -> DLG_DISABLE
89 | if ((Integer) param.args[0] == 9)
90 | param.args[0] = 7;
91 | }
92 | });
93 | } catch (Throwable t) {
94 | findAndHookMethod("com.android.settings.applications.AppInfoBase", lpparam.classLoader, "showDialogInner", int.class, int.class, new XC_MethodHook() {
95 | @Override
96 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
97 | // DLG_SPECIAL_DISABLE -> DLG_DISABLE
98 | if ((Integer) param.args[0] == 9)
99 | param.args[0] = 7;
100 | }
101 | });
102 | }
103 | } else {
104 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "handleHeader", new XC_MethodHook() {
105 | @Override
106 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) {
107 | getAppInfo(param.thisObject);
108 |
109 | if (!isSystem) {
110 | getResourceStrings(param.thisObject);
111 | Button mForceStopButton = (Button) XposedHelpers.getObjectField(param.thisObject, "mForceStopButton");
112 | if (mAppEntry_info_enabled)
113 | mForceStopButton.setText(textDisable);
114 | else
115 | mForceStopButton.setText(textEnable);
116 | mForceStopButton.setEnabled(true);
117 | }
118 | }
119 | });
120 |
121 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "updateForceStopButton", boolean.class, new XC_MethodHook() {
122 | @Override
123 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
124 | if (!isSystem) {
125 | param.args[0] = true;
126 | try {
127 | XposedHelpers.setObjectField(param.thisObject, "mAppControlRestricted", false);
128 | } catch (NoSuchFieldError e) {}
129 | }
130 | }
131 | });
132 |
133 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "initUninstallButtons", new XC_MethodHook() {
134 | @Override
135 | protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) {
136 | if (!isSystem)
137 | XposedHelpers.callMethod(param.thisObject, "handleHeader");
138 | }
139 | });
140 |
141 | final Class> ClassDisableChanger = XposedHelpers.findClass("com.android.settings.applications.InstalledAppDetails.DisableChanger", lpparam.classLoader);
142 |
143 | findAndHookMethod("com.android.settings.applications.InstalledAppDetails", lpparam.classLoader, "onClick", View.class, new XC_MethodHook() {
144 | @Override
145 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
146 | View v = (View) param.args[0];
147 | Button mForceStopButton = (Button) XposedHelpers.getObjectField(param.thisObject, "mForceStopButton");
148 | if (v == mForceStopButton) {
149 | getAppInfo(param.thisObject);
150 |
151 | if (!isSystem) {
152 | int action;
153 | if (mAppEntry_info_enabled)
154 | action = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
155 | else
156 | action = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
157 |
158 | if (Build.VERSION.SDK_INT >= 24) {
159 | if (mAppEntry_info_enabled)
160 | XposedHelpers.callMethod(param.thisObject, "showDialogInner", 2, 0);
161 | else {
162 | PackageManager mPm = (PackageManager) XposedHelpers.getObjectField(param.thisObject, "mPm");
163 | String packageName = (String) XposedHelpers.getObjectField(mAppEntry_info, "packageName");
164 | mPm.setApplicationEnabledSetting(packageName, action, 0);
165 | }
166 | } else {
167 | // Doesn't work with unofficial Xposed on Nougat
168 | Object DisableChanger = XposedHelpers.newInstance(ClassDisableChanger, param.thisObject, mAppEntry_info, action);
169 | XposedHelpers.callMethod(DisableChanger, "execute", (Object) null);
170 | }
171 |
172 | param.setResult(null);
173 | }
174 | }
175 | }
176 | });
177 |
178 | findAndHookMethod("com.android.settings.applications.AppInfoBase", lpparam.classLoader, "showDialogInner", int.class, int.class, new XC_MethodHook() {
179 | @Override
180 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
181 | // DLG_SPECIAL_DISABLE -> DLG_DISABLE
182 | if ((Integer) param.args[0] == 3)
183 | param.args[0] = 2;
184 | }
185 | });
186 | }
187 | } catch (Throwable t) {
188 | XposedBridge.log(t);
189 | }
190 | }
191 |
192 | private static void getAppInfo(Object thisObject) {
193 | mAppEntry = XposedHelpers.getObjectField(thisObject, "mAppEntry");
194 | mAppEntry_info = XposedHelpers.getObjectField(mAppEntry, "info");
195 | mAppEntry_info_enabled = (Boolean) XposedHelpers.getObjectField(mAppEntry_info, "enabled");
196 | mAppEntry_info_flags = (Integer) XposedHelpers.getObjectField(mAppEntry_info, "flags");
197 |
198 | // TODO: Two [Disable] buttons on page, only one active - cause of reusing the stop button
199 | if (((String) XposedHelpers.getObjectField(mAppEntry_info, "packageName")).equals("com.samsung.android.hmt.vrsvc")) {
200 | isSystem = false;
201 | return;
202 | }
203 |
204 | if ((mAppEntry_info_flags & ApplicationInfo.FLAG_SYSTEM) == 0)
205 | isSystem = false;
206 | else
207 | isSystem = true;
208 | }
209 |
210 | private static void getResourceStrings(Object thisObject) {
211 | try {
212 | Resources resources = (Resources) XposedHelpers.callMethod(thisObject, "getResources");
213 | textDisable = (String) resources.getText(resources.getIdentifier("disable_text", "string", "com.android.settings"));
214 | textEnable = (String) resources.getText(resources.getIdentifier("enable_text", "string", "com.android.settings"));
215 | } catch (Exception x) {
216 | x.printStackTrace();
217 | }
218 | }
219 | }
220 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/tweaks/MediaKeys.java:
--------------------------------------------------------------------------------
1 | /*
2 | parts based on https://github.com/GravityBox/GravityBox
3 | */
4 |
5 | package com.smartmadsoft.xposed.aio.tweaks;
6 |
7 | import android.annotation.TargetApi;
8 | import android.content.Context;
9 | import android.content.Intent;
10 | import android.hardware.camera2.CameraAccessException;
11 | import android.hardware.camera2.CameraCharacteristics;
12 | import android.hardware.camera2.CameraManager;
13 | import android.media.AudioManager;
14 | import android.os.Build;
15 | import android.os.Handler;
16 | import android.os.PowerManager;
17 | import android.os.SystemClock;
18 | import android.view.KeyEvent;
19 | import android.view.ViewConfiguration;
20 |
21 | import de.robv.android.xposed.XC_MethodHook;
22 | import de.robv.android.xposed.XposedBridge;
23 | import de.robv.android.xposed.XposedHelpers;
24 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
25 |
26 | public class MediaKeys {
27 | //public final static int FLAG_INTERACTIVE = 0x20000000;
28 |
29 | static PowerManager mPowerManager;
30 | static AudioManager mAudioManager;
31 | static boolean mIsLongPress = false;
32 |
33 | //static KeyEvent lastDownKeyEvent;
34 |
35 | static String pkg;
36 | //static Class ClassMediaSessionLegacyHelper;
37 |
38 | static CameraManager mCameraManager;
39 | static String mCameraId;
40 |
41 | static CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
42 | @TargetApi(23)
43 | @Override
44 | public void onTorchModeChanged(String cameraId, boolean enabled) {
45 | super.onTorchModeChanged(cameraId, enabled);
46 | mCameraManager.unregisterTorchCallback(torchCallback);
47 |
48 | try {
49 | //final boolean newState = !enabled;
50 | mCameraManager.setTorchMode(mCameraId, !enabled);
51 | } catch (Throwable t) {}
52 | }
53 | };
54 |
55 | @TargetApi(20)
56 | public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {
57 | try {
58 | //ClassMediaSessionLegacyHelper = XposedHelpers.findClass("android.media.session.MediaSessionLegacyHelper", lpparam.classLoader);
59 |
60 | pkg = "com.android.internal.policy.impl";
61 | if (Build.VERSION.SDK_INT >= 23)
62 | pkg = "com.android.server.policy";
63 |
64 | XposedHelpers.findAndHookMethod(pkg + ".PhoneWindowManager", lpparam.classLoader, "interceptKeyBeforeQueueing", KeyEvent.class, int.class, new XC_MethodHook() {
65 | @Override
66 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
67 | KeyEvent event = (KeyEvent) param.args[0];
68 | int keycode = event.getKeyCode();
69 | /*
70 | int policyFlags = (int) param.args[1];
71 | final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
72 | XposedBridge.log("AIO: interceptKeyBeforeQueueing:" + keycode + ", down=" + down + ", policyFlags=" + policyFlags + ", event.getFlags=" + event.getFlags());
73 | */
74 |
75 | if (keycode == KeyEvent.KEYCODE_VOLUME_DOWN || keycode == KeyEvent.KEYCODE_VOLUME_UP) {
76 | //if (down)
77 | //lastDownKeyEvent = event;
78 | if (mPowerManager == null)
79 | mPowerManager = (PowerManager) XposedHelpers.getObjectField(param.thisObject, "mPowerManager");
80 | PowerManager.WakeLock wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AllMy_MediaKeys");
81 | wakeLock.acquire(1500);
82 |
83 | Object telecomManager = XposedHelpers.callMethod(param.thisObject, "getTelecommService");
84 | if (telecomManager != null) {
85 | boolean isRinging = (boolean) XposedHelpers.callMethod(telecomManager, "isRinging");
86 | if (isRinging)
87 | return;
88 | }
89 |
90 | if (mAudioManager == null) {
91 | Context mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext");
92 | mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
93 | }
94 |
95 | int mode = mAudioManager.getMode();
96 | if (mode == AudioManager.MODE_IN_CALL || mode == AudioManager.MODE_IN_COMMUNICATION)
97 | return;
98 |
99 | boolean isShowingKeyguard = false;
100 | try {
101 | Object mKeyguardDelegate = XposedHelpers.getObjectField(param.thisObject, "mKeyguardDelegate");
102 | isShowingKeyguard = (boolean) XposedHelpers.callMethod(mKeyguardDelegate, "isShowing");
103 | //XposedBridge.log("AIO: isShowingKeyguard=" + isShowingKeyguard);
104 | } catch (Throwable t) {
105 | XposedBridge.log(t);
106 | }
107 |
108 | if ((event.getFlags() & KeyEvent.FLAG_FROM_SYSTEM) != 0 && (!mPowerManager.isInteractive() || isShowingKeyguard)) {
109 | if (event.getAction() == KeyEvent.ACTION_DOWN) {
110 | mIsLongPress = false;
111 | handleVolumeLongPress(param.thisObject, keycode);
112 | } else {
113 | handleVolumeLongPressAbort(param.thisObject);
114 | if (!mIsLongPress) {
115 | //sendVolumeKeyEvent(param.thisObject, KeyEvent.KEYCODE_VOLUME_UP);
116 | //sendVolumeKeyEvent2(param.thisObject, lastDownKeyEvent);
117 | //dispatchVolKey(param.thisObject, lastDownKeyEvent);
118 |
119 | //AudioManager.FLAG_SHOW_UI
120 | mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, keycode == KeyEvent.KEYCODE_VOLUME_UP ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER, 0);
121 | }
122 | }
123 | // do not pass to user
124 | param.setResult(0);
125 | return;
126 | }
127 | }
128 | }
129 | /*
130 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
131 | int res = (int) param.getResult();
132 | XposedBridge.log("AIO: interceptKeyBeforeQueueing returns " + res);
133 | }
134 | */
135 | });
136 |
137 | XposedBridge.hookAllConstructors(XposedHelpers.findClass(pkg + ".PhoneWindowManager", lpparam.classLoader), new XC_MethodHook() {
138 | @Override
139 | protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
140 | Runnable mVolumeUpLongPress = new Runnable() {
141 | @Override
142 | public void run() {
143 | mIsLongPress = true;
144 | if (mAudioManager != null && mAudioManager.isMusicActive())
145 | sendMediaButtonEvent(param.thisObject, KeyEvent.KEYCODE_MEDIA_NEXT);
146 | else
147 | toggleFlashlight(param.thisObject);
148 | }
149 | };
150 |
151 | Runnable mVolumeDownLongPress = new Runnable() {
152 | @Override
153 | public void run() {
154 | mIsLongPress = true;
155 | sendMediaButtonEvent(param.thisObject, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
156 | }
157 | };
158 |
159 | XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVolumeUpLongPress", mVolumeUpLongPress);
160 | XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVolumeDownLongPress", mVolumeDownLongPress);
161 | }
162 | });
163 | } catch (Throwable t) {
164 | XposedBridge.log(t);
165 | }
166 | }
167 |
168 | private static void handleVolumeLongPress(Object phoneWindowManager, int keycode) {
169 | Handler mHandler = (Handler) XposedHelpers.getObjectField(phoneWindowManager, "mHandler");
170 | Runnable mVolumeUpLongPress = (Runnable) XposedHelpers.getAdditionalInstanceField(phoneWindowManager, "mVolumeUpLongPress");
171 | Runnable mVolumeDownLongPress = (Runnable) XposedHelpers.getAdditionalInstanceField(phoneWindowManager, "mVolumeDownLongPress");
172 |
173 | mHandler.postDelayed(keycode == KeyEvent.KEYCODE_VOLUME_UP ? mVolumeUpLongPress : mVolumeDownLongPress, ViewConfiguration.getLongPressTimeout());
174 | }
175 |
176 | private static void handleVolumeLongPressAbort(Object phoneWindowManager) {
177 | Handler mHandler = (Handler) XposedHelpers.getObjectField(phoneWindowManager, "mHandler");
178 | Runnable mVolumeUpLongPress = (Runnable) XposedHelpers.getAdditionalInstanceField(phoneWindowManager, "mVolumeUpLongPress");
179 | Runnable mVolumeDownLongPress = (Runnable) XposedHelpers.getAdditionalInstanceField(phoneWindowManager, "mVolumeDownLongPress");
180 |
181 | mHandler.removeCallbacks(mVolumeUpLongPress);
182 | mHandler.removeCallbacks(mVolumeDownLongPress);
183 | }
184 |
185 | private static void sendMediaButtonEvent(Object phoneWindowManager, int code) {
186 | long eventtime = SystemClock.uptimeMillis();
187 | Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
188 | KeyEvent keyEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, code, 0);
189 | keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
190 | dispatchMediaButtonEvent(keyEvent);
191 |
192 | keyEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_UP);
193 | keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
194 | dispatchMediaButtonEvent(keyEvent);
195 | }
196 |
197 | @TargetApi(19)
198 | private static void dispatchMediaButtonEvent(KeyEvent keyEvent) {
199 | try {
200 | mAudioManager.dispatchMediaKeyEvent(keyEvent);
201 | } catch (Throwable t) {
202 | XposedBridge.log(t);
203 | }
204 | }
205 |
206 | /*
207 | private static void sendVolumeKeyEvent(Object phoneWindowManager, int keycode) {
208 | KeyEvent newEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
209 | Context mContext = (Context) XposedHelpers.getObjectField(phoneWindowManager, "mContext");
210 |
211 | Object helper = XposedHelpers.callStaticMethod(ClassMediaSessionLegacyHelper, "getHelper", mContext);
212 | XposedHelpers.callMethod(helper, "sendVolumeKeyEvent", newEvent, true);
213 | }
214 |
215 | private static void sendVolumeKeyEvent2(Object phoneWindowManager, KeyEvent event) {
216 | //KeyEvent newEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
217 | Context mContext = (Context) XposedHelpers.getObjectField(phoneWindowManager, "mContext");
218 |
219 | Object helper = XposedHelpers.callStaticMethod(ClassMediaSessionLegacyHelper, "getHelper", mContext);
220 | XposedHelpers.callMethod(helper, "sendVolumeKeyEvent", event, true);
221 | }
222 |
223 | private static void dispatchVolKey(Object phoneWindowManager, KeyEvent event) {
224 | XposedHelpers.callMethod(phoneWindowManager, "dispatchMediaKeyWithWakeLockToAudioService", event);
225 | XposedHelpers.callMethod(phoneWindowManager, "dispatchMediaKeyWithWakeLockToAudioService", KeyEvent.changeAction(event, KeyEvent.ACTION_UP));
226 | }
227 | */
228 |
229 | private static void toggleFlashlight(Object phoneWindowManager) {
230 | Context mContext = (Context) XposedHelpers.getObjectField(phoneWindowManager, "mContext");
231 |
232 | if (Build.VERSION.SDK_INT >= 23) {
233 | if (mCameraManager == null) {
234 | mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
235 | String cameraId = null;
236 | try {
237 | cameraId = getCameraId(mCameraManager);
238 | } catch (Throwable e) {
239 | return;
240 | } finally {
241 | mCameraId = cameraId;
242 | }
243 | }
244 | try {
245 | mCameraManager.registerTorchCallback(torchCallback, null);
246 | } catch (Throwable e) {
247 | return;
248 | }
249 | } else {
250 | Intent intent = new Intent("com.smartmadsoft.xposed.aio.FLASHLIGHT_TOGGLE");
251 | mContext.sendBroadcast(intent);
252 | }
253 | }
254 |
255 | static String getCameraId(CameraManager cameraManager) throws CameraAccessException {
256 | if (Build.VERSION.SDK_INT >= 23) {
257 | String[] ids = cameraManager.getCameraIdList();
258 | for (String id : ids) {
259 | CameraCharacteristics c = cameraManager.getCameraCharacteristics(id);
260 | Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
261 | Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
262 | if (flashAvailable != null && flashAvailable && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
263 | return id;
264 | }
265 | }
266 | }
267 | return null;
268 | }
269 | }
270 |
--------------------------------------------------------------------------------
/app/src/main/java/com/smartmadsoft/xposed/aio/Loader.java:
--------------------------------------------------------------------------------
1 | package com.smartmadsoft.xposed.aio;
2 |
3 | import android.content.res.XModuleResources;
4 | import android.content.res.XResources;
5 |
6 | import com.smartmadsoft.xposed.aio.tweaks.NoExitConfirmation;
7 | import com.smartmadsoft.xposed.aio.tweaks.DisableNetworkMonitoredNotification;
8 | import com.smartmadsoft.xposed.aio.tweaks.GMapsMinimizedBar;
9 | import com.smartmadsoft.xposed.aio.tweaks.PacMan;
10 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.AlwaysSoftwareMenu;
11 | import com.smartmadsoft.xposed.aio.tweaks.BatteryHistoryXXL;
12 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.BatteryLightDisabler;
13 | import com.smartmadsoft.xposed.aio.tweaks.CompactVolumePanel;
14 | import com.smartmadsoft.xposed.aio.tweaks.DisableAdbNotification;
15 | import com.smartmadsoft.xposed.aio.tweaks.DisableHorizontalScrollAR;
16 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.DisableSuIndicator;
17 | import com.smartmadsoft.xposed.aio.tweaks.DisableUsbNotification;
18 | import com.smartmadsoft.xposed.aio.tweaks.copycat.GentleHapticFeedback;
19 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.GentleHapticFeedbackTouchWiz;
20 | import com.smartmadsoft.xposed.aio.tweaks.copycat.HideNetworkIndicators;
21 | import com.smartmadsoft.xposed.aio.tweaks.MediaKeys;
22 | import com.smartmadsoft.xposed.aio.tweaks.MediaStreamDefault;
23 | import com.smartmadsoft.xposed.aio.tweaks.MinimumBrightnessMX;
24 | import com.smartmadsoft.xposed.aio.tweaks.NativeFreezer;
25 | import com.smartmadsoft.xposed.aio.tweaks.copycat.NoOverlayWarning;
26 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.LedOffDuringDnD;
27 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.No2G;
28 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.NoPasswordAfterBootTW;
29 | import com.smartmadsoft.xposed.aio.tweaks.copycat.NoSafeVolumeWarning;
30 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.NoToastIcons;
31 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.OneWayBrightness;
32 | import com.smartmadsoft.xposed.aio.tweaks.PocketFirst;
33 | import com.smartmadsoft.xposed.aio.tweaks.Chrome;
34 | import com.smartmadsoft.xposed.aio.tweaks.copycat.QuickUnlock;
35 | import com.smartmadsoft.xposed.aio.tweaks.cyanogenmod.RemapVolume;
36 | import com.smartmadsoft.xposed.aio.tweaks.obsolete.K920Cardboard;
37 | import com.smartmadsoft.xposed.aio.tweaks.NoWakeOnCharge;
38 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.NoVoLteIcon;
39 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.RemapRedialToNextTrack;
40 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S5TouchWizJunk;
41 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S5ReaderMode;
42 | import com.smartmadsoft.xposed.aio.tweaks.GMSDisabler;
43 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S7AlwaysAllowMTP;
44 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S7DetailedBatteryUsage;
45 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S7MTPWithoutUnlocking;
46 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S7TouchKeyLight;
47 | import com.smartmadsoft.xposed.aio.tweaks.touchwiz.S7sRGBVideo;
48 | import com.smartmadsoft.xposed.aio.tweaks.VolumeKeysCursorControl;
49 | import com.smartmadsoft.xposed.aio.tweaks.onehandzoomenabler.AR;
50 |
51 | import de.robv.android.xposed.IXposedHookInitPackageResources;
52 | import de.robv.android.xposed.IXposedHookLoadPackage;
53 | import de.robv.android.xposed.IXposedHookZygoteInit;
54 | import de.robv.android.xposed.XSharedPreferences;
55 | import de.robv.android.xposed.callbacks.XC_InitPackageResources;
56 | import de.robv.android.xposed.callbacks.XC_LoadPackage;
57 |
58 | public class Loader implements IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
59 | private static XSharedPreferences prefs;
60 | private static String modulePath;
61 |
62 | @Override
63 | public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) throws Throwable {
64 | modulePath = startupParam.modulePath;
65 |
66 | prefs = new XSharedPreferences("com.smartmadsoft.xposed.aio", "tweaks");
67 | prefs.makeWorldReadable();
68 |
69 | int brightnessValue = Integer.parseInt(prefs.getString("tweak_minimumbrightness_list", "-1"));
70 | if (brightnessValue > 0) {
71 | // from https://github.com/GravityBox/GravityBox
72 | XResources.setSystemWideReplacement("android", "integer", "config_screenBrightnessSettingMinimum", brightnessValue);
73 | XResources.setSystemWideReplacement("android", "integer", "config_screenBrightnessDim", brightnessValue);
74 | }
75 | if (prefs.getBoolean("tweak_chrometabstoolbaronphone", false))
76 | Chrome.init();
77 | if (prefs.getBoolean("tweak_s5twjunk", false)) {
78 | XResources.setSystemWideReplacement("android", "bool", "show_ongoing_ime_switcher", false);
79 | //XResources.setSystemWideReplacement("android", "bool", "config_intrusiveNotificationLed", true);
80 | }
81 | if (prefs.getBoolean("tweak_nowakeoncharge", false))
82 | XResources.setSystemWideReplacement("android", "bool", "config_unplugTurnsOnScreen", false);
83 |
84 | //XResources.setSystemWideReplacement("android", "bool", "config_showNavigationBar", true);
85 | //XResources.setSystemWideReplacement("com.android.settings", "bool", "config_showNavigationBar", true);
86 | }
87 |
88 | @Override
89 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
90 | if (lpparam.packageName.equals("android")) {
91 | if (prefs.getBoolean("tweak_nosafevolumewarning", false))
92 | NoSafeVolumeWarning.hook(lpparam);
93 | if (prefs.getBoolean("tweak_onewaybrightness", false))
94 | OneWayBrightness.hook(lpparam);
95 | if (prefs.getBoolean("tweak_batterylightdisabler", false))
96 | BatteryLightDisabler.hook(lpparam);
97 | if (prefs.getBoolean("tweak_alwayssoftwaremenu", false))
98 | AlwaysSoftwareMenu.hook(lpparam);
99 | int hapticValue = Integer.parseInt(prefs.getString("tweak_gentlehapticfeedback_list", "-1"));
100 | if (hapticValue > 0)
101 | GentleHapticFeedback.hook(lpparam, hapticValue);
102 | boolean tweakPlayPause = prefs.getBoolean("tweak_remapprevtoplaypause", false);
103 | boolean tweakTorch = prefs.getBoolean("tweak_remapnexttotorch", false);
104 | if (tweakPlayPause || tweakTorch)
105 | RemapVolume.hook(lpparam, tweakPlayPause, tweakTorch);
106 | if (prefs.getBoolean("tweak_nowakeoncharge", false))
107 | NoWakeOnCharge.hook(lpparam);
108 | if (prefs.getBoolean("tweak_s5readermode", false))
109 | S5ReaderMode.hook(lpparam);
110 | if (prefs.getBoolean("tweak_mediastreamdefault", false))
111 | MediaStreamDefault.hook(lpparam);
112 | if (prefs.getBoolean("tweak_t700gentlehapticfeedback", false))
113 | GentleHapticFeedbackTouchWiz.hook(lpparam);
114 | if (prefs.getBoolean("tweak_mediakeys", false))
115 | MediaKeys.hook(lpparam);
116 | if (prefs.getBoolean("tweak_disableusbnotification", false))
117 | DisableUsbNotification.hook(lpparam);
118 | if (prefs.getBoolean("tweak_disableadbnotification", false))
119 | DisableAdbNotification.hook(lpparam);
120 | if (prefs.getBoolean("tweak_k920cardboard", false))
121 | K920Cardboard.hookAndroid(lpparam);
122 | if (prefs.getBoolean("tweak_s7srgbvideo", false))
123 | S7sRGBVideo.hook(lpparam);
124 | if (prefs.getBoolean("tweak_disablenetworkmonitorednotification", false))
125 | DisableNetworkMonitoredNotification.hook(lpparam);
126 | boolean tweakLED = prefs.getBoolean("tweak_s7dndledoff", false);
127 | boolean tweakVibrator = prefs.getBoolean("tweak_s7dndvibratoroff", false);
128 | if (tweakLED || tweakVibrator)
129 | LedOffDuringDnD.hook(lpparam, tweakLED, tweakVibrator);
130 | if (prefs.getBoolean("tweak_allowapkdowngrade", false))
131 | PacMan.hook(lpparam);
132 | }
133 | if (lpparam.packageName.equals("com.android.server.telecom")) {
134 | if (prefs.getBoolean("tweak_k920cardboard", false))
135 | K920Cardboard.hookTelecom(lpparam);
136 | }
137 | if (lpparam.packageName.equals("com.android.systemui")) {
138 | if (prefs.getBoolean("tweak_disablesuindicator", false))
139 | DisableSuIndicator.hook(lpparam);
140 | if (prefs.getBoolean("tweak_nowakeoncharge", false))
141 | NoWakeOnCharge.hookUI(lpparam);
142 | if (prefs.getBoolean("tweak_s5twjunk", false))
143 | S5TouchWizJunk.hookUI(lpparam);
144 | if (prefs.getBoolean("tweak_s5twjunk_dnd", false))
145 | S5TouchWizJunk.hookUIDND(lpparam);
146 | if (prefs.getBoolean("tweak_k920cardboard", false))
147 | K920Cardboard.hookUI(lpparam);
148 | if (prefs.getBoolean("tweak_twnopasswordafterboot", false))
149 | NoPasswordAfterBootTW.hook(lpparam);
150 | if (prefs.getBoolean("tweak_quickunlock", false))
151 | QuickUnlock.hook(lpparam);
152 | }
153 | if (lpparam.packageName.equals("com.android.settings")) {
154 | if (prefs.getBoolean("tweak_batteryhistoryxxl", false))
155 | BatteryHistoryXXL.hook(lpparam);
156 | if (prefs.getBoolean("tweak_nativefreezer", false))
157 | NativeFreezer.hook(lpparam);
158 | if (prefs.getBoolean("tweak_s5twjunk", false))
159 | S5TouchWizJunk.hookSettings(lpparam);
160 | if (prefs.getBoolean("tweak_k920cardboard", false))
161 | K920Cardboard.hookSettings(lpparam);
162 | if (prefs.getBoolean("tweak_s7touchkeylight", false))
163 | S7TouchKeyLight.hook(lpparam);
164 | if (prefs.getBoolean("tweak_s7detailedbatteryusage", false))
165 | S7DetailedBatteryUsage.hook(lpparam);
166 | if (prefs.getBoolean("tweak_disablebatteryprediction", false))
167 | DisableBatteryPrediction.hook(lpparam);
168 | }
169 | if (lpparam.packageName.equals("com.adobe.reader")) {
170 | if (prefs.getBoolean("tweak_onehandzoom_ar", false))
171 | AR.hook(lpparam);
172 | if (prefs.getBoolean("tweak_disablehorizontalscroll_ar", false))
173 | DisableHorizontalScrollAR.hook(lpparam);
174 | }
175 | if (prefs.getBoolean("tweak_notoasticons", false))
176 | NoToastIcons.hook(lpparam);
177 | if (prefs.getBoolean("tweak_pocketfirst", false))
178 | PocketFirst.hook(lpparam);
179 | if ((lpparam.packageName.equals("com.mxtech.videoplayer.pro") || lpparam.packageName.equals("com.mxtech.videoplayer.ad")) && prefs.getBoolean("tweak_minimumbrightness_mx", false))
180 | MinimumBrightnessMX.hook(lpparam);
181 | if (Chrome.isChrome(lpparam.packageName)) {
182 | if (prefs.getBoolean("tweak_chrometabstoolbaronphone", false))
183 | Chrome.hookTabsToolbar(lpparam);
184 | if (prefs.getBoolean("tweak_chromenotopsites", false))
185 | Chrome.hookTopSites(lpparam);
186 | }
187 | if (prefs.getBoolean("tweak_k920cardboard", false))
188 | K920Cardboard.hookAll(lpparam);
189 | if (lpparam.packageName.equals("com.sec.android.app.popupuireceiver") && prefs.getBoolean("tweak_s5twjunk", false))
190 | S5TouchWizJunk.hook(lpparam);
191 | if (lpparam.packageName.equals("com.google.android.gms") && prefs.getBoolean("tweak_gmslocationdialog", false))
192 | GMSDisabler.hook(lpparam);
193 | int volumeValue = Integer.parseInt(prefs.getString("tweak_volumekeyscursorcontrol_list", "-1"));
194 | if (volumeValue > 0)
195 | VolumeKeysCursorControl.hook(lpparam, volumeValue);
196 | if (prefs.getBoolean("tweak_nooverlaywarning", false) && lpparam.packageName.endsWith(".packageinstaller"))
197 | NoOverlayWarning.hook(lpparam);
198 | if (lpparam.packageName.equals("com.samsung.android.MtpApplication")) {
199 | if (prefs.getBoolean("tweak_s7alwaysallowmtp", false))
200 | S7AlwaysAllowMTP.hook(lpparam);
201 | if (prefs.getBoolean("tweak_s7mtpwithoutunlock", false))
202 | S7MTPWithoutUnlocking.hook(lpparam);
203 | }
204 | if (lpparam.packageName.equals("com.samsung.android.themecenter"))
205 | S5TouchWizJunk.hookThemes(lpparam);
206 | if (lpparam.packageName.equals("com.android.bluetooth") && prefs.getBoolean("tweak_s7remapredialtonext", false))
207 | RemapRedialToNextTrack.hook(lpparam);
208 | if (lpparam.packageName.equals("com.android.phone") && prefs.getBoolean("tweak_s7no2g", false))
209 | No2G.hook(lpparam);
210 | if (lpparam.packageName.equals("com.google.android.apps.maps") && prefs.getBoolean("tweak_gmminimizedbar", false))
211 | GMapsMinimizedBar.hook(lpparam);
212 | if (prefs.getBoolean("tweak_appbackuprestorenoexitconfirmation", false)) {
213 | if ((lpparam.packageName.startsWith("mobi.infolife.appbackup") || lpparam.packageName.equals("mobi.trustlab.appbackup")))
214 | NoExitConfirmation.hookBackup(lpparam);
215 | if (lpparam.packageName.equals("com.circlegate.tt.transit.android"))
216 | NoExitConfirmation.hookCG(lpparam);
217 | if (lpparam.packageName.equals("pl.solidexplorer2"))
218 | NoExitConfirmation.hookSolid(lpparam);
219 | }
220 | if (lpparam.packageName.equals("com.sec.imsservice") && prefs.getBoolean("tweak_s7novolteicon", false))
221 | NoVoLteIcon.hook(lpparam);
222 | }
223 |
224 | @Override
225 | public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam iprparam) throws Throwable {
226 | if (iprparam.packageName.equals("com.android.systemui")) {
227 | if (prefs.getBoolean("tweak_hidenetworkindicators", false))
228 | HideNetworkIndicators.hook(iprparam);
229 | if (prefs.getBoolean("tweak_compactvolumepanel", false))
230 | CompactVolumePanel.hook(iprparam);
231 | if (prefs.getBoolean("tweak_s5twjunk", false)) {
232 | XModuleResources modRes = XModuleResources.createInstance(modulePath, iprparam.res);
233 | S5TouchWizJunk.hookRes(iprparam, modRes);
234 | }
235 | }
236 | }
237 | }
238 |
--------------------------------------------------------------------------------