1package com.xtremelabs.robolectric.tester.android.content;
2
3import android.content.SharedPreferences;
4
5import java.util.*;
6
7public class TestSharedPreferences implements SharedPreferences {
8
9    public Map<String, Map<String, Object>> content;
10    protected String filename;
11    public int mode;
12
13    private ArrayList<OnSharedPreferenceChangeListener> listeners;
14
15    public TestSharedPreferences(Map<String, Map<String, Object>> content,
16            String name, int mode) {
17        this.content = content;
18        this.filename = name;
19        this.mode = mode;
20        if (!content.containsKey(name)) {
21            content.put(name, new HashMap<String, Object>());
22        }
23
24        listeners = new ArrayList<OnSharedPreferenceChangeListener>();
25    }
26
27    @Override
28    public Map<String, ?> getAll() {
29        return new HashMap<String, Object>(content.get(filename));
30    }
31
32    @Override
33    public String getString(String key, String defValue) {
34        return (String) getValue(key, defValue);
35    }
36
37    private Object getValue(String key, Object defValue) {
38        Map<String, Object> fileHash = content.get(filename);
39        if (fileHash != null) {
40            Object value = fileHash.get(key);
41            if (value != null) {
42                return value;
43            }
44        }
45        return defValue;
46    }
47
48    @Override
49    public int getInt(String key, int defValue) {
50        return (Integer) getValue(key, defValue);
51    }
52
53    @Override
54    public long getLong(String key, long defValue) {
55        return (Long) getValue(key, defValue);
56    }
57
58    @Override
59    public float getFloat(String key, float defValue) {
60        return (Float) getValue(key, defValue);
61    }
62
63    @Override
64    public boolean getBoolean(String key, boolean defValue) {
65        return (Boolean) getValue(key, defValue);
66    }
67
68    @Override
69    public boolean contains(String key) {
70        return content.get(filename).containsKey(key);
71    }
72
73    @Override
74    public Editor edit() {
75        return new TestSharedPreferencesEditor();
76    }
77
78    @Override
79    public void registerOnSharedPreferenceChangeListener(
80            OnSharedPreferenceChangeListener listener) {
81        if(!listeners.contains(listener))
82            listeners.add(listener);
83    }
84
85    @Override
86    public void unregisterOnSharedPreferenceChangeListener(
87            OnSharedPreferenceChangeListener listener) {
88        if(listeners.contains(listener))
89            listeners.remove(listener);
90    }
91
92    public boolean hasListener(OnSharedPreferenceChangeListener listener) {
93        return listeners.contains(listener);
94    }
95
96    private class TestSharedPreferencesEditor implements Editor {
97
98        Map<String, Object> editsThatNeedCommit = new HashMap<String, Object>();
99        Set<String> editsThatNeedRemove = new HashSet<String>();
100        private boolean shouldClearOnCommit = false;
101
102        @Override
103        public Editor putString(String key, String value) {
104            editsThatNeedCommit.put(key, value);
105            editsThatNeedRemove.remove(key);
106            return this;
107        }
108
109        @Override
110        public Editor putInt(String key, int value) {
111            editsThatNeedCommit.put(key, value);
112            editsThatNeedRemove.remove(key);
113            return this;
114        }
115
116        @Override
117        public Editor putLong(String key, long value) {
118            editsThatNeedCommit.put(key, value);
119            editsThatNeedRemove.remove(key);
120            return this;
121        }
122
123        @Override
124        public Editor putFloat(String key, float value) {
125            editsThatNeedCommit.put(key, value);
126            editsThatNeedRemove.remove(key);
127            return this;
128        }
129
130        @Override
131        public Editor putBoolean(String key, boolean value) {
132            editsThatNeedCommit.put(key, value);
133            editsThatNeedRemove.remove(key);
134            return this;
135        }
136
137        @Override
138        public Editor remove(String key) {
139            editsThatNeedRemove.add(key);
140            return this;
141        }
142
143        @Override
144        public Editor clear() {
145            shouldClearOnCommit = true;
146            return this;
147        }
148
149        @Override
150        public boolean commit() {
151            Map<String, Object> previousContent = content.get(filename);
152            if (shouldClearOnCommit) {
153                previousContent.clear();
154            } else {
155                for (String key : editsThatNeedCommit.keySet()) {
156                    previousContent.put(key, editsThatNeedCommit.get(key));
157                }
158                for (String key : editsThatNeedRemove) {
159                    previousContent.remove(key);
160                }
161            }
162
163            for (String key : editsThatNeedCommit.keySet()) {
164                previousContent.put(key, editsThatNeedCommit.get(key));
165            }
166
167            return true;
168        }
169
170        @Override
171        public void apply() {
172            commit();
173        }
174
175		@Override
176		public Editor putStringSet(String key, Set<String> values) {
177			return this;
178		}
179    }
180
181	@Override
182	public Set<String> getStringSet(String key, Set<String> defValues) {
183		return null;
184	}
185}
186