From 4e7e1e05c9d3bc4a30baa2871855fa399f4c454c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sun, 5 Nov 2023 02:17:05 +0800 Subject: [PATCH 1/7] =?UTF-8?q?[add]=20=E5=88=9D=E6=AD=A5=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=BE=AE=E4=BF=A18.0.42=EF=BC=8C=E5=B9=B6=E5=AF=B9?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E7=94=A8=E6=88=B7=E5=BC=80=E5=90=AF=E6=9A=B4?= =?UTF-8?q?=E5=8A=9B=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/java/com/lu/wxmask/Constrant.kt | 1 + .../com/lu/wxmask/plugin/WXConfigPlugin.java | 2 +- .../EmptySingChatHistoryGalleryPluginPart.kt | 3 +- .../plugin/part/EnterChattingUIPluginPart.kt | 10 ++- .../plugin/part/HideMainUIListPluginPart.kt | 2 +- .../plugin/part/HideSearchListUIPluginPart.kt | 66 ++++++++++++++++++- .../java/com/lu/wxmask/util/AppVersionUtil.kt | 3 +- .../java/com/lu/wxmask/util/EachUtil.java | 30 +++++++++ 9 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/lu/wxmask/util/EachUtil.java diff --git a/app/build.gradle b/app/build.gradle index 7729751..da1d723 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,8 +67,8 @@ android { applicationId "com.lu.wxmask" minSdk 24 targetSdk 34 - versionCode 21 - versionName "1.20-bug" + versionCode 22 + versionName "1.22-bug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/lu/wxmask/Constrant.kt b/app/src/main/java/com/lu/wxmask/Constrant.kt index 2447488..4a71ecb 100644 --- a/app/src/main/java/com/lu/wxmask/Constrant.kt +++ b/app/src/main/java/com/lu/wxmask/Constrant.kt @@ -40,6 +40,7 @@ class Constrant { const val WX_CODE_8_0_38 = 2400 const val WX_CODE_8_0_40 = 2420 const val WX_CODE_8_0_41 = 2441 + const val WX_CODE_8_0_42 = 2460 } } \ No newline at end of file diff --git a/app/src/main/java/com/lu/wxmask/plugin/WXConfigPlugin.java b/app/src/main/java/com/lu/wxmask/plugin/WXConfigPlugin.java index c155e32..457c281 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/WXConfigPlugin.java +++ b/app/src/main/java/com/lu/wxmask/plugin/WXConfigPlugin.java @@ -76,7 +76,7 @@ private void onEntryWechatUI(Activity activity, Intent intent) { boolean isFromMaskPlugin = intent.getBooleanExtra(Constrant.KEY_INTENT_FROM_MASK, false); pluginMode = intent.getIntExtra(Constrant.KEY_INTENT_PLUGIN_MODE, -1); if (!isFromMaskPlugin) { - LogUtil.i("ignore not from mask"); + LogUtil.d("ignore not from mask"); return; } if (!AppVersionUtil.isSupportWechat()) { diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt index 600ba29..382146b 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt @@ -82,7 +82,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin { val MediaHistoryGalleryUI = "com.tencent.mm.ui.chatting.gallery.MediaHistoryGalleryUI" val methodName = when (AppVersionUtil.getVersionCode()) { in Constrant.WX_CODE_8_0_22..Constrant.WX_CODE_8_0_35 -> "k" - in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_41 -> "l" + in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_42 -> "l" else -> null } var galleryMethod: Method? = null @@ -146,6 +146,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin { Constrant.WX_CODE_8_0_37 -> "Q" Constrant.WX_CODE_8_0_38 -> "R" in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "Q" + in Constrant.WX_CODE_8_0_41 .. Constrant.WX_CODE_8_0_42 -> "R" else -> null } LogUtil.d("setEmptyActionBarTabPageUI method is :", commonHookMethodName) diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt index 57f7bf5..3f0e891 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt @@ -45,7 +45,7 @@ class EnterChattingUIPluginPart() : IPlugin { "onEnterBegin" ) if (onEnterBeginMethod == null) { - LogUtil.i("onEnterBegin function == null, maybe change") + LogUtil.d("onEnterBegin function == null, maybe change") } else { //8.0.22 LogUtil.d("hook onEnterBegin") @@ -72,6 +72,7 @@ class EnterChattingUIPluginPart() : IPlugin { Constrant.WX_CODE_8_0_37 -> "K" Constrant.WX_CODE_8_0_38 -> "M" in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "K" + in Constrant.WX_CODE_8_0_41 .. Constrant.WX_CODE_8_0_42 -> "M" else -> null } var dispatchMethod: Method? = null @@ -159,7 +160,12 @@ class EnterChattingHookAction( }.getOrNull() if (listView == null) { listView = runCatching { - val mmListViewId = ResUtil.getViewId("b5n") + val mmListViewId = + if (AppVersionUtil.getVersionCode() == Constrant.WX_CODE_8_0_42) { + ResUtil.getViewId("bm6") + }else{ + ResUtil.getViewId("b5n") + } XposedHelpers2.callMethod(fragmentObj, "findViewById", mmListViewId) as View }.getOrNull() diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt index 8c77f1e..c4b491b 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt @@ -215,7 +215,7 @@ class HideMainUIListPluginPart : IPlugin { Constrant.WX_CODE_8_0_22 -> "com.tencent.mm.ui.g" in Constrant.WX_CODE_8_0_32..Constrant.WX_CODE_8_0_34 -> "com.tencent.mm.ui.y" in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_38 -> "com.tencent.mm.ui.z" - in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "com.tencent.mm.ui.b0" + in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_42 -> "com.tencent.mm.ui.b0" else -> null } var getItemMethod = if (adapterClazzName != null && getItemMethodName != null) { diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt index 32b19fe..0547f1d 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt @@ -1,9 +1,13 @@ package com.lu.wxmask.plugin.part import android.content.Context +import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.lu.lposed.api2.XC_MethodHook2 import com.lu.lposed.api2.XposedHelpers2 import com.lu.lposed.plugin.IPlugin +import com.lu.lposed.plugin.PluginProviders +import com.lu.magic.util.GsonUtil import com.lu.magic.util.log.LogUtil import com.lu.wxmask.BuildConfig import com.lu.wxmask.Constrant @@ -12,6 +16,7 @@ import com.lu.wxmask.util.AppVersionUtil import com.lu.wxmask.util.dev.DebugUtil import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.callbacks.XC_LoadPackage +import java.lang.reflect.Field /** * 隐藏搜索列表 @@ -72,7 +77,7 @@ class HideSearchListUIPluginPart : IPlugin { private fun handleDetailSearch(context: Context, lpparam: XC_LoadPackage.LoadPackageParam) { var hookClazzName = when (AppVersionUtil.getVersionCode()) { - in Constrant.WX_CODE_8_0_38.. Constrant.WX_CODE_8_0_41 -> "com.tencent.mm.plugin.fts.ui.x" + in Constrant.WX_CODE_8_0_38..Constrant.WX_CODE_8_0_41 -> "com.tencent.mm.plugin.fts.ui.x" else -> "com.tencent.mm.plugin.fts.ui.y" } //全局搜索详情置空 @@ -83,7 +88,7 @@ class HideSearchListUIPluginPart : IPlugin { Integer.TYPE, object : XC_MethodHook2() { override fun afterHookedMethod(param: MethodHookParam) { - if (needHideUserName(param, param.result)) { + if (needHideUserName2(param, param.result)) { LogUtil.d(param.result) param.result = try { //将命中的用户数据抹除掉 @@ -95,6 +100,7 @@ class HideSearchListUIPluginPart : IPlugin { } } + } ) } @@ -103,7 +109,7 @@ class HideSearchListUIPluginPart : IPlugin { // val wxVersionCode = AppVersionUtil.getVersionCode() // 理论上 hook com.tencent.mm.plugin.fts.ui.z#getItem 也是一样的,但是被覆盖重命名了 var hookClazzName = when (AppVersionUtil.getVersionCode()) { - in Constrant.WX_CODE_8_0_38 .. Constrant.WX_CODE_8_0_41 -> "com.tencent.mm.plugin.fts.ui.y" + in Constrant.WX_CODE_8_0_38..Constrant.WX_CODE_8_0_42 -> "com.tencent.mm.plugin.fts.ui.y" else -> "com.tencent.mm.plugin.fts.ui.z" } //全局搜索首页 @@ -222,4 +228,58 @@ class HideSearchListUIPluginPart : IPlugin { } + private fun needHideUserName2(param: XC_MethodHook.MethodHookParam, itemData: Any?): Boolean { + if (itemData == null) { + return false + } + var clazz: Class<*>? = itemData.javaClass + + while (clazz != null) { + for (field in clazz.declaredFields) { + field.isAccessible = true + try { + if (checkNeedHide(itemData, field)) { + LogUtil.i("field: ", field.type.name, field.name, field.get(itemData)) + return true + } + } catch (e: Exception) { + continue + } + } + clazz = try { + clazz.superclass + } catch (e: Exception) { + break + } + } + return false + } + + private fun checkNeedHide(obj: Any, field: Field): Boolean { + var fieldValue = field.get(obj) + var clazzName = field.type.name + if (field.type.isAssignableFrom(Number::class.java) + || field.type.isAssignableFrom(Byte::class.java) + || clazzName.startsWith("android") + ) { + return false + } + + var compareText = if (fieldValue is CharSequence) { + fieldValue + } else { + GsonUtil.toJson(fieldValue) + } + + for (wxid in PluginProviders.from(WXMaskPlugin::class.java).maskIdList) { + if (wxid == null) { + continue + } + if (compareText.contains(wxid)) { + LogUtil.d("compareText: ", compareText) + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/lu/wxmask/util/AppVersionUtil.kt b/app/src/main/java/com/lu/wxmask/util/AppVersionUtil.kt index 1257c8f..7500a91 100644 --- a/app/src/main/java/com/lu/wxmask/util/AppVersionUtil.kt +++ b/app/src/main/java/com/lu/wxmask/util/AppVersionUtil.kt @@ -55,7 +55,8 @@ class AppVersionUtil { Constrant.WX_CODE_8_0_37, Constrant.WX_CODE_8_0_38, Constrant.WX_CODE_8_0_40, - Constrant.WX_CODE_8_0_41 -> true + Constrant.WX_CODE_8_0_41, + Constrant.WX_CODE_8_0_42 -> true else -> false } diff --git a/app/src/main/java/com/lu/wxmask/util/EachUtil.java b/app/src/main/java/com/lu/wxmask/util/EachUtil.java new file mode 100644 index 0000000..cd0f8e1 --- /dev/null +++ b/app/src/main/java/com/lu/wxmask/util/EachUtil.java @@ -0,0 +1,30 @@ +package com.lu.wxmask.util; + +import java.lang.reflect.Field; +import java.util.function.Predicate; + +public class EachUtil { + + public static void eachFieldValue(Object obj, Predicate consumer) { + Class clazz = obj.getClass(); + while (clazz != null) { + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + try { + Object v = field.get(obj); + boolean isBreak = consumer.test(v); + if (isBreak) { + break; + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + try { + clazz = clazz.getSuperclass(); + } catch (Exception e) { + break; + } + } + } +} From 9cc606dc3e032f64643e31d8422ea6fae7108fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sun, 5 Nov 2023 02:30:48 +0800 Subject: [PATCH 2/7] =?UTF-8?q?[mod]=20=E6=89=93=E5=8D=B0=E5=A4=AA?= =?UTF-8?q?=E5=A4=9A=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt index 0547f1d..3dca263 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt @@ -94,7 +94,7 @@ class HideSearchListUIPluginPart : IPlugin { //将命中的用户数据抹除掉 param.result::class.java.newInstance() } catch (e: Throwable) { - LogUtil.w("error new Instance, return null") + LogUtil.d("error new Instance, return null") null } } @@ -239,7 +239,7 @@ class HideSearchListUIPluginPart : IPlugin { field.isAccessible = true try { if (checkNeedHide(itemData, field)) { - LogUtil.i("field: ", field.type.name, field.name, field.get(itemData)) + LogUtil.d("field: ", field.type.name, field.name, field.get(itemData)) return true } } catch (e: Exception) { From ec4f63d270fda6c16d81a8826f6e783700ef08b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sat, 11 Nov 2023 14:46:23 +0800 Subject: [PATCH 3/7] =?UTF-8?q?[add]=20=E4=B8=BB=E9=A1=B5=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=88=97=E8=A1=A8=E6=94=B9=E8=BF=9B=EF=BC=8C=E9=92=88?= =?UTF-8?q?=E5=AF=B9=E5=9C=A8=E7=B3=8A=E8=84=B8=E5=90=8D=E5=8D=95=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9=EF=BC=9A1?= =?UTF-8?q?=E3=80=81=E5=8A=A8=E7=94=BB=E8=A1=A8=E6=83=85=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E9=9A=90=E8=97=8F=202=E3=80=81=E6=B6=88=E6=81=AF=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=87=8F=E5=8E=BB365=E5=A4=A9=EF=BC=8C=E5=8D=B3?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=88=90=E5=8E=BB=E5=B9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- app/src/main/java/com/lu/wxmask/Constrant.kt | 3 +++ .../plugin/part/HideMainUIListPluginPart.kt | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index da1d723..459ed25 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,7 +68,7 @@ android { minSdk 24 targetSdk 34 versionCode 22 - versionName "1.22-bug" + versionName "1.21-bug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/lu/wxmask/Constrant.kt b/app/src/main/java/com/lu/wxmask/Constrant.kt index 4a71ecb..3dadf22 100644 --- a/app/src/main/java/com/lu/wxmask/Constrant.kt +++ b/app/src/main/java/com/lu/wxmask/Constrant.kt @@ -2,6 +2,8 @@ package com.lu.wxmask class Constrant { companion object { + const val ONE_YEAR_MILLS = 1000L * 60 * 60 * 24 * 365L + //intent key, 标记来源是 Mask App const val KEY_INTENT_FROM_MASK = "KEY_INTENT_FROM_MASK" @@ -33,6 +35,7 @@ class Constrant { const val WX_CODE_8_0_32 = 2300 const val WX_CODE_8_0_33 = 2320 const val WX_CODE_8_0_34 = 2340 + //不知道为毛8.0.35找到一个和版本号与8.0.34重复的版本 //const val WX_CODE_8_0_35 = 2340 const val WX_CODE_8_0_35 = 2360 diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt index c4b491b..90ba170 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt @@ -35,6 +35,7 @@ class HideMainUIListPluginPart : IPlugin { LogUtil.w("hide mainUI listview fail, try to old function.") handleMainUIChattingListView(context, lpparam) } + } //隐藏指定用户的主页的消息 @@ -276,6 +277,19 @@ class HideMainUIListPluginPart : IPlugin { XposedHelpers2.setObjectField(itemData, "field_unReadCount", 0) XposedHelpers2.setObjectField(itemData, "field_UnReadInvite", 0) XposedHelpers2.setObjectField(itemData, "field_unReadMuteCount", 0) + //文本消息 + XposedHelpers2.setObjectField(itemData, "field_msgType", "1") + + try { + var cTime = XposedHelpers2.getObjectField(itemData, "field_conversationTime") + if (cTime != null) { + val cTime2 = cTime - Constrant.ONE_YEAR_MILLS + XposedHelpers2.setObjectField(itemData, "field_flag", cTime2) + XposedHelpers2.setObjectField(itemData, "field_conversationTime", cTime2) + } + } catch (e: Exception) { + } + } } @@ -284,4 +298,5 @@ class HideMainUIListPluginPart : IPlugin { ) } + } \ No newline at end of file From 1eb41f37f8aeea526e49bc8ce628850e8ac0288e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sat, 11 Nov 2023 14:48:07 +0800 Subject: [PATCH 4/7] =?UTF-8?q?[add]=20=E7=BB=A7=E7=BB=AD=E6=9A=B4?= =?UTF-8?q?=E5=8A=9B=E9=80=82=E9=85=8D=E9=80=82=E9=85=8D8.0.43?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/lu/wxmask/Constrant.kt | 1 + .../EmptySingChatHistoryGalleryPluginPart.kt | 4 +- .../plugin/part/EnterChattingUIPluginPart.kt | 14 ++--- .../plugin/part/HideMainUIListPluginPart.kt | 2 +- .../plugin/part/HideSearchListUIPluginPart.kt | 57 +++++++++++++++---- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/lu/wxmask/Constrant.kt b/app/src/main/java/com/lu/wxmask/Constrant.kt index 3dadf22..c9dd267 100644 --- a/app/src/main/java/com/lu/wxmask/Constrant.kt +++ b/app/src/main/java/com/lu/wxmask/Constrant.kt @@ -44,6 +44,7 @@ class Constrant { const val WX_CODE_8_0_40 = 2420 const val WX_CODE_8_0_41 = 2441 const val WX_CODE_8_0_42 = 2460 + const val WX_CODE_8_0_43 = 2480 } } \ No newline at end of file diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt index 382146b..e6ed65a 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/EmptySingChatHistoryGalleryPluginPart.kt @@ -82,7 +82,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin { val MediaHistoryGalleryUI = "com.tencent.mm.ui.chatting.gallery.MediaHistoryGalleryUI" val methodName = when (AppVersionUtil.getVersionCode()) { in Constrant.WX_CODE_8_0_22..Constrant.WX_CODE_8_0_35 -> "k" - in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_42 -> "l" + in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_43 -> "l" else -> null } var galleryMethod: Method? = null @@ -145,7 +145,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin { Constrant.WX_CODE_8_0_35 -> "P" Constrant.WX_CODE_8_0_37 -> "Q" Constrant.WX_CODE_8_0_38 -> "R" - in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "Q" + in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41, Constrant.WX_CODE_8_0_43-> "Q" in Constrant.WX_CODE_8_0_41 .. Constrant.WX_CODE_8_0_42 -> "R" else -> null } diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt index 3f0e891..38ec88d 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/EnterChattingUIPluginPart.kt @@ -69,10 +69,10 @@ class EnterChattingUIPluginPart() : IPlugin { } Constrant.WX_CODE_8_0_35 -> "J" - Constrant.WX_CODE_8_0_37 -> "K" + Constrant.WX_CODE_8_0_37, Constrant.WX_CODE_8_0_43 -> "K" Constrant.WX_CODE_8_0_38 -> "M" in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "K" - in Constrant.WX_CODE_8_0_41 .. Constrant.WX_CODE_8_0_42 -> "M" + in Constrant.WX_CODE_8_0_41..Constrant.WX_CODE_8_0_42 -> "M" else -> null } var dispatchMethod: Method? = null @@ -161,11 +161,11 @@ class EnterChattingHookAction( if (listView == null) { listView = runCatching { val mmListViewId = - if (AppVersionUtil.getVersionCode() == Constrant.WX_CODE_8_0_42) { - ResUtil.getViewId("bm6") - }else{ - ResUtil.getViewId("b5n") - } + if (AppVersionUtil.getVersionCode() in Constrant.WX_CODE_8_0_42..Constrant.WX_CODE_8_0_43) { + ResUtil.getViewId("bm6") + } else { + ResUtil.getViewId("b5n") + } XposedHelpers2.callMethod(fragmentObj, "findViewById", mmListViewId) as View }.getOrNull() diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt index 90ba170..7755337 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt @@ -216,7 +216,7 @@ class HideMainUIListPluginPart : IPlugin { Constrant.WX_CODE_8_0_22 -> "com.tencent.mm.ui.g" in Constrant.WX_CODE_8_0_32..Constrant.WX_CODE_8_0_34 -> "com.tencent.mm.ui.y" in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_38 -> "com.tencent.mm.ui.z" - in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_42 -> "com.tencent.mm.ui.b0" + in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_43 -> "com.tencent.mm.ui.b0" else -> null } var getItemMethod = if (adapterClazzName != null && getItemMethodName != null) { diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt index 3dca263..a4c3000 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideSearchListUIPluginPart.kt @@ -1,13 +1,13 @@ package com.lu.wxmask.plugin.part import android.content.Context -import com.google.gson.Gson -import com.google.gson.GsonBuilder +import android.util.LruCache import com.lu.lposed.api2.XC_MethodHook2 import com.lu.lposed.api2.XposedHelpers2 import com.lu.lposed.plugin.IPlugin import com.lu.lposed.plugin.PluginProviders import com.lu.magic.util.GsonUtil +import com.lu.magic.util.ReflectUtil import com.lu.magic.util.log.LogUtil import com.lu.wxmask.BuildConfig import com.lu.wxmask.Constrant @@ -17,11 +17,15 @@ import com.lu.wxmask.util.dev.DebugUtil import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.callbacks.XC_LoadPackage import java.lang.reflect.Field +import java.sql.Ref /** * 隐藏搜索列表 */ class HideSearchListUIPluginPart : IPlugin { + private val hideFieldInfoCache = HashMap>() + private val jsonResultLruCache = LruCache(16) + override fun handleHook(context: Context, lpparam: XC_LoadPackage.LoadPackageParam) { handleGlobalSearch(context, lpparam) handleDetailSearch(context, lpparam) @@ -109,7 +113,7 @@ class HideSearchListUIPluginPart : IPlugin { // val wxVersionCode = AppVersionUtil.getVersionCode() // 理论上 hook com.tencent.mm.plugin.fts.ui.z#getItem 也是一样的,但是被覆盖重命名了 var hookClazzName = when (AppVersionUtil.getVersionCode()) { - in Constrant.WX_CODE_8_0_38..Constrant.WX_CODE_8_0_42 -> "com.tencent.mm.plugin.fts.ui.y" + in Constrant.WX_CODE_8_0_38..Constrant.WX_CODE_8_0_43 -> "com.tencent.mm.plugin.fts.ui.y" else -> "com.tencent.mm.plugin.fts.ui.z" } //全局搜索首页 @@ -228,18 +232,27 @@ class HideSearchListUIPluginPart : IPlugin { } + private fun needHideUserName2(param: XC_MethodHook.MethodHookParam, itemData: Any?): Boolean { if (itemData == null) { return false } - var clazz: Class<*>? = itemData.javaClass - + var clazz: Class<*>? = itemData.javaClass ?: return false + if (hideFieldInfoCache[clazz!!.name] != null) { + for (field in hideFieldInfoCache[clazz.name]!!) { + if (checkFieldNeedHide(itemData, field)) { + LogUtil.d("hide field from cache: ", field.type.name, field.name, field.get(itemData)) + return true + } + } + return false + } while (clazz != null) { for (field in clazz.declaredFields) { field.isAccessible = true try { - if (checkNeedHide(itemData, field)) { - LogUtil.d("field: ", field.type.name, field.name, field.get(itemData)) + if (checkFieldNeedHide(itemData, field)) { + LogUtil.d("hide field: ", field.type.name, field.name, field.get(itemData)) return true } } catch (e: Exception) { @@ -255,8 +268,8 @@ class HideSearchListUIPluginPart : IPlugin { return false } - private fun checkNeedHide(obj: Any, field: Field): Boolean { - var fieldValue = field.get(obj) + private fun checkFieldNeedHide(itemData: Any, field: Field): Boolean { + var fieldValue: Any? = field.get(itemData) ?: return false var clazzName = field.type.name if (field.type.isAssignableFrom(Number::class.java) || field.type.isAssignableFrom(Byte::class.java) @@ -265,21 +278,43 @@ class HideSearchListUIPluginPart : IPlugin { return false } + var jsonKey = fieldValue.toString().hashCode().toString() + var compareText = if (fieldValue is CharSequence) { fieldValue } else { - GsonUtil.toJson(fieldValue) + if (jsonResultLruCache[jsonKey] == null){ + GsonUtil.toJson(fieldValue) + }else{ + jsonResultLruCache[jsonKey] + } + } + if (compareText.isBlank()) { + return false } + jsonResultLruCache.put(jsonKey, compareText) for (wxid in PluginProviders.from(WXMaskPlugin::class.java).maskIdList) { if (wxid == null) { continue } if (compareText.contains(wxid)) { - LogUtil.d("compareText: ", compareText) + putField2Cache(itemData::class.java.name, field) + LogUtil.d("hit wxid compareText: ", compareText) return true } } return false + + } + + private fun putField2Cache(itemClassName: String, field: Field) { + var pool = hideFieldInfoCache[itemClassName] + if (pool == null) { + pool = hashSetOf(field) + hideFieldInfoCache[itemClassName] = pool + } else { + pool.add(field) + } } } \ No newline at end of file From 1680acc48fbdbb74c2afd6cc49b19b7a8be33e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sun, 10 Dec 2023 23:55:56 +0800 Subject: [PATCH 5/7] =?UTF-8?q?[mod]=20=E4=BF=AE=E5=A4=8Dgoogle=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E4=BE=9D=E8=B5=96=E5=8F=98=E6=9B=B4=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84kotlin=E5=9D=91=E7=88=B9=E7=BC=96=E8=AF=91=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98=EF=BC=8C=E7=9B=B4=E6=8E=A5=E6=94=B9?= =?UTF-8?q?=E4=B8=BAjava?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/lu/wxmask/App.java | 44 ++++++++++++++++++++++++ app/src/main/java/com/lu/wxmask/App.kt | 21 ----------- 2 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/lu/wxmask/App.java delete mode 100644 app/src/main/java/com/lu/wxmask/App.kt diff --git a/app/src/main/java/com/lu/wxmask/App.java b/app/src/main/java/com/lu/wxmask/App.java new file mode 100644 index 0000000..cb76695 --- /dev/null +++ b/app/src/main/java/com/lu/wxmask/App.java @@ -0,0 +1,44 @@ +package com.lu.wxmask; + +import android.app.Application; + +import androidx.lifecycle.ViewModelStore; +import androidx.lifecycle.ViewModelStoreOwner; + +import com.lu.wxmask.ui.JsonMenuManager; + +import org.jetbrains.annotations.NotNull; + +public final class App extends Application implements ViewModelStoreOwner { + public static final Companion Companion = new Companion(); + public static App instance; + + public void onCreate() { + super.onCreate(); + Companion.setInstance(this); + JsonMenuManager.Companion.updateMenuListFromRemote(this); + } + + @Override + public ViewModelStore getViewModelStore() { + return new ViewModelStore(); + } + + public static final class Companion { + private Companion() { + } + + public final App getInstance() { + App app = instance; + if (app != null) { + return app; + } + return null; + } + + public final void setInstance(@NotNull App app) { + instance = app; + } + + } +} diff --git a/app/src/main/java/com/lu/wxmask/App.kt b/app/src/main/java/com/lu/wxmask/App.kt deleted file mode 100644 index e567ed4..0000000 --- a/app/src/main/java/com/lu/wxmask/App.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.lu.wxmask - -import android.app.Application -import androidx.lifecycle.ViewModelStore -import androidx.lifecycle.ViewModelStoreOwner -import com.lu.wxmask.ui.JsonMenuManager - -class App : Application(), ViewModelStoreOwner { - override fun onCreate() { - super.onCreate() - instance = this - JsonMenuManager.updateMenuListFromRemote(this) - } - companion object{ - lateinit var instance: App - } - - override fun getViewModelStore(): ViewModelStore { - return ViewModelStore() - } -} \ No newline at end of file From b071f6ebd76aa58ef6de326a742ea0c566d3268b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Sun, 10 Dec 2023 23:21:13 +0800 Subject: [PATCH 6/7] =?UTF-8?q?[mod]=20=E4=B8=8D=E5=86=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=9C=80=E5=90=8E=E4=B8=80=E6=9D=A1=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=B0=E5=8E=BB=E5=B9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/part/HideMainUIListPluginPart.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt index 7755337..67d7cd3 100644 --- a/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt +++ b/app/src/main/java/com/lu/wxmask/plugin/part/HideMainUIListPluginPart.kt @@ -280,15 +280,15 @@ class HideMainUIListPluginPart : IPlugin { //文本消息 XposedHelpers2.setObjectField(itemData, "field_msgType", "1") - try { - var cTime = XposedHelpers2.getObjectField(itemData, "field_conversationTime") - if (cTime != null) { - val cTime2 = cTime - Constrant.ONE_YEAR_MILLS - XposedHelpers2.setObjectField(itemData, "field_flag", cTime2) - XposedHelpers2.setObjectField(itemData, "field_conversationTime", cTime2) - } - } catch (e: Exception) { - } +// try { +// var cTime = XposedHelpers2.getObjectField(itemData, "field_conversationTime") +// if (cTime != null) { +// val cTime2 = cTime - Constrant.ONE_YEAR_MILLS +// XposedHelpers2.setObjectField(itemData, "field_flag", cTime2) +// XposedHelpers2.setObjectField(itemData, "field_conversationTime", cTime2) +// } +// } catch (e: Exception) { +// } } From bf55ece29070c7d4e6708909c7728acd51935dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E4=BE=9D=E5=B8=8C?= <1093286982@qq.com> Date: Mon, 11 Dec 2023 00:27:23 +0800 Subject: [PATCH 7/7] [doc] update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 4acb4e3..3d1e494 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ v1.13版本开始,默认隐藏App在桌面的图标。隐藏以后,打开模 8.0.40 (2420) 2023-07-20 8.0.40 (2420) 2023-07-20 8.0.41 (2441) 2023-09-06 +8.0.42 (2460) 2023-09-22 +8.0.43 (2480) 2023-11-06 **PS.** - 仅支持上述版本,所有其他版本号以及32位版本未经测试,预计百分之九十九不可用 @@ -123,6 +125,14 @@ SHA1: BCCA3CCACE5F40184A42FEFB06190C7279024985 8.0.41(2441):[https://dldir1.qq.com/weixin/android/weixin8041android2441_arm64_1.apk](https://dldir1.qq.com/weixin/android/weixin8041android2441_arm64_1.apk) SHA1: 51D3E1C9594723FE8A69B68780C4B561964C7718 +8.0.42(2460):[https://dldir1.qq.com/weixin/android/weixin8042android2460_arm64.apk](https://dldir1.qq.com/weixin/android/weixin8042android2460_arm64.apk) +SHA1: 227E395C67A2C0B0BCC750E1A3C52F642B433441 + +8.0.43(2480):[https://dldir1.qq.com/weixin/android/weixin8043android2480_0x28002b35_arm64.apk](https://dldir1.qq.com/weixin/android/weixin8043android2480_0x28002b35_arm64.apk) +SHA1: C46C85AF05130EDABCDBA8D487A5373ECE4AE6D0 + + + 推荐适配的最后两个版本,因为其他版本,作者自己不再使用 **问题4:是否支持Google Play版本?**