package org.azavea.otm.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.Toast; import org.azavea.helpers.Logger; import org.azavea.otm.App; import org.azavea.otm.R; import org.azavea.otm.data.Species; import org.azavea.otm.fields.Field; import org.azavea.otm.filters.BaseFilter; import org.azavea.otm.filters.SpeciesFilter; import org.json.JSONException; import org.json.JSONObject; import java.util.LinkedHashMap; import java.util.Map; import static com.google.common.collect.Maps.newHashMap; public class FilterDisplay extends UpEnabledActionBarActivity { private Map<BaseFilter, View> filterViews = newHashMap(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.filter_activity); LinearLayout filter_list = (LinearLayout) findViewById(R.id.filter_list); createFilterUI(App.getFilterManager().getFilters(), filter_list); } public void onComplete(View view) { // Update any active filters from the view for (Map.Entry<BaseFilter, View> filterView : filterViews.entrySet()) { filterView.getKey().updateFromView(filterView.getValue()); } setResult(RESULT_OK); finish(); } public void onClear(View clearButton) { resetFilters(); } /** * Notify all filter that they should clear their state to off */ private void resetFilters() { for (Map.Entry<BaseFilter, View> filter : filterViews.entrySet()) { filter.getKey().clear(filter.getValue()); } } private void createFilterUI(LinkedHashMap<String, BaseFilter> filters, LinearLayout parent) { LayoutInflater layout = this.getLayoutInflater(); for (Map.Entry<String, BaseFilter> entry : filters.entrySet()) { BaseFilter filter = entry.getValue(); View view = filter.createView(layout, this); parent.addView(view); filterViews.put(filter, view); } } private void updateSpecies(Species species) { SpeciesFilter filter = getSpeciesFilter(); if (filter != null) { filter.updateSpecies(filterViews.get(filter), species); } } private @Nullable SpeciesFilter getSpeciesFilter() { for (BaseFilter filter : filterViews.keySet()) { if (filter instanceof SpeciesFilter) { return (SpeciesFilter) filter; } } return null; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case (SpeciesFilter.SPECIES_SELECTOR): { if (resultCode == Activity.RESULT_OK) { CharSequence speciesJSON = data.getCharSequenceExtra(Field.TREE_SPECIES); if (!JSONObject.NULL.equals(speciesJSON)) { Species species = new Species(); try { species.setData(new JSONObject(speciesJSON.toString())); updateSpecies(species); } catch (JSONException e) { String msg = "Unable to retrieve selected species"; Logger.error(msg, e); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } } } break; } } } }