/*
* Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.settings.info;
import android.support.annotation.ArrayRes;
import android.support.annotation.BoolRes;
import android.support.annotation.IntegerRes;
import android.support.annotation.StringRes;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import me.zhanghai.android.douya.DouyaApplication;
import me.zhanghai.android.douya.util.LogUtils;
import me.zhanghai.android.douya.util.SharedPrefsUtils;
public interface SettingsEntries {
class StringSettingsEntry extends SettingsEntry<String> {
public StringSettingsEntry(@StringRes int keyResId, @StringRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public String getDefaultValue() {
return DouyaApplication.getInstance().getString(getDefaultValueResId());
}
@Override
public String getValue() {
return SharedPrefsUtils.getString(this);
}
@Override
public void putValue(String value) {
SharedPrefsUtils.putString(this, value);
}
}
class StringSetSettingsEntry extends SettingsEntry<Set<String>> {
public StringSetSettingsEntry(@StringRes int keyResId, @ArrayRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public Set<String> getDefaultValue() {
Set<String> stringSet = new HashSet<>();
Collections.addAll(stringSet, DouyaApplication.getInstance().getResources()
.getStringArray(getDefaultValueResId()));
return stringSet;
}
@Override
public Set<String> getValue() {
return SharedPrefsUtils.getStringSet(this);
}
@Override
public void putValue(Set<String> value) {
SharedPrefsUtils.putStringSet(this, value);
}
}
class IntegerSettingsEntry extends SettingsEntry<Integer> {
public IntegerSettingsEntry(@StringRes int keyResId, @IntegerRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public Integer getDefaultValue() {
return DouyaApplication.getInstance().getResources().getInteger(getDefaultValueResId());
}
@Override
public Integer getValue() {
return SharedPrefsUtils.getInt(this);
}
@Override
public void putValue(Integer value) {
SharedPrefsUtils.putInt(this, value);
}
}
class LongSettingsEntry extends SettingsEntry<Long> {
public LongSettingsEntry(@StringRes int keyResId, @StringRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public Long getDefaultValue() {
return Long.valueOf(DouyaApplication.getInstance().getResources().getString(
getDefaultValueResId()));
}
@Override
public Long getValue() {
return SharedPrefsUtils.getLong(this);
}
@Override
public void putValue(Long value) {
SharedPrefsUtils.putLong(this, value);
}
}
class FloatSettingsEntry extends SettingsEntry<Float> {
public FloatSettingsEntry(@StringRes int keyResId, @StringRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public Float getDefaultValue() {
return Float.valueOf(DouyaApplication.getInstance().getResources().getString(
getDefaultValueResId()));
}
@Override
public Float getValue() {
return SharedPrefsUtils.getFloat(this);
}
@Override
public void putValue(Float value) {
SharedPrefsUtils.putFloat(this, value);
}
}
class BooleanSettingsEntry extends SettingsEntry<Boolean> {
public BooleanSettingsEntry(@StringRes int keyResId, @BoolRes int defaultValueResId) {
super(keyResId, defaultValueResId);
}
@Override
public Boolean getDefaultValue() {
return DouyaApplication.getInstance().getResources().getBoolean(getDefaultValueResId());
}
@Override
public Boolean getValue() {
return SharedPrefsUtils.getBoolean(this);
}
@Override
public void putValue(Boolean value) {
SharedPrefsUtils.putBoolean(this, value);
}
}
class EnumSettingsEntry<E extends Enum<E>> extends StringSettingsEntry {
private E[] mEnumValues;
public EnumSettingsEntry(@StringRes int keyResId, @StringRes int defaultValueResId,
Class<E> enumClass) {
super(keyResId, defaultValueResId);
mEnumValues = enumClass.getEnumConstants();
}
public E getDefaultEnumValue() {
return mEnumValues[Integer.parseInt(getDefaultValue())];
}
public E getEnumValue() {
int ordinal = Integer.parseInt(getValue());
if (ordinal < 0 || ordinal >= mEnumValues.length) {
LogUtils.w("Invalid ordinal " + ordinal + ", with key=" + getKey()
+ ", enum values=" + Arrays.toString(mEnumValues)
+ ", reverting to default value");
E enumValue = getDefaultEnumValue();
putEnumValue(enumValue);
return enumValue;
}
return mEnumValues[ordinal];
}
public void putEnumValue(E value) {
putValue(String.valueOf(value.ordinal()));
}
}
}