Skip to content

Instantly share code, notes, and snippets.

@f2prateek
Created October 5, 2015 04:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save f2prateek/c555bbd7e417cd1518dc to your computer and use it in GitHub Desktop.
Save f2prateek/c555bbd7e417cd1518dc to your computer and use it in GitHub Desktop.
package com.f2prateek.rx.preferences;
import android.content.SharedPreferences;
import android.support.annotation.Nullable;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public class InMemorySharedPreferences implements SharedPreferences {
private final Map<String, Object> map;
private final Set<SharedPreferences.OnSharedPreferenceChangeListener> listeners;
public InMemorySharedPreferences() {
map = Collections.synchronizedMap(new LinkedHashMap<String, Object>());
listeners = Collections.synchronizedSet(new LinkedHashSet<OnSharedPreferenceChangeListener>());
}
@Override public Map<String, ?> getAll() {
return map;
}
@Nullable @Override public String getString(String key, String defValue) {
return get(key, defValue);
}
@Nullable @Override public Set<String> getStringSet(String key, Set<String> defValues) {
return get(key, defValues);
}
@Override public int getInt(String key, int defValue) {
return get(key, defValue);
}
@Override public long getLong(String key, long defValue) {
return get(key, defValue);
}
@Override public float getFloat(String key, float defValue) {
return get(key, defValue);
}
@Override public boolean getBoolean(String key, boolean defValue) {
return get(key, defValue);
}
private <T> T get(String key, T defValue) {
if (map.containsKey(key)) {
try {
return (T) map.get(key);
} catch (ClassCastException e) {
return defValue;
}
}
return defValue;
}
@Override public boolean contains(String key) {
return map.containsKey(key);
}
@Override public Editor edit() {
return new Editor() {
private final Map<String, Object> edits =
Collections.synchronizedMap(new LinkedHashMap<String, Object>());
private boolean clear;
@Override public Editor putString(String key, String value) {
edits.put(key, value);
return this;
}
@Override public Editor putStringSet(String key, Set<String> values) {
edits.put(key, values);
return this;
}
@Override public Editor putInt(String key, int value) {
edits.put(key, value);
return this;
}
@Override public Editor putLong(String key, long value) {
edits.put(key, value);
return this;
}
@Override public Editor putFloat(String key, float value) {
edits.put(key, value);
return this;
}
@Override public Editor putBoolean(String key, boolean value) {
edits.put(key, value);
return this;
}
@Override public Editor remove(String key) {
edits.put(key, this);
return this;
}
@Override public Editor clear() {
clear = true;
return this;
}
@Override public boolean commit() {
if (clear) {
for (String key : map.keySet()) {
map.remove(key);
for (OnSharedPreferenceChangeListener listener : listeners) {
listener.onSharedPreferenceChanged(InMemorySharedPreferences.this, key);
}
}
return true;
}
for (Map.Entry<String, Object> entry : edits.entrySet()) {
if (entry.getValue() == this) {
map.remove(entry.getKey());
} else {
map.remove(entry.getKey());
}
for (OnSharedPreferenceChangeListener listener : listeners) {
listener.onSharedPreferenceChanged(InMemorySharedPreferences.this, entry.getKey());
}
}
return true;
}
@Override public void apply() {
commit();
}
};
}
@Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
listeners.add(listener);
}
@Override public void unregisterOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener listener) {
listeners.remove(listener);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment