From 620846c9490cfc019d31938744e9f8b9c475e006 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 5 Oct 2025 13:36:52 +0800 Subject: [PATCH 1/4] feat(QQPacketHelper): allow manually setting whether to hook panel --- .../moe/ono/activity/OUOSettingActivity.kt | 5 ++ .../creator/center/ClickableFunctionDialog.kt | 52 +++++++++++++++++++ .../ono/hooks/item/chat/BottomShortcutMenu.kt | 2 +- .../item/developer/QQPacketHelperEntry.java | 28 +++++----- 4 files changed, 74 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/moe/ono/activity/OUOSettingActivity.kt b/app/src/main/java/moe/ono/activity/OUOSettingActivity.kt index 639a6666..28b17068 100644 --- a/app/src/main/java/moe/ono/activity/OUOSettingActivity.kt +++ b/app/src/main/java/moe/ono/activity/OUOSettingActivity.kt @@ -58,10 +58,12 @@ import java.lang.Integer.max import androidx.core.graphics.drawable.toDrawable import moe.ono.creator.center.ClickableFunctionDialog.showCFGDialogMessageEncryptor import moe.ono.creator.center.ClickableFunctionDialog.showCFGDialogQQBubbleRedirect +import moe.ono.creator.center.ClickableFunctionDialog.showCFGDialogQQPacketHelperEntry import moe.ono.creator.center.ClickableFunctionDialog.showCFGDialogSelfMessageReactor import moe.ono.hooks.item.chat.MessageEncryptor import moe.ono.hooks.item.chat.QQBubbleRedirect import moe.ono.hooks.item.chat.SelfMessageReactor +import moe.ono.hooks.item.developer.QQPacketHelperEntry open class OUOSettingActivity : BaseActivity() { private var mAppBarLayoutHeight: Int = 0 @@ -436,6 +438,9 @@ open class OUOSettingActivity : BaseActivity() { getItem(QQBubbleRedirect::class.java).path -> { showCFGDialogQQBubbleRedirect(item, requireContext()) } + getItem(QQPacketHelperEntry::class.java).path -> { + showCFGDialogQQPacketHelperEntry(item, requireContext()) + } } } diff --git a/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt b/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt index e0a05ca1..71a61659 100644 --- a/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt +++ b/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt @@ -30,6 +30,7 @@ import moe.ono.hooks._core.factory.HookItemFactory import moe.ono.hooks.base.util.Toasts import moe.ono.hooks.item.chat.QQBubbleRedirect import moe.ono.hooks.item.chat.StickerPanelEntry +import moe.ono.hooks.item.developer.QQPacketHelperEntry import moe.ono.hooks.item.sigma.QQMessageTracker import moe.ono.hooks.item.sigma.QQSurnamePredictor import moe.ono.util.Logger @@ -680,4 +681,55 @@ object ClickableFunctionDialog { builder.show() } + fun showCFGDialogQQPacketHelperEntry(item: BaseClickableFunctionHookItem, context: Context?) { + if (context == null) return + val builder = MaterialAlertDialogBuilder(context) + builder.setTitle("QQPacketHelper") + + val layout = LinearLayout(context) + layout.orientation = LinearLayout.VERTICAL + layout.setPadding(16, 16, 16, 16) + + val checkBox = MaterialCheckBox(context) + checkBox.text = "启用" + + val hookPanelCheckBox = MaterialCheckBox(context) + hookPanelCheckBox.text = "覆盖加号菜单" + + layout.addView(checkBox) + layout.addView(hookPanelCheckBox) + + builder.setView(layout) + + val warningText = TextView(context) + warningText.text = "开启后长按加号按钮调出 QQPacketHelper\n* 开关需重启生效" + layout.addView(warningText) + + builder.setPositiveButton( + "确定" + ) { dialog: DialogInterface, _: Int -> dialog.cancel() } + + checkBox.isChecked = item.isEnabled + + checkBox.setOnCheckedChangeListener { buttonView: CompoundButton?, isChecked: Boolean -> + ConfigManager.dPutBoolean( + Constants.PrekClickableXXX + HookItemFactory.getItem( + QQPacketHelperEntry::class.java + ).path, isChecked + ) + item.isEnabled = isChecked + if (isChecked) { + item.startLoad() + } + } + + hookPanelCheckBox.isChecked = ConfigManager.dGetBooleanDefTrue(Constants.PrekCfgXXX + "QQPacketHelperHookPanel") + + hookPanelCheckBox.setOnCheckedChangeListener { view, isCheck -> + ConfigManager.dPutBoolean(Constants.PrekCfgXXX + "QQPacketHelperHookPanel", isCheck) + } + + builder.show() + } + } diff --git a/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt b/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt index 843157cc..4ef6cc74 100644 --- a/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt +++ b/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt @@ -118,7 +118,7 @@ class BottomShortcutMenu : BaseSwitchFunctionHookItem() { val sendFakeFile = ConfigManager.getDefaultConfig().getBooleanOrFalse(Constants.PrekSendFakeFile) val qqPacketHelper = ConfigManager.getDefaultConfig().getBooleanOrFalse( - Constants.PrekXXX + getItem( + Constants.PrekClickableXXX + getItem( QQPacketHelperEntry::class.java ).path ) diff --git a/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java b/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java index 56c110a6..487fd705 100644 --- a/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java +++ b/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java @@ -10,7 +10,9 @@ import java.lang.reflect.Method; -import moe.ono.hooks._base.BaseSwitchFunctionHookItem; +import moe.ono.config.ConfigManager; +import moe.ono.constants.Constants; +import moe.ono.hooks._base.BaseClickableFunctionHookItem; import moe.ono.hooks._core.annotation.HookItem; import moe.ono.creator.PacketHelperDialog; import moe.ono.reflex.XMethod; @@ -21,19 +23,21 @@ path = "开发者选项/QQPacketHelper", description = "* 此功能极度危险,滥用可能会导致您的账号被冻结;为了您的人身安全,请勿发送恶意代码\n\n开启后需在聊天界面长按加号呼出,或长按发送按钮呼出" ) -public class QQPacketHelperEntry extends BaseSwitchFunctionHookItem { +public class QQPacketHelperEntry extends BaseClickableFunctionHookItem { private void hook() { try { - Method method = XMethod.clz(CLAZZ_PANEL_ICON_LINEAR_LAYOUT).ret(ImageView.class).ignoreParam().get(); - hookAfter(method, param -> { - ImageView imageView = (ImageView) param.getResult(); - if ("更多功能".contentEquals(imageView.getContentDescription())){ - imageView.setOnLongClickListener(view -> { - runOnUiThread(() -> PacketHelperDialog.createView(null, view.getContext(), "")); - return true; - }); - } - }); + if (ConfigManager.dGetBooleanDefTrue(Constants.PrekCfgXXX + "QQPacketHelperHookPanel")) { + Method method = XMethod.clz(CLAZZ_PANEL_ICON_LINEAR_LAYOUT).ret(ImageView.class).ignoreParam().get(); + hookAfter(method, param -> { + ImageView imageView = (ImageView) param.getResult(); + if ("更多功能".contentEquals(imageView.getContentDescription())){ + imageView.setOnLongClickListener(view -> { + runOnUiThread(() -> PacketHelperDialog.createView(null, view.getContext(), "")); + return true; + }); + } + }); + } } catch (NoSuchMethodException e) { Logger.e(this.getItemName(), e); } From 0c55b14f498a244ab1a8db34217e552cafc8d8d1 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 5 Oct 2025 13:43:15 +0800 Subject: [PATCH 2/4] chore(QQBubbleRedirectCFGDialog): remove an unused text view --- .../java/moe/ono/creator/center/ClickableFunctionDialog.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt b/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt index 71a61659..17c35b8a 100644 --- a/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt +++ b/app/src/main/java/moe/ono/creator/center/ClickableFunctionDialog.kt @@ -646,9 +646,6 @@ object ClickableFunctionDialog { builder.setView(layout) - val warningText = TextView(context) - layout.addView(warningText) - builder.setNegativeButton( "关闭" ) { dialog: DialogInterface, _: Int -> dialog.cancel() } From 08c731a759ff3319702fa635329c0d127002708d Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 5 Oct 2025 13:52:06 +0800 Subject: [PATCH 3/4] feat: add jump scheme uri --- .../moe/ono/creator/JumpSchemeUriDialog.java | 84 ++++++++++++ .../ono/hooks/item/chat/BottomShortcutMenu.kt | 11 ++ .../ono/hooks/item/developer/JumpSchemeUri.kt | 14 ++ .../res/layout/jump_scheme_uri_dialog.xml | 120 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 230 insertions(+) create mode 100644 app/src/main/java/moe/ono/creator/JumpSchemeUriDialog.java create mode 100644 app/src/main/java/moe/ono/hooks/item/developer/JumpSchemeUri.kt create mode 100644 app/src/main/res/layout/jump_scheme_uri_dialog.xml diff --git a/app/src/main/java/moe/ono/creator/JumpSchemeUriDialog.java b/app/src/main/java/moe/ono/creator/JumpSchemeUriDialog.java new file mode 100644 index 00000000..6e948ca8 --- /dev/null +++ b/app/src/main/java/moe/ono/creator/JumpSchemeUriDialog.java @@ -0,0 +1,84 @@ +package moe.ono.creator; + +import static moe.ono.util.analytics.ActionReporter.reportVisitor; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.widget.Button; +import android.widget.EditText; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BasePopupView; +import com.lxj.xpopup.core.BottomPopupView; +import com.lxj.xpopup.util.XPopupUtils; + +import moe.ono.R; +import moe.ono.ui.CommonContextWrapper; +import moe.ono.util.AppRuntimeHelper; + +@SuppressLint("ResourceType") +public class JumpSchemeUriDialog extends BottomPopupView { + private static BasePopupView popupView; + + public JumpSchemeUriDialog(@NonNull Context context) { + super(context); + } + + public static void createView(Context context) { + Context fixContext = CommonContextWrapper.createAppCompatContext(context); + XPopup.Builder NewPop = new XPopup.Builder(fixContext).moveUpToKeyboard(true).isDestroyOnDismiss(true); + NewPop.maxHeight((int) (XPopupUtils.getScreenHeight(context) * .7f)); + NewPop.popupHeight((int) (XPopupUtils.getScreenHeight(context) * .63f)); + + + reportVisitor(AppRuntimeHelper.getAccount(), "CreateView-JumpSchemeUriDialog"); + + popupView = NewPop.asCustom(new JumpSchemeUriDialog(fixContext)); + popupView.show(); + } + + @SuppressLint("SetTextI18n") + @Override + protected void onCreate() { + super.onCreate(); + new Handler(Looper.getMainLooper()).postDelayed(() -> { + Button btn_jump = findViewById(R.id.btn_jump); + EditText scheme_uri = findViewById(R.id.scheme_uri); + + scheme_uri.setVisibility(VISIBLE); + scheme_uri.clearFocus(); + + btn_jump.setOnClickListener(view -> { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(scheme_uri.getText().toString())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + view.getContext().startActivity(intent); + dismiss(); + }); + }, 100); + } + + + + + @Override + protected void beforeDismiss() { + super.beforeDismiss(); + } + + @Override + protected void onDismiss() { + super.onDismiss(); + } + + @Override + protected int getImplLayoutId() { + return R.layout.jump_scheme_uri_dialog; + } +} \ No newline at end of file diff --git a/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt b/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt index 4ef6cc74..a68f03ab 100644 --- a/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt +++ b/app/src/main/java/moe/ono/hooks/item/chat/BottomShortcutMenu.kt @@ -20,6 +20,7 @@ import moe.ono.config.ConfigManager import moe.ono.constants.Constants import moe.ono.creator.FakeFileSender import moe.ono.creator.GetChannelArkDialog +import moe.ono.creator.JumpSchemeUriDialog import moe.ono.creator.PacketHelperDialog import moe.ono.creator.QQMessageTrackerDialog import moe.ono.hooks.XHook @@ -29,6 +30,7 @@ import moe.ono.hooks._core.factory.HookItemFactory.getItem import moe.ono.hooks.base.util.Toasts import moe.ono.hooks.item.developer.GetBknByCookie import moe.ono.hooks.item.developer.GetCookie +import moe.ono.hooks.item.developer.JumpSchemeUri import moe.ono.hooks.item.developer.QQHookCodec import moe.ono.hooks.item.developer.QQPacketHelperEntry import moe.ono.hooks.item.sigma.QQMessageTracker @@ -143,6 +145,9 @@ class BottomShortcutMenu : BaseSwitchFunctionHookItem() { val getChannelArk = ConfigManager.getDefaultConfig().getBooleanOrFalse(Constants.PrekXXX + getItem( GetChannelArk::class.java).path) + val jumpSchemeUri = ConfigManager.getDefaultConfig().getBooleanOrFalse(Constants.PrekXXX + getItem( + JumpSchemeUri::class.java).path) + val items = ArrayList() if (qqPacketHelper) { items.add("QQPacketHelper") @@ -162,6 +167,9 @@ class BottomShortcutMenu : BaseSwitchFunctionHookItem() { if (getChannelArk) { items.add("GetChannelArk") } + if (jumpSchemeUri) { + items.add("打开 Scheme 链接") + } if (getItem(QQHookCodec::class.java).isEnabled) { if (!messageEncryptor) { @@ -264,6 +272,9 @@ class BottomShortcutMenu : BaseSwitchFunctionHookItem() { "GetChannelArk" -> { SyncUtils.runOnUiThread { GetChannelArkDialog.createView(view.context) } } + "打开 Scheme 链接" -> { + SyncUtils.runOnUiThread { JumpSchemeUriDialog.createView(view.context) } + } } } .show() diff --git a/app/src/main/java/moe/ono/hooks/item/developer/JumpSchemeUri.kt b/app/src/main/java/moe/ono/hooks/item/developer/JumpSchemeUri.kt new file mode 100644 index 00000000..55f08305 --- /dev/null +++ b/app/src/main/java/moe/ono/hooks/item/developer/JumpSchemeUri.kt @@ -0,0 +1,14 @@ +package moe.ono.hooks.item.developer + +import android.annotation.SuppressLint +import moe.ono.hooks._base.BaseSwitchFunctionHookItem +import moe.ono.hooks._core.annotation.HookItem + +@SuppressLint("DiscouragedApi") +@HookItem( + path = "开发者选项/打开 Scheme 链接", + description = "* 打开后在快捷菜单使用" +) +class JumpSchemeUri : BaseSwitchFunctionHookItem() { + override fun entry(classLoader: ClassLoader) {} +} \ No newline at end of file diff --git a/app/src/main/res/layout/jump_scheme_uri_dialog.xml b/app/src/main/res/layout/jump_scheme_uri_dialog.xml new file mode 100644 index 00000000..5437a9c3 --- /dev/null +++ b/app/src/main/res/layout/jump_scheme_uri_dialog.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cac1121f..b6d642f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,4 +13,5 @@ OUOSettingActivityStep2 Message Tracker Get Channel Ark + Jump Scheme Uri \ No newline at end of file From 996143539bce883aa8e1a698c16ea270cf0eac63 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 5 Oct 2025 13:54:21 +0800 Subject: [PATCH 4/4] docs(QQPacketHelper): update description text --- .../java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java b/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java index 487fd705..4eb5dccc 100644 --- a/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java +++ b/app/src/main/java/moe/ono/hooks/item/developer/QQPacketHelperEntry.java @@ -21,7 +21,7 @@ @SuppressLint("DiscouragedApi") @HookItem( path = "开发者选项/QQPacketHelper", - description = "* 此功能极度危险,滥用可能会导致您的账号被冻结;为了您的人身安全,请勿发送恶意代码\n\n开启后需在聊天界面长按加号呼出,或长按发送按钮呼出" + description = "* 此功能极度危险,滥用可能会导致您的账号被冻结;为了您的人身安全,请勿发送恶意代码\n\n开启后需在聊天界面长按加号呼出 (可关闭),或长按发送按钮呼出" ) public class QQPacketHelperEntry extends BaseClickableFunctionHookItem { private void hook() {