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

Commit

Permalink
feat: fix transition animation for android 14+
Browse files Browse the repository at this point in the history
  • Loading branch information
mkx173 committed Apr 11, 2024
1 parent 8e16428 commit 191aa79
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 86 deletions.
6 changes: 3 additions & 3 deletions app/src/main/java/gm/tieba/tabswitch/XposedInit.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import gm.tieba.tabswitch.hooker.Obfuscated;
import gm.tieba.tabswitch.hooker.TSPreference;
import gm.tieba.tabswitch.hooker.add.HistoryCache;
import gm.tieba.tabswitch.hooker.add.Ripple;
import gm.tieba.tabswitch.hooker.add.SaveImages;
import gm.tieba.tabswitch.hooker.add.SelectClipboard;
import gm.tieba.tabswitch.hooker.auto.AgreeNum;
Expand All @@ -40,6 +39,7 @@
import gm.tieba.tabswitch.hooker.auto.NotificationDetect;
import gm.tieba.tabswitch.hooker.auto.OpenSign;
import gm.tieba.tabswitch.hooker.auto.OriginSrc;
import gm.tieba.tabswitch.hooker.auto.TransitionAnimation;
import gm.tieba.tabswitch.hooker.deobfuscation.DeobfuscationHelper;
import gm.tieba.tabswitch.hooker.deobfuscation.DeobfuscationHooker;
import gm.tieba.tabswitch.hooker.deobfuscation.Matcher;
Expand Down Expand Up @@ -141,7 +141,6 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
new ContentFilter(),
new FrsPageFilter(),
new HistoryCache(),
new Ripple(),
new SaveImages(),
new AutoSign(),
new OpenSign(),
Expand All @@ -157,7 +156,8 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
new NotificationDetect(),
new PurgeVideo(),
new SelectClipboard(),
new UserFilter()
new UserFilter(),
new TransitionAnimation()
);
final var matchers = new ArrayList<Obfuscated>(hookers.size() + 2);
matchers.add(new TbToast());
Expand Down
12 changes: 11 additions & 1 deletion app/src/main/java/gm/tieba/tabswitch/hooker/TSPreference.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.app.Dialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.text.TextUtils;
Expand Down Expand Up @@ -199,7 +200,6 @@ private LinearLayout createRootPreference(final Activity activity) {

preferenceLayout.addView(TSPreferenceHelper.createTextView(isPurgeEnabled ? "别出新意" : "增加功能"));
preferenceLayout.addView(new SwitchButtonHolder(activity, "浏览历史增加搜索", "history_cache", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "楼层增加点按效果", "ripple", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "长按下载保存全部图片", "save_images", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "弹窗自由复制", "select_clipboard", SwitchButtonHolder.TYPE_SWITCH));

Expand Down Expand Up @@ -290,6 +290,16 @@ private LinearLayout createModifyTabPreference(final Activity activity) {
preferenceLayout.addView(new SwitchButtonHolder(activity, "隐藏进吧", "enter_forum", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "隐藏发帖", "write_thread", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(new SwitchButtonHolder(activity, "隐藏消息", "im_message", SwitchButtonHolder.TYPE_SWITCH));
preferenceLayout.addView(TSPreferenceHelper.createTextView("其他"));
SwitchButtonHolder transitionAnimation = new SwitchButtonHolder(activity, "修复过渡动画", "transition_animation", SwitchButtonHolder.TYPE_SWITCH);
transitionAnimation.setOnButtonClickListener(v -> {
if (!(Build.VERSION.SDK_INT >= 34 && DeobfuscationHelper.isTbSatisfyVersionRequirement("12.58.2.1", DeobfuscationHelper.getTbVersion(getContext())))) {
TbToast.showTbToast("当前贴吧版本不支持此功能", TbToast.LENGTH_SHORT);
} else {
transitionAnimation.bdSwitch.changeState();
}
});
preferenceLayout.addView(transitionAnimation);
return preferenceLayout;
}

Expand Down
82 changes: 0 additions & 82 deletions app/src/main/java/gm/tieba/tabswitch/hooker/add/Ripple.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package gm.tieba.tabswitch.hooker.auto;

import android.app.Activity;

import androidx.annotation.NonNull;

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

public class TransitionAnimation extends XposedContext implements IHooker {

private Class<?> activityPendingTransitionFactory;
private int CHAT_SQUARE_FADE_IN;
private int CHAT_SQUARE_FADE_OUT;
private int RES_BIG_IMAGE_IN_FROM_RIGHT;
private int RES_BIG_IMAGE_OUT_TO_RIGHT;
private int RES_CUSTOM_FADE_IN;
private int RES_CUSTOM_FADE_OUT;
private int RES_CUSTOM_IN_FROM_RIGHT;
private int RES_CUSTOM_OUT_TO_RIGHT;
private int RES_FADE_OUT;
private int RES_NFADE_IN;
private int RES_NORMAL_IN_FROM_BOTTOM;
private int RES_NORMAL_IN_FROM_LEFT;
private int RES_NORMAL_IN_FROM_RIGHT;
private int RES_NORMAL_OUT_TO_BOTTOM;
private int RES_NORMAL_OUT_TO_LEFT;
private int RES_NORMAL_OUT_TO_RIGHT;

@NonNull
@Override
public String key() {
return "transition_animation";
}

@Override
public void hook() throws Throwable {
activityPendingTransitionFactory = XposedHelpers.findClass("com.baidu.tbadk.ActivityPendingTransitionFactory", sClassLoader);

CHAT_SQUARE_FADE_IN = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "CHAT_SQUARE_FADE_IN");
CHAT_SQUARE_FADE_OUT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "CHAT_SQUARE_FADE_OUT");
RES_BIG_IMAGE_IN_FROM_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_BIG_IMAGE_IN_FROM_RIGHT");
RES_BIG_IMAGE_OUT_TO_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_BIG_IMAGE_OUT_TO_RIGHT");
RES_CUSTOM_FADE_IN = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_CUSTOM_FADE_IN");
RES_CUSTOM_FADE_OUT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_CUSTOM_FADE_OUT");
RES_CUSTOM_IN_FROM_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_CUSTOM_IN_FROM_RIGHT");
RES_CUSTOM_OUT_TO_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_CUSTOM_OUT_TO_RIGHT");
RES_FADE_OUT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_FADE_OUT");
RES_NFADE_IN = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NFADE_IN");
RES_NORMAL_IN_FROM_BOTTOM = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_IN_FROM_BOTTOM");
RES_NORMAL_IN_FROM_LEFT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_IN_FROM_LEFT");
RES_NORMAL_IN_FROM_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_IN_FROM_RIGHT");
RES_NORMAL_OUT_TO_BOTTOM = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_OUT_TO_BOTTOM");
RES_NORMAL_OUT_TO_LEFT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_OUT_TO_LEFT");
RES_NORMAL_OUT_TO_RIGHT = XposedHelpers.getStaticIntField(activityPendingTransitionFactory, "RES_NORMAL_OUT_TO_RIGHT");

XposedHelpers.findAndHookMethod(
activityPendingTransitionFactory,
"enterExitAnimation",
"com.baidu.tbadk.TbPageContext", int.class,
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
enterExitAnimation(param.args[0], (int) param.args[1]);
return null;
}
}
);

XposedHelpers.findAndHookMethod(
activityPendingTransitionFactory,
"closeAnimation",
"com.baidu.tbadk.TbPageContext", int.class,
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
closeAnimation(param.args[0], (int) param.args[1]);
return null;
}
}
);
}

private void enterExitAnimation(Object tbPageContext, int i) {
Activity pageActivity = (Activity) XposedHelpers.callMethod(tbPageContext, "getPageActivity");
if (XposedHelpers.getStaticBooleanField(activityPendingTransitionFactory, "IS_CUSTOM_FROM_THIRD_PARTY")) {
i = 3;
}
switch (i) {
case 0:
pageActivity.overridePendingTransition(0, 0);
return;
case 1:
pageActivity.overridePendingTransition(RES_NORMAL_IN_FROM_RIGHT, RES_FADE_OUT);
return;
case 2:
pageActivity.overridePendingTransition(RES_BIG_IMAGE_IN_FROM_RIGHT, RES_FADE_OUT);
return;
case 3:
pageActivity.overridePendingTransition(RES_CUSTOM_IN_FROM_RIGHT, RES_CUSTOM_FADE_OUT);
return;
case 4:
pageActivity.overridePendingTransition(RES_NORMAL_IN_FROM_BOTTOM, RES_FADE_OUT);
return;
case 5:
pageActivity.overridePendingTransition(CHAT_SQUARE_FADE_IN, CHAT_SQUARE_FADE_OUT);
return;
case 6:
pageActivity.overridePendingTransition(RES_NORMAL_IN_FROM_LEFT, RES_FADE_OUT);
return;
default:
pageActivity.overridePendingTransition(RES_NORMAL_IN_FROM_RIGHT, RES_FADE_OUT);
return;
}
}

private void closeAnimation(Object tbPageContext, int i) {
Activity pageActivity = (Activity) XposedHelpers.callMethod(tbPageContext, "getPageActivity");
if (XposedHelpers.getStaticBooleanField(activityPendingTransitionFactory, "IS_CUSTOM_FROM_THIRD_PARTY")) {
i = 3;
}
switch (i) {
case 0:
pageActivity.overridePendingTransition(0, 0);
return;
case 1:
pageActivity.overridePendingTransition(RES_NFADE_IN, RES_NORMAL_OUT_TO_RIGHT);
return;
case 2:
pageActivity.overridePendingTransition(RES_NFADE_IN, RES_BIG_IMAGE_OUT_TO_RIGHT);
return;
case 3:
pageActivity.overridePendingTransition(RES_CUSTOM_FADE_IN, RES_CUSTOM_OUT_TO_RIGHT);
return;
case 4:
pageActivity.overridePendingTransition(RES_NFADE_IN, RES_NORMAL_OUT_TO_BOTTOM);
return;
case 5:
pageActivity.overridePendingTransition(CHAT_SQUARE_FADE_IN, CHAT_SQUARE_FADE_OUT);
return;
case 6:
pageActivity.overridePendingTransition(RES_NFADE_IN, RES_NORMAL_OUT_TO_LEFT);
return;
default:
pageActivity.overridePendingTransition(RES_NFADE_IN, RES_NORMAL_OUT_TO_RIGHT);
return;
}
}
}

0 comments on commit 191aa79

Please sign in to comment.