From 5005d8844cbf4b91c1e502697e3982b0645c6351 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 14 Aug 2025 22:23:00 +0300 Subject: [PATCH 1/5] Bump compile & target SDK --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 913a275..c26ec69 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,12 +5,12 @@ plugins { } android { - compileSdk = 35 + compileSdk = 36 defaultConfig { applicationId = "ru.hepolise.volumekeymusicmanagermodule" minSdk = 27 - targetSdk = 35 + targetSdk = 36 versionCode = rootProject.ext["appVersionCode"].toString().toInt() versionName = rootProject.ext["appVersionName"].toString() } From bc95d9804cafa31373e923759e8fa4a2c427316c Mon Sep 17 00:00:00 2001 From: Hepolise Date: Tue, 19 Aug 2025 22:43:34 +0300 Subject: [PATCH 2/5] build: migrate kotlinOptions.jvmTarget to compilerOptions API - Replaced deprecated `kotlinOptions.jvmTarget = "17"` with `kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } }` --- app/build.gradle.kts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c26ec69..fe188da 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { id("com.android.application") id("org.jetbrains.kotlin.android") @@ -27,8 +29,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } } namespace = "ru.hepolise.volumekeytrackcontrolmodule" From 60aa927e76b3f579af887a3df50e207abb20e068 Mon Sep 17 00:00:00 2001 From: Hepolise Date: Tue, 19 Aug 2025 22:46:29 +0300 Subject: [PATCH 3/5] ui: fix focus handling in NumberAlertDialog - Move FocusRequester inside AlertDialog content - Ensure requestFocus is triggered within LaunchedEffect scoped to text field --- .../ui/component/NumberAlertDialog.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/ui/component/NumberAlertDialog.kt b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/ui/component/NumberAlertDialog.kt index 1f641e0..edbf895 100644 --- a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/ui/component/NumberAlertDialog.kt +++ b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/ui/component/NumberAlertDialog.kt @@ -31,11 +31,12 @@ fun NumberAlertDialog( ) { fun validate(value: Int) = value in minValue..maxValue var value by remember { mutableStateOf(defaultValue.toString()) } - val focusRequester = remember { FocusRequester() } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = title) }, text = { + val focusRequester = remember { FocusRequester() } + Column { OutlinedTextField( value = value, @@ -45,6 +46,9 @@ fun NumberAlertDialog( isError = value.toIntOrNull() == null || !validate(value.toInt()), modifier = Modifier.focusRequester(focusRequester) ) + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } } }, confirmButton = { @@ -63,7 +67,4 @@ fun NumberAlertDialog( } }, ) - LaunchedEffect(Unit) { - focusRequester.requestFocus() - } } \ No newline at end of file From cca380f27fb703bf584c61c68bb0471ad11d0199 Mon Sep 17 00:00:00 2001 From: Hepolise Date: Tue, 19 Aug 2025 22:49:27 +0300 Subject: [PATCH 4/5] module: extend init hook support to Android 16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added Android 16 method signature for PhoneWindowManager.init - Renamed tryHookMethod → tryHookInitMethod for clarity - Simplified init() logic using also{} to handle hook result - Minor log message updates --- .../module/VolumeControlModule.kt | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeControlModule.kt b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeControlModule.kt index f6deafa..bc20ce1 100644 --- a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeControlModule.kt +++ b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeControlModule.kt @@ -34,13 +34,14 @@ class VolumeControlModule : IXposedHookLoadPackage { } private val initMethodSignatures = mapOf( - // Android 14 & 15 signature + // Android 14, 15 and 16 signature // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#2033 // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android15-release/services/core/java/com/android/server/policy/PhoneWindowManager.java#2199 + // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android16-release/services/core/java/com/android/server/policy/PhoneWindowManager.java#2359 arrayOf( Context::class.java, CLASS_WINDOW_MANAGER_FUNCS - ) to "Using Android 14 or 15 method signature", + ) to "Using Android 14, 15 or 16 method signature", // Android 13 signature // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android13-dev/services/core/java/com/android/server/policy/PhoneWindowManager.java#1873 @@ -59,13 +60,13 @@ class VolumeControlModule : IXposedHookLoadPackage { ) private fun init(classLoader: ClassLoader) { - val foundMethod = initMethodSignatures.any { (params, logMessage) -> - tryHookMethod(classLoader, params, logMessage) - } - - if (!foundMethod) { - log("Method hook failed for init!") - return + initMethodSignatures.any { (params, logMessage) -> + tryHookInitMethod(classLoader, params, logMessage) + }.also { hooked -> + if (!hooked) { + log("Method hook failed for init!") + return + } } // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r18/services/core/java/com/android/server/policy/PhoneWindowManager.java#4117 @@ -79,7 +80,7 @@ class VolumeControlModule : IXposedHookLoadPackage { ) } - private fun tryHookMethod( + private fun tryHookInitMethod( classLoader: ClassLoader, params: Array, logMessage: String @@ -91,7 +92,7 @@ class VolumeControlModule : IXposedHookLoadPackage { ) log(logMessage) true - } catch (ignored: NoSuchMethodError) { + } catch (_: NoSuchMethodError) { false } } From 6a620101043fe74f3ffe7aeced3fcf586acbbfc1 Mon Sep 17 00:00:00 2001 From: Hepolise Date: Tue, 19 Aug 2025 22:49:52 +0300 Subject: [PATCH 5/5] module: generalize abortAll to handle all MediaEvent entries --- .../module/VolumeKeyControlModuleHandlers.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeKeyControlModuleHandlers.kt b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeKeyControlModuleHandlers.kt index 2ec73d3..3279c83 100644 --- a/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeKeyControlModuleHandlers.kt +++ b/app/src/main/java/ru/hepolise/volumekeytrackcontrol/module/VolumeKeyControlModuleHandlers.kt @@ -245,7 +245,7 @@ object VolumeKeyControlModuleHandlers { private fun MethodHookParam.abortAll() { log("Aborting all") - abortEvents(MediaEvent.Prev, MediaEvent.Next, MediaEvent.PlayPause) + abortEvents(*MediaEvent.entries.toTypedArray()) } private fun MethodHookParam.abortEvents(vararg events: MediaEvent) {