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

Commit

Permalink
feat: new dialog for selectable copying
Browse files Browse the repository at this point in the history
  • Loading branch information
mkx173 committed Apr 3, 2024
1 parent ff755a6 commit cbd02ac
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 1 deletion.
4 changes: 3 additions & 1 deletion app/src/main/java/gm/tieba/tabswitch/XposedInit.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
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;
import gm.tieba.tabswitch.hooker.auto.AutoSign;
import gm.tieba.tabswitch.hooker.auto.FrsTab;
Expand Down Expand Up @@ -155,7 +156,8 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
new FoldTopCardView(),
new MsgCenterTab(),
new NotificationDetect(),
new PurgeVideo()
new PurgeVideo(),
new SelectClipboard()
);
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 @@ -200,6 +200,7 @@ private LinearLayout createRootPreference(final Activity activity) {
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));

preferenceLayout.addView(TSPreferenceHelper.createTextView(isPurgeEnabled ? "垂手可得" : "自动化"));
final SwitchButtonHolder autoSign = new SwitchButtonHolder(activity, "自动签到", "auto_sign", SwitchButtonHolder.TYPE_SWITCH);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package gm.tieba.tabswitch.hooker.add;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipboardManager;
import android.content.Context;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

import androidx.annotation.NonNull;

import java.util.List;

import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedHelpers;
import gm.tieba.tabswitch.XposedContext;
import gm.tieba.tabswitch.dao.AcRules;
import gm.tieba.tabswitch.hooker.IHooker;
import gm.tieba.tabswitch.hooker.Obfuscated;
import gm.tieba.tabswitch.hooker.deobfuscation.Matcher;
import gm.tieba.tabswitch.hooker.deobfuscation.MatcherProperties;
import gm.tieba.tabswitch.hooker.deobfuscation.SmaliMatcher;
import gm.tieba.tabswitch.util.ClassMatcherUtils;
import gm.tieba.tabswitch.util.DisplayUtils;
import gm.tieba.tabswitch.util.ReflectUtils;

public class SelectClipboard extends XposedContext implements IHooker, Obfuscated {
@NonNull
@Override
public String key() {
return "select_clipboard";
}

@Override
public List<? extends Matcher> matchers() {
return List.of(
new SmaliMatcher("Landroid/text/ClipboardManager;->setText(Ljava/lang/CharSequence;)V",
MatcherProperties.create().useClassMatcher(ClassMatcherUtils.className("com.baidu.tieba.tbadkCore.data.PostData")))
);
}

public void hook() throws Throwable {
AcRules.findRule(matchers(), (matcher, clazz, method) -> {
switch (matcher) {
case "PostData/Landroid/text/ClipboardManager;->setText(Ljava/lang/CharSequence;)V":
XposedHelpers.findAndHookMethod(clazz, sClassLoader, method, new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
Object tbRichText = ReflectUtils.getObjectField(param.thisObject, "com.baidu.tbadk.widget.richText.TbRichText");

Activity currentActivity = ReflectUtils.getCurrentActivity();
AlertDialog alert = new AlertDialog.Builder(currentActivity, DisplayUtils.isLightMode(getContext()) ?
android.R.style.Theme_DeviceDefault_Light_Dialog_Alert : android.R.style.Theme_DeviceDefault_Dialog_Alert)
.setTitle("自由复制").setMessage(tbRichText.toString())
.setNeutralButton("复制全部", (dialogInterface, i) -> {
ClipboardManager clipboardManager = (ClipboardManager) ReflectUtils.getTbadkCoreApplicationInst().getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText(tbRichText.toString());
})
.setPositiveButton("完成", null).create();
alert.show();

View messageView = alert.findViewById(android.R.id.message);
if (messageView instanceof TextView) {
((TextView) messageView).setTextIsSelectable(true);
}

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.copyFrom(alert.getWindow().getAttributes());
layoutParams.width = DisplayUtils.getDisplayWidth(getContext());
alert.getWindow().setAttributes(layoutParams);

return null;
}
});
break;
}
});
}
}
17 changes: 17 additions & 0 deletions app/src/main/java/gm/tieba/tabswitch/util/ReflectUtils.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package gm.tieba.tabswitch.util;

import android.app.Activity;
import android.app.Application;

import androidx.annotation.ColorInt;

import java.lang.reflect.Field;
Expand Down Expand Up @@ -217,4 +220,18 @@ public static Object callMethod(final Method method, final Object instance, fina
public static Object callStaticMethod(final Method method, final Object... args) {
return callMethod(method, null, args);
}

public static Application getTbadkCoreApplicationInst() {
return (Application) XposedHelpers.callStaticMethod(
XposedHelpers.findClass("com.baidu.tbadk.core.TbadkCoreApplication", sClassLoader),
"getInst"
);
}

public static Activity getCurrentActivity() {
return (Activity) XposedHelpers.callMethod(
getTbadkCoreApplicationInst(),
"getCurrentActivity"
);
}
}

0 comments on commit cbd02ac

Please sign in to comment.