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