diff --git a/OsmAnd-java/src/net/osmand/IndexConstants.java b/OsmAnd-java/src/net/osmand/IndexConstants.java index a4edb1cc66..a8c73807a4 100644 --- a/OsmAnd-java/src/net/osmand/IndexConstants.java +++ b/OsmAnd-java/src/net/osmand/IndexConstants.java @@ -38,6 +38,7 @@ public class IndexConstants { public static final String BACKUP_INDEX_DIR= "backup/"; public static final String GPX_INDEX_DIR= "tracks/"; public static final String TILES_INDEX_DIR= "tiles/"; + public static final String TOURS_INDEX_DIR= "tours/"; public static final String SRTM_INDEX_DIR = "srtm/"; //$NON-NLS-1$ public static final String AV_INDEX_DIR = "avnotes/"; //$NON-NLS-1$ public static final String VOICE_INDEX_DIR = "voice/"; //$NON-NLS-1$ diff --git a/OsmAnd/res/values/sherpafy.xml b/OsmAnd/res/values/sherpafy.xml index 461bc9d2be..211b4d165a 100644 --- a/OsmAnd/res/values/sherpafy.xml +++ b/OsmAnd/res/values/sherpafy.xml @@ -2,4 +2,5 @@ Couldn\'t create settings file in tour folder. Tour + Tours diff --git a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java index 58dfe77a1e..ec28b5b2f1 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java @@ -1,5 +1,7 @@ package net.osmand.plus; +import java.util.List; + import android.app.Activity; import android.view.Window; import net.osmand.plus.activities.DownloadIndexActivity; @@ -11,6 +13,7 @@ import net.osmand.plus.activities.PluginsActivity; import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.api.SettingsAPI; +import net.osmand.plus.download.DownloadActivityType; public class OsmAndAppCustomization { @@ -73,4 +76,8 @@ public class OsmAndAppCustomization { return LocalIndexesActivity.class; } + public void getDownloadTypes(List items) { + + } + } diff --git a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java index a91a7e7cd7..922d4923b2 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java @@ -5,7 +5,6 @@ import java.io.File; import java.io.FilenameFilter; import java.text.MessageFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -96,6 +95,8 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final List downloadTypes = getDownloadTypes(); + type = downloadTypes.get(0); settings = ((OsmandApplication) getApplication()).getSettings(); if(downloadListIndexThread == null) { downloadListIndexThread = new DownloadIndexesThread(this); @@ -153,7 +154,11 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { if (intent != null && intent.getExtras() != null) { final String filter = intent.getExtras().getString(FILTER_KEY); if (filter != null) { - filterText.setText(filter); + if(filter.equals(getString(R.string.voice))) { + changeType(DownloadActivityType.VOICE_FILE); + } else { + filterText.setText(filter); + } } } List list = new ArrayList(); @@ -176,16 +181,16 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { } else { showDialogOfFreeDownloadsIfNeeded(); } - final DownloadActivityType[] downloadTypes = getDownloadTypes(); + spinnerAdapter = new ArrayAdapter(getSupportActionBar().getThemedContext(), R.layout.sherlock_spinner_item, - new ArrayList(Arrays.asList(toString(downloadTypes))) + toString(downloadTypes) ); spinnerAdapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); getSupportActionBar().setListNavigationCallbacks(spinnerAdapter, new OnNavigationListener() { @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { - changeType(downloadTypes[itemPosition]); + changeType(downloadTypes.get(itemPosition)); return true; } }); @@ -409,46 +414,34 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { public void selectDownloadType() { Builder bld = new AlertDialog.Builder(this); - final DownloadActivityType[] items = getDownloadTypes(); - bld.setItems(toString(items), new DialogInterface.OnClickListener() { + final List items = getDownloadTypes(); + bld.setItems(toString(items).toArray(new String[items.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - changeType(items[which]); + changeType(items.get(which)); } }); bld.show(); } - private String[] toString(DownloadActivityType[] t) { - String[] items = new String[t.length]; - for (int i = 0; i < t.length; i++) { - if (t[i] == DownloadActivityType.NORMAL_FILE) { - items[i] = getString(R.string.download_regular_maps); - } else if (t[i] == DownloadActivityType.ROADS_FILE) { - items[i] = getString(R.string.download_roads_only_maps); - } else if ( t[i] == DownloadActivityType.SRTM_COUNTRY_FILE) { - items[i] = getString(R.string.download_srtm_maps); - } else if (t[i] == DownloadActivityType.HILLSHADE_FILE) { - items[i] = getString(R.string.download_hillshade_maps); - } + private List toString(List t) { + ArrayList items = new ArrayList(); + for(DownloadActivityType ts : t) { + items.add(ts.getString(getMyApplication())); } return items; } - private DownloadActivityType[] getDownloadTypes() { - DownloadActivityType[] items; + private List getDownloadTypes() { + List items = new ArrayList(); + items.add(DownloadActivityType.NORMAL_FILE); + items.add(DownloadActivityType.VOICE_FILE); + items.add(DownloadActivityType.ROADS_FILE); if(OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null){ - items = new DownloadActivityType[]{ - DownloadActivityType.NORMAL_FILE, - DownloadActivityType.ROADS_FILE, - DownloadActivityType.HILLSHADE_FILE, - DownloadActivityType.SRTM_COUNTRY_FILE}; - } else { - items = new DownloadActivityType[]{ - DownloadActivityType.NORMAL_FILE, - DownloadActivityType.ROADS_FILE, - }; + items.add(DownloadActivityType.HILLSHADE_FILE); + items.add(DownloadActivityType.SRTM_COUNTRY_FILE); } + getMyApplication().getAppCustomization().getDownloadTypes(items); return items; } @@ -543,7 +536,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { if (es.getBasename() != null && es.getBasename().contains("_wiki")) { wiki = true; break; - } else if (DownloadActivityType.isCountedInDownloads(es)) { + } else if (DownloadActivityType.isCountedInDownloads(es.getType())) { total++; } } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index e28734c186..e168b27545 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -1,22 +1,304 @@ package net.osmand.plus.download; -public enum DownloadActivityType { - NORMAL_FILE, ROADS_FILE, /*SRTM_FILE, */HILLSHADE_FILE, SRTM_COUNTRY_FILE; +import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; +import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; - public static boolean isCountedInDownloads(IndexItem es) { - DownloadActivityType tp = es.getType(); - if(tp == HILLSHADE_FILE || tp == SRTM_COUNTRY_FILE || es.isVoiceItem()){ - return false; - } - return true; - } +import java.io.File; +import java.lang.reflect.Field; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.xmlpull.v1.XmlPullParser; + +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 android.content.Context; + +public class DownloadActivityType { + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy"); + private static Map byTag = new HashMap(); + public static final DownloadActivityType NORMAL_FILE = new DownloadActivityType(R.string.download_regular_maps, "map"); + public static final DownloadActivityType VOICE_FILE = new DownloadActivityType(R.string.voice, "voice"); + public static final DownloadActivityType ROADS_FILE = new DownloadActivityType(R.string.download_roads_only_maps, "road_map"); + public static final DownloadActivityType HILLSHADE_FILE = new DownloadActivityType(R.string.download_srtm_maps, "srtm_map"); + public static final DownloadActivityType SRTM_COUNTRY_FILE = new DownloadActivityType(R.string.download_hillshade_maps, "hillshade"); + private int resource; + private String[] tags; + + public DownloadActivityType(int resource, String... tags) { + this.resource = resource; + this.tags = tags; + for(String st : tags) { + byTag.put(st, this); + } + } + public static boolean isCountedInDownloads(DownloadActivityType tp) { - if(tp == HILLSHADE_FILE || tp == SRTM_COUNTRY_FILE){ - return false; + if(tp == NORMAL_FILE || tp == ROADS_FILE){ + return true; } + return false; + } + + public String getString(Context c) { + return c.getString(resource); + } + + 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 (ROADS_FILE == this || 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 (VOICE_FILE == this) { + return fileName.endsWith(addVersionToExt(IndexConstants.VOICE_INDEX_EXT_ZIP, IndexConstants.VOICE_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); + } + return false; + } + + public File getDownloadFolder(OsmandApplication ctx, IndexItem indexItem) { + if (ROADS_FILE == this || 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 (SRTM_COUNTRY_FILE == this) { + return ctx.getAppPath(IndexConstants.SRTM_INDEX_DIR); + } else if (HILLSHADE_FILE == this) { + return ctx.getAppPath(IndexConstants.TILES_INDEX_DIR); + } + throw new UnsupportedOperationException(); + } + + public boolean isZipStream(OsmandApplication ctx, IndexItem indexItem) { return true; } + 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 (ROADS_FILE == this) { + return "-roads" + BINARY_MAP_INDEX_EXT; + } else if (VOICE_FILE == this) { + return ""; + } else if (SRTM_COUNTRY_FILE == this) { + return BINARY_SRTM_MAP_INDEX_EXT; + } else if (HILLSHADE_FILE == this) { + return IndexConstants.SQLITE_EXT; + } + throw new UnsupportedOperationException(); + } + + public String getUrlSuffix(OsmandApplication ctx) { + if (this== DownloadActivityType.ROADS_FILE) { + return "&road=yes"; + } else if (this == DownloadActivityType.SRTM_COUNTRY_FILE) { + return "&srtmcountry=yes"; + }else if (this== DownloadActivityType.HILLSHADE_FILE) { + return "&hillshade=yes"; + } + return ""; + } + + public String getBaseUrl(OsmandApplication ctx, String fileName) { + return "http://" + IndexConstants.INDEX_DOWNLOAD_DOMAIN + "/download?event=2&" + + Version.getVersionAsURLParam(ctx) + "&file=" + 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 date = parser.getAttributeValue(null, "date"); //$NON-NLS-1$ + String description = parser.getAttributeValue(null, "description"); //$NON-NLS-1$ + String parts = parser.getAttributeValue(null, "parts"); //$NON-NLS-1$ + date = reparseDate(ctx, date); + IndexItem it = new IndexItem(name, description, date, size, parts, this); + + 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 == DownloadActivityType.SRTM_COUNTRY_FILE) { + return ctx.getString(R.string.download_srtm_maps); + } else if (this == DownloadActivityType.ROADS_FILE) { + return ctx.getString(R.string.download_roads_only_item); + } + return ""; + } + + private String getVoiceName(Context ctx, String basename) { + try { + String nm = basename.replace('-', '_').replace(' ', '_'); + if (nm.endsWith("_tts")) { + nm = nm.substring(0, nm.length() - 4); + } + Field f = R.string.class.getField("lang_"+nm); + if (f != null) { + Integer in = (Integer) f.get(null); + return ctx.getString(in); + } + } catch (Exception e) { + System.err.println(e.getMessage()); + } + return basename; + } + + public String getVisibleName(IndexItem indexItem, Context ctx, OsmandRegions osmandRegions) { + String fileName = indexItem.fileName; + if (this == VOICE_FILE) { + if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { + return ctx.getString(R.string.voice) + "\n" + getVoiceName(ctx, getBasename(indexItem)); + } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { + return ctx.getString(R.string.ttsvoice) + "\n" + getVoiceName(ctx, getBasename(indexItem)); + } + return getBasename(indexItem); + } + final String bn = getBasename(indexItem); + final String lc = bn.toLowerCase(); + String std = getStandardMapName(ctx, lc); + if (std != null) { + return std; + } + if (bn.contains("addresses-nationwide")) { + final int ind = bn.indexOf("addresses-nationwide"); + String downloadName = bn.substring(0, ind - 1) + bn.substring(ind + "addresses-nationwide".length()); + return osmandRegions.getLocaleName(downloadName) + + " "+ ctx.getString(R.string.index_item_nation_addresses); + } + + return osmandRegions.getLocaleName(lc); + } + + private String getStandardMapName(Context ctx, String basename) { + if(basename.equals("world-ski")) { + return ctx.getString(R.string.index_item_world_ski); + } else if(basename.equals("world_altitude_correction_ww15mgh")) { + return ctx.getString(R.string.index_item_world_altitude_correction); + } else if(basename.equals("world_basemap")) { + return ctx.getString(R.string.index_item_world_basemap); + } else if(basename.equals("world_bitcoin_payments")) { + return ctx.getString(R.string.index_item_world_bitcoin_payments); + } else if(basename.equals("world_seamarks")) { + return ctx.getString(R.string.index_item_world_seamarks); + } + return null; + } + + 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(); + } + String s = fileName.substring(0, l); + return s; + } else if (this == HILLSHADE_FILE) { + return fileName.replace('_', ' '); + } 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 == DownloadActivityType.SRTM_COUNTRY_FILE) { + return baseNameWithoutVersion + IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; + } + if (this == DownloadActivityType.ROADS_FILE) { + baseNameWithoutVersion += "-roads"; + } + 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 (fileName.endsWith(IndexConstants.SQLITE_EXT)) { + return fileName.substring(0, fileName.length() - IndexConstants.SQLITE_EXT.length()).replace('_', ' '); + } + if (this == VOICE_FILE) { + int l = fileName.lastIndexOf('_'); + if (l == -1) { + l = fileName.length(); + } + String s = fileName.substring(0, l); + return s; + } + 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; + } + + + } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadEntry.java b/OsmAnd/src/net/osmand/plus/download/DownloadEntry.java index 5be01790ae..7b4345de54 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadEntry.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadEntry.java @@ -1,7 +1,8 @@ package net.osmand.plus.download; import java.io.File; -import java.util.List; + +import net.osmand.IndexConstants; public class DownloadEntry { public Long dateModified; @@ -21,7 +22,6 @@ public class DownloadEntry { public String assetName; public DownloadActivityType type; - public List srtmFilesToDownload; public DownloadEntry attachedEntry; public IndexItem item; @@ -36,5 +36,6 @@ public class DownloadEntry { this.assetName = assetName; isAsset = true; } + } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 3f91307e06..7ffc6dbb9b 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -229,7 +229,7 @@ public class DownloadIndexesThread { boolean result = downloadFile(entry, filesToReindex, forceWifi); success = result || success; if (result) { - if (DownloadActivityType.isCountedInDownloads(entry.item)) { + if (DownloadActivityType.isCountedInDownloads(entry.item.getType())) { downloads.set(downloads.get() + 1); } if (entry.existingBackupFile != null) { @@ -264,7 +264,7 @@ public class DownloadIndexesThread { private boolean exceedsFreelimit(DownloadEntry entry) { return Version.isFreeVersion(app) && - DownloadActivityType.isCountedInDownloads(entry.item) && downloads.get() >= DownloadIndexActivity.MAXIMUM_AVAILABLE_FREE_DOWNLOADS; + DownloadActivityType.isCountedInDownloads(entry.item.getType()) && downloads.get() >= DownloadIndexActivity.MAXIMUM_AVAILABLE_FREE_DOWNLOADS; } private String reindexFiles(List filesToReindex) { @@ -586,7 +586,7 @@ public class DownloadIndexesThread { Collection> vs = getEntriesToDownload().values(); for (List v : vs) { for(DownloadEntry e : v) { - if(DownloadActivityType.isCountedInDownloads(e.item)) { + if(DownloadActivityType.isCountedInDownloads(e.item.getType())) { i++; } } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index df0dc3046f..3652bc7a0c 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -33,7 +32,6 @@ import android.text.format.DateFormat; public class DownloadOsmandIndexesHelper { private final static Log log = PlatformUtil.getLog(DownloadOsmandIndexesHelper.class); - private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy"); public static IndexFileList getIndexesList(Context ctx) { @@ -71,8 +69,8 @@ public class DownloadOsmandIndexesHelper { private static void listVoiceAssets(IndexFileList result, AssetManager amanager, PackageManager pm, OsmandSettings settings) { try { - String ext = IndexItem.addVersionToExt(IndexConstants.TTSVOICE_INDEX_EXT_ZIP, IndexConstants.TTSVOICE_VERSION); - String extvoice = IndexItem.addVersionToExt(IndexConstants.VOICE_INDEX_EXT_ZIP, IndexConstants.VOICE_VERSION); + String ext = DownloadActivityType.addVersionToExt(IndexConstants.TTSVOICE_INDEX_EXT_ZIP, IndexConstants.TTSVOICE_VERSION); + String extvoice = DownloadActivityType.addVersionToExt(IndexConstants.VOICE_INDEX_EXT_ZIP, IndexConstants.VOICE_VERSION); File voicePath = settings.getContext().getAppPath(IndexConstants.VOICE_INDEX_DIR); // list = amanager.list("voice"); String date = ""; @@ -90,7 +88,8 @@ public class DownloadOsmandIndexesHelper { if (target.endsWith("-tts/_ttsconfig.p") && target.startsWith("voice/")) { String voice = target.substring("voice/".length(), target.length() - "/_ttsconfig.p".length()); File destFile = new File(voicePath, voice + File.separatorChar + "_ttsconfig.p"); - result.add(new AssetIndexItem(voice +ext, "voice", date, dateModified, "0.1", "", key, destFile.getPath())); + result.add(new AssetIndexItem(voice +ext, "voice", date, dateModified, "0.1", "", key, destFile.getPath(), + DownloadActivityType.VOICE_FILE)); } else if (target.endsWith("/_config.p") && target.startsWith("voice/")) { String voice = target.substring("voice/".length(), target.length() - "/_config.p".length()); IndexItem item = result.getIndexFilesByName(key); @@ -105,7 +104,8 @@ public class DownloadOsmandIndexesHelper { log.error("Parse exception", es); } item.date = date; - item.attachedItem = new AssetIndexItem(voice +extvoice, "voice", date, dateModified, "0.1", "", key, destFile.getPath()); + item.attachedItem = new AssetIndexItem(voice +extvoice, "voice", date, dateModified, "0.1", "", key, destFile.getPath(), + DownloadActivityType.VOICE_FILE); } } } @@ -117,19 +117,6 @@ public class DownloadOsmandIndexesHelper { } } - private static DownloadActivityType getIndexType(String tagName){ - if("region".equals(tagName) || - "multiregion".equals(tagName)) { - return DownloadActivityType.NORMAL_FILE; - } else if("road_region".equals(tagName) ) { - return DownloadActivityType.ROADS_FILE; - } else if("srtmcountry".equals(tagName) ) { - return DownloadActivityType.SRTM_COUNTRY_FILE; - } else if("hillshade".equals(tagName) ) { - return DownloadActivityType.HILLSHADE_FILE; - } - return null; - } private static IndexFileList downloadIndexesListFromInternet(Context ctx, String versionAsUrl){ try { @@ -144,17 +131,13 @@ public class DownloadOsmandIndexesHelper { int next; while((next = parser.next()) != XmlPullParser.END_DOCUMENT) { if (next == XmlPullParser.START_TAG) { - DownloadActivityType tp = getIndexType(parser.getName()); + DownloadActivityType tp = DownloadActivityType.getIndexType(parser.getAttributeValue(null, "type")); if (tp != null) { - String name = parser.getAttributeValue(null, "name"); //$NON-NLS-1$ - String size = parser.getAttributeValue(null, "size"); //$NON-NLS-1$ - String date = parser.getAttributeValue(null, "date"); //$NON-NLS-1$ - String description = parser.getAttributeValue(null, "description"); //$NON-NLS-1$ - String parts = parser.getAttributeValue(null, "parts"); //$NON-NLS-1$ - date = reparseDate(ctx, date); - IndexItem it = new IndexItem(name, description, date, size, parts); - it.setType(tp); - result.add(it); + + IndexItem it = tp.parseIndexItem(ctx, parser); + if(it != null) { + result.add(it); + } } else if ("osmand_regions".equals(parser.getName())) { String mapversion = parser.getAttributeValue(null, "mapversion"); result.setMapVersion(mapversion); @@ -181,15 +164,6 @@ public class DownloadOsmandIndexesHelper { } } - 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 static class AssetIndexItem extends IndexItem { private final String assetName; @@ -197,8 +171,8 @@ public class DownloadOsmandIndexesHelper { private final long dateModified; public AssetIndexItem(String fileName, String description, String date, - long dateModified, String size, String parts, String assetName, String destFile) { - super(fileName, description, date, size, parts); + long dateModified, String size, String parts, String assetName, String destFile, DownloadActivityType type) { + super(fileName, description, date, size, parts, type); this.dateModified = dateModified; this.assetName = assetName; this.destFile = destFile; @@ -208,11 +182,6 @@ public class DownloadOsmandIndexesHelper { return dateModified; } - @Override - public boolean isAccepted(){ - return true; - } - @Override public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List res) { res.add(new DownloadEntry(this, assetName, destFile, dateModified)); diff --git a/OsmAnd/src/net/osmand/plus/download/IndexFileList.java b/OsmAnd/src/net/osmand/plus/download/IndexFileList.java index 5086dda169..059bd5b1fb 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexFileList.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexFileList.java @@ -47,9 +47,7 @@ public class IndexFileList implements Serializable { } public void add(IndexItem indexItem) { - if (indexItem.isAccepted()) { - indexFiles.add(indexItem); - } + indexFiles.add(indexItem); if(indexItem.getFileName().toLowerCase().startsWith("world_basemap")) { basemap = indexItem; } diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 4f195905d7..87d858d08a 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -1,11 +1,7 @@ package net.osmand.plus.download; -import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; -import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; - import java.io.File; import java.io.IOException; -import java.lang.reflect.Field; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; @@ -18,7 +14,6 @@ import net.osmand.PlatformUtil; import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.Version; import org.apache.commons.logging.Log; @@ -36,133 +31,19 @@ public class IndexItem implements Comparable { IndexItem attachedItem; DownloadActivityType type; - public IndexItem(String fileName, String description, String date, String size, String parts) { + public IndexItem(String fileName, String description, String date, String size, String parts, DownloadActivityType tp) { this.fileName = fileName; this.description = description; this.date = date; this.size = size; this.parts = parts; - this.type = DownloadActivityType.NORMAL_FILE; + this.type = tp; } public DownloadActivityType getType() { return type; } - public void setType(DownloadActivityType type) { - this.type = type; - } - - public String getVisibleDescription(Context ctx) { - String s = ""; //$NON-NLS-1$ - if (type == DownloadActivityType.SRTM_COUNTRY_FILE) { - return ctx.getString(R.string.download_srtm_maps); - } else if (type == DownloadActivityType.ROADS_FILE) { - return ctx.getString(R.string.download_roads_only_item); - } - return s; - } - - public String getVoiceName(Context ctx) { - try { - String nm = getBasename().replace('-', '_').replace(' ', '_'); - if (nm.endsWith("_tts")) { - nm = nm.substring(0, nm.length() - 4); - } - Field f = R.string.class.getField("lang_"+nm); - if (f != null) { - Integer in = (Integer) f.get(null); - return ctx.getString(in); - } - } catch (Exception e) { - System.err.println(e.getMessage()); - } - return getBasename(); - } - - public String getVisibleName(Context ctx, OsmandRegions osmandRegions) { - if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { - return ctx.getString(R.string.voice) + "\n" + getVoiceName(ctx); - } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { - return ctx.getString(R.string.ttsvoice) + "\n" + getVoiceName(ctx); - } - final String bn = getBasename(); - final String lc = bn.toLowerCase(); - String std = getStandardMapName(ctx, lc); - if (std != null) { - return std; - } - if (bn.contains("addresses-nationwide")) { - final int ind = bn.indexOf("addresses-nationwide"); - String downloadName = bn.substring(0, ind - 1) + bn.substring(ind + "addresses-nationwide".length()); - return osmandRegions.getLocaleName(downloadName) + - " "+ ctx.getString(R.string.index_item_nation_addresses); - } - - return osmandRegions.getLocaleName(lc); - } - - private String getStandardMapName(Context ctx, String basename) { - if(basename.equals("world-ski")) { - return ctx.getString(R.string.index_item_world_ski); - } else if(basename.equals("world_altitude_correction_ww15mgh")) { - return ctx.getString(R.string.index_item_world_altitude_correction); - } else if(basename.equals("world_basemap")) { - return ctx.getString(R.string.index_item_world_basemap); - } else if(basename.equals("world_bitcoin_payments")) { - return ctx.getString(R.string.index_item_world_bitcoin_payments); - } else if(basename.equals("world_seamarks")) { - return ctx.getString(R.string.index_item_world_seamarks); - } - return null; - } - - public boolean isVoiceItem() { - return fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP) || fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP); - } - - public String getBasename() { - if (fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) { - return fileName.substring(0, fileName.length() - IndexConstants.EXTRA_ZIP_EXT.length()); - } - if (fileName.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP)) { - String simple = fileName.substring(0, fileName.length() - IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP.length()); - int ls = simple.lastIndexOf('_'); - if (ls >= 0) { - return simple.substring(0, ls); - } - return simple; - } - if (fileName.endsWith(IndexConstants.SQLITE_EXT)) { - return fileName.substring(0, fileName.length() - IndexConstants.SQLITE_EXT.length()).replace('_', ' '); - } - int ls = fileName.lastIndexOf('_'); - if (ls >= 0) { - return fileName.substring(0, ls); - } - return fileName; - } - - public boolean isAccepted() { - // POI index download is not supported any longer - if (fileName.endsWith(addVersionToExt(IndexConstants.BINARY_MAP_INDEX_EXT, IndexConstants.BINARY_MAP_VERSION)) // - || fileName.endsWith(addVersionToExt(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)) // - || fileName.endsWith(addVersionToExt(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION)) // - || fileName.endsWith(addVersionToExt(IndexConstants.VOICE_INDEX_EXT_ZIP, IndexConstants.VOICE_VERSION)) - || fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT) - || fileName.endsWith(IndexConstants.SQLITE_EXT) - // || fileName.endsWith(addVersionToExt(IndexConstants.TTSVOICE_INDEX_EXT_ZIP, IndexConstants.TTSVOICE_VERSION)) drop support for - // downloading tts files from inet - ) { - return true; - } - return false; - } - - protected static String addVersionToExt(String ext, int version) { - return "_" + version + ext; - } - public String getFileName() { return fileName; } @@ -186,47 +67,8 @@ public class IndexItem implements Comparable { public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List downloadEntries) { String fileName = this.fileName; - File parent = null; - String extension = null; - boolean unzipDir = false; - boolean zipStream = false; - boolean preventMediaIndexing = false; - if (fileName.endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT_ZIP)) { - parent = ctx.getAppPath(IndexConstants.SRTM_INDEX_DIR); - extension = BINARY_SRTM_MAP_INDEX_EXT; - zipStream = true; - } else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) { - parent = ctx.getAppPath(IndexConstants.MAPS_PATH); - extension = BINARY_MAP_INDEX_EXT; - } else if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { - parent = ctx.getAppPath(IndexConstants.MAPS_PATH); - zipStream = true; - extension = BINARY_MAP_INDEX_EXT; - } else if (fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) { - parent = ctx.getAppPath(""); - // unzipDir = true; - zipStream = true; - extension = IndexConstants.EXTRA_EXT; - } else if (fileName.endsWith(IndexConstants.SQLITE_EXT)) { - parent = ctx.getAppPath(IndexConstants.TILES_INDEX_DIR); - extension = IndexConstants.SQLITE_EXT; - } else if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { - parent = ctx.getAppPath(IndexConstants.VOICE_INDEX_DIR); - zipStream = true; - extension = ""; //$NON-NLS-1$ - unzipDir = true; - preventMediaIndexing = true; - } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { - parent = ctx.getAppPath(IndexConstants.VOICE_INDEX_DIR); - zipStream = true; - extension = ""; //$NON-NLS-1$ - unzipDir = true; - } - if (type == DownloadActivityType.ROADS_FILE) { - extension = "-roads" + extension; - } else if (type == DownloadActivityType.SRTM_COUNTRY_FILE) { -// extension = "-srtm" + extension; - } + File parent = type.getDownloadFolder(ctx, this); + boolean preventMediaIndexing = type.preventMediaIndexing(ctx, this); if (parent != null) { parent.mkdirs(); // ".nomedia" indicates there are no pictures and no music to list in this dir for the Gallery and Music apps @@ -246,20 +88,9 @@ public class IndexItem implements Comparable { entry = new DownloadEntry(this); entry.type = type; entry.baseName = getBasename(); - String url = "http://" + IndexConstants.INDEX_DOWNLOAD_DOMAIN + "/download?event=2&"; - url += Version.getVersionAsURLParam(ctx) + "&"; - if (type == DownloadActivityType.ROADS_FILE) { - url += "road=yes&"; - } - if (type == DownloadActivityType.SRTM_COUNTRY_FILE) { - url += "srtmcountry=yes&"; - } - if (type == DownloadActivityType.HILLSHADE_FILE) { - url += "hillshade=yes&"; - } - entry.urlToDownload = url + "file=" + fileName; - entry.zipStream = zipStream; - entry.unzipFolder = unzipDir; + entry.urlToDownload = entry.type.getBaseUrl(ctx, fileName) + entry.type.getUrlSuffix(ctx); + entry.zipStream = type.isZipStream(ctx, this); + entry.unzipFolder = type.isZipFolder(ctx, this); try { final java.text.DateFormat format = DateFormat.getDateFormat((Context) ctx); format.setTimeZone(TimeZone.getTimeZone("GMT+01:00")); @@ -277,6 +108,7 @@ public class IndexItem implements Comparable { if (parts != null) { entry.parts = Integer.parseInt(parts); } + String extension = type.getUnzipExtension(ctx, this); entry.targetFile = new File(parent, entry.baseName + extension); File backup = new File(ctx.getAppPath(IndexConstants.BACKUP_INDEX_DIR), entry.targetFile.getName()); if (backup.exists()) { @@ -294,39 +126,6 @@ public class IndexItem implements Comparable { return downloadEntries; } - public String getTargetFileName(){ - String e = getFileName(); - - if (e.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) || e.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)) { - int l = e.lastIndexOf('_'); - if(l == -1) { - l = e.length(); - } - String s = e.substring(0, l); - if (getType() == DownloadActivityType.ROADS_FILE) { - s += "-roads" ; - } - if (getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { - return s + IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; - } - s += IndexConstants.BINARY_MAP_INDEX_EXT; - return s; - } else if(e.endsWith(IndexConstants.SQLITE_EXT)){ - return e.replace('_', ' '); - } else if(e.endsWith(IndexConstants.EXTRA_ZIP_EXT)){ - return e.substring(0, e.length() - IndexConstants.EXTRA_ZIP_EXT.length()) + IndexConstants.EXTRA_EXT; - } else if(e.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP) || e.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { - int l = e.lastIndexOf('_'); - if(l == -1) { - l = e.length(); - } - String s = e.substring(0, l); - return s; - } - - return e; - } - @Override public int compareTo(IndexItem another) { if(another == null) { @@ -339,4 +138,20 @@ public class IndexItem implements Comparable { return listAlreadyDownloaded.containsKey(getTargetFileName()); } + public String getBasename() { + return type.getBasename(this); + } + + public String getVisibleName(Context ctx, OsmandRegions osmandRegions) { + return type.getVisibleName(this, ctx, osmandRegions); + } + + public String getVisibleDescription(OsmandApplication clctx) { + return type.getVisibleDescription(this, clctx); + } + + public String getTargetFileName() { + return type.getTargetFileName(this); + } + } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java index d0aa08a08c..18122fc668 100644 --- a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -2,6 +2,7 @@ package net.osmand.plus.sherpafy; import java.io.File; import java.io.IOException; +import java.util.List; import net.osmand.plus.OsmAndAppCustomization; import net.osmand.plus.OsmandApplication; @@ -10,6 +11,7 @@ import net.osmand.plus.OsmandSettings.CommonPreference; import net.osmand.plus.R; import net.osmand.plus.activities.MainMenuActivity; import net.osmand.plus.api.FileSettingsAPIImpl; +import net.osmand.plus.download.DownloadActivityType; import android.app.Activity; import android.content.Intent; import android.view.View; @@ -85,4 +87,10 @@ public class SherpafyCustomization extends OsmAndAppCustomization { private Class getTourSelectionActivity() { return MainMenuActivity.class; } + + @Override + public void getDownloadTypes(List items) { + super.getDownloadTypes(items); + items.add(0, TourDownloadType.TOUR); + } } diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/TourDownloadType.java b/OsmAnd/src/net/osmand/plus/sherpafy/TourDownloadType.java new file mode 100644 index 0000000000..7b0e30538e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/sherpafy/TourDownloadType.java @@ -0,0 +1,61 @@ +package net.osmand.plus.sherpafy; + +import java.io.File; + +import net.osmand.IndexConstants; +import net.osmand.map.OsmandRegions; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.download.DownloadActivityType; +import net.osmand.plus.download.IndexItem; +import android.content.Context; + +public class TourDownloadType extends DownloadActivityType { + + public static final TourDownloadType TOUR = new TourDownloadType(R.string.download_tours, "tour"); + + public TourDownloadType(int resource, String... tags) { + super(resource, tags); + } + + public boolean isAccepted(String fileName) { + return true; + } + + public File getDownloadFolder(OsmandApplication ctx, IndexItem indexItem) { + return ctx.getAppPath(IndexConstants.TOURS_INDEX_DIR); + } + + public boolean isZipStream(OsmandApplication ctx, IndexItem indexItem) { + return true; + } + + public boolean isZipFolder(OsmandApplication ctx, IndexItem indexItem) { + return true; + } + + public boolean preventMediaIndexing(OsmandApplication ctx, IndexItem indexItem) { + return true; + } + + public String getUnzipExtension(OsmandApplication ctx, IndexItem indexItem) { + return ""; + } + + public String getUrlSuffix(OsmandApplication ctx) { + return "&tour=yes"; + } + + public String getVisibleDescription(IndexItem indexItem, Context ctx) { + return ""; + } + + public String getVisibleName(IndexItem indexItem, Context ctx, OsmandRegions osmandRegions) { + return getBasename(indexItem) + "\n" + indexItem.getDescription(); + } + + public String getTargetFileName(IndexItem item) { + return item.getBasename(); + } + +}