@@ -6,10 +6,9 @@ import androidx.annotation.Keep
66import de.robv.android.xposed.IXposedHookLoadPackage
77import de.robv.android.xposed.XposedHelpers
88import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
9- import ru.hepolise.volumekeytrackcontrolmodule.LogHelper.log
109import ru.hepolise.volumekeytrackcontrolmodule.VolumeKeyHandlers.handleConstructPhoneWindowManager
1110import ru.hepolise.volumekeytrackcontrolmodule.VolumeKeyHandlers.handleInterceptKeyBeforeQueueing
12- import ru.hepolise.volumekeytrackcontrolmodule.model.HookInfo
11+ import java.io.Serializable
1312
1413@Keep
1514class VolumeControlModule : IXposedHookLoadPackage {
@@ -20,6 +19,9 @@ class VolumeControlModule : IXposedHookLoadPackage {
2019 private const val CLASS_IWINDOW_MANAGER = " android.view.IWindowManager"
2120 private const val CLASS_WINDOW_MANAGER_FUNCS =
2221 " com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs"
22+
23+ private fun log (text : String ) =
24+ LogHelper .log(VolumeControlModule ::class .java.simpleName, text)
2325 }
2426
2527 @Throws(Throwable ::class )
@@ -30,61 +32,66 @@ class VolumeControlModule : IXposedHookLoadPackage {
3032 init (lpparam.classLoader)
3133 }
3234
35+ private val initMethodSignatures = mapOf (
36+ // Android 14 & 15 signature
37+ // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#2033
38+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android15-release/services/core/java/com/android/server/policy/PhoneWindowManager.java#2199
39+ arrayOf(
40+ Context ::class .java,
41+ CLASS_WINDOW_MANAGER_FUNCS
42+ ) to " Using Android 14 or 15 method signature" ,
43+
44+ // Android 13 signature
45+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android13-dev/services/core/java/com/android/server/policy/PhoneWindowManager.java#1873
46+ arrayOf(
47+ Context ::class .java,
48+ CLASS_IWINDOW_MANAGER ,
49+ CLASS_WINDOW_MANAGER_FUNCS
50+ ) to " Using Android 13 method signature" ,
51+
52+ // HyperOS-specific signature
53+ arrayOf(
54+ Context ::class .java,
55+ CLASS_WINDOW_MANAGER_FUNCS ,
56+ CLASS_IWINDOW_MANAGER
57+ ) to " Using HyperOS-specific method signature"
58+ )
59+
3360 private fun init (classLoader : ClassLoader ) {
34- val hookInfoList = listOf (
35- // Android 14 & 15 signature
36- // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#2033
37- // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android15-release/services/core/java/com/android/server/policy/PhoneWindowManager.java#2199
38- HookInfo (
39- params = arrayOf(Context ::class .java, CLASS_WINDOW_MANAGER_FUNCS ),
40- logMessage = " Using Android 14 or 15 method signature"
41- ),
42- // Android 13 signature
43- // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android13-dev/services/core/java/com/android/server/policy/PhoneWindowManager.java#1873
44- HookInfo (
45- params = arrayOf(
46- Context ::class .java,
47- CLASS_IWINDOW_MANAGER ,
48- CLASS_WINDOW_MANAGER_FUNCS
49- ),
50- logMessage = " Using Android 13 method signature"
51- ),
52- // HyperOS-specific signature
53- HookInfo (
54- params = arrayOf(
55- Context ::class .java,
56- CLASS_WINDOW_MANAGER_FUNCS ,
57- CLASS_IWINDOW_MANAGER
58- ),
59- logMessage = " Using HyperOS-specific method signature"
60- ),
61- )
61+ val foundMethod = initMethodSignatures.any { (params, logMessage) ->
62+ tryHookMethod(classLoader, params, logMessage)
63+ }
6264
63- var foundMethod = false
64- for (hookInfo in hookInfoList) {
65- try {
66- XposedHelpers .findAndHookMethod(
67- CLASS_PHONE_WINDOW_MANAGER , classLoader, " init" ,
68- * hookInfo.params, handleConstructPhoneWindowManager
69- )
70- foundMethod = true
71- log(hookInfo.logMessage)
72- break
73- } catch (ignored: NoSuchMethodError ) {
74- }
65+ if (! foundMethod) {
66+ log(" Method hook failed for init!" )
67+ return
7568 }
76- if (foundMethod) {
77- // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#4117
69+
70+ // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#4117
71+ XposedHelpers .findAndHookMethod(
72+ CLASS_PHONE_WINDOW_MANAGER ,
73+ classLoader,
74+ " interceptKeyBeforeQueueing" ,
75+ KeyEvent ::class .java,
76+ Int ::class .javaPrimitiveType,
77+ handleInterceptKeyBeforeQueueing
78+ )
79+ }
80+
81+ private fun tryHookMethod (
82+ classLoader : ClassLoader ,
83+ params : Array <Serializable >,
84+ logMessage : String
85+ ): Boolean {
86+ return try {
7887 XposedHelpers .findAndHookMethod(
79- CLASS_PHONE_WINDOW_MANAGER ,
80- classLoader,
81- " interceptKeyBeforeQueueing" ,
82- KeyEvent ::class .java,
83- Int ::class .javaPrimitiveType,
84- handleInterceptKeyBeforeQueueing
88+ CLASS_PHONE_WINDOW_MANAGER , classLoader, " init" ,
89+ * params, handleConstructPhoneWindowManager
8590 )
86- } else {
87- log(" Method hook failed for init!" )
91+ log(logMessage)
92+ true
93+ } catch (ignored: NoSuchMethodError ) {
94+ false
8895 }
8996 }
9097}
0 commit comments