package com.jdroid.android.utils; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.preference.PreferenceManager; import com.jdroid.android.application.AbstractApplication; import com.jdroid.java.collections.Lists; import com.jdroid.java.utils.LoggerUtils; import com.jdroid.java.utils.StringUtils; import org.slf4j.Logger; import java.util.List; import java.util.Map; /** * Helper to work with the shared preferences */ public class SharedPreferencesHelper { private static final Logger LOGGER = LoggerUtils.getLogger(SharedPreferencesHelper.class); private static SharedPreferencesHelper defaultSharedPreferencesHelper = new SharedPreferencesHelper(null); private String name; private SharedPreferences sharedPreferences; public static SharedPreferencesHelper get(String name) { return new SharedPreferencesHelper(name); } public static SharedPreferencesHelper get() { return defaultSharedPreferencesHelper; } public SharedPreferencesHelper(String name) { this.name = name; this.sharedPreferences = getSharedPreferences(); } public Editor getEditor() { return sharedPreferences.edit(); } public SharedPreferences getSharedPreferences() { if (name != null) { return AbstractApplication.get().getSharedPreferences(name, Context.MODE_PRIVATE); } else { return PreferenceManager.getDefaultSharedPreferences(AbstractApplication.get()); } } private void logSave(String key, Object value) { if (name != null) { LOGGER.info("Saved [" + name + "] preference. Key [" + key + "] Value [" + value + "]"); } else { LOGGER.info("Saved preference. Key [" + key + "] Value [" + value + "]"); } } public void savePreference(String key, String value) { Editor editor = getEditor(); editor.putString(key, value); editor.commit(); logSave(key, value); } public void savePreferenceAsync(String key, String value) { Editor editor = getEditor(); editor.putString(key, value); editor.apply(); logSave(key, value); } public void savePreference(String key, Boolean value) { Editor editor = getEditor(); editor.putBoolean(key, value); editor.commit(); logSave(key, value); } public void savePreferenceAsync(String key, Boolean value) { Editor editor = getEditor(); editor.putBoolean(key, value); editor.apply(); logSave(key, value); } public void savePreference(String key, Integer value) { Editor editor = getEditor(); editor.putInt(key, value); editor.commit(); logSave(key, value); } public void savePreferenceAsync(String key, Integer value) { Editor editor = getEditor(); editor.putInt(key, value); editor.apply(); logSave(key, value); } public void savePreference(String key, Long value) { Editor editor = getEditor(); editor.putLong(key, value); editor.commit(); logSave(key, value); } public void savePreferenceAsync(String key, Long value) { Editor editor = getEditor(); editor.putLong(key, value); editor.apply(); logSave(key, value); } public void savePreference(String key, Float value) { Editor editor = getEditor(); editor.putFloat(key, value); editor.commit(); logSave(key, value); } public void savePreference(String key, List<String> values) { savePreference(key, StringUtils.join(values)); } public void savePreferenceAsync(String key, Float value) { Editor editor = getEditor(); editor.putFloat(key, value); editor.apply(); logSave(key, value); } public void savePreferenceAsync(String key, List<String> values) { savePreferenceAsync(key, StringUtils.join(values)); } public void appendPreferenceAsync(String key, String value) { List<String> values = loadPreferenceAsStringList(key); values.add(value); savePreferenceAsync(key, values); } /** * Retrieves all the existent shared preferences. * * @return The shared preferences. */ public Map<String, ?> loadAllPreferences() { return sharedPreferences.getAll(); } private void logLoad(String key, Object value) { if (name != null) { LOGGER.info("Loaded [" + name + "] preference. Key [" + key + "] Value [" + value + "]"); } else { LOGGER.info("Loaded preference. Key [" + key + "] Value [" + value + "]"); } } /** * Retrieve a string value from the preferences. * * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return the preference value if it exists, or defaultValue. */ public String loadPreference(String key, String defaultValue) { String value = sharedPreferences.getString(key, defaultValue); logLoad(key, value); return value; } /** * Retrieve a string value from the preferences. * * @param key The name of the preference to retrieve * @return the preference value if it exists, or null. */ public String loadPreference(String key) { return loadPreference(key, null); } /** * Retrieve a boolean value from the preferences. * * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return the preference value if it exists, or defaultValue. */ public Boolean loadPreferenceAsBoolean(String key, Boolean defaultValue) { Boolean value = defaultValue; if (hasPreference(key)) { value = sharedPreferences.getBoolean(key, false); } logLoad(key, value); return value; } /** * Retrieve a boolean value from the preferences. * * @param key The name of the preference to retrieve * @return the preference value if it exists, or null. */ public Boolean loadPreferenceAsBoolean(String key) { return loadPreferenceAsBoolean(key, null); } /** * Retrieve a long value from the preferences. * * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return the preference value if it exists, or defaultValue. */ public Long loadPreferenceAsLong(String key, Long defaultValue) { Long value = defaultValue; if (hasPreference(key)) { value = sharedPreferences.getLong(key, 0L); } logLoad(key, value); return value; } /** * Retrieve a long value from the preferences. * * @param key The name of the preference to retrieve * @return the preference value if it exists, or null. */ public Long loadPreferenceAsLong(String key) { return loadPreferenceAsLong(key, null); } /** * Retrieve an Integer value from the preferences. * * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return the preference value if it exists, or defaultValue. */ public Integer loadPreferenceAsInteger(String key, Integer defaultValue) { Integer value = defaultValue; if (hasPreference(key)) { value = sharedPreferences.getInt(key, 0); } logLoad(key, value); return value; } /** * Retrieve an Integer value from the preferences. * * @param key The name of the preference to retrieve * @return the preference value if it exists, or null. */ public Integer loadPreferenceAsInteger(String key) { return loadPreferenceAsInteger(key, null); } /** * Retrieve a Float value from the preferences. * * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return the preference value if it exists, or defaultValue. */ public Float loadPreferenceAsFloat(String key, Float defaultValue) { Float value = defaultValue; if (hasPreference(key)) { value = sharedPreferences.getFloat(key, 0); } logLoad(key, value); return value; } /** * Retrieve a Float value from the preferences. * * @param key The name of the preference to retrieve * @return the preference value if it exists, or null. */ public Float loadPreferenceAsFloat(String key) { return loadPreferenceAsFloat(key, null); } public List<String> loadPreferenceAsStringList(String key) { String value = loadPreference(key); if (value != null) { return StringUtils.splitToListWithCommaSeparator(value); } return Lists.newArrayList(); } public boolean hasPreference(String key) { return sharedPreferences.contains(key); } public void removePreferences(String... keys) { Editor editor = getEditor(); for (String key : keys) { editor.remove(key); } editor.commit(); } public void removeAllPreferences() { Editor editor = getEditor(); editor.clear(); editor.commit(); } }