private static void showDialog(final Activity activity, final List<Pair<Integer, String>> offlineItems) {
        // confirmation dialog (grouped by type)
        final SimpleDialog.ItemSelectModel<Pair<Integer, String>> model = new SimpleDialog.ItemSelectModel<>();
        model
            .setButtonSelectionIsMandatory(false)
            .setChoiceMode(SimpleItemListModel.ChoiceMode.MULTI_CHECKBOX)
            .setItems(offlineItems)
            .setDisplayMapper((item, itemGroup) -> TextParam.text(item.second), (item, itemGroup) -> String.valueOf(item.first), null)
            .activateGrouping(item -> activity.getString(Download.DownloadType.getFromId(item.first).getTypeNameResId()))
            .setGroupDisplayMapper(gi -> TextParam.text("**" + gi.getGroup() + "** *(" + gi.getContainedItemCount() + ")*").setMarkdown(true))
            .setGroupDisplayIconMapper(gi -> ImageParam.id(gi.getItems().isEmpty() ? 0 : Download.DownloadType.getFromId(gi.getItems().get(0).first).getIconResId()));

        SimpleDialog.of(activity).setTitle(TextParam.id(R.string.delete_items))
            .setPositiveButton(TextParam.id(R.string.delete))
            .selectMultiple(model, (selected) -> {
                if (selected.isEmpty()) {
                    ActivityMixin.showShortToast(activity, R.string.no_files_selected);
                }
                int filesDeleted = 0;
                final ContentStorage cs = ContentStorage.get();
                for (Pair<Integer, String> offlineItem : selected) {
                    PersistableFolder folder = null;
                    if (offlineItem.first == DOWNLOAD_TYPE_ALL_MAPS.id) {
                        folder = PersistableFolder.OFFLINE_MAPS;
                    } else if (offlineItem.first == DOWNLOAD_TYPE_ALL_THEMES.id) {
                        folder = PersistableFolder.OFFLINE_MAP_THEMES;
                    } else if (offlineItem.first == DOWNLOADTYPE_BROUTER_TILES.id) {
                        folder = PersistableFolder.ROUTING_TILES;
                    } else if (offlineItem.first == DOWNLOADTYPE_HILLSHADING_TILES.id) {
                        folder = PersistableFolder.OFFLINE_MAP_SHADING;
                    } else if (offlineItem.first == DOWNLOADTYPE_MAP_OPENANDROMAPS_BACKGROUNDS.id) {
                        folder = PersistableFolder.BACKGROUND_MAPS;
                    } else if (offlineItem.first == DOWNLOADTYPE_LANGUAGE_MODEL.id) {
                        OfflineTranslateUtils.deleteLanguageModel(offlineItem.second);
                        filesDeleted++;
                    }
                    if (folder != null) {
                        final List<ContentStorage.FileInformation> files = cs.list(folder);
                        for (ContentStorage.FileInformation fi : files) {
                            if (StringUtils.equals(fi.name, offlineItem.second)) {
                                cs.delete(fi.uri);
                            }
                        }
                        cs.delete(CompanionFileUtils.companionFileExists(files, offlineItem.second));
                        filesDeleted++;
                    }
                }
                ActivityMixin.showShortToast(activity, activity.getResources().getQuantityString(R.plurals.files_deleted, filesDeleted, filesDeleted));
                // update map lists in case something has changed there
                MapsforgeMapProvider.getInstance().updateOfflineMaps(); // update legacy NewMap/CGeoMap until they get removed
                TileProviderFactory.buildTileProviderList(true);
            });
    }
list offline data (only those types downloadable using the downloader)
and offer to remove it
main/src/main/java/cgeo/geocaching/downloader/DownloaderUtils.java