package me.barrasso.android.volume.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Property;
import java.util.Set;
/**
* Simple helper class to deal with getting/ setting {@link android.util.Property} values
* as well as generic helper methods for setting/ getting preferences.
*/
public final class SettingsHelper {
private static SettingsHelper mHelper;
public static synchronized SettingsHelper getInstance(Context context) {
if (null == mHelper)
mHelper = new SettingsHelper(context);
return mHelper;
}
private final SharedPreferences mPreferences;
private SettingsHelper(Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public SharedPreferences getSharedPreferences() { return mPreferences; }
private SharedPreferences.Editor edit() {
return mPreferences.edit();
}
public void registerOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
mPreferences.registerOnSharedPreferenceChangeListener(listener);
}
public void unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
mPreferences.unregisterOnSharedPreferenceChangeListener(listener);
}
/** @return The preference name for a given property. */
public <T, E> String getName(Class<T> clazz, Property<T, E> property) {
return clazz.getSimpleName() + '_' + property.getName();
}
public <T, E> int getIntProperty(Class<T> clazz, Property<T, E> property, int defVal)
throws ClassCastException, NumberFormatException {
return Integer.parseInt(get(getName(clazz, property), String.valueOf(defVal)), 10);
}
/**
* Sets the value for a given {@link android.util.Property}. Uses
* {@link android.content.SharedPreferences.Editor#apply()} to store asynchronously.
* @return True if the value was successfully applied, false if else.
* @throws ClassCastException If a type error occurred between SP and Property.
*/
@SuppressWarnings("unchecked")
public <T, E> boolean setProperty(Class<T> clazz, Property<T, E> property, E val)
throws ClassCastException {
Class<E> type = property.getType();
String name = getName(clazz, property);
SharedPreferences.Editor editor = edit();
// Handle all types supported by SharedPreferences.
if (type.equals(Integer.TYPE) || type.equals(Integer.class))
editor.putInt(name, (Integer) val);
else if (type.equals(String.class) || type.equals(CharSequence.class))
editor.putString(name, val.toString());
else if (type.equals(Boolean.TYPE) || type.equals(Boolean.class))
editor.putBoolean(name, (Boolean) val);
else if (type.equals(Long.TYPE) || type.equals(Long.class))
editor.putLong(name, (Long) val);
else if (type.equals(Float.TYPE) || type.equals(Float.class))
editor.putFloat(name, (Float) val);
else if (type.getClass().isAssignableFrom(Set.class))
editor.putStringSet(name, (Set<String>) val);
else
editor = null;
if (null == editor) return false;
editor.apply();
return true;
}
/** @see android.content.SharedPreferences#contains(String) */
public <T, V> boolean hasProperty(Class<T> clazz, Property<T, V> property) {
String name = getName(clazz, property);
return mPreferences.contains(name);
}
/**
* Retrieves the value stored in {@link android.content.SharedPreferences} for a
* given {@link android.util.Property} associated with a VolumePanel.
* @return The given value, {@code defVal} if none was set, or null is the
* value could not be retrieved.
* @throws ClassCastException If a type error occurred between SP and Property.
*/
@SuppressWarnings("unchecked")
public <T, E> E getProperty(Class<T> clazz, Property<T, E> property, E defVal)
throws ClassCastException {
Class<E> type = property.getType();
String name = getName(clazz, property);
// Handle all types supported by SharedPreferences.
if (type.equals(Integer.TYPE) || type.equals(Integer.class))
return (E) Integer.valueOf(mPreferences.getInt(name, (Integer) defVal));
else if (type.equals(String.class) || type.equals(CharSequence.class))
return (E) mPreferences.getString(name, ((defVal == null) ? (String) defVal : defVal.toString()));
else if (type.equals(Boolean.TYPE) || type.equals(Boolean.class))
return (E) Boolean.valueOf(mPreferences.getBoolean(name, (Boolean) defVal));
else if (type.equals(Long.TYPE) || type.equals(Long.class))
return (E) Long.valueOf(mPreferences.getLong(name, (Long) defVal));
else if (type.equals(Float.TYPE) || type.equals(Float.class))
return (E) Float.valueOf(mPreferences.getFloat(name, (Float) defVal));
else if (type.getClass().isAssignableFrom(Set.class))
return (E) mPreferences.getStringSet(name, (Set<String>) defVal);
return defVal;
}
/** Generic get method, default value cannot be null! */
@SuppressWarnings("unchecked")
public final <T> T get(final String name, T defValue) {
if (TextUtils.isEmpty(name) || null == defValue) return null;
if (defValue instanceof Boolean)
return (T) Boolean.valueOf(mPreferences.getBoolean(name, (Boolean) defValue));
else if (defValue instanceof String)
return (T) String.valueOf(mPreferences.getString(name, (String) defValue));
else if (defValue instanceof Float)
return (T) Float.valueOf(mPreferences.getFloat(name, (Float) defValue));
else if (defValue instanceof Integer)
return (T) Integer.valueOf(mPreferences.getInt(name, (Integer) defValue));
else if (defValue instanceof Long)
return (T) Long.valueOf(mPreferences.getLong(name, (Long) defValue));
else if (defValue.getClass().isAssignableFrom(Set.class))
return (T) mPreferences.getStringSet(name, (Set<String>) defValue);
return defValue;
}
/** Generic set method, default value cannot be null! */
@SuppressWarnings("unchecked")
public final <T> boolean set(final String name, T value) {
if (TextUtils.isEmpty(name) || null == value) return false;
SharedPreferences.Editor editor = edit();
if (value instanceof Boolean)
editor.putBoolean(name, (Boolean) value);
else if (value instanceof String)
editor.putString(name, (String) value);
else if (value instanceof Float)
editor.putFloat(name, (Float) value);
else if (value instanceof Integer)
editor.putInt(name, (Integer) value);
else if (value instanceof Long)
editor.putLong(name, (Long) value);
else if (value.getClass().isAssignableFrom(Set.class))
editor.putStringSet(name, (Set<String>) value);
else
editor = null;
if (null == editor) return false;
editor.apply();
return true;
}
}