| 21 | import de.robv.android.xposed.XposedBridge; |
| 22 | |
| 23 | @FunctionHookEntry |
| 24 | public 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 | } |
nothing calls this directly
no test coverage detected