public void onTap(final int latitudeE6, final int longitudeE6, final int x, final int y, final boolean isLongTap) {

        final Geopoint touchedPoint = Geopoint.forE6(latitudeE6, longitudeE6);

        // lookup elements touched by this
        final LinkedList<MapSelectableItem> result = new LinkedList<>();

        for (String key : clickableItemsLayer.getTouched(Geopoint.forE6(latitudeE6, longitudeE6))) {

            if (key.startsWith(UnifiedMapViewModel.CACHE_KEY_PREFIX)) {
                final String geocode = key.substring(UnifiedMapViewModel.CACHE_KEY_PREFIX.length());

                final Geocache temp = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
                if (temp != null && temp.getCoords() != null) {
                    result.add(new MapSelectableItem(new RouteItem(temp)));
                }
            }

            if (key.startsWith(UnifiedMapViewModel.COORDSPOINT_KEY_PREFIX) && isLongTap) { // only consider when tap was a longTap
                final String identifier = key.substring(UnifiedMapViewModel.COORDSPOINT_KEY_PREFIX.length());

                for (RouteItem item : viewModel.individualRoute.getValue().getRouteItems()) {
                    if (identifier.equals(item.getIdentifier())) {
                        result.add(new MapSelectableItem(item));
                        break;
                    }
                }
            }

            if (key.startsWith(UnifiedMapViewModel.WAYPOINT_KEY_PREFIX)) {
                final String fullGpxId = key.substring(UnifiedMapViewModel.WAYPOINT_KEY_PREFIX.length());
                viewModel.waypoints.read(wps -> {
                    for (Waypoint waypoint : wps) {
                        if (fullGpxId.equals(waypoint.getFullGpxId())) {
                            result.add(new MapSelectableItem(new RouteItem(waypoint)));
                            break;
                        }
                    }
                });
            }

            if (key.startsWith(IndividualRouteLayer.KEY_INDIVIDUAL_ROUTE) && isLongTap) {
                result.add(new MapSelectableItem(viewModel.individualRoute.getValue()));
            }
            if (key.startsWith(TracksLayer.TRACK_KEY_PREFIX) && viewModel.getTracks().getTrack(key.substring(TracksLayer.TRACK_KEY_PREFIX.length())).getRoute() instanceof Route && isLongTap) {
                result.add(new MapSelectableItem((Route) viewModel.getTracks().getTrack(key.substring(TracksLayer.TRACK_KEY_PREFIX.length())).getRoute()));
            }
            if (key.startsWith(WherigoLayer.WHERIGO_KEY_PRAEFIX) && !isLongTap) {
                result.add(new MapSelectableItem(WherigoGame.get().getZone(key.substring(WherigoLayer.WHERIGO_KEY_PRAEFIX.length())),
                        key.substring(WherigoLayer.WHERIGO_KEY_PRAEFIX.length()), // Zone name
                        WherigoGame.get().getCartridgeName(), // Wherigo
                        WherigoThingType.LOCATION.getIconId()));
            }

            if (key.startsWith(GeoItemTestLayer.TESTLAYER_KEY_PREFIX)) {
                result.add(new MapSelectableItem(key, "Test item: " + key.substring(GeoItemTestLayer.TESTLAYER_KEY_PREFIX.length()), clickableItemsLayer.get(key).getType().toString(), -1));
            }



        }
        Log.d("touched elements on " + touchedPoint + " (" + result.size() + "): " + result);

        if (result.isEmpty()) {
            if (isLongTap) {
                viewModel.longTapCoords.setValue(touchedPoint);
                MapUtils.createMapLongClickPopupMenu(this, touchedPoint, new Point(x, y), viewModel.individualRoute.getValue(), route -> viewModel.individualRoute.notifyDataChanged(), this::updateRouteTrackButtonVisibility, getCurrentTargetCache(), new MapOptions(null, "", viewModel.mapType.fromList), viewModel::setTarget)
                        .setOnDismissListener(d -> viewModel.longTapCoords.setValue(null))
                        .show();
            } else {
                if (sheetRemoveFragment()) {
                    return;
                }
                mapFragment.adaptLayoutForActionBar(HideActionBarUtils.toggleActionBar(this));
                GeoItemTestLayer.handleTapTest(clickableItemsLayer, this, touchedPoint, "", isLongTap);
            }
        } else if (result.size() == 1) {
            handleTap(result.get(0), touchedPoint, isLongTap, x, y);
        } else {
            try {
                final ArrayList<MapSelectableItem> sorted = new ArrayList<>(result);
                Collections.sort(sorted, MapSelectableItem.NAME_COMPARATOR);

                final SimpleDialog.ItemSelectModel<MapSelectableItem> model = new SimpleDialog.ItemSelectModel<>();
                model
                        .setItems(sorted)
                        .setDisplayViewMapper((item, itemGroup, ctx, view, parent) ->
                                        GeoItemSelectorUtils.createMapSelectableItemView(UnifiedMapActivity.this, item, GeoItemSelectorUtils.getOrCreateView(UnifiedMapActivity.this, view, parent)),
                                (item, itemGroup) -> item == null ? "" : item.getSortFilterString())
                        .setItemPadding(0);

                SimpleDialog.of(this).setTitle(R.string.map_select_multiple_items).selectSingle(model, item -> handleTap(item, touchedPoint, isLongTap, x, y));

            } catch (final Resources.NotFoundException e) {
                Log.e("UnifiedMapActivity.showSelection", e);
            }
        }

    }
to be called by map fragments' observers for zoom level change
main/src/main/java/cgeo/geocaching/unifiedmap/UnifiedMapActivity.java