Merge "Using ItemInfoMatcher in place of similar interfaces and utility methods" into ub-launcher3-master
This commit is contained in:
@@ -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<AppInfo> 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);
|
||||
}
|
||||
|
||||
@@ -4449,14 +4449,6 @@ public class Launcher extends Activity
|
||||
return sCustomAppWidgets;
|
||||
}
|
||||
|
||||
public static List<View> 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;
|
||||
|
||||
@@ -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<ComponentKey, String> 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<ItemInfo> 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<ItemInfo> items = new ArrayList<ItemInfo>();
|
||||
ArrayList<ItemInfo> 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<? extends ItemInfo> items) {
|
||||
static void deleteItemsFromDatabase(Context context, final Iterable<? extends ItemInfo> 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<String> packageSet = new HashSet<>(Arrays.asList(packages));
|
||||
switch (mOp) {
|
||||
case OP_ADD: {
|
||||
for (int i=0; i<N; i++) {
|
||||
@@ -3051,15 +3035,15 @@ public class LauncherModel extends BroadcastReceiver
|
||||
FlagOp.addFlag(ShortcutInfo.FLAG_DISABLED_SUSPENDED) :
|
||||
FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_SUSPENDED);
|
||||
if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.(un)suspend " + N);
|
||||
mBgAllAppsList.updatePackageFlags(pkgFilter, mUser, flagOp);
|
||||
mBgAllAppsList.updateDisabledFlags(
|
||||
ItemInfoMatcher.ofPackages(packageSet, mUser), flagOp);
|
||||
break;
|
||||
case OP_USER_AVAILABILITY_CHANGE:
|
||||
flagOp = UserManagerCompat.getInstance(context).isQuietModeEnabled(mUser)
|
||||
? FlagOp.addFlag(ShortcutInfo.FLAG_DISABLED_QUIET_USER)
|
||||
: FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_QUIET_USER);
|
||||
// We want to update all packages for this user.
|
||||
pkgFilter = StringFilter.matchesAll();
|
||||
mBgAllAppsList.updatePackageFlags(pkgFilter, mUser, flagOp);
|
||||
mBgAllAppsList.updateDisabledFlags(ItemInfoMatcher.ofUser(mUser), flagOp);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3108,9 +3092,9 @@ public class LauncherModel extends BroadcastReceiver
|
||||
|
||||
// Update shortcut infos
|
||||
if (mOp == OP_ADD || flagOp != FlagOp.NO_OP) {
|
||||
final ArrayList<ShortcutInfo> updatedShortcuts = new ArrayList<ShortcutInfo>();
|
||||
final ArrayList<ShortcutInfo> removedShortcuts = new ArrayList<ShortcutInfo>();
|
||||
final ArrayList<LauncherAppWidgetInfo> widgets = new ArrayList<LauncherAppWidgetInfo>();
|
||||
final ArrayList<ShortcutInfo> updatedShortcuts = new ArrayList<>();
|
||||
final ArrayList<ShortcutInfo> removedShortcuts = new ArrayList<>();
|
||||
final ArrayList<LauncherAppWidgetInfo> 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<ItemInfo> filterItemInfos(Iterable<ItemInfo> infos,
|
||||
ItemInfoFilter f) {
|
||||
HashSet<ItemInfo> filtered = new HashSet<ItemInfo>();
|
||||
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<ItemInfo>(filtered);
|
||||
}
|
||||
|
||||
@Thunk ArrayList<ItemInfo> 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.
|
||||
*/
|
||||
|
||||
@@ -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<ItemInfo, View> children = new HashMap<>();
|
||||
LongArrayMap<View> idToViewMap = new LongArrayMap<>();
|
||||
ArrayList<ItemInfo> items = new ArrayList<>();
|
||||
for (int j = 0; j < layout.getChildCount(); j++) {
|
||||
final View view = layout.getChildAt(j);
|
||||
children.put((ItemInfo) view.getTag(), view);
|
||||
if (view.getTag() instanceof ItemInfo) {
|
||||
ItemInfo item = (ItemInfo) view.getTag();
|
||||
items.add(item);
|
||||
idToViewMap.put(item.id, view);
|
||||
}
|
||||
}
|
||||
|
||||
final ArrayList<View> childrenToRemove = new ArrayList<>();
|
||||
final HashMap<FolderInfo, ArrayList<ShortcutInfo>> 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<ShortcutInfo> appsToRemove;
|
||||
if (folderAppsToRemove.containsKey(folder)) {
|
||||
appsToRemove = folderAppsToRemove.get(folder);
|
||||
} else {
|
||||
appsToRemove = new ArrayList<ShortcutInfo>();
|
||||
folderAppsToRemove.put(folder, appsToRemove);
|
||||
}
|
||||
appsToRemove.add((ShortcutInfo) info);
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if (matcher.matches(info, cn)) {
|
||||
childrenToRemove.add(children.get(info));
|
||||
return true;
|
||||
}
|
||||
for (ItemInfo itemToRemove : matcher.filterItemInfos(items)) {
|
||||
View child = idToViewMap.get(itemToRemove.id);
|
||||
|
||||
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);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
LauncherModel.filterItemInfos(children.keySet(), filter);
|
||||
|
||||
// Remove all the apps from their folders
|
||||
for (FolderInfo folder : folderAppsToRemove.keySet()) {
|
||||
ArrayList<ShortcutInfo> appsToRemove = folderAppsToRemove.get(folder);
|
||||
for (ShortcutInfo info : appsToRemove) {
|
||||
folder.remove(info, false);
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
if (childrenToRemove.size() > 0) {
|
||||
layout.requestLayout();
|
||||
layout.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4133,8 +4103,9 @@ public class Workspace extends PagedView
|
||||
public void removeAbandonedPromise(String packageName, UserHandleCompat user) {
|
||||
HashSet<String> 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<ItemInfo> 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);
|
||||
}
|
||||
|
||||
@@ -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<ItemInfo> filterItemInfos(Iterable<ItemInfo> infos) {
|
||||
HashSet<ItemInfo> 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<ComponentName> components, final UserHandleCompat user) {
|
||||
return new ItemInfoMatcher() {
|
||||
|
||||
@@ -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<String> validEntries) {
|
||||
return new StringFilter() {
|
||||
@Override
|
||||
public boolean matches(String str) {
|
||||
return validEntries.contains(str);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user