package com.WazaBe.HoloEverywhere.util;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.json.JSONArray;
import org.json.JSONException;
import android.annotation.SuppressLint;
import android.os.Build.VERSION;
import com.WazaBe.HoloEverywhere.preference.SharedPreferences;
public class BaseSharedPreferences implements SharedPreferences {
public static class BaseEditor implements Editor {
private android.content.SharedPreferences.Editor editor;
public BaseEditor(android.content.SharedPreferences.Editor editor) {
this.editor = editor;
}
@Override
@SuppressLint("NewApi")
public void apply() {
if (VERSION.SDK_INT >= 9) {
editor.apply();
} else {
editor.commit();
}
}
@Override
public Editor clear() {
editor.clear();
return this;
}
@Override
public boolean commit() {
return editor.commit();
}
@Override
public Editor putBoolean(String key, boolean value) {
editor.putBoolean(key, value);
return this;
}
@Override
public Editor putFloat(String key, float value) {
editor.putFloat(key, value);
return this;
}
@Override
public Editor putInt(String key, int value) {
editor.putFloat(key, value);
return this;
}
@Override
public Editor putLong(String key, long value) {
editor.putLong(key, value);
return this;
}
@Override
public Editor putString(String key, String value) {
editor.putString(key, value);
return this;
}
@Override
@SuppressLint("NewApi")
public Editor putStringSet(String key, Set<String> value) {
if (VERSION.SDK_INT >= 11) {
editor.putStringSet(key, value);
} else {
editor.putString(key, setToString(value));
}
return this;
}
@Override
public Editor remove(String key) {
editor.remove(key);
return this;
}
}
public static class BaseOnSharedPreferenceChangeListener implements
android.content.SharedPreferences.OnSharedPreferenceChangeListener {
private static final Map<OnSharedPreferenceChangeListener, BaseOnSharedPreferenceChangeListener> instances = new HashMap<SharedPreferences.OnSharedPreferenceChangeListener, BaseOnSharedPreferenceChangeListener>();
public static BaseOnSharedPreferenceChangeListener obtain(
SharedPreferences prefs,
OnSharedPreferenceChangeListener listener) {
return obtain(prefs, listener,
BaseOnSharedPreferenceChangeListener.class);
}
@SuppressWarnings("unchecked")
public static <T extends BaseOnSharedPreferenceChangeListener> T obtain(
SharedPreferences prefs,
OnSharedPreferenceChangeListener listener, Class<T> clazz) {
if (!instances.containsKey(listener)) {
synchronized (instances) {
if (!instances.containsKey(listener)) {
try {
Constructor<T> constructor = clazz.getConstructor(
SharedPreferences.class,
OnSharedPreferenceChangeListener.class);
constructor.setAccessible(true);
instances.put(listener,
constructor.newInstance(prefs, listener));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return (T) instances.get(listener);
}
private OnSharedPreferenceChangeListener listener;
private SharedPreferences prefs;
public BaseOnSharedPreferenceChangeListener(SharedPreferences prefs,
OnSharedPreferenceChangeListener listener) {
this.prefs = prefs;
this.listener = listener;
}
@Override
public void onSharedPreferenceChanged(
android.content.SharedPreferences sharedPreferences, String key) {
listener.onSharedPreferenceChanged(prefs, key);
}
}
public static String setToString(Set<String> set) {
return new JSONArray(set).toString();
}
public static Set<String> stringToSet(String string) {
try {
JSONArray array = new JSONArray(string);
Set<String> set = new HashSet<String>(array.length());
for (int i = 0; i < array.length(); i++) {
set.add(array.getString(i));
}
return set;
} catch (JSONException e) {
return null;
}
}
private final android.content.SharedPreferences prefs;
public BaseSharedPreferences(android.content.SharedPreferences prefs) {
this.prefs = prefs;
}
@Override
public boolean contains(String key) {
return prefs.contains(key);
}
@Override
public Editor edit() {
return new BaseEditor(prefs.edit());
}
@Override
public Map<String, ?> getAll() {
return prefs.getAll();
}
@Override
public boolean getBoolean(String key, boolean defValue) {
return prefs.getBoolean(key, defValue);
}
@Override
public float getFloat(String key, float defValue) {
return prefs.getFloat(key, defValue);
}
@Override
public int getInt(String key, int defValue) {
return prefs.getInt(key, defValue);
}
@Override
public long getLong(String key, long defValue) {
return prefs.getLong(key, defValue);
}
@Override
public android.content.SharedPreferences getPreferences() {
return prefs;
}
@Override
public String getString(String key, String defValue) {
return prefs.getString(key, defValue);
}
@SuppressLint("NewApi")
@Override
public Set<String> getStringSet(String key, Set<String> defValue) {
if (VERSION.SDK_INT >= 11) {
return prefs.getStringSet(key, defValue);
} else {
String s = prefs.getString(key, null);
if (s == null) {
return defValue;
} else {
return stringToSet(s);
}
}
}
@Override
public void registerOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener listener) {
prefs.registerOnSharedPreferenceChangeListener(BaseOnSharedPreferenceChangeListener
.obtain(this, listener));
}
@Override
public void unregisterOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener listener) {
prefs.unregisterOnSharedPreferenceChangeListener(BaseOnSharedPreferenceChangeListener
.obtain(this, listener));
}
}