From 7660d6db2a5dd2fe32f14bf30797de65552adea4 Mon Sep 17 00:00:00 2001 From: FreeTeaspoon <76246708+FreeTeaspoon@users.noreply.github.com> Date: Sun, 6 Sep 2026 11:14:26 +1000 Subject: [PATCH] fix: call ContextualSearchManager wrapper so CSService works on Android 17 Android 17 added a ContextualSearchConfig parameter to IContextualSearchManager.startContextualSearch and removed the single-argument form, so the direct Binder reflection call failed with NoSuchMethodException and Circle to Search never opened. Call the framework wrapper ContextualSearchManager.startContextualSearch(int) instead. It exists on Android 15, 16 and 17 and builds the Binder call with whatever arguments the installed platform expects. --- .../java/com/parallelc/micts/hooker/CSMSHooker.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/parallelc/micts/hooker/CSMSHooker.kt b/app/src/main/java/com/parallelc/micts/hooker/CSMSHooker.kt index 9473064..07ec884 100644 --- a/app/src/main/java/com/parallelc/micts/hooker/CSMSHooker.kt +++ b/app/src/main/java/com/parallelc/micts/hooker/CSMSHooker.kt @@ -2,7 +2,6 @@ package com.parallelc.micts.hooker import android.annotation.SuppressLint import android.content.Context -import android.os.IBinder import android.util.Log import com.parallelc.micts.module import io.github.libxposed.api.XposedInterface.Chain @@ -37,10 +36,13 @@ class CSMSHooker { hooks += module!!.hook(enforcePermission!!).intercept(EnforcePermissionHooker()) hooks += module!!.hook(getContextualSearchPackageName!!).intercept(GetCSPackageNameHooker()) - val icsmClass = Class.forName("android.app.contextualsearch.IContextualSearchManager") - val cs = Class.forName("android.os.ServiceManager").getMethod("getService", String::class.java).invoke(null, "contextual_search") - val icsm = Class.forName("android.app.contextualsearch.IContextualSearchManager\$Stub").getMethod("asInterface", IBinder::class.java).invoke(null, cs) - icsmClass.getDeclaredMethod("startContextualSearch", Int::class.java).invoke(icsm, entryPoint) + // The framework manager adapts this call to the platform's Binder API. + // Android 17 added ContextualSearchConfig to the Binder method, while + // this manager entry point remains available on Android 15 through 17. + val managerClass = Class.forName("android.app.contextualsearch.ContextualSearchManager") + val manager = managerClass.getDeclaredConstructor().newInstance() + managerClass.getDeclaredMethod("startContextualSearch", Int::class.java) + .invoke(manager, entryPoint) }.onFailure { e -> module!!.log(Log.ERROR, "MiCTS", "invoke startContextualSearch fail", e) }.also { @@ -70,4 +72,4 @@ class CSMSHooker { } } } -} \ No newline at end of file +}