/**
*
*/
package net.osmand.plus.activities;
import java.text.MessageFormat;
import java.util.LinkedHashSet;
import java.util.Set;
import net.osmand.OsmAndFormatter;
import net.osmand.data.AmenityType;
import net.osmand.osm.LatLon;
import net.osmand.osm.MapRenderingTypes;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.PoiFilter;
import net.osmand.plus.PoiFiltersHelper;
import net.osmand.plus.R;
import net.osmand.plus.activities.search.SearchPOIActivity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
/**
* @author Frolov
*
*/
public class EditPOIFilterActivity extends ListActivity {
public static final String AMENITY_FILTER = "net.osmand.amenity_filter"; //$NON-NLS-1$
private Button filterLevel;
private PoiFilter filter;
private PoiFiltersHelper helper;
public static final String SEARCH_LAT = "SEARCH_LAT"; //$NON-NLS-1$
public static final String SEARCH_LON = "SEARCH_LON"; //$NON-NLS-1$
@Override
public void onCreate(final Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.editing_poi_filter);
filterLevel = (Button) findViewById(R.id.filter_currentButton);
filterLevel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle extras = getIntent().getExtras();
boolean searchNearBy = true;
LatLon lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(OsmandSettings.getPrefs(EditPOIFilterActivity.this));
double latitude = lastKnownMapLocation != null ? lastKnownMapLocation.getLatitude() : 0;
double longitude = lastKnownMapLocation != null ? lastKnownMapLocation.getLongitude() : 0;
final Intent newIntent = new Intent(EditPOIFilterActivity.this, SearchPOIActivity.class);
if(extras != null && extras.containsKey(SEARCH_LAT) && extras.containsKey(SEARCH_LON)){
latitude = extras.getDouble(SEARCH_LAT);
longitude = extras.getDouble(SEARCH_LON);
searchNearBy = false;
}
final double lat = latitude;
final double lon = longitude;
newIntent.putExtra(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId());
if (searchNearBy) {
AlertDialog.Builder b = new AlertDialog.Builder(EditPOIFilterActivity.this);
b.setItems(new String[] { getString(R.string.search_nearby), getString(R.string.search_near_map) },
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 1) {
newIntent.putExtra(SearchPOIActivity.SEARCH_LAT, lat);
newIntent.putExtra(SearchPOIActivity.SEARCH_LON, lon);
}
startActivity(newIntent);
}
});
b.show();
} else {
newIntent.putExtra(SearchPOIActivity.SEARCH_LAT, lat);
newIntent.putExtra(SearchPOIActivity.SEARCH_LON, lon);
startActivity(newIntent);
}
}
});
Bundle bundle = this.getIntent().getExtras();
String filterId = bundle.getString(AMENITY_FILTER);
helper = ((OsmandApplication)getApplication()).getPoiFilters();
filter = helper.getFilterById(filterId);
setListAdapter(new AmenityAdapter(AmenityType.getCategories()));
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_filter_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.edit_filter_delete) {
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.edit_filter_delete_dialog_title);
builder.setNegativeButton(R.string.default_buttons_no, null);
builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (helper.removePoiFilter(filter)) {
Toast.makeText(
EditPOIFilterActivity.this,
MessageFormat.format(EditPOIFilterActivity.this.getText(R.string.edit_filter_delete_message).toString(),
filter.getName()), Toast.LENGTH_SHORT).show();
EditPOIFilterActivity.this.finish();
}
}
});
builder.create().show();
return true;
} else if (item.getItemId() == R.id.edit_filter_save_as) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.edit_filter_save_as_menu_item);
final EditText editText = new EditText(this);
builder.setView(editText);
builder.setNegativeButton(R.string.default_buttons_cancel, null);
builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PoiFilter nFilter = new PoiFilter(editText.getText().toString(), null, filter.getAcceptedTypes(), (OsmandApplication) getApplication());
if (helper.createPoiFilter(nFilter)) {
Toast.makeText(
EditPOIFilterActivity.this,
MessageFormat.format(EditPOIFilterActivity.this.getText(R.string.edit_filter_create_message).toString(),
editText.getText().toString()), Toast.LENGTH_SHORT).show();
}
EditPOIFilterActivity.this.finish();
}
});
builder.create().show();
return true;
}
return super.onOptionsItemSelected(item);
}
private void showDialog(final AmenityType amenity) {
Builder builder = new AlertDialog.Builder(this);
ScrollView scroll = new ScrollView(this);
ListView listView = new ListView(this);
final LinkedHashSet<String> subCategories = new LinkedHashSet<String>(AmenityType.getSubCategories(amenity, MapRenderingTypes.getDefault()));
Set<String> acceptedCategories = filter.getAcceptedSubtypes(amenity);
if (acceptedCategories != null) {
for (String s : acceptedCategories) {
if (!subCategories.contains(s)) {
subCategories.add(s);
}
}
}
final String[] array = subCategories.toArray(new String[0]);
final boolean[] selected = new boolean[array.length];
for (int i = 0; i < selected.length; i++) {
if (acceptedCategories == null) {
selected[i] = true;
} else {
selected[i] = acceptedCategories.contains(array[i]);
}
}
scroll.addView(listView);
builder.setView(scroll);
builder.setNeutralButton(EditPOIFilterActivity.this.getText(R.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(amenity, null);
} else if(accepted.size() == 0){
filter.setTypeToAccept(amenity, false);
} else {
filter.selectSubTypesToAccept(amenity, accepted);
}
helper.editPoiFilter(filter);
((AmenityAdapter) EditPOIFilterActivity.this.getListAdapter()).notifyDataSetInvalidated();
}
});
builder.setPositiveButton(EditPOIFilterActivity.this.getText(R.string.default_buttons_selectall), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
filter.selectSubTypesToAccept(amenity, null);
helper.editPoiFilter(filter);
((AmenityAdapter) EditPOIFilterActivity.this.getListAdapter()).notifyDataSetInvalidated();
}
});
builder.setMultiChoiceItems(array, selected, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int item, boolean isChecked) {
selected[item] = isChecked;
}
});
builder.show();
}
@Override
public AmenityAdapter getListAdapter() {
return (AmenityAdapter) super.getListAdapter();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
showDialog(getListAdapter().getItem(position));
}
class AmenityAdapter extends ArrayAdapter<AmenityType> {
AmenityAdapter(AmenityType[] amenityTypes) {
super(EditPOIFilterActivity.this, R.layout.editing_poi_filter_list, amenityTypes);
}
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);
}
AmenityType 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);
text.setText(OsmAndFormatter.toPublicString(model, EditPOIFilterActivity.this));
addRowListener(model, text, check);
return (row);
}
private void addRowListener(final AmenityType 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);
}
}
});
}
}
}