package org.emdev.ui.preference;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.CheckBoxPreference;
import android.util.AttributeSet;
import org.emdev.common.settings.base.JsonObjectPreferenceDefinition;
import org.emdev.utils.WidgetUtils;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonCheckBoxPreference extends CheckBoxPreference {
private JsonObjectPreferenceDefinition def;
private String jsonProperty;
private Object defValue;
public JsonCheckBoxPreference(final Context context) {
super(context);
}
public JsonCheckBoxPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
def = new JsonObjectPreferenceDefinition(getKey());
jsonProperty = WidgetUtils.getStringAttribute(context, attrs, WidgetUtils.EBOOKDROID_NS, WidgetUtils.ATTR_JSON_PROPERTY, null);
defValue = WidgetUtils.getBooleanAttribute(context, attrs, WidgetUtils.ANDROID_NS, WidgetUtils.ATTR_DEFAULT_VALUE, null);
setKey(def.key + "." + jsonProperty);
}
public JsonCheckBoxPreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
def = new JsonObjectPreferenceDefinition(getKey());
jsonProperty = WidgetUtils.getStringAttribute(context, attrs, WidgetUtils.EBOOKDROID_NS, WidgetUtils.ATTR_JSON_PROPERTY, null);
defValue = WidgetUtils.getBooleanAttribute(context, attrs, WidgetUtils.ANDROID_NS, WidgetUtils.ATTR_DEFAULT_VALUE, null);
setKey(def.key + "." + jsonProperty);
}
@Override
protected boolean shouldPersist() {
return def != null && jsonProperty != null && super.shouldPersist();
}
@Override
protected void onSetInitialValue(final boolean restoreValue, final Object defaultValue) {
// By now, we know if we are persistent.
if (!shouldPersist() || !containsProperty()) {
if (defValue != null) {
super.onSetInitialValue(false, defValue);
}
} else {
super.onSetInitialValue(true, null);
}
}
private boolean containsProperty() {
return def.getPreferenceValue(getSharedPreferences()).has(jsonProperty);
}
@Override
protected boolean getPersistedBoolean(final boolean defaultReturnValue) {
if (def != null && jsonProperty != null) {
final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
final JSONObject object = def.getPreferenceValue(prefs);
try {
return object.has(jsonProperty) ? object.getBoolean(jsonProperty) : defaultReturnValue;
} catch (final JSONException ex) {
}
}
return defaultReturnValue;
}
@Override
protected boolean persistBoolean(final boolean value) {
if (shouldPersist()) {
final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
final JSONObject object = def.getPreferenceValue(prefs);
try {
final boolean oldValue = object.has(jsonProperty) ? object.getBoolean(jsonProperty) : !value;
if (value == oldValue) {
// It's already there, so the same as persisting
return true;
}
object.put(jsonProperty, value);
final SharedPreferences.Editor editor = prefs.edit();
def.setPreferenceValue(editor, object);
editor.commit();
} catch (final JSONException ex) {
}
return true;
}
return false;
}
}