/**
*
*/
package net.osmand.plus.activities;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.poi.PoiFiltersHelper;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.util.Algorithms;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
*
*/
public class EditPOIFilterActivity extends OsmandListActivity {
public static final String AMENITY_FILTER = "net.osmand.amenity_filter"; //$NON-NLS-1$
private PoiUIFilter filter;
private PoiFiltersHelper helper;
private static final int FILTER = 2;
public static final int EDIT_ACTIVITY_RESULT_OK = 20;
@Override
public void onCreate(final Bundle icicle) {
Bundle bundle = this.getIntent().getExtras();
String filterId = bundle.getString(AMENITY_FILTER);
helper = ((OsmandApplication) getApplication()).getPoiFilters();
filter = helper.getFilterById(filterId);
super.onCreate(icicle);
setContentView(R.layout.update_index);
((TextView)findViewById(R.id.header)).setText(R.string.shared_string_select_all);
final CheckBox selectAll = (CheckBox) findViewById(R.id.select_all);
selectAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectAll.isChecked()) {
selectAll();
} else {
deselectAll();
}
}
});
getSupportActionBar().setTitle(R.string.filterpoi_activity);
if (filter != null) {
getSupportActionBar().setSubtitle(filter.getName());
setListAdapter(new AmenityAdapter( ((OsmandApplication) getApplication()).getPoiTypes().getCategories(false)));
} else {
setListAdapter(new AmenityAdapter(new ArrayList<PoiCategory>()));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == FILTER) {
// filterPOI();
setResult(EDIT_ACTIVITY_RESULT_OK);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if(filter == null) {
return super.onCreateOptionsMenu(menu);
}
createMenuItem(menu, FILTER, R.string.filter_current_poiButton,
R.drawable.ic_action_done,
//R.drawable.a_1_navigation_accept_light, R.drawable.a_1_navigation_accept_dark,
MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT | MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
private void showDialog(final PoiCategory poiCategory) {
ListView lv = EditPOIFilterActivity.this.getListView();
final int index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
final int top = (v == null) ? 0 : v.getTop();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final LinkedHashMap<String, String> subCategories = new LinkedHashMap<String, String>();
Set<String> acceptedCategories = filter.getAcceptedSubtypes(poiCategory);
if (acceptedCategories != null) {
for(String s : acceptedCategories) {
subCategories.put(s, Algorithms.capitalizeFirstLetterAndLowercase(s));
}
}
for(PoiType pt : poiCategory.getPoiTypes()) {
subCategories.put(pt.getKeyName(), pt.getTranslation());
}
final String[] array = subCategories.keySet().toArray(new String[0]);
final Collator cl = Collator.getInstance();
cl.setStrength(Collator.SECONDARY);
Arrays.sort(array, 0, array.length, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
String v1 = subCategories.get(object1);
String v2 = subCategories.get(object2);
return cl.compare(v1, v2);
}
});
final String[] visibleNames = new String[array.length];
final boolean[] selected = new boolean[array.length];
for (int i = 0; i < array.length; i++) {
final String subcategory = array[i];
visibleNames[i] = subCategories.get(subcategory);
if (acceptedCategories == null) {
selected[i] = true;
} else {
selected[i] = acceptedCategories.contains(subcategory);
}
}
builder.setNeutralButton(EditPOIFilterActivity.this.getText(R.string.shared_string_close), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LinkedHashSet<String> accepted = new LinkedHashSet<String>();
for (int i = 0; i < selected.length; i++) {
if(selected[i]){
accepted.add(array[i]);
}
}
if (subCategories.size() == accepted.size()) {
filter.selectSubTypesToAccept(poiCategory, null);
} else if(accepted.size() == 0){
filter.setTypeToAccept(poiCategory, false);
} else {
filter.selectSubTypesToAccept(poiCategory, accepted);
}
helper.editPoiFilter(filter);
ListView lv = EditPOIFilterActivity.this.getListView();
AmenityAdapter la = (AmenityAdapter) EditPOIFilterActivity.this.getListAdapter();
la.notifyDataSetChanged();
lv.setSelectionFromTop(index, top);
}
});
builder.setPositiveButton(EditPOIFilterActivity.this.getText(R.string.shared_string_select_all), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lv = selectAllFromCategory(poiCategory);
lv.setSelectionFromTop(index, top);
}
});
builder.setMultiChoiceItems(visibleNames, selected, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int item, boolean isChecked) {
selected[item] = isChecked;
}
});
builder.show();
}
public ListView selectAllFromCategory(PoiCategory poiCategory) {
filter.updateTypesToAccept(poiCategory);
helper.editPoiFilter(filter);
ListView lv = this.getListView();
AmenityAdapter la = this.getListAdapter();
la.notifyDataSetChanged();
return lv;
}
private void selectAll() {
AmenityAdapter adapter = getListAdapter();
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
selectAllFromCategory(adapter.getItem(i));
}
adapter.notifyDataSetChanged();
}
private void deselectAll(){
AmenityAdapter adapter = getListAdapter();
int count = adapter.getCount();
for (int i =0; i< count; i++) {
filter.setTypeToAccept(adapter.getItem(i), false);
}
adapter.notifyDataSetChanged();
}
@Override
public AmenityAdapter getListAdapter() {
return (AmenityAdapter) super.getListAdapter();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showDialog(getListAdapter().getItem(position));
}
class AmenityAdapter extends ArrayAdapter<PoiCategory> {
AmenityAdapter(List<PoiCategory> amenityTypes) {
super(EditPOIFilterActivity.this, R.layout.editing_poi_filter_list, amenityTypes);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View row = convertView;
if (row == null) {
row = inflater.inflate(R.layout.editing_poi_filter_list, parent, false);
}
PoiCategory model = getItem(position);
CheckBox check = (CheckBox) row.findViewById(R.id.filter_poi_check);
check.setChecked(filter.isTypeAccepted(model));
TextView text = (TextView) row.findViewById(R.id.filter_poi_label);
String textString = model.getTranslation();
Set<String> subtypes = filter.getAcceptedSubtypes(model);
if(filter.isTypeAccepted(model)) {
if(subtypes == null) {
textString += " (" + getString(R.string.shared_string_all) +")";
} else {
textString += " (" + subtypes.size() +")";
}
}
text.setText(textString);
addRowListener(model, text, check);
return (row);
}
private void addRowListener(final PoiCategory model, final TextView text, final CheckBox check) {
text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog(model);
}
});
check.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (check.isChecked()) {
filter.setTypeToAccept(model, true);
showDialog(model);
} else {
filter.setTypeToAccept(model, false);
helper.editPoiFilter(filter);
}
notifyDataSetChanged();
}
});
}
}
}