package de.theknut.xposedgelsettings.hooks.appdrawer;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
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.Methods;
import de.theknut.xposedgelsettings.hooks.PreferencesHelper;
import de.theknut.xposedgelsettings.hooks.Utils;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.AddTabsAndFoldersL;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.AddTabsAndFoldersKK;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.Tab;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.TabHelper;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.TabHelperKK;
import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.TabHelperL;
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.getObjectField;
import static de.robv.android.xposed.XposedHelpers.setIntField;
public class AppDrawerLHooks extends HooksBaseClass {
public static void initAllHooks(LoadPackageParam lpparam) {
// save an instance of the app drawer object
XposedBridge.hookAllConstructors(Classes.AppsCustomizePagedView, new AppsCustomizePagedViewConstructorHook());
if (PreferencesHelper.iconSettingsSwitchApps && Common.IS_PRE_GNL_4) {
// changing the appearence of the icons in the app drawer
XposedBridge.hookAllMethods(Classes.PagedViewIcon, Methods.pviApplyFromApplicationInfo, new ApplyFromApplicationInfoHook());
}
// modify app drawer grid
if (Common.PACKAGE_OBFUSCATED) {
findAndHookMethod(Classes.DeviceProfile, Methods.dpUpdateFromConfiguration, float.class, Integer.TYPE, Resources.class, DisplayMetrics.class, new UpdateFromConfigurationHook());
} else {
XposedBridge.hookAllMethods(Classes.DeviceProfile, Methods.dpUpdateFromConfiguration, new UpdateFromConfigurationHook());
}
if (Common.IS_KK_TREBUCHET) {
// set the background pref_color of the app drawer
XposedBridge.hookAllConstructors(Classes.AppsCustomizeLayout, new AppsCustomizeLayoutConstructorHook());
}
else {
// set the background pref_color of the app drawer
if (Common.PACKAGE_OBFUSCATED || Common.IS_L_TREBUCHET) {
if (Common.IS_PRE_GNL_4) {
findAndHookMethod(Classes.AppsCustomizeTabHost, Methods.acthOnTabChanged, Classes.AppsCustomizeContentType, new OnTabChangedHook());
} else {
findAndHookMethod(Classes.AppsCustomizeTabHost, "onFinishInflate", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
((View) param.thisObject).setBackgroundColor(PreferencesHelper.appdrawerBackgroundColor);
}
});
XC_MethodHook GetChangeStateAnimation = new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (Color.alpha(PreferencesHelper.appdrawerBackgroundColor) < 55
&& getObjectField(param.thisObject, ObfuscationHelper.Fields.wState).toString().equals("NORMAL_HIDDEN")) {
param.args[0] = 0f;
}
}
};
if (Common.IS_L_TREBUCHET) {
findAndHookMethod(Classes.Workspace, Methods.wGetChangeStateAnimation, Classes.WorkspaceState, boolean.class, ArrayList.class, GetChangeStateAnimation);
} else {
findAndHookMethod(Classes.Workspace, Methods.wGetChangeStateAnimation, float.class, boolean.class, GetChangeStateAnimation);
}
}
} else {
findAndHookMethod(Classes.AppsCustomizeTabHost, Methods.acthOnTabChanged, String.class, new OnTabChangedHook());
}
}
if (Common.PACKAGE_OBFUSCATED && Common.GNL_VERSION < ObfuscationHelper.GNL_5_2_33) {
// possible fix for folder not completely opening
findAndHookMethod(Classes.Folder, "b", Classes.Folder, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
View folder = (View) param.args[0];
folder.setScaleX(1.0f);
folder.setScaleY(1.0f);
folder.setAlpha(1.0f);
}
});
}
if (PreferencesHelper.continuousScroll) {
// open app drawer on overscroll of last page
CommonHooks.AppsCustomizePagedViewOverScrollListeners.add(new OverScrollAppDrawerHook());
}
if (PreferencesHelper.closeAppdrawerAfterAppStarted) {
findAndHookMethod(Common.IS_PRE_GNL_4 ? Classes.AppsCustomizePagedView : Classes.Launcher, "onClick", View.class, new OnClickHook());
}
findAndHookMethod(Classes.Workspace, Methods.wOnTransitionPrepare, Classes.Launcher, boolean.class, boolean.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if ((Boolean) param.args[2]) return;
if (PreferencesHelper.enableAppDrawerTabs
&& (Common.PACKAGE_OBFUSCATED || Common.IS_L_TREBUCHET)
&& getObjectField(Common.APP_DRAWER_INSTANCE, ObfuscationHelper.Fields.acpvContentType).toString().equals("Widgets")) {
TabHelper tabHelper = TabHelper.getInstance();
if (tabHelper instanceof TabHelperL) {
((TabHelperL) tabHelper).setCurrentTab(Tab.WIDGETS_ID);
}
} else {
if (PreferencesHelper.appdrawerRememberLastPosition) {
if ((!Common.IS_KK_TREBUCHET && Common.IS_PRE_GNL_4) && !TabHelperKK.getInstance().getCurrentTabData().isWidgetsTab()) {
int lastTab = TabHelperKK.getInstance().getTabHost().getTabWidget().getTabCount() - 1;
if (Common.APPDRAWER_LAST_TAB_POSITION > lastTab) {
Common.APPDRAWER_LAST_TAB_POSITION = lastTab;
}
TabHelperKK.getInstance().setCurrentTab(Common.APPDRAWER_LAST_TAB_POSITION);
}
int lastPage = (Integer) callMethod(Common.APP_DRAWER_INSTANCE, "getChildCount") - 1;
if (Common.APPDRAWER_LAST_PAGE_POSITION > lastPage) {
Common.APPDRAWER_LAST_PAGE_POSITION = lastPage;
}
if (DEBUG)
log(param, "AppDrawer: set to last position " + Common.APPDRAWER_LAST_PAGE_POSITION);
callMethod(Common.APP_DRAWER_INSTANCE, Methods.pvSetCurrentPage, Common.APPDRAWER_LAST_PAGE_POSITION);
} else {
callMethod(Common.APP_DRAWER_INSTANCE, Methods.pvSetCurrentPage, 0);
}
if (!Common.IS_KK_TREBUCHET)
TabHelper.getInstance().scroll();
}
}
});
CommonHooks.OnLauncherTransitionEndListeners.add(new XGELSCallback() {
int TOWORKSPACE = Common.GNL_VERSION >= ObfuscationHelper.GNL_5_6_22 ? 0 : 2;
@Override
public void onBeforeHookedMethod(MethodHookParam param) throws Throwable {
if ((Boolean) param.args[TOWORKSPACE]) {
Tab currTab = Common.IS_KK_TREBUCHET ? null : TabHelper.getInstance().getCurrentTabData();
if (PreferencesHelper.appdrawerRememberLastPosition) {
if (!Common.OVERSCROLLED) {
Common.APPDRAWER_LAST_PAGE_POSITION = getIntField(Common.APP_DRAWER_INSTANCE, ObfuscationHelper.Fields.pvCurrentPage);
}
if (Common.IS_PRE_GNL_4) {
if (!Common.OVERSCROLLED && !Common.IS_KK_TREBUCHET && !currTab.isWidgetsTab()) {
Common.APPDRAWER_LAST_TAB_POSITION = currTab.getIndex();
}
} else {
if (!Common.OVERSCROLLED && !Common.IS_KK_TREBUCHET && !currTab.isWidgetsTab()) {
Common.APPDRAWER_LAST_TAB_POSITION = currTab.getLayoutId();
}
}
if (DEBUG)
log(param, "AppDrawerHooks: get current position - " + Common.APPDRAWER_LAST_PAGE_POSITION);
}
if (!PreferencesHelper.appdrawerRememberLastPosition || (currTab != null && currTab.isWidgetsTab())) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (Common.IS_KK_TREBUCHET) {
return;
}
callMethod(Common.APP_DRAWER_INSTANCE, Methods.acpvSetContentType, callMethod(getObjectField(Common.LAUNCHER_INSTANCE, ObfuscationHelper.Fields.lAppsCustomizeTabHost), Methods.acthGetContentTypeForTabTag, "APPS"));
if (Common.IS_PRE_GNL_4) {
TabHelperKK.getInstance().setCurrentTab(0);
} else {
TabHelperL.getInstance().setCurrentTab(0x80 + Tab.APPS_ID, true);
}
}
}, 1000);
}
Common.OVERSCROLLED = false;
} else {
Common.ORIENTATION = Common.LAUNCHER_CONTEXT.getResources().getConfiguration().orientation;
}
}
});
if (PreferencesHelper.changeGridSizeApps) {
XposedBridge.hookAllMethods(Classes.AppsCustomizePagedView, Methods.acpvUpdatePageCounts, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (Common.LAUNCHER_CONTEXT.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setIntField(param.thisObject, ObfuscationHelper.Fields.acpvCellCountY, Common.ALL_APPS_Y_COUNT_HORIZONTAL);
setIntField(param.thisObject, ObfuscationHelper.Fields.acpvCellCountX, Common.ALL_APPS_X_COUNT_HORIZONTAL);
((ViewGroup) param.thisObject).setPadding(Utils.dpToPx(24), ((ViewGroup) param.thisObject).getPaddingTop(), Utils.dpToPx(24), ((ViewGroup) param.thisObject).getPaddingBottom());
} else {
setIntField(param.thisObject, ObfuscationHelper.Fields.acpvCellCountY, Common.ALL_APPS_Y_COUNT_VERTICAL);
setIntField(param.thisObject, ObfuscationHelper.Fields.acpvCellCountX, Common.ALL_APPS_X_COUNT_VERTICAL);
}
}
});
}
if (Common.PACKAGE_OBFUSCATED && Common.IS_PRE_GNL_4) {
findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSetAllAppsPadding, Rect.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (Resources.getSystem().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Rect r = (Rect) param.args[0];
r.left = 0;
r.right = 0;
}
}
});
} else if (Common.IS_KK_TREBUCHET) {
findAndHookMethod(Classes.AppsCustomizePagedView, "setupPage", Classes.AppsCustomizeCellLayout, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (Resources.getSystem().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
ViewGroup vg = (ViewGroup) param.args[0];
vg.setPadding(0, vg.getPaddingTop(), 0, vg.getPaddingBottom());
}
}
});
}
// hiding apps from the app drawer
findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvSetApps, ArrayList.class, new AllAppsListAddLHook());
findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvUpdateApps, ArrayList.class, new AllAppsListAddLHook());
findAndHookMethod(Classes.AppsCustomizePagedView, Methods.acpvRemoveApps, ArrayList.class, new AllAppsListAddLHook());
AddTabsAndFoldersL.initAllHooks(lpparam);
AddTabsAndFoldersKK.initAllHooks(lpparam);
}
}