diff --git a/OsmAnd-java/src/net/osmand/Collator.java b/OsmAnd-java/src/net/osmand/Collator.java index 3991947b01..7fd96f0bc6 100644 --- a/OsmAnd-java/src/net/osmand/Collator.java +++ b/OsmAnd-java/src/net/osmand/Collator.java @@ -3,7 +3,7 @@ package net.osmand; /** * Wrapper of java.text. Collator */ -public interface Collator extends java.util.Comparator, Cloneable{ +public interface Collator extends java.util.Comparator, Cloneable { public boolean equals(String source, String target); diff --git a/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java b/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java index 0b9419ef88..1fa8ce9088 100644 --- a/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java +++ b/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java @@ -22,7 +22,7 @@ public class CollatorStringMatcher implements StringMatcher { } public CollatorStringMatcher(String part, StringMatcherMode mode) { - this.collator = PlatformUtil.primaryCollator(); + this.collator = OsmAndCollator.primaryCollator(); this.part = part; this.mode = mode; } diff --git a/OsmAnd-java/src/net/osmand/IndexConstants.java b/OsmAnd-java/src/net/osmand/IndexConstants.java index eb6c45b48e..a4edb1cc66 100644 --- a/OsmAnd-java/src/net/osmand/IndexConstants.java +++ b/OsmAnd-java/src/net/osmand/IndexConstants.java @@ -14,6 +14,7 @@ public class IndexConstants { public static final String BINARY_MAP_INDEX_EXT = ".obf"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT = ".srtm.obf"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT_ZIP = ".srtm.obf.zip"; //$NON-NLS-1$ + public static final String TOUR_INDEX_EXT = ".tour"; //$NON-NLS-1$ public static final String GEN_LOG_EXT = ".gen.log"; //$NON-NLS-1$ @@ -22,6 +23,7 @@ public class IndexConstants { public static final String TTSVOICE_INDEX_EXT_ZIP = ".ttsvoice.zip"; //$NON-NLS-1$ public static final String ANYVOICE_INDEX_EXT_ZIP = "voice.zip"; //$NON-NLS-1$ //to cactch both voices, .voice.zip and .ttsvoice.zip public static final String BINARY_MAP_INDEX_EXT_ZIP = ".obf.zip"; //$NON-NLS-1$ + public static final String TOUR_INDEX_EXT_ZIP = ".tour.zip"; //$NON-NLS-1$ public static final String EXTRA_ZIP_EXT = ".extra.zip"; public static final String EXTRA_EXT = ".extra"; diff --git a/OsmAnd-java/src/net/osmand/OsmAndCollator.java b/OsmAnd-java/src/net/osmand/OsmAndCollator.java new file mode 100644 index 0000000000..1ba11f3d60 --- /dev/null +++ b/OsmAnd-java/src/net/osmand/OsmAndCollator.java @@ -0,0 +1,40 @@ +package net.osmand; + +import java.util.Locale; + +public class OsmAndCollator { + + public static net.osmand.Collator primaryCollator() { + // romanian locale encounters diacritics as differnet symbols + final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") || + Locale.getDefault().getLanguage().equals("sk")? java.text.Collator.getInstance(Locale.US) + : java.text.Collator.getInstance(); + instance.setStrength(java.text.Collator.PRIMARY); + return wrapCollator(instance); + } + + public static net.osmand.Collator wrapCollator(final java.text.Collator instance) { + return new net.osmand.Collator() { + + @Override + public int compare(Object o1, Object o2) { + return instance.compare(o1, o2); + } + + @Override + public boolean equals(Object obj) { + return instance.equals(obj); + } + + @Override + public boolean equals(String source, String target) { + return instance.equals(source, target); + } + + @Override + public int compare(String source, String target) { + return instance.compare(source, target); + } + }; + } +} diff --git a/OsmAnd-java/src/net/osmand/PlatformUtil.java b/OsmAnd-java/src/net/osmand/PlatformUtil.java index c7c6145615..97149ef97f 100644 --- a/OsmAnd-java/src/net/osmand/PlatformUtil.java +++ b/OsmAnd-java/src/net/osmand/PlatformUtil.java @@ -27,37 +27,4 @@ public class PlatformUtil { return new org.kxml2.io.KXmlParser(); } - - public static net.osmand.Collator primaryCollator() { - // romanian locale encounters diacritics as differnet symbols - final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") ? java.text.Collator.getInstance(Locale.US) - : java.text.Collator.getInstance(); - instance.setStrength(java.text.Collator.PRIMARY); - return wrapCollator(instance); - } - - public static net.osmand.Collator wrapCollator(final java.text.Collator instance) { - return new net.osmand.Collator() { - - @Override - public int compare(Object o1, Object o2) { - return instance.compare(o1, o2); - } - - @Override - public boolean equals(Object obj) { - return instance.equals(obj); - } - - @Override - public boolean equals(String source, String target) { - return instance.equals(source, target); - } - - @Override - public int compare(String source, String target) { - return instance.compare(source, target); - } - }; - } } diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java index 90bc223619..cb427c1cb0 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -62,6 +63,7 @@ public class BinaryInspector { //"-zoom=16", //"-bbox=4,55,7,50", //"/home/victor/projects/osmand/osm-gen/Map.obf" + // "/home/victor/projects/osmand/osm-gen/Russia_bashkiria_asia_2.obf" }); } else { in.inspector(args); @@ -422,7 +424,7 @@ public class BinaryInspector { try { BinaryMapIndexReader index = new BinaryMapIndexReader(r); int i = 1; - println("Binary index " + filename + " version = " + index.getVersion()); + println("Binary index " + filename + " version = " + index.getVersion() +" edition = " + new Date(index.getDateCreated())); for(BinaryIndexPart p : index.getIndexes()){ String partname = ""; if(p instanceof MapIndex ){ diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java index b48ee00f61..8f898b60de 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java @@ -20,6 +20,7 @@ import java.util.Map.Entry; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.StringMatcher; @@ -1223,7 +1224,7 @@ public class BinaryMapIndexReader { if (query == null || query.length() == 0) { throw new IllegalArgumentException(); } - Collator collator = PlatformUtil.primaryCollator(); + Collator collator = OsmAndCollator.primaryCollator(); for (PoiRegion poiIndex : poiIndexes) { poiAdapter.initCategories(poiIndex); for (int i = 0; i < poiIndex.categories.size(); i++) { diff --git a/OsmAnd-java/src/net/osmand/data/City.java b/OsmAnd-java/src/net/osmand/data/City.java index cbadc9c975..1ed62b8ecd 100644 --- a/OsmAnd-java/src/net/osmand/data/City.java +++ b/OsmAnd-java/src/net/osmand/data/City.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.Map; import java.util.TreeMap; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; import net.osmand.util.Algorithms; public class City extends MapObject { @@ -42,7 +42,7 @@ public class City extends MapObject { private CityType type = null; // Be attentive ! Working with street names ignoring case - private Map streets = new TreeMap(PlatformUtil.primaryCollator()); + private Map streets = new TreeMap(OsmAndCollator.primaryCollator()); private String isin = null; private String postcode = null; diff --git a/OsmAnd-java/src/net/osmand/data/MapObject.java b/OsmAnd-java/src/net/osmand/data/MapObject.java index 291929eb66..f35b695a1f 100644 --- a/OsmAnd-java/src/net/osmand/data/MapObject.java +++ b/OsmAnd-java/src/net/osmand/data/MapObject.java @@ -5,7 +5,7 @@ import java.io.Serializable; import java.util.Comparator; import net.osmand.Collator; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; public abstract class MapObject implements Comparable, Serializable { @@ -66,7 +66,7 @@ public abstract class MapObject implements Comparable, Serializable { @Override public int compareTo(MapObject o) { - return PlatformUtil.primaryCollator().compare(getName(), o.getName()); + return OsmAndCollator.primaryCollator().compare(getName(), o.getName()); } public int getFileOffset() { @@ -109,7 +109,7 @@ public abstract class MapObject implements Comparable, Serializable { public static class MapObjectComparator implements Comparator{ private final boolean en; - Collator collator = PlatformUtil.primaryCollator(); + Collator collator = OsmAndCollator.primaryCollator(); public MapObjectComparator(boolean en){ this.en = en; } diff --git a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java index 2100d4c9f2..81db96e7ae 100644 --- a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java @@ -1,36 +1,57 @@ package net.osmand.map; +import gnu.trove.iterator.TIntObjectIterator; import gnu.trove.list.array.TIntArrayList; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.binary.BinaryMapIndexReader.MapIndex; +import net.osmand.binary.BinaryMapIndexReader.TagValuePair; import net.osmand.data.QuadRect; import net.osmand.data.QuadTree; import net.osmand.util.MapAlgorithms; import net.osmand.util.MapUtils; -import java.io.*; -import java.util.*; - public class OsmandRegions { private BinaryMapIndexReader reader; - Map> countries = new HashMap>(); + Map> countriesByDownloadName = new HashMap>(); + Map downloadNamesToLocaleNames = new HashMap(); + Map downloadNamesToLowercaseIndex = new HashMap(); QuadTree quadTree = null ; - Integer downloadNameType = null; Integer prefixType = null; - private Integer suffixType; + Integer downloadNameType = null; + Integer nameEnType = null; + Integer nameType = null; + Integer nameLocaleType = null; + String locale = "en"; + Integer suffixType; public void prepareFile(String fileName) throws IOException { reader = new BinaryMapIndexReader(new RandomAccessFile(fileName, "r")); + initLocaleNames(); } public boolean containsCountry(String name){ - return countries.containsKey(name); + return countriesByDownloadName.containsKey(name); } public String getDownloadName(BinaryMapDataObject o) { @@ -39,6 +60,42 @@ public class OsmandRegions { } return o.getNameByType(downloadNameType); } + + public String getLocaleName(String downloadName) { + final String lc = downloadName.toLowerCase(); + if(downloadNamesToLocaleNames.containsKey(lc)) { + return downloadNamesToLocaleNames.get(lc); + } + return downloadName.replace('_', ' '); + } + + public String getDownloadNameIndexLowercase(String downloadName) { + final String lc = downloadName.toLowerCase(); + if(downloadNamesToLowercaseIndex.containsKey(lc)) { + return downloadNamesToLowercaseIndex.get(lc); + } + return null; + } + + public String getLocaleName(BinaryMapDataObject object) { + String locName = ""; + if(locName == null || locName.length() == 0){ + if(nameLocaleType != null) { + locName = object.getNameByType(nameLocaleType); + } + } + if(locName == null || locName.length() == 0){ + if(nameEnType != null) { + locName = object.getNameByType(nameEnType); + } + } + if(locName == null || locName.length() == 0){ + if(nameType != null) { + locName = object.getNameByType(nameType); + } + } + return locName; + } public String getPrefix(BinaryMapDataObject o) { if(prefixType == null) { @@ -84,7 +141,7 @@ public class OsmandRegions { String cname = it.next(); BinaryMapDataObject container = null; int count = 0; - for (BinaryMapDataObject bo : countries.get(cname)) { + for (BinaryMapDataObject bo : countriesByDownloadName.get(cname)) { if (contain(bo, tile31x, tile31y)) { count++; container = bo; @@ -173,74 +230,125 @@ public class OsmandRegions { } return result; } + + public void setLocale(String locale) { + this.locale = locale; + } + + public void initLocaleNames() throws IOException { +// final Collator clt = OsmAndCollator.primaryCollator(); + final ResultMatcher resultMatcher = new ResultMatcher() { + + @Override + public boolean publish(BinaryMapDataObject object) { + initTypes(object); + String downloadName = object.getNameByType(downloadNameType).toLowerCase(); + String prefix = object.getNameByType(prefixType); + String locName = getLocaleName(object); + if(locName != null && locName.length() > 0){ + downloadNamesToLocaleNames.put(downloadName, locName); + } + MapIndex mi = object.getMapIndex(); + TIntObjectIterator it = object.getObjectNames().iterator(); + + StringBuilder ind = new StringBuilder(); + String pr = getDownloadNameIndexLowercase(prefix); + ind.append(pr == null ? prefix.toLowerCase() : pr.toLowerCase()).append(" "); + while(it.hasNext()) { + it.advance(); + TagValuePair tp = mi.decodeType(it.key()); + if(tp.tag.startsWith("name")) { + final String vl = it.value().toLowerCase(); +// if (!CollatorStringMatcher.ccontains(clt, ind.toString(), vl)) { + if(ind.indexOf(vl) == -1) { + ind.append(" ").append(vl); + } + } + } + downloadNamesToLowercaseIndex.put(downloadName, ind.toString()); + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + iterateOverAllObjects(resultMatcher); + } public void cacheAllCountries() throws IOException { quadTree = new QuadTree(new QuadRect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE), 8, 0.55f); + final ResultMatcher resultMatcher = new ResultMatcher() { + @Override + public boolean publish(BinaryMapDataObject object) { + if (object.getPointsLength() < 1) { + return false; + } + initTypes(object); + String nm = object.getNameByType(downloadNameType); + if (!countriesByDownloadName.containsKey(nm)) { + LinkedList ls = new LinkedList(); + countriesByDownloadName.put(nm, ls); + ls.add(object); + } else { + countriesByDownloadName.get(nm).add(object); + } + int maxx = object.getPoint31XTile(0); + int maxy = object.getPoint31YTile(0); + int minx = maxx; + int miny = maxy; + for (int i = 1; i < object.getPointsLength(); i++) { + int x = object.getPoint31XTile(i); + int y = object.getPoint31YTile(i); + if (y < miny) { + miny = y; + } else if (y > maxy) { + maxy = y; + } + if (x < minx) { + minx = x; + } else if (x > maxx) { + maxx = x; + } + } + quadTree.insert(nm, new QuadRect(minx, miny, maxx, maxy)); + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + iterateOverAllObjects(resultMatcher); + } + + private void iterateOverAllObjects(final ResultMatcher resultMatcher) throws IOException { BinaryMapIndexReader.SearchRequest sr = BinaryMapIndexReader.buildSearchRequest(0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, 5, new BinaryMapIndexReader.SearchFilter() { @Override public boolean accept(TIntArrayList types, BinaryMapIndexReader.MapIndex index) { return true; } - }, new ResultMatcher() { - - - @Override - public boolean publish(BinaryMapDataObject object) { - if (object.getPointsLength() < 1) { - return false; - } - initTypes(object); - String nm = object.getNameByType(downloadNameType); - if (!countries.containsKey(nm)) { - LinkedList ls = new LinkedList(); - countries.put(nm, ls); - ls.add(object); - } else { - countries.get(nm).add(object); - } - - int maxx = object.getPoint31XTile(0); - int maxy = object.getPoint31YTile(0); - int minx = maxx; - int miny = maxy; - for (int i = 1; i < object.getPointsLength(); i++) { - int x = object.getPoint31XTile(i); - int y = object.getPoint31YTile(i); - if (y < miny) { - miny = y; - } else if (y > maxy) { - maxy = y; - } - if (x < minx) { - minx = x; - } else if (x > maxx) { - maxx = x; - } - } - quadTree.insert(nm, new QuadRect(minx, miny, maxx, maxy)); - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - } - ); + }, resultMatcher); if(reader != null) { reader.searchMapIndex(sr); } } + private void initTypes(BinaryMapDataObject object) { if (downloadNameType == null) { downloadNameType = object.getMapIndex().getRule("download_name", null); + nameType = object.getMapIndex().getRule("name", null); + nameEnType = object.getMapIndex().getRule("name:en", null); + nameLocaleType = object.getMapIndex().getRule("name:" + locale, null); prefixType = object.getMapIndex().getRule("region_prefix", null); suffixType = object.getMapIndex().getRule("region_suffix", null); - if (downloadNameType == null) { + if (downloadNameType == null || nameType == null) { throw new IllegalStateException(); } } @@ -266,7 +374,7 @@ public class OsmandRegions { public static void main(String[] args) throws IOException { OsmandRegions or = new OsmandRegions(); or.prepareFile("/home/victor/projects/osmand/osm-gen/Osmand_regions.obf"); - +// or.cacheAllCountries(); // long t = System.currentTimeMillis(); // or.cacheAllCountries(); // System.out.println("Init " + (System.currentTimeMillis() - t)); @@ -274,7 +382,7 @@ public class OsmandRegions { //testCountry(or, 15.8, 23.09, "chad"); testCountry(or, 52.10, 4.92, "netherlands"); testCountry(or, 52.15, 7.50, "nordrhein-westfalen"); - testCountry(or, 40.0760, 9.2807, "italy"); + testCountry(or, 40.0760, 9.2807, "italy", "sardegna"); testCountry(or, 28.8056, 29.9858, "africa", "egypt" ); testCountry(or, 35.7521, 139.7887, "japan"); testCountry(or, 46.5145, 102.2580, "mongolia"); diff --git a/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java index 82fc93bbb2..8191ff5fe0 100644 --- a/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java @@ -199,8 +199,10 @@ public class RoutePlannerFrontEnd { RouteRegion[] regions = ctx.reverseMap.keySet().toArray(new BinaryMapRouteReaderAdapter.RouteRegion[ctx.reverseMap.size()]); ctx.checkOldRoutingFiles(ctx.startX, ctx.startY); ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY); + long time = System.currentTimeMillis(); RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx.startX, ctx.startY, ctx.targetX, ctx.targetY, ctx.config, regions, ctx.calculationProgress, ctx.precalculatedRouteDirection, ctx.calculationMode == RouteCalculationMode.BASE); + System.out.println("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); ArrayList result = new ArrayList(Arrays.asList(res)); ctx.routingTime = ctx.calculationProgress.routingCalculatedTime; ctx.visitedSegments = ctx.calculationProgress.visitedSegments; diff --git a/OsmAnd/libs/dropbox-android-sdk-1.5.3.jar b/OsmAnd/libs/dropbox-android-sdk-1.5.3.jar deleted file mode 100644 index c5bc530154..0000000000 Binary files a/OsmAnd/libs/dropbox-android-sdk-1.5.3.jar and /dev/null differ diff --git a/OsmAnd/res/layout-land/menu.xml b/OsmAnd/res/layout-land/menu.xml index d0a4c14f3a..6cff01c1db 100644 --- a/OsmAnd/res/layout-land/menu.xml +++ b/OsmAnd/res/layout-land/menu.xml @@ -60,10 +60,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - @@ -66,11 +68,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - diff --git a/OsmAnd/res/layout/menu.xml b/OsmAnd/res/layout/menu.xml index 0d79c24bee..24da0231d0 100644 --- a/OsmAnd/res/layout/menu.xml +++ b/OsmAnd/res/layout/menu.xml @@ -54,11 +54,11 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - - @@ -66,12 +66,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 5438b0d82b..15a4ea8a63 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1,7 +1,7 @@ -Modifications hors ligne - Toujours utiliser l\'édition hors ligne +Modifications hors-ligne + Toujours utiliser l\'édition hors-ligne "Changements en 0.7.1 : -\n\t- Modification hors ligne des PI +\n\t- Modification hors-ligne des PI \n\t- Option de suivi en ligne - envoyer ses coordonnées à un service web de façon périodique (lire la configuration dans les articles HowTo) \n\t- Afficher l\'itinéraire en cours d\'enregistrement sur la carte \n\t- Détection de la direction: \'Faites demi-tour\' est affiché et annoncé lors d\'un déplacement dans la direction opposée, ou après avoir raté un virage @@ -24,15 +24,15 @@ Activer le suivi en ligne Préciser l\'intervalle pour le suivi en ligne Intervalle pour le suivi en ligne - Précisez l\'adresse web pour le suivi en ligne avec la syntaxe : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6} + Préciser l\'adresse web pour le suivi en ligne avec la syntaxe : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6} Adresse web pour le suivi en ligne Veuillez activer \'Enregistrer l\'itinéraire en GPX\' en paramètre de suivi. Afficher la trace en cours Changements en 0.7.0 : -\n\t- Données Wikipedia hors ligne avec articles +\n\t- Données Wikipedia hors-ligne avec articles \n\t- Cartes mises à jour \n\t- Petites améliorations diverses - Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors ligne. + Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors-ligne. Version gratuite Afficher description PI Amérique du Nord @@ -50,7 +50,7 @@ Wikipédia Monde Voix enregistrées (fonctions limitées) Voix de synthèse TTS (à préférer) - Wikipédia (hors ligne) + Wikipédia (hors-ligne) Défini par l\'utilisateur Un fichier de favoris précédemment exporté existe déjà. Voulez vous le remplacer ? Paramètres de profil @@ -74,23 +74,23 @@ Permet d\'utiliser OsmAnd pendant que l\'écran est désactivé Orientation de la carte - Vous n\'avez pas actuellement de carte vectorielle pour cet emplacement.\n\t\n\tVous pouvez en télécharger dans \'Paramètres\' -> \'Données hors ligne\', ou basculer sur les cartes en ligne via \'Paramètres\' -> \'Sources de carte\'. - Téléchargement réussi.\n\t\n\tPour l\'utiliser, activer dans \'Paramètres\' -> \'Sources de carte\' -> \'Cartes vectorielles\'. + Vous n\'avez pas actuellement de carte vectorielle pour cet emplacement.\n\t\n\tVous pouvez en télécharger dans \'Paramètres\' → \'Données hors-ligne\', ou basculer sur les cartes en ligne via \'Paramètres\' → \'Sources de carte\'. + Téléchargement réussi.\n\t\n\tPour l\'utiliser, allez dans \'Menu\' → \'Couches\' → \'Source de la carte…\' → \'Cartes vectorielles OSM\'. Mode jour/nuit Améliorer les données OSM - \tOsmAnd utilise des cartes issues des données OpenStreetMap.org (OSM). En plus de la visualisation des cartes et du calcul d\'itinéraires, OsmAnd peut également être utilisé pour améliorer la qualité des données OSM. Vous pouvez facilement créer et télécharger des nouveaux points d\'intérêt (PI) ou des rapports de bogues cartographiques en quelques clics ! -\n\tPour cela il faudra d\'abord fournir vos paramètres de connexion OSM dans \'Paramètres\' -> \'Général\' -> \'Édition OSM\'. + \tOsmAnd utilise des cartes issues des données OpenStreetMap.org (OSM). En plus de la visualisation des cartes et du calcul d\'itinéraires, OsmAnd peut également être utilisé pour améliorer la qualité des données OSM. Vous pouvez facilement créer et téléverser des nouveaux points d\'intérêt (PI) ou des rapports de bogues cartographiques en quelques clics ! +\n\tPour cela il faudra d\'abord fournir vos paramètres de connexion OSM dans \'Paramètres\' → \'Général\' → \'Édition OSM\'. \n\tPour ajouter un nouveau PI, utiliser l\'option \'Créer un point d\'intérêt\' dans le menu contextuel de la carte. Saisir les informations dans la boite de dialogue \'Créer un point d\'intérêt\' avant d\'enregistrer. \n\tLes erreurs de cartographie peuvent être signalées immédiatement via les bogues OSM, permettant à la communauté OSM de corriger plus rapidement le problème. \n\tPour créer un bogue OSM utiliser l\'option \'Ouvrir un bogue OSM\' dans le menu contextuel de la carte. Saisir une description détaillée du problème et le poster avec le bouton \'Ajouter\'. -\n\tOSMAnd supporte la mise en cache de vos entrées en mode déconnecté (voir le paramètre correspondant), mais una connexion internet est bien sûr nécessaire pour l\'envoi des contributions de PI et de bogues OSM. +\n\tOsmAnd supporte la mise en cache de vos entrées en mode déconnecté (voir le paramètre correspondant), mais une connexion internet est bien sûr nécessaire pour l\'envoi des contributions de PI et de bogues OSM. Il n\'y a pas assez de place pour télécharger %1$s MB (disponible: %2$s). Espace actuellement disponible: {2} MB ! Télécharger {0} fichier(s) ({1} MB) ? Changements en 0.6.9 : -\n\t- Amélioration du rendu des cartes hors ligne +\n\t- Amélioration du rendu des cartes hors-ligne \n\t- Rendu hors-ligne acceléré - voir dans les options expérimentales (ne marche pas sur tous les appareils) \n\t- Changements cosmétiques \n\t- Infos d\'altitude @@ -144,7 +144,7 @@ Recherche de l\'emplacement… Emplacement[Trouvé] Adresse… - Favoris… + Favori… Non défini Fixé Emplacement actuel… @@ -152,11 +152,11 @@ Recherche autour de : Rechercher autour du point Changement pour 0.6.7 : -\n\t- Gestionnaire de données hors ligne (téléchargement, suppression, sauvegarde des données hors ligne directement dans OsmAnd) +\n\t- Gestionnaire de données hors-ligne (téléchargement, suppression, sauvegarde des données hors-ligne directement dans OsmAnd) \n\t- Favoris et groupes (catégorisation, suppression, gestion) \n\t- Explorateur GPX dans l\'application (voir les itinéraires, distance, vitesse moyenne, altitude, etc.) \n\t- Navigation GPX (options utiles, continuer un itinéraire après plantage, identification des rond-points) -\n\t- Fonction d\'enregistrement des itinéraires au format GPX pour utilisation ultérieure hors ligne +\n\t- Fonction d\'enregistrement des itinéraires au format GPX pour utilisation ultérieure hors-ligne \n\t- Amélioration gestion GPX (filtrage emplacements imprécis et enregistrement de la précision, altitude et vitesse) \n\t- Téléchargement des traces GPX à la communauté OSM (http://download.osmand.net/gpx/) \n\t- Améliorations du rendu vectoriel @@ -174,14 +174,14 @@ Afficher plus de détails Afficher plus de détails sur les cartes vectorielles (routes etc.) aux niveaux de zooms inférieurs Favoris correctement supprimés. - Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes vous sûr ? - Maison + Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes-vous sûr ? + Domicile Amis Lieux Autres Pas nécessaire La carte mondiale de base est absente (couvrant le monde entier à faible zoom). Pensez à télécharger World_basemap_x.obf pour avoir un environnement complet. - Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors ligne. + Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors-ligne. \n\nAppui long pour afficher sur la carte \nVitesse moyenne : %1$s \nVitesse maximum : %2$s @@ -193,7 +193,7 @@ %1$d sur %2$d éléments restaurés. Pas d\'éléments à %1$s Vous allez %1$s %2$s éléments. Continuer ? - Gestionnaire de données hors ligne + Gestionnaire de données hors-ligne Restaurer Sauvegarder Supprimer @@ -236,7 +236,7 @@ Les données pour la langue sélectionnée ne sont pas installées. Voulez-vous les obtenir sur le Market ? Inverser l\'itinéraire GPX Utiliser la destination en cours - Suivre la trace depuis le début + Suivre l\'ensemble de la trace Vous pouvez basculer sur les cartes vectorielles locales en utilisant le menu (Couches -> Source de la carte… -> Cartes vectorielles OSM) pour voir la carte. Sélectionner le flux audio Sélectionner le canal pour le guidage vocal (dépend de la configuration système) @@ -261,56 +261,56 @@ Connexion Internet nécessaire pour cette opération non disponible Installer plus… Mise à jour des cartes hors-ligne - Il est très important d\'avoir des données cartographiques à jour, pour la visualisation des cartes hors-ligne, pour la recherche de points d\'intérêt ou d\'adresses, et pour la navigation hors-ligne. OsmAnd fournit un gestionnaire de données qui permet de télécharger ces cartes hors-ligne (et d\'autres données), et de vérifier si des mises à jour sont disponibles. - \n\nPour télécharger ou vérifier les mises à jour, allez à \'Menu Principal\' → \'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\'. - \n\nUne fois la liste des régions établie à partir d\'internet, sélectionnez le fichier à télécharger ou mettre à jour. Un menu en haut de l\'écran vous permet de sélectionner le type de données recherché (cartes standards, courbes de niveau, etc.). - \n\nL\'option \'Cartes téléchargées\' dans le menu contextuel à droite de l\'écran permet de n\'afficher que les cartes déjà téléchargées sur votre système, avec les couleurs ou polices suivantes : + \tIl est très important d\'avoir des données cartographiques à jour pour la visualisation des cartes hors-ligne, la recherche de points d\'intérêt ou d\'adresses, et la navigation hors-ligne. OsmAnd fournit un gestionnaire de données qui permet de télécharger ces cartes hors-ligne (et d\'autres données), et de vérifier si des mises à jour sont disponibles. + \n\tPour télécharger ou vérifier les mises à jour, allez dans \'Menu Principal\' → \'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\'. + \n\tUne fois la liste des régions établie à partir d\'internet, sélectionnez le fichier à télécharger ou mettre à jour. Un menu en haut de l\'écran vous permet de sélectionner le type de données recherché (cartes standards, courbes de niveau, etc.). + \n\tL\'option \'Cartes téléchargées\' dans le menu contextuel à droite de l\'écran permet de n\'afficher que les cartes déjà téléchargées sur votre système, avec les couleurs ou polices suivantes : \n\n\'Vert\' - pour les cartes à jour avec le serveur \n\n\'Bleu\' - pour les cartes qui peuvent être mises à jour depuis le serveur - \n\t\'Italique\' - pour les cartes désactivées sur l\'appareil + \n\n\'Italique\' - pour les cartes désactivées sur l\'appareil Niveau de zoom maximum pour l\'utilisation des cartes vectorielles au lieu des tuiles de carte Niveau de zoom vectoriel Partage d\'emplacement - Vous notez un point d\'intérêt pendant votre voyage que vous voulez partager avec des amis ou de la famille ? -\nOsmAnd vous permet de facilement partager un lieu. -\n\tVous pouvez aller dans \'Menu contextuel de la carte\'->\'Partager un lieu\'. + \tPendant votre voyage, vous notez un point d\'intérêt que vous voulez partager avec des amis ou de la famille ? +\n\tOsmAnd vous permet de facilement partager un lieu. +\n\tAllez dans \'Menu contextuel de la carte\' → \'Partager le lieu\'. \nSélectionnez alors le mode de partage parmi : courriel, SMS, ou copie vers le presse-papier. Lieux favoris - "Les points utilisés fréquemment peuvent être enregistrés en tant que favoris. -\n\tPour créer un lieu Favori, aller dans le menu contextuel de la carte, sélectionner l\'option \'Ajouter aux favoris\' et saisir un nom adapté. Après enregistrement, ce lieu est facilement accessible par le menu \'Menu principal\'->\'Favoris\'. -\n\tUn appui long sur un favori dans le menu \'Favoris\' permet de le modifier, le supprimer ou de créer un itinéraire pour s\'y rendre. -\n\tPour afficher tous les favoris sur la carte, activer le calque affichant tous les favoris directement sur la carte dans \'Menu contextuel de la carte\'->\'Couches\'. " + "\tLes points utilisés fréquemment peuvent être enregistrés en tant que favoris. +\n\tPour créer un favori, allez dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible dans \'Menu\' → \'Favoris\'. +\n\tUn appui court sur un favori dans le menu \'Favoris\' permet de créer un itinéraire pour s\'y rendre. +\n\tPour afficher tous les favoris sur la carte, activez la couche \'Favoris\' dans \'Menu\' → \'Couches\'. " OSM en ligne classification des cartes en images Une erreur est survenue lors de la recherche hors-ligne Ne peut interpréter le geo intent:\'%s\' Recherche d\'adresses dans les cartes hors-ligne Système - Changer la langue d\'affichage + Sélectionner la langue d\'affichage Langue d\'affichage Source de cartes Mode de fonctionnement Navigation - La navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (un appui court sur la bulle apparue ouvre alors le menu contextuel avec le choix \'Aller vers le point\'), soit en choisissant \'Navigation\' après un appui court sur un favori ou un résultat de recherche. - \n\nLa destination est alors indiquée par un point orange et un drapeau à damier. OsmAnd affiche la distance qui vous en sépare, et sa direction (par une flèche orange). + \tLa navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (une bulle apparaît alors, sur laquelle un appui court ouvre le menu contextuel avec le choix \'Aller vers le point\'), soit par un appui court sur un favori ou un résultat de recherche (en choisissant alors \'Navigation\'). + \n\tLa destination est alors indiquée par un point orange et un drapeau à damier. OsmAnd affiche la distance qui vous en sépare, et sa direction (par une flèche orange). Recherche - Vous pouvez rechercher un lieu via l\'option \'Rechercher autour du point\' dans le menu contextuel de la carte, ou via \'Menu\' → \'Rechercher\'. + \tVous pouvez rechercher un lieu via l\'option \'Rechercher autour du point\' dans le menu contextuel de la carte, ou via \'Menu\' → \'Rechercher\'. \n\nVous pouvez alors rechercher : \n\t* un point d\'intérêt (par type ou par nom) \n\t* une adresse \n\t* des coordonnées \n\t* un favori prédéfini \n\t* dans l\'historique des recherches - \n\nDans chacun des cas, il vous sera proposé un choix entre \'Navigation\' (vers le point) ou \'Voir sur la carte\', etc. + \n\tDans chacun des cas, il vous sera proposé un choix entre \'Navigation\' (vers le point) ou \'Voir sur la carte\', etc. Menu contextuel de la carte - \tLe menu contextuel de la carte est disponible par un appui long sur la carte ou le bouton trackball. -\n\tUne bulle apparaît alors avec les coordonnées du point : un appui court dessus ouvre le menu contextuel, un appui long fait disparaître la bulle. Le menu contextuel est également disponible depuis le bouton \'Menu\'. -\n\tLe menu contextuel de la carte regroupe les actions possibles autour de ce point. + \tLe menu contextuel de la carte regroupe les actions possibles au niveau d\'un point (un lieu). +\n\tIl est disponible par un appui long au niveau du point sur la carte, suivi d\'un appui court sur la bulle apparue avec les coordonnées du point (un appui long sur la bulle la fait disparaître). +\n\tIl est également disponible via \'Menu\' → \'Options du point\', ou par un appui sur le bouton trackball (dans ces deux derniers cas, le point défini est le centre de la carte). Conseils et astuces \tOsmAnd est une application de navigation avec beaucoup de fonctionnalités. @@ -318,7 +318,7 @@ Suivant Précédent - Modifier les unités de distance et vitesse + Sélectionner les unités de distance et vitesse à utiliser Unités de mesure Miles/pieds Miles/yards @@ -336,9 +336,9 @@ Ajouter une étape à une trace GPX enregistrée Ajouter une étape GPX Territoire - Barrière + Obstacle Éducation - Urgence + Urgences Divertissement Argent Géocache @@ -405,7 +405,7 @@ Sélectionner tout Recharger Itinéraire le plus rapide - Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court. + Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court Le zoom {0} télécharge {1} carreaux ({2} Mb ) Télécharger la carte Sélectionnez le zoom maximum pour précharger la zone visible @@ -479,20 +479,20 @@ Utiliser le pointeur Configurer le délai d\'attente pour déterminer l\'emplacement Délai d\'attente - Arrêter le service de navigation en arrière plan + Arrêter le service de navigation en arrière-plan Où suis-je ? Service de navigation OsmAnd Réseau GPS secondes min. - Choisir un intervalle d\'actualisation de votre position dans le service en arrière plan + Choisir un intervalle d\'actualisation de votre position dans le service en arrière-plan Intervalle de positionnement - Choisir un fournisseur de géolocalisation pour le service arrière plan + Choisir un fournisseur de géolocalisation pour le service arrière-plan Fournisseur de géolocalisation Activer le service en arrière-plan pour suivre votre position en continu Service de positionnement - Le service d\'arrière plan requiert l\'activation de la géolocalisation. + Le service d\'arrière-plan requiert l\'activation de la géolocalisation. Masquer le filtre Afficher le filtre Filtre @@ -531,26 +531,26 @@ Paysage, portrait, ou selon la position de l\'appareil Le format des heures d\'ouverture n\'est pas supporté pour l\'édition Ajouter une nouvelle règle - Routes + Lignes Arrêt arrêts - Chercher la route suivante - Chercher la route précédente + Chercher l\'itinéraire suivant + Chercher l\'itinéraire précédent Terminer la recherche - Sélectionnez arrêt pour sortir - à faire après - à faire avant - arrêts à faire + Sélectionnez la destination + reste à parcourir + distance préliminaire + nombre d\'arrêts : Distance du trajet Transport OK - Afficher les arrêts des transports publics sur la carte - Afficher les arrêts des transports + Afficher les arrêts de transport en commun sur la carte + Afficher les arrêts de transport public Application de navigation OsmAnd Mise à jour des données PI réussie ({0} ont été chargés) Erreur de mise à jour des index locaux Erreur lors du chargement des données du serveur - Il n\'y a pas de données hors ligne pour cette région + Il n\'y a pas de données hors-ligne pour cette région Mise à jour de PI n\'est pas disponible pour un petit niveau de zoom Points d\'Intérêts Mettre à jour les données locales depuis internet ? @@ -568,7 +568,7 @@ Recherche de l\'adresse… Recherche de l\'adresse via OSM Nominatim Numéro de la maison, rue, ville - Hors ligne + Hors-ligne Internet Niveau de zoom maximum Choisir un niveau de zoom maximum pour le téléchargement @@ -639,9 +639,9 @@ Zoom auto. sur la carte Paramètres supplémentaires Paramètres - Enregistrer la trace actuelle sur carte SD + Enregistrer la trace actuelle sur la carte SD Enregistrer la trace GPX - Choisir l\'intervalle d\'enregistrement de la trace + Choisir l\'intervalle d\'enregistrement pour la trace Intervalle d\'enregistrement Les traces seront enregistrées et groupées par jour dans le répertoire des traces Enregistrer la trace dans un fichier GPX @@ -669,7 +669,7 @@ Afficher PI sur la carte (utiliser le dernier filtre) Afficher PI Choisir la source des tuiles de carte (en ligne ou en cache) - Source des cartes + Source de la carte Source cartographique Utiliser internet Afficher l\'emplacement @@ -720,7 +720,7 @@ Appliquer Ajouter Non - Nom du favoris + Nom du favori Favoris Le point \'\'{0}\'\' à été ajouté aux favoris. Éditer le favori @@ -778,13 +778,13 @@ Carte mondiale de base requise pour le bon fonctionnement, sélectionnée pour téléchargement. Activer le greffon des cartes en ligne pour sélectionner différentes sources de cartes - Cartes en ligne (tuiles) - Utiliser les cartes en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD) + Carte en ligne (tuiles) + Utiliser une carte en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD) Cartes en ligne - Configurer la source des cartes en ligne ou en cache + Configurer la source de la carte en ligne ou en cache - Paramètres des cartes Configurer l\'affichage des cartes - Ce greffon permet d\'utiliser une grande gamme de cartes au format image en ligne, ou conservée en cache comme carte de base ou comme sur- ou sous-couche de carte. Les cartes peuvent également être préparées hors ligne et copiées dans le dossier OsmAnd. + Ce greffon permet d\'accéder à une grande gamme de cartes sous forme de tuiles téléchargées ou conservées en cache, utilisables comme carte de base, fond de carte, ou sur-couche. Les cartes peuvent également être préparées hors-ligne et copiées dans le dossier OsmAnd. Ce greffon permet d\'utiliser l\'enregistrement des traces et la navigation en mode économie (écran éteint) en réveillant périodiquement le GPS pour enregistrer une position ou jouer une instruction vocale. Ce greffon permet de configurer les fonctionnalités d\'accessibilité. Paramètres avancés @@ -792,12 +792,12 @@ Ce greffon permet de gérer des paramètres de configuration avancés et propres à certains appareils. Ce greffon permet la gestion de paramètres de développement et de débogage tels que la navigation animée ou l\'affichage des temps de rendu. Gestionnaire des greffons - Toucher un greffon pour l\'activer ou le désactiver (Redémarrage d\'OsmAnd peut être nécessaire) + Toucher un greffon pour l\'activer ou le désactiver (le redémarrage d\'OsmAnd peut être nécessaire) Les greffons fournissent à l\'application des fonctionnalités supplémentaires, telles que l\'enregistrement des traces, l\'utilisation de cartes en ligne, le fonctionnement en arrière-plan, le mode accessibilité et bien d\'autres. Gestionnaire de greffons Changements en 0.8.0 : -\n\t- *Fonctionnalité des greffons*\n\t- La majorité des fonctionnalités sont regroupées par familles et peuvent être activées/désactivées dans le Gestionnaire de Greffons. Vous pouvez activer les sources de cartes image (en ligne ou en cache), les paramètres de suivi en ligne et autres nouvelles possibilités.\n\t- *Nouvelles cartes hors ligne*\n\t- Le rendu des cartes devient plus rapide et précis (les côtes et zones d\'eau sont corrigées).\n\t- Vous devez re-télécharger toutes les données de cartes hors-ligne, car les anciennes cartes ne fonctionnent plus.\n\t- *Calcul d\'itinéraire hors-ligne*\n\t- Le calcul d\'itinéraire hors ligne devient beaucoup plus stable\n\t- *Utilisation et ergonomie*\n\t- Améliorée dans de nombreux domaines - Ce greffon permet de gérer la contribution à OpenStreetMap (OSM) telle que la collection / modification de points d\'intérêt OSM, l\'ouverture / commentaires de bogues OSM et la contribution de traces GPX (nécessite un compte OSM). +\n\t- *Fonctionnalité des greffons*\n\t- La majorité des fonctionnalités sont regroupées par familles et peuvent être activées/désactivées dans le Gestionnaire de Greffons. Vous pouvez activer les sources de cartes image (en ligne ou en cache), les paramètres de suivi en ligne et autres nouvelles possibilités.\n\t- *Nouvelles cartes hors-ligne*\n\t- Le rendu des cartes devient plus rapide et précis (les côtes et zones d\'eau sont corrigées).\n\t- Vous devez re-télécharger toutes les données de cartes hors-ligne, car les anciennes cartes ne fonctionnent plus.\n\t- *Calcul d\'itinéraire hors-ligne*\n\t- Le calcul d\'itinéraire hors-ligne devient beaucoup plus stable\n\t- *Utilisation et ergonomie*\n\t- Améliorée dans de nombreux domaines + Ce greffon gère la contribution à OpenStreetMap (OSM), comme la création ou modification de points d\'intérêt OSM, l\'ouverture ou le commentaire de bogues OSM, et l\'envoi de traces GPX (nécessite un compte OSM). Cartes vectorielles (hors-ligne) peuvent s\'afficher plus rapidement. Peut ne pas fonctionner sur certains appareils. Diffuse les commandes sonores disponibles pour la voix sélectionnée @@ -806,7 +806,7 @@ Tester les commandes vocales Changements en 0.7.2 : -\n\t- Rendu pré-compilé pour tous les appareils\n\t- Édition hors ligne des PI\n\t- Accessibilité\n\t- Corrections de bogues +\n\t- Rendu pré-compilé pour tous les appareils\n\t- Édition hors-ligne des PI\n\t- Accessibilité\n\t- Corrections de bogues Envoyer les traces GPX à OSM ? Visibilité Libellés @@ -991,7 +991,7 @@ Éviter les voies non revêtues Éviter les ferries Éviter… -Éviter péages, voies non carrossables, ferries, autoroutes +Éviter péages, voies non revêtues, ferries, autoroutes Annonces visuelles… Afficher les avertissements (limitations de vitesse, stops, ralentisseurs, radars), les voies de circulation Itinéraires fluorescents @@ -1014,19 +1014,19 @@ En continu \tVous pouvez modifier l\'orientation de la carte par un appui court sur l\'icône de la boussole \n\tLes choix sont : -\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne changera pas d\'orientation, le nord sera toujours vers le haut -\n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement -\n\t\'Boussole\' - La carte est continuellement alignée sur la valeur de la boussole -"\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre) -\n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne -\n\tVous pouvez configurer la politique de bascule jour/nuit dans \'Navigation\'->\'Mode jour/nuit\' -\n\tLes choix sont: -\n\t\'Lever/coucher du soleil\' +\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne change pas d\'orientation, le nord est toujours vers le haut. +\n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement. +\n\t\'Boussole\' - La carte est continuellement alignée sur les informations de la boussole. +"\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre). +\n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne. +\n\tVous pouvez changer de règle pour la bascule jour/nuit dans \'Menu\' → \'Configurer l\'écran\' → \'Mode jour/nuit\'. +\n\tLes choix sont : +\n\t\'Lever/coucher du soleil\' - Bascule automatique, en fonction de l\'éphéméride (mode par défaut) \n\t\'Jour\' - Toujours utiliser le mode jour \n\t\'Nuit\' - Toujours utiliser le mode nuit -\n\t\'Détection de la luminosité\' - L\'affichage est contrôlé par le capteur de luminosité de votre appareil, s\'il existe " -OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne. -OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne +\n\t\'Détection de la luminosité\' - Bascule contrôlée par le capteur de luminosité de votre appareil, s\'il existe " +OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne. +OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne "Changements en 0.8.3 : \n* Points intermédiaires \n* Amélioration des instructions de navigation @@ -1036,13 +1036,13 @@ \n* Nombreuses corrections de bugs " Coller à la route pendant la navigation Coller à la route -" OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors ligne. OsmAnd permet également le routage en ligne et hors ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors ligne d\'adresses et de lieux (PI) - Navigation hors ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux PI Wikipédia hors ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique, ou un donation sur osmand.net. " -" OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+ est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors ligne. OsmAnd permet également le routage en ligne et hors ligne avec des instructions vocales pas à pas. OsmAnd+ est la version payante de l\'application, en l\'achetant vous supportez le projet, financez le développement de nouvelles fonctionnalités, et recevez les dernières mises à jour. Fonctionnalités principales : - Fonctionne complètement hors ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors lignes compactes disponibles pour le monde entier - Téléchargement illimité des cartes pour un pays ou une région directement depuis l\'application - Points d\'intérêt (PI) Wikipédia hors ligne, parfait pour le tourisme - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt, des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors ligne d\'adresses et de lieux (PI) - Navigation hors ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) - Affichage des limitations de vitesse, voix enregistrées et voix de synthèse" -\tLa source des cartes et des couches affichées est modifiable via \'Menu\' -> \'Couches\'. -\n\tDans \'Source de la carte…\' vous pouvez choisir entre les cartes vectorielles préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. +" OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors-lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux PI Wikipédia hors-ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique, ou un donation sur osmand.net. " +" OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+ est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. OsmAnd+ est la version payante de l\'application, en l\'achetant vous supportez le projet, financez le développement de nouvelles fonctionnalités, et recevez les dernières mises à jour. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes es compactes disponibles pour le monde entier - Téléchargement illimité des cartes pour un pays ou une région directement depuis l\'application - Points d\'intérêt (PI) Wikipédia hors-ligne, parfait pour le tourisme - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt, des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) - Affichage des limitations de vitesse, voix enregistrées et voix de synthèse" +\tLa source des cartes et des couches affichées est modifiable via \'Menu\' → \'Couches\' → \'Source de la carte…\'. +\n\tVous pouvez choisir entre les cartes vectorielles hors-ligne préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. \n\tOsmAnd supporte également des sources personnalisées. -\tOsmAnd propose des profils (personnalisables) adaptés aux différents usages. +\tOsmAnd propose des profils (personnalisables) adaptés aux différentes utilisations. \n\tVous pouvez changer de profil via le bouton dédié dans l\'angle inférieur gauche de la carte (icône voiture, vélo, ou piéton), ou lors de la création d\'un itinéraire. Éviter les autoroutes @@ -1064,7 +1064,7 @@ Mode avancé… Parking Urgences - Transports publics + Transports en commun Divertissements Restauration Tourisme @@ -1082,15 +1082,15 @@ L\'appplication ZXing Barcode Scanner n\'est pas installée. La chercher dans Market ? Clôturer les modifications Le service OsmAnd tourne toujours en tâche de fond. Voulez-vous l\'arrêter ? - "Changements en 1.0 :\n\t* Amélioration de la navigation, plus rapide et plus précise (jusqu\'à 250 km)\n\t* Cartographie des routes\n\t* La carte ne perd plus la position courante après les interruptions\n\t* Active le service d\'arrière plan pendant la navigation " + "Changements en 1.0 :\n\t* Amélioration de la navigation, plus rapide et plus précise (jusqu\'à 250 km)\n\t* Cartographie des routes\n\t* La carte ne perd plus la position courante après les interruptions\n\t* Active le service d\'arrière-plan pendant la navigation " Exécuter l\'application dans le mode sûr (ne pas utiliser de code natif). Mode sûr - L\'application s\'exécute en mode sûr (désactiver le dans les paramètres). - Sélectionner quand afficher uniquement les cartes routières : - Cartes routières uniquement + L\'application s\'exécute en mode sûr (peut être désactivé dans Paramètres). + Sélectionner à quel moment afficher les cartes uniquement routières : + Cartes uniquement routières Routes uniquement Cartes standards - Cartes routières uniquement + Cartes uniquement routières incomplet Aucun bâtiment trouvé. Rechercher les villages et les codes postaux @@ -1105,22 +1105,22 @@ Ne pas afficher les limites administratives régionales (niveaux 5 à 9) "\tLa plupart des périphériques GPS donnent des mesures d\'altitude dans le référentiel ellipsoïdal WGS84, depuis lequel une conversion vers le système local nécessite une correction en fonction de la position courante. \n\tUne meilleure approximation des systèmes locaux est le référentiel EGM96. OsmAnd supporte désormais l\'affichage automatique de l\'altitude dans ce référentiel. -\n\tIl suffit pour cela de télécharger le fichier WW15MGH.DAC depuis le gestionnaire de données hors-ligne (l\'original est à l\'adresse http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/binary/WW15MGH.DAC). " +\n\tIl suffit pour cela de télécharger le fichier 'Monde - Correction d\'altitude' depuis le gestionnaire de données hors-ligne (l\'original est à l\'adresse http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/binary/WW15MGH.DAC). " Le greffon OsMoDroid est obsolète et doit être mis à jour. Le greffon OsMoDroid est une extension OsmAnd pour l\'application OsMoDroid qui permet la création de traces. Pour plus d\'information à propos du service, consulter le site http://esya.ru. Greffon OsMoDroid Courbes de niveau - Ce greffon permet de télécharger les courbes de niveaux (Téléchargement de cartes -> Menu -> Autres cartes) pour une région spécifique et de les utiliser avec les cartes hors-ligne. - Greffon des courbes de niveau + Ce greffon permet de télécharger les courbes de niveaux pour une région spécifique (\'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\', puis sélectionner \'Courbes de niveau\' dans le menu), et de les utiliser avec les cartes hors-ligne. + Courbes de niveau Autres cartes Courbes de niveau parties -L\'emplacement à associer à la note n\'est pas encore défini. \"Utiliser l\'emplacement ...\" pour attribuer une note à l\'emplacement spécifié +L\'emplacement à associer à la note n\'est pas encore défini. Utilisez le menu contextuel de la carte pour associer à la note l\'emplacement ainsi spécifié. arrêter Notes audio - Prendre des notes audio/vidéo durant le voyage + Ce greffon permet de prendre des notes audio/vidéo/photo durant le voyage. Notes audio/vidéo Greffon OsmAnd pour les courbes de niveau hors-ligne @@ -1135,7 +1135,7 @@ Sélectionner le format vidéo de sortie Format d\'enregistrement vidéo de sortie Utiliser l\'application système pour les vidéos - Option caméra vidéo + Option caméra Configurer les paramètres audio et vidéo Paramètres audio/vidéo Une erreur s\'est produite lors de l\'enregistrement @@ -1147,7 +1147,7 @@ non disponible Prendre une note audio Prendre une note vidéo - Couche d\'enregistrements + Enregistrements L\'enregistrement ne peut pas être lu Supprimer l\'enregistrement Lire @@ -1193,7 +1193,7 @@ \n * Corrections de bogues (navigation, recherche, enregistrement vidéo, instructions vocales, améliorations d\\\'affichage)\n * Configuration plus facile de la couche d\\\'ombrage de relief (nécessite le greffon des courbes de niveau)\n * Accepte les liens de positions de maps.google.com\n * Nouveau widget (GPS info)\n * Ajout support multi-fenêtre pour les appareils Samsung récents\n * Filtre Kalman pour la boussole\n * Support des montres Pebble" Aucun(e) - Autoroutes de préférence + Privilégier les autoroutes Privilégier… Autoroutes de préférence Sélectionner sur demande @@ -1294,7 +1294,7 @@ Commencer à modifier Finir de modifier Sauvegarder comme GPX - Ouvrir une fichier GPX existant + Ouvrir un fichier GPX existant Veuillez attendre jusqu\'à ce que la tâche actuelle soit terminée temps précision @@ -1302,8 +1302,8 @@ altitude nom du fichier GPX Sauvegarde du fichier GPX à {0} réussi - Créer un chemin pour mesurer la distance entre des points, ouvrir un fichier GPX existant pour le modifier et le sauvegarder. Peut être utilisé pour préparer un itinéraire avec un fichier GPX. - Calculatrice de Distance & Outil de Planification + Ce greffon permet de créer un chemin (ou d\'ouvrir et modifier un fichier GPX existant) pour mesurer la distance entre des points, et de le sauvegarder au format GPX. Peut être utilisé pour préparer un itinéraire GPX. + Mesure de distance et outil de planification Ne plus montrer Fichier de modifications OSM %1$s généré avec succès Échec de la sauvegarde des modifications OSM @@ -1332,7 +1332,7 @@ Styles de cartes À propos Note de version, licences, membres du projet - Astuces + Aide Zooms téléchargés: %1$s Expire (minutes): %1$s Téléchargeable: %1$s @@ -1373,16 +1373,16 @@ \nTemps en déplacement : %1$d:%2$02d:%3$02d Destination %1$s Mot de passe OSM (optionnel) - Type de focus - Sélectionner le type de focus de l\'appareil photo - Focus automatique - Focus hyperfocal - Profondeur de champ étendu (EDOF) - Le focus est réglé à l\'infini - Mode focus macro + Mise au point + Sélectionner le type de mise au point de l\'appareil photo + Mise au point automatique + Hyperfocale + Profondeur de champ étendue (EDOF) + À l\'infini + Mode macro L\'appareil photo essaie continuellement de faire la mise au point - Jouer un son lors de la prise de photos - Choisir de jouer un son lors de la prise de photos + Émettre un son lors de la prise de photos + Choisir d\'émettre un son lors de la prise de photos @@ -1415,20 +1415,20 @@ Arrêt de l\'auto-zoom Zoom éloigné Zoom très éloigné - OsmAnd supporte l\'affichage des cartes vectorielles hors-ligne dans différents styles de carte en fonction de vos besoins : - \n\nÀ la place du style de carte \'default\', vous pouvez dans \'Menu\' → \'Configuration\' → \'Styles de rendu\' sélectionner par exemple : - \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées pour le voyage et le tourisme, incluant des optimisations pour les conducteurs professionnels (contraste élevé, les diverses routes sont distinguables). + \tOsmAnd propose différents styles de rendu pour l\'affichage des cartes vectorielles hors-ligne, en fonction de vos besoins. + \n\tDans \'Menu\' → \'Configurer l\'écran\' → \'Styles de rendu\', vous pouvez à la place du style de rendu \'default\' sélectionner par exemple : + \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées possibles pour le voyage et le tourisme, avec des optimisations pour les conducteurs professionnels (contraste élevé, distinction claire des différentes routes), des options pour la randonnée alpine (Alpine hiking, classification du Club Alpin Suisse), l\'affichage des symboles de randonnée, des véloroutes \n\t* \'High contrast roads\' affiche les routes avec des couleurs très accentuées pour les situations de forte luminosité. - \n\t* \'Cycle-map\' est optimisé pour l\'affichage des routes pour cyclistes. - \n\t* \'Winter and ski\' crée une vue hivernale du paysage, et montre les domaines skiables (nécessite le téléchargement de la carte \'World ski\') - \n\t* \'Topo-map-assimilation\' est optimisé pour la randonnée et affiche les chemins en fonction de l\'échelle SAC, ainsi que les symboles de randonnée. + \n\t* \'Cycle-map\' est optimisé pour l\'affichage des voies pour cyclistes. + \n\t* \'Winter and ski\' crée une vue hivernale du paysage, et montre les domaines skiables (nécessite le téléchargement de la carte \'Monde - Ski\') + \n\t* \'Topo-map-assimilation\' est optimisé pour la randonnée, et affiche les chemins en fonction de la classification du Club Alpin Suisse (SAC scale), ainsi que les symboles de randonnée. Mémoriser mon choix GPS Status Veuillez d\'abord calculer l\'itinéraire Simulation avec l\'itinéraire calculé Simulation avec la trace GPX - Merci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions. + \tMerci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions. Foire Aux Questions Vous allez supprimer %1$d modifications OSM. Êtes-vous sûr ? Effacer tout @@ -1486,13 +1486,64 @@ \n\t* IMPORTANT : Les cartes doivent être postérieures à février 2014. \n\t* Navigation entièrement mise à jour (rapide et précise). \n\t* Nouvel écran d\'élaboration de l\'itinéraire (plus intuitif et plus puissant) - \n\t** Possibilité d\'utiliser les itinéraires GPX via le bouton Paramètres d\'itinéraire + \n\t* Possibilité d\'utiliser les itinéraires GPX via le bouton Paramètres d\'itinéraire \n\t* Boutons se masquant automatiquement durant la navigation - \n\t* Calcul d\'un itinéraire hors-ligne jusqu\'au début de l\'itinéraire GPX (option \'Suivre la trace depuis le début\') + \n\t* Calcul d\'un itinéraire hors-ligne jusqu\'au début de l\'itinéraire GPX (option \'Suivre l\'ensemble de la trace\') \n\t* Simulation active dans les tunnels \n\t* Nombreuses petites améliorations de l\'expérience utilisateur et de l\'utilisabilité \n\t* Paramétrage de la vitesse d\'élocution Calculer un itinéraire OsmAnd pour le début et la fin de l\'itinéraire Calculer un itinéraire OsmAnd hors-ligne + Europe - Italie + Europe - Grande-Bretagne + Amérique du Nord - Canada +Adresses sur l\'ensemble du pays +Monde - Correction d\'altitude +Monde - Balisage maritime +Monde - Paiement en bitcoin +Monde - Carte générale + Monde - Ski + Croate + Chinois + Portugais (Brésil) + Anglais +Afrikaans +Arménien +Basque +Biélorusse +Bosnien +Bulgare +Catalan +Tchèque +Danois +Néerlandais +Finnois +Français +Géorgien +Allemand +Grec +Hébreu +Hindi +Hongrois +Indonésien +Italien +Japonais +Coréen +Letton +Lituanien +Marathi +Norvégien +Polonais +Portugais +Roumain +Russe +Slovaque +Slovène +Espagnol +Suédois +Turc +Ukrainien +Vietnamien +Gallois diff --git a/OsmAnd/res/values/sherpafy.xml b/OsmAnd/res/values/sherpafy.xml new file mode 100644 index 0000000000..461bc9d2be --- /dev/null +++ b/OsmAnd/res/values/sherpafy.xml @@ -0,0 +1,5 @@ + + + Couldn\'t create settings file in tour folder. + Tour + diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 93afafac79..cfd9774b64 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,7 +9,57 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> - + addresses nationwide + World altitude correction + World seamarks + World bitcoin payments + World overview map + World ski map + Croatian + Chinese + Portuguese (Brazil) + English + Afrikaans + Armenian + Basque + Belarusian + Bosnian + Bulgarian + Catalan + Czech + Danish + Dutch + Finnish + French + Georgian + German + Greek + Hebrew + Hindi + Hungarian + Indonesian + Italian + Japanese + Korean + Latvian + Lithuanian + Marathi + Norwegian + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Spanish + Swedish + Turkish + Ukrainian + Vietnamese + Welsh + North America - Canada + Europe - Italy + Europe - Great Britain Calculate OsmAnd route segment without internet Calculate OsmAnd route for first and last route segment Do you want to use displayed track for navigation? diff --git a/OsmAnd/src/net/osmand/PlatformUtil.java b/OsmAnd/src/net/osmand/PlatformUtil.java index 4a1dd76a83..68cecdec45 100644 --- a/OsmAnd/src/net/osmand/PlatformUtil.java +++ b/OsmAnd/src/net/osmand/PlatformUtil.java @@ -1,11 +1,11 @@ package net.osmand; -import java.text.Collator; - import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; +import org.xmlpull.v1.XmlSerializer; + +import android.util.Xml; /** * That class is replacing of standard LogFactory due to @@ -22,7 +22,6 @@ import org.xmlpull.v1.XmlPullParserFactory; */ public class PlatformUtil { public static String TAG = "net.osmand"; //$NON-NLS-1$ - public static boolean AVIAN_LIBRARY = false; private static class OsmandLogImplementation implements Log { private final String fullName; @@ -159,33 +158,13 @@ public class PlatformUtil { } public static XmlPullParser newXMLPullParser() throws XmlPullParserException { - return XmlPullParserFactory.newInstance().newPullParser(); + // return XmlPullParserFactory.newInstance().newPullParser(); + return Xml.newPullParser(); } - public static net.osmand.Collator primaryCollator(){ - final Collator instance = Collator.getInstance(); - instance.setStrength(Collator.PRIMARY); - return new net.osmand.Collator() { - - @Override - public int compare(Object o1, Object o2) { - return instance.compare(o1, o2); - } - - @Override - public boolean equals(Object obj) { - return instance.equals(obj); - } - - @Override - public boolean equals(String source, String target) { - return instance.equals(source, target); - } - - @Override - public int compare(String source, String target) { - return instance.compare(source, target); - } - }; + public static XmlSerializer newSerializer() { + return Xml.newSerializer(); } + + } diff --git a/OsmAnd/src/net/osmand/plus/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/ApplicationMode.java index 88cdc51e60..dea67aaaad 100644 --- a/OsmAnd/src/net/osmand/plus/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/ApplicationMode.java @@ -259,7 +259,7 @@ public class ApplicationMode { return ctx.getString(key); } - public String toHumanStringCtx(ClientContext ctx) { + public String toHumanStringCtx(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/ClientContext.java b/OsmAnd/src/net/osmand/plus/ClientContext.java deleted file mode 100644 index 48cbd8c6b4..0000000000 --- a/OsmAnd/src/net/osmand/plus/ClientContext.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.osmand.plus; - -import java.io.File; - -import net.osmand.Location; -import net.osmand.plus.api.ExternalServiceAPI; -import net.osmand.plus.api.InternalOsmAndAPI; -import net.osmand.plus.api.SQLiteAPI; -import net.osmand.plus.api.SettingsAPI; -import net.osmand.plus.render.RendererRegistry; -import net.osmand.plus.routing.RoutingHelper; - - -/* - * In Android version ClientContext should be cast to Android.Context for backward compatibility - */ -public interface ClientContext { - - public String getString(int resId, Object... args); - - public File getAppPath(String extend); - - public void showShortToastMessage(int msgId, Object... args); - - public void showToastMessage(int msgId, Object... args); - - public void showToastMessage(String msg); - - public RendererRegistry getRendererRegistry(); - - public OsmandSettings getSettings(); - - public SettingsAPI getSettingsAPI(); - - public ExternalServiceAPI getExternalServiceAPI(); - - public InternalOsmAndAPI getInternalAPI(); - - public SQLiteAPI getSQLiteAPI(); - - // public RendererAPI getRendererAPI(); - - public void runInUIThread(Runnable run); - - public void runInUIThread(Runnable run, long delay); - - public RoutingHelper getRoutingHelper(); - - public Location getLastKnownLocation(); - -} diff --git a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java index 25eebff4a0..a0ce8ab24b 100644 --- a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java @@ -37,10 +37,10 @@ public class FavouritesDbHelper { private List favoritePointsFromGPXFile = null; private List cachedFavoritePoints = new ArrayList(); private Map> favoriteGroups = null; - private final ClientContext context; + private final OsmandApplication context; private SQLiteConnection conn; - public FavouritesDbHelper(ClientContext context) { + public FavouritesDbHelper(OsmandApplication context) { this.context = context; } diff --git a/OsmAnd/src/net/osmand/plus/GPXUtilities.java b/OsmAnd/src/net/osmand/plus/GPXUtilities.java index ab4e459f88..c4ea6d0bb7 100644 --- a/OsmAnd/src/net/osmand/plus/GPXUtilities.java +++ b/OsmAnd/src/net/osmand/plus/GPXUtilities.java @@ -32,6 +32,8 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import android.content.Context; + public class GPXUtilities { public final static Log log = PlatformUtil.getLog(GPXUtilities.class); @@ -173,13 +175,13 @@ public class GPXUtilities { } - public static String writeGpxFile(File fout, GPXFile file, ClientContext ctx) { + public static String writeGpxFile(File fout, GPXFile file, OsmandApplication ctx) { FileOutputStream output = null; try { SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT); format.setTimeZone(TimeZone.getTimeZone("UTC")); output = new FileOutputStream(fout); - XmlSerializer serializer = ctx.getInternalAPI().newSerializer(); + XmlSerializer serializer = PlatformUtil.newSerializer(); serializer.setOutput(output, "UTF-8"); //$NON-NLS-1$ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); //$NON-NLS-1$ serializer.startDocument("UTF-8", true); //$NON-NLS-1$ @@ -332,7 +334,7 @@ public class GPXUtilities { return text; } - public static GPXFile loadGPXFile(ClientContext ctx, File f) { + public static GPXFile loadGPXFile(Context ctx, File f) { FileInputStream fis = null; try { fis = new FileInputStream(f); @@ -355,12 +357,12 @@ public class GPXUtilities { } } - public static GPXFile loadGPXFile(ClientContext ctx, InputStream f) { + public static GPXFile loadGPXFile(Context ctx, InputStream f) { GPXFile res = new GPXFile(); SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT); format.setTimeZone(TimeZone.getTimeZone("UTC")); try { - XmlPullParser parser = ctx.getInternalAPI().newPullParser(); + XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(getUTF8Reader(f)); //$NON-NLS-1$ Stack parserState = new Stack(); boolean extensionReadMode = false; diff --git a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java index ed68268f47..844fa6edd0 100644 --- a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java @@ -31,7 +31,7 @@ public class NameFinderPoiFilter extends PoiFilter { private String query = ""; //$NON-NLS-1$ private String lastError = ""; //$NON-NLS-1$ - public NameFinderPoiFilter(ClientContext application) { + public NameFinderPoiFilter(OsmandApplication application) { super(null, application); this.name = application.getString(R.string.poi_filter_nominatim); //$NON-NLS-1$ this.distanceToSearchValues = new double[] {1, 2, 5, 10, 20, 50, 100, 200, 500 }; @@ -64,7 +64,7 @@ public class NameFinderPoiFilter extends PoiFilter { log.info(urlq); URL url = new URL(urlq); //$NON-NLS-1$ InputStream stream = url.openStream(); - XmlPullParser parser = application.getInternalAPI().newPullParser(); + XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(stream, "UTF-8"); //$NON-NLS-1$ int eventType; int namedDepth= 0; diff --git a/OsmAnd/src/net/osmand/plus/NavigationService.java b/OsmAnd/src/net/osmand/plus/NavigationService.java index f4e4e29b50..d2f86e4426 100644 --- a/OsmAnd/src/net/osmand/plus/NavigationService.java +++ b/OsmAnd/src/net/osmand/plus/NavigationService.java @@ -117,8 +117,7 @@ public class NavigationService extends Service implements LocationListener { public int onStartCommand(Intent intent, int flags, int startId) { handler = new Handler(); OsmandApplication app = (OsmandApplication) getApplication(); - ClientContext cl = app; - settings = cl.getSettings(); + settings = app.getSettings(); startedForNavigation = intent.getBooleanExtra(NAVIGATION_START_SERVICE_PARAM, false); if (startedForNavigation) { @@ -159,12 +158,12 @@ public class NavigationService extends Service implements LocationListener { // registering icon at top level // Leave icon visible even for navigation for proper display // if (!startedForNavigation) { - showNotificationInStatusBar(cl); + showNotificationInStatusBar(app); // } return START_REDELIVER_INTENT; } - private void showNotificationInStatusBar(ClientContext cl) { + private void showNotificationInStatusBar(OsmandApplication cl) { broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java new file mode 100644 index 0000000000..58dfe77a1e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java @@ -0,0 +1,76 @@ +package net.osmand.plus; + +import android.app.Activity; +import android.view.Window; +import net.osmand.plus.activities.DownloadIndexActivity; +import net.osmand.plus.activities.FavouritesActivity; +import net.osmand.plus.activities.LocalIndexesActivity; +import net.osmand.plus.activities.MainMenuActivity; +import net.osmand.plus.activities.MapActivity; +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; + +public class OsmAndAppCustomization { + + protected OsmandApplication app; + + public void setup(OsmandApplication app) { + this.app = app; + } + + public OsmandSettings createSettings(SettingsAPI api) { + return new OsmandSettings(app, api); + } + + public boolean checkExceptionsOnStart() { + return true; + } + + public boolean showFirstTimeRunAndTips(boolean firstTime, boolean appVersionChanged) { + return true; + } + + public boolean checkBasemapDownloadedOnStart() { + return true; + } + + public void customizeMainMenu(Window window, Activity activity) { + } + + + + public Class getSettingsActivity(){ + return SettingsActivity.class; + } + + public Class getMapActivity(){ + return MapActivity.class; + } + + public Class getSearchActivity(){ + return SearchActivity.class; + } + + public Class getFavoritesActivity(){ + return FavouritesActivity.class; + } + + public Class getMainMenuActivity() { + return MainMenuActivity.class; + } + + public Class getDownloadIndexActivity() { + return DownloadIndexActivity.class; + } + + public Class getPluginsActivity() { + return PluginsActivity.class; + } + + public Class getLocalIndexActivity() { + return LocalIndexesActivity.class; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index 564d8a659a..46437376cb 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -8,6 +8,7 @@ import net.osmand.data.Amenity; import net.osmand.data.AmenityType; import net.osmand.data.City.CityType; import net.osmand.plus.OsmandSettings.MetricsConstants; +import android.content.Context; public class OsmAndFormatter { private final static float METERS_IN_KILOMETER = 1000f; @@ -15,7 +16,7 @@ public class OsmAndFormatter { private final static float YARDS_IN_ONE_METER = 1.0936f; private final static float FOOTS_IN_ONE_METER = YARDS_IN_ONE_METER * 3f; - public static double calculateRoundedDist(double distInMeters, ClientContext ctx) { + public static double calculateRoundedDist(double distInMeters, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); double mainUnitInMeter = 1; @@ -48,7 +49,7 @@ public class OsmAndFormatter { return (generator / point); } - public static String getFormattedDistance(float meters, ClientContext ctx) { + public static String getFormattedDistance(float meters, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); int mainUnitStr; @@ -81,7 +82,7 @@ public class OsmAndFormatter { } } - public static String getFormattedAlt(double alt, ClientContext ctx) { + public static String getFormattedAlt(double alt, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); if (mc == MetricsConstants.KILOMETERS_AND_METERS) { @@ -91,7 +92,7 @@ public class OsmAndFormatter { } } - public static String getFormattedSpeed(float metersperseconds, ClientContext ctx) { + public static String getFormattedSpeed(float metersperseconds, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); ApplicationMode am = settings.getApplicationMode(); @@ -116,7 +117,7 @@ public class OsmAndFormatter { } - public static String toPublicString(CityType t, ClientContext ctx) { + public static String toPublicString(CityType t, Context ctx) { switch (t) { case CITY: return ctx.getString(R.string.city_type_city); @@ -134,7 +135,7 @@ public class OsmAndFormatter { return ""; } - public static String toPublicString(AmenityType t, ClientContext ctx) { + public static String toPublicString(AmenityType t, Context ctx) { Class cl = R.string.class; try { Field fld = cl.getField("amenity_type_"+t.getCategoryName()); @@ -147,7 +148,7 @@ public class OsmAndFormatter { } - public static String getPoiSimpleFormat(Amenity amenity, ClientContext ctx, boolean en){ + public static String getPoiSimpleFormat(Amenity amenity, Context ctx, boolean en){ return toPublicString(amenity.getType(), ctx) + " : " + getPoiStringWithoutType(amenity, en); //$NON-NLS-1$ } @@ -167,7 +168,7 @@ public class OsmAndFormatter { return type + " " + n; //$NON-NLS-1$ } - public static String getAmenityDescriptionContent(ClientContext ctx, Amenity amenity, boolean shortDescription) { + public static String getAmenityDescriptionContent(Context ctx, Amenity amenity, boolean shortDescription) { StringBuilder d = new StringBuilder(); for(Entry e : amenity.getAdditionalInfo().entrySet()) { String key = e.getKey(); diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 849190e856..993c269145 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Locale; import net.osmand.IndexConstants; -import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.access.AccessibilityPlugin; import net.osmand.access.AccessibleAlertBuilder; @@ -24,14 +23,10 @@ import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.access.AccessibilityMode; import net.osmand.plus.activities.DayNightHelper; import net.osmand.plus.activities.LiveMonitoringHelper; -import net.osmand.plus.activities.OsmandIntents; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SettingsActivity; -import net.osmand.plus.api.ExternalServiceAPI; -import net.osmand.plus.api.InternalOsmAndAPI; import net.osmand.plus.api.SQLiteAPI; import net.osmand.plus.api.SQLiteAPIImpl; -import net.osmand.plus.api.SettingsAPI; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -56,6 +51,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; @@ -79,11 +75,12 @@ import com.actionbarsherlock.app.SherlockExpandableListActivity; import com.actionbarsherlock.app.SherlockListActivity; -public class OsmandApplication extends Application implements ClientContext { +public class OsmandApplication extends Application { public static final String EXCEPTION_PATH = "exception.log"; //$NON-NLS-1$ private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmandApplication.class); - ResourceManager manager = null; + + ResourceManager resourceManager = null; PoiFiltersHelper poiFilters = null; RoutingHelper routingHelper = null; FavouritesDbHelper favorites = null; @@ -91,6 +88,7 @@ public class OsmandApplication extends Application implements ClientContext { OsmandSettings osmandSettings = null; + OsmAndAppCustomization appCustomization; DayNightHelper daynightHelper; NavigationService navigationService; RendererRegistry rendererRegistry; @@ -110,9 +108,6 @@ public class OsmandApplication extends Application implements ClientContext { private boolean applicationInitializing = false; private Locale prefferedLocale = null; - SettingsAPI settingsAPI; - ExternalServiceAPI externalServiceAPI; - InternalOsmAndAPI internalOsmAndAPI; SQLiteAPI sqliteAPI; BRouterServiceConnection bRouterServiceConnection; @@ -129,12 +124,10 @@ public class OsmandApplication extends Application implements ClientContext { } } super.onCreate(); + appCustomization = new OsmAndAppCustomization(); + appCustomization.setup(this); - settingsAPI = new net.osmand.plus.api.SettingsAPIImpl(this); - externalServiceAPI = new net.osmand.plus.api.ExternalServiceAPIImpl(this); - internalOsmAndAPI = new net.osmand.plus.api.InternalOsmAndAPIImpl(this); sqliteAPI = new SQLiteAPIImpl(this); - try { bRouterServiceConnection = BRouterServiceConnection.connect(this); } catch(Exception e) { @@ -142,7 +135,7 @@ public class OsmandApplication extends Application implements ClientContext { } // settings used everywhere so they need to be created first - osmandSettings = createOsmandSettingsInstance(); + osmandSettings = appCustomization.createSettings(new net.osmand.plus.api.SettingsAPIImpl(this)); // always update application mode to default if(!osmandSettings.FOLLOW_THE_ROUTE.get()){ osmandSettings.APPLICATION_MODE.set(osmandSettings.DEFAULT_APPLICATION_MODE.get()); @@ -152,7 +145,7 @@ public class OsmandApplication extends Application implements ClientContext { routingHelper = new RoutingHelper(this, player); taskManager = new OsmAndTaskManager(this); - manager = new ResourceManager(this); + resourceManager = new ResourceManager(this); daynightHelper = new DayNightHelper(this); locationProvider = new OsmAndLocationProvider(this); savingTrackHelper = new SavingTrackHelper(this); @@ -195,18 +188,19 @@ public class OsmandApplication extends Application implements ClientContext { return taskManager; } - /** - * Creates instance of OsmandSettings - * - * @return Reference to instance of OsmandSettings - */ - protected OsmandSettings createOsmandSettingsInstance() { - return new OsmandSettings(this); - } public OsmAndLocationProvider getLocationProvider() { return locationProvider; } + + public OsmAndAppCustomization getAppCustomization() { + return appCustomization; + } + + public void setAppCustomization(OsmAndAppCustomization appCustomization) { + this.appCustomization = appCustomization; + this.appCustomization.setup(this); + } /** * Application settings @@ -269,7 +263,7 @@ public class OsmandApplication extends Application implements ClientContext { } public ResourceManager getResourceManager() { - return manager; + return resourceManager; } public DayNightHelper getDaynightHelper() { @@ -279,7 +273,7 @@ public class OsmandApplication extends Application implements ClientContext { @Override public void onLowMemory() { super.onLowMemory(); - manager.onLowMemory(); + resourceManager.onLowMemory(); } @Override @@ -306,6 +300,8 @@ public class OsmandApplication extends Application implements ClientContext { config.locale = prefferedLocale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } + String clang = "".equals(lang) ? config.locale.getLanguage() : lang; + resourceManager.getOsmandRegions().setLocale(clang); } @@ -482,7 +478,7 @@ public class OsmandApplication extends Application implements ClientContext { private void closeApplicationAnyway(final Activity activity, boolean disableService) { if (applicationInitializing) { - manager.close(); + resourceManager.close(); } applicationInitializing = false; @@ -551,7 +547,7 @@ public class OsmandApplication extends Application implements ClientContext { } } } - warnings.addAll(manager.reloadIndexes(startDialog)); + warnings.addAll(resourceManager.reloadIndexes(startDialog)); player = null; if (savingTrackHelper.hasDataToSave()) { startDialog.startTask(getString(R.string.saving_gpx_tracks), -1); @@ -636,7 +632,8 @@ public class OsmandApplication extends Application implements ClientContext { public DefaultExceptionHandler() { defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); intent = PendingIntent.getActivity(OsmandApplication.this.getBaseContext(), 0, - new Intent(OsmandApplication.this.getBaseContext(), OsmandIntents.getMainMenuActivity()), 0); + new Intent(OsmandApplication.this.getBaseContext(), + getAppCustomization().getMainMenuActivity()), 0); } @Override @@ -684,47 +681,26 @@ public class OsmandApplication extends Application implements ClientContext { return targetPointsHelper; } - @Override public void showShortToastMessage(int msgId, Object... args) { AccessibleToast.makeText(this, getString(msgId, args), Toast.LENGTH_SHORT).show(); } - @Override public void showToastMessage(int msgId, Object... args) { AccessibleToast.makeText(this, getString(msgId, args), Toast.LENGTH_LONG).show(); } - @Override public void showToastMessage(String msg) { AccessibleToast.makeText(this, msg, Toast.LENGTH_LONG).show(); } - @Override - public SettingsAPI getSettingsAPI() { - return settingsAPI; - } - - @Override - public ExternalServiceAPI getExternalServiceAPI() { - return externalServiceAPI; - } - - @Override - public InternalOsmAndAPI getInternalAPI() { - return internalOsmAndAPI; - } - - @Override public SQLiteAPI getSQLiteAPI() { return sqliteAPI; } - @Override public void runInUIThread(Runnable run) { uiHandler.post(run); } - @Override public void runInUIThread(Runnable run, long delay) { uiHandler.postDelayed(run, delay); } @@ -744,7 +720,6 @@ public class OsmandApplication extends Application implements ClientContext { uiHandler.sendMessageDelayed(msg, delay); } - @Override public File getAppPath(String path) { if(path == null) { path = ""; @@ -752,12 +727,6 @@ public class OsmandApplication extends Application implements ClientContext { return new File(getSettings().getExternalStorageDirectory(), IndexConstants.APP_DIR + path); } - @Override - public Location getLastKnownLocation() { - return locationProvider.getLastKnownLocation(); - } - - public void applyTheme(Context c) { int t = R.style.OsmandLightDarkActionBarTheme; if (osmandSettings.OSMAND_THEME.get() == OsmandSettings.OSMAND_DARK_THEME) { @@ -841,4 +810,22 @@ public class OsmandApplication extends Application implements ClientContext { } return ((AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled(); } + + public String getVersionName() { + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + return info.versionName; + } catch (NameNotFoundException e) { + return ""; + } + } + + public int getVersionCode() { + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + return info.versionCode; + } catch (NameNotFoundException e) { + return 0; + } + } } diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index fd9a2988d6..49c0efb921 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -112,7 +112,7 @@ public abstract class OsmandPlugin { * Register layers calls when activity is created and before @mapActivityCreate * @param activity */ - public abstract void registerLayers(MapActivity activity); + public void registerLayers(MapActivity activity) { } public void mapActivityCreate(MapActivity activity) { } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 62d8ba8170..37d9575112 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -28,7 +28,13 @@ import net.osmand.plus.api.SettingsAPI.SettingsEditor; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.routing.RouteProvider.RouteService; import net.osmand.render.RenderingRulesStorage; +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.Build; +import android.os.Environment; public class OsmandSettings { @@ -99,9 +105,9 @@ public class OsmandSettings { private boolean internetConnectionAvailable = true; - protected OsmandSettings(OsmandApplication clientContext) { + protected OsmandSettings(OsmandApplication clientContext, SettingsAPI settinsAPI) { ctx = clientContext; - settingsAPI = ctx.getSettingsAPI(); + this.settingsAPI = settinsAPI; globalPreferences = settingsAPI.getPreferenceObject(SHARED_PREFERENCES_NAME); // start from default settings @@ -113,10 +119,18 @@ public class OsmandSettings { profilePreferences = getProfilePreferences(currentMode); } - public ClientContext getContext() { + public OsmandApplication getContext() { return ctx; } + public void setSettingsAPI(SettingsAPI settingsAPI) { + this.settingsAPI = settingsAPI; + } + + public SettingsAPI getSettingsAPI() { + return settingsAPI; + } + public static String getSharedPreferencesName(ApplicationMode mode){ if(mode == null){ return SHARED_PREFERENCES_NAME; @@ -129,9 +143,6 @@ public class OsmandSettings { return settingsAPI.getPreferenceObject(getSharedPreferencesName(mode)); } - public Object getGlobalPreferences(){ - return settingsAPI.getPreferenceObject(getSharedPreferencesName(null)); - } // this value string is synchronized with settings_pref.xml preference name public final OsmandPreference APPLICATION_MODE = new PreferenceWithListener(){ @@ -195,12 +206,29 @@ public class OsmandSettings { public boolean isInternetConnectionAvailable(boolean update){ long delta = System.currentTimeMillis() - lastTimeInternetConnectionChecked; if(delta < 0 || delta > 15000 || update){ - internetConnectionAvailable = ctx.getExternalServiceAPI().isInternetConnected(); + internetConnectionAvailable = isInternetConnected(); } return internetConnectionAvailable; } + public boolean isWifiConnected() { + ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo ni = mgr.getActiveNetworkInfo(); + return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; + } + private boolean isInternetConnected() { + ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo active = mgr.getActiveNetworkInfo(); + if(active == null){ + return false; + } else { + NetworkInfo.State state = active.getState(); + return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING; + } + } + + /////////////// PREFERENCES classes //////////////// public abstract class CommonPreference extends PreferenceWithListener { @@ -537,6 +565,16 @@ public class OsmandSettings { return p; } + @SuppressWarnings("unchecked") + public CommonPreference registerBooleanPreference(String id, String defValue) { + if(registeredPreferences.containsKey(id)) { + return (CommonPreference) registeredPreferences.get(id); + } + StringPreference p = new StringPreference(id, defValue); + registeredPreferences.put(id, p); + return p; + } + @SuppressWarnings("unchecked") public CommonPreference registerIntPreference(String id, int defValue) { if(registeredPreferences.containsKey(id)) { @@ -1003,7 +1041,7 @@ public class OsmandSettings { public static final String EXTERNAL_STORAGE_DIR = "external_storage_dir"; //$NON-NLS-1$ public File getExternalStorageDirectory() { - String defaultLocation = ctx.getExternalServiceAPI().getExternalStorageDirectory(); + String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath(); return new File(settingsAPI.getString(globalPreferences, EXTERNAL_STORAGE_DIR, defaultLocation)); } @@ -1011,7 +1049,7 @@ public class OsmandSettings { public static final int VERSION_DEFAULTLOCATION_CHANGED = 19; public String getDefaultExternalStorageLocation() { - String defaultLocation = ctx.getExternalServiceAPI().getExternalStorageDirectory(); + String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath(); return defaultLocation; } @@ -1663,7 +1701,7 @@ public class OsmandSettings { this.key = key; } - public String toHumanString(ClientContext ctx){ + public String toHumanString(Context ctx){ return ctx.getString(key); } @@ -1683,8 +1721,11 @@ public class OsmandSettings { return this == NIGHT; } - public static DayNightMode[] possibleValues(ClientContext context) { - if (context.getExternalServiceAPI().isLightSensorEnabled()) { + public static DayNightMode[] possibleValues(Context context) { + SensorManager mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); + Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + boolean isLightSensorEnabled = mLight != null; + if (isLightSensorEnabled) { return DayNightMode.values(); } else { return new DayNightMode[] { AUTO, DAY, NIGHT }; @@ -1706,7 +1747,7 @@ public class OsmandSettings { this.ttsString = ttsString; } - public String toHumanString(ClientContext ctx){ + public String toHumanString(Context ctx){ return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/PoiFilter.java b/OsmAnd/src/net/osmand/plus/PoiFilter.java index ca0f24713b..5df97e9a91 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/PoiFilter.java @@ -15,6 +15,10 @@ import net.osmand.data.Amenity; import net.osmand.data.AmenityType; import net.osmand.util.MapUtils; +import org.apache.http.client.protocol.ClientContext; + +import android.content.Context; + public class PoiFilter { public final static String STD_PREFIX = "std_"; //$NON-NLS-1$ @@ -30,7 +34,7 @@ public class PoiFilter { protected String nameFilter; protected boolean isStandardFilter; - protected final ClientContext application; + protected final OsmandApplication app; protected int distanceInd = 1; // in kilometers @@ -38,8 +42,8 @@ public class PoiFilter { // constructor for standard filters - public PoiFilter(AmenityType type, ClientContext application){ - this.application = application; + public PoiFilter(AmenityType type, OsmandApplication application){ + this.app = application; isStandardFilter = true; filterId = STD_PREFIX + type; name = type == null ? application.getString(R.string.poi_filter_closest_poi) : OsmAndFormatter.toPublicString(type, @@ -52,8 +56,8 @@ public class PoiFilter { } // constructor for user defined filters - public PoiFilter(String name, String filterId, Map> acceptedTypes, ClientContext app){ - application = app; + public PoiFilter(String name, String filterId, Map> acceptedTypes, OsmandApplication app){ + this.app = app; isStandardFilter = false; if(filterId == null){ filterId = USER_PREFIX + name.replace(' ', '_').toLowerCase(); @@ -109,9 +113,9 @@ public class PoiFilter { public String getSearchArea(){ double val = distanceToSearchValues[distanceInd]; if(val >= 1){ - return " < " + OsmAndFormatter.getFormattedDistance(((int)val * 1000), application); //$NON-NLS-1$//$NON-NLS-2$ + return " < " + OsmAndFormatter.getFormattedDistance(((int)val * 1000), app); //$NON-NLS-1$//$NON-NLS-2$ } else { - return " < " + OsmAndFormatter.getFormattedDistance(500, application); //$NON-NLS-1$ + return " < " + OsmAndFormatter.getFormattedDistance(500, app); //$NON-NLS-1$ } } @@ -147,7 +151,7 @@ public class PoiFilter { public ResultMatcher getResultMatcher(final ResultMatcher matcher){ final String filter = nameFilter; if(filter != null) { - final boolean en = application.getSettings().USE_ENGLISH_NAMES.get(); + final boolean en = app.getSettings().USE_ENGLISH_NAMES.get(); return new ResultMatcher() { @Override public boolean publish(Amenity object) { @@ -170,7 +174,7 @@ public class PoiFilter { protected List searchAmenities(double lat, double lon, double topLatitude, double bottomLatitude, double leftLongitude, double rightLongitude, final ResultMatcher matcher) { - return application.getInternalAPI().searchAmenities(this, + return app.getResourceManager().searchAmenities(this, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); } @@ -327,8 +331,8 @@ public class PoiFilter { this.isStandardFilter = isStandardFilter; } - public ClientContext getApplication() { - return application; + public Context getApplication() { + return app; } } diff --git a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java index 0829b4bbec..90fbb7e22f 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java +++ b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java @@ -16,7 +16,7 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteStatement; public class PoiFiltersHelper { - private final ClientContext application; + private final OsmandApplication application; private NameFinderPoiFilter nameFinderPOIFilter; private List cacheTopStandardFilters; @@ -37,7 +37,7 @@ public class PoiFiltersHelper { private static final String[] DEL = new String[] {}; - public PoiFiltersHelper(ClientContext application){ + public PoiFiltersHelper(OsmandApplication application){ this.application = application; } public NameFinderPoiFilter getNameFinderPOIFilter() { @@ -301,10 +301,10 @@ public class PoiFiltersHelper { private static final String CATEGORIES_COL_SUBCATEGORY = "subcategory"; //$NON-NLS-1$ private static final String CATEGORIES_TABLE_CREATE = "CREATE TABLE " + CATEGORIES_NAME + " (" + //$NON-NLS-1$ //$NON-NLS-2$ CATEGORIES_FILTER_ID + ", " + CATEGORIES_COL_CATEGORY + ", " + CATEGORIES_COL_SUBCATEGORY + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - private ClientContext context; + private OsmandApplication context; private SQLiteConnection conn; - PoiFilterDbHelper(ClientContext context) { + PoiFilterDbHelper(OsmandApplication context) { this.context = context; } diff --git a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java index f8b07c3dc0..5d603235f7 100644 --- a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java +++ b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java @@ -18,6 +18,7 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; +import org.apache.http.client.protocol.ClientContext; import android.database.sqlite.SQLiteDiskIOException; import android.graphics.Bitmap; @@ -42,12 +43,12 @@ public class SQLiteTileSource implements ITileSource { private int expirationTimeMillis = -1; // never static final int tileSize = 256; - private ClientContext ctx; + private OsmandApplication ctx; private boolean onlyReadonlyAvailable = false; - public SQLiteTileSource(ClientContext ctx, File f, List toFindUrl){ + public SQLiteTileSource(OsmandApplication ctx, File f, List toFindUrl){ this.ctx = ctx; this.file = f; if (f != null) { diff --git a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java b/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java index 88621c5b85..e2f872baea 100644 --- a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java +++ b/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java @@ -18,7 +18,7 @@ public class SearchByNameFilter extends PoiFilter { private String query = ""; //$NON-NLS-1$ - public SearchByNameFilter(ClientContext application) { + public SearchByNameFilter(OsmandApplication application) { super(application.getString(R.string.poi_filter_by_name), FILTER_ID, new LinkedHashMap>(), application); this.distanceToSearchValues = new double[] {100, 1000, 5000}; this.isStandardFilter = true; @@ -44,7 +44,7 @@ public class SearchByNameFilter extends PoiFilter { searchedAmenities.clear(); final int limit = distanceInd == 0 ? 500 : -1; - List result = application.getInternalAPI().searchAmenitiesByName(query, + List result = app.getResourceManager().searchAmenitiesByName(query, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, new ResultMatcher() { boolean elimit = false; @Override diff --git a/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java b/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java index 72b3ce0fcb..1cbdc4c974 100644 --- a/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java +++ b/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java @@ -9,14 +9,14 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; public class SearchHistoryHelper { private static final int HISTORY_LIMIT = 50; - private ClientContext context; + private OsmandApplication context; private List loadedEntries = null; - public SearchHistoryHelper(ClientContext context) { + public SearchHistoryHelper(OsmandApplication context) { this.context = context; } - public static SearchHistoryHelper getInstance(ClientContext context){ + public static SearchHistoryHelper getInstance(OsmandApplication context){ return new SearchHistoryHelper(context); } diff --git a/OsmAnd/src/net/osmand/plus/SpecialPhrases.java b/OsmAnd/src/net/osmand/plus/SpecialPhrases.java index de6836fc6f..95941aed77 100644 --- a/OsmAnd/src/net/osmand/plus/SpecialPhrases.java +++ b/OsmAnd/src/net/osmand/plus/SpecialPhrases.java @@ -50,7 +50,7 @@ public class SpecialPhrases { * @param lang the language to use * @throws IOException when reading the text file failed */ - public static void setLanguage(ClientContext ctx, OsmandSettings settings) throws IOException { + public static void setLanguage(OsmandApplication ctx, OsmandSettings settings) throws IOException { String lang = getPreferredLanguage(settings).getLanguage(); m = new HashMap(); // The InputStream opens the resourceId and sends it to the buffer @@ -58,10 +58,10 @@ public class SpecialPhrases { BufferedReader br = null; try { try { - is = ctx.getInternalAPI().openAsset("specialphrases/specialphrases_" + lang + ".txt"); + is = ctx.getAssets().open("specialphrases/specialphrases_" + lang + ".txt"); } catch (IOException ex) { // second try: default to English, if this fails, the error is thrown outside - is = ctx.getInternalAPI().openAsset("specialphrases/specialphrases_en.txt"); + is = ctx.getAssets().open("specialphrases/specialphrases_en.txt"); } br = new BufferedReader(new InputStreamReader(is)); String readLine = null; diff --git a/OsmAnd/src/net/osmand/plus/Version.java b/OsmAnd/src/net/osmand/plus/Version.java index 3e46375fe9..c272cd8962 100644 --- a/OsmAnd/src/net/osmand/plus/Version.java +++ b/OsmAnd/src/net/osmand/plus/Version.java @@ -11,19 +11,19 @@ public class Version { private final static String FREE_VERSION_NAME = "net.osmand"; - public static boolean isGpsStatusEnabled(ClientContext ctx) { + public static boolean isGpsStatusEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+gps_status") && !isBlackberry(ctx); } - public static boolean isBlackberry(ClientContext ctx) { + public static boolean isBlackberry(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+blackberry"); } - public static boolean isMarketEnabled(ClientContext ctx) { + public static boolean isMarketEnabled(OsmandApplication ctx) { return isGooglePlayEnabled(ctx) || isAmazonEnabled(ctx); } - public static String marketPrefix(ClientContext ctx) { + public static String marketPrefix(OsmandApplication ctx) { if (isAmazonEnabled(ctx)) { return "amzn://apps/android?p="; } else if (isGooglePlayEnabled(ctx)) { @@ -32,56 +32,56 @@ public class Version { return "http://osmand.net/apps?"; } - public static boolean isAmazonEnabled(ClientContext ctx) { + public static boolean isAmazonEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+amazon"); } - public static boolean isGooglePlayEnabled(ClientContext ctx) { + public static boolean isGooglePlayEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+play_market"); } - public static boolean isFreeVersionEnabled(ClientContext ctx) { + public static boolean isFreeVersionEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+free_version"); } - public static boolean isParkingPluginInlined(ClientContext ctx) { + public static boolean isParkingPluginInlined(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+parking_plugin"); } - private Version(ClientContext ctx) { + private Version(OsmandApplication ctx) { appVersion = ctx.getString(R.string.app_version); appName = ctx.getString(R.string.app_name); } private static Version ver = null; - private static Version getVersion(ClientContext ctx){ + private static Version getVersion(OsmandApplication ctx){ if(ver == null){ ver = new Version(ctx); } return ver; } - public static String getFullVersion(ClientContext ctx){ + public static String getFullVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appName + " " + v.appVersion; } - public static String getAppVersion(ClientContext ctx){ + public static String getAppVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appVersion; } - public static String getAppName(ClientContext ctx){ + public static String getAppName(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appName; } - public static boolean isProductionVersion(ClientContext ctx){ + public static boolean isProductionVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return !v.appVersion.contains("#"); } - public static String getVersionAsURLParam(ClientContext ctx) { + public static String getVersionAsURLParam(OsmandApplication ctx) { try { return "osmandver=" + URLEncoder.encode(getVersionForTracker(ctx), "UTF-8"); } catch (UnsupportedEncodingException e) { @@ -89,17 +89,17 @@ public class Version { } } - public static boolean isFreeVersion(ClientContext ctx){ - return ctx.getInternalAPI().getPackageName().equals(FREE_VERSION_NAME) || isFreeVersionEnabled(ctx); + public static boolean isFreeVersion(OsmandApplication ctx){ + return ctx.getPackageName().equals(FREE_VERSION_NAME) || isFreeVersionEnabled(ctx); } - public static boolean isDeveloperVersion(ClientContext ctx){ + public static boolean isDeveloperVersion(OsmandApplication ctx){ return "osmand~".equalsIgnoreCase(getAppName(ctx)); } - public static String getVersionForTracker(ClientContext ctx) { + public static String getVersionForTracker(OsmandApplication ctx) { String v = Version.getAppName(ctx); if(Version.isProductionVersion(ctx)){ v = Version.getFullVersion(ctx); diff --git a/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java b/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java index f71179329f..c6bb62c2c6 100644 --- a/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java +++ b/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java @@ -1,7 +1,7 @@ package net.osmand.plus.access; -import net.osmand.plus.ClientContext; import net.osmand.plus.R; +import android.content.Context; public enum AccessibilityMode { @@ -15,7 +15,7 @@ public enum AccessibilityMode { this.key = key; } - public String toHumanString(ClientContext ctx) { + public String toHumanString(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java index f4f8849b6d..4e7870ca41 100644 --- a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java +++ b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java @@ -1,7 +1,7 @@ package net.osmand.plus.access; -import net.osmand.plus.ClientContext; import net.osmand.plus.R; +import android.content.Context; public enum RelativeDirectionStyle { @@ -14,7 +14,7 @@ public enum RelativeDirectionStyle { this.key = key; } - public String toHumanString(ClientContext ctx) { + public String toHumanString(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java index d74791808b..a91a7e7cd7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java @@ -14,7 +14,6 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.access.AccessibleToast; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandSettings; @@ -349,7 +348,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { filtered.add(fileItem); } } - listAdapter.setIndexFiles(filtered, IndexItemCategory.categorizeIndexItems(getClientContext(), filtered)); + listAdapter.setIndexFiles(filtered, IndexItemCategory.categorizeIndexItems(getMyApplication(), filtered)); listAdapter.notifyDataSetChanged(); } @@ -362,7 +361,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { IndexItem es = listAdapter.getChild(j, i); if (!getEntriesToDownload().containsKey(es)) { selected++; - getEntriesToDownload().put(es, es.createDownloadEntry(getClientContext(), type, new ArrayList(1))); + getEntriesToDownload().put(es, es.createDownloadEntry(getMyApplication(), type, new ArrayList(1))); } } } @@ -502,7 +501,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { return true; } - List download = e.createDownloadEntry(getClientContext(), type, new ArrayList()); + List download = e.createDownloadEntry(getMyApplication(), type, new ArrayList()); if (download.size() > 0) { // if(!fileToUnzip.exists()){ // builder.setMessage(MessageFormat.format(getString(R.string.download_question), baseName, extractDateAndSize(e.getValue()))); @@ -565,7 +564,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { protected void downloadFilesCheckInternet() { - if(!getMyApplication().getExternalServiceAPI().isWifiConnected()) { + if(!getMyApplication().getSettings().isWifiConnected()) { Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.download_using_mobile_internet)); builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() { @@ -622,10 +621,6 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { - public ClientContext getClientContext() { - return getMyApplication(); - } - public void updateProgress(boolean updateOnlyProgress) { BasicProgressAsyncTask basicProgressAsyncTask = downloadListIndexThread.getCurrentRunningTask(); diff --git a/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java b/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java index 60b5043279..96d190c5df 100644 --- a/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java @@ -129,8 +129,6 @@ public class LocalIndexesActivity extends OsmandExpandableListActivity { } - - private void showContextMenu(final LocalIndexInfo info) { Builder builder = new AlertDialog.Builder(this); final ContextMenuAdapter adapter = new ContextMenuAdapter(this); diff --git a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java index 4f8101ab9c..90aa5b9b36 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java @@ -6,11 +6,13 @@ import java.util.Random; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.data.LatLon; +import net.osmand.plus.OsmAndAppCustomization; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.render.MapRenderRepositories; +import net.osmand.plus.sherpafy.SherpafyCustomization; import android.app.Activity; import android.app.AlertDialog.Builder; import android.app.Dialog; @@ -182,6 +184,9 @@ public class MainMenuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + if(getIntent() != null) { + setupCustomization(getIntent()); + } ((OsmandApplication) getApplication()).applyTheme(this); super.onCreate(savedInstanceState); boolean exit = false; @@ -195,6 +200,8 @@ public class MainMenuActivity extends Activity { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.menu); + final OsmAndAppCustomization appCustomization = getMyApplication().getAppCustomization(); + onCreateMainMenu(getWindow(), this); Window window = getWindow(); @@ -203,7 +210,7 @@ public class MainMenuActivity extends Activity { showMap.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent mapIndent = new Intent(activity, OsmandIntents.getMapActivity()); + final Intent mapIndent = new Intent(activity, appCustomization.getMapActivity()); activity.startActivityForResult(mapIndent, 0); } }); @@ -211,7 +218,7 @@ public class MainMenuActivity extends Activity { settingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent settings = new Intent(activity, OsmandIntents.getSettingsActivity()); + final Intent settings = new Intent(activity, appCustomization.getSettingsActivity()); activity.startActivity(settings); } }); @@ -220,7 +227,7 @@ public class MainMenuActivity extends Activity { favouritesButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent favorites = new Intent(activity, OsmandIntents.getFavoritesActivity()); + final Intent favorites = new Intent(activity, appCustomization.getFavoritesActivity()); favorites.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(favorites); } @@ -237,11 +244,12 @@ public class MainMenuActivity extends Activity { searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent search = new Intent(activity, OsmandIntents.getSearchActivity()); + final Intent search = new Intent(activity, appCustomization.getSearchActivity()); search.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(search); } }); + appCustomization.customizeMainMenu(window, this); if(exit){ getMyApplication().closeApplication(activity); return; @@ -249,49 +257,62 @@ public class MainMenuActivity extends Activity { OsmandApplication app = getMyApplication(); // restore follow route mode if(app.getSettings().FOLLOW_THE_ROUTE.get() && !app.getRoutingHelper().isRouteCalculated()){ - final Intent mapIndent = new Intent(this, OsmandIntents.getMapActivity()); + final Intent mapIndent = new Intent(this, appCustomization.getMapActivity()); startActivityForResult(mapIndent, 0); return; } startProgressDialog = new ProgressDialog(this); getMyApplication().checkApplicationIsBeingInitialized(this, startProgressDialog); - SharedPreferences pref = getPreferences(MODE_WORLD_WRITEABLE); + boolean dialogShown = false; boolean firstTime = false; - if(!pref.contains(FIRST_TIME_APP_RUN)){ + SharedPreferences pref = getPreferences(MODE_WORLD_WRITEABLE); + boolean appVersionChanged = false; + if (!pref.contains(FIRST_TIME_APP_RUN)) { firstTime = true; pref.edit().putBoolean(FIRST_TIME_APP_RUN, true).commit(); pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); - - applicationInstalledFirstTime(); - } else { - int i = pref.getInt(TIPS_SHOW, 0); - if (i < 7){ - pref.edit().putInt(TIPS_SHOW, ++i).commit(); - } - boolean appVersionChanged = false; - if(!Version.getFullVersion(app).equals(pref.getString(VERSION_INSTALLED, ""))){ - pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); - appVersionChanged = true; - } - - if (i == 1 || i == 5 || appVersionChanged) { - TipsAndTricksActivity tipsActivity = new TipsAndTricksActivity(this); - Dialog dlg = tipsActivity.getDialogToShowTips(!appVersionChanged, false); - dlg.show(); + } else if (!Version.getFullVersion(app).equals(pref.getString(VERSION_INSTALLED, ""))) { + pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); + appVersionChanged = true; + } + if (appCustomization.showFirstTimeRunAndTips(firstTime, appVersionChanged)) { + if (firstTime) { + applicationInstalledFirstTime(); + dialogShown = true; } else { - if (startProgressDialog.isShowing()) { - startProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - checkVectorIndexesDownloaded(); - } - }); - } else { - checkVectorIndexesDownloaded(); + int i = pref.getInt(TIPS_SHOW, 0); + if (i < 7) { + pref.edit().putInt(TIPS_SHOW, ++i).commit(); + } + if (i == 1 || i == 5 || appVersionChanged) { + TipsAndTricksActivity tipsActivity = new TipsAndTricksActivity(this); + Dialog dlg = tipsActivity.getDialogToShowTips(!appVersionChanged, false); + dlg.show(); + dialogShown = true; } } } - checkPreviousRunsForExceptions(firstTime); + if(!dialogShown && appCustomization.checkBasemapDownloadedOnStart()) { + if (startProgressDialog.isShowing()) { + startProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + checkVectorIndexesDownloaded(); + } + }); + } else { + checkVectorIndexesDownloaded(); + } + } + if(appCustomization.checkExceptionsOnStart()){ + checkPreviousRunsForExceptions(firstTime); + } + } + + private void setupCustomization(Intent intent) { + if (intent.hasExtra("SHERPAFY")) { + ((OsmandApplication) getApplication()).setAppCustomization(new SherpafyCustomization()); + } } private void applicationInstalledFirstTime() { @@ -315,7 +336,7 @@ public class MainMenuActivity extends Activity { @Override public void onClick(DialogInterface dialog, int which) { - startActivity(new Intent(MainMenuActivity.this, OsmandIntents.getDownloadIndexActivity())); + startActivity(new Intent(MainMenuActivity.this, getMyApplication().getAppCustomization().getDownloadIndexActivity())); } }); @@ -388,6 +409,7 @@ public class MainMenuActivity extends Activity { final View menuView = (View) a.getLayoutInflater().inflate(R.layout.menu, null); menuView.setBackgroundColor(Color.argb(200, 150, 150, 150)); dlg.setContentView(menuView); + final OsmAndAppCustomization appCustomization = ((OsmandApplication) a.getApplication()).getAppCustomization(); MainMenuActivity.onCreateMainMenu(dlg.getWindow(), a); Animation anim = new Animation() { @Override @@ -411,7 +433,7 @@ public class MainMenuActivity extends Activity { settingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent settings = new Intent(a, OsmandIntents.getSettingsActivity()); + final Intent settings = new Intent(a, appCustomization.getSettingsActivity()); a.startActivity(settings); dlg.dismiss(); } @@ -421,7 +443,7 @@ public class MainMenuActivity extends Activity { favouritesButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent favorites = new Intent(a, OsmandIntents.getFavoritesActivity()); + final Intent favorites = new Intent(a, appCustomization.getFavoritesActivity()); favorites.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); a.startActivity(favorites); dlg.dismiss(); @@ -434,7 +456,7 @@ public class MainMenuActivity extends Activity { public void onClick(View v) { dlg.dismiss(); // 1. Work for almost all cases when user open apps from main menu - Intent newIntent = new Intent(a, OsmandIntents.getMainMenuActivity()); + Intent newIntent = new Intent(a, appCustomization.getMainMenuActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.putExtra(MainMenuActivity.APP_EXIT_KEY, MainMenuActivity.APP_EXIT_CODE); a.startActivity(newIntent); @@ -451,7 +473,7 @@ public class MainMenuActivity extends Activity { searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent search = new Intent(a, OsmandIntents.getSearchActivity()); + final Intent search = new Intent(a, appCustomization.getSearchActivity()); LatLon loc = searchLocation; search.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); search.putExtra(SearchActivity.SEARCH_LON, loc.getLongitude()); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 1f20532c3e..3e5b0dd727 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -32,7 +32,6 @@ import net.osmand.plus.base.FailSafeFuntions; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback; import net.osmand.plus.views.AnimateDraggingMapThread; @@ -98,7 +97,7 @@ public class MapActivity extends AccessibleActivity { private Notification getNotification() { - Intent notificationIndent = new Intent(this, OsmandIntents.getMapActivity()); + Intent notificationIndent = new Intent(this, getMyApplication().getAppCustomization().getMapActivity()); notificationIndent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Notification notification = new Notification(R.drawable.icon, "", //$NON-NLS-1$ System.currentTimeMillis()); @@ -392,7 +391,7 @@ public class MapActivity extends AccessibleActivity { mapActions.openOptionsMenuAsList(); return true; } else if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) { - Intent newIntent = new Intent(MapActivity.this, OsmandIntents.getSearchActivity()); + Intent newIntent = new Intent(MapActivity.this, getMyApplication().getAppCustomization().getSearchActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); LatLon loc = getMapLocation(); newIntent.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); @@ -653,7 +652,7 @@ public class MapActivity extends AccessibleActivity { public static void launchMapActivityMoveToTop(Context activity){ - Intent newIntent = new Intent(activity, OsmandIntents.getMapActivity()); + Intent newIntent = new Intent(activity, ((OsmandApplication) activity.getApplicationContext()).getAppCustomization().getMapActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(newIntent); } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 9640a43505..21469c6dfa 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -416,7 +416,7 @@ public class MapActivityActions implements DialogProvider { if (click != null) { click.onContextMenuClick(standardId, which, false, dialog); } else if (standardId == R.string.context_menu_item_search) { - Intent intent = new Intent(mapActivity, OsmandIntents.getSearchActivity()); + Intent intent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSearchActivity()); intent.putExtra(SearchActivity.SEARCH_LAT, latitude); intent.putExtra(SearchActivity.SEARCH_LON, longitude); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -731,7 +731,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - final Intent intentSettings = new Intent(mapActivity, OsmandIntents.getSettingsActivity()); + final Intent intentSettings = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSettingsActivity()); mapActivity.startActivity(intentSettings); } }).reg(); @@ -740,7 +740,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - Intent newIntent = new Intent(mapActivity, OsmandIntents.getSearchActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSearchActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); LatLon loc = mapActivity.getMapLocation(); newIntent.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); @@ -754,7 +754,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - Intent newIntent = new Intent(mapActivity, OsmandIntents.getFavoritesActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getFavoritesActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); mapActivity.startActivity(newIntent); } @@ -811,7 +811,7 @@ public class MapActivityActions implements DialogProvider { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { // 1. Work for almost all cases when user open apps from main menu - Intent newIntent = new Intent(mapActivity, OsmandIntents.getMainMenuActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getMainMenuActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.putExtra(MainMenuActivity.APP_EXIT_KEY, MainMenuActivity.APP_EXIT_CODE); mapActivity.startActivity(newIntent); diff --git a/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java b/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java deleted file mode 100644 index 2570023d41..0000000000 --- a/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.osmand.plus.activities; - -import net.osmand.plus.activities.search.SearchActivity; -import android.app.Activity; - -public class OsmandIntents { - - public static Class getSettingsActivity(){ - return SettingsActivity.class; - } - - public static Class getMapActivity(){ - return MapActivity.class; - } - - public static Class getSearchActivity(){ - return SearchActivity.class; - } - - public static Class getFavoritesActivity(){ - return FavouritesActivity.class; - } - - public static Class getMainMenuActivity() { - return MainMenuActivity.class; - } - - public static Class getDownloadIndexActivity() { - return DownloadIndexActivity.class; - } - - public static Class getPluginsActivity() { - return PluginsActivity.class; - } - - public static Class getLocalIndexActivity() { - return LocalIndexesActivity.class; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java index b1d7a00c04..afa3dd6d1c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java @@ -99,9 +99,9 @@ public class SettingsActivity extends SettingsBaseActivity { } } if (empty) { - startActivity(new Intent(this, OsmandIntents.getDownloadIndexActivity())); + startActivity(new Intent(this, getMyApplication().getAppCustomization().getDownloadIndexActivity())); } else { - startActivity(new Intent(this, OsmandIntents.getLocalIndexActivity())); + startActivity(new Intent(this, getMyApplication().getAppCustomization().getLocalIndexActivity())); } return true; } else if (preference == bidforfix) { @@ -116,7 +116,7 @@ public class SettingsActivity extends SettingsBaseActivity { showAboutDialog(); return true; } else if (preference == plugins) { - startActivityForResult(new Intent(this, OsmandIntents.getPluginsActivity()), PLUGINS_SELECTION_REQUEST); + startActivityForResult(new Intent(this, getMyApplication().getAppCustomization().getPluginsActivity()), PLUGINS_SELECTION_REQUEST); return true; } else { super.onPreferenceClick(preference); @@ -143,19 +143,23 @@ public class SettingsActivity extends SettingsBaseActivity { edition = getString(R.string.local_index_installed) + " :\t" + DateFormat.getDateFormat(getApplicationContext()).format(date); } catch (Exception e) { } + SpannableString content = new SpannableString(vt + version +"\n" + + edition +"\n\n"+ + getString(R.string.about_content)); + content.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + final Intent mapIntent = new Intent(SettingsActivity.this, ContributionVersionActivity.class); + startActivityForResult(mapIntent, 0); + } + + }, st, st + version.length(), 0); + tv.setText(content); + } else { + tv.setText(vt + version +"\n\n" + + getString(R.string.about_content)); } - SpannableString content = new SpannableString(vt + version +"\n" + - edition +"\n\n"+ - getString(R.string.about_content)); - content.setSpan(new ClickableSpan() { - @Override - public void onClick(View widget) { - final Intent mapIntent = new Intent(SettingsActivity.this, ContributionVersionActivity.class); - startActivityForResult(mapIntent, 0); - } - - }, st, st + version.length(), 0); - tv.setText(content); + tv.setPadding(5, 0, 5, 5); tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 19); tv.setMovementMethod(LinkMovementMethod.getInstance()); diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 3e6bbd9148..356b2785c4 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -12,7 +12,7 @@ import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.DrivingRegion; import net.osmand.plus.OsmandSettings.MetricsConstants; @@ -167,13 +167,45 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { "sl", "es", "sv", "tr", "uk", "vi", "cy" }; entries = new String[] { getString(R.string.system_locale), - "English", "Afrikaans", "Armenian" + incompleteSuffix, "Basque" + incompleteSuffix, "Belarusian" + incompleteSuffix, "Bosnian" + incompleteSuffix, "Bulgarian" + incompleteSuffix, - "Catalan", "Czech", "Danish", "Dutch", "Finnish" + incompleteSuffix, "French", "Georgian", - "German", "Greek", "Hebrew", "Hindi" + incompleteSuffix, "Hungarian", "Indonesian" + incompleteSuffix, - "Italian", "Japanese" + incompleteSuffix, "Korean" + incompleteSuffix, "Latvian", "Lithuanian", "Marathi" +incompleteSuffix, - "Norwegian" + incompleteSuffix, "Polish", "Portuguese", "Romanian", "Russian", "Slovak", - "Slovenian", "Spanish", "Swedish", "Turkish" , "Ukrainian" , "Vietnamese", - "Welsh" + incompleteSuffix }; + getString(R.string.lang_en), + getString(R.string.lang_af), + getString(R.string.lang_hy) + incompleteSuffix, + getString(R.string.lang_eu) + incompleteSuffix, + getString(R.string.lang_be) + incompleteSuffix, + getString(R.string.lang_bs) + incompleteSuffix, + getString(R.string.lang_bg) + incompleteSuffix, + getString(R.string.lang_ca), + getString(R.string.lang_cs), + getString(R.string.lang_da), + getString(R.string.lang_nl), + getString(R.string.lang_fi) + incompleteSuffix, + getString(R.string.lang_fr), + getString(R.string.lang_ka), + getString(R.string.lang_de), + getString(R.string.lang_el), + getString(R.string.lang_iw), + getString(R.string.lang_hi) + incompleteSuffix, + getString(R.string.lang_hu), + getString(R.string.lang_id) + incompleteSuffix, + getString(R.string.lang_it), + getString(R.string.lang_ja) + incompleteSuffix, + getString(R.string.lang_ko) + incompleteSuffix, + getString(R.string.lang_lv), + getString(R.string.lang_lt), + getString(R.string.lang_mr), + getString(R.string.lang_no) + incompleteSuffix, + getString(R.string.lang_pl), + getString(R.string.lang_pt), + getString(R.string.lang_ro), + getString(R.string.lang_ru), + getString(R.string.lang_sk), + getString(R.string.lang_sl), + getString(R.string.lang_es), + getString(R.string.lang_sv), + getString(R.string.lang_tr), + getString(R.string.lang_uk), + getString(R.string.lang_vi), + getString(R.string.lang_cy) + incompleteSuffix,}; registerListPreference(settings.PREFERRED_LOCALE, screen, entries, entrieValues); @@ -185,7 +217,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { } registerListPreference(settings.APPLICATION_MODE, screen, entries, appModes); - if (!Version.isBlackberry((ClientContext) getApplication())) { + if (!Version.isBlackberry((OsmandApplication) getApplication())) { PreferenceScreen cat = getPreferenceScreen(); int nav = getResources().getConfiguration().navigation; if (nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java index bd2ed3c8c9..95cd54f5b4 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java @@ -246,6 +246,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity { routerServicePreference.setSummary(getString(R.string.router_service_descr) + " [" + settings.ROUTER_SERVICE.get() + "]"); prepareRoutingPrefs(getPreferenceScreen()); + super.updateAllSettings(); } return true; } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java index 4dc7efc826..b422525623 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java @@ -16,7 +16,6 @@ import net.osmand.data.City; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.Street; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -148,7 +147,7 @@ public class GeoIntentActivity extends OsmandListActivity { int dist = (int) (MapUtils.getDistance(location, model .getLocation().getLatitude(), model.getLocation() .getLongitude())); - distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist,(ClientContext) getApplication())); + distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist,(OsmandApplication) getApplication())); } else { distanceLabel.setText(""); //$NON-NLS-1$ } @@ -201,10 +200,14 @@ public class GeoIntentActivity extends OsmandListActivity { */ private MyService extract(Uri data) { if ("http".equalsIgnoreCase(data.getScheme()) && "maps.google.com".equals(data.getHost())) { - String q = data.getQueryParameter("q").split(" ")[0]; - if (q.indexOf(',') == -1) { - q = data.getQueryParameter("daddr").split(" ")[0]; - } + String q = null; + String parameter = data.getQueryParameter("q"); + if (parameter == null) { + parameter = data.getQueryParameter("daddr"); + } + if(parameter != null) { + q = parameter.split(" ")[0]; + } if (q.indexOf(',') != -1) { int i = q.indexOf(','); String lat = q.substring(0, i); diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java index 8ed4783e84..0c123e827d 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java @@ -12,7 +12,6 @@ import net.londatiga.android.QuickAction; import net.osmand.PlatformUtil; import net.osmand.access.AccessibleToast; import net.osmand.data.LatLon; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -165,7 +164,7 @@ public class SearchAddressOnlineFragment extends SherlockFragment implements Sea URL url = new URL(b.toString()); URLConnection conn = url.openConnection(); conn.setDoInput(true); - conn.setRequestProperty("User-Agent", Version.getFullVersion((ClientContext) getActivity().getApplication())); //$NON-NLS-1$ + conn.setRequestProperty("User-Agent", Version.getFullVersion((OsmandApplication) getActivity().getApplication())); //$NON-NLS-1$ conn.connect(); InputStream is = conn.getInputStream(); XmlPullParser parser = Xml.newPullParser(); @@ -258,7 +257,7 @@ public class SearchAddressOnlineFragment extends SherlockFragment implements Sea TextView distanceLabel = (TextView) row.findViewById(R.id.distance_label); if(location != null){ int dist = (int) (MapUtils.getDistance(location, model.lat, model.lon)); - distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getActivity().getApplication())); + distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, (OsmandApplication) getActivity().getApplication())); } else { distanceLabel.setText(""); //$NON-NLS-1$ } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java index deb0b00201..d92b062186 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java @@ -12,6 +12,7 @@ import java.util.Map; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.data.LatLon; import net.osmand.data.MapObject; @@ -113,7 +114,7 @@ public abstract class SearchByNameAbstractActivity extends OsmandListActivity final NamesAdapter namesAdapter = new NamesAdapter(new ArrayList(), createComparator()); //$NON-NLS-1$ setListAdapter(namesAdapter); - collator = PlatformUtil.primaryCollator(); + collator = OsmAndCollator.primaryCollator(); progress = (ProgressBar) findViewById(R.id.ProgressBar); diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java index 73606fe1ac..f041a952ce 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java @@ -6,7 +6,7 @@ import java.util.List; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; import net.osmand.data.City; import net.osmand.data.City.CityType; @@ -180,7 +180,7 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity private CityComparator(StringMatcherMode startsWith, boolean en) { this.startsWith = startsWith; - this.cs = PlatformUtil.primaryCollator(); + this.cs = OsmAndCollator.primaryCollator(); this.en = en; } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java index 3e728416a1..09ba8e999e 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java @@ -4,7 +4,6 @@ import java.util.List; import net.londatiga.android.QuickAction; import net.osmand.data.LatLon; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -49,7 +48,7 @@ public class SearchHistoryFragment extends SherlockListFragment implements Sear @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - helper = SearchHistoryHelper.getInstance((ClientContext) getActivity().getApplicationContext()); + helper = SearchHistoryHelper.getInstance((OsmandApplication) getActivity().getApplicationContext()); } @Override @@ -143,7 +142,7 @@ public class SearchHistoryFragment extends SherlockListFragment implements Sear final HistoryEntry model = getItem(position); if (location != null) { int dist = (int) (MapUtils.getDistance(location, model.getLat(), model.getLon())); - distance = OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getActivity().getApplication()) + " "; + distance = OsmAndFormatter.getFormattedDistance(dist, (OsmandApplication) getActivity().getApplication()) + " "; } label.setText(distance + model.getName(), BufferType.SPANNABLE); ((Spannable) label.getText()).setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_distance)), 0, distance.length(), 0); diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java index a76b0159f0..f77184f833 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java @@ -10,7 +10,6 @@ import java.util.List; import net.osmand.data.LatLon; import net.osmand.data.TransportRoute; import net.osmand.data.TransportStop; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -79,7 +78,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA public View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.search_transport, container, false); - settings = ((OsmandApplication) getApplication()).getSettings(); + settings = getApplication().getSettings(); searchTransportLevel = (Button) view.findViewById(R.id.SearchTransportLevelButton); searchTransportLevel.setText(R.string.search_POI_level_btn); @@ -263,19 +262,19 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA } ind++; } - text.append(getString(R.string.transport_route_distance)).append(" ").append(OsmAndFormatter.getFormattedDistance((int) dist, (ClientContext) getApplication())); //$NON-NLS-1$/ + text.append(getString(R.string.transport_route_distance)).append(" ").append(OsmAndFormatter.getFormattedDistance((int) dist, getApplication())); //$NON-NLS-1$/ if(!part){ text.append(", ").append(getString(R.string.transport_stops_to_pass)).append(" ").append(eInd - stInd); //$NON-NLS-1$ //$NON-NLS-2$ LatLon endStop = getEndStop(position - 1); if (endStop != null) { String before = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(endStop, route.getStart().getLocation()), - (ClientContext) getApplication()); + getApplication()); text.append(", ").append(getString(R.string.transport_to_go_before)).append(" ").append(before); //$NON-NLS-2$//$NON-NLS-1$ } LatLon stStop = getStartStop(position + 1); if (stStop != null) { - String after = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(stStop, route.getStop().getLocation()), (ClientContext) getApplication()); + String after = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(stStop, route.getStop().getLocation()), getApplication()); text.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(after); //$NON-NLS-1$ //$NON-NLS-2$ } } @@ -306,9 +305,9 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA String name = st.getName(settings.usingEnglishNames()); if(locationToGo != null){ n.append(name).append(" - ["); //$NON-NLS-1$ - n.append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToGo, st.getLocation()), (ClientContext) getApplication())).append("]"); //$NON-NLS-1$ + n.append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToGo, st.getLocation()), getApplication())).append("]"); //$NON-NLS-1$ } else if(locationToStart != null){ - n.append("[").append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToStart, st.getLocation()), (ClientContext) getApplication())).append("] - "); //$NON-NLS-1$ //$NON-NLS-2$ + n.append("[").append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToStart, st.getLocation()), getApplication())).append("] - "); //$NON-NLS-1$ //$NON-NLS-2$ n.append(name); } else { n.append(name); @@ -494,7 +493,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA labelW.append(" - ["); //$NON-NLS-1$ if (locationToGo != null) { - labelW.append(OsmAndFormatter.getFormattedDistance(stop.getDistToLocation(), (ClientContext) getApplication())); + labelW.append(OsmAndFormatter.getFormattedDistance(stop.getDistToLocation(), getApplication())); } else { labelW.append(getString(R.string.transport_search_none)); } @@ -506,7 +505,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA } int dist = locationToStart == null ? 0 : (int) (MapUtils.getDistance(stop.getStart().getLocation(), locationToStart)); - String distance = OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getApplication()) + " "; //$NON-NLS-1$ + String distance = OsmAndFormatter.getFormattedDistance(dist, getApplication()) + " "; //$NON-NLS-1$ label.setText(distance + labelW, TextView.BufferType.SPANNABLE); ((Spannable) label.getText()).setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_distance)), 0, distance.length() - 1, 0); return (row); @@ -530,7 +529,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA if(st != null && end != null){ int dist = (int) MapUtils.getDistance(st, end); - text.setText(MessageFormat.format(getString(R.string.transport_searching_route), OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getApplication()))); + text.setText(MessageFormat.format(getString(R.string.transport_searching_route), OsmAndFormatter.getFormattedDistance(dist, getApplication()))); } else { text.setText(getString(R.string.transport_searching_transport)); } @@ -577,12 +576,12 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA labelW.append(" ("); //$NON-NLS-1$ labelW.append(info.getStopNumbers()).append(" ").append(getString(R.string.transport_stops)).append(", "); //$NON-NLS-1$ //$NON-NLS-2$ int startDist = (int) MapUtils.getDistance(getEndStop(position - 1), info.getStart().getLocation()); - labelW.append(getString(R.string.transport_to_go_before)).append(" ").append(OsmAndFormatter.getFormattedDistance(startDist, (ClientContext) getApplication())); //$NON-NLS-1$ + labelW.append(getString(R.string.transport_to_go_before)).append(" ").append(OsmAndFormatter.getFormattedDistance(startDist, getApplication())); //$NON-NLS-1$ if (position == getCount() - 1) { LatLon stop = getStartStop(position + 1); if(stop != null) { int endDist = (int) MapUtils.getDistance(stop, info.getStop().getLocation()); - labelW.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(OsmAndFormatter.getFormattedDistance(endDist, (ClientContext) getApplication())); //$NON-NLS-1$ //$NON-NLS-2$ + labelW.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(OsmAndFormatter.getFormattedDistance(endDist, getApplication())); //$NON-NLS-1$ //$NON-NLS-2$ } } diff --git a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java new file mode 100644 index 0000000000..4bfc940b4a --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java @@ -0,0 +1,13 @@ +package net.osmand.plus.api; + +import android.content.Context; + +public interface AudioFocusHelper { + + boolean requestFocus(Context context, int streamType); + + void onAudioFocusChange(int focusChange); + + boolean abandonFocus(Context context, int streamType); + +} diff --git a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java index e5df3cebc5..eacdaad660 100644 --- a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java @@ -1,7 +1,6 @@ package net.osmand.plus.api; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import org.apache.commons.logging.Log; @@ -14,20 +13,14 @@ import android.media.AudioManager; * * @author genly */ -public class AudioFocusHelperImpl implements AudioManager.OnAudioFocusChangeListener, net.osmand.plus.api.ExternalServiceAPI.AudioFocusHelper { +public class AudioFocusHelperImpl implements AudioManager.OnAudioFocusChangeListener, AudioFocusHelper { private static final Log log = PlatformUtil.getLog(AudioFocusHelperImpl.class); @Override public boolean requestFocus(ClientContext context, int streamType) { AudioManager mAudioManager = (AudioManager) ((Context) context).getSystemService(Context.AUDIO_SERVICE); - if (context.getSettings().INTERRUPT_MUSIC.get()) - { - return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus(this, streamType, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); - } - else - { - return true; - } + return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus(this, streamType, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); } @Override diff --git a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java b/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java deleted file mode 100644 index da7ac2b043..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.osmand.plus.api; - -import net.osmand.plus.ClientContext; - -public interface ExternalServiceAPI { - - public boolean isWifiConnected(); - - public boolean isInternetConnected(); - - - public boolean isLightSensorEnabled(); - - public String getExternalStorageDirectory(); - - public AudioFocusHelper getAudioFocuseHelper(); - - public interface AudioFocusHelper { - - public boolean requestFocus(ClientContext context, int streamType); - - public boolean abandonFocus(ClientContext context, int streamType); - } -} diff --git a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java deleted file mode 100644 index f119619bf1..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.osmand.plus.api; - -import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; - -import org.apache.commons.logging.Log; - -import android.content.Context; -import android.hardware.Sensor; -import android.hardware.SensorManager; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.Environment; - -public class ExternalServiceAPIImpl implements ExternalServiceAPI { - - private OsmandApplication app; - private static final Log log = PlatformUtil.getLog(ExternalServiceAPIImpl.class); - - public ExternalServiceAPIImpl(OsmandApplication app) { - this.app = app; - } - - @Override - public boolean isWifiConnected() { - ConnectivityManager mgr = (ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo ni = mgr.getActiveNetworkInfo(); - return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; - } - - @Override - public boolean isInternetConnected() { - ConnectivityManager mgr = (ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo active = mgr.getActiveNetworkInfo(); - if(active == null){ - return false; - } else { - NetworkInfo.State state = active.getState(); - return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING; - } - } - - @Override - public boolean isLightSensorEnabled() { - SensorManager mSensorManager = (SensorManager)app.getSystemService(Context.SENSOR_SERVICE); - Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); - return mLight != null; - } - - @Override - public String getExternalStorageDirectory() { - return Environment.getExternalStorageDirectory().getAbsolutePath(); - } - - @Override - public AudioFocusHelper getAudioFocuseHelper() { - if (android.os.Build.VERSION.SDK_INT >= 8) { - try { - return (AudioFocusHelper) Class.forName("net.osmand.plus.api.AudioFocusHelperImpl").newInstance(); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - return null; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java new file mode 100644 index 0000000000..199ca80285 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java @@ -0,0 +1,194 @@ +package net.osmand.plus.api; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +import net.osmand.plus.OsmandApplication; + +public class FileSettingsAPIImpl implements SettingsAPI { + + protected OsmandApplication app; + protected ConcurrentHashMap map = new ConcurrentHashMap(); + protected File file; + + public FileSettingsAPIImpl(OsmandApplication app, File file) throws IOException { + this.file = file; + if (file.exists()) { + Properties props = new Properties(); + FileInputStream fis = new FileInputStream(file); + props.load(fis); + for (Object key : props.keySet()) { + String k = key.toString(); + map.put(k, props.get(key)); + } + } + } + + @Override + public Object getPreferenceObject(String key) { + return key; + } + + private String wrap(Object pref, String key) { + return pref + "."+key; + } + @Override + public SettingsEditor edit(final Object pref) { + return new SettingsEditor() { + Map modified = new LinkedHashMap(); + + @Override + public SettingsEditor remove(String key) { + modified.put(wrap(pref,key), null); + return this; + } + + @Override + public SettingsEditor putString(String key, String value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putLong(String key, long value) { + modified.put(key, value+""); + return this; + } + + @Override + public SettingsEditor putInt(String key, int value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putFloat(String key, float value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putBoolean(String key, boolean value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public boolean commit() { + return commitToFile(modified); + } + + }; + } + + + private boolean commitToFile(Map modified) { + for(Entry e : modified.entrySet()) { + if (e.getValue() == null) { + map.remove(e.getKey()); + } else { + map.put(e.getKey(), e.getValue()); + } + } + return saveFile(); + } + + public boolean saveFile() { + try { + Properties ps = new Properties(); + ps.putAll(map); + final FileOutputStream fout = new FileOutputStream(file); + ps.store(fout, null); + fout.close(); + return true; + } catch (IOException e1) { + e1.printStackTrace(); + return false; + } + } + + @Override + public String getString(Object pref, String key, String defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + return obj.toString(); + } + @Override + public float getFloat(Object pref, String key, float defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).floatValue(); + } else { + try { + float flot = Float.parseFloat(obj.toString()); + map.put(wrap(pref, key), flot); + return flot; + } catch (NumberFormatException e) { + return defValue; + } + } + } + @Override + public boolean getBoolean(Object pref, String key, boolean defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + return Boolean.parseBoolean(obj.toString()); + } + + @Override + public int getInt(Object pref, String key, int defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).intValue(); + } else { + try { + int num = Integer.parseInt(obj.toString()); + map.put(wrap(pref, key), num); + return num; + } catch (NumberFormatException e) { + return defValue; + } + } + } + + @Override + public long getLong(Object pref, String key, long defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).longValue(); + } else { + try { + long num = Long.parseLong(obj.toString()); + map.put(wrap(pref, key), num); + return num; + } catch (NumberFormatException e) { + return defValue; + } + } + + } + @Override + public boolean contains(Object pref, String key) { + return map.containsKey(wrap(pref,key)); + } +} diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java deleted file mode 100644 index b20b94eaaf..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.osmand.plus.api; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import net.osmand.NativeLibrary; -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.plus.PoiFilter; -import net.osmand.plus.TargetPointsHelper; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; - -public interface InternalOsmAndAPI { - - public XmlSerializer newSerializer(); - - public XmlPullParser newPullParser(); - - public String getPackageName(); - - public String getVersionName(); - - public int getVersionCode(); - - public InputStream openAsset(String name) throws IOException; - - public NativeLibrary getNativeLibrary(); - - - public List searchAmenities(PoiFilter filter, - double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, - double lat, double lon, ResultMatcher matcher); - - public List searchAmenitiesByName(String searchQuery, - double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, - double lat, double lon, ResultMatcher matcher); - - public String getDeviceName(); - - public String getBrandName(); - - public String getModelName(); - - public TargetPointsHelper getTargetPointsHelper(); - - public boolean isNavigationServiceStarted(); - - public boolean isNavigationServiceStartedForNavigation(); - - public void startNavigationService(boolean forNavigation); - - public void stopNavigationService(); - - -} diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java deleted file mode 100644 index 778791f371..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java +++ /dev/null @@ -1,139 +0,0 @@ -package net.osmand.plus.api; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import net.osmand.NativeLibrary; -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.plus.NavigationService; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.PoiFilter; -import net.osmand.plus.TargetPointsHelper; -import net.osmand.plus.render.NativeOsmandLibrary; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; - -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Build; -import android.util.Xml; - -public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { - - private OsmandApplication app; - - public InternalOsmAndAPIImpl(OsmandApplication app) { - this.app = app; - } - - @Override - public XmlSerializer newSerializer() { - return Xml.newSerializer(); - } - - @Override - public XmlPullParser newPullParser() { - return Xml.newPullParser(); - } - - @Override - public String getPackageName() { - return app.getPackageName(); - } - - @Override - public InputStream openAsset(String name) throws IOException { - return app.getAssets().open(name); - } - - - @Override - public NativeLibrary getNativeLibrary() { - return NativeOsmandLibrary.getLoadedLibrary(); - } - - - @Override - public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, - double rightLongitude, double lat, double lon, ResultMatcher matcher) { - return app.getResourceManager().searchAmenities(filter, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); - } - - @Override - public List searchAmenitiesByName(String searchQuery, double topLatitude, double leftLongitude, double bottomLatitude, - double rightLongitude, double lat, double lon, ResultMatcher matcher) { - return app.getResourceManager().searchAmenitiesByName(searchQuery, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); - } - - @Override - public String getVersionName() { - try { - PackageInfo info = app.getPackageManager().getPackageInfo(app.getPackageName(), 0); - return info.versionName; - } catch (NameNotFoundException e) { - return ""; - } - } - - @Override - public int getVersionCode() { - try { - PackageInfo info = app.getPackageManager().getPackageInfo(app.getPackageName(), 0); - return info.versionCode; - } catch (NameNotFoundException e) { - return 0; - } - } - - @Override - public String getDeviceName() { - return Build.DEVICE; - } - - @Override - public String getBrandName() { - return Build.BRAND; - } - - @Override - public String getModelName() { - return Build.MODEL; - } - - @Override - public TargetPointsHelper getTargetPointsHelper() { - return app.getTargetPointsHelper(); - } - - @Override - public boolean isNavigationServiceStarted() { - return app.getNavigationService() != null; - } - - @Override - public boolean isNavigationServiceStartedForNavigation() { - return app.getNavigationService() != null && app.getNavigationService().startedForNavigation(); - } - - @Override - public void startNavigationService(boolean forNavigation) { - Intent serviceIntent = new Intent(app, NavigationService.class); - if(forNavigation) { - serviceIntent.putExtra(NavigationService.NAVIGATION_START_SERVICE_PARAM, true); - } - app.startService(serviceIntent); - } - - @Override - public void stopNavigationService() { - Intent serviceIntent = new Intent(app, NavigationService.class); - app.stopService(serviceIntent); - - } - - -} diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java index 862e47c97e..241ae42e11 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java @@ -14,7 +14,7 @@ import java.util.zip.ZipInputStream; import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.util.Algorithms; @@ -27,11 +27,11 @@ public class DownloadFileHelper { private static final int BUFFER_SIZE = 32256; protected static final int TRIES_TO_DOWNLOAD = 15; protected static final long TIMEOUT_BETWEEN_DOWNLOADS = 8000; - private final ClientContext ctx; + private final OsmandApplication ctx; private boolean interruptDownloading = false; - public DownloadFileHelper(ClientContext ctx){ + public DownloadFileHelper(OsmandApplication ctx){ this.ctx = ctx; } @@ -194,7 +194,7 @@ public class DownloadFileHelper { } public boolean isWifiConnected(){ - return ctx.getExternalServiceAPI().isWifiConnected(); + return ctx.getSettings().isWifiConnected(); } public boolean downloadFile(DownloadEntry de, IProgress progress, diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index 7855aaa51e..007f1423b6 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -5,10 +5,12 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import net.osmand.plus.ClientContext; +import net.osmand.map.OsmandRegions; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.DownloadIndexActivity; import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; +import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.Typeface; @@ -33,6 +35,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem private int okColor; private int defaultColor; private int updateColor; + private OsmandRegions osmandRegions; public DownloadIndexAdapter(DownloadIndexActivity downloadActivity, List indexFiles) { this.downloadActivity = downloadActivity; @@ -47,6 +50,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem defaultColor = ta.getColor(0, downloadActivity.getResources().getColor(R.color.color_unknown)); ta.recycle(); updateColor = downloadActivity.getResources().getColor(R.color.color_update); + osmandRegions = downloadActivity.getMyApplication().getResourceManager().getOsmandRegions(); } public void setLoadedFiles(Map indexActivatedFileNames, Map indexFileNames) { @@ -119,15 +123,17 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem } } List filter = new ArrayList(); - ClientContext c = downloadActivity.getMyApplication(); + Context c = downloadActivity; for (IndexItem item : indexFiles) { boolean add = true; - final String visibleName = item.getVisibleName(c).toLowerCase(); + String indexLC = osmandRegions.getDownloadNameIndexLowercase(item.getBasename()); + if(indexLC == null) { + indexLC = item.getVisibleName(c, osmandRegions).toLowerCase(); + } for(List or : conds) { boolean tadd = true; for (String var : or) { - if (!visibleName.contains(var) - /*&& !item.getDescription().toLowerCase().contains(var)*/) { + if (!indexLC.contains(var)) { tadd = false; break; } @@ -230,8 +236,8 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem TextView item = (TextView) row.findViewById(R.id.download_item); TextView description = (TextView) row.findViewById(R.id.download_descr); IndexItem e = (IndexItem) getChild(groupPosition, childPosition); - ClientContext clctx = downloadActivity.getMyApplication(); - String eName = e.getVisibleDescription(clctx) + "\n" + e.getVisibleName(clctx); + OsmandApplication clctx = downloadActivity.getMyApplication(); + String eName = e.getVisibleDescription(clctx) + "\n" + e.getVisibleName(clctx, osmandRegions); item.setText(eName.trim()); //$NON-NLS-1$ String d = e.getDate() + "\n" + e.getSizeDescription(clctx); description.setText(d.trim()); @@ -256,7 +262,15 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem if(e.getType() == DownloadActivityType.HILLSHADE_FILE || e.getType() == DownloadActivityType.SRTM_COUNTRY_FILE){ item.setTextColor(okColor); // GREEN - item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + String sfName = e.getTargetFileName(); + if (indexActivatedFileNames.containsKey(sfName)) { + item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + // next case since present hillshade files cannot be deactivated, but are not in indexActivatedFileNames + } else if (e.getType() == DownloadActivityType.HILLSHADE_FILE) { + item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + } else { + item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); + } } else if (e.getDate() != null) { String sfName = e.getTargetFileName(); if (e.getDate().equals(indexActivatedFileNames.get(sfName))) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 5540419c25..3f91307e06 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -371,7 +371,7 @@ public class DownloadIndexesThread { String dt = uiActivity.getMyApplication().getResourceManager().getIndexFileNames().get(basemap.getTargetFileName()); if (!basemapExists || !Algorithms.objectEquals(dt, basemap.getDate())) { List downloadEntry = basemap - .createDownloadEntry(uiActivity.getClientContext(), uiActivity.getType(), + .createDownloadEntry(uiActivity.getMyApplication(), uiActivity.getType(), new ArrayList()); uiActivity.getEntriesToDownload().put(basemap, downloadEntry); AccessibleToast.makeText(uiActivity, R.string.basemap_was_selected_to_download, diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index e09194e415..df0dc3046f 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -10,13 +10,11 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import java.util.zip.GZIPInputStream; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.Version; @@ -216,7 +214,7 @@ public class DownloadOsmandIndexesHelper { } @Override - public List createDownloadEntry(ClientContext ctx, DownloadActivityType type, List res) { + public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List res) { res.add(new DownloadEntry(this, assetName, destFile, dateModified)); return res; } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java index 843f865791..e20925fae4 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java @@ -13,24 +13,26 @@ import java.util.Map.Entry; import java.util.Random; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.Version; import org.apache.commons.logging.Log; +import android.os.Build; + public class DownloadTracker { private static final Log log = PlatformUtil.getLog(DownloadTracker.class); - private Map getCustomVars(ClientContext ctx) { + private Map getCustomVars(OsmandApplication ctx) { Map map = new LinkedHashMap(); map.put("App", Version.getFullVersion(ctx)); - map.put("Device", ctx.getInternalAPI().getDeviceName()); - map.put("Brand", ctx.getInternalAPI().getBrandName()); - map.put("Model", ctx.getInternalAPI().getModelName()); - map.put("Package", ctx.getInternalAPI().getPackageName()); + map.put("Device", Build.DEVICE); + map.put("Brand", Build.BRAND); + map.put("Model", Build.MODEL); + map.put("Package", ctx.getPackageName()); - map.put("Version name", ctx.getInternalAPI().getVersionName()); - map.put("Version code", ctx.getInternalAPI().getVersionCode()+""); + map.put("Version name", ctx.getVersionName()); + map.put("Version code", ctx.getVersionCode()+""); return map; } @@ -41,7 +43,7 @@ public class DownloadTracker { static final String beaconUrl = "http://www.google-analytics.com/__utm.gif"; static final String analyticsVersion = "4.3"; // Analytics version - AnalyticsVersion - public void trackEvent(ClientContext a, + public void trackEvent(OsmandApplication a, String category, String action, String label, int value, String trackingAcount) { Map parameters = new LinkedHashMap(); try { diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 94d951cc2a..4f195905d7 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -5,6 +5,7 @@ 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; @@ -14,7 +15,8 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.map.OsmandRegions; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -51,28 +53,68 @@ public class IndexItem implements Comparable { this.type = type; } - public String getVisibleDescription(ClientContext ctx) { + 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); } -// fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) -// fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP) -// fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP) -// fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP) return s; } - - public String getVisibleName(ClientContext ctx) { - String s = ""; - if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { - s = ctx.getString(R.string.voice) + "\n"; - } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { - s = ctx.getString(R.string.ttsvoice) + "\n"; + + 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 s + getBasename().replace('_', ' '); + 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() { @@ -133,7 +175,7 @@ public class IndexItem implements Comparable { return date; } - public String getSizeDescription(ClientContext ctx) { + public String getSizeDescription(Context ctx) { return size + " MB"; } @@ -141,7 +183,7 @@ public class IndexItem implements Comparable { return size; } - public List createDownloadEntry(ClientContext ctx, DownloadActivityType type, + public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List downloadEntries) { String fileName = this.fileName; File parent = null; diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java index d78392f494..e7b7f5f165 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java @@ -3,11 +3,15 @@ package net.osmand.plus.download; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; -import net.osmand.plus.ClientContext; +import net.osmand.Collator; +import net.osmand.OsmAndCollator; +import net.osmand.map.OsmandRegions; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -26,7 +30,8 @@ public class IndexItemCategory implements Comparable { return order < another.order ? -1 : 1; } - public static List categorizeIndexItems(ClientContext ctx, Collection indexItems) { + public static List categorizeIndexItems(final OsmandApplication ctx, + Collection indexItems) { boolean skipWiki = Version.isFreeVersion(ctx); final Map cats = new TreeMap(); for (IndexItem i : indexItems) { @@ -49,6 +54,9 @@ public class IndexItemCategory implements Comparable { (lc.contains("united states") && lc.startsWith("north-america")) ) { nameId = R.string.index_name_us; order = 31; + } else if (lc.startsWith("canada")) { + nameId = R.string.index_name_canada; + order = 32; } else if (lc.contains("openmaps")) { nameId = R.string.index_name_openmaps; order = 90; @@ -62,18 +70,24 @@ public class IndexItemCategory implements Comparable { } else if (lc.contains("southamerica") || lc.contains("south-america")) { nameId = R.string.index_name_south_america; order = 45; - } else if (lc.startsWith("france_")) { - nameId = R.string.index_name_france; - order = 17; } else if ( lc.contains("germany")) { nameId = R.string.index_name_germany; order = 16; + } else if (lc.startsWith("france_")) { + nameId = R.string.index_name_france; + order = 17; + } else if (lc.startsWith("italy_")) { + nameId = R.string.index_name_italy; + order = 18; + } else if (lc.startsWith("gb_") || lc.startsWith("british")) { + nameId = R.string.index_name_gb; + order = 19; + } else if (lc.contains("russia")) { + nameId = R.string.index_name_russia; + order = 25; } else if (lc.contains("europe")) { nameId = R.string.index_name_europe; order = 15; - } else if (lc.contains("russia")) { - nameId = R.string.index_name_russia; - order = 18; } else if (lc.contains("africa") && !lc.contains("_wiki_")) { nameId = R.string.index_name_africa; order = 80; @@ -92,6 +106,17 @@ public class IndexItemCategory implements Comparable { cats.get(name).items.add(i); } ArrayList r = new ArrayList(cats.values()); + final Collator collator = OsmAndCollator.primaryCollator(); + for(IndexItemCategory ct : r) { + final OsmandRegions osmandRegions = ctx.getResourceManager().getOsmandRegions(); + Collections.sort(ct.items, new Comparator() { + @Override + public int compare(IndexItem lhs, IndexItem rhs) { + return collator.compare(lhs.getVisibleName(ctx, osmandRegions), + rhs.getVisibleName(ctx, osmandRegions)); + } + }); + } Collections.sort(r); return r; } diff --git a/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java b/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java deleted file mode 100644 index 23981701ae..0000000000 --- a/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.osmand.plus.dropbox; - -import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.OsmandSettings; -import net.osmand.plus.R; -import net.osmand.plus.activities.MapActivity; - -import org.apache.commons.logging.Log; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.net.Uri; - -import com.dropbox.client2.DropboxAPI; -import com.dropbox.client2.DropboxAPI.Entry; -import com.dropbox.client2.android.AndroidAuthSession; -import com.dropbox.client2.android.AuthActivity; -import com.dropbox.client2.exception.DropboxException; -import com.dropbox.client2.session.AccessTokenPair; -import com.dropbox.client2.session.AppKeyPair; -import com.dropbox.client2.session.Session.AccessType; - -public class DropboxPlugin extends OsmandPlugin { - - public static final String ID = "osmand.dropbox"; - private static final Log log = PlatformUtil.getLog(DropboxPlugin.class); - private OsmandApplication app; - private DropboxAPI mApi; - - final static private String APP_KEY = "CHANGE_ME"; - final static private String APP_SECRET = "CHANGE_ME_SECRET"; - final static private AccessType ACCESS_TYPE = AccessType.APP_FOLDER; - - final static private String ACCESS_KEY_NAME = "DROPBOX_ACCESS_KEY"; - final static private String ACCESS_SECRET_NAME = "DROPBOX_ACCESS_SECRET"; - - - @Override - public String getId() { - return ID; - } - - public DropboxPlugin(OsmandApplication app) { - this.app = app; - - } - - @Override - public String getDescription() { - // TODO - return app.getString(R.string.osmodroid_plugin_description); - } - - @Override - public String getName() { - // TODO - return app.getString(R.string.osmodroid_plugin_name); - } - - @Override - public boolean init(final OsmandApplication app) { - this.app = app; - AndroidAuthSession session = buildSession(); - mApi = new DropboxAPI(session); - return true; - } - - public void syncFolders(){ - try { - Entry f = mApi.createFolder("osmand"); - } catch (DropboxException e) { - } - } - - private String[] getKeys() { - OsmandSettings set = app.getSettings(); - SharedPreferences prefs = (SharedPreferences) set.getGlobalPreferences(); - String key = prefs.getString(ACCESS_KEY_NAME, null); - String secret = prefs.getString(ACCESS_SECRET_NAME, null); - if (key != null && secret != null) { - String[] ret = new String[2]; - ret[0] = key; - ret[1] = secret; - return ret; - } else { - return null; - } - } - - public void storeKeys(String key, String secret) { - // Save the access key for later - OsmandSettings set = app.getSettings(); - SharedPreferences prefs = (SharedPreferences) set.getGlobalPreferences(); - prefs.edit().putString(ACCESS_KEY_NAME, key) - .putString(ACCESS_SECRET_NAME, secret).commit(); - } - - public void clearKeys() { - SharedPreferences prefs = (SharedPreferences) app.getSettings().getGlobalPreferences(); - prefs.edit().remove(ACCESS_KEY_NAME).remove(ACCESS_SECRET_NAME).commit(); - } - - private AndroidAuthSession buildSession() { - AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_SECRET); - AndroidAuthSession session; - - String[] stored = getKeys(); - if (stored != null) { - AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]); - session = new AndroidAuthSession(appKeyPair, ACCESS_TYPE, accessToken); - } else { - session = new AndroidAuthSession(appKeyPair, ACCESS_TYPE); - } - - return session; - } - - private void checkAppKeySetup() { - // Check if the app has set up its manifest properly. - Intent testIntent = new Intent(Intent.ACTION_VIEW); - String scheme = "db-" + APP_KEY; - String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test"; - testIntent.setData(Uri.parse(uri)); - PackageManager pm = app.getPackageManager(); - if (0 == pm.queryIntentActivities(testIntent, 0).size()) { - log.warn("URL scheme in your app's " + - "manifest is not set up correctly. You should have a " + - "com.dropbox.client2.android.AuthActivity with the " + - "scheme: " + scheme); - } - } - - @Override - public void registerLayers(MapActivity activity) { - - } - - @Override - public void disable(OsmandApplication app) { - } - - -} diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index feb30e8383..07fbf870c4 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -9,7 +9,6 @@ import java.util.List; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; -import net.osmand.plus.ClientContext; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; @@ -385,7 +384,7 @@ public class GpxUiHelper { GPXFile r = currentFile; for(String fname : filename) { final File f = new File(dir, fname); - GPXFile res = GPXUtilities.loadGPXFile((ClientContext) activity.getApplication(), f); + GPXFile res = GPXUtilities.loadGPXFile(activity.getApplication(), f); GPXUtilities.mergeGPXFileInto(res, r); r = res; } diff --git a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java index 1a594b5383..f1a48fa986 100644 --- a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java +++ b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java @@ -3,7 +3,7 @@ package net.osmand.plus.render; import net.osmand.NativeLibrary; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.render.OsmandRenderer.RenderingContext; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; @@ -29,7 +29,7 @@ public class NativeOsmandLibrary extends NativeLibrary { } - public static NativeOsmandLibrary getLibrary(RenderingRulesStorage storage, ClientContext ctx) { + public static NativeOsmandLibrary getLibrary(RenderingRulesStorage storage, OsmandApplication ctx) { if (!isLoaded()) { synchronized (NativeOsmandLibrary.class) { if (!isLoaded()) { @@ -73,7 +73,7 @@ public class NativeOsmandLibrary extends NativeLibrary { return isNativeSupported != null; } - public static boolean isNativeSupported(RenderingRulesStorage storage, ClientContext ctx) { + public static boolean isNativeSupported(RenderingRulesStorage storage, OsmandApplication ctx) { if(storage != null) { getLibrary(storage, ctx); } diff --git a/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java b/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java index 021af0c502..23d75f0077 100644 --- a/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java +++ b/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java @@ -12,6 +12,7 @@ import java.util.TreeMap; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapAddressReaderAdapter; @@ -40,8 +41,8 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository { public RegionAddressRepositoryBinary(BinaryMapIndexReader file, String name) { this.file = file; this.region = name; - this.collator = PlatformUtil.primaryCollator(); - this.postCodes = new TreeMap(PlatformUtil.primaryCollator()); + this.collator = OsmAndCollator.primaryCollator(); + this.postCodes = new TreeMap(OsmAndCollator.primaryCollator()); } @Override diff --git a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java index 0d740adaee..3732fcba2c 100644 --- a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java @@ -176,6 +176,7 @@ public class ResourceManager { } } + public OsmandApplication getContext() { return context; } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 23b745482d..7893f08b48 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -14,7 +14,6 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.data.DataTileManager; import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.R; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; @@ -22,6 +21,7 @@ import net.osmand.router.RouteSegmentResult; import net.osmand.router.TurnType; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; +import android.content.Context; public class RouteCalculationResult { // could not be null and immodifiable! @@ -93,7 +93,7 @@ public class RouteCalculationResult { } public RouteCalculationResult(List list, Location start, LatLon end, List intermediates, - ClientContext ctx, boolean leftSide, float routingTime) { + Context ctx, boolean leftSide, float routingTime) { this.routingTime = routingTime; List computeDirections = new ArrayList(); this.errorMessage = null; @@ -141,7 +141,7 @@ public class RouteCalculationResult { return Collections.emptyList(); } - private static void calculateIntermediateIndexes(ClientContext ctx, List locations, + private static void calculateIntermediateIndexes(Context ctx, List locations, List intermediates, List localDirections, int[] intermediatePoints) { if(intermediates != null && localDirections != null) { int[] interLocations = new int[intermediates.size()]; @@ -226,7 +226,7 @@ public class RouteCalculationResult { * PREPARATION */ private static List convertVectorResult(List directions, List locations, List list, - List alarms, ClientContext ctx) { + List alarms, Context ctx) { float prevDirectionTime = 0; float prevDirectionDistance = 0; List segmentsToPopulate = new ArrayList(); @@ -296,7 +296,7 @@ public class RouteCalculationResult { } protected static void addMissingTurnsToRoute(List locations, - List originalDirections, Location start, LatLon end, ApplicationMode mode, ClientContext ctx, + List originalDirections, Location start, LatLon end, ApplicationMode mode, Context ctx, boolean leftSide){ if(locations.isEmpty()){ return; @@ -459,7 +459,7 @@ public class RouteCalculationResult { } - public static String toString(TurnType type, ClientContext ctx) { + public static String toString(TurnType type, Context ctx) { if(type.isRoundAbout()){ return ctx.getString(R.string.route_roundabout, type.getExitOut()); } else if(type.getValue().equals(TurnType.C)) { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java b/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java index 03198c689b..906b36f782 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java @@ -1,7 +1,7 @@ package net.osmand.plus.routing; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; +import net.osmand.plus.OsmandApplication; import net.osmand.router.TurnType; public class RouteDirectionInfo { @@ -34,7 +34,7 @@ public class RouteDirectionInfo { this.turnType = turnType; } - public String getDescriptionRoute(ClientContext ctx) { + public String getDescriptionRoute(OsmandApplication ctx) { return descriptionRoute + " " + OsmAndFormatter.getFormattedDistance(distance, ctx); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 88027fbe4c..d9d7b92828 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -28,7 +28,6 @@ import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.DataTileManager; import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.Route; @@ -42,6 +41,7 @@ import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.Version; import net.osmand.plus.activities.SettingsNavigationActivity; +import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.router.GeneralRouter; import net.osmand.router.GeneralRouter.GeneralRouterProfile; import net.osmand.router.GeneralRouter.RoutingParameter; @@ -65,6 +65,7 @@ import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import android.content.Context; import android.os.Bundle; import btools.routingapp.IBRouterService; @@ -513,7 +514,7 @@ public class RouteProvider { return sublist; } - protected String getString(ClientContext ctx, int resId){ + protected String getString(Context ctx, int resId){ if(ctx == null){ return ""; //$NON-NLS-1$ } @@ -612,14 +613,16 @@ public class RouteProvider { //cf.planRoadDirection = 1; } // BUILD context - RoutingContext ctx = router.buildRoutingContext(cf, params.ctx.getInternalAPI().getNativeLibrary(), files, + NativeOsmandLibrary lib = settings.SAFE_MODE.get() ? null : NativeOsmandLibrary.getLoadedLibrary(); + RoutingContext ctx = router.buildRoutingContext(cf, + lib, files, RouteCalculationMode.NORMAL); RoutingContext complexCtx = null; boolean complex = params.mode.isDerivedRoutingFrom(ApplicationMode.CAR) && !settings.DISABLE_COMPLEX_ROUTING.get() && precalculated == null; if(complex) { - complexCtx = router.buildRoutingContext(cf, params.ctx.getInternalAPI().getNativeLibrary(), files, + complexCtx = router.buildRoutingContext(cf, lib,files, RouteCalculationMode.COMPLEX); complexCtx.calculationProgress = params.calculationProgress; complexCtx.leftSideNavigation = params.leftSide; diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 4d8148b634..7d579785c4 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -4,6 +4,8 @@ package net.osmand.plus.routing; import java.util.ArrayList; import java.util.List; +import android.content.Intent; + import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; @@ -13,6 +15,7 @@ import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.WptPt; +import net.osmand.plus.NavigationService; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -96,12 +99,15 @@ public class RoutingHelper { public void setFollowingMode(boolean follow) { isFollowingMode = follow; if(follow) { - if(!app.getInternalAPI().isNavigationServiceStarted()) { - app.getInternalAPI().startNavigationService(true); + if(app.getNavigationService() != null) { + Intent serviceIntent = new Intent(app, NavigationService.class); + serviceIntent.putExtra(NavigationService.NAVIGATION_START_SERVICE_PARAM, true); + app.startService(serviceIntent); } } else { - if(app.getInternalAPI().isNavigationServiceStartedForNavigation()) { - app.getInternalAPI().stopNavigationService(); + if(app.getNavigationService() != null && app.getNavigationService().startedForNavigation()) { + Intent serviceIntent = new Intent(app, NavigationService.class); + app.stopService(serviceIntent); } } } @@ -407,7 +413,7 @@ public class RoutingHelper { showMessage(app.getString(R.string.arrived_at_intermediate_point)); route.passIntermediatePoint(); - TargetPointsHelper targets = app.getInternalAPI().getTargetPointsHelper(); + TargetPointsHelper targets = app.getTargetPointsHelper(); List ns = targets.getIntermediatePointNames(); int toDel = targets.getIntermediatePoints().size() - route.getIntermediatePointsToPass(); int currentIndex = toDel - 1; @@ -429,7 +435,7 @@ public class RoutingHelper { Location lastPoint = routeNodes.get(routeNodes.size() - 1); if (currentRoute > routeNodes.size() - 3 && currentLocation.distanceTo(lastPoint) < POSITION_TOLERANCE * 1.5) { showMessage(app.getString(R.string.arrived_at_destination)); - TargetPointsHelper targets = app.getInternalAPI().getTargetPointsHelper(); + TargetPointsHelper targets = app.getTargetPointsHelper(); String description = targets.getPointNavigateDescription(); if(isFollowingMode) { voiceRouter.arrivedDestinationPoint(description); diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index d94ebb2f46..7c39e70bc8 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -4,7 +4,6 @@ package net.osmand.plus.routing; import net.osmand.Location; import net.osmand.binary.RouteDataObject; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.voice.AbstractPrologCommandPlayer; @@ -15,6 +14,7 @@ import net.osmand.router.TurnType; import net.osmand.util.Algorithms; import alice.tuprolog.Struct; import alice.tuprolog.Term; +import android.content.Context; public class VoiceRouter { @@ -653,7 +653,7 @@ public class VoiceRouter { } } - public void onApplicationTerminate(ClientContext ctx) { + public void onApplicationTerminate(Context ctx) { if (player != null) { player.clear(); } diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java new file mode 100644 index 0000000000..d0aa08a08c --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -0,0 +1,88 @@ +package net.osmand.plus.sherpafy; + +import java.io.File; +import java.io.IOException; + +import net.osmand.plus.OsmAndAppCustomization; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.OsmandSettings.CommonPreference; +import net.osmand.plus.R; +import net.osmand.plus.activities.MainMenuActivity; +import net.osmand.plus.api.FileSettingsAPIImpl; +import android.app.Activity; +import android.content.Intent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.Window; +import android.widget.TextView; + +public class SherpafyCustomization extends OsmAndAppCustomization { + + private static final String SELECTED_TOUR = "sherpafy_tour"; + private OsmandSettings originalSettings; + private CommonPreference selectedTourPref; + private File selectedTourFolder = null; + + @Override + public void setup(OsmandApplication app) { + super.setup(app); + originalSettings = createSettings(app.getSettings().getSettingsAPI()); + selectedTourPref = originalSettings.registerBooleanPreference(SELECTED_TOUR, null).makeGlobal(); + File toursFolder = new File(originalSettings.getExternalStorageDirectory(), "tours"); + if(selectedTourPref.get() != null) { + selectedTourFolder = new File(toursFolder, selectedTourPref.get()); + selectedTourFolder.mkdirs(); + } + + if(selectedTourFolder != null) { + File settingsFile = new File(selectedTourFolder, "settings.props"); + FileSettingsAPIImpl fapi; + try { + fapi = new FileSettingsAPIImpl(app, settingsFile); + if (!settingsFile.exists()) { + fapi.saveFile(); + } + app.getSettings().setSettingsAPI(fapi); + } catch (IOException e) { + app.showToastMessage(R.string.settings_file_create_error); + } + } + } + + public boolean checkExceptionsOnStart() { + return false; + } + + public boolean showFirstTimeRunAndTips(boolean firstTime, boolean appVersionChanged) { + return false; + } + + public boolean checkBasemapDownloadedOnStart() { + return false; + } + + @Override + public void customizeMainMenu(Window window, final Activity activity) { + // Update app name + TextView v = (TextView) window.findViewById(R.id.AppName); + v.setText("Sherpafy"); + + TextView toursButtonText = (TextView) window.findViewById(R.id.SettingsButtonText); + toursButtonText.setText(R.string.tour); + View toursButton = window.findViewById(R.id.SearchButton); + toursButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + final Intent search = new Intent(activity, getTourSelectionActivity()); + search.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + activity.startActivity(search); + } + }); + // the image could be also updated + } + + private Class getTourSelectionActivity() { + return MainMenuActivity.class; + } +} diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index 99bc961d9a..6f471e2a7d 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -13,7 +13,6 @@ import net.osmand.data.RotatedTileBox; import net.osmand.map.OsmandRegions; import net.osmand.plus.R; import net.osmand.plus.activities.DownloadIndexActivity; -import net.osmand.plus.activities.OsmandIntents; import net.osmand.plus.resources.ResourceManager; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; @@ -87,7 +86,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final Intent intent = new Intent(view.getContext(), OsmandIntents.getDownloadIndexActivity()); + final Intent intent = new Intent(view.getContext(), view.getApplication().getAppCustomization().getDownloadIndexActivity()); intent.putExtra(DownloadIndexActivity.FILTER_KEY, filter.toString()); view.getContext().startActivity(intent); } @@ -119,7 +118,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { private static int ZOOM_TO_SHOW_BORDERS_ST = 5; private static int ZOOM_TO_SHOW_BORDERS = 7; - private static int ZOOM_TO_SHOW_MAP_NAMES = 12; + private static int ZOOM_TO_SHOW_MAP_NAMES = 8; @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { @@ -217,7 +216,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { if ((currentObjects != null && currentObjects.size() > 0)) { for (int i = 0; i < currentObjects.size(); i++) { final BinaryMapDataObject o = currentObjects.get(i); - String name = Algorithms.capitalizeFirstLetterAndLowercase(o.getName()); + String name = osmandRegions.getLocaleName(o); //Algorithms.capitalizeFirstLetterAndLowercase(o.getName()); if (!set.add(name)) { continue; } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java index 40a4f8b79f..6461bb36fe 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java @@ -1,8 +1,10 @@ package net.osmand.plus.views.mapwidgets; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.widget.Toast; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + import net.osmand.access.AccessibleToast; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -13,11 +15,9 @@ import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.render.RenderingRuleProperty; import net.osmand.render.RenderingRulesStorage; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.widget.Toast; public class AppearanceWidgetsFactory { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java index 2a33a395e2..af9c535029 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java @@ -1,6 +1,6 @@ package net.osmand.plus.views.mapwidgets; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.ShadowText; import android.content.Context; @@ -99,8 +99,8 @@ public abstract class BaseMapWidget extends View implements UpdateableWidget { return false; } - public ClientContext getClientContext(){ - return (ClientContext) getContext().getApplicationContext(); + public OsmandApplication getClientContext(){ + return (OsmandApplication) getContext().getApplicationContext(); } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 21922571b8..bee72d72ea 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -46,7 +46,7 @@ public class MapInfoWidgetsFactory { @Override public boolean updateInfo(DrawSettings d) { // draw speed - Location loc = map.getMyApplication().getLastKnownLocation(); + Location loc = map.getMyApplication().getLocationProvider().getLastKnownLocation(); if (loc != null && loc.hasAltitude()) { double compAlt = loc.getAltitude(); if (cachedAlt != (int) compAlt) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java index 5462731cb0..b9547eadb5 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java @@ -340,7 +340,7 @@ public class RouteInfoWidgetsFactory { @Override public boolean updateInfo(DrawSettings drawSettings) { - Location loc = app.getLastKnownLocation(); + Location loc = app.getLocationProvider().getLastKnownLocation(); // draw speed if (loc != null && loc.hasSpeed()) { // .1 mps == 0.36 kph diff --git a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java index 18159429e9..56119afd23 100644 --- a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java +++ b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java @@ -12,11 +12,11 @@ import java.util.List; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.R; -import net.osmand.plus.api.ExternalServiceAPI.AudioFocusHelper; +import net.osmand.plus.api.AudioFocusHelper; import org.apache.commons.logging.Log; @@ -35,7 +35,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { private static final Log log = PlatformUtil.getLog(AbstractPrologCommandPlayer.class); - protected ClientContext ctx; + protected OsmandApplication ctx; protected File voiceDir; protected Prolog prologSystem; protected static final String P_VERSION = "version"; @@ -56,7 +56,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { protected int streamType; private int currentVersion; - protected AbstractPrologCommandPlayer(ClientContext ctx, String voiceProvider, String configFile, int[] sortedVoiceVersions) + protected AbstractPrologCommandPlayer(OsmandApplication ctx, String voiceProvider, String configFile, int[] sortedVoiceVersions) throws CommandPlayerException { this.ctx = ctx; @@ -229,11 +229,22 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { protected void requestAudioFocus() { log.debug("requestAudioFocus"); - mAudioFocusHelper = ctx.getExternalServiceAPI().getAudioFocuseHelper(); + if (android.os.Build.VERSION.SDK_INT >= 8) { + mAudioFocusHelper = getAudioFocus(); + } if (mAudioFocusHelper != null) { mAudioFocusHelper.requestFocus(ctx, streamType); } } + + private AudioFocusHelper getAudioFocus() { + try { + return new net.osmand.plus.api.AudioFocusHelperImpl(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } protected void abandonAudioFocus() { log.debug("abandonAudioFocus"); diff --git a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java index 0623ae37b8..089457c0c5 100644 --- a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java +++ b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import org.apache.commons.logging.Log; @@ -32,7 +32,7 @@ public class MediaCommandPlayerImpl extends AbstractPrologCommandPlayer implemen private List filesToPlay = Collections.synchronizedList(new ArrayList()); - public MediaCommandPlayerImpl(ClientContext ctx, String voiceProvider) + public MediaCommandPlayerImpl(OsmandApplication ctx, String voiceProvider) throws CommandPlayerException { super(ctx, voiceProvider, CONFIG_FILE, MEDIA_VOICE_VERSION); diff --git a/plugins/Osmand-Sherpafy/.classpath b/plugins/Osmand-Sherpafy/.classpath new file mode 100644 index 0000000000..7bc01d9a9c --- /dev/null +++ b/plugins/Osmand-Sherpafy/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/Osmand-Sherpafy/.gitignore b/plugins/Osmand-Sherpafy/.gitignore new file mode 100644 index 0000000000..36986d81cf --- /dev/null +++ b/plugins/Osmand-Sherpafy/.gitignore @@ -0,0 +1,4 @@ +bin +gen +raw +obj diff --git a/plugins/Osmand-Sherpafy/.project b/plugins/Osmand-Sherpafy/.project new file mode 100644 index 0000000000..728045eb8b --- /dev/null +++ b/plugins/Osmand-Sherpafy/.project @@ -0,0 +1,33 @@ + + + Osmand-Sherpafy + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/Osmand-Sherpafy/AndroidManifest.xml b/plugins/Osmand-Sherpafy/AndroidManifest.xml new file mode 100644 index 0000000000..eeeea53793 --- /dev/null +++ b/plugins/Osmand-Sherpafy/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml b/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml new file mode 100644 index 0000000000..fcb91eb6fe --- /dev/null +++ b/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/Osmand-Sherpafy/proguard-project.txt b/plugins/Osmand-Sherpafy/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/plugins/Osmand-Sherpafy/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/plugins/Osmand-Sherpafy/project.properties b/plugins/Osmand-Sherpafy/project.properties new file mode 100644 index 0000000000..4ab125693c --- /dev/null +++ b/plugins/Osmand-Sherpafy/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 diff --git a/plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000..96a442e5b8 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-hdpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000..1426adff51 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-hdpi/icon.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 0000000000..99238729d8 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000..c99e8a25f7 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-mdpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000..359047dfa4 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-mdpi/ic_launcher.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000..15eeaf60c2 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..71c6d760f0 Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png differ diff --git a/plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000..8c9caab40c Binary files /dev/null and b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png differ diff --git a/plugins/Osmand-Sherpafy/res/layout/main.xml b/plugins/Osmand-Sherpafy/res/layout/main.xml new file mode 100644 index 0000000000..35e8b132cc --- /dev/null +++ b/plugins/Osmand-Sherpafy/res/layout/main.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/res/values/strings.xml b/plugins/Osmand-Sherpafy/res/values/strings.xml new file mode 100644 index 0000000000..5e29d65327 --- /dev/null +++ b/plugins/Osmand-Sherpafy/res/values/strings.xml @@ -0,0 +1,8 @@ + + + No + Yes + OsmAnd is not installed + Sherpafy + OsmAnd Sherpafy is installed and enabled in OsmAnd settings. + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java new file mode 100644 index 0000000000..a35c267b2f --- /dev/null +++ b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java @@ -0,0 +1,64 @@ +package net.osmand.sherpafy; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; + +public class SherpafyPluginActivity extends Activity { + private static final String OSMAND_COMPONENT = "net.osmand"; //$NON-NLS-1$ + private static final String OSMAND_COMPONENT_PLUS = "net.osmand.plus"; //$NON-NLS-1$ + private static final String OSMAND_ACTIVITY = "net.osmand.plus.activities.MainMenuActivity"; //$NON-NLS-1$ + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + Intent intentPlus = new Intent(); + intentPlus.setComponent(new ComponentName(OSMAND_COMPONENT_PLUS, OSMAND_ACTIVITY)); + intentPlus.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + ResolveInfo resolved = getPackageManager().resolveActivity(intentPlus, PackageManager.MATCH_DEFAULT_ONLY); + if(resolved != null) { + stopService(intentPlus); + intentPlus.putExtra("SHERPAFY", true); + startActivity(intentPlus); + finish(); + } else { + Intent intentNormal = new Intent(); + intentNormal.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + intentNormal.setComponent(new ComponentName(OSMAND_COMPONENT, OSMAND_ACTIVITY)); + resolved = getPackageManager().resolveActivity(intentNormal, PackageManager.MATCH_DEFAULT_ONLY); + if (resolved != null) { + stopService(intentNormal); + intentNormal.putExtra("SHERPAFY", true); + startActivity(intentNormal); + finish(); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(getString(R.string.osmand_app_not_found)); + builder.setPositiveButton(getString(R.string.default_buttons_yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:" + OSMAND_COMPONENT_PLUS)); + try { + stopService(intent); + startActivity(intent); + } catch (ActivityNotFoundException e) { + } + } + }); + builder.setNegativeButton(getString(R.string.default_buttons_no), null); + builder.show(); + } + } + } + +} \ No newline at end of file