11package com.xposed.miuiime
22
3- import android.annotation.TargetApi
4- import android.os.Build
53import android.view.inputmethod.InputMethodManager
64import de.robv.android.xposed.*
75import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
86
97class MainHook : IXposedHookLoadPackage {
10- private var isA10 = false
11- private var isA11 = false
128 override fun handleLoadPackage (lpparam : LoadPackageParam ) {
139 // 检查是否支持全面屏优化
1410 if (PropertyUtils [" ro.miui.support_miui_ime_bottom" , " 0" ] != " 1" ) return
15- checkVersion()
1611 // 检查是否为小米定制输入法
1712 val isNonCustomize = ! miuiImeList.contains(lpparam.packageName)
1813 if (isNonCustomize) {
19- val clazz = XposedHelpers . findClass(
14+ findClass(
2015 " android.inputmethodservice.InputMethodServiceInjector" ,
2116 lpparam.classLoader
22- )
23- hookSIsImeSupport(clazz)
24- XposedBridge .log(" Hooked ServiceInjector: " + lpparam.packageName)
25- if (isA10) {
26- hookIsXiaoAiEnable(clazz)
27- XposedBridge .log(" Hooked IsXiaoAiEnable: " + lpparam.packageName)
28- } else // 将导航栏颜色赋值给输入法优化的底图
29- XposedHelpers .findAndHookMethod(" com.android.internal.policy.PhoneWindow" ,
17+ )?.let {
18+ hookSIsImeSupport(it)
19+ hookIsXiaoAiEnable(it)
20+
21+ // 将导航栏颜色赋值给输入法优化的底图
22+ findAndHookMethod(" com.android.internal.policy.PhoneWindow" ,
3023 lpparam.classLoader, " setNavigationBarColor" ,
3124 Int ::class .javaPrimitiveType, object : XC_MethodHook () {
3225 override fun afterHookedMethod (param : MethodHookParam ) {
33- // 0xff747474, 0x66747474
3426 val color = - 0x1 - param.args[0 ] as Int
3527 XposedHelpers .callStaticMethod(
36- clazz , " customizeBottomViewColor" ,
28+ it , " customizeBottomViewColor" ,
3729 true , param.args[0 ], color or - 0x1000000 , color or 0x66000000
3830 )
3931 }
4032 })
41- XposedBridge .log( " Hooked customizeBottomViewColor: " + lpparam.packageName)
33+ }
4234 }
43- if (isA10) {
44- // 针对A10的修复切换输入法列表
45- XposedHelpers .findAndHookMethod(
46- " android.inputmethodservice.InputMethodServiceInjector\$ MiuiSwitchInputMethodListener" ,
47- lpparam.classLoader, " deleteNotSupportIme" ,
48- XC_MethodReplacement .returnConstant(null )
49- )
50- XposedBridge .log(" Hooked deleteNotSupportIme: " + lpparam.packageName)
51- } else {
52- // 获取常用语的ClassLoader
53- XposedHelpers .findAndHookMethod(" android.inputmethodservice.InputMethodModuleManager" ,
54- lpparam.classLoader, " loadDex" ,
55- ClassLoader ::class .java, String ::class .java,
56- object : XC_MethodHook () {
57- override fun afterHookedMethod (param : MethodHookParam ) {
58- val clazz = XposedHelpers .findClass(
59- " com.miui.inputmethod.InputMethodBottomManager" ,
60- param.args[0 ] as ClassLoader
61- )
35+ // 针对A10的修复切换输入法列表
36+ findAndHookMethod(
37+ " android.inputmethodservice.InputMethodServiceInjector\$ MiuiSwitchInputMethodListener" ,
38+ lpparam.classLoader, " deleteNotSupportIme" ,
39+ XC_MethodReplacement .returnConstant(null )
40+ )
41+
42+ // 获取常用语的ClassLoader
43+ findAndHookMethod(" android.inputmethodservice.InputMethodModuleManager" ,
44+ lpparam.classLoader, " loadDex" ,
45+ ClassLoader ::class .java, String ::class .java,
46+ object : XC_MethodHook () {
47+ override fun afterHookedMethod (param : MethodHookParam ) {
48+ findClass(
49+ " com.miui.inputmethod.InputMethodBottomManager" ,
50+ param.args[0 ] as ClassLoader
51+ )?.let {
6252 if (isNonCustomize) {
63- hookSIsImeSupport(clazz)
64- hookIsXiaoAiEnable(clazz)
65- XposedBridge .log(" Hooked MiuiBottomView: " + lpparam.packageName)
53+ hookSIsImeSupport(it)
54+ hookIsXiaoAiEnable(it)
6655 }
56+
6757 // 针对A11的修复切换输入法列表
68- XposedHelpers .findAndHookMethod(clazz, " getSupportIme" ,
58+ findAndHookMethod(
59+ it, " getSupportIme" ,
6960 object : XC_MethodReplacement () {
70- @TargetApi(Build .VERSION_CODES .CUPCAKE )
7161 override fun replaceHookedMethod (param : MethodHookParam ): Any {
7262 return (XposedHelpers .getObjectField(
7363 XposedHelpers .getStaticObjectField(
74- clazz,
75- " sBottomViewHelper"
64+ it, " sBottomViewHelper"
7665 ),
7766 " mImm"
7867 ) as InputMethodManager ).enabledInputMethodList
7968 }
8069 })
81- XposedBridge .log(" Hooked getSupportIme Method: " + lpparam.packageName)
8270 }
83- })
84- }
71+ }
72+ })
73+ XposedBridge .log(" Hook MIUI IME Success" )
8574 }
8675
8776 /* *
@@ -90,11 +79,7 @@ class MainHook : IXposedHookLoadPackage {
9079 * @param clazz 声明或继承字段的类
9180 */
9281 private fun hookSIsImeSupport (clazz : Class <* >) {
93- try {
94- XposedHelpers .setStaticIntField(clazz, " sIsImeSupport" , 1 )
95- } catch (e: Exception ) {
96- XposedBridge .log(e)
97- }
82+ XposedHelpers .setStaticIntField(clazz, " sIsImeSupport" , 1 )
9883 }
9984
10085 /* *
@@ -103,40 +88,61 @@ class MainHook : IXposedHookLoadPackage {
10388 * @param clazz 声明或继承方法的类
10489 */
10590 private fun hookIsXiaoAiEnable (clazz : Class <* >) {
106- try {
91+ findAndHookMethod(
92+ clazz, " isXiaoAiEnable" ,
93+ XC_MethodReplacement .returnConstant(false )
94+ )
95+ }
96+
97+ fun findAndHookMethod (
98+ clazz : Class <* >,
99+ methodName : String ,
100+ vararg parameterTypesAndCallback : Any?
101+ ): XC_MethodHook .Unhook ? {
102+ return try {
103+ XposedBridge .log(" Hook method $methodName " )
104+ XposedHelpers .findAndHookMethod(clazz, methodName, * parameterTypesAndCallback)
105+ } catch (e: IllegalArgumentException ) {
106+ XposedBridge .log(" Hook method $methodName failed" )
107+ XposedBridge .log(e)
108+ null
109+ }
110+ }
111+
112+ private fun findAndHookMethod (
113+ className : String ,
114+ classLoader : ClassLoader ,
115+ methodName : String ,
116+ vararg parameterTypesAndCallback : Any?
117+ ): XC_MethodHook .Unhook ? {
118+ return try {
119+ XposedBridge .log(" Hook method $methodName " )
107120 XposedHelpers .findAndHookMethod(
108- clazz, " isXiaoAiEnable" ,
109- XC_MethodReplacement .returnConstant(false )
121+ XposedHelpers .findClass(className, classLoader),
122+ methodName,
123+ * parameterTypesAndCallback
110124 )
111- } catch (e: Exception ) {
125+ } catch (e: IllegalArgumentException ) {
126+ XposedBridge .log(" Hook method $methodName failed" )
112127 XposedBridge .log(e)
128+ null
113129 }
114130 }
115131
116- /* *
117- * 检查Android版本
118- */
119- private fun checkVersion () {
120- when (Build .VERSION .SDK_INT ) {
121- 30 -> {
122- isA10 = false
123- isA11 = true
124- }
125- 29 , 28 -> {
126- isA10 = true
127- isA11 = false
128- }
129- else -> {
130- isA10 = false
131- isA11 = false
132- }
132+ fun findClass (className : String , classLoader : ClassLoader ): Class <* >? {
133+ return try {
134+ XposedBridge .log(" Find class $className " )
135+ XposedHelpers .findClass(className, classLoader)
136+ } catch (e: ClassNotFoundException ) {
137+ XposedBridge .log(" Find class $className failed" )
138+ XposedBridge .log(e)
139+ null
133140 }
134141 }
135142
136- companion object {
137- val miuiImeList: List <String > = listOf (
138- " com.iflytek.inputmethod.miui" ,
139- " com.sohu.inputmethod.sogou.xiaomi" , " com.baidu.input_mi" , " com.miui.catcherpatch"
140- )
141- }
143+ private val miuiImeList: List <String > = listOf (
144+ " com.iflytek.inputmethod.miui" ,
145+ " com.sohu.inputmethod.sogou.xiaomi" , " com.baidu.input_mi" , " com.miui.catcherpatch"
146+ )
147+
142148}
0 commit comments