Instantly share code, notes, and snippets.
Created
October 5, 2015 04:15
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save f2prateek/c555bbd7e417cd1518dc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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