public static void showNavigationMenu(final Activity activity,
                                          final Geocache cache, final Waypoint waypoint, final Geopoint destination,
                                          final boolean showInternalMap, final boolean showDefaultNavigation, final int menuResToEnableOnDismiss) {
        final List<NavigationAppsEnum> items = new ArrayList<>();
        final int defaultNavigationTool = Settings.getDefaultNavigationTool();
        for (final NavigationAppsEnum navApp : getActiveNavigationApps()) {
            if ((showInternalMap || !(navApp.app instanceof InternalMap)) &&
                    (showDefaultNavigation || defaultNavigationTool != navApp.id)) {
                if ((cache != null && navApp.app instanceof CacheNavigationApp && navApp.app.isEnabled(cache))
                    || (waypoint != null && navApp.app instanceof WaypointNavigationApp && ((WaypointNavigationApp) navApp.app).isEnabled(waypoint))
                    || (destination != null && navApp.app instanceof GeopointNavigationApp)) {
                    items.add(navApp);
                }
            }
        }

        if (items.size() == 1) {
            invokeNavigation(activity, cache, waypoint, destination, items.get(0).app);
            return;
        }

        /*
         * Using an ArrayAdapter with list of NavigationAppsEnum items avoids
         * handling between mapping list positions allows us to do dynamic filtering of the list based on use case.
         */
        final ArrayAdapter<NavigationAppsEnum> adapter = new ArrayAdapter<>(activity, R.layout.select_dialog_item, items);

        final AlertDialog.Builder builder = Dialogs.newBuilder(activity);
        builder.setTitle(R.string.cache_menu_navigate);
        builder.setAdapter(adapter, (dialog, item) -> {
            final NavigationAppsEnum selectedItem = adapter.getItem(item);
            invokeNavigation(activity, cache, waypoint, destination, selectedItem.app);
        });
        final AlertDialog alert = builder.create();
        if (menuResToEnableOnDismiss != 0) {
            alert.setOnDismissListener(dialog -> ViewUtils.setEnabled(activity.findViewById(menuResToEnableOnDismiss), true));
        }
        alert.show();
    }
Specialized way to handle selection of navigation tool.<br />
A dialog is created for tool selection and the selected tool is started afterwards.

@param cache                 may be {@code null}
@param waypoint              may be {@code null}
@param destination           may be {@code null}
@param showInternalMap       should be {@code false} only when called from within the internal map
@param showDefaultNavigation should be {@code false} by default
@param menuResToEnableOnDismiss res id of menu item to enable on dialog dismiss (0 if unused)
@see #showNavigationMenu(Activity, Geocache, Waypoint, Geopoint)
main/src/main/java/cgeo/geocaching/apps/navi/NavigationAppFactory.java