From 2648403cf124e8d4afdc58f91fd08321313b41b0 Mon Sep 17 00:00:00 2001 From: mkx173 Date: Sat, 6 Apr 2024 02:29:49 -0700 Subject: [PATCH] fix: frs page filter not working when loading more pages --- app/build.gradle | 2 +- .../hooker/eliminate/FrsPageFilter.java | 112 ++++++++---------- .../tabswitch/hooker/eliminate/Purge.java | 65 +++++----- 3 files changed, 88 insertions(+), 91 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8f4d69e1..5008f981 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,7 @@ android { minSdk 28 targetSdk sdk versionCode gitCommitCount - versionName '2.9.7' + versionName '2.9.7.1' buildConfigField "String", "TARGET_VERSION", "\"12.58.1.0\"" buildConfigField "String", "MIN_VERSION", "\"12.53.1.0\"" diff --git a/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/FrsPageFilter.java b/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/FrsPageFilter.java index 80a9695f..9e364abc 100644 --- a/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/FrsPageFilter.java +++ b/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/FrsPageFilter.java @@ -19,81 +19,67 @@ public String key() { @Override public void hook() throws Throwable { - // thread_list is deprecated -// XposedHelpers.findAndHookMethod("tbclient.FrsPage.DataRes$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() { -// @Override -// protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { -// final var threadList = (List) XposedHelpers.getObjectField(param.thisObject, "thread_list"); -// if (threadList == null) return; -// final var pattern = getPattern(); -// threadList.removeIf(o -> { -// if (pattern.matcher(Parser.parsePbContent(o, "first_post_content")).find()) { -// return true; -// } -// -// final var strings = new String[]{(String) XposedHelpers.getObjectField(o, "title"), -// (String) XposedHelpers.getObjectField(o, "fname")}; -// if (Arrays.stream(strings).anyMatch(s -> pattern.matcher(s).find())) { -// return true; -// } -// -// final var author = XposedHelpers.getObjectField(o, "author"); -// final var authors = new String[]{(String) XposedHelpers.getObjectField(author, "name"), -// (String) XposedHelpers.getObjectField(author, "name_show")}; -// return Arrays.stream(authors).anyMatch(s -> pattern.matcher(s).find()); -// }); -// } -// }); XposedHelpers.findAndHookMethod("tbclient.FrsPage.PageData$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { - List feedList = (List) XposedHelpers.getObjectField(param.thisObject, "feed_list"); - if (feedList == null) return; - final var pattern = getPattern(); - feedList.removeIf( - o -> { - Object currFeed = XposedHelpers.getObjectField(o, "feed"); - if (currFeed != null) { - List businessInfo = (List) XposedHelpers.getObjectField(currFeed, "business_info"); - for (var feedKV : businessInfo) { - String currKey = XposedHelpers.getObjectField(feedKV, "key").toString(); - if (currKey.equals("title") || currKey.equals("abstract")) { - String str = XposedHelpers.getObjectField(feedKV, "value").toString(); - if (pattern.matcher(str).find()) { - return true; - } - } + filterPageData(param.thisObject); + } + }); + + XposedHelpers.findAndHookMethod("tbclient.ThreadList.PageData$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { + filterPageData(param.thisObject); + } + }); + } + + private void filterPageData(Object pageData) { + List feedList = (List) XposedHelpers.getObjectField(pageData, "feed_list"); + if (feedList == null) return; + final var pattern = getPattern(); + feedList.removeIf( + o -> { + Object currFeed = XposedHelpers.getObjectField(o, "feed"); + if (currFeed != null) { + List businessInfo = (List) XposedHelpers.getObjectField(currFeed, "business_info"); + for (var feedKV : businessInfo) { + String currKey = XposedHelpers.getObjectField(feedKV, "key").toString(); + if (currKey.equals("title") || currKey.equals("abstract")) { + String str = XposedHelpers.getObjectField(feedKV, "value").toString(); + if (pattern.matcher(str).find()) { + return true; } + } + } - List components = (List) XposedHelpers.getObjectField(currFeed, "components"); - if (components != null ){ - for (var component: components) { - if (XposedHelpers.getObjectField(component, "component").toString().equals("feed_head")) { - Object feedHead = XposedHelpers.getObjectField(component, "feed_head"); - List mainData = (List) XposedHelpers.getObjectField(feedHead, "main_data"); - if (mainData != null) { - for (var feedHeadSymbol: mainData) { - Object feedHeadText = XposedHelpers.getObjectField(feedHeadSymbol, "text"); - if (feedHeadText != null) { - String username = (String) XposedHelpers.getObjectField(feedHeadText, "text"); - if (username != null) { - if (pattern.matcher(username).find()) { - return true; - } - break; - } + List components = (List) XposedHelpers.getObjectField(currFeed, "components"); + if (components != null ){ + for (var component: components) { + if (XposedHelpers.getObjectField(component, "component").toString().equals("feed_head")) { + Object feedHead = XposedHelpers.getObjectField(component, "feed_head"); + List mainData = (List) XposedHelpers.getObjectField(feedHead, "main_data"); + if (mainData != null) { + for (var feedHeadSymbol: mainData) { + Object feedHeadText = XposedHelpers.getObjectField(feedHeadSymbol, "text"); + if (feedHeadText != null) { + String username = (String) XposedHelpers.getObjectField(feedHeadText, "text"); + if (username != null) { + if (pattern.matcher(username).find()) { + return true; } + break; } } - break; } } + break; } } - return false; } - ); - } - }); + } + return false; + } + ); } } diff --git a/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/Purge.java b/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/Purge.java index 639be42e..af6bade2 100644 --- a/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/Purge.java +++ b/app/src/main/java/gm/tieba/tabswitch/hooker/eliminate/Purge.java @@ -346,36 +346,17 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { } }); } - // 吧页面头条贴(41), 直播贴(69 / is_live_card) + // 吧页面 XposedHelpers.findAndHookMethod("tbclient.FrsPage.PageData$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { - List feedList = (List) XposedHelpers.getObjectField(param.thisObject, "feed_list"); - if (feedList != null) { - feedList.removeIf( - o -> { - Object currFeed = XposedHelpers.getObjectField(o, "feed"); - if (currFeed != null) { - List businessInfo = (List) XposedHelpers.getObjectField(currFeed, "business_info"); - for (var feedKV : businessInfo) { - String currentKey = XposedHelpers.getObjectField(feedKV, "key").toString(); - if (currentKey.equals("thread_type")) { - var currValue = XposedHelpers.getObjectField(feedKV, "value").toString(); - if (currValue.equals("41") || currValue.equals("69")) { - return true; - } - } else if (currentKey.equals("is_live_card")) { - var currValue = XposedHelpers.getObjectField(feedKV, "value").toString(); - if (currValue.equals("1")) { - return true; - } - } - } - } - return false; - } - ); - } + purgePageData(param.thisObject); + } + }); + XposedHelpers.findAndHookMethod("tbclient.ThreadList.PageData$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { + purgePageData(param.thisObject); } }); // 聊天-AI角色 @@ -407,4 +388,34 @@ protected void beforeHookedMethod(final MethodHookParam param) throws Throwable } }); } + + // 吧页面头条贴(41), 直播贴(69 / is_live_card) + private void purgePageData(Object pageData) { + List feedList = (List) XposedHelpers.getObjectField(pageData, "feed_list"); + if (feedList != null) { + feedList.removeIf( + o -> { + Object currFeed = XposedHelpers.getObjectField(o, "feed"); + if (currFeed != null) { + List businessInfo = (List) XposedHelpers.getObjectField(currFeed, "business_info"); + for (var feedKV : businessInfo) { + String currentKey = XposedHelpers.getObjectField(feedKV, "key").toString(); + if (currentKey.equals("thread_type")) { + var currValue = XposedHelpers.getObjectField(feedKV, "value").toString(); + if (currValue.equals("41") || currValue.equals("69")) { + return true; + } + } else if (currentKey.equals("is_live_card")) { + var currValue = XposedHelpers.getObjectField(feedKV, "value").toString(); + if (currValue.equals("1")) { + return true; + } + } + } + } + return false; + } + ); + } + } }