From 40452cf468b44a4173338cc83000b4ad84860ebc Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Sep 2016 15:17:46 -0700 Subject: Using ItemInfoMatcher in place of similar interfaces and utility methods Change-Id: I7337b819fe8f42f7a5a1481b5ed5d99a8cf583c4 --- src/com/android/launcher3/AllAppsList.java | 9 +- src/com/android/launcher3/Launcher.java | 8 -- src/com/android/launcher3/LauncherModel.java | 128 +++++---------------- src/com/android/launcher3/Workspace.java | 80 ++++--------- .../android/launcher3/util/ItemInfoMatcher.java | 42 +++++++ src/com/android/launcher3/util/StringFilter.java | 31 ----- 6 files changed, 98 insertions(+), 200 deletions(-) delete mode 100644 src/com/android/launcher3/util/StringFilter.java diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index c4315936c..c427ddc93 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -23,7 +23,7 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.FlagOp; -import com.android.launcher3.util.StringFilter; +import com.android.launcher3.util.ItemInfoMatcher; import java.util.ArrayList; import java.util.HashSet; @@ -121,14 +121,13 @@ class AllAppsList { } /** - * Updates the apps for the given packageName and user based on {@param op}. + * Updates the disabled flags of apps matching {@param matcher} based on {@param op}. */ - public void updatePackageFlags(StringFilter pkgFilter, UserHandleCompat user, FlagOp op) { + public void updateDisabledFlags(ItemInfoMatcher matcher, FlagOp op) { final List data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); - final ComponentName component = info.intent.getComponent(); - if (info.user.equals(user) && pkgFilter.matches(component.getPackageName())) { + if (matcher.matches(info, info.intent.getComponent())) { info.isDisabled = op.apply(info.isDisabled); modified.add(info); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 901900e0f..13911b86e 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4449,14 +4449,6 @@ public class Launcher extends Activity return sCustomAppWidgets; } - public static List getFolderContents(View icon) { - if (icon instanceof FolderIcon) { - return ((FolderIcon) icon).getFolder().getItemsInReadingOrder(); - } else { - return Collections.EMPTY_LIST; - } - } - public static Launcher getLauncher(Context context) { if (context instanceof Launcher) { return (Launcher) context; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2e3d6036a..5e57aa42a 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -71,12 +71,12 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.CursorIconInfo; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Preconditions; -import com.android.launcher3.util.StringFilter; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.ViewOnDrawExecutor; @@ -230,10 +230,6 @@ public class LauncherModel extends BroadcastReceiver public void bindDeepShortcutMap(MultiHashMap deepShortcutMap); } - public interface ItemInfoFilter { - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn); - } - LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter, DeepShortcutManager deepShortcutManager) { Context context = app.getContext(); @@ -942,38 +938,26 @@ public class LauncherModel extends BroadcastReceiver runOnWorkerThread(r); } - private static ArrayList getItemsByPackageName( - final String pn, final UserHandleCompat user) { - ItemInfoFilter filter = new ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn) { - return cn.getPackageName().equals(pn) && info.user.equals(user); - } - }; - return filterItemInfos(sBgItemsIdMap, filter); - } - - /** - * Removes all the items from the database corresponding to the specified package. - */ - static void deletePackageFromDatabase(Context context, final String pn, - final UserHandleCompat user) { - deleteItemsFromDatabase(context, getItemsByPackageName(pn, user)); - } - /** * Removes the specified item from the database */ public static void deleteItemFromDatabase(Context context, final ItemInfo item) { - ArrayList items = new ArrayList(); + ArrayList items = new ArrayList<>(); items.add(item); deleteItemsFromDatabase(context, items); } + /** + * Removes all the items from the database matching {@param matcher}. + */ + public static void deleteItemsFromDatabase(Context context, ItemInfoMatcher matcher) { + deleteItemsFromDatabase(context, matcher.filterItemInfos(sBgItemsIdMap)); + } + /** * Removes the specified items from the database */ - static void deleteItemsFromDatabase(Context context, final ArrayList items) { + static void deleteItemsFromDatabase(Context context, final Iterable items) { final ContentResolver cr = context.getContentResolver(); Runnable r = new Runnable() { public void run() { @@ -2972,9 +2956,9 @@ public class LauncherModel extends BroadcastReceiver } private class PackageUpdatedTask implements Runnable { - int mOp; - String[] mPackages; - UserHandleCompat mUser; + final int mOp; + final String[] mPackages; + final UserHandleCompat mUser; public static final int OP_NONE = 0; public static final int OP_ADD = 1; @@ -3001,7 +2985,7 @@ public class LauncherModel extends BroadcastReceiver final String[] packages = mPackages; final int N = packages.length; FlagOp flagOp = FlagOp.NO_OP; - StringFilter pkgFilter = StringFilter.of(new HashSet<>(Arrays.asList(packages))); + final HashSet packageSet = new HashSet<>(Arrays.asList(packages)); switch (mOp) { case OP_ADD: { for (int i=0; i updatedShortcuts = new ArrayList(); - final ArrayList removedShortcuts = new ArrayList(); - final ArrayList widgets = new ArrayList(); + final ArrayList updatedShortcuts = new ArrayList<>(); + final ArrayList removedShortcuts = new ArrayList<>(); + final ArrayList widgets = new ArrayList<>(); synchronized (sBgLock) { for (ItemInfo info : sBgItemsIdMap) { @@ -3121,7 +3105,7 @@ public class LauncherModel extends BroadcastReceiver // Update shortcuts which use iconResource. if ((si.iconResource != null) - && pkgFilter.matches(si.iconResource.packageName)) { + && packageSet.contains(si.iconResource.packageName)) { Bitmap icon = LauncherIcons.createIconBitmap( si.iconResource.packageName, si.iconResource.resourceName, context); @@ -3133,7 +3117,7 @@ public class LauncherModel extends BroadcastReceiver } ComponentName cn = si.getTargetComponent(); - if (cn != null && pkgFilter.matches(cn.getPackageName())) { + if (cn != null && packageSet.contains(cn.getPackageName())) { AppInfo appInfo = addedOrUpdatedApps.get(cn); if (si.isPromise()) { @@ -3198,7 +3182,7 @@ public class LauncherModel extends BroadcastReceiver LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) info; if (mUser.equals(widgetInfo.user) && widgetInfo.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) - && pkgFilter.matches(widgetInfo.providerName.getPackageName())) { + && packageSet.contains(widgetInfo.providerName.getPackageName())) { widgetInfo.restoreStatus &= ~LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY & ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; @@ -3256,12 +3240,10 @@ public class LauncherModel extends BroadcastReceiver } if (!removedPackages.isEmpty() || !removedComponents.isEmpty()) { - for (String pn : removedPackages) { - deletePackageFromDatabase(context, pn, mUser); - } - for (ComponentName cn : removedComponents) { - deleteItemsFromDatabase(context, getItemInfoForComponentName(cn, mUser)); - } + deleteItemsFromDatabase( + context, ItemInfoMatcher.ofPackages(removedPackages, mUser)); + deleteItemsFromDatabase( + context, ItemInfoMatcher.ofComponents(removedComponents, mUser)); // Remove any queued items from the install queue InstallShortcutReceiver.removeFromInstallQueue(context, removedPackages, mUser); @@ -3497,18 +3479,6 @@ public class LauncherModel extends BroadcastReceiver return !launcherApps.isPackageEnabledForProfile(packageName, user); } - public static boolean isValidPackageActivity(Context context, ComponentName cn, - UserHandleCompat user) { - if (cn == null) { - return false; - } - final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - if (!launcherApps.isPackageEnabledForProfile(cn.getPackageName(), user)) { - return false; - } - return launcherApps.isActivityEnabledForProfile(cn, user); - } - public static boolean isValidPackage(Context context, String packageName, UserHandleCompat user) { if (packageName == null) { @@ -3631,50 +3601,6 @@ public class LauncherModel extends BroadcastReceiver return info; } - static ArrayList filterItemInfos(Iterable infos, - ItemInfoFilter f) { - HashSet filtered = new HashSet(); - for (ItemInfo i : infos) { - if (i instanceof ShortcutInfo) { - ShortcutInfo info = (ShortcutInfo) i; - ComponentName cn = info.getTargetComponent(); - if (cn != null && f.filterItem(null, info, cn)) { - filtered.add(info); - } - } else if (i instanceof FolderInfo) { - FolderInfo info = (FolderInfo) i; - for (ShortcutInfo s : info.contents) { - ComponentName cn = s.getTargetComponent(); - if (cn != null && f.filterItem(info, s, cn)) { - filtered.add(s); - } - } - } else if (i instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) i; - ComponentName cn = info.providerName; - if (cn != null && f.filterItem(null, info, cn)) { - filtered.add(info); - } - } - } - return new ArrayList(filtered); - } - - @Thunk ArrayList getItemInfoForComponentName(final ComponentName cname, - final UserHandleCompat user) { - ItemInfoFilter filter = new ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn) { - if (info.user == null) { - return cn.equals(cname); - } else { - return cn.equals(cname) && info.user.equals(user); - } - } - }; - return filterItemInfos(sBgItemsIdMap, filter); - } - /** * Make an ShortcutInfo object for a shortcut that isn't an application. */ diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index d5f1363b4..02c561f91 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -29,7 +29,6 @@ import android.annotation.TargetApi; import android.app.WallpaperManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; -import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -3976,63 +3975,34 @@ public class Workspace extends PagedView for (final CellLayout layoutParent: cellLayouts) { final ViewGroup layout = layoutParent.getShortcutsAndWidgets(); - final HashMap children = new HashMap<>(); + LongArrayMap idToViewMap = new LongArrayMap<>(); + ArrayList items = new ArrayList<>(); for (int j = 0; j < layout.getChildCount(); j++) { final View view = layout.getChildAt(j); - children.put((ItemInfo) view.getTag(), view); - } - - final ArrayList childrenToRemove = new ArrayList<>(); - final HashMap> folderAppsToRemove = new HashMap<>(); - LauncherModel.ItemInfoFilter filter = new LauncherModel.ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, - ComponentName cn) { - if (parent instanceof FolderInfo) { - if (matcher.matches(info, cn)) { - FolderInfo folder = (FolderInfo) parent; - ArrayList appsToRemove; - if (folderAppsToRemove.containsKey(folder)) { - appsToRemove = folderAppsToRemove.get(folder); - } else { - appsToRemove = new ArrayList(); - folderAppsToRemove.put(folder, appsToRemove); - } - appsToRemove.add((ShortcutInfo) info); - return true; - } - } else { - if (matcher.matches(info, cn)) { - childrenToRemove.add(children.get(info)); - return true; - } - } - return false; - } - }; - LauncherModel.filterItemInfos(children.keySet(), filter); - - // Remove all the apps from their folders - for (FolderInfo folder : folderAppsToRemove.keySet()) { - ArrayList appsToRemove = folderAppsToRemove.get(folder); - for (ShortcutInfo info : appsToRemove) { - folder.remove(info, false); + if (view.getTag() instanceof ItemInfo) { + ItemInfo item = (ItemInfo) view.getTag(); + items.add(item); + idToViewMap.put(item.id, view); } } - // Remove all the other children - for (View child : childrenToRemove) { - // Note: We can not remove the view directly from CellLayoutChildren as this - // does not re-mark the spaces as unoccupied. - layoutParent.removeViewInLayout(child); - if (child instanceof DropTarget) { - mDragController.removeDropTarget((DropTarget) child); - } - } + for (ItemInfo itemToRemove : matcher.filterItemInfos(items)) { + View child = idToViewMap.get(itemToRemove.id); - if (childrenToRemove.size() > 0) { - layout.requestLayout(); - layout.invalidate(); + if (child != null) { + // Note: We can not remove the view directly from CellLayoutChildren as this + // does not re-mark the spaces as unoccupied. + layoutParent.removeViewInLayout(child); + if (child instanceof DropTarget) { + mDragController.removeDropTarget((DropTarget) child); + } + } else if (itemToRemove.container >= 0) { + // The item may belong to a folder. + View parent = idToViewMap.get(itemToRemove.container); + if (parent != null) { + ((FolderInfo) parent.getTag()).remove((ShortcutInfo) itemToRemove, false); + } + } } } @@ -4133,8 +4103,9 @@ public class Workspace extends PagedView public void removeAbandonedPromise(String packageName, UserHandleCompat user) { HashSet packages = new HashSet<>(1); packages.add(packageName); - LauncherModel.deletePackageFromDatabase(mLauncher, packageName, user); - removeItemsByMatcher(ItemInfoMatcher.ofPackages(packages, user)); + ItemInfoMatcher matcher = ItemInfoMatcher.ofPackages(packages, user); + LauncherModel.deleteItemsFromDatabase(mLauncher, matcher); + removeItemsByMatcher(matcher); } public void updateRestoreItems(final HashSet updates) { @@ -4311,7 +4282,6 @@ public class Workspace extends PagedView @Override public boolean evaluate(ItemInfo info, View view) { if (view instanceof PendingAppWidgetHostView && mInfos.contains(info)) { - PendingAppWidgetHostView hostView = (PendingAppWidgetHostView) view; mLauncher.removeItem(view, info, false /* deleteFromDb */); mLauncher.bindAppWidget((LauncherAppWidgetInfo) info); } diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index 46e9184b4..8f985c344 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -18,7 +18,9 @@ package com.android.launcher3.util; import android.content.ComponentName; +import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserHandleCompat; @@ -33,6 +35,46 @@ public abstract class ItemInfoMatcher { public abstract boolean matches(ItemInfo info, ComponentName cn); + /** + * Filters {@param infos} to those satisfying the {@link #matches(ItemInfo, ComponentName)}. + */ + public final HashSet filterItemInfos(Iterable infos) { + HashSet filtered = new HashSet<>(); + for (ItemInfo i : infos) { + if (i instanceof ShortcutInfo) { + ShortcutInfo info = (ShortcutInfo) i; + ComponentName cn = info.getTargetComponent(); + if (cn != null && matches(info, cn)) { + filtered.add(info); + } + } else if (i instanceof FolderInfo) { + FolderInfo info = (FolderInfo) i; + for (ShortcutInfo s : info.contents) { + ComponentName cn = s.getTargetComponent(); + if (cn != null && matches(s, cn)) { + filtered.add(s); + } + } + } else if (i instanceof LauncherAppWidgetInfo) { + LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) i; + ComponentName cn = info.providerName; + if (cn != null && matches(info, cn)) { + filtered.add(info); + } + } + } + return filtered; + } + + public static ItemInfoMatcher ofUser(final UserHandleCompat user) { + return new ItemInfoMatcher() { + @Override + public boolean matches(ItemInfo info, ComponentName cn) { + return info.user.equals(user); + } + }; + } + public static ItemInfoMatcher ofComponents( final HashSet components, final UserHandleCompat user) { return new ItemInfoMatcher() { diff --git a/src/com/android/launcher3/util/StringFilter.java b/src/com/android/launcher3/util/StringFilter.java deleted file mode 100644 index f539ad11e..000000000 --- a/src/com/android/launcher3/util/StringFilter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.android.launcher3.util; - -import java.util.Set; - -/** - * Abstract class to filter a set of strings. - */ -public abstract class StringFilter { - - private StringFilter() { } - - public abstract boolean matches(String str); - - public static StringFilter matchesAll() { - return new StringFilter() { - @Override - public boolean matches(String str) { - return true; - } - }; - } - - public static StringFilter of(final Set validEntries) { - return new StringFilter() { - @Override - public boolean matches(String str) { - return validEntries.contains(str); - } - }; - } -} -- cgit v1.2.3