package cgeo.geocaching.filter;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.LinearLayout;
import android.widget.SimpleExpandableListAdapter;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
import cgeo.geocaching.R;
import cgeo.geocaching.activity.AbstractActionBarActivity;
import cgeo.geocaching.filter.FilterRegistry.FactoryEntry;
import cgeo.geocaching.utils.Log;
/**
* Show a filter selection using an {@code ExpandableListView}.
*/
@OptionsMenu(R.menu.filter_options)
@EActivity
public class FilterActivity extends AbstractActionBarActivity {
public static final String EXTRA_FILTER_RESULT = null;
public static final int REQUEST_SELECT_FILTER = 1234;
private static final String KEY_FILTER_NAME = "filterName";
private static final String KEY_FILTER_GROUP_NAME = "filterGroupName";
@BindView(R.id.filterList) protected ExpandableListView filterList;
@BindView(R.id.filters) protected LinearLayout filtersContainer;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.filter_activity);
ButterKnife.bind(this);
createListAdapter();
}
private void createListAdapter() {
final SimpleExpandableListAdapter adapter =
new SimpleExpandableListAdapter(
this,
// top level entries in the next 4 lines
createFilterTopLevelGroups(),
android.R.layout.simple_expandable_list_item_1,
new String[] { KEY_FILTER_GROUP_NAME },
new int[] { android.R.id.text1 },
// child level entries in the next 4 lines
createFilterChildren(),
android.R.layout.simple_expandable_list_item_2,
new String[] { KEY_FILTER_NAME, "CHILD_NAME" },
new int[] { android.R.id.text1 }
);
filterList.setAdapter(adapter);
filterList.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(final ExpandableListView parent, final View v, final int groupPosition, final int childPosition, final long id) {
setFilterResult(groupPosition, childPosition);
return true;
}
});
}
@Nullable
public static IFilter getFilterFromPosition(final int groupPosition, final int childPosition) {
if (groupPosition < 0 || childPosition < 0) {
return null;
}
final FactoryEntry factoryEntry = FilterRegistry.getInstance().getFactories().get(groupPosition);
return createFilterFactory(factoryEntry.getFactory()).getFilters().get(childPosition);
}
/**
* Creates the group list with the mapped properties.
*/
private static List<Map<String, String>> createFilterTopLevelGroups() {
final List<Map<String, String>> groups = new ArrayList<>();
for (final FactoryEntry factoryEntry : FilterRegistry.getInstance().getFactories()) {
final Map<String, String> map = new HashMap<>();
map.put(KEY_FILTER_GROUP_NAME, factoryEntry.getName());
groups.add(map);
}
return groups;
}
private static List<List<Map<String, String>>> createFilterChildren() {
final List<List<Map<String, String>>> listOfChildGroups = new ArrayList<>();
for (final FactoryEntry factoryEntry : FilterRegistry.getInstance().getFactories()) {
final IFilterFactory factory = createFilterFactory(factoryEntry.getFactory());
final List<? extends IFilter> filters = factory.getFilters();
final List<Map<String, String>> childGroups = new ArrayList<>(filters.size());
for (final IFilter filter : filters) {
final Map<String, String> hashMap = new HashMap<>(1);
hashMap.put(KEY_FILTER_NAME, filter.getName());
hashMap.put("CHILD_NAME", filter.getName());
childGroups.add(hashMap);
}
listOfChildGroups.add(childGroups);
}
return listOfChildGroups;
}
private static IFilterFactory createFilterFactory(final Class<? extends IFilterFactory> class1) {
try {
return class1.newInstance();
} catch (Exception e) { // no multi-catch below SDK 19
Log.e("createFilterFactory", e);
}
return null;
}
/**
* After calling this method, the calling activity must implement onActivityResult, and check the
* {@link #EXTRA_FILTER_RESULT}.
*/
public static void selectFilter(@NonNull final Activity context) {
context.startActivityForResult(new Intent(context, FilterActivity_.class), REQUEST_SELECT_FILTER);
}
@OptionsItem(R.id.menu_reset_filter)
void resetFilter() {
setFilterResult(-1, -1);
}
private void setFilterResult(final int groupPosition, final int childPosition) {
final Intent resultIntent = new Intent();
resultIntent.putExtra(EXTRA_FILTER_RESULT, new int[] { groupPosition, childPosition });
setResult(Activity.RESULT_OK, resultIntent);
finish();
}
}