public static void checkHillshadingData(final Activity activity, final double minLatitude, final double minLongitude, final double maxLatitude, final double maxLongitude) {
        ActivityMixin.showToast(activity, R.string.downloadmap_checking);

        final HashMap<String, String> requiredTiles = new HashMap<>();
        final ArrayList<Download> missingDownloads = new ArrayList<>();
        final AtomicBoolean hasUnsupportedTiles = new AtomicBoolean(false);

        AndroidRxUtils.andThenOnUi(AndroidRxUtils.networkScheduler, () -> {
            // calculate affected routing tiles
            int curLat = (int) Math.floor(minLatitude);
            final int maxLat = (int) Math.floor(maxLatitude);
            final int maxLon = (int) Math.floor(maxLongitude);
            while (curLat <= maxLat) {
                int curLon = (int) Math.floor(minLongitude);
                while (curLon <= maxLon) {
                    final String curLat02d = String.format(Locale.US, "%02d", Math.abs(curLat));
                    final String filenameBase = (curLat < 0 ? "S" : "N") + curLat02d + (curLon < 0 ? "W" : "E") + String.format(Locale.US, "%03d", Math.abs(curLon)) + HILLSHADING_TILE_FILEEXTENSION;
                    final String dirName = (curLat < 0 ? "S" : "N") + curLat02d;
                    requiredTiles.put(filenameBase, dirName);
                    curLon += 1;
                }
                curLat += 1;
            }
            checkHillshadingTiles(requiredTiles, missingDownloads, hasUnsupportedTiles);
        }, () -> {
            // give feedback to the user + offer to download missing tiles (if available)
            if (missingDownloads.isEmpty()) {
                ActivityMixin.showShortToast(activity, hasUnsupportedTiles.get() ? R.string.check_hillshading_unsupported : R.string.check_hillshading_found);
            } else {
                if (hasUnsupportedTiles.get()) {
                    ActivityMixin.showShortToast(activity, R.string.check_hillshading_unsupported);
                }
                DownloaderUtils.triggerDownloads(activity, R.string.downloadtile_title, R.string.check_hillshading_missing, missingDownloads, null);
            }
        });
    }
Applies given filter to cache list. Additionally, creates a second list additionally filtered by own/found/disabled caches if required
main/src/main/java/cgeo/geocaching/maps/MapUtils.java