package net.osmand.plus.quickaction.actions; import android.content.Context; import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickActionFactory; import net.osmand.plus.render.RenderingIcons; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; public class ShowHidePoiAction extends QuickAction { public static final int TYPE = 5; public static final String KEY_FILTERS = "filters"; private transient EditText title; public ShowHidePoiAction() { super(TYPE); } public ShowHidePoiAction(QuickAction quickAction) { super(quickAction); } @Override public String getActionText(OsmandApplication application) { return !isCurrentFilters(application) ? application.getString(R.string.quick_action_poi_show, getName(application)) : application.getString(R.string.quick_action_poi_hide, getName(application)); } @Override public boolean isActionWithSlash(OsmandApplication application) { return isCurrentFilters(application); } @Override public void setAutoGeneratedTitle(EditText title) { this.title = title; } @Override public int getIconRes(Context context) { if (getParams().get(KEY_FILTERS) == null || getParams().get(KEY_FILTERS).isEmpty()) { return super.getIconRes(); } else { OsmandApplication app = (OsmandApplication) context.getApplicationContext(); List<String> filters = new ArrayList<>(); String filtersId = getParams().get(KEY_FILTERS); Collections.addAll(filters, filtersId.split(",")); if (app.getPoiFilters() == null) return super.getIconRes(); PoiUIFilter filter = app.getPoiFilters().getFilterById(filters.get(0)); if (filter == null) return super.getIconRes(); Object res = filter.getIconResource(); if (res instanceof String && RenderingIcons.containsBigIcon(res.toString())) { return RenderingIcons.getBigIconResourceId(res.toString()); } else return super.getIconRes(); } } @Override public void execute(MapActivity activity) { PoiFiltersHelper pf = activity.getMyApplication().getPoiFilters(); List<PoiUIFilter> poiFilters = loadPoiFilters(activity.getMyApplication().getPoiFilters()); if (!isCurrentFilters(pf.getSelectedPoiFilters(), poiFilters)) { pf.clearSelectedPoiFilters(); for (PoiUIFilter filter : poiFilters) { pf.addSelectedPoiFilter(filter); } } else pf.clearSelectedPoiFilters(); activity.getMapLayers().updateLayers(activity.getMapView()); } private boolean isCurrentFilters(OsmandApplication application) { PoiFiltersHelper pf = application.getPoiFilters(); List<PoiUIFilter> poiFilters = loadPoiFilters(application.getPoiFilters()); return isCurrentFilters(pf.getSelectedPoiFilters(), poiFilters); } private boolean isCurrentFilters(Set<PoiUIFilter> currentPoiFilters, List<PoiUIFilter> poiFilters) { if (currentPoiFilters.size() != poiFilters.size()) return false; return currentPoiFilters.containsAll(poiFilters); } @Override public void drawUI(ViewGroup parent, final MapActivity activity) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.quick_action_show_hide_poi, parent, false); RecyclerView list = (RecyclerView) view.findViewById(R.id.list); Button addFilter = (Button) view.findViewById(R.id.btnAddCategory); final Adapter adapter = new Adapter(!getParams().isEmpty() ? loadPoiFilters(activity.getMyApplication().getPoiFilters()) : new ArrayList<PoiUIFilter>()); list.setAdapter(adapter); addFilter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showSingleChoicePoiFilterDialog(activity.getMyApplication(), activity, adapter); } }); parent.addView(view); } public class Adapter extends RecyclerView.Adapter<Adapter.Holder> { private List<PoiUIFilter> filters; public Adapter(List<PoiUIFilter> filters) { this.filters = filters; } private void addItem(PoiUIFilter filter) { if (!filters.contains(filter)) { filters.add(filter); savePoiFilters(filters); notifyDataSetChanged(); } } @Override public Adapter.Holder onCreateViewHolder(ViewGroup parent, int viewType) { return new Adapter.Holder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.quick_action_deletable_list_item, parent, false)); } @Override public void onBindViewHolder(final Adapter.Holder holder, final int position) { final PoiUIFilter filter = filters.get(position); Object res = filter.getIconResource(); if (res instanceof String && RenderingIcons.containsBigIcon(res.toString())) { holder.icon.setImageResource(RenderingIcons.getBigIconResourceId(res.toString())); } else { holder.icon.setImageResource(R.drawable.mx_user_defined); } holder.title.setText(filter.getName()); holder.delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String oldTitle = getTitle(filters); filters.remove(position); savePoiFilters(filters); notifyDataSetChanged(); if (oldTitle.equals(title.getText().toString()) || title.getText().toString().equals(getName(holder.title.getContext()))) { String newTitle = getTitle(filters); title.setText(newTitle); } } }); } @Override public int getItemCount() { return filters.size(); } class Holder extends RecyclerView.ViewHolder { private TextView title; private ImageView icon; private ImageView delete; public Holder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); icon = (ImageView) itemView.findViewById(R.id.icon); delete = (ImageView) itemView.findViewById(R.id.delete); } } } public void savePoiFilters(List<PoiUIFilter> poiFilters) { List<String> filters = new ArrayList<>(); for (PoiUIFilter f : poiFilters) { filters.add(f.getFilterId()); } getParams().put(KEY_FILTERS, TextUtils.join(",", filters)); } private List<PoiUIFilter> loadPoiFilters(PoiFiltersHelper helper) { List<String> filters = new ArrayList<>(); String filtersId = getParams().get(KEY_FILTERS); if (filtersId != null && !filtersId.trim().isEmpty()) { Collections.addAll(filters, filtersId.split(",")); } List<PoiUIFilter> poiFilters = new ArrayList<>(); for (String f : filters) { PoiUIFilter filter = helper.getFilterById(f); if (filter != null) { poiFilters.add(filter); } } return poiFilters; } private void showSingleChoicePoiFilterDialog(final OsmandApplication app, final MapActivity activity, final Adapter filtersAdapter) { final PoiFiltersHelper poiFilters = app.getPoiFilters(); final ContextMenuAdapter adapter = new ContextMenuAdapter(); adapter.addItem(new ContextMenuItem.ItemBuilder() .setTitleId(R.string.shared_string_search, app) .setIcon(R.drawable.ic_action_search_dark).createItem()); final List<PoiUIFilter> list = new ArrayList<>(); list.add(poiFilters.getCustomPOIFilter()); for (PoiUIFilter f : poiFilters.getTopDefinedPoiFilters()) { addFilterToList(adapter, list, f); } for (PoiUIFilter f : poiFilters.getSearchPoiFilters()) { addFilterToList(adapter, list, f); } final ArrayAdapter<ContextMenuItem> listAdapter = adapter.createListAdapter(activity, app.getSettings().isLightContent()); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setAdapter(listAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String oldTitle = getTitle(filtersAdapter.filters); filtersAdapter.addItem(list.get(which)); if (oldTitle.equals(title.getText().toString()) || title.getText().toString().equals(getName(activity))) { String newTitle = getTitle(filtersAdapter.filters); title.setText(newTitle); } } }); builder.setTitle(R.string.show_poi_over_map); builder.setNegativeButton(R.string.shared_string_dismiss, null); final AlertDialog alertDialog = builder.create(); alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { Button neutralButton = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL); Drawable drawable = app.getIconsCache().getThemedIcon(R.drawable.ic_action_multiselect); neutralButton.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); } }); alertDialog.show(); } private String getTitle(List<PoiUIFilter> filters) { if (filters.isEmpty()) return ""; return filters.size() > 1 ? filters.get(0).getName() + " +" + (filters.size() - 1) : filters.get(0).getName(); } private void addFilterToList(final ContextMenuAdapter adapter, final List<PoiUIFilter> list, final PoiUIFilter f) { list.add(f); ContextMenuItem.ItemBuilder builder = new ContextMenuItem.ItemBuilder(); builder.setTitle(f.getName()); if (RenderingIcons.containsBigIcon(f.getIconId())) { builder.setIcon(RenderingIcons.getBigIconResourceId(f.getIconId())); } else { builder.setIcon(R.drawable.mx_user_defined); } builder.setColor(ContextMenuItem.INVALID_ID); builder.setSkipPaintingWithoutColor(true); adapter.addItem(builder.createItem()); } @Override public boolean fillParams(View root, MapActivity activity) { return !getParams().isEmpty() && (getParams().get(KEY_FILTERS) != null || !getParams().get(KEY_FILTERS).isEmpty()); } }