/*
* Copyright (C) 2011 Cedric Fung (wolfplanet@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.yixia.zi.preference;
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 android.util.Log;
public class APreference {
private static final String TAG = "APreference";
private ContentResolver mResolver;
private ContentObserver mObserver;
private static final String[] PROJECTION_KV = new String[] { PreferenceProvider.COL_KEY, PreferenceProvider.COL_VALUE };
private static final String[] PROJECTION_VALUE = new String[] { PreferenceProvider.COL_VALUE };
private static final String[] PROJECTION_ID = new String[] { PreferenceProvider.COL_ID };
public APreference(Context ctx) {
mResolver = ctx.getContentResolver();
mObserver = new PreferenceContentObserver(new Handler());
}
public void registerObserver(OnPreferenceChangedListener l) {
mOnPreferenceChangedListener = l;
mResolver.registerContentObserver(PreferenceProvider.CONTENT_URI, true, mObserver);
}
public void registerObserver(Uri uri, OnPreferenceChangedListener l) {
mOnPreferenceChangedListener = l;
mResolver.registerContentObserver(uri, true, mObserver);
}
public void unregisterObserver() {
mResolver.unregisterContentObserver(mObserver);
}
public boolean contains(String key) {
Cursor c = null;
try {
c = mResolver.query(Uri.withAppendedPath(PreferenceProvider.CONTENT_URI, key), PROJECTION_VALUE, null, null, null);
if (c != null && c.moveToFirst())
return true;
return false;
} catch (Exception e) {
Log.e(TAG, "contains(" + key + ")", e);
return false;
} finally {
if (c != null)
c.close();
}
}
public void put(String key, boolean value) {
putValue(key, value);
}
public boolean getBoolean(String key, boolean defaultValue) {
try {
String val = getString(key, String.valueOf(defaultValue));
return Boolean.parseBoolean(val);
} catch (Exception e) {
Log.e(TAG, "getBoolean(" + key + "," + defaultValue + ")", e);
return defaultValue;
}
}
public void put(String key, long value) {
putValue(key, value);
}
public long getLong(String key, long defaultValue) {
try {
String val = getString(key, String.valueOf(defaultValue));
return Long.parseLong(val);
} catch (Exception e) {
Log.e(TAG, "getInt(" + key + "," + defaultValue + ")", e);
return defaultValue;
}
}
public void put(String key, int value) {
putValue(key, value);
}
public int getInt(String key, int defaultValue) {
try {
String val = getString(key, String.valueOf(defaultValue));
return Integer.parseInt(val);
} catch (Exception e) {
Log.e(TAG, "getInt(" + key + "," + defaultValue + ")", e);
return defaultValue;
}
}
public void put(String key, double value) {
putValue(key, value);
}
public double getDouble(String key, double defaultValue) {
try {
String val = getString(key, String.valueOf(defaultValue));
return Double.parseDouble(val);
} catch (Exception e) {
Log.e(TAG, "getDouble(" + key + "," + defaultValue + ")", e);
return defaultValue;
}
}
public void put(String key, String value) {
putValue(key, value);
}
public String getString(String key, String defaultValue) {
Cursor c = null;
try {
c = mResolver.query(Uri.withAppendedPath(PreferenceProvider.CONTENT_URI, key), PROJECTION_VALUE, null, null, null);
if (c != null && c.moveToFirst())
return c.getString(0);
return defaultValue;
} catch (Exception e) {
Log.e(TAG, "getString(" + key + "," + defaultValue + ")", e);
return defaultValue;
} finally {
if (c != null)
c.close();
}
}
public Map<String, ?> getAll() {
Cursor c = null;
Map<String, String> map = new HashMap<String, String>();
try {
c = mResolver.query(PreferenceProvider.CONTENT_URI, PROJECTION_KV, null, null, null);
if (c != null && c.moveToFirst()) {
do {
map.put(c.getString(0), c.getString(1));
} while (c.moveToNext());
return map;
}
return null;
} catch (Exception e) {
Log.e(TAG, "getAll()", e);
return null;
} finally {
if (c != null)
c.close();
}
}
public int remove(String key) {
return mResolver.delete(Uri.withAppendedPath(PreferenceProvider.CONTENT_URI, key), null, null);
}
public int clear() {
return mResolver.delete(PreferenceProvider.CONTENT_URI, null, null);
}
private void putValue(String key, Object value) {
Cursor c = null;
try {
ContentValues cv = new ContentValues();
cv.put(PreferenceProvider.COL_KEY, key);
cv.put(PreferenceProvider.COL_VALUE, String.valueOf(value));
c = mResolver.query(Uri.withAppendedPath(PreferenceProvider.CONTENT_URI, key), PROJECTION_ID, null, null, null);
if (c != null && c.moveToFirst()) {
mResolver.update(Uri.withAppendedPath(PreferenceProvider.CONTENT_URI, key), cv, null, null);
} else {
mResolver.insert(PreferenceProvider.CONTENT_URI, cv);
}
} catch (Exception e) {
Log.e(TAG, "putValue(" + key + "," + value + ")", e);
} finally {
if (c != null)
c.close();
}
}
private class PreferenceContentObserver extends ContentObserver {
public PreferenceContentObserver(Handler h) {
super(h);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
mOnPreferenceChangedListener.onPreferenceChanged();
}
}
public static interface OnPreferenceChangedListener {
public void onPreferenceChanged();
}
private OnPreferenceChangedListener mOnPreferenceChangedListener;
}