MCPcopy Create free account
hub / github.com/cinit/TMoe / AddReloadMsgBtn

Class AddReloadMsgBtn

app/src/main/java/cc/ioctl/tmoe/hook/func/AddReloadMsgBtn.java:23–114  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

21import de.robv.android.xposed.XposedBridge;
22
23@FunctionHookEntry
24public class AddReloadMsgBtn extends CommonDynamicHook {
25
26 public static final AddReloadMsgBtn INSTANCE = new AddReloadMsgBtn();
27
28 private AddReloadMsgBtn() {
29 }
30
31 private static final int ID_RELOAD_BTN = 1001001;
32
33 private Class<?> mActionBarMenuOnItemClickClass = null;
34 private boolean mActionBarMenuOnItemClickHooked = false;
35
36 private final XC_MethodHook mOnMenuItemClickHook = HookUtils.afterAlways(this, 49, param -> {
37 int id = (int) param.args[0];
38 if (id == ID_RELOAD_BTN) {
39 Object chatActivity = Reflex.getFirstByType(param.thisObject, Initiator.loadClass("org.telegram.ui.ChatActivity"));
40 requestReloadChatMessage(chatActivity);
41 }
42 });
43
44 @Override
45 public boolean initOnce() throws Exception {
46 Class<?> kChatActivity = Initiator.loadClass("org.telegram.ui.ChatActivity");
47 Field fHeaderItem = kChatActivity.getDeclaredField("headerItem");
48 fHeaderItem.setAccessible(true);
49 Class<?> kActionBarMenuItem = Initiator.loadClass("org.telegram.ui.ActionBar.ActionBarMenuItem");
50 Method addSubItem = kActionBarMenuItem.getDeclaredMethod("addSubItem", int.class, int.class, CharSequence.class);
51 addSubItem.setAccessible(true);
52 Field fActionBar = Initiator.loadClass("org.telegram.ui.ActionBar.BaseFragment").getDeclaredField("actionBar");
53 fActionBar.setAccessible(true);
54 Method getActionBarMenuOnItemClick = Initiator.loadClass("org.telegram.ui.ActionBar.ActionBar").getDeclaredMethod("getActionBarMenuOnItemClick");
55 Method createView = kChatActivity.getDeclaredMethod("createView", Context.class);
56 HookUtils.hookAfterIfEnabled(this, createView, param -> {
57 Context ctx = (Context) param.args[0];
58 Parasitics.injectModuleResources(ctx.getResources());
59 if (!mActionBarMenuOnItemClickHooked) {
60 Object actionBar = fActionBar.get(param.thisObject);
61 Object listener = getActionBarMenuOnItemClick.invoke(actionBar);
62 Objects.requireNonNull(listener, "getActionBarMenuOnItemClick listener is null");
63 mActionBarMenuOnItemClickClass = listener.getClass();
64 Method onItemClick = mActionBarMenuOnItemClickClass.getDeclaredMethod("onItemClick", int.class);
65 XposedBridge.hookMethod(onItemClick, mOnMenuItemClickHook);
66 mActionBarMenuOnItemClickHooked = true;
67 }
68 Object headerItem = fHeaderItem.get(param.thisObject);
69 if (headerItem != null) {
70 FrameLayout cell = (FrameLayout) addSubItem.invoke(headerItem, ID_RELOAD_BTN, R.drawable.ic_refresh_24,
71 LocaleController.getString("ReloadMessage", R.string.ReloadMessage));
72 assert cell != null;
73 // move call to the second position
74 ViewGroup parent = (ViewGroup) cell.getParent();
75 Objects.requireNonNull(parent, "parent is null");
76 if (parent.getChildCount() > 1) {
77 parent.removeView(cell);
78 parent.addView(cell, 1);
79 }
80 }

Callers

nothing calls this directly

Calls 4

afterAlwaysMethod · 0.95
getFirstByTypeMethod · 0.95
loadClassMethod · 0.95

Tested by

no test coverage detected