package net.osmand.plus.download; import android.content.Context; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.util.Algorithms; import org.xmlpull.v1.XmlPullParser; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; public class DownloadActivityType { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.US); private static Map<String, DownloadActivityType> byTag = new HashMap<>(); public static final DownloadActivityType NORMAL_FILE = new DownloadActivityType(R.string.download_regular_maps, "map", 10); public static final DownloadActivityType VOICE_FILE = new DownloadActivityType(R.string.voices, R.drawable.ic_action_volume_up, "voice", 20); public static final DownloadActivityType FONT_FILE = new DownloadActivityType(R.string.fonts_header, R.drawable.ic_action_map_language, "fonts", 25); public static final DownloadActivityType ROADS_FILE = new DownloadActivityType(R.string.download_roads_only_maps, "road_map", 30); public static final DownloadActivityType SRTM_COUNTRY_FILE = new DownloadActivityType(R.string.download_srtm_maps, R.drawable.ic_plugin_srtm, "srtm_map", 40); public static final DownloadActivityType DEPTH_CONTOUR_FILE = new DownloadActivityType(R.string.download_regular_maps, "depth", 45); public static final DownloadActivityType HILLSHADE_FILE = new DownloadActivityType(R.string.download_hillshade_maps, R.drawable.ic_action_hillshade_dark, "hillshade", 50); public static final DownloadActivityType WIKIPEDIA_FILE = new DownloadActivityType(R.string.download_wikipedia_maps, R.drawable.ic_plugin_wikipedia, "wikimap", 60); public static final DownloadActivityType LIVE_UPDATES_FILE = new DownloadActivityType(R.string.download_live_updates, "live_updates", 70); private final int stringResource; private final int iconResource; private String tag; private int orderIndex; public DownloadActivityType(int stringResource, int iconResource, String tag, int orderIndex) { this.stringResource = stringResource; this.tag = tag; this.orderIndex = orderIndex; byTag.put(tag, this); this.iconResource = iconResource; } public DownloadActivityType(int stringResource, String tag, int orderIndex) { this.stringResource = stringResource; this.tag = tag; this.orderIndex = orderIndex; byTag.put(tag, this); iconResource = R.drawable.ic_map; } public int getStringResource(){ return stringResource; } public int getIconResource() { return iconResource; } public String getTag() { return tag; } public int getOrderIndex() { return orderIndex; } public static boolean isCountedInDownloads(IndexItem es) { DownloadActivityType tp = es.getType(); if(tp == NORMAL_FILE || tp == ROADS_FILE){ if (!es.extra) { return true; } } return false; } public String getString(Context c) { return c.getString(stringResource); } public static DownloadActivityType getIndexType(String tagName) { return byTag.get(tagName); } protected static String addVersionToExt(String ext, int version) { return "_" + version + ext; } public boolean isAccepted(String fileName) { if(NORMAL_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)) || fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT) || fileName.endsWith(IndexConstants.SQLITE_EXT); } else if(ROADS_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_ROAD_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)); } else if (VOICE_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.VOICE_INDEX_EXT_ZIP, IndexConstants.VOICE_VERSION)); } else if (FONT_FILE == this) { return fileName.endsWith(IndexConstants.FONT_INDEX_EXT_ZIP); } else if (WIKIPEDIA_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)); } else if (SRTM_COUNTRY_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)); } else if (HILLSHADE_FILE == this) { return fileName.endsWith(IndexConstants.SQLITE_EXT); } else if (DEPTH_CONTOUR_FILE == this) { return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)); } return false; } public File getDownloadFolder(OsmandApplication ctx, IndexItem indexItem) { if (NORMAL_FILE == this) { if (indexItem.fileName.endsWith(IndexConstants.SQLITE_EXT)) { return ctx.getAppPath(IndexConstants.TILES_INDEX_DIR); } return ctx.getAppPath(IndexConstants.MAPS_PATH); } else if (VOICE_FILE == this) { return ctx.getAppPath(IndexConstants.VOICE_INDEX_DIR); } else if (FONT_FILE == this) { return ctx.getAppPath(IndexConstants.FONT_INDEX_DIR); } else if (ROADS_FILE == this) { return ctx.getAppPath(IndexConstants.ROADS_INDEX_DIR); } else if (SRTM_COUNTRY_FILE == this) { return ctx.getAppPath(IndexConstants.SRTM_INDEX_DIR); } else if (WIKIPEDIA_FILE == this) { return ctx.getAppPath(IndexConstants.WIKI_INDEX_DIR); } else if (LIVE_UPDATES_FILE == this) { return ctx.getAppPath(IndexConstants.LIVE_INDEX_DIR); } else if (HILLSHADE_FILE == this) { return ctx.getAppPath(IndexConstants.TILES_INDEX_DIR); } else if (DEPTH_CONTOUR_FILE == this) { return ctx.getAppPath(IndexConstants.MAPS_PATH); } throw new UnsupportedOperationException(); } public boolean isZipStream(OsmandApplication ctx, IndexItem indexItem) { return HILLSHADE_FILE != this; } public boolean isZipFolder(OsmandApplication ctx, IndexItem indexItem) { return this == VOICE_FILE; } public boolean preventMediaIndexing(OsmandApplication ctx, IndexItem indexItem) { return this == VOICE_FILE && indexItem.fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP); } public String getUnzipExtension(OsmandApplication ctx, IndexItem indexItem) { if (NORMAL_FILE == this) { if (indexItem.fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { return BINARY_MAP_INDEX_EXT; } else if (indexItem.fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { return BINARY_MAP_INDEX_EXT; } else if (indexItem.fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) { return IndexConstants.EXTRA_EXT; } else if (indexItem.fileName.endsWith(IndexConstants.SQLITE_EXT)) { return IndexConstants.SQLITE_EXT; } else if (indexItem.fileName.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ return ""; } } else if (ROADS_FILE == this) { return IndexConstants.BINARY_ROAD_MAP_INDEX_EXT; } else if (VOICE_FILE == this) { return ""; } else if (FONT_FILE == this) { return IndexConstants.FONT_INDEX_EXT; } else if (SRTM_COUNTRY_FILE == this) { return IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; } else if (WIKIPEDIA_FILE == this) { return IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; } else if (LIVE_UPDATES_FILE == this) { return BINARY_MAP_INDEX_EXT; } else if (HILLSHADE_FILE == this) { return IndexConstants.SQLITE_EXT; } else if (DEPTH_CONTOUR_FILE == this) { return BINARY_MAP_INDEX_EXT; } throw new UnsupportedOperationException(); } public String getUrlSuffix(OsmandApplication ctx) { if (this== ROADS_FILE) { return "&road=yes"; } else if (this == LIVE_UPDATES_FILE) { return "&aosmc=yes"; } else if (this == SRTM_COUNTRY_FILE) { return "&srtmcountry=yes"; } else if (this == WIKIPEDIA_FILE) { return "&wiki=yes"; } else if (this == HILLSHADE_FILE) { return "&hillshade=yes"; } else if (this == FONT_FILE) { return "&fonts=yes"; } else if (this == DEPTH_CONTOUR_FILE) { return "&inapp=depth"; } return ""; } public String getBaseUrl(OsmandApplication ctx, String fileName) { return "http://" + IndexConstants.INDEX_DOWNLOAD_DOMAIN + "/download?event=2&" + Version.getVersionAsURLParam(ctx) + "&file=" + encode(fileName); } protected String encode(String fileName) { try { return URLEncoder.encode(fileName, "UTF-8"); } catch (IOException e) { return fileName; } } public IndexItem parseIndexItem(Context ctx, XmlPullParser parser) { String name = parser.getAttributeValue(null, "name"); //$NON-NLS-1$ if(!isAccepted(name)) { return null; } String size = parser.getAttributeValue(null, "size"); //$NON-NLS-1$ String description = parser.getAttributeValue(null, "description"); //$NON-NLS-1$ long containerSize = Algorithms.parseLongSilently( parser.getAttributeValue(null, "containerSize"), 0); long contentSize = Algorithms.parseLongSilently( parser.getAttributeValue(null, "contentSize"), 0); long timestamp = Algorithms.parseLongSilently( parser.getAttributeValue(null, "timestamp"), 0); IndexItem it = new IndexItem(name, description, timestamp, size, contentSize, containerSize, this); it.extra = FileNameTranslationHelper.getStandardMapName(ctx, it.getBasename().toLowerCase()) != null; return it; } protected static String reparseDate(Context ctx, String date) { try { Date d = simpleDateFormat.parse(date); return AndroidUtils.formatDate(ctx, d.getTime()); } catch (ParseException e) { return date; } } public String getVisibleDescription(IndexItem indexItem, Context ctx) { if (this == SRTM_COUNTRY_FILE) { return ctx.getString(R.string.download_srtm_maps); } else if (this == WIKIPEDIA_FILE) { return ctx.getString(R.string.shared_string_wikipedia); } else if (this == ROADS_FILE) { return ctx.getString(R.string.download_roads_only_item); } else if (this == DEPTH_CONTOUR_FILE) { return ctx.getString(R.string.download_depth_countours); } else if (this == FONT_FILE) { return ctx.getString(R.string.fonts_header); } return ""; } public String getVisibleName(IndexItem indexItem, Context ctx, OsmandRegions osmandRegions, boolean includingParent) { if (this == VOICE_FILE) { String fileName = indexItem.fileName; if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { return FileNameTranslationHelper.getVoiceName(ctx, getBasename(indexItem)); } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { return FileNameTranslationHelper.getVoiceName(ctx, getBasename(indexItem)); } return getBasename(indexItem); } if (this == FONT_FILE) { return FileNameTranslationHelper.getFontName(ctx, getBasename(indexItem)); } final String basename = getBasename(indexItem); if (basename.endsWith(FileNameTranslationHelper.WIKI_NAME)){ return FileNameTranslationHelper.getWikiName(ctx, basename); } // if (this == HILLSHADE_FILE){ // return FileNameTranslationHelper.getHillShadeName(ctx, osmandRegions, bn); // } final String lc = basename.toLowerCase(); String std = FileNameTranslationHelper.getStandardMapName(ctx, lc); if (std != null) { return std; } if (basename.contains("addresses-nationwide")) { final int ind = basename.indexOf("addresses-nationwide"); String downloadName = basename.substring(0, ind - 1) + basename.substring(ind + "addresses-nationwide".length()); return osmandRegions.getLocaleName(downloadName, includingParent) + " "+ ctx.getString(R.string.index_item_nation_addresses); } return osmandRegions.getLocaleName(basename, includingParent); } public String getTargetFileName(IndexItem item) { String fileName = item.fileName; // if(fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP) || // fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { if (this == VOICE_FILE) { int l = fileName.lastIndexOf('_'); if (l == -1) { l = fileName.length(); } return fileName.substring(0, l); } else if (this == FONT_FILE) { int l = fileName.indexOf('.'); if (l == -1) { l = fileName.length(); } return fileName.substring(0, l) + IndexConstants.FONT_INDEX_EXT; } else if (this == HILLSHADE_FILE) { return fileName.replace('_', ' '); } else if (this == LIVE_UPDATES_FILE) { int l = fileName.lastIndexOf('.'); if (l == -1) { l = fileName.length(); } return fileName.substring(0, l) + IndexConstants.BINARY_MAP_INDEX_EXT; } else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) || fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { int l = fileName.lastIndexOf('_'); if (l == -1) { l = fileName.length(); } String baseNameWithoutVersion = fileName.substring(0, l); if (this == SRTM_COUNTRY_FILE) { return baseNameWithoutVersion + IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; } if (this == WIKIPEDIA_FILE) { return baseNameWithoutVersion + IndexConstants.BINARY_WIKI_MAP_INDEX_EXT; } if (this == ROADS_FILE) { return baseNameWithoutVersion + IndexConstants.BINARY_ROAD_MAP_INDEX_EXT; } baseNameWithoutVersion += IndexConstants.BINARY_MAP_INDEX_EXT; return baseNameWithoutVersion; } else if (fileName.endsWith(IndexConstants.SQLITE_EXT)) { return fileName.replace('_', ' '); } else if (fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) { return fileName.substring(0, fileName.length() - IndexConstants.EXTRA_ZIP_EXT.length()) + IndexConstants.EXTRA_EXT; } return fileName; } public String getBasename(IndexItem indexItem) { String fileName = indexItem.fileName; if (fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) { return fileName.substring(0, fileName.length() - IndexConstants.EXTRA_ZIP_EXT.length()); } if (this == HILLSHADE_FILE) { return fileName.substring(0, fileName.length() - IndexConstants.SQLITE_EXT.length()) .replace(FileNameTranslationHelper.HILL_SHADE, ""); } if (fileName.endsWith(IndexConstants.SQLITE_EXT)) { return fileName.substring(0, fileName.length() - IndexConstants.SQLITE_EXT.length()); } if (this == VOICE_FILE) { int l = fileName.lastIndexOf('_'); if (l == -1) { l = fileName.length(); } return fileName.substring(0, l); } if (this == FONT_FILE) { int l = fileName.indexOf('.'); if (l == -1) { l = fileName.length(); } return fileName.substring(0, l); } if (this == LIVE_UPDATES_FILE) { if(fileName.indexOf('.') > 0){ return fileName.substring(0, fileName.indexOf('.')); } return fileName; } int ls = fileName.lastIndexOf('_'); if (ls >= 0) { return fileName.substring(0, ls); } else if(fileName.indexOf('.') > 0){ return fileName.substring(0, fileName.indexOf('.')); } return fileName; } }