Skip to content

Commit 9564ea3

Browse files
committed
Refactor module code
1 parent 2afd743 commit 9564ea3

File tree

4 files changed

+63
-76
lines changed

4 files changed

+63
-76
lines changed

app/src/main/java/ru/hepolise/volumekeytrackcontrolmodule/LogHelper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package ru.hepolise.volumekeytrackcontrolmodule
33
import de.robv.android.xposed.XposedBridge
44

55
object LogHelper {
6-
fun log(text: String) {
7-
if (BuildConfig.DEBUG) XposedBridge.log(text)
6+
fun log(prefix: String, text: String) {
7+
if (BuildConfig.DEBUG) XposedBridge.log("[$prefix] $text")
88
}
99
}

app/src/main/java/ru/hepolise/volumekeytrackcontrolmodule/VolumeControlModule.kt

Lines changed: 59 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ import androidx.annotation.Keep
66
import de.robv.android.xposed.IXposedHookLoadPackage
77
import de.robv.android.xposed.XposedHelpers
88
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
9-
import ru.hepolise.volumekeytrackcontrolmodule.LogHelper.log
109
import ru.hepolise.volumekeytrackcontrolmodule.VolumeKeyHandlers.handleConstructPhoneWindowManager
1110
import ru.hepolise.volumekeytrackcontrolmodule.VolumeKeyHandlers.handleInterceptKeyBeforeQueueing
12-
import ru.hepolise.volumekeytrackcontrolmodule.model.HookInfo
11+
import java.io.Serializable
1312

1413
@Keep
1514
class 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
}

app/src/main/java/ru/hepolise/volumekeytrackcontrolmodule/VolumeKeyHandlers.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import android.view.ViewConfiguration
1313
import de.robv.android.xposed.XC_MethodHook
1414
import de.robv.android.xposed.XC_MethodHook.MethodHookParam
1515
import de.robv.android.xposed.XposedHelpers
16-
import ru.hepolise.volumekeytrackcontrolmodule.LogHelper.log
1716
import ru.hepolise.volumekeytrackcontrolmodule.extension.AudioManagerExtension.sendMediaButtonEvent
1817
import ru.hepolise.volumekeytrackcontrolmodule.extension.VibratorExtension.triggerVibration
1918

@@ -33,6 +32,8 @@ object VolumeKeyHandlers {
3332
private lateinit var powerManager: PowerManager
3433
private lateinit var vibrator: Vibrator
3534

35+
private fun log(text: String) = LogHelper.log(VolumeControlModule::class.java.simpleName, text)
36+
3637
val handleInterceptKeyBeforeQueueing: XC_MethodHook = object : XC_MethodHook() {
3738
override fun beforeHookedMethod(param: MethodHookParam) {
3839
val event = param.args[0] as KeyEvent

app/src/main/java/ru/hepolise/volumekeytrackcontrolmodule/model/HookInfo.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)