package de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders; import android.graphics.PorterDuff; import android.graphics.Rect; import android.view.View; import android.widget.FrameLayout; import de.robv.android.xposed.XC_MethodHook; 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.HooksBaseClass; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Fields; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Methods; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; import de.theknut.xposedgelsettings.hooks.Utils; import de.theknut.xposedgelsettings.hooks.common.CommonHooks; import de.theknut.xposedgelsettings.hooks.common.XGELSCallback; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.getIntField; import static de.robv.android.xposed.XposedHelpers.getLongField; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.setIntField; public class AddTabsAndFoldersL extends HooksBaseClass { public static void initAllHooks(LoadPackageParam lpparam) { if (Common.IS_KK_TREBUCHET || Common.IS_PRE_GNL_4) return; PreferencesHelper.moveTabHostBottom = false; findAndHookMethod(Classes.AppsCustomizeTabHost, "onFinishInflate", new XC_MethodHook() { @Override protected void afterHookedMethod(final MethodHookParam param) throws Throwable { TabHelperL.getInstance().init((FrameLayout) param.thisObject); FolderHelper.getInstance().init(); } }); findAndHookMethod(Classes.AppsCustomizeTabHost, Methods.acthSetInsets, Rect.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (PreferencesHelper.enableAppDrawerTabs) { ((FrameLayout.LayoutParams) ((View) getObjectField(param.thisObject, Fields.acthContent)).getLayoutParams()).topMargin = Utils.dpToPx(0); } } }); XC_MethodHook syncAppsPageItemsHook = new XC_MethodHook() { final int PAGE = 0; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (TabHelperL.getInstance().loadTabPage(param.thisObject, (Integer) param.args[PAGE])) { param.setResult(null); } } }; if (Common.IS_L_TREBUCHET || (Common.PACKAGE_OBFUSCATED && Common.GNL_VERSION >= ObfuscationHelper.GNL_4_2_16)) { findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSyncAppsPageItems, Integer.TYPE, boolean.class, syncAppsPageItemsHook); } else { findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSyncAppsPageItems, Integer.TYPE, syncAppsPageItemsHook); } findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSyncPages, new XC_MethodHook() { int numAppPages; int contentHeight = -1; int orientation; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { // if (PreferencesHelper.enableAppDrawerTabs && PreferencesHelper.moveTabHostBottom) { // int currOrientation = Common.LAUNCHER_CONTEXT.getResources().getConfiguration().orientation; // if (contentHeight == -1 || orientation != currOrientation) { // orientation = currOrientation; // contentHeight = getIntField(param.thisObject, ObfuscationHelper.Fields.acpvContentHeight); // } // setIntField(param.thisObject, ObfuscationHelper.Fields.acpvContentHeight, contentHeight - Utils.dpToPx(52)); // } numAppPages = TabHelperL.getInstance().setNumberOfPages(param.thisObject); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (numAppPages != -1) { setIntField(param.thisObject, Fields.acpvNumAppsPages, numAppPages); } } }); XC_MethodHook closeHook = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) { Folder folder = FolderHelper.getInstance().findOpenFolder(); if (folder != null) { folder.closeFolder(); param.setResult(null); } } } }; XposedBridge.hookAllMethods(Classes.Launcher, "onNewIntent", closeHook); XposedBridge.hookAllMethods(Classes.Launcher, "onBackPressed", closeHook); findAndHookMethod(Classes.Workspace, Methods.wGetScreenWithId, long.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((Long) param.args[0] == -1) { param.setResult(callMethod(Common.APP_DRAWER_INSTANCE, Methods.pvGetPageAt, 0)); } } }); findAndHookMethod(Classes.Workspace, Methods.wGetViewForTag, Object.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if(getLongField(param.args[0], Fields.iiScreenId) == Folder.FOLDER_ID) { Folder folder = FolderHelper.getInstance().findOpenFolder(); if (folder != null) { param.setResult(folder.getFolderIcon()); } } } }); findAndHookMethod(Classes.Workspace, Methods.wGetFolderForTag, Object.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if(getLongField(param.args[0], Fields.iiScreenId) == Folder.FOLDER_ID) { Folder folder = FolderHelper.getInstance().findOpenFolder(); if (folder != null) { param.setResult(getObjectField(folder.getFolderIcon(), Fields.fiFolder)); } } } }); CommonHooks.AppsCustomizePagedViewOverScrollListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if ((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) { TabHelperL.getInstance().handleOverscroll(getIntField(param.thisObject, Fields.pvOverscrollX)); } } }); findAndHookMethod(Classes.Launcher, Methods.lDispatchOnLauncherTransitionStart, View.class, boolean.class, boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((Boolean) param.args[2]) { TabHelperL.getInstance().hideTabBar(); } else { TabHelperL.getInstance().hideTabBar(); } } }); findAndHookMethod(Classes.Launcher, Methods.lDispatchOnLauncherTransitionEnd, View.class, boolean.class, boolean.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (!(Boolean) param.args[2]) { TabHelperL.getInstance().showTabBar(); } } }); CommonHooks.GetCenterDeltaInScreenSpaceListener.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (getObjectField(Common.APP_DRAWER_INSTANCE, Fields.acpvContentType).toString().equals("Widgets")) { return; } int color = PreferencesHelper.appdrawerFolderStyleBackgroundColor; if (PreferencesHelper.enableAppDrawerTabs) { color = TabHelperL.getInstance().getCurrentTabData().getPrimaryColor(); } ((View) param.args[0]).getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); } }); if (PreferencesHelper.enableAppDrawerTabs && PreferencesHelper.appdrawerSwipeTabs && (!PreferencesHelper.continuousScroll || !PreferencesHelper.continuousScrollWithAppDrawer)) { // open app drawer on overscroll of last page CommonHooks.AppsCustomizePagedViewOverScrollListeners.add(new XGELSCallback() { final int OVERSCROLL = 0; @Override public void onBeforeHookedMethod(MethodHookParam param) throws Throwable { if (!Common.APP_DRAWER_PAGE_SWITCHED && TabHelper.getInstance().handleScroll((Float) param.args[OVERSCROLL])) { Common.APP_DRAWER_PAGE_SWITCHED = true; } } }); } } }