1
1
package de.binarynoise.freeNotifications
2
2
3
3
import android.app.NotificationChannel
4
+ import de.binarynoise.logger.Logger.log
4
5
import de.binarynoise.reflection.findDeclaredField
5
6
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
6
9
import de.robv.android.xposed.XposedBridge
7
10
import de.robv.android.xposed.XposedHelpers
8
11
import de.robv.android.xposed.callbacks.XC_LoadPackage
@@ -11,31 +14,53 @@ import de.robv.android.xposed.XC_MethodHook as MethodHook
11
14
class Hook : IXposedHookLoadPackage {
12
15
13
16
override fun handleLoadPackage (lpparam : XC_LoadPackage .LoadPackageParam ) {
17
+ // AOSP: mBlockableSystem / setBlockable / isBlockable
18
+
14
19
val cls = NotificationChannel ::class .java
15
20
16
21
val mBlockableSystem = cls.findDeclaredField(" mBlockableSystem" )
17
22
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 )
26
32
}
33
+ tryAndLog(" hook isBlockable" ) {
34
+ XposedHelpers .findAndHookMethod(cls, " isBlockable" , returnConstant(true ))
35
+ }
36
+
37
+ // AOSP: mImportanceLockedDefaultApp / setImportanceLockedByCriticalDeviceFunction / isImportanceLockedByCriticalDeviceFunction
27
38
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
+ })
31
47
}
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 )
35
50
}
36
- try {
37
- XposedHelpers .findAndHookMethod(cls, " isBlockable" , setToTrue)
38
- } catch (_: Throwable ) {
51
+ tryAndLog(" hook isImportanceLockedByCriticalDeviceFunction" ) {
52
+ XposedHelpers .findAndHookMethod(cls, " isImportanceLockedByCriticalDeviceFunction" , returnConstant(false ))
39
53
}
40
54
}
41
55
}
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