package de.theknut.xposedgelsettings.hooks.androidintegration; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; import android.content.Intent; import java.util.List; 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.common.CommonHooks; import de.theknut.xposedgelsettings.hooks.common.XGELSCallback; import de.theknut.xposedgelsettings.hooks.general.ContextMenu; import de.theknut.xposedgelsettings.hooks.gestures.GestureHelper; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.getBooleanField; import static de.robv.android.xposed.XposedHelpers.getIntField; import static de.robv.android.xposed.XposedHelpers.getObjectField; public class SystemUIHooks extends HooksBaseClass { static ActivityManager activityManager = null; public static void initAllHooks(LoadPackageParam lpparam) { XposedBridge.hookAllMethods(Classes.Launcher, "onBackPressed", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { boolean isDefaultHomescreen = (getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage) == (PreferencesHelper.defaultHomescreen - 1)) || (getIntField(Common.WORKSPACE_INSTANCE, Fields.pvNextPage) == (PreferencesHelper.defaultHomescreen - 1)); if (DEBUG) log("SystemUIHooks: onBackPressed " + (PreferencesHelper.defaultHomescreen - 1) + " : " + isDefaultHomescreen); if (ContextMenu.isOpen()) { ContextMenu.closeAndRemove(); } else if (PreferencesHelper.dynamicBackbutton && !((Boolean) callMethod(param.thisObject, Methods.lIsAllAppsVisible)) && callMethod(Common.WORKSPACE_INSTANCE, Methods.wGetOpenFolder) == null && (isDefaultHomescreen || PreferencesHelper.dynamicBackButtonOnEveryScreen) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_OTHER); myIntent.putExtra(Common.XGELS_ACTION, "GO_TO_SLEEP"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); XposedBridge.hookAllMethods(Classes.Launcher, "onNewIntent", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onNewIntent"); if (ContextMenu.isOpen()) { ContextMenu.closeAndRemove(); } else if (PreferencesHelper.dynamicHomebutton && Intent.ACTION_MAIN.equals(((Intent)param.args[0]).getAction()) && !((Boolean) callMethod(param.thisObject, Methods.lIsAllAppsVisible)) && callMethod(Common.WORKSPACE_INSTANCE, Methods.wGetOpenFolder) == null) { int currentPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if ((currentPage == (PreferencesHelper.defaultHomescreen - 1) || getIntField(Common.WORKSPACE_INSTANCE, Fields.pvNextPage) == (PreferencesHelper.defaultHomescreen - 1)) && getBooleanField(Common.LAUNCHER_INSTANCE, Fields.lHasFocus) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { GestureHelper.handleGesture(Common.LAUNCHER_CONTEXT, null, "OPEN_APPDRAWER"); param.setResult(null); } } } }); if (!PreferencesHelper.hideClock && !PreferencesHelper.dynamicBackbutton && !PreferencesHelper.dynamicHomebutton) { return; } CommonHooks.SnapToPageListeners.add(new XGELSCallback() { boolean gnow = true; @Override public void onBeforeHookedMethod(MethodHookParam param) throws Throwable { gnow = (Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lHasCustomContentToLeft); String launcherState = getObjectField(Common.LAUNCHER_INSTANCE, Fields.lState).toString(); try { if (!((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL") && (launcherState.equals("WORKSPACE") || launcherState.equals("NORMAL"))) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); if ((Integer) param.args[0] == (PreferencesHelper.defaultHomescreen - 1)) { myIntent.putExtra(Common.XGELS_ACTION, "ON_DEFAULT_HOMESCREEN"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } else if ((Integer) param.args[0] == 0 && gnow) { if (PreferencesHelper.dynamicBackButtonOnEveryScreen) { myIntent.putExtra(Common.XGELS_ACTION, "HOME_ORIG"); } else { myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); } myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } } catch (Throwable e) { } } }); CommonHooks.PageBeginMovingListeners.add(new XGELSCallback() { int TOUCH_STATE_REST = 0; @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onPageBeginMoving TouchState " + getObjectField(Common.WORKSPACE_INSTANCE, Fields.wTouchState)); int currentPage = getIntField(param.thisObject, Fields.pvCurrentPage); if (!((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL") && getIntField(Common.WORKSPACE_INSTANCE, Fields.wTouchState) != TOUCH_STATE_REST && getIntField(Common.WORKSPACE_INSTANCE, Fields.pvNextPage) != currentPage) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); if (currentPage == (PreferencesHelper.defaultHomescreen - 1)) { if (PreferencesHelper.dynamicBackButtonOnEveryScreen) { myIntent.putExtra(Common.XGELS_ACTION, "HOME_ORIG"); } else { myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); } myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } } }); CommonHooks.PageEndMovingListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onPageEndMoving TouchState " + getObjectField(Common.WORKSPACE_INSTANCE, Fields.wTouchState) + " " + getIntField(param.thisObject, Fields.pvCurrentPage) + " " + getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState)); if (!((Boolean) callMethod(Common.LAUNCHER_INSTANCE, Methods.lIsAllAppsVisible)) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { int currPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); Intent myIntent = new Intent(); myIntent.setAction(Common.XGELS_INTENT); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); if (currPage == (PreferencesHelper.defaultHomescreen - 1)) { myIntent.putExtra(Common.XGELS_ACTION, "ON_DEFAULT_HOMESCREEN"); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } else { if (PreferencesHelper.dynamicBackButtonOnEveryScreen) { myIntent.putExtra(Common.XGELS_ACTION, "BACK_POWER_OFF"); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } } } }); CommonHooks.EnterOverviewModeListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: enterOverviewMode"); Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } }); CommonHooks.LauncherOnPauseListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onPause"); String launcherState = getObjectField(Common.LAUNCHER_INSTANCE, Fields.lState).toString(); if (launcherState.equals("NORMAL") || launcherState.equals("WORKSPACE")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); XposedBridge.hookAllMethods(Classes.Launcher, "onStop", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onStop isPaused " + getBooleanField(param.thisObject, Fields.lPaused)); String launcherState = getObjectField(Common.LAUNCHER_INSTANCE, Fields.lState).toString(); if (launcherState.equals("NORMAL") || launcherState.equals("WORKSPACE")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); CommonHooks.LauncherOnStartListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onStart"); boolean isDefaultHomescreen = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage) == (PreferencesHelper.defaultHomescreen - 1); if (activityManager == null) { activityManager = (ActivityManager) Common.LAUNCHER_CONTEXT.getSystemService(Context.ACTIVITY_SERVICE); } List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if (!(Boolean) callMethod(param.thisObject, Methods.lIsAllAppsVisible) && isDefaultHomescreen && Common.PACKAGE_NAMES.contains(appProcesses.get(0).processName.replace(":search", "")) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "ON_DEFAULT_HOMESCREEN"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); CommonHooks.LauncherOnResumeListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onResume currentPage" + getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage)); if (!((Boolean) callMethod(param.thisObject, Methods.lIsAllAppsVisible)) && !(Boolean) callMethod(Common.WORKSPACE_INSTANCE, Methods.wIsOnOrMovingToCustomContent) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { int currentPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if (currentPage == (PreferencesHelper.defaultHomescreen - 1)) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "ON_DEFAULT_HOMESCREEN"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } } }); XC_MethodHook hook = new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: onWorkspaceShown"); int currentPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if (activityManager == null) { activityManager = (ActivityManager) Common.LAUNCHER_CONTEXT.getSystemService(Context.ACTIVITY_SERVICE); } List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if (Common.PACKAGE_NAMES.contains(appProcesses.get(0).processName.replace(":search", "")) && !getBooleanField(param.thisObject, Fields.lPaused) && !getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("OVERVIEW")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.setAction(Common.XGELS_INTENT); if (currentPage == (PreferencesHelper.defaultHomescreen - 1)) { myIntent.putExtra(Common.XGELS_ACTION, "ON_DEFAULT_HOMESCREEN"); } else { if (PreferencesHelper.dynamicBackButtonOnEveryScreen) { myIntent.putExtra(Common.XGELS_ACTION, "BACK_POWER_OFF"); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }; if (Common.IS_GNL && Common.IS_M_GNL) { findAndHookMethod(Classes.Launcher, Methods.lShowWorkspace, Integer.TYPE, boolean.class, Runnable.class, hook); } else { findAndHookMethod(Classes.Launcher, Methods.lShowWorkspace, boolean.class, Runnable.class, hook); } XposedBridge.hookAllMethods(Classes.Launcher, Methods.wMoveToCustomContentScreen, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: moveToCustomContentScreen"); Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } }); CommonHooks.OnLauncherTransitionEndListeners.add(new XGELSCallback() { int TOWORKSPACE = Common.GNL_VERSION >= ObfuscationHelper.GNL_5_6_22 ? 0 : 2; @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { int currPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if ((Boolean) param.args[TOWORKSPACE]) { if (DEBUG) log(param, "Transitioning to Workspace " + currPage + " " + (PreferencesHelper.defaultHomescreen - 1)); } else { if (DEBUG) log(param, "Transitioning to All Apps - BACK_HOME_ORIG"); Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_HOME_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); if (PreferencesHelper.dynamicBackbutton && PreferencesHelper.dynamicIconBackbutton) { CommonHooks.OpenFolderListeners.add(new XGELSCallback() { @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: openFolder"); int currentPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if (currentPage == (PreferencesHelper.defaultHomescreen - 1) || PreferencesHelper.dynamicBackButtonOnEveryScreen) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_ORIG"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); XposedBridge.hookAllMethods(Classes.Launcher, Methods.lCloseFolder, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (DEBUG) log("SystemUIHooks: closeFolder"); int currentPage = getIntField(Common.WORKSPACE_INSTANCE, Fields.pvCurrentPage); if (callMethod(Common.WORKSPACE_INSTANCE, Methods.wGetOpenFolder) != null && (currentPage == (PreferencesHelper.defaultHomescreen - 1) || PreferencesHelper.dynamicBackButtonOnEveryScreen) && !getBooleanField(param.thisObject, Fields.lPaused) && getObjectField(Common.WORKSPACE_INSTANCE, Fields.wState).toString().equals("NORMAL")) { Intent myIntent = new Intent(); myIntent.putExtra(Common.XGELS_ACTION_EXTRA, Common.XGELS_ACTION_NAVBAR); myIntent.putExtra(Common.XGELS_ACTION, "BACK_POWER_OFF"); myIntent.setAction(Common.XGELS_INTENT); Common.LAUNCHER_CONTEXT.sendBroadcast(myIntent); } } }); } } }