package de.theknut.xposedgelsettings.hooks.homescreen;
import android.content.res.Configuration;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import de.theknut.xposedgelsettings.R;
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.common.CommonHooks;
import de.theknut.xposedgelsettings.hooks.common.XGELSCallback;
import de.theknut.xposedgelsettings.hooks.general.MoveToDefaultScreenHook;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import static de.robv.android.xposed.XposedHelpers.getFloatField;
import static de.robv.android.xposed.XposedHelpers.getObjectField;
import static de.robv.android.xposed.XposedHelpers.setBooleanField;
import static de.robv.android.xposed.XposedHelpers.setIntField;
public class HomescreenHooks extends HooksBaseClass {
public static void initAllHooks(LoadPackageParam lpparam) {
// change the default homescreen
CommonHooks.MoveToDefaultScreenListeners.add(new MoveToDefaultScreenHook());
findAndHookMethod(Classes.Workspace, Methods.wMoveToDefaultScreen, boolean.class, new MoveToDefaultScreenHook());
// modify homescreen grid
CommonHooks.DeviceProfileConstructorListeners.add(
Common.IS_GNL && Common.IS_M_GNL
? new DeviceProfileMConstructorHook()
: new DeviceProfileLConstructorHook()
);
if (!Common.IS_PRE_GNL_4) {
findAndHookMethod(Classes.Folder, "onFinishInflate", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
((View) param.thisObject).setBackground(Common.XGELS_CONTEXT.getResources().getDrawable(R.drawable.quantum_panel));
}
});
}
if (PreferencesHelper.iconSettingsSwitchHome || PreferencesHelper.homescreenFolderSwitch || PreferencesHelper.appdockSettingsSwitch) {
// changing the appearence of the icons on the homescreen
CommonHooks.AddViewToCellLayoutListeners.add(new AddViewToCellLayoutHook());
}
if (PreferencesHelper.continuousScroll) {
// over scroll to app drawer or first page
findAndHookMethod(Classes.Workspace, Methods.pvOverScroll, float.class, new OverScrollWorkspaceHook());
}
if (PreferencesHelper.appdockSettingsSwitch || PreferencesHelper.changeGridSizeHome) {
// hide the app dock
CommonHooks.GetWorkspacePaddingListeners.add(new GetWorkspacePaddingHook());
if (PreferencesHelper.appdockSettingsSwitch) {
XposedBridge.hookAllConstructors(Classes.Hotseat, new HotseatConstructorHook());
if (PreferencesHelper.appdockShowLabels) {
if (Common.GNL_VERSION >= ObfuscationHelper.GNL_5_3_23) {
findAndHookMethod(Classes.Hotseat, "resetLayout", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Object mContent = getObjectField(param.thisObject, "mContent");
setBooleanField(mContent, Fields.clIsHotseat, false);
setBooleanField(getObjectField(mContent, Fields.clShortcutsAndWidgets), Fields.sawIsHotseat, false);
}
});
} else {
findAndHookMethod(Classes.CellLayout, Methods.clSetIsHotseat, boolean.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
setBooleanField(param.thisObject, Fields.clIsHotseat, false);
setBooleanField(getObjectField(param.thisObject, Fields.clShortcutsAndWidgets), Fields.sawIsHotseat, false);
}
});
}
}
findAndHookMethod(Classes.Hotseat, "onFinishInflate", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (Common.LAUNCHER_CONTEXT.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
FrameLayout hotseat = (FrameLayout) param.thisObject;
int paddingLeftRight = hotseat.getPaddingLeft();
int paddingBottom = hotseat.getPaddingBottom();
paddingLeftRight = paddingLeftRight == 0 && PreferencesHelper.appdockRect != 1 ? 12 : 0;
hotseat.setPadding(
paddingLeftRight * PreferencesHelper.appdockRect,
hotseat.getPaddingTop(),
paddingLeftRight * PreferencesHelper.appdockRect,
paddingBottom
);
}
}
});
}
}
if (Common.IS_KK_TREBUCHET) {
// move to default homescreen after workspace has finished loading
XposedBridge.hookAllMethods(Classes.Launcher, "onFinishBindingItems", new FinishBindingItemsHook());
}
else {
if (Common.IS_GNL && Common.IS_M_GNL){
// move to default homescreen after workspace has finished loading
findAndHookMethod(Classes.Launcher, Methods.lFinishBindingItems, new FinishBindingItemsHook());
}
else {
// move to default homescreen after workspace has finished loading
findAndHookMethod(Classes.Launcher, Methods.lFinishBindingItems, boolean.class, new FinishBindingItemsHook());
}
}
if (PreferencesHelper.smartFolderMode != 0) {
findAndHookMethod(Classes.FolderIcon, "onTouchEvent", MotionEvent.class, new SmartFolderHook());
}
CommonHooks.MoveToDefaultScreenListeners.add(new MoveToDefaultScreenHook());
if (PreferencesHelper.unlimitedFolderSize && !Common.IS_M_GNL) {
XposedBridge.hookAllConstructors(Classes.Folder, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
setIntField(param.thisObject, Fields.fMaxCountX, Math.round(getFloatField(Common.DEVICE_PROFIL, Fields.dpNumCols)));
setIntField(param.thisObject, Fields.fMaxCountY, Integer.MAX_VALUE);
setIntField(param.thisObject, Fields.fMaxNumItems, Integer.MAX_VALUE);
}
});
// very dirty hack :(
if (false && !Common.IS_KK_TREBUCHET) {
findAndHookMethod(Classes.Folder, "onMeasure", Integer.TYPE, Integer.TYPE, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Common.ON_MEASURE = true;
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Common.ON_MEASURE = false;
}
});
findAndHookMethod(Classes.LauncherAppState, Methods.lasIsDisableAllApps, new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return Common.ON_MEASURE;
}
});
}
}
CommonHooks.GetCenterDeltaInScreenSpaceListener.add(new XGELSCallback() {
@Override
public void onAfterHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[1] == null || ((TextView) param.args[1]).getX() == 0 && ((TextView) param.args[1]).getY() == 0) {
int[] loc = (int[]) param.getResult();
loc[0] = 0;
loc[1] = 0;
param.setResult(loc);
}
}
});
}
}