package org.azavea.otm.filters;
import android.app.Activity;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewStub;
import android.widget.TextView;
import org.azavea.helpers.Logger;
import org.azavea.otm.R;
import org.json.JSONException;
import org.json.JSONObject;
public abstract class RangeFilter<T> extends BaseFilter {
private T min;
private T max;
interface GetValue {
String get();
}
public RangeFilter(String key, String identifier, String label) {
super(key, identifier, label);
}
protected abstract T valueFromView(@NonNull View view);
protected abstract String valueToString(@NonNull T value);
protected abstract @LayoutRes int getFieldResource();
protected void onFieldLoaded(TextView field, Activity activity) {
// Do Nothing
}
@Override
public boolean isActive() {
return (min != null || max != null);
}
@Override
public View createView(LayoutInflater inflater, Activity activity) {
View rangeControl = inflater.inflate(R.layout.filter_range_control, null);
((TextView) rangeControl.findViewById(R.id.filter_label)).setText(label);
loadField(rangeControl, activity, R.id.min_stub, R.id.min, this::getMinString);
loadField(rangeControl, activity, R.id.max_stub, R.id.max, this::getMaxString);
return rangeControl;
}
private void loadField(View rangeControl, Activity activity, @IdRes int stubId,
@IdRes int viewId, GetValue getValue) {
ViewStub stub = ((ViewStub) rangeControl.findViewById(stubId));
stub.setLayoutResource(getFieldResource());
stub.setOnInflateListener((s, control) -> {
TextView view = (TextView) control;
view.setText(getValue.get());
onFieldLoaded(view, activity);
});
stub.setInflatedId(viewId);
stub.inflate();
}
protected String getMinString() {
return this.min == null ? "" : valueToString(this.min);
}
protected String getMaxString() {
return this.max == null ? "" : valueToString(this.max);
}
@Override
public void updateFromView(View view) {
this.min = valueFromView(view.findViewById(R.id.min));
this.max = valueFromView(view.findViewById(R.id.max));
}
@Override
public void clear(View view) {
this.min = null;
this.max = null;
for (int id : new int[]{R.id.min, R.id.max}) {
((TextView) view.findViewById(id)).setText("");
}
}
@Override
public JSONObject getFilterObject() {
JSONObject filter = null;
JSONObject predicateFilter = new JSONObject();
try {
if (min != null) {
predicateFilter.put("MIN", this.min);
}
if (max != null) {
predicateFilter.put("MAX", this.max);
}
if (predicateFilter.length() > 0) {
filter = new JSONObject();
filter.put(this.identifier, predicateFilter);
}
} catch (JSONException e) {
Logger.error("Error creating JSONObject for filter", e);
}
return filter;
}
}