package net.osmand.core.samples.android.sample1.mapcontextmenu; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import net.osmand.core.samples.android.sample1.MainActivity; import net.osmand.core.samples.android.sample1.data.PointDescription; import net.osmand.data.LatLon; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; public class MapMultiSelectionMenu extends BaseMenuController { private LatLon latLon; private LinkedList<MenuObject> objects = new LinkedList<>(); public static class MenuObject extends MenuTitleController { private LatLon latLon; private PointDescription pointDescription; private Object object; private int order; private MainActivity mainActivity; private MenuController controller; public MenuObject(LatLon latLon, PointDescription pointDescription, Object object, MainActivity mainActivity) { this.latLon = latLon; this.pointDescription = pointDescription; this.object = object; this.mainActivity = mainActivity; init(); } protected void init() { controller = MenuController.getMenuController(mainActivity, latLon, pointDescription, object, MenuController.MenuType.MULTI_LINE); controller.setActive(true); initTitle(); } @Override public LatLon getLatLon() { return latLon; } @Override public PointDescription getPointDescription() { return pointDescription; } @Override public Object getObject() { return object; } @Override public MainActivity getMainActivity() { return mainActivity; } @Override public MenuController getMenuController() { return controller; } @Override protected boolean needStreetName() { return false; } } public MapMultiSelectionMenu(MainActivity mainActivity) { super(mainActivity); } public void setMainActivity(MainActivity mainActivity) { super.setMainActivity(mainActivity); for (MenuObject o : objects) { o.mainActivity = mainActivity; o.init(); } } public List<MenuObject> getObjects() { return objects; } @Override public float getHalfScreenMaxHeightKoef() { return 0.5f; } private void createCollection(List<Object> selectedObjects) { objects.clear(); for (Object selectedObj : selectedObjects) { LatLon ll = MenuController.getObjectLocation(selectedObj); PointDescription pointDescription = MenuController.getObjectName(selectedObj); if (ll == null) { ll = latLon; } if (pointDescription == null) { pointDescription = new PointDescription(latLon.getLatitude(), latLon.getLongitude()); } MenuObject menuObject = new MenuObject(ll, pointDescription, selectedObj, getMainActivity()); menuObject.order = MenuController.getObjectPriority(selectedObj); objects.add(menuObject); } Collections.sort(objects, new Comparator<MenuObject>() { @Override public int compare(MenuObject obj1, MenuObject obj2) { if (obj1.order == obj2.order) { return obj1.getTitleStr().compareToIgnoreCase(obj2.getTitleStr()); } else { return obj1.order - obj2.order; } } }); } private void clearMenu() { objects.clear(); getMainActivity().refreshMap(); } public void show(LatLon latLon, List<Object> selectedObjects) { if (isVisible()) { hide(); } this.latLon = latLon; createCollection(selectedObjects); updateNightMode(); MapMultiSelectionMenuFragment.showInstance(getMainActivity()); getMainActivity().refreshMap(); } public boolean isVisible() { Fragment fragment = getMainActivity().getSupportFragmentManager().findFragmentByTag(MapMultiSelectionMenuFragment.TAG); return fragment != null; } public void hide() { clearMenu(); Fragment fragment = getMainActivity().getSupportFragmentManager().findFragmentByTag(MapMultiSelectionMenuFragment.TAG); if (fragment != null) { MapMultiSelectionMenuFragment menuFragment = (MapMultiSelectionMenuFragment) fragment; menuFragment.dismissMenu(); } } public void onStop() { } public void openContextMenu(@NonNull MenuObject menuObject) { hide(); getMainActivity().showContextMenu( menuObject.getLatLon(), menuObject.getPointDescription(), menuObject.getObject()); } }