package de.theknut.xposedgelsettings.hooks.common; import android.animation.TimeInterpolator; import android.graphics.Canvas; import android.view.View; import java.lang.reflect.Method; import java.util.ArrayList; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Methods; import static de.robv.android.xposed.XposedBridge.hookAllMethods; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; /** * Created by Alexander Schulz on 08.11.2014. */ public class CommonHooks { static public ArrayList<XGELSCallback> AddViewToCellLayoutListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> SnapToPageListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> LauncherOnResumeListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> LauncherFinishBindingItems = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> LauncherOnPauseListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> LauncherOnStartListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> LauncherOnCreateListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> OnLauncherTransitionEndListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> PageBeginMovingListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> PageEndMovingListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> MoveToDefaultScreenListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> OpenFolderListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> AppsCustomizePagedViewOverScrollListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> OnNowShowListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> OnDragStartListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> OnDragEndListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> GetWorkspacePaddingListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> FolderIconDispatchDrawListeners = new ArrayList<XGELSCallback>(); static public ArrayList<XGELSCallback> DeviceProfileConstructorListeners = new ArrayList<XGELSCallback>(); public static ArrayList<XGELSCallback> EnterOverviewModeListeners = new ArrayList<XGELSCallback>(); public static ArrayList<XGELSCallback> GetCenterDeltaInScreenSpaceListener = new ArrayList<XGELSCallback>(); public static void initAllHooks(LoadPackageParam lpparam) { if (SnapToPageListeners.size() != 0) { if (Common.PACKAGE_OBFUSCATED) { findAndHookMethod(Classes.PagedView, Methods.pvSnapToPage, Integer.TYPE, Integer.TYPE, Integer.TYPE, boolean.class, TimeInterpolator.class, new XGELSHook(SnapToPageListeners)); } else { findAndHookMethod(Classes.PagedView, Methods.pvSnapToPage, Integer.TYPE, Integer.TYPE, Integer.TYPE, new XGELSHook(SnapToPageListeners)); } } if (OnDragStartListeners.size() != 0) { if (Common.PACKAGE_OBFUSCATED && Common.GNL_VERSION >= ObfuscationHelper.GNL_5_6_22) { String methodName = Methods.sdtbOnDragStart + "$"; for (Method method : Classes.SearchDropTargetBar.getDeclaredMethods()) { if (method.getName().contains(methodName)) { if (method.getParameterTypes().length == 2) { XposedBridge.hookMethod(method, new XGELSHook(OnDragStartListeners)); break; } } } } else if (Common.PACKAGE_OBFUSCATED && Common.GNL_VERSION >= ObfuscationHelper.GNL_4_2_16) { // this is actually not DragSource but the parameter type is unknown as of now findAndHookMethod(Classes.SearchDropTargetBar, Methods.sdtbOnDragStart, Classes.DragSource, Object.class, Integer.TYPE, new XGELSHook(OnDragStartListeners)); } else if (Common.PACKAGE_OBFUSCATED) { // this is actually not DragSource but the parameter type is unknown as of now findAndHookMethod(Classes.SearchDropTargetBar, Methods.sdtbOnDragStart, Classes.DragSource, Object.class, new XGELSHook(OnDragStartListeners)); } else { hookAllMethods(Classes.SearchDropTargetBar, Methods.sdtbOnDragStart, new XGELSHook(OnDragStartListeners)); } } if (OnDragEndListeners.size() != 0) hookAllMethods(Classes.SearchDropTargetBar, Methods.sdtbOnDragEnd, new XGELSHook(OnDragEndListeners)); if (AddViewToCellLayoutListeners.size() != 0) { findAndHookMethod(Classes.CellLayout, Methods.clAddViewToCellLayout, View.class, Integer.TYPE, Integer.TYPE, Classes.CellLayoutLayoutParams, boolean.class, new XGELSHook(AddViewToCellLayoutListeners)); } if (LauncherOnResumeListeners.size() != 0) { findAndHookMethod(Classes.Launcher, "onResume", new XGELSHook(LauncherOnResumeListeners)); } if (LauncherOnPauseListeners.size() != 0) { findAndHookMethod(Classes.Launcher, "onPause", new XGELSHook(LauncherOnPauseListeners)); } if (LauncherOnStartListeners.size() != 0) { findAndHookMethod(Classes.Launcher, "onStart", new XGELSHook(LauncherOnStartListeners)); } if (LauncherFinishBindingItems.size() != 0) { if (Common.IS_GNL && Common.IS_M_GNL) { findAndHookMethod(Classes.Launcher, Methods.lFinishBindingItems, new XGELSHook(LauncherFinishBindingItems)); } else { findAndHookMethod(Classes.Launcher, Methods.lFinishBindingItems, boolean.class, new XGELSHook(LauncherFinishBindingItems)); } } if (LauncherOnCreateListeners.size() != 0) { XposedBridge.hookAllMethods(Classes.Launcher, "onCreate", new XGELSHook(LauncherOnCreateListeners)); } if (PageBeginMovingListeners.size() != 0) { hookAllMethods(Classes.PagedView, Methods.pvPageBeginMoving, new XGELSHook(PageBeginMovingListeners)); } if (PageEndMovingListeners.size() != 0) { hookAllMethods(Classes.PagedView, Methods.pvPageEndMoving, new XGELSHook(PageEndMovingListeners)); } if (MoveToDefaultScreenListeners.size() != 0) { findAndHookMethod(Classes.Workspace, Methods.wMoveToDefaultScreen, boolean.class, new XGELSHook(MoveToDefaultScreenListeners)); } if (OnLauncherTransitionEndListeners.size() != 0) { if (Common.GNL_VERSION >= ObfuscationHelper.GNL_5_6_22) { String methodName = Methods.wOnLauncherTransitionEnd + "$"; for (Method method : Classes.Workspace.getDeclaredMethods()) { if (method.getName().contains(methodName)) { if (method.getParameterTypes().length == 1) { XposedBridge.hookMethod(method, new XGELSHook(OnLauncherTransitionEndListeners)); break; } } } } else { findAndHookMethod(Classes.Workspace, Methods.wOnLauncherTransitionEnd, Classes.Launcher, boolean.class, boolean.class, new XGELSHook(OnLauncherTransitionEndListeners)); } } if (OpenFolderListeners.size() != 0) { findAndHookMethod(Classes.Launcher, Methods.lOpenFolder, Classes.FolderIcon, new XGELSHook(OpenFolderListeners)); } if (AppsCustomizePagedViewOverScrollListeners.size() != 0) { findAndHookMethod(Classes.AppsCustomizePagedView, Methods.pvOverScroll, float.class, new XGELSHook(AppsCustomizePagedViewOverScrollListeners)); } if (OnNowShowListeners.size() != 0) { findAndHookMethod(Classes.NowOverlay, Methods.noOnShow, boolean.class, boolean.class, new XGELSHook(OnNowShowListeners)); } if (GetWorkspacePaddingListeners.size() != 0) { if (Common.IS_GNL && Common.IS_M_GNL) findAndHookMethod(Classes.DeviceProfile, Methods.dpGetWorkspacePadding, boolean.class, new XGELSHook(GetWorkspacePaddingListeners)); else findAndHookMethod(Classes.DeviceProfile, Methods.dpGetWorkspacePadding, Integer.TYPE, new XGELSHook(GetWorkspacePaddingListeners)); } if (FolderIconDispatchDrawListeners.size() != 0) { findAndHookMethod(Classes.FolderIcon, "dispatchDraw", Canvas.class, new XGELSHook(FolderIconDispatchDrawListeners)); } if (DeviceProfileConstructorListeners.size() != 0) { XposedBridge.hookAllConstructors(Classes.DeviceProfile, new XGELSHook(DeviceProfileConstructorListeners)); } if (EnterOverviewModeListeners.size() != 0) { XposedBridge.hookAllMethods(Classes.Workspace, Methods.wEnterOverviewMode, new XGELSHook(EnterOverviewModeListeners)); } try { if (GetCenterDeltaInScreenSpaceListener.size() != 0) { findAndHookMethod(Classes.Utilities, Methods.uGetCenterDeltaInScreenSpace, View.class, View.class, int[].class, new XGELSHook(GetCenterDeltaInScreenSpaceListener)); } } catch (NoSuchMethodError nsme) { } } }