package com.camilstaps.common; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import org.json.JSONException; import java.text.ParseException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * A set of DatedStrings to store in SharedPreferences * @author Camil Staps */ public class DatedStringPreferenceSet { /** * Get a Set from the SharedPreferences * @param context * @param key the SharedPreferences key * @param type the type of DatedString to cast to * @return the set */ public static Set get(Context context, String key, Class type) { Set set = new HashSet<>(); for (String s : PreferenceManager.getDefaultSharedPreferences(context).getStringSet(key, new HashSet())) { try { set.add(type.cast(DatedString.fromString(s, type))); } catch (JSONException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } return set; } /** * Put a Set to the SharedPreferences * @param context * @param key the SharedPreferences key * @param set */ public static void put(Context context, String key, Set set) { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); Set putSet = new HashSet<>(); for (DatedString item : set) { putSet.add(item.toString()); } editor.putStringSet(key, putSet); editor.apply(); } /** * Add one DatedString to a set * @param context * @param key the SharedPreferences key * @param object the DatedString to add */ public static void add(Context context, String key, DatedString object) { Set set = (Set) DatedStringPreferenceSet.get(context, key, DatedString.class); set.add(object); DatedStringPreferenceSet.put(context, key, (Set) set); } /** * Remove all DatedStrings with the same Date as the given DatedString, and put this new DatedString if any object was removed * @param context * @param key the SharedPreferences key * @param object the object to 'update' */ public static void update(Context context, String key, DatedString object) { Set set = (Set) get(context, key, object.getClass()); Iterator iterator = set.iterator(); boolean add = false; while (iterator.hasNext()) { DatedString this_object = iterator.next(); if (this_object.getDate().equals(object.getDate())) { iterator.remove(); add = true; } } if (add) { set.add(object); } put(context, key, set); } /** * Check if a certain Date exists as the Date of a DatedString in some set * @param context * @param key the SharedPreferences key * @param date the Date * @return */ public static boolean has(Context context, String key, Date date) { Set set = (Set) get(context, key, DatedString.class); for (DatedString item : set) { if (item.getDate().equals(date)) { return true; } } return false; } /** * Update the object if it already exists, or add it if it doesn't * @see #update(android.content.Context, String, DatedString) * @see #add(android.content.Context, String, DatedString) * @param context * @param key the SharedPreferences key * @param object the object to 'update' or add */ public static void updateOrAdd(Context context, String key, DatedString object) { if (has(context, key, object.getDate())) { update(context, key, object); } else { add(context, key, object); } } /** * Remove all elements of a set * @param context * @param key the SharedPreferences key */ public static void clear(Context context, String key) { put(context, key, new HashSet()); } /** * Remove all elements with a certain Date from a set * @param context * @param key the SharedPreferences key * @param date the Date */ public static void remove(Context context, String key, Date date) { Set set = (Set) get(context, key, DatedString.class); Iterator iterator = set.iterator(); boolean add = false; while (iterator.hasNext()) { DatedString this_object = iterator.next(); if (this_object.getDate().equals(date)) { iterator.remove(); } } put(context, key, set); } }