package de.theknut.xposedgelsettings.hooks.appdrawer; import android.content.ComponentName; import android.content.Intent; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import de.robv.android.xposed.XC_MethodHook; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Fields; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; 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.ui.CommonUI; import de.theknut.xposedgelsettings.ui.SaveActivity; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.getStaticObjectField; public final class AllAppsListAddLHook extends XC_MethodHook { // http://androidxref.com/4.4.2_r1/xref/packages/apps/Launcher3/src/com/android/launcher3/AllAppsList.java#65 // public void add(AppInfo info) List<String> packages = new ArrayList<String>(); boolean init; final int APPINFOLIST = 0; @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (Common.ALL_APPS == null) { Common.ALL_APPS = new ArrayList((ArrayList) param.args[0]); TabHelper.getInstance().updateTabs(); if (!Common.IS_KK_TREBUCHET) return; } if (PreferencesHelper.iconPackHide && !init && Common.LAUNCHER_CONTEXT != null) { init = true; packages = CommonUI.getIconPacks(Common.LAUNCHER_CONTEXT); } ArrayList<String> appsToHide = new ArrayList<String>(PreferencesHelper.hiddenApps); appsToHide.addAll(TabHelper.getInstance().getAppsToHide()); appsToHide.addAll(FolderHelper.getInstance().getAppsToHide()); appsToHide.addAll(getWorkspaceIcons()); if (PreferencesHelper.hiddenApps.size() != 0 && PreferencesHelper.hiddenApps.iterator().next().contains("#") || PreferencesHelper.hiddenWidgets.size() != 0 && PreferencesHelper.hiddenWidgets.iterator().next().contains("#")) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); intent.setComponent(new ComponentName(Common.PACKAGE_NAME, SaveActivity.class.getName())); intent.putExtra("mode", SaveActivity.CONVERT_APPSWIDGETS); Common.LAUNCHER_CONTEXT.startActivity(intent); } ArrayList appInfoList = (ArrayList) param.args[APPINFOLIST]; Iterator it = appInfoList.iterator(); while(it.hasNext()) { Object appInfo = it.next(); ComponentName componentName = (ComponentName) getObjectField(appInfo, Fields.aiComponentName); if (appsToHide.contains(componentName.flattenToString()) || packages.contains(componentName.getPackageName())) { // remove it from the allAppsList if it is in our list it.remove(); } } } private ArrayList<String> getWorkspaceIcons() { ArrayList<String> appsToHide = new ArrayList<String>(); if (PreferencesHelper.autoHideHomeIcons) { ArrayList workspaceItems = (ArrayList) getStaticObjectField(Classes.LauncherModel, Fields.lmWorkspaceItems); for (Object workspaceItem : workspaceItems) { if (workspaceItem.getClass().equals(Classes.ShortcutInfo)) { Intent i = (Intent) callMethod(workspaceItem, "getIntent"); if (i != null && i.getComponent() != null) { appsToHide.add(i.getComponent().flattenToString()); } } } Map<Long, Object> map = (HashMap<Long, Object>) getStaticObjectField(Classes.LauncherModel, Fields.lmFolders); for (Long key: map.keySet()) { Object item = map.get(key); if (!item.getClass().equals(Classes.FolderInfo)) continue; for (Object folderItem : ((ArrayList) getObjectField(item, Fields.fiContents))) { if (folderItem.getClass().equals(Classes.ShortcutInfo)) { Intent i = (Intent) callMethod(folderItem, "getIntent"); if (i != null && i.getComponent() != null) { appsToHide.add(i.getComponent().flattenToString()); } } } } } return appsToHide; } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (Common.IS_KK_TREBUCHET) return; Tab tab = TabHelper.getInstance().getTabById(Tab.APPS_ID); Collections.sort((ArrayList) param.args[APPINFOLIST], tab.getSortComparator()); } }