package de.theknut.xposedgelsettings.hooks.appdrawer; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; 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.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.AddTabsAndFoldersM; import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.FolderHelper; import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.Tab; import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.TabHelper; import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.TabHelperM; 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; import static de.robv.android.xposed.XposedHelpers.setObjectField; public class AppDrawerMHooks extends HooksBaseClass { public static void initAllHooks(LoadPackageParam lpparam) { // save an instance of the app drawer object XposedBridge.hookAllConstructors(Classes.AllAppsContainerView, new AppsCustomizePagedViewConstructorHook()); XposedBridge.hookAllMethods(Classes.AllAppsContainerView, "setSearchBarController", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { ViewGroup mSearchBarContainerView = (ViewGroup) getObjectField(param.thisObject, "mSearchBarView"); mSearchBarContainerView.getBackground().setColorFilter(PreferencesHelper.searchbarPrimaryColor, PorterDuff.Mode.MULTIPLY); } }); if (PreferencesHelper.noAllAppsPredictions) { findAndHookMethod(Classes.LauncherCallbacksImpl, "getPredictedApps", XC_MethodReplacement.returnConstant(Collections.emptyList())); } if (PreferencesHelper.appdrawerRememberLastPosition) { findAndHookMethod(Classes.AllAppsRecyclerView, "scrollToTop", XC_MethodReplacement.DO_NOTHING); } if (Common.GNL_VERSION < ObfuscationHelper.GNL_5_10_22 && Utils.getContrastColor(PreferencesHelper.searchbarPrimaryColor) == Color.WHITE) { findAndHookMethod(Classes.AllAppsSearchBarControllerImpl, "getView", ViewGroup.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { View mSearchBarView = (View) param.getResult(); int id = mSearchBarView.getResources().getIdentifier("clear_button", "id", Common.HOOKED_PACKAGE); FrameLayout clearButton = (FrameLayout) mSearchBarView.findViewById(id); id = mSearchBarView.getResources().getIdentifier("quantum_ic_clear_white_24", "drawable", Common.HOOKED_PACKAGE); ((ImageView) clearButton.getChildAt(0)).setImageDrawable(mSearchBarView.getResources().getDrawable(id)); } }); } try { findAndHookMethod(Classes.AllAppsContainerView, "onUpdateBackgroundAndPaddings", Rect.class, Rect.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { TabHelperM.getInstance().setBackgroundColor(TabHelperM.getInstance().getTabById(Tab.APPS_ID)); } }); } catch (NoSuchMethodError nsme) { findAndHookMethod(Classes.AllAppsContainerView, "onUpdateBgPadding", Rect.class, Rect.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { TabHelperM.getInstance().setBackgroundColor(TabHelperM.getInstance().getTabById(Tab.APPS_ID)); } }); } if (PreferencesHelper.closeAppdrawerAfterAppStarted) { findAndHookMethod(Classes.Launcher, "onClick", View.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((Boolean) callMethod(Common.LAUNCHER_INSTANCE, "isAppsViewVisible")) { ((ArrayList) getObjectField(Common.LAUNCHER_INSTANCE, "mOnResumeCallbacks")).add(0, new Runnable() { @Override public void run() { callMethod(Common.LAUNCHER_INSTANCE, Methods.lShowWorkspace, -1, false, null); } }); } } }); } // Fix setSpanCount = 0 bug XposedBridge.hookAllConstructors(Classes.FullMergeAlgorithm, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((Integer) getObjectField(Common.APP_DRAWER_INSTANCE, "mNumAppsPerRow") < 1) { if (DEBUG) log("Fix mNumAppsPerRow < 1"); setObjectField(Common.APP_DRAWER_INSTANCE, "mNumAppsPerRow", 1); } } }); findAndHookMethod(Classes.BubbleTextView, "applyFromApplicationInfo", Classes.AppInfo, new XC_MethodHook() { int mIconSize = -1; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (PreferencesHelper.iconSettingsSwitchApps) { mIconSize = getIntField(param.thisObject, "mIconSize"); setIntField(param.thisObject, "mIconSize", Common.APP_DRAWER_ICON_SIZE); } } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (mIconSize == -1) { setIntField(param.thisObject, "mIconSize", mIconSize); mIconSize = -1; } } }); if (PreferencesHelper.changeGridSizeApps) { XposedBridge.hookAllConstructors(Classes.FullMergeAlgorithm, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (PreferencesHelper.xCountAllAppsHorizontal == -1 || PreferencesHelper.xCountAllAppsVertical == -1) return; if (Common.LAUNCHER_CONTEXT.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { setObjectField(Common.APP_DRAWER_INSTANCE, "mNumAppsPerRow", PreferencesHelper.xCountAllAppsHorizontal); setObjectField(Common.APP_DRAWER_INSTANCE, "mNumPredictedAppsPerRow", PreferencesHelper.xCountAllAppsHorizontal); } else { setObjectField(Common.APP_DRAWER_INSTANCE, "mNumAppsPerRow", PreferencesHelper.xCountAllAppsVertical); setObjectField(Common.APP_DRAWER_INSTANCE, "mNumPredictedAppsPerRow", PreferencesHelper.xCountAllAppsVertical); } } }); } // hiding apps from the app drawer findAndHookMethod(Classes.AlphabeticalAppsList, "updateApps", List.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { HashMap mComponentToAppMap = (HashMap) getObjectField(param.thisObject, "mComponentToAppMap"); if (mComponentToAppMap.isEmpty()) { Common.ALL_APPS = new ArrayList((ArrayList) param.args[0]); FolderHelper.getInstance().init(); } else { Common.ALL_APPS.addAll(new ArrayList((ArrayList) param.args[0])); } TabHelper.getInstance().updateTabs(); } }); findAndHookMethod(Classes.AlphabeticalAppsList, "removeApps", List.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Common.ALL_APPS.removeAll(new ArrayList((ArrayList) param.args[0])); TabHelper.getInstance().updateTabs(); } }); AddTabsAndFoldersM.initAllHooks(lpparam); } }