package org.holoeverywhere.internal;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.holoeverywhere.IHoloActivity;
import org.holoeverywhere.app.Application;
import org.holoeverywhere.preference.SharedPreferences;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build.VERSION;
import android.util.Log;
public final class _SharedPreferencesImpl_XML implements SharedPreferences {
private static final class BaseEditor implements Editor {
private android.content.SharedPreferences.Editor editor;
public BaseEditor(android.content.SharedPreferences.Editor editor) {
if (editor == null) {
throw new IllegalArgumentException(
"SharedPreferences.Editor can't be null");
}
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 putFloatSet(String key, Set<Float> value) {
return putSet(key, value);
}
@Override
public Editor putInt(String key, int value) {
editor.putInt(key, value);
return this;
}
@Override
public Editor putIntSet(String key, Set<Integer> value) {
return putSet(key, value);
}
@Override
public Editor putJSONArray(String key, JSONArray value) {
editor.putString(key, value.toString());
return this;
}
@Override
public Editor putJSONObject(String key, JSONObject value) {
editor.putString(key, value.toString());
return this;
}
@Override
public Editor putLong(String key, long value) {
editor.putLong(key, value);
return this;
}
@Override
public Editor putLongSet(String key, Set<Long> value) {
return putSet(key, value);
}
private Editor putSet(String key, Set<?> value) {
editor.putString(key, setToString(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>();
@SuppressWarnings("unchecked")
public static <T extends BaseOnSharedPreferenceChangeListener> T obtain(
SharedPreferences prefs,
OnSharedPreferenceChangeListener listener) {
if (!BaseOnSharedPreferenceChangeListener.instances
.containsKey(listener)) {
synchronized (BaseOnSharedPreferenceChangeListener.instances) {
if (!BaseOnSharedPreferenceChangeListener.instances
.containsKey(listener)) {
try {
BaseOnSharedPreferenceChangeListener.instances.put(
listener,
new BaseOnSharedPreferenceChangeListener(prefs, listener));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return (T) BaseOnSharedPreferenceChangeListener.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);
}
}
private static String setToString(Set<?> set) {
return new JSONArray(set).toString();
}
private static <T> Set<T> stringToSet(String string, Class<T> clazz) {
try {
JSONArray array = new JSONArray(string);
Set<T> set = new HashSet<T>(array.length());
for (int i = 0; i < array.length(); i++) {
set.add(clazz.cast(array.opt(i)));
}
return set;
} catch (ClassCastException e) {
Log.e(_SharedPreferencesImpl_XML.class.getSimpleName(), "Error of cast", e);
return null;
} catch (JSONException e) {
return null;
}
}
private final android.content.SharedPreferences prefs;
public _SharedPreferencesImpl_XML(Context context, String name, int mode) {
if (context instanceof IHoloActivity) {
prefs = ((IHoloActivity) context).superGetSharedPreferences(name,
mode);
} else if (context instanceof Application) {
prefs = ((Application) context).superGetSharedPreferences(name,
mode);
} else {
prefs = context.getSharedPreferences(name, mode);
}
}
@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 Set<Float> getFloatSet(String key, Set<Float> defValue) {
return getSet(key, defValue, Float.class);
}
@Override
public int getInt(String key, int defValue) {
return prefs.getInt(key, defValue);
}
@Override
public Set<Integer> getIntSet(String key, Set<Integer> defValue) {
return getSet(key, defValue, Integer.class);
}
@Override
public JSONArray getJSONArray(String key, JSONArray defValue) {
String s = prefs.getString(key, null);
try {
return s == null ? defValue : new JSONArray(s);
} catch (JSONException e) {
return new JSONArray();
}
}
@Override
public JSONObject getJSONObject(String key, JSONObject defValue) {
String s = prefs.getString(key, null);
try {
return s == null ? defValue : new JSONObject(s);
} catch (JSONException e) {
return new JSONObject();
}
}
@Override
public long getLong(String key, long defValue) {
return prefs.getLong(key, defValue);
}
@Override
public Set<Long> getLongSet(String key, Set<Long> defValue) {
return getSet(key, defValue, Long.class);
}
private <T> Set<T> getSet(String key, Set<T> defValue, Class<T> clazz) {
String s = prefs.getString(key, null);
if (s == null) {
return defValue;
} else {
return stringToSet(s, clazz);
}
}
@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 {
return getSet(key, defValue, String.class);
}
}
@Override
public void registerOnSharedPreferenceChangeListener(
android.content.SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefs.registerOnSharedPreferenceChangeListener(listener);
}
@Override
public void registerOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener listener) {
registerOnSharedPreferenceChangeListener(BaseOnSharedPreferenceChangeListener
.obtain(this, listener));
}
@Override
public void unregisterOnSharedPreferenceChangeListener(
android.content.SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefs.unregisterOnSharedPreferenceChangeListener(listener);
}
@Override
public void unregisterOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener listener) {
unregisterOnSharedPreferenceChangeListener(BaseOnSharedPreferenceChangeListener
.obtain(this, listener));
}
}