package cgeo.geocaching.command; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.storage.DataStore; import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Removes the caches of the selected list from all other lists. */ public abstract class MakeListUniqueCommand extends AbstractCommand { private final int listId; @NonNull private final Map<String, Set<Integer>> oldLists = new HashMap<>(); public MakeListUniqueCommand(@NonNull final Activity context, final int listId) { super(context); this.listId = listId; } @Override protected void doCommand() { final SearchResult search = DataStore.getBatchOfStoredCaches(null, CacheType.ALL, listId); final Set<Geocache> caches = DataStore.loadCaches(search.getGeocodes(), LoadFlags.LOAD_CACHE_OR_DB); for (final Geocache geocache : caches) { final HashSet<Integer> backupOfLists = new HashSet<>(geocache.getLists()); final String geocode = geocache.getGeocode(); // remove the current list, since that will ease the undo operation backupOfLists.remove(listId); oldLists.put(geocode, backupOfLists); } final List<StoredList> lists = DataStore.getLists(); for (final StoredList list : lists) { if (list.id == listId) { continue; } DataStore.removeFromList(caches, list.id); } } @Override protected void undoCommand() { final Set<Geocache> caches = DataStore.loadCaches(oldLists.keySet(), LoadFlags.LOAD_CACHE_OR_DB); DataStore.addToLists(caches, oldLists); } @Override @Nullable protected String getResultMessage() { return getContext().getString(R.string.command_unique_list_result); } }