さらに改善、したつもり
[ofnhwx.olib.git] / src / jp / gr / java_conf / ofnhwx / olib / utils / OPreference.java
blob31493192d545c5faa6b9eba57f659585edad448f
1 package jp.gr.java_conf.ofnhwx.olib.utils;
3 import java.io.FileInputStream;
4 import java.io.FileOutputStream;
5 import java.io.ObjectInputStream;
6 import java.io.ObjectOutputStream;
7 import java.util.Map;
8 import java.util.Map.Entry;
10 import android.content.Context;
11 import android.content.SharedPreferences;
12 import android.os.Build;
13 import android.preference.PreferenceManager;
15 /**
16 * デフォルト設定の取得・設定を行うクラス.
17 * @author yuta
19 public final class OPreference {
21 // 唯一のインスタンス
22 private static OPreference sInstance = null;
24 // 各種定数値を定義
25 private static enum Type {
26 BOOLEAN,
27 FLOAT,
28 INT,
29 LONG,
30 STRING;
32 private final Context context;
33 private final SharedPreferences preferences;
35 /**
36 * インスタンスの取得.
37 * @param context
38 * @return {@link OPreference}のインスタンス
40 public static OPreference getInstance(Context context) {
41 if (sInstance == null) {
42 sInstance = new OPreference(context.getApplicationContext());
44 return sInstance;
47 private OPreference(Context context) {
48 this.context = context;
49 this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
50 if (isGalaxyS()) {
51 readFromFile();
55 public void flush() {
56 if (isGalaxyS()) {
57 writeToFile();
61 /**
62 * デフォルト設定を更新する.
63 * @param key 更新するデフォルト設定の名前
64 * @param value 新しい値
65 * @param type 値の型
66 * @return 更新に成功したかどうかを返す
67 * @throws IllegalArgumentException たぶん発生することはない
69 private boolean write(String key, Object value, Type type) {
70 SharedPreferences.Editor editor = preferences.edit();
71 switch (type) {
72 case BOOLEAN:
73 editor.putBoolean(key, (Boolean)value);
74 break;
75 case FLOAT:
76 editor.putFloat(key, (Float)value);
77 break;
78 case INT:
79 editor.putInt(key, (Integer)value);
80 break;
81 case LONG:
82 editor.putLong(key, (Long)value);
83 break;
84 case STRING:
85 editor.putString(key, (String)value);
86 break;
87 default:
88 throw new IllegalArgumentException("Unrecognized type: " + value.getClass().getSimpleName());
90 return editor.commit();
93 /**
94 * デフォルト設定を更新する(boolean値)
95 * @param key 更新するデフォルト設定の名前
96 * @param value 新しい値
97 * @return 更新に成功したかどうかを返す
99 public boolean write(String key, boolean value) {
100 return write(key, value, Type.BOOLEAN);
104 * デフォルト設定を更新する(float値)
105 * @param key 更新するデフォルト設定の名前
106 * @param value 新しい値
107 * @return 更新に成功したかどうかを返す
109 public boolean write(String key, float value) {
110 return write(key, value, Type.FLOAT);
114 * デフォルト設定を更新する(int値)
115 * @param key 更新するデフォルト設定の名前
116 * @param value 新しい値
117 * @return 更新に成功したかどうかを返す
119 public boolean write(String key, int value) {
120 return write(key, value, Type.INT);
124 * デフォルト設定を更新する(long値)
125 * @param key 更新するデフォルト設定の名前
126 * @param value 新しい値
127 * @return 更新に成功したかどうかを返す
129 public boolean write(String key, long value) {
130 return write(key, value, Type.LONG);
134 * デフォルト設定を更新する(String値)
135 * @param key 更新するデフォルト設定の名前
136 * @param value 新しい値
137 * @return 更新に成功したかどうかを返す
139 public boolean write(String key, String value) {
140 return write(key, value, Type.STRING);
144 * デフォルト設定を更新する(boolean値)
145 * @param key 更新するデフォルト設定のリソースID
146 * @param value 新しい値
147 * @return 更新に成功したかどうかを返す
149 public boolean write(int resId, boolean value) {
150 return write(context.getString(resId), value, Type.BOOLEAN);
154 * デフォルト設定を更新する(float値)
155 * @param key 更新するデフォルト設定のリソースID
156 * @param value 新しい値
157 * @return 更新に成功したかどうかを返す
159 public boolean write(int resId, float value) {
160 return write(context.getString(resId), value, Type.FLOAT);
164 * デフォルト設定を更新する(int値)
165 * @param key 更新するデフォルト設定のリソースID
166 * @param value 新しい値
167 * @return 更新に成功したかどうかを返す
169 public boolean write(int resId, int value) {
170 return write(context.getString(resId), value, Type.INT);
174 * デフォルト設定を更新する(long値)
175 * @param key 更新するデフォルト設定のリソースID
176 * @param value 新しい値
177 * @return 更新に成功したかどうかを返す
179 public boolean write(int resId, long value) {
180 return write(context.getString(resId), value, Type.LONG);
184 * デフォルト設定を更新する(String値)
185 * @param key 更新するデフォルト設定のリソースID
186 * @param value 新しい値
187 * @return 更新に成功したかどうかを返す
189 public boolean write(int resId, String value) {
190 return write(context.getString(resId), value, Type.STRING);
194 * デフォルト設定を取得する
195 * @param key 取得するデフォルト設定の名前
196 * @param defValue デフォルトが設定されていない場合に返す値
197 * @return 指定したデフォルト設定の値
199 public boolean getBoolean(String key, boolean defValue) {
200 return preferences.getBoolean(key, defValue);
204 * デフォルト設定を取得する
205 * @param key 取得するデフォルト設定の名前
206 * @param defValue デフォルトが設定されていない場合に返す値
207 * @return 指定したデフォルト設定の値
209 public float getFloat(String key, float defValue) {
210 return preferences.getFloat(key, defValue);
214 * デフォルト設定を取得する
215 * @param key 取得するデフォルト設定の名前
216 * @param defValue デフォルトが設定されていない場合に返す値
217 * @return 指定したデフォルト設定の値
219 public int getInt(String key, int defValue) {
220 return preferences.getInt(key, defValue);
224 * デフォルト設定を取得する
225 * @param key 取得するデフォルト設定の名前
226 * @param defValue デフォルトが設定されていない場合に返す値
227 * @return 指定したデフォルト設定の値
229 public long getLong(String key, long defValue) {
230 return preferences.getLong(key, defValue);
234 * デフォルト設定を取得する
235 * @param key 取得するデフォルト設定の名前
236 * @param defValue デフォルトが設定されていない場合に返す値
237 * @return 指定したデフォルト設定の値
239 public String getString(String key, String defValue) {
240 return preferences.getString(key, defValue);
244 * デフォルト設定を取得する
245 * @param key 取得するデフォルト設定のリソースID
246 * @param defValue デフォルトが設定されていない場合に返す値
247 * @return 指定したデフォルト設定の値
249 public boolean getBoolean(int resId, boolean defValue) {
250 return preferences.getBoolean(context.getString(resId), defValue);
254 * デフォルト設定を取得する
255 * @param key 取得するデフォルト設定のリソースID
256 * @param defValue デフォルトが設定されていない場合に返す値
257 * @return 指定したデフォルト設定の値
259 public float getFloat(int resId, float defValue) {
260 return preferences.getFloat(context.getString(resId), defValue);
264 * デフォルト設定を取得する
265 * @param key 取得するデフォルト設定のリソースID
266 * @param defValue デフォルトが設定されていない場合に返す値
267 * @return 指定したデフォルト設定の値
269 public int getInt(int resId, int defValue) {
270 return preferences.getInt(context.getString(resId), defValue);
274 * デフォルト設定を取得する
275 * @param key 取得するデフォルト設定のリソースID
276 * @param defValue デフォルトが設定されていない場合に返す値
277 * @return 指定したデフォルト設定の値
279 public long getLong(int resId, long defValue) {
280 return preferences.getLong(context.getString(resId), defValue);
284 * デフォルト設定を取得する
285 * @param key 取得するデフォルト設定のリソースID
286 * @param defValue デフォルトが設定されていない場合に返す値
287 * @return 指定したデフォルト設定の値
289 public String getString(int resId, String defValue) {
290 return preferences.getString(context.getString(resId), defValue);
294 * 名前からDrawableリソースのIDを取得する
295 * @param name 取得するリソースの名前
296 * @return リソースID(見つからない場合'0')
298 public int getDrawableId(String name) {
299 return context.getResources().getIdentifier(name, "drawable", context.getPackageName());
303 * 名前から文字列リソースのIDを取得する
304 * @param name 取得するリソースの名前
305 * @return リソースID(見つからない場合'0')
307 public int getStringId(String name) {
308 return context.getResources().getIdentifier(name, "string", context.getPackageName());
311 // 以下、`Galaxy S 2.2.1'への対策
313 private static final String FILENAME = "preferences.dat";
315 private boolean isGalaxyS() {
316 return Build.MODEL.equals("SC-02B");
319 private void readFromFile() {
320 FileInputStream fis = null;
321 ObjectInputStream ois = null;
322 try {
323 fis = context.openFileInput(FILENAME);
324 ois = new ObjectInputStream(fis);
325 @SuppressWarnings("unchecked")
326 Map<String, ?> map = (Map<String, ?>)ois.readObject();
327 for (Entry<String, ?> entry : map.entrySet()) {
328 Object value = entry.getValue();
329 if (value instanceof Boolean) {
330 write(entry.getKey(), (Boolean)value);
331 } else if (value instanceof Float) {
332 write(entry.getKey(), (Float)value);
333 } else if (value instanceof Integer) {
334 write(entry.getKey(), (Integer)value);
335 } else if (value instanceof Long) {
336 write(entry.getKey(), (Long)value);
337 } else if (value instanceof String) {
338 write(entry.getKey(), (String)value);
341 } catch (Exception e) {
342 e.printStackTrace();
343 } finally {
344 try { ois.close(); } catch (Exception e) {}
345 try { fis.close(); } catch (Exception e) {}
349 private void writeToFile() {
350 FileOutputStream fos = null;
351 ObjectOutputStream oos = null;
352 try {
353 fos = context.openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);
354 oos = new ObjectOutputStream(fos);
355 oos.writeObject(preferences.getAll());
356 } catch (Exception e) {
357 e.printStackTrace();
358 } finally {
359 try { oos.close(); } catch (Exception e) {}
360 try { fos.close(); } catch (Exception e) {}