package de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders; import android.widget.TabHost; 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.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 AddTabsAndFoldersKK extends HooksBaseClass { public static void initAllHooks(LoadPackageParam lpparam) { if (Common.IS_KK_TREBUCHET || !Common.IS_PRE_GNL_4) return; findAndHookMethod(Classes.AppsCustomizeTabHost, "onFinishInflate", new XC_MethodHook() { @Override protected void afterHookedMethod(final MethodHookParam param) throws Throwable { TabHelperKK.getInstance().init((TabHost) param.thisObject); FolderHelper.getInstance().init(); } }); XC_MethodHook syncAppsPageItemsHook = new XC_MethodHook() { final int PAGE = 0; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("1"); if (TabHelperKK.getInstance().loadTabPage(param.thisObject, (Integer) param.args[PAGE])) { param.setResult(null); } } }; if (Common.PACKAGE_OBFUSCATED) { findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSyncAppsPageItems, Integer.TYPE, syncAppsPageItemsHook); } else { findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSyncAppsPageItems, Integer.TYPE, boolean.class, syncAppsPageItemsHook); } findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSetContentType, Classes.AppsCustomizeContentType, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("2"); TabHelperKK.getInstance().setContentType(param.thisObject); param.setResult(null); } }); findAndHookMethod(Classes.AppsCustomizeTabHost, Methods.acthSetContentTypeImmediate, Classes.AppsCustomizeContentType, new XC_MethodHook() { final int CONTENTTYPE = 0; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("3"); if (TabHelperKK.getInstance().setContentTypeImmediate(param.args[CONTENTTYPE])) { log("4"); param.setResult(null); } } }); 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 && TabHelperKK.getInstance().handleScroll((Float) param.args[OVERSCROLL])) { Common.APP_DRAWER_PAGE_SWITCHED = true; } } }); } XC_MethodHook resetHook = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("5"); Tab tab = TabHelperKK.getInstance().getCurrentTabData(); if (tab != null && tab.isCustomTab()) { log("6"); param.setResult(null); } } }; findAndHookMethod(Classes.AppsCustomizeTabHost, "reset", resetHook); findAndHookMethod(Classes.AppsCustomizePagedView, "reset", resetHook); XposedBridge.hookAllMethods(Classes.Launcher, "onNewIntent", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (TabHelperKK.getInstance().isTabSettingsOpen()) { TabHelperKK.getInstance().closeTabSettings(); } } }); XposedBridge.hookAllMethods(Classes.Launcher, "onResume", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (TabHelperKK.getInstance().isTabSettingsOpen() && !(Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) { TabHelperKK.getInstance().closeTabSettings(); } } }); 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, Fields.acpvContentHeight); } setIntField(param.thisObject, Fields.acpvContentHeight, contentHeight - Utils.dpToPx(52)); } log("7"); numAppPages = TabHelperKK.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 { log("8"); if ((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) { log("9"); Folder folder = FolderHelper.getInstance().findOpenFolder(); if (folder != null) { log("10"); 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(getObjectField(Common.LAUNCHER_INSTANCE, Fields.lAppsCustomizePagedView), 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)); } } } }); } }