diff --git a/AntiWakeLock/Readme.md b/AntiWakeLock/Readme.md new file mode 100644 index 0000000..a806757 --- /dev/null +++ b/AntiWakeLock/Readme.md @@ -0,0 +1,5 @@ +# AntiWakeLock + +Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. + +Can be applied to selected apps or the whole system. diff --git a/AntiWakeLock/build.gradle.kts b/AntiWakeLock/build.gradle.kts new file mode 100644 index 0000000..327b7e9 --- /dev/null +++ b/AntiWakeLock/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + alias(libs.plugins.buildlogic.android.application) + alias(libs.plugins.buildlogic.kotlin.android) +} + +android { + namespace = "com.programminghoch10.AntiWakeLock" + + defaultConfig { + minSdk = 1 + targetSdk = 36 + } +} + +dependencies { + implementation(project(":logger")) +} diff --git a/AntiWakeLock/src/main/AndroidManifest.xml b/AntiWakeLock/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b22e0f2 --- /dev/null +++ b/AntiWakeLock/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/AntiWakeLock/src/main/assets/xposed_init b/AntiWakeLock/src/main/assets/xposed_init new file mode 100644 index 0000000..db2ca61 --- /dev/null +++ b/AntiWakeLock/src/main/assets/xposed_init @@ -0,0 +1,3 @@ +com.programminghoch10.AntiWakeLock.PowerManagerHook +com.programminghoch10.AntiWakeLock.PowerManagerServiceHook +com.programminghoch10.AntiWakeLock.WindowHook diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt new file mode 100644 index 0000000..d832091 --- /dev/null +++ b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt @@ -0,0 +1,37 @@ +package com.programminghoch10.AntiWakeLock + +import java.util.concurrent.* +import android.os.Build +import android.os.PowerManager +import android.os.WorkSource +import de.robv.android.xposed.IXposedHookLoadPackage +import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING +import de.robv.android.xposed.XC_MethodReplacement.returnConstant +import de.robv.android.xposed.XposedHelpers +import de.robv.android.xposed.callbacks.XC_LoadPackage + +class PowerManagerHook : IXposedHookLoadPackage { + override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", Long::class.java, DO_NOTHING) + + // optional hooks for completeness + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "isHeld", returnConstant(false)) + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", Int::class.java, DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "setReferenceCounted", Boolean::class.java, DO_NOTHING) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) XposedHelpers.findAndHookMethod( + PowerManager.WakeLock::class.java, + "setStateListener", + Executor::class.java, + PowerManager.WakeLockStateListener::class.java, + DO_NOTHING, + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) XposedHelpers.findAndHookMethod( + PowerManager.WakeLock::class.java, + "setWorkSource", + WorkSource::class.java, + DO_NOTHING, + ) + } +} diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt new file mode 100644 index 0000000..49976b3 --- /dev/null +++ b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt @@ -0,0 +1,38 @@ +package com.programminghoch10.AntiWakeLock + +import android.os.Build +import de.robv.android.xposed.IXposedHookLoadPackage +import de.robv.android.xposed.XC_MethodReplacement +import de.robv.android.xposed.XposedBridge +import de.robv.android.xposed.XposedHelpers +import de.robv.android.xposed.callbacks.XC_LoadPackage + +class PowerManagerServiceHook : IXposedHookLoadPackage { + fun disableMethodByName(clazz: Class<*>, name: String) { + val method = clazz.declaredMethods.single { it.name == name } + XposedBridge.hookMethod(method, XC_MethodReplacement.DO_NOTHING) + } + + override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { + if (lpparam.packageName != "android") return + + val PowerManagerServiceClass = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) XposedHelpers.findClass("com.android.server.power.PowerManagerService", lpparam.classLoader) + else XposedHelpers.findClass("com.android.server.PowerManagerService", lpparam.classLoader) + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + disableMethodByName(PowerManagerServiceClass, "acquireWakeLock") + disableMethodByName(PowerManagerServiceClass, "releaseWakeLock") + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + disableMethodByName(PowerManagerServiceClass, "acquireWakeLockInternal") + disableMethodByName(PowerManagerServiceClass, "releaseWakeLockInternal") + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val BinderServiceClass = XposedHelpers.findClass("${PowerManagerServiceClass.name}\$BinderService", lpparam.classLoader) + disableMethodByName(BinderServiceClass, "acquireWakeLock") + disableMethodByName(BinderServiceClass, "releaseWakeLock") + } + } +} diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt new file mode 100644 index 0000000..cd42e5f --- /dev/null +++ b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt @@ -0,0 +1,79 @@ +package com.programminghoch10.AntiWakeLock + +import android.os.Build +import android.view.SurfaceView +import android.view.View +import android.view.Window +import android.view.WindowManager +import de.binarynoise.logger.Logger.log +import de.robv.android.xposed.IXposedHookLoadPackage +import de.robv.android.xposed.XC_MethodHook +import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING +import de.robv.android.xposed.XposedHelpers +import de.robv.android.xposed.callbacks.XC_LoadPackage + +class WindowHook : IXposedHookLoadPackage { + fun filterKeepScreenOnFlag(flags: Int): Int { + return flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.inv() + } + + override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { + XposedHelpers.findAndHookMethod( + Window::class.java, + "addFlags", + Int::class.java, + object : XC_MethodHook() { + override fun beforeHookedMethod(param: MethodHookParam) { + log("removing FLAG_KEEP_SCREEN_ON from addFlags") + param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int) + } + }, + ) + XposedHelpers.findAndHookMethod( + Window::class.java, + "setFlags", Int::class.java, Int::class.java, + object : XC_MethodHook() { + override fun beforeHookedMethod(param: MethodHookParam) { + log("removing FLAG_KEEP_SCREEN_ON from setFlags") + param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int) + param.args[1] = filterKeepScreenOnFlag(param.args[1] as Int) + } + }, + ) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + try { + val AttachInfoClass = Class.forName(View::class.java.name + "\$AttachInfo", false, lpparam.classLoader) + XposedHelpers.findAndHookMethod( + SurfaceView::class.java, + "performCollectViewAttributes", + AttachInfoClass, + Int::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam) { + val attachInfo = param.args[0] + XposedHelpers.setBooleanField(attachInfo, "mKeepScreenOn", false) + } + }, + ) + } catch (e: Throwable) { + log("failed to hook SurfaceView.performCollectViewAttributes", e) + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + try { + val ViewRootImplClass = Class.forName("android.view.ViewRootImpl", false, lpparam.classLoader) + XposedHelpers.findAndHookMethod( + ViewRootImplClass, + "applyKeepScreenOnFlag", + WindowManager.LayoutParams::class.java, + DO_NOTHING, + ) + log("hooked applyKeepScreenOnFlag to do nothing") + } catch (e: Throwable) { + log("failed to hook ViewRootImpl.applyKeepScreenOnFlag", e) + } + } + } +} diff --git a/metadata/com.programminghoch10.AntiWakeLock/en-US/full_description.txt b/metadata/com.programminghoch10.AntiWakeLock/en-US/full_description.txt new file mode 100644 index 0000000..462eca9 --- /dev/null +++ b/metadata/com.programminghoch10.AntiWakeLock/en-US/full_description.txt @@ -0,0 +1,3 @@ +Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. + +Can be applied to selected apps or the whole system. diff --git a/metadata/com.programminghoch10.AntiWakeLock/en-US/short_description.txt b/metadata/com.programminghoch10.AntiWakeLock/en-US/short_description.txt new file mode 100644 index 0000000..65159ab --- /dev/null +++ b/metadata/com.programminghoch10.AntiWakeLock/en-US/short_description.txt @@ -0,0 +1 @@ +Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. diff --git a/metadata/com.programminghoch10.AntiWakeLock/en-US/title.txt b/metadata/com.programminghoch10.AntiWakeLock/en-US/title.txt new file mode 100644 index 0000000..9d50a4c --- /dev/null +++ b/metadata/com.programminghoch10.AntiWakeLock/en-US/title.txt @@ -0,0 +1 @@ +AntiWakeLock diff --git a/modules.gradle.kts b/modules.gradle.kts index 9b3782e..5b7a484 100644 --- a/modules.gradle.kts +++ b/modules.gradle.kts @@ -1,6 +1,7 @@ include(":AlwaysAllowChargingFeedback") include(":AnimationScaleMod") include(":AntiBrightnessChange") +include(":AntiWakeLock") include(":AutomaticAdvancedSettingsExpander") include(":BetterBluetoothDeviceSort") include(":BetterVerboseWiFiLogging")