Merge branch 'master' into feature-audiofocus

Conflicts:
	OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java
This commit is contained in:
Koen Rabaey 2014-04-22 22:30:29 +02:00
commit 5d0a776952
105 changed files with 1609 additions and 1148 deletions

View file

@ -3,7 +3,7 @@ package net.osmand;
/**
* Wrapper of java.text. Collator
*/
public interface Collator extends java.util.Comparator<Object>, Cloneable{
public interface Collator extends java.util.Comparator<Object>, Cloneable {
public boolean equals(String source, String target);

View file

@ -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;
}

View file

@ -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";

View file

@ -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);
}
};
}
}

View file

@ -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);
}
};
}
}

View file

@ -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 ){

View file

@ -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++) {

View file

@ -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<String, Street> streets = new TreeMap<String, Street>(PlatformUtil.primaryCollator());
private Map<String, Street> streets = new TreeMap<String, Street>(OsmAndCollator.primaryCollator());
private String isin = null;
private String postcode = null;

View file

@ -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<MapObject>, Serializable {
@ -66,7 +66,7 @@ public abstract class MapObject implements Comparable<MapObject>, 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<MapObject>, Serializable {
public static class MapObjectComparator implements Comparator<MapObject>{
private final boolean en;
Collator collator = PlatformUtil.primaryCollator();
Collator collator = OsmAndCollator.primaryCollator();
public MapObjectComparator(boolean en){
this.en = en;
}

View file

@ -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<String, LinkedList<BinaryMapDataObject>> countries = new HashMap<String, LinkedList<BinaryMapDataObject>>();
Map<String, LinkedList<BinaryMapDataObject>> countriesByDownloadName = new HashMap<String, LinkedList<BinaryMapDataObject>>();
Map<String, String> downloadNamesToLocaleNames = new HashMap<String, String>();
Map<String, String> downloadNamesToLowercaseIndex = new HashMap<String, String>();
QuadTree<String> 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) {
@ -40,6 +61,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) {
return 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;
@ -174,73 +231,124 @@ 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<BinaryMapDataObject> resultMatcher = new ResultMatcher<BinaryMapDataObject>() {
@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<String> 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<String>(new QuadRect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE),
8, 0.55f);
final ResultMatcher<BinaryMapDataObject> resultMatcher = new ResultMatcher<BinaryMapDataObject>() {
@Override
public boolean publish(BinaryMapDataObject object) {
if (object.getPointsLength() < 1) {
return false;
}
initTypes(object);
String nm = object.getNameByType(downloadNameType);
if (!countriesByDownloadName.containsKey(nm)) {
LinkedList<BinaryMapDataObject> ls = new LinkedList<BinaryMapDataObject>();
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<BinaryMapDataObject> resultMatcher) throws IOException {
BinaryMapIndexReader.SearchRequest<BinaryMapDataObject> 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<BinaryMapDataObject>() {
@Override
public boolean publish(BinaryMapDataObject object) {
if (object.getPointsLength() < 1) {
return false;
}
initTypes(object);
String nm = object.getNameByType(downloadNameType);
if (!countries.containsKey(nm)) {
LinkedList<BinaryMapDataObject> ls = new LinkedList<BinaryMapDataObject>();
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");

View file

@ -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<RouteSegmentResult> result = new ArrayList<RouteSegmentResult>(Arrays.asList(res));
ctx.routingTime = ctx.calculationProgress.routingCalculatedTime;
ctx.visitedSegments = ctx.calculationProgress.visitedSegments;

View file

@ -60,10 +60,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<LinearLayout android:id="@+id/FavoritesButton" android:background="@drawable/bg_left"
android:layout_weight="1" android:layout_height="112dp" android:focusable="true" android:clickable="true">
<TextView android:layout_height="wrap_content" android:layout_width="0dp"
android:id="@+id/FavoritesButtonText"
android:layout_marginLeft="15dp" android:layout_gravity="center_vertical|left"
android:text="@string/favorites_Button" android:textColor="#000000" android:typeface="serif"
android:layout_weight="1" android:textSize="16sp"/>
<ImageView
android:id="@+id/FavoritesButtonImage"
android:src="@drawable/button_icon_favorites"
android:layout_gravity="center|right"
android:layout_width="wrap_content"
@ -73,11 +75,13 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<LinearLayout android:id="@+id/SettingsButton" android:background="@drawable/bg_right"
android:layout_weight="1" android:layout_height="112dp" android:focusable="true" android:clickable="true">
<ImageView
android:id="@+id/SettingsButtonImage"
android:src="@drawable/button_icon_settings"
android:layout_gravity="center|left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:layout_height="wrap_content" android:layout_width="0dp"
android:id="@+id/SettingsButtonText"
android:layout_gravity="center_vertical|right"
android:layout_weight="1"
android:layout_marginRight="15dp"

View file

@ -62,10 +62,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
android:focusable="true" android:clickable="true"
android:layout_weight="1" android:layout_height="165dp">
<TextView android:layout_height="wrap_content" android:layout_width="0dp"
android:id="@+id/FavoritesButtonText"
android:layout_marginLeft="15dp" android:layout_gravity="center_vertical|left"
android:text="@string/favorites_Button" android:textColor="#000000" android:typeface="serif"
android:layout_weight="1" android:textSize="24sp"/>
<ImageView
android:id="@+id/FavoritesButtonImage"
android:src="@drawable/button_icon_favorites"
android:layout_gravity="center|right"
android:layout_width="wrap_content"
@ -76,11 +78,13 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
android:focusable="true" android:clickable="true"
android:layout_weight="1" android:layout_height="165dp">
<ImageView
android:id="@+id/SettingsButtonImage"
android:src="@drawable/button_icon_settings"
android:layout_gravity="center|left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:layout_height="wrap_content" android:layout_width="0dp"
android:id="@+id/SettingsButtonText"
android:layout_gravity="center_vertical|right"
android:layout_weight="1"
android:layout_marginRight="15dp"

View file

@ -55,10 +55,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<LinearLayout android:id="@+id/FavoritesButton" android:background="@drawable/bg_leftr" android:orientation="vertical"
android:focusable="true" android:clickable="true" android:layout_weight="3" android:layout_height="250dp">
<ImageView
android:id="@+id/FavoritesButtonImage"
android:src="@drawable/button_icon_favorites" android:scaleType="center" android:layout_gravity="center"
android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="0dp"/>
<LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center">
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
android:id="@+id/FavoritesButtonText"
android:layout_gravity="center_horizontal|top" android:textSize="27sp"
android:text="@string/favorites_Button" android:typeface="serif" android:textColor="#000000"/>
</LinearLayout>
@ -66,11 +68,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<LinearLayout android:layout_weight="2" android:layout_height="fill_parent"/>
<LinearLayout android:id="@+id/SettingsButton" android:background="@drawable/bg_rightr" android:orientation="vertical"
android:focusable="true" android:clickable="true" android:layout_weight="3" android:layout_height="250dp">
<ImageView
<ImageView android:id="@+id/SettingsButtonImage"
android:src="@drawable/button_icon_settings" android:scaleType="center" android:layout_gravity="center"
android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="0dp"/>
<LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center">
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
android:id="@+id/SettingsButtonText"
android:layout_gravity="center_horizontal|top" android:textSize="27sp"
android:text="@string/settings_Button" android:typeface="serif" android:textColor="#000000"/>
</LinearLayout>

View file

@ -54,11 +54,11 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<TableRow android:layout_height = "wrap_content" android:layout_marginTop="15dp">
<LinearLayout android:id="@+id/FavoritesButton" android:background="@drawable/bg_leftr" android:orientation="vertical" android:clickable="true"
android:layout_weight="3" android:layout_height="175dp" android:focusable="true">
<ImageView
<ImageView android:id="@+id/FavoritesButtonImage"
android:src="@drawable/button_icon_favorites" android:scaleType="center" android:layout_gravity="center"
android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="0dp"/>
<LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center">
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/FavoritesButtonText"
android:layout_gravity="center_horizontal|top" android:textSize="18sp"
android:text="@string/favorites_Button" android:typeface="serif" android:textColor="#000000"/>
</LinearLayout>
@ -66,12 +66,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b
<LinearLayout android:layout_weight="2" android:layout_height="fill_parent"/>
<LinearLayout android:id="@+id/SettingsButton" android:background="@drawable/bg_rightr" android:orientation="vertical" android:clickable="true"
android:layout_weight="3" android:layout_height="175dp" android:focusable="true">
<ImageView
<ImageView android:id="@+id/SettingsButtonImage"
android:src="@drawable/button_icon_settings" android:scaleType="center" android:layout_gravity="center"
android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="0dp"/>
<LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center">
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_horizontal|top" android:textSize="18sp"
android:layout_gravity="center_horizontal|top" android:textSize="18sp" android:id="@+id/SettingsButtonText"
android:text="@string/settings_Button" android:typeface="serif" android:textColor="#000000"/>
</LinearLayout>
</LinearLayout>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="offline_edition">Modifications hors ligne</string>
<string name="offline_edition_descr">Toujours utiliser l\'édition hors ligne</string>
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="offline_edition">Modifications hors-ligne</string>
<string name="offline_edition_descr">Toujours utiliser l\'édition hors-ligne</string>
<string name="tip_recent_changes_0_7_1_t">"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 @@
<string name="live_monitoring">Activer le suivi en ligne</string>
<string name="live_monitoring_interval_descr">Préciser l\'intervalle pour le suivi en ligne</string>
<string name="live_monitoring_interval">Intervalle pour le suivi en ligne</string>
<string name="live_monitoring_url_descr">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}</string>
<string name="live_monitoring_url_descr">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}</string>
<string name="live_monitoring_url">Adresse web pour le suivi en ligne</string>
<string name="gpx_monitoring_disabled_warn">Veuillez activer \'Enregistrer l\'itinéraire en GPX\' en paramètre de suivi.</string>
<string name="show_current_gpx_title">Afficher la trace en cours</string>
<string name="tip_recent_changes_0_7_0_t">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</string>
<string name="free_version_message">Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors ligne.</string>
<string name="free_version_message">Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors-ligne.</string>
<string name="free_version_title">Version gratuite</string>
<string name="poi_context_menu_showdescription">Afficher description PI</string>
<string name="index_name_north_america">Amérique du Nord</string>
@ -50,7 +50,7 @@
<string name="index_name_wiki">Wikipédia Monde</string>
<string name="index_name_voice">Voix enregistrées (fonctions limitées)</string>
<string name="index_name_tts_voice">Voix de synthèse TTS (à préférer)</string>
<string name="amenity_type_osmwiki">Wikipédia (hors ligne)</string>
<string name="amenity_type_osmwiki">Wikipédia (hors-ligne)</string>
<string name="amenity_type_user_defined">Défini par l\'utilisateur</string>
<string name="fav_export_confirmation">Un fichier de favoris précédemment exporté existe déjà. Voulez vous le remplacer ?</string>
<string name="profile_settings">Paramètres de profil</string>
@ -74,23 +74,23 @@
<string name="osmand_service_descr">Permet d\'utiliser OsmAnd pendant que l\'écran est désactivé</string>
<string name="tip_rotation_switching">Orientation de la carte</string>
<string name="switch_to_raster_map_to_see">Vous n\'avez pas actuellement de carte vectorielle pour cet emplacement.\n\t\n\tVous pouvez en télécharger dans \'Paramètres\' -&gt; \'Données hors ligne\', ou basculer sur les cartes en ligne via \'Paramètres\' -&gt; \'Sources de carte\'.</string>
<string name="binary_map_download_success">Téléchargement réussi.\n\t\n\tPour l\'utiliser, activer dans \'Paramètres\' -&gt; \'Sources de carte\' -&gt; \'Cartes vectorielles\'.</string>
<string name="switch_to_raster_map_to_see">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\'.</string>
<string name="binary_map_download_success">Téléchargement réussi.\n\t\n\tPour l\'utiliser, allez dans \'Menu\' → \'Couches\' → \'Source de la carte…\' → \'Cartes vectorielles OSM\'.</string>
<string name="tip_day_night_mode">Mode jour/nuit</string>
<string name="tip_osm_improve">Améliorer les données OSM</string>
<string name="tip_osm_improve_t">\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\' -&gt; \'Général\' -&gt; \'Édition OSM\'.
<string name="tip_osm_improve_t">\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.</string>
\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.</string>
<string name="download_files_not_enough_space">Il n\'y a pas assez de place pour télécharger %1$s MB (disponible: %2$s).</string>
<string name="download_files_question_space">Espace actuellement disponible: {2} MB ! Télécharger {0} fichier(s) ({1} MB) ?</string>
<string name="tip_recent_changes_0_6_9_t">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 @@
<string name="search_position_current_location_search">Recherche de l\'emplacement…</string>
<string name="search_position_current_location_found">Emplacement[Trouvé]</string>
<string name="search_position_address">Adresse…</string>
<string name="search_position_favorites">Favoris</string>
<string name="search_position_favorites">Favori…</string>
<string name="search_position_undefined">Non défini</string>
<string name="search_position_fixed">Fixé</string>
<string name="search_position_current_location">Emplacement actuel…</string>
@ -152,11 +152,11 @@
<string name="select_search_position">Recherche autour de :</string>
<string name="context_menu_item_search">Rechercher autour du point</string>
<string name="tip_recent_changes_0_6_7_t">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 @@
<string name="show_more_map_detail">Afficher plus de détails</string>
<string name="show_more_map_detail_descr">Afficher plus de détails sur les cartes vectorielles (routes etc.) aux niveaux de zooms inférieurs</string>
<string name="favourites_delete_multiple_succesful">Favoris correctement supprimés.</string>
<string name="favorite_delete_multiple">Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes vous sûr ?</string>
<string name="favorite_home_category">Maison</string>
<string name="favorite_delete_multiple">Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes-vous sûr ?</string>
<string name="favorite_home_category">Domicile</string>
<string name="favorite_friends_category">Amis</string>
<string name="favorite_places_category">Lieux</string>
<string name="favorite_default_category">Autres</string>
<string name="vector_map_not_needed">Pas nécessaire</string>
<string name="basemap_missing">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.</string>
<string name="vector_data_missing">Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors ligne.</string>
<string name="vector_data_missing">Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors-ligne.</string>
<string name="local_index_gpx_info_show">\n\nAppui long pour afficher sur la carte</string>
<string name="local_index_gpx_info_speed">\nVitesse moyenne : %1$s
\nVitesse maximum : %2$s</string>
@ -193,7 +193,7 @@
<string name="local_index_items_restored">%1$d sur %2$d éléments restaurés.</string>
<string name="local_index_no_items_to_do">Pas d\'éléments à %1$s</string>
<string name="local_index_action_do">Vous allez %1$s %2$s éléments. Continuer ?</string>
<string name="local_index_descr_title">Gestionnaire de données hors ligne</string>
<string name="local_index_descr_title">Gestionnaire de données hors-ligne</string>
<string name="local_index_mi_restore">Restaurer</string>
<string name="local_index_mi_backup">Sauvegarder</string>
<string name="local_index_mi_delete">Supprimer</string>
@ -236,7 +236,7 @@
<string name="tts_missing_language_data">Les données pour la langue sélectionnée ne sont pas installées. Voulez-vous les obtenir sur le Market ?</string>
<string name="gpx_option_reverse_route">Inverser l\'itinéraire GPX</string>
<string name="gpx_option_destination_point">Utiliser la destination en cours</string>
<string name="gpx_option_from_start_point">Suivre la trace depuis le début</string>
<string name="gpx_option_from_start_point">Suivre l\'ensemble de la trace</string>
<string name="switch_to_vector_map_to_see">Vous pouvez basculer sur les cartes vectorielles locales en utilisant le menu (Couches -&gt; Source de la carte… -&gt; Cartes vectorielles OSM) pour voir la carte.</string>
<string name="choose_audio_stream">Sélectionner le flux audio</string>
<string name="choose_audio_stream_descr">Sélectionner le canal pour le guidage vocal (dépend de la configuration système)</string>
@ -261,56 +261,56 @@
<string name="internet_not_available">Connexion Internet nécessaire pour cette opération non disponible</string>
<string name="install_more">Installer plus…</string>
<string name="tip_update_index">Mise à jour des cartes hors-ligne</string>
<string name="tip_update_index_t">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 :
<string name="tip_update_index_t">\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
</string>
<string name="level_to_switch_vector_raster_descr">Niveau de zoom maximum pour l\'utilisation des cartes vectorielles au lieu des tuiles de carte</string>
<string name="level_to_switch_vector_raster">Niveau de zoom vectoriel</string>
<string name="tip_location_sharing">Partage d\'emplacement</string>
<string name="tip_location_sharing_t">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\'-&gt;\'Partager un lieu\'.
<string name="tip_location_sharing_t">\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.
</string>
<string name="tip_favorites">Lieux favoris</string>
<string name="tip_favorites_t">"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\'-&gt;\'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\'-&gt;\'Couches\'. "</string>
<string name="tip_favorites_t">"\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\'. "</string>
<string name="create_poi_link_to_osm_doc"> <u>OSM en ligne</u> classification des cartes en images</string>
<string name="error_doing_search">Une erreur est survenue lors de la recherche hors-ligne</string>
<string name="search_offline_geo_error">Ne peut interpréter le geo intent:\'%s\'</string>
<string name="search_osm_offline">Recherche d\'adresses dans les cartes hors-ligne</string>
<string name="system_locale">Système</string>
<string name="preferred_locale_descr">Changer la langue d\'affichage</string>
<string name="preferred_locale_descr">Sélectionner la langue d\'affichage</string>
<string name="preferred_locale">Langue d\'affichage</string>
<string name="tip_map_switch">Source de cartes</string>
<string name="tip_app_mode">Mode de fonctionnement</string>
<string name="tip_navigation">Navigation</string>
<string name="tip_navigation_t">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).
<string name="tip_navigation_t">\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).
</string>
<string name="tip_search">Recherche</string>
<string name="tip_search_t">Vous pouvez rechercher un lieu via l\'option \'Rechercher autour du point\' dans le menu contextuel de la carte, ou via \'Menu\' → \'Rechercher\'.
<string name="tip_search_t">\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.
</string>
<string name="tip_map_context_menu">Menu contextuel de la carte</string>
<string name="tip_map_context_menu_t">\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.
<string name="tip_map_context_menu_t">\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).
</string>
<string name="tip_initial">Conseils et astuces</string>
<string name="tip_initial_t">\tOsmAnd est une application de navigation avec beaucoup de fonctionnalités.
@ -318,7 +318,7 @@
</string>
<string name="next_button">Suivant</string>
<string name="previous_button">Précédent</string>
<string name="unit_of_length_descr">Modifier les unités de distance et vitesse</string>
<string name="unit_of_length_descr">Sélectionner les unités de distance et vitesse à utiliser</string>
<string name="unit_of_length">Unités de mesure</string>
<string name="si_mi_foots">Miles/pieds</string>
<string name="si_mi_yard">Miles/yards</string>
@ -336,9 +336,9 @@
<string name="add_waypoint_dialog_title">Ajouter une étape à une trace GPX enregistrée</string>
<string name="context_menu_item_add_waypoint">Ajouter une étape GPX</string>
<string name="amenity_type_administrative">Territoire</string>
<string name="amenity_type_barrier">Barrière</string>
<string name="amenity_type_barrier">Obstacle</string>
<string name="amenity_type_education">Éducation</string>
<string name="amenity_type_emergency">Urgence</string>
<string name="amenity_type_emergency">Urgences</string>
<string name="amenity_type_entertainment">Divertissement</string>
<string name="amenity_type_finance">Argent</string>
<string name="amenity_type_geocache">Géocache</string>
@ -405,7 +405,7 @@
<string name="select_all">Sélectionner tout</string>
<string name="reload">Recharger</string>
<string name="fast_route_mode">Itinéraire le plus rapide</string>
<string name="fast_route_mode_descr">Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court. </string>
<string name="fast_route_mode_descr">Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court</string>
<string name="tiles_to_download_estimated_size">Le zoom {0} télécharge {1} carreaux ({2} Mb )</string>
<string name="context_menu_item_download_map">Télécharger la carte</string>
<string name="select_max_zoom_preload_area">Sélectionnez le zoom maximum pour précharger la zone visible</string>
@ -479,20 +479,20 @@
<string name="use_trackball">Utiliser le pointeur</string>
<string name="background_service_wait_int_descr">Configurer le délai d\'attente pour déterminer l\'emplacement</string>
<string name="background_service_wait_int">Délai d\'attente</string>
<string name="service_stop_background_service">Arrêter le service de navigation en arrière plan</string>
<string name="service_stop_background_service">Arrêter le service de navigation en arrière-plan</string>
<string name="where_am_i">Où suis-je ?</string>
<string name="process_navigation_service">Service de navigation OsmAnd</string>
<string name="network_provider">Réseau</string>
<string name="gps_provider">GPS</string>
<string name="int_seconds">secondes</string>
<string name="int_min">min.</string>
<string name="background_service_int_descr">Choisir un intervalle d\'actualisation de votre position dans le service en arrière plan</string>
<string name="background_service_int_descr">Choisir un intervalle d\'actualisation de votre position dans le service en arrière-plan</string>
<string name="background_service_int">Intervalle de positionnement</string>
<string name="background_service_provider_descr">Choisir un fournisseur de géolocalisation pour le service arrière plan</string>
<string name="background_service_provider_descr">Choisir un fournisseur de géolocalisation pour le service arrière-plan</string>
<string name="background_service_provider">Fournisseur de géolocalisation</string>
<string name="background_router_service_descr">Activer le service en arrière-plan pour suivre votre position en continu</string>
<string name="background_router_service">Service de positionnement</string>
<string name="off_router_service_no_gps_available">Le service d\'arrière plan requiert l\'activation de la géolocalisation.</string>
<string name="off_router_service_no_gps_available">Le service d\'arrière-plan requiert l\'activation de la géolocalisation.</string>
<string name="hide_poi_filter">Masquer le filtre</string>
<string name="show_poi_filter">Afficher le filtre</string>
<string name="search_poi_filter">Filtre</string>
@ -531,26 +531,26 @@
<string name="map_screen_orientation_descr">Paysage, portrait, ou selon la position de l\'appareil</string>
<string name="opening_hours_not_supported">Le format des heures d\'ouverture n\'est pas supporté pour l\'édition</string>
<string name="add_new_rule">Ajouter une nouvelle règle</string>
<string name="transport_Routes">Routes</string>
<string name="transport_Routes">Lignes</string>
<string name="transport_Stop">Arrêt</string>
<string name="transport_stops">arrêts</string>
<string name="transport_search_after">Chercher la route suivante</string>
<string name="transport_search_before">Chercher la route précédente</string>
<string name="transport_search_after">Chercher l\'itinéraire suivant</string>
<string name="transport_search_before">Chercher l\'itinéraire précédent</string>
<string name="transport_finish_search">Terminer la recherche</string>
<string name="transport_stop_to_go_out">Sélectionnez arrêt pour sortir</string>
<string name="transport_to_go_after">à faire après</string>
<string name="transport_to_go_before">à faire avant</string>
<string name="transport_stops_to_pass">arrêts à faire</string>
<string name="transport_stop_to_go_out">Sélectionnez la destination</string>
<string name="transport_to_go_after">reste à parcourir</string>
<string name="transport_to_go_before">distance préliminaire</string>
<string name="transport_stops_to_pass">nombre d\'arrêts :</string>
<string name="transport_route_distance">Distance du trajet</string>
<string name="transport">Transport</string>
<string name="default_buttons_ok">OK</string>
<string name="show_transport_over_map_description">Afficher les arrêts des transports publics sur la carte</string>
<string name="show_transport_over_map">Afficher les arrêts des transports</string>
<string name="show_transport_over_map_description">Afficher les arrêts de transport en commun sur la carte</string>
<string name="show_transport_over_map">Afficher les arrêts de transport public</string>
<string name="hello">Application de navigation OsmAnd</string>
<string name="update_poi_success">Mise à jour des données PI réussie ({0} ont été chargés)</string>
<string name="update_poi_error_local">Erreur de mise à jour des index locaux</string>
<string name="update_poi_error_loading">Erreur lors du chargement des données du serveur</string>
<string name="update_poi_no_offline_poi_index">Il n\'y a pas de données hors ligne pour cette région</string>
<string name="update_poi_no_offline_poi_index">Il n\'y a pas de données hors-ligne pour cette région</string>
<string name="update_poi_is_not_available_for_zoom">Mise à jour de PI n\'est pas disponible pour un petit niveau de zoom</string>
<string name="context_menu_item_update_poi">Points d\'Intérêts</string>
<string name="context_menu_item_update_map_confirm">Mettre à jour les données locales depuis internet ?</string>
@ -568,7 +568,7 @@
<string name="searching_address">Recherche de l\'adresse…</string>
<string name="search_osm_nominatim">Recherche de l\'adresse via OSM Nominatim</string>
<string name="hint_search_online">Numéro de la maison, rue, ville</string>
<string name="search_offline_address">Hors ligne</string>
<string name="search_offline_address">Hors-ligne</string>
<string name="search_online_address">Internet</string>
<string name="max_level_download_tile">Niveau de zoom maximum</string>
<string name="max_level_download_tile_descr">Choisir un niveau de zoom maximum pour le téléchargement</string>
@ -639,9 +639,9 @@
<string name="auto_zoom_map">Zoom auto. sur la carte</string>
<string name="additional_settings">Paramètres supplémentaires</string>
<string name="settings">Paramètres</string>
<string name="save_current_track_descr">Enregistrer la trace actuelle sur carte SD</string>
<string name="save_current_track_descr">Enregistrer la trace actuelle sur la carte SD</string>
<string name="save_current_track">Enregistrer la trace GPX</string>
<string name="save_track_interval_descr">Choisir l\'intervalle d\'enregistrement de la trace</string>
<string name="save_track_interval_descr">Choisir l\'intervalle d\'enregistrement pour la trace</string>
<string name="save_track_interval">Intervalle d\'enregistrement</string>
<string name="save_track_to_gpx_descrp">Les traces seront enregistrées et groupées par jour dans le répertoire des traces</string>
<string name="save_track_to_gpx">Enregistrer la trace dans un fichier GPX</string>
@ -669,7 +669,7 @@
<string name="show_poi_over_map_description">Afficher PI sur la carte (utiliser le dernier filtre)</string>
<string name="show_poi_over_map">Afficher PI</string>
<string name="map_tile_source_descr">Choisir la source des tuiles de carte (en ligne ou en cache)</string>
<string name="map_tile_source">Source des cartes</string>
<string name="map_tile_source">Source de la carte</string>
<string name="map_source">Source cartographique</string>
<string name="use_internet">Utiliser internet</string>
<string name="show_location">Afficher l\'emplacement</string>
@ -720,7 +720,7 @@
<string name="default_buttons_apply">Appliquer</string>
<string name="default_buttons_add">Ajouter</string>
<string name="default_buttons_no">Non</string>
<string name="add_favorite_dialog_top_text">Nom du favoris</string>
<string name="add_favorite_dialog_top_text">Nom du favori</string>
<string name="add_favorite_dialog_default_favourite_name">Favoris</string>
<string name="add_favorite_dialog_favourite_added_template">Le point \'\'{0}\'\' à été ajouté aux favoris.</string>
<string name="favourites_context_menu_edit">Éditer le favori</string>
@ -778,13 +778,13 @@
<string name="basemap_was_selected_to_download">Carte mondiale de base requise pour le bon fonctionnement, sélectionnée pour téléchargement.</string>
<string name="map_online_plugin_is_not_installed">Activer le greffon des cartes en ligne pour sélectionner différentes sources de cartes</string>
<string name="map_online_data">Cartes en ligne (tuiles)</string>
<string name="map_online_data_descr">Utiliser les cartes en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD)</string>
<string name="map_online_data">Carte en ligne (tuiles)</string>
<string name="map_online_data_descr">Utiliser une carte en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD)</string>
<string name="online_map_settings">Cartes en ligne</string>
<string name="online_map_settings_descr">Configurer la source des cartes en ligne ou en cache</string>
<string name="online_map_settings_descr">Configurer la source de la carte en ligne ou en cache</string>
<string name="map_settings">- Paramètres des cartes</string>
<string name="map_settings_descr">Configurer l\'affichage des cartes</string>
<string name="osmand_rastermaps_plugin_description">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.</string>
<string name="osmand_rastermaps_plugin_description">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.</string>
<string name="osmand_background_plugin_description">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.</string>
<string name="osmand_accessibility_description">Ce greffon permet de configurer les fonctionnalités d\'accessibilité.</string>
<string name="extra_settings">Paramètres avancés</string>
@ -792,12 +792,12 @@
<string name="osmand_extra_settings_description">Ce greffon permet de gérer des paramètres de configuration avancés et propres à certains appareils.</string>
<string name="osmand_development_plugin_description">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.</string>
<string name="plugins_screen">Gestionnaire des greffons</string>
<string name="select_plugin_to_activate">Toucher un greffon pour l\'activer ou le désactiver (Redémarrage d\'OsmAnd peut être nécessaire)</string>
<string name="select_plugin_to_activate">Toucher un greffon pour l\'activer ou le désactiver (le redémarrage d\'OsmAnd peut être nécessaire)</string>
<string name="prefs_plugins_descr">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.</string>
<string name="prefs_plugins">Gestionnaire de greffons</string>
<string name="tip_recent_changes_0_8_0_t">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</string>
<string name="osm_editing_plugin_description">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).</string>
\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</string>
<string name="osm_editing_plugin_description">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).</string>
<string name="vector_maps_may_display_faster_on_some_devices">Cartes vectorielles (hors-ligne) peuvent s\'afficher plus rapidement. Peut ne pas fonctionner sur certains appareils.</string>
<string name="play_commands_of_currently_selected_voice">Diffuse les commandes sonores disponibles pour la voix sélectionnée</string>
@ -806,7 +806,7 @@
<string name="test_voice_prompts">Tester les commandes vocales</string>
<string name="tip_recent_changes_0_7_2_t">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</string>
\n\t- Rendu pré-compilé pour tous les appareils\n\t- Édition hors-ligne des PI\n\t- Accessibilité\n\t- Corrections de bogues</string>
<string name="send_files_to_osm">Envoyer les traces GPX à OSM ?</string>
<string name="gpx_visibility_txt">Visibilité</string>
<string name="gpx_tags_txt">Libellés</string>
@ -991,7 +991,7 @@
<string name="avoid_unpaved">Éviter les voies non revêtues</string>
<string name="avoid_ferries">Éviter les ferries</string>
<string name="avoid_in_routing_title">Éviter…</string>
<string name="avoid_in_routing_descr">Éviter péages, voies non carrossables, ferries, autoroutes</string>
<string name="avoid_in_routing_descr">Éviter péages, voies non revêtues, ferries, autoroutes</string>
<string name="show_warnings_title">Annonces visuelles…</string>
<string name="show_warnings_descr">Afficher les avertissements (limitations de vitesse, stops, ralentisseurs, radars), les voies de circulation</string>
<string name="map_widget_fluorescent">Itinéraires fluorescents</string>
@ -1014,19 +1014,19 @@
<string name="int_continuosly">En continu</string>
<string name="tip_rotation_switching_t_v2">\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</string>
<string name="tip_day_night_mode_t_v2">"\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\'-&gt;\'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.</string>
<string name="tip_day_night_mode_t_v2">"\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 "</string>
<string name="osmand_short_description_80_chars">OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne.</string>
<string name="osmand_plus_short_description_80_chars">OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne</string>
\n\t\'Détection de la luminosité\' - Bascule contrôlée par le capteur de luminosité de votre appareil, s\'il existe "</string>
<string name="osmand_short_description_80_chars">OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne.</string>
<string name="osmand_plus_short_description_80_chars">OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne</string>
<string name="tip_recent_changes_0_8_3_t">"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 "</string>
<string name="snap_to_road_descr">Coller à la route pendant la navigation</string>
<string name="snap_to_road">Coller à la route</string>
<string name="osmand_long_description_1000_chars">" 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. "</string>
<string name="osmand_plus_long_description_1000_chars">" 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"</string>
<string name="tip_map_switch_t_v2">\tLa source des cartes et des couches affichées est modifiable via \'Menu\' -&gt; \'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.
<string name="osmand_long_description_1000_chars">" 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. "</string>
<string name="osmand_plus_long_description_1000_chars">" 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"</string>
<string name="tip_map_switch_t_v2">\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.
</string>
<string name="tip_app_mode_t_v2">\tOsmAnd propose des profils (personnalisables) adaptés aux différents usages.
<string name="tip_app_mode_t_v2">\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.
</string>
<string name="avoid_motorway">Éviter les autoroutes</string>
@ -1064,7 +1064,7 @@
<string name="btn_advanced_mode">Mode avancé…</string>
<string name="poi_filter_parking">Parking</string>
<string name="poi_filter_emergency">Urgences</string>
<string name="poi_filter_public_transport">Transports publics</string>
<string name="poi_filter_public_transport">Transports en commun</string>
<string name="poi_filter_entertainment">Divertissements</string>
<string name="poi_filter_restaurants">Restauration</string>
<string name="poi_filter_sightseeing">Tourisme</string>
@ -1082,15 +1082,15 @@
<string name="zxing_barcode_scanner_not_found">L\'appplication ZXing Barcode Scanner n\'est pas installée. La chercher dans Market ?</string>
<string name="close_changeset">Clôturer les modifications</string>
<string name="background_service_is_enabled_question">Le service OsmAnd tourne toujours en tâche de fond. Voulez-vous l\'arrêter ?</string>
<string name="tip_recent_changes_1_0_0_t">"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 "</string>
<string name="tip_recent_changes_1_0_0_t">"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 "</string>
<string name="safe_mode_description">Exécuter l\'application dans le mode sûr (ne pas utiliser de code natif).</string>
<string name="safe_mode">Mode sûr</string>
<string name="native_library_not_running">L\'application s\'exécute en mode sûr (désactiver le dans les paramètres).</string>
<string name="rendering_attr_showRoadMaps_description">Sélectionner quand afficher uniquement les cartes routières :</string>
<string name="rendering_attr_showRoadMaps_name">Cartes routières uniquement</string>
<string name="native_library_not_running">L\'application s\'exécute en mode sûr (peut être désactivé dans Paramètres).</string>
<string name="rendering_attr_showRoadMaps_description">Sélectionner à quel moment afficher les cartes uniquement routières :</string>
<string name="rendering_attr_showRoadMaps_name">Cartes uniquement routières</string>
<string name="download_roads_only_item">Routes uniquement</string>
<string name="download_regular_maps">Cartes standards</string>
<string name="download_roads_only_maps">Cartes routières uniquement</string>
<string name="download_roads_only_maps">Cartes uniquement routières</string>
<string name="incomplete_locale">incomplet</string>
<string name="no_buildings_found">Aucun bâtiment trouvé.</string>
<string name="search_villages_and_postcodes">Rechercher les villages et les codes postaux</string>
@ -1105,22 +1105,22 @@
<string name="rendering_attr_noAdminboundaries_description">Ne pas afficher les limites administratives régionales (niveaux 5 à 9)</string>
<string name="tip_altitude_offset_t">"\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). "</string>
\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). "</string>
<string name="osmodroid_plugin_old_ver_not_supported">Le greffon OsMoDroid est obsolète et doit être mis à jour.</string>
<string name="osmodroid_plugin_description">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.</string>
<string name="osmodroid_plugin_name">Greffon OsMoDroid</string>
<string name="index_srtm_ele">Courbes de niveau</string>
<string name="srtm_plugin_description">Ce greffon permet de télécharger les courbes de niveaux (Téléchargement de cartes -&gt; Menu -&gt; Autres cartes) pour une région spécifique et de les utiliser avec les cartes hors-ligne.</string>
<string name="srtm_plugin_name">Greffon des courbes de niveau</string>
<string name="srtm_plugin_description">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.</string>
<string name="srtm_plugin_name">Courbes de niveau</string>
<string name="download_select_map_types">Autres cartes</string>
<string name="download_srtm_maps">Courbes de niveau</string>
<string name="index_srtm_parts">parties</string>
<string name="audionotes_location_not_defined">L\'emplacement à associer à la note n\'est pas encore défini. \"Utiliser l\'emplacement ...\" pour attribuer une note à l\'emplacement spécifié</string>
<string name="audionotes_location_not_defined">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é.</string>
<string name="monitoring_control_stop">arrêter</string>
<string name="map_widget_audionotes">Notes audio</string>
<string name="audionotes_plugin_description">Prendre des notes audio/vidéo durant le voyage</string>
<string name="audionotes_plugin_description">Ce greffon permet de prendre des notes audio/vidéo/photo durant le voyage.</string>
<string name="audionotes_plugin_name">Notes audio/vidéo</string>
<string name="osmand_srtm_short_description_80_chars">Greffon OsmAnd pour les courbes de niveau hors-ligne</string>
@ -1135,7 +1135,7 @@
<string name="av_video_format_descr">Sélectionner le format vidéo de sortie</string>
<string name="av_video_format">Format d\'enregistrement vidéo de sortie</string>
<string name="av_use_external_recorder_descr">Utiliser l\'application système pour les vidéos</string>
<string name="av_use_external_recorder">Option caméra vidéo</string>
<string name="av_use_external_recorder">Option caméra</string>
<string name="av_settings_descr">Configurer les paramètres audio et vidéo</string>
<string name="av_settings">Paramètres audio/vidéo </string>
<string name="recording_error">Une erreur s\'est produite lors de l\'enregistrement </string>
@ -1147,7 +1147,7 @@
<string name="recording_unavailable">non disponible</string>
<string name="recording_context_menu_arecord">Prendre une note audio</string>
<string name="recording_context_menu_vrecord">Prendre une note vidéo</string>
<string name="layer_recordings">Couche d\'enregistrements</string>
<string name="layer_recordings">Enregistrements</string>
<string name="recording_can_not_be_played">L\'enregistrement ne peut pas être lu</string>
<string name="recording_context_menu_delete">Supprimer l\'enregistrement</string>
<string name="recording_context_menu_play">Lire</string>
@ -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"
</string>
<string name="max_speed_none">Aucun(e)</string>
<string name="prefer_motorways">Autoroutes de préférence</string>
<string name="prefer_motorways">Privilégier les autoroutes</string>
<string name="prefer_in_routing_title">Privilégier…</string>
<string name="prefer_in_routing_descr">Autoroutes de préférence</string>
<string name="av_def_action_choose">Sélectionner sur demande</string>
@ -1294,7 +1294,7 @@
<string name="distance_measurement_start_editing">Commencer à modifier</string>
<string name="distance_measurement_finish_editing">Finir de modifier</string>
<string name="distance_measurement_save_gpx">Sauvegarder comme GPX</string>
<string name="distance_measurement_load_gpx">Ouvrir une fichier GPX existant</string>
<string name="distance_measurement_load_gpx">Ouvrir un fichier GPX existant</string>
<string name="wait_current_task_finished">Veuillez attendre jusqu\'à ce que la tâche actuelle soit terminée</string>
<string name="plugin_distance_point_time">temps</string>
<string name="plugin_distance_point_hdop">précision</string>
@ -1302,8 +1302,8 @@
<string name="plugin_distance_point_ele">altitude</string>
<string name="gpx_file_name">nom du fichier GPX</string>
<string name="gpx_saved_sucessfully">Sauvegarde du fichier GPX à {0} réussi</string>
<string name="osmand_distance_planning_plugin_description">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.</string>
<string name="osmand_distance_planning_plugin_name">Calculatrice de Distance &amp; Outil de Planification</string>
<string name="osmand_distance_planning_plugin_description">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.</string>
<string name="osmand_distance_planning_plugin_name">Mesure de distance et outil de planification</string>
<string name="default_buttons_do_not_show_again">Ne plus montrer</string>
<string name="local_osm_changes_backup_successful">Fichier de modifications OSM %1$s généré avec succès</string>
<string name="local_osm_changes_backup_failed">Échec de la sauvegarde des modifications OSM</string>
@ -1332,7 +1332,7 @@
<string name="tip_map_styles">Styles de cartes</string>
<string name="about_settings">À propos</string>
<string name="about_settings_descr">Note de version, licences, membres du projet</string>
<string name="tips_and_tricks">Astuces</string>
<string name="tips_and_tricks">Aide</string>
<string name="local_index_tile_data_zooms">Zooms téléchargés: %1$s</string>
<string name="local_index_tile_data_expire">Expire (minutes): %1$s</string>
<string name="local_index_tile_data_downloadable">Téléchargeable: %1$s</string>
@ -1373,16 +1373,16 @@
<string name="local_index_gpx_timemoving">\nTemps en déplacement : %1$d:%2$02d:%3$02d</string>
<string name="destination_point">Destination %1$s</string>
<string name="osb_author_dialog_password">Mot de passe OSM (optionnel)</string>
<string name="av_camera_focus">Type de focus</string>
<string name="av_camera_focus_descr">Sélectionner le type de focus de l\'appareil photo</string>
<string name="av_camera_focus_auto">Focus automatique</string>
<string name="av_camera_focus_hiperfocal">Focus hyperfocal</string>
<string name="av_camera_focus_edof">Profondeur de champ étendu (EDOF)</string>
<string name="av_camera_focus_infinity">Le focus est réglé à l\'infini</string>
<string name="av_camera_focus_macro">Mode focus macro</string>
<string name="av_camera_focus">Mise au point</string>
<string name="av_camera_focus_descr">Sélectionner le type de mise au point de l\'appareil photo</string>
<string name="av_camera_focus_auto">Mise au point automatique</string>
<string name="av_camera_focus_hiperfocal">Hyperfocale</string>
<string name="av_camera_focus_edof">Profondeur de champ étendue (EDOF)</string>
<string name="av_camera_focus_infinity">À l\'infini</string>
<string name="av_camera_focus_macro">Mode macro</string>
<string name="av_camera_focus_continuous">L\'appareil photo essaie continuellement de faire la mise au point</string>
<string name="av_photo_play_sound">Jouer un son lors de la prise de photos</string>
<string name="av_photo_play_sound_descr">Choisir de jouer un son lors de la prise de photos</string>
<string name="av_photo_play_sound">Émettre un son lors de la prise de photos</string>
<string name="av_photo_play_sound_descr">Choisir d\'émettre un son lors de la prise de photos</string>
@ -1415,20 +1415,20 @@
<string name="auto_zoom_close">Arrêt de l\'auto-zoom</string>
<string name="auto_zoom_far">Zoom éloigné</string>
<string name="auto_zoom_farthest">Zoom très éloigné</string>
<string name="tip_map_styles_t">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).
<string name="tip_map_styles_t">\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.
</string>
<string name="remember_choice">Mémoriser mon choix</string>
<string name="gps_status_eclipsim">GPS Status</string>
<string name="animate_routing_route_not_calculated">Veuillez d\'abord calculer l\'itinéraire</string>
<string name="animate_routing_route">Simulation avec l\'itinéraire calculé </string>
<string name="animate_routing_gpx">Simulation avec la trace GPX</string>
<string name="tip_faq_t">Merci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions.</string>
<string name="tip_faq_t">\tMerci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions.</string>
<string name="tip_faq">Foire Aux Questions</string>
<string name="local_osm_changes_delete_all_confirm">Vous allez supprimer %1$d modifications OSM. Êtes-vous sûr ?</string>
<string name="local_osm_changes_delete_all">Effacer tout</string>
@ -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
</string>
<string name="gpx_option_calculate_first_last_segment">Calculer un itinéraire OsmAnd pour le début et la fin de l\'itinéraire</string>
<string name="calculate_osmand_route_without_internet">Calculer un itinéraire OsmAnd hors-ligne</string>
<string name="index_name_italy">Europe - Italie</string>
<string name="index_name_gb">Europe - Grande-Bretagne</string>
<string name="index_name_canada">Amérique du Nord - Canada</string>
<string name="index_item_nation_addresses">Adresses sur l\'ensemble du pays</string>
<string name="index_item_world_altitude_correction">Monde - Correction d\'altitude</string>
<string name="index_item_world_seamarks">Monde - Balisage maritime</string>
<string name="index_item_world_bitcoin_payments">Monde - Paiement en bitcoin</string>
<string name="index_item_world_basemap">Monde - Carte générale</string>
<string name="index_item_world_ski">Monde - Ski</string>
<string name="lang_hr">Croate</string>
<string name="lang_zh">Chinois</string>
<string name="lang_pt_br">Portugais (Brésil)</string>
<string name="lang_en">Anglais</string>
<string name="lang_af">Afrikaans</string>
<string name="lang_hy">Arménien</string>
<string name="lang_eu">Basque</string>
<string name="lang_be">Biélorusse</string>
<string name="lang_bs">Bosnien</string>
<string name="lang_bg">Bulgare</string>
<string name="lang_ca">Catalan</string>
<string name="lang_cs">Tchèque</string>
<string name="lang_da">Danois</string>
<string name="lang_nl">Néerlandais</string>
<string name="lang_fi">Finnois</string>
<string name="lang_fr">Français</string>
<string name="lang_ka">Géorgien</string>
<string name="lang_de">Allemand</string>
<string name="lang_el">Grec</string>
<string name="lang_iw">Hébreu</string>
<string name="lang_hi">Hindi</string>
<string name="lang_hu">Hongrois</string>
<string name="lang_id">Indonésien</string>
<string name="lang_it">Italien</string>
<string name="lang_ja">Japonais</string>
<string name="lang_ko">Coréen</string>
<string name="lang_lv">Letton</string>
<string name="lang_lt">Lituanien</string>
<string name="lang_mr">Marathi</string>
<string name="lang_no">Norvégien</string>
<string name="lang_pl">Polonais</string>
<string name="lang_pt">Portugais</string>
<string name="lang_ro">Roumain</string>
<string name="lang_ru">Russe</string>
<string name="lang_sk">Slovaque</string>
<string name="lang_sl">Slovène</string>
<string name="lang_es">Espagnol</string>
<string name="lang_sv">Suédois</string>
<string name="lang_tr">Turc</string>
<string name="lang_uk">Ukrainien</string>
<string name="lang_vi">Vietnamien</string>
<string name="lang_cy">Gallois</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<string name="settings_file_create_error">Couldn\'t create settings file in tour folder.</string>
<string name="tour">Tour</string>
</resources>

View file

@ -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
-->
<string name="index_item_nation_addresses">addresses nationwide</string>
<string name="index_item_world_altitude_correction">World altitude correction</string>
<string name="index_item_world_seamarks">World seamarks</string>
<string name="index_item_world_bitcoin_payments">World bitcoin payments</string>
<string name="index_item_world_basemap">World overview map</string>
<string name="index_item_world_ski">World ski map</string>
<string name="lang_hr">Croatian</string>
<string name="lang_zh">Chinese</string>
<string name="lang_pt_br">Portuguese (Brazil)</string>
<string name="lang_en">English</string>
<string name="lang_af">Afrikaans</string>
<string name="lang_hy">Armenian</string>
<string name="lang_eu">Basque</string>
<string name="lang_be">Belarusian</string>
<string name="lang_bs">Bosnian</string>
<string name="lang_bg">Bulgarian</string>
<string name="lang_ca">Catalan</string>
<string name="lang_cs">Czech</string>
<string name="lang_da">Danish</string>
<string name="lang_nl">Dutch</string>
<string name="lang_fi">Finnish</string>
<string name="lang_fr">French</string>
<string name="lang_ka">Georgian</string>
<string name="lang_de">German</string>
<string name="lang_el">Greek</string>
<string name="lang_iw">Hebrew</string>
<string name="lang_hi">Hindi</string>
<string name="lang_hu">Hungarian</string>
<string name="lang_id">Indonesian</string>
<string name="lang_it">Italian</string>
<string name="lang_ja">Japanese</string>
<string name="lang_ko">Korean</string>
<string name="lang_lv">Latvian</string>
<string name="lang_lt">Lithuanian</string>
<string name="lang_mr">Marathi</string>
<string name="lang_no">Norwegian</string>
<string name="lang_pl">Polish</string>
<string name="lang_pt">Portuguese</string>
<string name="lang_ro">Romanian</string>
<string name="lang_ru">Russian</string>
<string name="lang_sk">Slovak</string>
<string name="lang_sl">Slovenian</string>
<string name="lang_es">Spanish</string>
<string name="lang_sv">Swedish</string>
<string name="lang_tr">Turkish</string>
<string name="lang_uk">Ukrainian</string>
<string name="lang_vi">Vietnamese</string>
<string name="lang_cy">Welsh</string>
<string name="index_name_canada">North America - Canada</string>
<string name="index_name_italy">Europe - Italy</string>
<string name="index_name_gb">Europe - Great Britain</string>
<string name="calculate_osmand_route_without_internet">Calculate OsmAnd route segment without internet</string>
<string name="gpx_option_calculate_first_last_segment">Calculate OsmAnd route for first and last route segment</string>
<string name="use_displayed_track_for_navigation">Do you want to use displayed track for navigation?</string>

View file

@ -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();
}
}

View file

@ -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);
}

View file

@ -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();
}

View file

@ -37,10 +37,10 @@ public class FavouritesDbHelper {
private List<FavouritePoint> favoritePointsFromGPXFile = null;
private List<FavouritePoint> cachedFavoritePoints = new ArrayList<FavouritePoint>();
private Map<String, List<FavouritePoint>> favoriteGroups = null;
private final ClientContext context;
private final OsmandApplication context;
private SQLiteConnection conn;
public FavouritesDbHelper(ClientContext context) {
public FavouritesDbHelper(OsmandApplication context) {
this.context = context;
}

View file

@ -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<GPXExtensions> parserState = new Stack<GPXExtensions>();
boolean extensionReadMode = false;

View file

@ -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;

View file

@ -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) {

View file

@ -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<? extends Activity> getSettingsActivity(){
return SettingsActivity.class;
}
public Class<MapActivity> getMapActivity(){
return MapActivity.class;
}
public Class<SearchActivity> getSearchActivity(){
return SearchActivity.class;
}
public Class<FavouritesActivity> getFavoritesActivity(){
return FavouritesActivity.class;
}
public Class<MainMenuActivity> getMainMenuActivity() {
return MainMenuActivity.class;
}
public Class<? extends Activity> getDownloadIndexActivity() {
return DownloadIndexActivity.class;
}
public Class<? extends Activity> getPluginsActivity() {
return PluginsActivity.class;
}
public Class<? extends Activity> getLocalIndexActivity() {
return LocalIndexesActivity.class;
}
}

View file

@ -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<String, String> e : amenity.getAdditionalInfo().entrySet()) {
String key = e.getKey();

View file

@ -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,19 +188,20 @@ 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;
}
}
}

View file

@ -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) { }

View file

@ -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<ApplicationMode> APPLICATION_MODE = new PreferenceWithListener<ApplicationMode>(){
@ -195,11 +206,28 @@ 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 ////////////////
@ -537,6 +565,16 @@ public class OsmandSettings {
return p;
}
@SuppressWarnings("unchecked")
public CommonPreference<String> registerBooleanPreference(String id, String defValue) {
if(registeredPreferences.containsKey(id)) {
return (CommonPreference<String>) registeredPreferences.get(id);
}
StringPreference p = new StringPreference(id, defValue);
registeredPreferences.put(id, p);
return p;
}
@SuppressWarnings("unchecked")
public CommonPreference<Integer> 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);
}

View file

@ -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<AmenityType, LinkedHashSet<String>> acceptedTypes, ClientContext app){
application = app;
public PoiFilter(String name, String filterId, Map<AmenityType, LinkedHashSet<String>> 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<Amenity> getResultMatcher(final ResultMatcher<Amenity> 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<Amenity>() {
@Override
public boolean publish(Amenity object) {
@ -170,7 +174,7 @@ public class PoiFilter {
protected List<Amenity> searchAmenities(double lat, double lon, double topLatitude,
double bottomLatitude, double leftLongitude, double rightLongitude, final ResultMatcher<Amenity> 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;
}
}

View file

@ -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<PoiFilter> 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;
}

View file

@ -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<TileSourceTemplate> toFindUrl){
public SQLiteTileSource(OsmandApplication ctx, File f, List<TileSourceTemplate> toFindUrl){
this.ctx = ctx;
this.file = f;
if (f != null) {

View file

@ -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<AmenityType, LinkedHashSet<String>>(), 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<Amenity> result = application.getInternalAPI().searchAmenitiesByName(query,
List<Amenity> result = app.getResourceManager().searchAmenitiesByName(query,
topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, new ResultMatcher<Amenity>() {
boolean elimit = false;
@Override

View file

@ -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<HistoryEntry> 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);
}

View file

@ -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<String, String>();
// 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;

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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<DownloadEntry>(1)));
getEntriesToDownload().put(es, es.createDownloadEntry(getMyApplication(), type, new ArrayList<DownloadEntry>(1)));
}
}
}
@ -502,7 +501,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity {
return true;
}
List<DownloadEntry> download = e.createDownloadEntry(getClientContext(), type, new ArrayList<DownloadEntry>());
List<DownloadEntry> download = e.createDownloadEntry(getMyApplication(), type, new ArrayList<DownloadEntry>());
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();

View file

@ -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);

View file

@ -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());

View file

@ -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);
}

View file

@ -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);

View file

@ -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<? extends Activity> getSettingsActivity(){
return SettingsActivity.class;
}
public static Class<MapActivity> getMapActivity(){
return MapActivity.class;
}
public static Class<SearchActivity> getSearchActivity(){
return SearchActivity.class;
}
public static Class<FavouritesActivity> getFavoritesActivity(){
return FavouritesActivity.class;
}
public static Class<MainMenuActivity> getMainMenuActivity() {
return MainMenuActivity.class;
}
public static Class<? extends Activity> getDownloadIndexActivity() {
return DownloadIndexActivity.class;
}
public static Class<? extends Activity> getPluginsActivity() {
return PluginsActivity.class;
}
public static Class<? extends Activity> getLocalIndexActivity() {
return LocalIndexesActivity.class;
}
}

View file

@ -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);
}
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));
}
}, 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());

View file

@ -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 ||

View file

@ -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;
}

View file

@ -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);

View file

@ -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$
}

View file

@ -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<T> extends OsmandListActivity
final NamesAdapter namesAdapter = new NamesAdapter(new ArrayList<T>(), createComparator()); //$NON-NLS-1$
setListAdapter(namesAdapter);
collator = PlatformUtil.primaryCollator();
collator = OsmAndCollator.primaryCollator();
progress = (ProgressBar) findViewById(R.id.ProgressBar);

View file

@ -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<City>
private CityComparator(StringMatcherMode startsWith,
boolean en) {
this.startsWith = startsWith;
this.cs = PlatformUtil.primaryCollator();
this.cs = OsmAndCollator.primaryCollator();
this.en = en;
}

View file

@ -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);

View file

@ -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$
}
}

View file

@ -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);
}

View file

@ -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

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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<String, Object> map = new ConcurrentHashMap<String, Object>();
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<String, Object> modified = new LinkedHashMap<String, Object>();
@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<String, Object> modified) {
for(Entry<String, Object> 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));
}
}

View file

@ -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<Amenity> searchAmenities(PoiFilter filter,
double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude,
double lat, double lon, ResultMatcher<Amenity> matcher);
public List<Amenity> searchAmenitiesByName(String searchQuery,
double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude,
double lat, double lon, ResultMatcher<Amenity> 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();
}

View file

@ -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<Amenity> searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude,
double rightLongitude, double lat, double lon, ResultMatcher<Amenity> matcher) {
return app.getResourceManager().searchAmenities(filter, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher);
}
@Override
public List<Amenity> searchAmenitiesByName(String searchQuery, double topLatitude, double leftLongitude, double bottomLatitude,
double rightLongitude, double lat, double lon, ResultMatcher<Amenity> 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);
}
}

View file

@ -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,

View file

@ -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<IndexItem> 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<String, String> indexActivatedFileNames, Map<String, String> indexFileNames) {
@ -119,15 +123,17 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem
}
}
List<IndexItem> filter = new ArrayList<IndexItem>();
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<String> 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))) {

View file

@ -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> downloadEntry = basemap
.createDownloadEntry(uiActivity.getClientContext(), uiActivity.getType(),
.createDownloadEntry(uiActivity.getMyApplication(), uiActivity.getType(),
new ArrayList<DownloadEntry>());
uiActivity.getEntriesToDownload().put(basemap, downloadEntry);
AccessibleToast.makeText(uiActivity, R.string.basemap_was_selected_to_download,

View file

@ -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<DownloadEntry> createDownloadEntry(ClientContext ctx, DownloadActivityType type, List<DownloadEntry> res) {
public List<DownloadEntry> createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List<DownloadEntry> res) {
res.add(new DownloadEntry(this, assetName, destFile, dateModified));
return res;
}

View file

@ -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<String, String> getCustomVars(ClientContext ctx) {
private Map<String, String> getCustomVars(OsmandApplication ctx) {
Map<String, String> map = new LinkedHashMap<String, String>();
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<String, String> parameters = new LinkedHashMap<String, String>();
try {

View file

@ -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<IndexItem> {
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<IndexItem> {
return date;
}
public String getSizeDescription(ClientContext ctx) {
public String getSizeDescription(Context ctx) {
return size + " MB";
}
@ -141,7 +183,7 @@ public class IndexItem implements Comparable<IndexItem> {
return size;
}
public List<DownloadEntry> createDownloadEntry(ClientContext ctx, DownloadActivityType type,
public List<DownloadEntry> createDownloadEntry(OsmandApplication ctx, DownloadActivityType type,
List<DownloadEntry> downloadEntries) {
String fileName = this.fileName;
File parent = null;

View file

@ -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<IndexItemCategory> {
return order < another.order ? -1 : 1;
}
public static List<IndexItemCategory> categorizeIndexItems(ClientContext ctx, Collection<IndexItem> indexItems) {
public static List<IndexItemCategory> categorizeIndexItems(final OsmandApplication ctx,
Collection<IndexItem> indexItems) {
boolean skipWiki = Version.isFreeVersion(ctx);
final Map<String, IndexItemCategory> cats = new TreeMap<String, IndexItemCategory>();
for (IndexItem i : indexItems) {
@ -49,6 +54,9 @@ public class IndexItemCategory implements Comparable<IndexItemCategory> {
(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<IndexItemCategory> {
} 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<IndexItemCategory> {
cats.get(name).items.add(i);
}
ArrayList<IndexItemCategory> r = new ArrayList<IndexItemCategory>(cats.values());
final Collator collator = OsmAndCollator.primaryCollator();
for(IndexItemCategory ct : r) {
final OsmandRegions osmandRegions = ctx.getResourceManager().getOsmandRegions();
Collections.sort(ct.items, new Comparator<IndexItem>() {
@Override
public int compare(IndexItem lhs, IndexItem rhs) {
return collator.compare(lhs.getVisibleName(ctx, osmandRegions),
rhs.getVisibleName(ctx, osmandRegions));
}
});
}
Collections.sort(r);
return r;
}

View file

@ -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<AndroidAuthSession> 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<AndroidAuthSession>(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) {
}
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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<String, City>(PlatformUtil.primaryCollator());
this.collator = OsmAndCollator.primaryCollator();
this.postCodes = new TreeMap<String, City>(OsmAndCollator.primaryCollator());
}
@Override

View file

@ -176,6 +176,7 @@ public class ResourceManager {
}
}
public OsmandApplication getContext() {
return context;
}

View file

@ -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<RouteSegmentResult> list, Location start, LatLon end, List<LatLon> intermediates,
ClientContext ctx, boolean leftSide, float routingTime) {
Context ctx, boolean leftSide, float routingTime) {
this.routingTime = routingTime;
List<RouteDirectionInfo> computeDirections = new ArrayList<RouteDirectionInfo>();
this.errorMessage = null;
@ -141,7 +141,7 @@ public class RouteCalculationResult {
return Collections.emptyList();
}
private static void calculateIntermediateIndexes(ClientContext ctx, List<Location> locations,
private static void calculateIntermediateIndexes(Context ctx, List<Location> locations,
List<LatLon> intermediates, List<RouteDirectionInfo> 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<RouteSegmentResult> convertVectorResult(List<RouteDirectionInfo> directions, List<Location> locations, List<RouteSegmentResult> list,
List<AlarmInfo> alarms, ClientContext ctx) {
List<AlarmInfo> alarms, Context ctx) {
float prevDirectionTime = 0;
float prevDirectionDistance = 0;
List<RouteSegmentResult> segmentsToPopulate = new ArrayList<RouteSegmentResult>();
@ -296,7 +296,7 @@ public class RouteCalculationResult {
}
protected static void addMissingTurnsToRoute(List<Location> locations,
List<RouteDirectionInfo> originalDirections, Location start, LatLon end, ApplicationMode mode, ClientContext ctx,
List<RouteDirectionInfo> 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)) {

View file

@ -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);
}

View file

@ -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;

View file

@ -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<String> 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);

View file

@ -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();
}

View file

@ -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<String> 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;
}
}

View file

@ -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;
}

View file

@ -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 {

View file

@ -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();
}

View file

@ -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) {

View file

@ -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

View file

@ -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,12 +229,23 @@ 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");
if (mAudioFocusHelper != null) {

View file

@ -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<String> filesToPlay = Collections.synchronizedList(new ArrayList<String>());
public MediaCommandPlayerImpl(ClientContext ctx, String voiceProvider)
public MediaCommandPlayerImpl(OsmandApplication ctx, String voiceProvider)
throws CommandPlayerException
{
super(ctx, voiceProvider, CONFIG_FILE, MEDIA_VOICE_VERSION);

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

4
plugins/Osmand-Sherpafy/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
bin
gen
raw
obj

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Osmand-Sherpafy</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.osmand.sherpafy"
android:versionCode="6"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="16" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<supports-screens android:resizeable="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true"
android:xlargeScreens="true" android:anyDensity="true" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".SherpafyPluginActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager" forced_jdk="true">
<conelement value="com.android.ide.eclipse.adt.DEPENDENCIES" />
<src_description expected_position="1">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
<src_folder value="file://$MODULE_DIR$/gen" expected_position="1" />
<src_folder value="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" expected_position="2" />
<src_folder value="com.android.ide.eclipse.adt.LIBRARIES" expected_position="3" />
</src_description>
</component>
<component name="FacetManager">
<facet type="android" name="Android">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/bin/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Android 4.1.2 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View file

@ -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 *;
#}

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Some files were not shown because too many files have changed in this diff Show more