diff --git a/AntiWakeLock/Readme.md b/AntiWakeLock/Readme.md new file mode 100644 index 0000000..28d567b --- /dev/null +++ b/AntiWakeLock/Readme.md @@ -0,0 +1,5 @@ +# AntiWakeLock + +Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. + +Applies to selected apps only. 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..d27b9d9 --- /dev/null +++ b/AntiWakeLock/src/main/assets/xposed_init @@ -0,0 +1,2 @@ +com.programminghoch10.AntiWakeLock.PowerManagerHook +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..c5deb21 --- /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::class.java, "acquire", DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager::class.java, "acquire", Int::class.java, DO_NOTHING) + + // optional hooks for completeness + XposedHelpers.findAndHookMethod(PowerManager::class.java, "isHeld", returnConstant(false)) + XposedHelpers.findAndHookMethod(PowerManager::class.java, "release", DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager::class.java, "release", Int::class.java, DO_NOTHING) + XposedHelpers.findAndHookMethod(PowerManager::class.java, "setReferenceCounted", Boolean::class.java, DO_NOTHING) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) XposedHelpers.findAndHookMethod( + PowerManager::class.java, + "setStateListener", + Executor::class.java, + PowerManager.WakeLockStateListener::class.java, + DO_NOTHING, + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) XposedHelpers.findAndHookMethod( + PowerManager::class.java, + "setWorkSource", + WorkSource::class.java, + DO_NOTHING, + ) + } +} 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..d165dfb --- /dev/null +++ b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt @@ -0,0 +1,78 @@ +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, + ) + } 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..d432b5b --- /dev/null +++ b/metadata/com.programminghoch10.AntiWakeLock/en-US/full_description.txt @@ -0,0 +1,3 @@ +Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. + +Applies to selected apps only. 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")