Skip to content
This repository has been archived by the owner on Sep 15, 2024. It is now read-only.

Commit

Permalink
Merge pull request #32 from mkx173/pull
Browse files Browse the repository at this point in the history
Adapt to new version (12.53.1.0), new features and bug fixes
  • Loading branch information
GuhDoy authored Feb 10, 2024
2 parents 5199b18 + 64e3850 commit b55417d
Show file tree
Hide file tree
Showing 9 changed files with 337 additions and 69 deletions.
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ android {

defaultConfig {
applicationId 'gm.tieba.tabswitch'
minSdk 24
minSdk 28
targetSdk sdk
versionCode gitCommitCount
versionName '2.8.6-beta'
versionName '2.9.2'

testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
externalNativeBuild {
cmake {
abiFilters 'armeabi-v7a', 'arm64-v8a'
abiFilters 'arm64-v8a'
arguments '-DANDROID_STL=none'
}
}
Expand Down
31 changes: 29 additions & 2 deletions app/src/main/java/gm/tieba/tabswitch/XposedInit.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AppComponentFactory;
import android.app.Application;
import android.app.Instrumentation;
import android.content.Intent;
Expand Down Expand Up @@ -42,6 +43,7 @@
import gm.tieba.tabswitch.hooker.deobfuscation.DeobfuscationHooker;
import gm.tieba.tabswitch.hooker.deobfuscation.Matcher;
import gm.tieba.tabswitch.hooker.eliminate.ContentFilter;
import gm.tieba.tabswitch.hooker.eliminate.FoldTopCardView;
import gm.tieba.tabswitch.hooker.eliminate.FollowFilter;
import gm.tieba.tabswitch.hooker.eliminate.FragmentTab;
import gm.tieba.tabswitch.hooker.eliminate.FrsPageFilter;
Expand All @@ -64,16 +66,40 @@ public void initZygote(final IXposedHookZygoteInit.StartupParam startupParam) th
sPath = startupParam.modulePath;
}

private AppComponentFactory mAppComponentFactory = null;

@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!"com.baidu.tieba".equals(lpparam.packageName) && XposedHelpers.findClassIfExists(
"com.baidu.tieba.tblauncher.MainTabActivity", lpparam.classLoader) == null) return;
sClassLoader = lpparam.classLoader;

// Workaround to address an issue with LSPatch (unable to open personal homepage)
// com.baidu.tieba.flutter.base.view.FlutterPageActivity must be instantiated by com.baidu.nps.hook.component.NPSComponentFactory
// However, LSPatch incorrectly sets appComponentFactory to null, causing android.app.Instrumentation.getFactory to fall back to AppComponentFactory.DEFAULT
// (see https://github.com/LSPosed/LSPatch/blob/bbe8d93fb9230f7b04babaf1c4a11642110f55a6/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java#L173)
// TODO: Report issue to upstream
XposedHelpers.findAndHookMethod(
Instrumentation.class,
"getFactory",
String.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[0].toString().equals("com.baidu.tieba")) {
if (mAppComponentFactory == null) {
mAppComponentFactory = (AppComponentFactory) sClassLoader.loadClass("com.baidu.nps.hook.component.NPSComponentFactory").newInstance();
}
param.setResult(mAppComponentFactory);
}
}
});

XposedHelpers.findAndHookMethod(Instrumentation.class, "callApplicationOnCreate", Application.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
if (!(param.args[0] instanceof Application)) return;
attachBaseContext((Application) param.args[0]);
sClassLoader = lpparam.classLoader;
Preferences.init(getContext());
AcRules.init(getContext());

Expand Down Expand Up @@ -104,7 +130,8 @@ protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
new FrsTab(),
new Hide(),
new StackTrace(),
new RemoveUpdate()
new RemoveUpdate(),
new FoldTopCardView()
);
final var matchers = new ArrayList<Obfuscated>(hookers.size() + 2);
matchers.add(new TbDialog());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ private LinearLayout createRootPreference(final Activity activity) {
preferenceLayout.addView(new SwitchButtonHolder(activity, "真正的净化界面", "purge", SwitchButtonHolder.TYPE_SWITCH));
}
preferenceLayout.addView(new SwitchButtonHolder(activity, "净化进吧", "purge_enter", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "净化置顶帖", "fold_top_card_view", SwitchButtonHolder.TYPE_SWITCH));
// preferenceLayout.addView(new SwitchButtonHolder(activity, "净化我的", "purge_my", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "隐藏小红点", "red_tip", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "禁用更新提示", "remove_update", SwitchButtonHolder.TYPE_SWITCH));
Expand Down
57 changes: 45 additions & 12 deletions app/src/main/java/gm/tieba/tabswitch/hooker/auto/FrsTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import androidx.annotation.NonNull;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import gm.tieba.tabswitch.XposedContext;
import gm.tieba.tabswitch.dao.AcRules;
Expand All @@ -24,35 +27,65 @@ public String key() {

@Override
public List<? extends Matcher> matchers() {
return List.of(new StringMatcher("from_pb_or_person"));
return List.of(
new StringMatcher("forum_tab_current_list"),
new StringMatcher("c/f/frs/page?cmd=301001&format=protobuf")
);
}

private int mPosition;

@Override
public void hook() throws Throwable {
XposedHelpers.findAndHookMethod("tbclient.FrsPage.NavTabInfo$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() {
XposedHelpers.findAndHookMethod("tbclient.FrsPage.DataRes$Builder", sClassLoader, "build", boolean.class, new XC_MethodHook() {
@Override
public void beforeHookedMethod(final MethodHookParam param) throws Throwable {
final List<?> list = (List<?>) XposedHelpers.getObjectField(param.thisObject, "tab");
final List<?> list = (List<?>) XposedHelpers.getObjectField(param.thisObject, "frs_main_tab_list");
if (list == null) return;
for (int i = 0; i < list.size(); i++) {
if ((Integer) XposedHelpers.getObjectField(list.get(i), "tab_type") == 14) {
mPosition = i;
XposedHelpers.setObjectField(param.thisObject, "frs_tab_default", (Integer) XposedHelpers.getObjectField(list.get(i), "tab_id"));
return;
}
}
}
});
AcRules.findRule(matchers(), (matcher, clazz, method) -> {
if (!"com.baidu.tieba.frs.vc.FrsTabViewController".equals(clazz)) return;
XposedHelpers.findAndHookMethod("com.baidu.tieba.frs.vc.FrsTabViewController", sClassLoader, method, new XC_MethodHook() {
@Override
public void afterHookedMethod(final MethodHookParam param) throws Throwable {
final Object viewPager = ReflectUtils.getObjectField(param.thisObject, "com.baidu.tieba.frs.FrsTabViewPager");
XposedHelpers.callMethod(viewPager, "setCurrentItem", mPosition, false);
}
});
switch (matcher) {
case "forum_tab_current_list":
if (!"com.baidu.tieba.forum.controller.TopController".equals(clazz)) return;
Class<?> topControllerClass = XposedHelpers.findClass(clazz, sClassLoader);
Method targetMethod = XposedHelpers.findMethodBestMatch(
topControllerClass,
method,
null,
XposedHelpers.findClass(clazz, sClassLoader)
);
XposedBridge.hookMethod(targetMethod, new XC_MethodHook() {
@Override
public void afterHookedMethod(MethodHookParam param) throws Throwable {
Class<?> customViewPager = XposedHelpers.findClass("com.baidu.tbadk.widget.CustomViewPager", sClassLoader);
final Object viewPager = XposedHelpers.findFirstFieldByExactType(param.args[1].getClass(), customViewPager).get(param.args[1]);
XposedHelpers.callMethod(viewPager, "setCurrentItem", mPosition);
}
});
break;
case "c/f/frs/page?cmd=301001&format=protobuf":
XposedHelpers.findAndHookMethod(clazz, sClassLoader, method,
"com.baidu.tieba.forum.model.FrsPageRequestMessage",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if ((Integer) XposedHelpers.getObjectField(param.args[0], "sortType") == -1) {
Object sharedPrefHelper = XposedHelpers.callStaticMethod(
XposedHelpers.findClass("com.baidu.tbadk.core.sharedPref.SharedPrefHelper", sClassLoader), "getInstance");
Integer lastSortType = (Integer) XposedHelpers.callMethod(sharedPrefHelper, "getInt", "key_forum_last_sort_type", 0);
XposedHelpers.setObjectField(param.args[0], "sortType", lastSortType);
}
}
});
break;
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,13 @@ public void decodeArsc(final PublishSubject<Float> progress)
progress.onNext(0F);
final var strToResMatcher = new HashMap<String, ResMatcher>();
final var entryNameToZipEntryMatcher = new HashMap<String, ZipEntryMatcher>();
final var resIdentifierToResMatcher = new HashMap<String, ResIdentifierMatcher>();
for (final var matcher : matchers) {
if (matcher instanceof ResMatcher) {
if (matcher instanceof final ZipEntryMatcher zipEntryMatcher) {
entryNameToZipEntryMatcher.put(zipEntryMatcher.getEntryName(), zipEntryMatcher);
} else if (matcher instanceof final ResIdentifierMatcher resIdentifierMatcher) {
resIdentifierToResMatcher.put(resIdentifierMatcher.toString(), resIdentifierMatcher);
} else {
strToResMatcher.put(matcher.toString(), (ResMatcher) matcher);
}
Expand All @@ -95,7 +98,10 @@ public void decodeArsc(final PublishSubject<Float> progress)
try (final var in = zipFile.getInputStream(ze)) {
final var pkg = ARSCDecoder.decode(in, true, true).getOnePackage();
forEachProgressed(progress, pkg.listResSpecs(), resResSpec -> {
if (resResSpec.hasDefaultResource()) {
final var identifierMatcher = resIdentifierToResMatcher.get(String.format("%s.%s", resResSpec.getType().getName(), resResSpec.getName()));
if (identifierMatcher != null) {
identifierMatcher.setId(resResSpec.getId().id);
} else if (resResSpec.hasDefaultResource()) {
try {
final var resValue = resResSpec.getDefaultResource().getValue();
if (resValue instanceof final ResStringValue resStringValue) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,7 @@ class ZipEntryMatcher(val size: Long) : ResMatcher() {
var entryName: String = ""
override fun toString(): String = size.toString()
}

class ResIdentifierMatcher(val name: String, val defType: String) : ResMatcher() {
override fun toString(): String = String.format("%s.%s", defType, name)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package gm.tieba.tabswitch.hooker.eliminate;

import androidx.annotation.NonNull;

import java.util.List;

import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import gm.tieba.tabswitch.XposedContext;
import gm.tieba.tabswitch.hooker.IHooker;

public class FoldTopCardView extends XposedContext implements IHooker {
@NonNull
@Override
public String key() {
return "fold_top_card_view";
}

@Override
public void hook() throws Throwable {
// 总是折叠置顶帖
for (final var method : XposedHelpers.findClass("com.baidu.tieba.forum.view.TopCardView", sClassLoader).getDeclaredMethods()) {
if (method.getReturnType() == boolean.class) {
final var currMethodParameterTypes = method.getParameterTypes();
if (currMethodParameterTypes.length == 2 && currMethodParameterTypes[0] == List.class && currMethodParameterTypes[1] == boolean.class) {
XposedBridge.hookMethod(method, XC_MethodReplacement.returnConstant(false));
}
}
}
}
}
Loading

0 comments on commit b55417d

Please sign in to comment.