12cdde11355e7c249e83a8b7aaabae5977bbc3e49Phil Goodwinpackage com.xtremelabs.robolectric.tester.android.content; 24610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 34610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richardimport android.content.SharedPreferences; 44610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 557fc28077e1c704ced682e23c19987b1514f5aa3Daveimport java.util.*; 64610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 74610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richardpublic class TestSharedPreferences implements SharedPreferences { 84610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 99ae1d769a5136e8382d7712bb9afc4fedb6d0060David Farber & Lowell Kirsh public Map<String, Map<String, Object>> content; 10d0cb59970def5b7bbad64be64abec240522ae885Aaron Day protected String filename; 114610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public int mode; 124610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1357fc28077e1c704ced682e23c19987b1514f5aa3Dave private ArrayList<OnSharedPreferenceChangeListener> listeners; 1457fc28077e1c704ced682e23c19987b1514f5aa3Dave 15d0cb59970def5b7bbad64be64abec240522ae885Aaron Day public TestSharedPreferences(Map<String, Map<String, Object>> content, 16d0cb59970def5b7bbad64be64abec240522ae885Aaron Day String name, int mode) { 175ae1c7fd48d3a37bab8af74fec0f70f0a0935f49Christian Williams & Phil Goodwin this.content = content; 184610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard this.filename = name; 194610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard this.mode = mode; 204610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard if (!content.containsKey(name)) { 219ae1d769a5136e8382d7712bb9afc4fedb6d0060David Farber & Lowell Kirsh content.put(name, new HashMap<String, Object>()); 224610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 2357fc28077e1c704ced682e23c19987b1514f5aa3Dave 2457fc28077e1c704ced682e23c19987b1514f5aa3Dave listeners = new ArrayList<OnSharedPreferenceChangeListener>(); 254610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 264610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 274610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 284610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Map<String, ?> getAll() { 29ec5c13d232156c003b0bc8ef62989a9824fe50d3pivotal-intonow return new HashMap<String, Object>(content.get(filename)); 304610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 314610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 324610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 334610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public String getString(String key, String defValue) { 344610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return (String) getValue(key, defValue); 354610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 364610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 374610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard private Object getValue(String key, Object defValue) { 389ae1d769a5136e8382d7712bb9afc4fedb6d0060David Farber & Lowell Kirsh Map<String, Object> fileHash = content.get(filename); 39382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard if (fileHash != null) { 40382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard Object value = fileHash.get(key); 41382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard if (value != null) { 42382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard return value; 43382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard } 444610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 45382df616dd52730a354a4c8e6fa466465bcd4488Ian Fisher & Ryan Richard return defValue; 464610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 474610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 484610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 494610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public int getInt(String key, int defValue) { 504610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return (Integer) getValue(key, defValue); 514610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 524610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 534610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 544610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public long getLong(String key, long defValue) { 554610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return (Long) getValue(key, defValue); 564610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 574610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 584610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 594610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public float getFloat(String key, float defValue) { 604610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return (Float) getValue(key, defValue); 614610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 624610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 634610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 644610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public boolean getBoolean(String key, boolean defValue) { 654610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return (Boolean) getValue(key, defValue); 664610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 674610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 684610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 694610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public boolean contains(String key) { 700893fb5169505a145b7c0b7312dd7f64222843b1Christian Williams return content.get(filename).containsKey(key); 714610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 724610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 734610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 744610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor edit() { 75ff7b3572235b9dee6ac969e70287e2f7343e2edcPhil Goodwin & Tyler Schultz return new TestSharedPreferencesEditor(); 764610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 774610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 784610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 79d0cb59970def5b7bbad64be64abec240522ae885Aaron Day public void registerOnSharedPreferenceChangeListener( 80d0cb59970def5b7bbad64be64abec240522ae885Aaron Day OnSharedPreferenceChangeListener listener) { 8157fc28077e1c704ced682e23c19987b1514f5aa3Dave if(!listeners.contains(listener)) 8257fc28077e1c704ced682e23c19987b1514f5aa3Dave listeners.add(listener); 834610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 844610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 854610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 86d0cb59970def5b7bbad64be64abec240522ae885Aaron Day public void unregisterOnSharedPreferenceChangeListener( 87d0cb59970def5b7bbad64be64abec240522ae885Aaron Day OnSharedPreferenceChangeListener listener) { 8857fc28077e1c704ced682e23c19987b1514f5aa3Dave if(listeners.contains(listener)) 8957fc28077e1c704ced682e23c19987b1514f5aa3Dave listeners.remove(listener); 9057fc28077e1c704ced682e23c19987b1514f5aa3Dave } 9157fc28077e1c704ced682e23c19987b1514f5aa3Dave 9257fc28077e1c704ced682e23c19987b1514f5aa3Dave public boolean hasListener(OnSharedPreferenceChangeListener listener) { 9357fc28077e1c704ced682e23c19987b1514f5aa3Dave return listeners.contains(listener); 944610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 954610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 96ff7b3572235b9dee6ac969e70287e2f7343e2edcPhil Goodwin & Tyler Schultz private class TestSharedPreferencesEditor implements Editor { 974610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 989ae1d769a5136e8382d7712bb9afc4fedb6d0060David Farber & Lowell Kirsh Map<String, Object> editsThatNeedCommit = new HashMap<String, Object>(); 9940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams Set<String> editsThatNeedRemove = new HashSet<String>(); 1004610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard private boolean shouldClearOnCommit = false; 1014610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1024610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1034610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor putString(String key, String value) { 1044610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard editsThatNeedCommit.put(key, value); 10540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.remove(key); 1064610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1074610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1084610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1094610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1104610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor putInt(String key, int value) { 1114610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard editsThatNeedCommit.put(key, value); 11240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.remove(key); 1134610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1144610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1154610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1164610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1174610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor putLong(String key, long value) { 1184610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard editsThatNeedCommit.put(key, value); 11940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.remove(key); 1204610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1214610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1224610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1234610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1244610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor putFloat(String key, float value) { 1254610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard editsThatNeedCommit.put(key, value); 12640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.remove(key); 1274610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1284610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1294610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1304610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1314610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor putBoolean(String key, boolean value) { 1324610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard editsThatNeedCommit.put(key, value); 13340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.remove(key); 1344610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1354610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1364610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1374610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1384610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor remove(String key) { 13940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams editsThatNeedRemove.add(key); 1407969d7eda6d9477ee8dde60ba19e51715ce7d2dcMichael Portuesi return this; 1414610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1424610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1434610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1444610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public Editor clear() { 1454610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard shouldClearOnCommit = true; 1464610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard return this; 1474610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1484610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard 1494610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard @Override 1504610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard public boolean commit() { 151cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz Map<String, Object> previousContent = content.get(filename); 152cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz if (shouldClearOnCommit) { 153cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz previousContent.clear(); 154cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz } else { 155cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz for (String key : editsThatNeedCommit.keySet()) { 156cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz previousContent.put(key, editsThatNeedCommit.get(key)); 1574610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1587969d7eda6d9477ee8dde60ba19e51715ce7d2dcMichael Portuesi for (String key : editsThatNeedRemove) { 15940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams previousContent.remove(key); 1607969d7eda6d9477ee8dde60ba19e51715ce7d2dcMichael Portuesi } 1614610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 162d0cb59970def5b7bbad64be64abec240522ae885Aaron Day 163d0cb59970def5b7bbad64be64abec240522ae885Aaron Day for (String key : editsThatNeedCommit.keySet()) { 164d0cb59970def5b7bbad64be64abec240522ae885Aaron Day previousContent.put(key, editsThatNeedCommit.get(key)); 165d0cb59970def5b7bbad64be64abec240522ae885Aaron Day } 166d0cb59970def5b7bbad64be64abec240522ae885Aaron Day 167cb3e68e10f4fcb059e68849694fc4d61e4b110d3Ian Fisher & Tyler Schultz return true; 1684610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 1691bd81c8df1eab3bc9a15cfe6f8c8a702f02d77f9Phil Goodwin & Tyler Schultz 170ec5c13d232156c003b0bc8ef62989a9824fe50d3pivotal-intonow @Override 171ec5c13d232156c003b0bc8ef62989a9824fe50d3pivotal-intonow public void apply() { 172ff7b3572235b9dee6ac969e70287e2f7343e2edcPhil Goodwin & Tyler Schultz commit(); 1731bd81c8df1eab3bc9a15cfe6f8c8a702f02d77f9Phil Goodwin & Tyler Schultz } 174e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi 175e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi @Override 176e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi public Editor putStringSet(String key, Set<String> values) { 177e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi return this; 178e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi } 1794610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard } 180e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi 181e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi @Override 182e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi public Set<String> getStringSet(String key, Set<String> defValues) { 183e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi return null; 184e057483dbccea1e7373aed776bb14ef85aaa93c7Michael Portuesi } 1854610f4e5bfec32ab53d6b54ab5df88301f403a0dIan Fisher & Ryan Richard} 186