Skip to content

Commit dd19f7f

Browse files
committed
improve FreeNotifications
1 parent 89b7485 commit dd19f7f

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

FreeNotifications/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ android {
1414

1515
dependencies {
1616
implementation(project(":reflection"))
17+
implementation(project(":logger"))
1718
}
Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package de.binarynoise.freeNotifications
22

33
import android.app.NotificationChannel
4+
import de.binarynoise.logger.Logger.log
45
import de.binarynoise.reflection.findDeclaredField
56
import de.robv.android.xposed.IXposedHookLoadPackage
7+
import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING
8+
import de.robv.android.xposed.XC_MethodReplacement.returnConstant
69
import de.robv.android.xposed.XposedBridge
710
import de.robv.android.xposed.XposedHelpers
811
import de.robv.android.xposed.callbacks.XC_LoadPackage
@@ -11,31 +14,53 @@ import de.robv.android.xposed.XC_MethodHook as MethodHook
1114
class Hook : IXposedHookLoadPackage {
1215

1316
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
17+
// AOSP: mBlockableSystem / setBlockable / isBlockable
18+
1419
val cls = NotificationChannel::class.java
1520

1621
val mBlockableSystem = cls.findDeclaredField("mBlockableSystem")
1722

18-
val setToTrue = object : MethodHook() {
19-
override fun beforeHookedMethod(param: MethodHookParam) {
20-
mBlockableSystem.set(param.thisObject, true)
21-
}
22-
23-
override fun afterHookedMethod(param: MethodHookParam) {
24-
mBlockableSystem.set(param.thisObject, true)
25-
}
23+
tryAndLog("hook NotificationChannel constructors") {
24+
XposedBridge.hookAllConstructors(cls, object : MethodHook() {
25+
override fun afterHookedMethod(param: MethodHookParam) {
26+
mBlockableSystem.set(param.thisObject, true)
27+
}
28+
})
29+
}
30+
tryAndLog("hook setBlockable") {
31+
XposedHelpers.findAndHookMethod(cls, "setBlockable", Boolean::class.java, DO_NOTHING)
2632
}
33+
tryAndLog("hook isBlockable") {
34+
XposedHelpers.findAndHookMethod(cls, "isBlockable", returnConstant(true))
35+
}
36+
37+
// AOSP: mImportanceLockedDefaultApp / setImportanceLockedByCriticalDeviceFunction / isImportanceLockedByCriticalDeviceFunction
2738

28-
try {
29-
XposedBridge.hookAllConstructors(cls, setToTrue)
30-
} catch (_: Throwable) {
39+
val mImportanceLockedDefaultApp = cls.findDeclaredField("mImportanceLockedDefaultApp")
40+
41+
tryAndLog("hook constructors") {
42+
XposedBridge.hookAllConstructors(cls, object : MethodHook() {
43+
override fun afterHookedMethod(param: MethodHookParam) {
44+
mImportanceLockedDefaultApp.set(param.thisObject, false)
45+
}
46+
})
3147
}
32-
try {
33-
XposedHelpers.findAndHookMethod(cls, "setBlockable", Boolean::class.java, setToTrue)
34-
} catch (_: Throwable) {
48+
tryAndLog("hook setImportanceLockedByCriticalDeviceFunction") {
49+
XposedHelpers.findAndHookMethod(cls, "setImportanceLockedByCriticalDeviceFunction", Boolean::class.java, DO_NOTHING)
3550
}
36-
try {
37-
XposedHelpers.findAndHookMethod(cls, "isBlockable", setToTrue)
38-
} catch (_: Throwable) {
51+
tryAndLog("hook isImportanceLockedByCriticalDeviceFunction") {
52+
XposedHelpers.findAndHookMethod(cls, "isImportanceLockedByCriticalDeviceFunction", returnConstant(false))
3953
}
4054
}
4155
}
56+
57+
private inline fun tryAndLog(message: String, block: () -> Unit) {
58+
log(message)
59+
return try {
60+
block()
61+
log("done!")
62+
} catch (t: Throwable) {
63+
log("failed!")
64+
XposedBridge.log(t)
65+
}
66+
}

0 commit comments

Comments
 (0)