package org.tvbrowser.filter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import org.tvbrowser.settings.SettingConstants;
import org.tvbrowser.tvbrowser.R;
import org.tvbrowser.tvbrowser.WhereClause;
import org.tvbrowser.utils.PrefUtils;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.ViewGroup;
public abstract class FilterValues {
public static final String SEPARATOR_CLASS = "§§_§§";
private static final String SEPARATOR = "##_##";
private String mId;
protected String mName;
public FilterValues(String name) {
mId = String.valueOf(System.currentTimeMillis());
mName = name;
}
public static final Comparator<FilterValues> COMPARATOR_FILTER_VALUES = new Comparator<FilterValues>() {
@Override
public int compare(FilterValues lhs, FilterValues rhs) {
return lhs.toString().compareToIgnoreCase(rhs.toString());
}
};
public final String getId() {
return getClass().getCanonicalName() + SEPARATOR_CLASS + mId;
}
public final String getName() {
return mName;
}
public abstract WhereClause getWhereClause(Context context);
protected abstract String getSaveString();
public abstract void edit(Context context, Runnable callback, ViewGroup parent);
@Override
public String toString() {
return getName();
}
public static final FilterValues load(String id, String values) {
FilterValues result = null;
if(id.contains(SEPARATOR_CLASS) && values != null) {
String[] parts = id.split(SEPARATOR_CLASS);
String[] valueParts = values.split(SEPARATOR);
if(parts[0].equals(FilterValuesCategories.class.getCanonicalName())) {
result = new FilterValuesCategories(valueParts[0], valueParts[1]);
result.mId = parts[1];
}
else if(parts[0].equals(FilterValuesChannels.class.getCanonicalName())) {
result = new FilterValuesChannels(valueParts[0], valueParts[1]);
result.mId = parts[1];
}
else if(parts[0].equals(FilterValuesKeyword.class.getCanonicalName())) {
result = new FilterValuesKeyword(valueParts[0], valueParts[1]);
result.mId = parts[1];
}
}
else if(values != null) {
String[] valueParts = values.split(SEPARATOR);
result = new FilterValuesChannels(valueParts[0], valueParts[1]);
result.mId = id;
}
return result;
}
public static final FilterValues load(String id, Context context) {
FilterValues result = null;
SharedPreferences pref = PrefUtils.getSharedPreferences(PrefUtils.TYPE_PREFERENCES_FILTERS, context);
String values = pref.getString(id, null);
if(id.equals(SettingConstants.ALL_FILTER_ID)) {
result = new FilterValuesChannels(context.getString(R.string.activity_edit_filter_list_text_all),new int[0]);
result.mId = SettingConstants.ALL_FILTER_ID;
}
else {
result = load(id, values);
}
return result;
}
public final void save(Context context) {
Editor edit = PrefUtils.getSharedPreferences(PrefUtils.TYPE_PREFERENCES_FILTERS, context).edit();
edit.putString(getId(), mName + SEPARATOR + getSaveString());
edit.commit();
}
public static final void deleteFilter(Context context, FilterValues filter) {
final String filterId = filter.getClass().getCanonicalName() + SEPARATOR_CLASS + filter.getId();
PrefUtils.getSharedPreferences(PrefUtils.TYPE_PREFERENCES_FILTERS, context).edit().remove(filterId).remove(filter.getId()).commit();
final SharedPreferences pref = PrefUtils.getSharedPreferences(PrefUtils.TYPE_PREFERENCES_SHARED_GLOBAL, context);
final Set<String> test = pref.getStringSet(context.getString(R.string.CURRENT_FILTER_ID), new HashSet<String>());
final String[] idValues = test.toArray(new String[test.size()]);
boolean removed = false;
for(String id : idValues) {
if(id.equals(filter.getId())) {
test.remove(id);
removed = true;
}
}
if(removed) {
pref.edit().putStringSet(context.getString(R.string.CURRENT_FILTER_ID), test).commit();
}
}
@Override
public int hashCode() {
return Arrays.hashCode(getId().getBytes());
}
@Override
public boolean equals(Object o) {
Log.d("info4", this + " equals " + o);
if(o instanceof FilterValues) {
return getId().equals(((FilterValues) o).getId());
}
return super.equals(o);
}
}