package com.eolwral.osmonitor.settings; import java.util.HashMap; import java.util.Map; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import com.eolwral.osmonitor.provider.PreferenceContentProvider; public class SettingsHelper { private ContentResolver contentResolver = null; private Map<String, Boolean> updateStatus = new HashMap<String, Boolean>(); private Map<String, String> cachedSettings = new HashMap<String, String>(); public SettingsHelper(Context context) { contentResolver = context.getContentResolver(); contentResolver.registerContentObserver( PreferenceContentProvider.CONTENT_URI, true, new contentObserver( new Handler())); } private final class contentObserver extends ContentObserver { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); clearCache(); } public contentObserver(Handler handler) { super(handler); } } public void clearCache() { // set status of all fetched values to false for (Map.Entry<String, Boolean> entry : updateStatus.entrySet()) entry.setValue(true); } public HashMap<String, String> getAllData() { HashMap<String, String> data = new HashMap<String, String>(); // query Cursor cursor = null; try { cursor = contentResolver.query(PreferenceContentProvider.CONTENT_URI, new String[] { PreferenceContentProvider.KEY, PreferenceContentProvider.VALUE }, null, null, null); } catch (Exception e) { } if (cursor == null) return data; cursor.moveToFirst(); while (cursor.getPosition() < cursor.getCount()) { data.put(cursor.getString(0), cursor.getString(1)); if (!cursor.moveToNext()) break; } cursor.close(); return data; } private boolean isExistKey(String key) { // query Cursor cursor = null; try { cursor = contentResolver.query(PreferenceContentProvider.CONTENT_URI, new String[] { PreferenceContentProvider.KEY }, PreferenceContentProvider.KEY + "=?", new String[] { key }, null); } catch (Exception e) { } if (cursor == null) return false; // get count int count = cursor.getCount(); cursor.close(); // check if (count == 0) return false; return true; } private boolean setKey(String key, String value) { // create data ContentValues data = new ContentValues(); data.put(PreferenceContentProvider.KEY, key); data.put(PreferenceContentProvider.VALUE, value); // insert Uri uri = contentResolver.insert(PreferenceContentProvider.CONTENT_URI, data); // Fix: java.lang.NullPointerException if (uri == null) return false; if (uri.getLastPathSegment().equals(PreferenceContentProvider.NOEXIST)) return false; return true; } private boolean updateKey(String key, String value) { // create data ContentValues data = new ContentValues(); data.put(PreferenceContentProvider.KEY, key); data.put(PreferenceContentProvider.VALUE, value); // update if (contentResolver.update(PreferenceContentProvider.CONTENT_URI, data, PreferenceContentProvider.KEY + "=?", new String[] { key }) > 0) return true; return false; } private String getKey(String key) { String value = null; // check cached settings if (updateStatus.containsKey(key) && !updateStatus.get(key)) { return cachedSettings.get(key); } // query Cursor cursor = null; try { cursor = contentResolver.query(PreferenceContentProvider.CONTENT_URI, new String[] { PreferenceContentProvider.KEY, PreferenceContentProvider.VALUE }, PreferenceContentProvider.KEY + "=?", new String[] { key }, null); } catch (Exception e) { } if (cursor == null) return value; if (cursor.getCount() == 0) { cursor.close(); return value; } // get string cursor.moveToFirst(); value = cursor.getString(cursor .getColumnIndex(PreferenceContentProvider.VALUE)); cursor.close(); // update status cachedSettings.put(key, value); updateStatus.put(key, false); return value; } public boolean checkStatus(String key) { if (!updateStatus.containsKey(key)) return false; return updateStatus.get(key); } public String getString(String key, String defaultValue) { String value = ""; if (isExistKey(key)) value = getKey(key); else value = defaultValue; return value; } public void setString(String key, String value) { if (isExistKey(key)) updateKey(key, value); else setKey(key, value); return; } public int getInteger(String key, int defaultValue) { int value = 0; if (isExistKey(key)) { String stringValue = getKey(key); value = Integer.parseInt(stringValue); } else value = defaultValue; return value; } public void setInteger(String key, int value) { setString(key, Integer.toString(value)); return; } public boolean getBoolean(String key, boolean defaultValue) { boolean value = true; if (isExistKey(key)) { String stringValue = getKey(key); value = Boolean.parseBoolean(stringValue); } else value = defaultValue; return value; } public void setBoolean(String key, boolean value) { setString(key, Boolean.toString(value)); return; } }