Merge branch 'refactorWorldRegion'
This commit is contained in:
commit
6851957b0d
11 changed files with 533 additions and 604 deletions
|
@ -9,6 +9,8 @@ import java.io.IOException;
|
||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -19,6 +21,7 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.ResultMatcher;
|
import net.osmand.ResultMatcher;
|
||||||
import net.osmand.binary.BinaryMapDataObject;
|
import net.osmand.binary.BinaryMapDataObject;
|
||||||
import net.osmand.binary.BinaryMapIndexReader;
|
import net.osmand.binary.BinaryMapIndexReader;
|
||||||
|
@ -33,7 +36,7 @@ import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
public class OsmandRegions {
|
public class OsmandRegions {
|
||||||
|
|
||||||
private static final String MAP_TYPE = "region_map";
|
public static final String MAP_TYPE = "region_map";
|
||||||
|
|
||||||
public static final String FIELD_LEFT_HAND_DRIVING = "left_hand_driving";
|
public static final String FIELD_LEFT_HAND_DRIVING = "left_hand_driving";
|
||||||
public static final String FIELD_DOWNLOAD_NAME = "download_name";
|
public static final String FIELD_DOWNLOAD_NAME = "download_name";
|
||||||
|
@ -46,27 +49,21 @@ public class OsmandRegions {
|
||||||
public static final String FIELD_ROAD_SIGNS = "road_signs";
|
public static final String FIELD_ROAD_SIGNS = "road_signs";
|
||||||
|
|
||||||
private BinaryMapIndexReader reader;
|
private BinaryMapIndexReader reader;
|
||||||
|
private String locale = "en";
|
||||||
Map<String, RegionData> fullNamesToRegionData = new HashMap<String, RegionData>();
|
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmandRegions.class);
|
||||||
Map<String, LinkedList<BinaryMapDataObject>> countriesByDownloadName = new HashMap<String, LinkedList<BinaryMapDataObject>>();
|
|
||||||
Map<String, String> downloadNamesToFullNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToLocaleNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesNoParentToLocaleNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullMapNamesToDownloadNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToLowercaseIndex = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToParentFullNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToDownloadNames = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToLangs = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToMetrics = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToLeftHandDrivings = new HashMap<String, String>();
|
|
||||||
// Map<String, String> fullNamesToRoadSigns = new HashMap<String, String>();
|
|
||||||
|
|
||||||
QuadTree<String> quadTree = null ;
|
WorldRegion worldRegion = new WorldRegion(WorldRegion.WORLD);
|
||||||
String locale = "en";
|
Map<String, WorldRegion> fullNamesToRegionData = new HashMap<String, WorldRegion>();
|
||||||
MapIndexFields mapIndexFields = new MapIndexFields();
|
Map<String, String> downloadNamesToFullNames = new HashMap<String, String>();
|
||||||
|
Map<String, LinkedList<BinaryMapDataObject>> countriesByDownloadName = new HashMap<String, LinkedList<BinaryMapDataObject>>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QuadTree<String> quadTree ;
|
||||||
|
MapIndexFields mapIndexFields ;
|
||||||
|
RegionTranslation translator;
|
||||||
|
|
||||||
private class MapIndexFields {
|
private class MapIndexFields {
|
||||||
MapIndex mapIndex;
|
|
||||||
Integer parentFullName = null;
|
Integer parentFullName = null;
|
||||||
Integer fullNameType = null;
|
Integer fullNameType = null;
|
||||||
Integer downloadNameType = null;
|
Integer downloadNameType = null;
|
||||||
|
@ -77,13 +74,67 @@ public class OsmandRegions {
|
||||||
Integer metricType = null;
|
Integer metricType = null;
|
||||||
Integer leftHandDrivingType = null;
|
Integer leftHandDrivingType = null;
|
||||||
Integer roadSignsType = null;
|
Integer roadSignsType = null;
|
||||||
|
|
||||||
|
public String get(Integer tp, BinaryMapDataObject object) {
|
||||||
|
if(tp == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return object.getNameByType(tp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setTranslator(RegionTranslation translator) {
|
||||||
|
this.translator = translator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void prepareFile(String fileName) throws IOException {
|
public void prepareFile(String fileName) throws IOException {
|
||||||
reader = new BinaryMapIndexReader(new RandomAccessFile(fileName, "r"), new File(fileName));
|
reader = new BinaryMapIndexReader(new RandomAccessFile(fileName, "r"), new File(fileName));
|
||||||
initLocaleNames();
|
// final Collator clt = OsmAndCollator.primaryCollator();
|
||||||
|
final Map<String, String> parentRelations = new LinkedHashMap<String, String>();
|
||||||
|
final ResultMatcher<BinaryMapDataObject> resultMatcher = new ResultMatcher<BinaryMapDataObject>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean publish(BinaryMapDataObject object) {
|
||||||
|
initTypes(object);
|
||||||
|
int[] types = object.getTypes();
|
||||||
|
for(int i = 0; i < types.length; i++ ) {
|
||||||
|
TagValuePair tp = object.getMapIndex().decodeType(types[i]);
|
||||||
|
if("boundary".equals(tp.value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WorldRegion rd = initRegionData(parentRelations, object);
|
||||||
|
if(rd == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(rd.regionDownloadName != null) {
|
||||||
|
downloadNamesToFullNames.put(rd.regionDownloadName, rd.regionFullName);
|
||||||
|
}
|
||||||
|
fullNamesToRegionData.put(rd.regionFullName, rd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
iterateOverAllObjects(resultMatcher);
|
||||||
|
// post process download names
|
||||||
|
for(Map.Entry<String, String> e : parentRelations.entrySet()) {
|
||||||
|
String fullName = e.getKey();
|
||||||
|
String parentFullName = e.getValue();
|
||||||
|
// String parentParentFulName = parentRelations.get(parentFullName); // could be used for japan/russia
|
||||||
|
WorldRegion rd = fullNamesToRegionData.get(fullName);
|
||||||
|
WorldRegion parent = fullNamesToRegionData.get(parentFullName);
|
||||||
|
if(parent != null && rd != null) {
|
||||||
|
parent.addSubregion(rd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
structureWorldRegions(new ArrayList<WorldRegion>(fullNamesToRegionData.values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsCountry(String name){
|
public boolean containsCountry(String name){
|
||||||
|
@ -95,91 +146,44 @@ public class OsmandRegions {
|
||||||
final String lc = downloadName.toLowerCase();
|
final String lc = downloadName.toLowerCase();
|
||||||
if (downloadNamesToFullNames.containsKey(lc)) {
|
if (downloadNamesToFullNames.containsKey(lc)) {
|
||||||
String fullName = downloadNamesToFullNames.get(lc);
|
String fullName = downloadNamesToFullNames.get(lc);
|
||||||
if (includingParent) {
|
return getLocaleNameByFullName(fullName, includingParent);
|
||||||
if (fullNamesToLocaleNames.containsKey(fullName)) {
|
|
||||||
return fullNamesToLocaleNames.get(fullName);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (fullNamesNoParentToLocaleNames.containsKey(fullName)) {
|
|
||||||
return fullNamesNoParentToLocaleNames.get(fullName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return downloadName.replace('_', ' ');
|
return downloadName.replace('_', ' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLocaleNameByFullName(String fullName, boolean includingParent) {
|
public String getLocaleNameByFullName(String fullName, boolean includingParent) {
|
||||||
if (includingParent) {
|
WorldRegion rd = fullNamesToRegionData.get(fullName);
|
||||||
if (fullNamesToLocaleNames.containsKey(fullName)) {
|
if(rd == null) {
|
||||||
return fullNamesToLocaleNames.get(fullName);
|
return fullName.replace('_', ' ');
|
||||||
} else {
|
}
|
||||||
return fullName.replace('_', ' ');
|
if (includingParent && rd.getSuperregion() != null && rd.getSuperregion().getSuperregion() != null) {
|
||||||
|
WorldRegion parentParent = rd.getSuperregion().getSuperregion();
|
||||||
|
WorldRegion parent = rd.getSuperregion();
|
||||||
|
if(parentParent.getRegionId().equals(WorldRegion.WORLD) &&
|
||||||
|
!parent.getRegionId().equals(WorldRegion.RUSSIA_REGION_ID)) {
|
||||||
|
return rd.getLocaleName();
|
||||||
}
|
}
|
||||||
|
if(parentParent.getRegionId().equals(WorldRegion.RUSSIA_REGION_ID)) {
|
||||||
|
return parentParent.getRegionId() + " " + rd.getLocaleName();
|
||||||
|
}
|
||||||
|
if(parentParent.getRegionId().equals(WorldRegion.JAPAN_REGION_ID)) {
|
||||||
|
return parentParent.getRegionId() + " " + rd.getLocaleName();
|
||||||
|
}
|
||||||
|
return parent.getLocaleName() + " " + rd.getLocaleName();
|
||||||
} else {
|
} else {
|
||||||
if (fullNamesNoParentToLocaleNames.containsKey(fullName)) {
|
return rd.getLocaleName();
|
||||||
return fullNamesNoParentToLocaleNames.get(fullName);
|
|
||||||
} else {
|
|
||||||
return fullName.replace('_', ' ');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDownloadNameIndexLowercase(String downloadName) {
|
|
||||||
if(downloadName == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final String lc = downloadName.toLowerCase();
|
|
||||||
if (downloadNamesToFullNames.containsKey(lc)) {
|
|
||||||
String fullName = downloadNamesToFullNames.get(lc);
|
|
||||||
if (fullNamesToLowercaseIndex.containsKey(fullName)) {
|
|
||||||
return fullNamesToLowercaseIndex.get(fullName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLocaleName(BinaryMapDataObject object) {
|
public WorldRegion getWorldRegion() {
|
||||||
String locName = "";
|
return worldRegion;
|
||||||
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 getParentFullName(BinaryMapDataObject o) {
|
|
||||||
if(parentFullName == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return o.getNameByType(parentFullName);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public String getFullName(BinaryMapDataObject o) {
|
|
||||||
if(fullNameType == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return o.getNameByType(fullNameType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInitialized(){
|
public boolean isInitialized(){
|
||||||
return reader != null;
|
return reader != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean contain(BinaryMapDataObject bo, int tx, int ty) {
|
public boolean contain(BinaryMapDataObject bo, int tx, int ty) {
|
||||||
int t = 0;
|
int t = 0;
|
||||||
for (int i = 1; i < bo.getPointsLength(); i++) {
|
for (int i = 1; i < bo.getPointsLength(); i++) {
|
||||||
|
@ -195,7 +199,6 @@ public class OsmandRegions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean intersect(BinaryMapDataObject bo, int lx, int ty, int rx, int by) {
|
public boolean intersect(BinaryMapDataObject bo, int lx, int ty, int rx, int by) {
|
||||||
int t = 0;
|
|
||||||
// 1. polygon in object
|
// 1. polygon in object
|
||||||
if(contain(bo, lx, ty)) {
|
if(contain(bo, lx, ty)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -338,127 +341,85 @@ public class OsmandRegions {
|
||||||
this.locale = locale;
|
this.locale = locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMapDownloadType(String fullname) {
|
|
||||||
return fullMapNamesToDownloadNames.get(fullname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDownloadName(String fullname) {
|
public WorldRegion getRegionData(String fullname) {
|
||||||
return fullNamesToDownloadNames.get(fullname);
|
return fullNamesToRegionData.get(fullname);
|
||||||
}
|
|
||||||
|
|
||||||
public String getParentFullName(String fullname) {
|
|
||||||
return fullNamesToParentFullNames.get(fullname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initLocaleNames() throws IOException {
|
|
||||||
// final Collator clt = OsmAndCollator.primaryCollator();
|
|
||||||
final Map<String, String> parentRelations = new LinkedHashMap<String, String>();
|
|
||||||
final ResultMatcher<BinaryMapDataObject> resultMatcher = new ResultMatcher<BinaryMapDataObject>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean publish(BinaryMapDataObject object) {
|
|
||||||
initTypes(object);
|
|
||||||
int[] types = object.getTypes();
|
|
||||||
for(int i = 0; i < types.length; i++ ) {
|
|
||||||
TagValuePair tp = object.getMapIndex().decodeType(types[i]);
|
|
||||||
if("boundary".equals(tp.value)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String parentFullName = getParentFullName(object);
|
|
||||||
String fullName = getFullName(object);
|
|
||||||
if(!Algorithms.isEmpty(parentFullName)) {
|
|
||||||
fullNamesToParentFullNames.put(fullName, parentFullName);
|
|
||||||
parentRelations.put(fullName, parentFullName);
|
|
||||||
}
|
|
||||||
String locName = getLocaleName(object);
|
|
||||||
if(!Algorithms.isEmpty(locName)){
|
|
||||||
fullNamesToLocaleNames.put(fullName, locName);
|
|
||||||
fullNamesNoParentToLocaleNames.put(fullName, locName);
|
|
||||||
}
|
|
||||||
|
|
||||||
String lang = getLang(object);
|
|
||||||
if(!Algorithms.isEmpty(lang)){
|
|
||||||
fullNamesToLangs.put(fullName, lang);
|
|
||||||
}
|
|
||||||
String metric = getMetric(object);
|
|
||||||
if(!Algorithms.isEmpty(metric)){
|
|
||||||
fullNamesToMetrics.put(fullName, metric);
|
|
||||||
}
|
|
||||||
String leftHandDriving = getLeftHandDriving(object);
|
|
||||||
if(!Algorithms.isEmpty(leftHandDriving)){
|
|
||||||
fullNamesToLeftHandDrivings.put(fullName, leftHandDriving);
|
|
||||||
}
|
|
||||||
String roadSigns = getRoadSigns(object);
|
|
||||||
if(!Algorithms.isEmpty(roadSigns)){
|
|
||||||
fullNamesToRoadSigns.put(fullName, roadSigns);
|
|
||||||
}
|
|
||||||
|
|
||||||
MapIndex mi = object.getMapIndex();
|
|
||||||
TIntObjectIterator<String> it = object.getObjectNames().iterator();
|
|
||||||
StringBuilder ind = new StringBuilder();
|
|
||||||
while(it.hasNext()) {
|
|
||||||
it.advance();
|
|
||||||
TagValuePair tp = mi.decodeType(it.key());
|
|
||||||
if (tp.tag.equals("key_name") && Algorithms.isEmpty(locName)) {
|
|
||||||
String str = Algorithms.capitalizeFirstLetterAndLowercase(it.value().replace('_', '-'));
|
|
||||||
fullNamesToLocaleNames.put(fullName, str);
|
|
||||||
fullNamesNoParentToLocaleNames.put(fullName, str);
|
|
||||||
}
|
|
||||||
if(tp.tag.startsWith("name") || tp.tag.equals("key_name")) {
|
|
||||||
final String vl = it.value().toLowerCase();
|
|
||||||
// if (!CollatorStringMatcher.ccontains(clt, ind.toString(), vl)) {
|
|
||||||
if(ind.indexOf(vl) == -1) {
|
|
||||||
ind.append(" ").append(vl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fullNamesToLowercaseIndex.put(fullName, ind.toString());
|
|
||||||
String downloadName = getDownloadName(object);
|
|
||||||
if(downloadName != null) {
|
|
||||||
fullNamesToDownloadNames.put(fullName, downloadName);
|
|
||||||
downloadNamesToFullNames.put(downloadName, fullName);
|
|
||||||
if(isDownloadOfType(object, MAP_TYPE)) {
|
|
||||||
fullMapNamesToDownloadNames.put(fullName, downloadName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCancelled() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
iterateOverAllObjects(resultMatcher);
|
|
||||||
// post process download names
|
|
||||||
for(Map.Entry<String, String> e : parentRelations.entrySet()) {
|
|
||||||
String fullName = e.getKey();
|
|
||||||
String parentFullName = e.getValue();
|
|
||||||
String parentParentFulName = parentRelations.get(parentFullName);
|
|
||||||
if(!Algorithms.isEmpty(parentFullName) &&
|
|
||||||
!Algorithms.isEmpty(parentParentFulName)) {
|
|
||||||
if(parentParentFulName.contains("russia") || parentParentFulName.contains("japan")) {
|
|
||||||
parentFullName = parentParentFulName;
|
|
||||||
}
|
|
||||||
String locPrefix = fullNamesToLocaleNames.get(parentFullName);
|
|
||||||
String locName = fullNamesToLocaleNames.get(fullName);
|
|
||||||
if(locPrefix == null || locName == null) {
|
|
||||||
throw new IllegalStateException("There is no prefix registered for " + fullName + " (" + parentFullName + ") ");
|
|
||||||
}
|
|
||||||
fullNamesToLocaleNames.put(fullName, locPrefix + " " + locName);
|
|
||||||
fullNamesNoParentToLocaleNames.put(fullName, locName);
|
|
||||||
// don't add parent to index
|
|
||||||
// String index = fullNamesToLowercaseIndex.get(fullName);
|
|
||||||
// String prindex = fullNamesToLowercaseIndex.get(parentFullName);
|
|
||||||
// fullNamesToLowercaseIndex.put(fullName, index + " " + prindex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isDownloadOfType(BinaryMapDataObject object, String type) {
|
public WorldRegion getRegionDataByDownloadName(String downloadName) {
|
||||||
|
return getRegionData(downloadNamesToFullNames.get(downloadName.toLowerCase()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDownloadName(BinaryMapDataObject o) {
|
||||||
|
return mapIndexFields.get(mapIndexFields.downloadNameType, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFullName(BinaryMapDataObject o) {
|
||||||
|
return mapIndexFields.get(mapIndexFields.fullNameType, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WorldRegion> getAllRegionData() {
|
||||||
|
return new ArrayList<WorldRegion>(fullNamesToRegionData.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private WorldRegion initRegionData(final Map<String, String> parentRelations, BinaryMapDataObject object) {
|
||||||
|
String regionDownloadName = mapIndexFields.get(mapIndexFields.downloadNameType, object);
|
||||||
|
String regionFullName = mapIndexFields.get(mapIndexFields.fullNameType, object);
|
||||||
|
if(Algorithms.isEmpty(regionFullName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
WorldRegion rd = new WorldRegion(regionFullName, regionDownloadName);
|
||||||
|
double cx = 0;
|
||||||
|
double cy = 0;
|
||||||
|
for (int i = 0; i < object.getPointsLength(); i++) {
|
||||||
|
cx += object.getPoint31XTile(i);
|
||||||
|
cy += object.getPoint31YTile(i);
|
||||||
|
}
|
||||||
|
if(object.getPointsLength() > 0) {
|
||||||
|
cx /= object.getPointsLength();
|
||||||
|
cy /= object.getPointsLength();
|
||||||
|
rd.regionCenter = new LatLon(MapUtils.get31LatitudeY((int) cy), MapUtils.get31LongitudeX((int) cx));
|
||||||
|
}
|
||||||
|
|
||||||
|
rd.regionParentFullName = mapIndexFields.get(mapIndexFields.parentFullName, object);
|
||||||
|
if(!Algorithms.isEmpty(rd.regionParentFullName)) {
|
||||||
|
parentRelations.put(rd.regionFullName, rd.regionParentFullName);
|
||||||
|
}
|
||||||
|
rd.regionName = mapIndexFields.get(mapIndexFields.nameType, object);
|
||||||
|
rd.regionNameLocale = mapIndexFields.get(mapIndexFields.nameLocaleType, object);
|
||||||
|
rd.regionNameEn = mapIndexFields.get(mapIndexFields.nameEnType, object);
|
||||||
|
rd.regionLang = mapIndexFields.get(mapIndexFields.langType, object);
|
||||||
|
rd.regionLeftHandDriving = mapIndexFields.get(mapIndexFields.leftHandDrivingType, object);
|
||||||
|
rd.regionMetric = mapIndexFields.get(mapIndexFields.metricType, object);
|
||||||
|
rd.regionRoadSigns = mapIndexFields.get(mapIndexFields.roadSignsType, object);
|
||||||
|
rd.regionSearchText = getSearchIndex(object);
|
||||||
|
rd.regionMapDownload = isDownloadOfType(object, MAP_TYPE);
|
||||||
|
return rd;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSearchIndex(BinaryMapDataObject object) {
|
||||||
|
MapIndex mi = object.getMapIndex();
|
||||||
|
TIntObjectIterator<String> it = object.getObjectNames().iterator();
|
||||||
|
StringBuilder ind = new StringBuilder();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
it.advance();
|
||||||
|
TagValuePair tp = mi.decodeType(it.key());
|
||||||
|
if(tp.tag.startsWith("name") || tp.tag.equals("key_name")) {
|
||||||
|
final String vl = it.value().toLowerCase();
|
||||||
|
// if (!CollatorStringMatcher.ccontains(clt, ind.toString(), vl)) {
|
||||||
|
if(ind.indexOf(vl) == -1) {
|
||||||
|
ind.append(" ").append(vl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ind.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isDownloadOfType(BinaryMapDataObject object, String type) {
|
||||||
int[] addtypes = object.getAdditionalTypes();
|
int[] addtypes = object.getAdditionalTypes();
|
||||||
for(int i = 0; i < addtypes.length; i++) {
|
for(int i = 0; i < addtypes.length; i++) {
|
||||||
TagValuePair tp = object.getMapIndex().decodeType(addtypes[i]);
|
TagValuePair tp = object.getMapIndex().decodeType(addtypes[i]);
|
||||||
|
@ -481,10 +442,7 @@ public class OsmandRegions {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
initTypes(object);
|
initTypes(object);
|
||||||
String nm = object.getNameByType(downloadNameType);
|
String nm = mapIndexFields.get(mapIndexFields.downloadNameType, object);
|
||||||
// if(nm != null) {
|
|
||||||
// System.out.println((c++) +" " + nm);
|
|
||||||
// }
|
|
||||||
if (!countriesByDownloadName.containsKey(nm)) {
|
if (!countriesByDownloadName.containsKey(nm)) {
|
||||||
LinkedList<BinaryMapDataObject> ls = new LinkedList<BinaryMapDataObject>();
|
LinkedList<BinaryMapDataObject> ls = new LinkedList<BinaryMapDataObject>();
|
||||||
countriesByDownloadName.put(nm, ls);
|
countriesByDownloadName.put(nm, ls);
|
||||||
|
@ -540,7 +498,7 @@ public class OsmandRegions {
|
||||||
private void initTypes(BinaryMapDataObject object) {
|
private void initTypes(BinaryMapDataObject object) {
|
||||||
if (mapIndexFields == null) {
|
if (mapIndexFields == null) {
|
||||||
mapIndexFields = new MapIndexFields();
|
mapIndexFields = new MapIndexFields();
|
||||||
mapIndexFields.mapIndex = object.getMapIndex();
|
// mapIndexFields.mapIndex = object.getMapIndex();
|
||||||
mapIndexFields.downloadNameType = object.getMapIndex().getRule(FIELD_DOWNLOAD_NAME, null);
|
mapIndexFields.downloadNameType = object.getMapIndex().getRule(FIELD_DOWNLOAD_NAME, null);
|
||||||
mapIndexFields.nameType = object.getMapIndex().getRule(FIELD_NAME, null);
|
mapIndexFields.nameType = object.getMapIndex().getRule(FIELD_NAME, null);
|
||||||
mapIndexFields.nameEnType = object.getMapIndex().getRule(FIELD_NAME_EN, null);
|
mapIndexFields.nameEnType = object.getMapIndex().getRule(FIELD_NAME_EN, null);
|
||||||
|
@ -563,7 +521,7 @@ public class OsmandRegions {
|
||||||
Set<String> found = new TreeSet<String>();
|
Set<String> found = new TreeSet<String>();
|
||||||
|
|
||||||
for (BinaryMapDataObject b : cs) {
|
for (BinaryMapDataObject b : cs) {
|
||||||
String nm = b.getNameByType(or.nameEnType);
|
String nm = b.getNameByType(or.mapIndexFields.nameEnType);
|
||||||
if(nm == null) {
|
if(nm == null) {
|
||||||
nm = b.getName();
|
nm = b.getName();
|
||||||
}
|
}
|
||||||
|
@ -582,6 +540,18 @@ public class OsmandRegions {
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
OsmandRegions or = new OsmandRegions();
|
OsmandRegions or = new OsmandRegions();
|
||||||
or.prepareFile("/Users/victorshcherb/osmand/repos/resources/countries-info/regions.ocbf");
|
or.prepareFile("/Users/victorshcherb/osmand/repos/resources/countries-info/regions.ocbf");
|
||||||
|
LinkedList<WorldRegion> lst = new LinkedList<WorldRegion>();
|
||||||
|
lst.add(or.getWorldRegion());
|
||||||
|
// int i =0;
|
||||||
|
while (!lst.isEmpty()) {
|
||||||
|
WorldRegion wd = lst.pollFirst();
|
||||||
|
System.out.println((wd.superregion == null ? "" : wd.superregion.getLocaleName()) + " "
|
||||||
|
+ wd.getLocaleName() + " " + wd.getRegionDownloadName());
|
||||||
|
// if(i++ <=5)
|
||||||
|
// lst.addAll(wd.getSubregions());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
or.cacheAllCountries();
|
or.cacheAllCountries();
|
||||||
// long t = System.currentTimeMillis();
|
// long t = System.currentTimeMillis();
|
||||||
// or.cacheAllCountries();
|
// or.cacheAllCountries();
|
||||||
|
@ -595,36 +565,88 @@ public class OsmandRegions {
|
||||||
testCountry(or, 35.7521, 139.7887, "japan");
|
testCountry(or, 35.7521, 139.7887, "japan");
|
||||||
testCountry(or, 46.5145, 102.2580, "mongolia");
|
testCountry(or, 46.5145, 102.2580, "mongolia");
|
||||||
testCountry(or, 62.54, 43.36, "arkhangelsk oblast", "northwestern federal district");
|
testCountry(or, 62.54, 43.36, "arkhangelsk oblast", "northwestern federal district");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public interface RegionTranslation {
|
||||||
|
|
||||||
|
public String getTranslation(String id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initWorldRegion(WorldRegion world, String id) {
|
||||||
|
WorldRegion rg = new WorldRegion(id);
|
||||||
|
rg.regionParentFullName = world.regionFullName;
|
||||||
|
if(translator != null) {
|
||||||
|
rg.regionName = translator.getTranslation(id);
|
||||||
|
}
|
||||||
|
world.addSubregion(rg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void structureWorldRegions(List<WorldRegion> loadedItems ) {
|
||||||
|
if (loadedItems.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WorldRegion world = new WorldRegion(WorldRegion.WORLD);
|
||||||
|
initWorldRegion(world, WorldRegion.AFRICA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.ASIA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.CENTRAL_AMERICA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.EUROPE_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.NORTH_AMERICA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.RUSSIA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.SOUTH_AMERICA_REGION_ID);
|
||||||
|
initWorldRegion(world, WorldRegion.AUSTRALIA_AND_OCEANIA_REGION_ID);
|
||||||
|
Iterator<WorldRegion> it = loadedItems.iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
WorldRegion region = it.next();
|
||||||
|
if(region.superregion == null) {
|
||||||
|
boolean found = false;
|
||||||
|
for(WorldRegion worldSubregion : world.subregions) {
|
||||||
|
if(worldSubregion.getRegionId().equalsIgnoreCase(region.regionFullName)) {
|
||||||
|
for(WorldRegion rg : region.subregions) {
|
||||||
|
worldSubregion.addSubregion(rg);
|
||||||
|
}
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(found) {
|
||||||
|
it.remove();
|
||||||
|
} else if(region.getRegionId().contains("basemap")) {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Comparator<WorldRegion> nameComparator = new Comparator<WorldRegion>() {
|
||||||
|
@Override
|
||||||
|
public int compare(WorldRegion w1, WorldRegion w2) {
|
||||||
|
return w1.getLocaleName().compareTo(w2.getLocaleName());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
sortSubregions(world, nameComparator);
|
||||||
|
|
||||||
public static class RegionData {
|
this.worldRegion = world;
|
||||||
String regionId;
|
if (loadedItems.size() > 0) {
|
||||||
private String downloadsId;
|
LOG.warn("Found orphaned regions: " + loadedItems.size());
|
||||||
private String name;
|
for (WorldRegion regionId : loadedItems) {
|
||||||
private String searchText;
|
LOG.warn("FullName = " + regionId.regionFullName +
|
||||||
private LatLon center;
|
" parent=" + regionId.regionParentFullName);
|
||||||
|
}
|
||||||
public LatLon getCenter() {
|
|
||||||
return center;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSearchText() {
|
|
||||||
return searchText;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRegionId() {
|
|
||||||
return regionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDownloadsId() {
|
|
||||||
return downloadsId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void sortSubregions(WorldRegion region, Comparator<WorldRegion> comparator) {
|
||||||
|
Collections.sort(region.subregions, comparator);
|
||||||
|
for (WorldRegion r : region.subregions) {
|
||||||
|
if (r.subregions.size() > 0) {
|
||||||
|
sortSubregions(r, comparator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
153
OsmAnd-java/src/net/osmand/map/WorldRegion.java
Normal file
153
OsmAnd-java/src/net/osmand/map/WorldRegion.java
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
package net.osmand.map;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.osmand.data.LatLon;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
public class WorldRegion {
|
||||||
|
|
||||||
|
public static final String WORLD_BASEMAP = "world_basemap";
|
||||||
|
public static final String AFRICA_REGION_ID = "africa";
|
||||||
|
public static final String ASIA_REGION_ID = "asia";
|
||||||
|
public static final String AUSTRALIA_AND_OCEANIA_REGION_ID = "australia-oceania";
|
||||||
|
public static final String CENTRAL_AMERICA_REGION_ID = "centralamerica";
|
||||||
|
public static final String EUROPE_REGION_ID = "europe";
|
||||||
|
public static final String NORTH_AMERICA_REGION_ID = "northamerica";
|
||||||
|
public static final String RUSSIA_REGION_ID = "russia";
|
||||||
|
public static final String JAPAN_REGION_ID = "japan_asia";
|
||||||
|
public static final String SOUTH_AMERICA_REGION_ID = "southamerica";
|
||||||
|
protected static final String WORLD = "world";
|
||||||
|
|
||||||
|
// Hierarchy
|
||||||
|
protected WorldRegion superregion;
|
||||||
|
protected List<WorldRegion> subregions;
|
||||||
|
|
||||||
|
// filled by osmand regions
|
||||||
|
protected String regionLeftHandDriving;
|
||||||
|
protected String regionLang;
|
||||||
|
protected String regionMetric;
|
||||||
|
protected String regionRoadSigns;
|
||||||
|
protected String regionFullName;
|
||||||
|
protected String regionParentFullName;
|
||||||
|
protected String regionName;
|
||||||
|
protected String regionNameEn;
|
||||||
|
protected String regionNameLocale;
|
||||||
|
protected String regionSearchText;
|
||||||
|
protected String regionDownloadName;
|
||||||
|
protected boolean regionMapDownload;
|
||||||
|
protected LatLon regionCenter;
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isRegionMapDownload() {
|
||||||
|
return regionMapDownload;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocaleName() {
|
||||||
|
if(!Algorithms.isEmpty(regionNameLocale)) {
|
||||||
|
return regionNameLocale;
|
||||||
|
}
|
||||||
|
if(!Algorithms.isEmpty(regionNameEn)) {
|
||||||
|
return regionNameEn;
|
||||||
|
}
|
||||||
|
if(!Algorithms.isEmpty(regionName)) {
|
||||||
|
return regionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return capitalize(regionFullName.replace('_', ' '));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionDownloadName() {
|
||||||
|
return regionDownloadName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionDownloadNameLC() {
|
||||||
|
return regionDownloadName == null ? null : regionDownloadName.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionLeftHandDriving() {
|
||||||
|
return regionLeftHandDriving;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionMetric() {
|
||||||
|
return regionMetric;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionRoadSigns() {
|
||||||
|
return regionRoadSigns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LatLon getRegionCenter() {
|
||||||
|
return regionCenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionSearchText() {
|
||||||
|
return regionSearchText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionLang() {
|
||||||
|
return regionLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public WorldRegion getSuperregion() {
|
||||||
|
return superregion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WorldRegion> getSubregions() {
|
||||||
|
return subregions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
WorldRegion that = (WorldRegion) o;
|
||||||
|
|
||||||
|
return !(regionFullName != null ? !regionFullName.toLowerCase().equals(that.regionFullName.toLowerCase()) : that.regionFullName != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return regionFullName != null ? regionFullName.hashCode() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WorldRegion(String regionFullName, String downloadName) {
|
||||||
|
this.regionFullName = regionFullName;
|
||||||
|
this.regionDownloadName = downloadName;
|
||||||
|
superregion = null;
|
||||||
|
subregions = new LinkedList<WorldRegion>();
|
||||||
|
|
||||||
|
}
|
||||||
|
public WorldRegion(String id) {
|
||||||
|
this(id, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionId() {
|
||||||
|
return regionFullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String capitalize(String s) {
|
||||||
|
String[] words = s.split(" ");
|
||||||
|
if (words[0].length() > 0) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(Algorithms.capitalizeFirstLetterAndLowercase(words[0]));
|
||||||
|
for (int i = 1; i < words.length; i++) {
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(Algorithms.capitalizeFirstLetterAndLowercase(words[i]));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} else {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSubregion(WorldRegion rd) {
|
||||||
|
subregions.add(rd);
|
||||||
|
rd.superregion = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,6 +14,8 @@ import net.osmand.IndexConstants;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.access.AccessibleAlertBuilder;
|
import net.osmand.access.AccessibleAlertBuilder;
|
||||||
import net.osmand.map.OsmandRegions;
|
import net.osmand.map.OsmandRegions;
|
||||||
|
import net.osmand.map.OsmandRegions.RegionTranslation;
|
||||||
|
import net.osmand.map.WorldRegion;
|
||||||
import net.osmand.osm.AbstractPoiType;
|
import net.osmand.osm.AbstractPoiType;
|
||||||
import net.osmand.osm.MapPoiTypes;
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.plus.activities.DayNightHelper;
|
import net.osmand.plus.activities.DayNightHelper;
|
||||||
|
@ -254,7 +256,7 @@ public class AppInitializer implements IProgress {
|
||||||
new FileOutputStream(file));
|
new FileOutputStream(file));
|
||||||
}
|
}
|
||||||
app.regions.prepareFile(file.getAbsolutePath());
|
app.regions.prepareFile(file.getAbsolutePath());
|
||||||
loadWorldRegions();
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
warnings.add(e.getMessage());
|
warnings.add(e.getMessage());
|
||||||
|
@ -262,9 +264,6 @@ public class AppInitializer implements IProgress {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadWorldRegions() {
|
|
||||||
app.worldRegion.loadWorldRegions(app);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPoiTypes() {
|
private void initPoiTypes() {
|
||||||
if(app.getAppPath("poi_types.xml").exists()) {
|
if(app.getAppPath("poi_types.xml").exists()) {
|
||||||
|
@ -317,16 +316,43 @@ public class AppInitializer implements IProgress {
|
||||||
app.selectedGpxHelper = startupInit(new GpxSelectionHelper(app, app.savingTrackHelper), GpxSelectionHelper.class);
|
app.selectedGpxHelper = startupInit(new GpxSelectionHelper(app, app.savingTrackHelper), GpxSelectionHelper.class);
|
||||||
app.favorites = startupInit(new FavouritesDbHelper(app), FavouritesDbHelper.class);
|
app.favorites = startupInit(new FavouritesDbHelper(app), FavouritesDbHelper.class);
|
||||||
app.waypointHelper = startupInit(new WaypointHelper(app), WaypointHelper.class);
|
app.waypointHelper = startupInit(new WaypointHelper(app), WaypointHelper.class);
|
||||||
app.worldRegion = startupInit(new WorldRegion(), WorldRegion.class);
|
|
||||||
app.worldRegion.initWorld();
|
|
||||||
app.regions = startupInit(new OsmandRegions(), OsmandRegions.class);
|
app.regions = startupInit(new OsmandRegions(), OsmandRegions.class);
|
||||||
app.regions.setLocale(app.getLanguage());
|
updateRegionVars();
|
||||||
app.poiFilters = startupInit(new PoiFiltersHelper(app), PoiFiltersHelper.class);
|
app.poiFilters = startupInit(new PoiFiltersHelper(app), PoiFiltersHelper.class);
|
||||||
app.rendererRegistry = startupInit(new RendererRegistry(app), RendererRegistry.class);
|
app.rendererRegistry = startupInit(new RendererRegistry(app), RendererRegistry.class);
|
||||||
app.targetPointsHelper = startupInit(new TargetPointsHelper(app), TargetPointsHelper.class);
|
app.targetPointsHelper = startupInit(new TargetPointsHelper(app), TargetPointsHelper.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void updateRegionVars() {
|
||||||
|
app.regions.setTranslator(new RegionTranslation() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTranslation(String id) {
|
||||||
|
if(WorldRegion.AFRICA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_africa);
|
||||||
|
} else if(WorldRegion.AUSTRALIA_AND_OCEANIA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_oceania);
|
||||||
|
} else if(WorldRegion.ASIA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_asia);
|
||||||
|
} else if(WorldRegion.CENTRAL_AMERICA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_central_america);
|
||||||
|
} else if(WorldRegion.EUROPE_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_europe);
|
||||||
|
} else if(WorldRegion.RUSSIA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_russia);
|
||||||
|
} else if(WorldRegion.NORTH_AMERICA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_north_america);
|
||||||
|
} else if(WorldRegion.SOUTH_AMERICA_REGION_ID.equals(id)){
|
||||||
|
return app.getString(R.string.index_name_south_america);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
app.regions.setLocale(app.getLanguage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private <T> T startupInit(T object, Class<T> class1) {
|
private <T> T startupInit(T object, Class<T> class1) {
|
||||||
long t = System.currentTimeMillis();
|
long t = System.currentTimeMillis();
|
||||||
|
|
|
@ -98,7 +98,6 @@ public class OsmandApplication extends Application {
|
||||||
AvoidSpecificRoads avoidSpecificRoads;
|
AvoidSpecificRoads avoidSpecificRoads;
|
||||||
BRouterServiceConnection bRouterServiceConnection;
|
BRouterServiceConnection bRouterServiceConnection;
|
||||||
OsmandRegions regions;
|
OsmandRegions regions;
|
||||||
WorldRegion worldRegion;
|
|
||||||
|
|
||||||
|
|
||||||
RoutingConfiguration.Builder defaultRoutingConfig;
|
RoutingConfiguration.Builder defaultRoutingConfig;
|
||||||
|
@ -659,9 +658,6 @@ public class OsmandApplication extends Application {
|
||||||
public OsmandRegions getRegions() {
|
public OsmandRegions getRegions() {
|
||||||
return regions;
|
return regions;
|
||||||
}
|
}
|
||||||
public WorldRegion getWorldRegion() {
|
|
||||||
return worldRegion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean accessibilityExtensions() {
|
public boolean accessibilityExtensions() {
|
||||||
return (Build.VERSION.SDK_INT < 14) ? getSettings().ACCESSIBILITY_EXTENSIONS.get() : false;
|
return (Build.VERSION.SDK_INT < 14) ? getSettings().ACCESSIBILITY_EXTENSIONS.get() : false;
|
||||||
|
|
|
@ -1,264 +0,0 @@
|
||||||
package net.osmand.plus;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.data.LatLon;
|
|
||||||
import net.osmand.map.OsmandRegions;
|
|
||||||
import net.osmand.util.Algorithms;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
|
|
||||||
public class WorldRegion {
|
|
||||||
|
|
||||||
public static final String AFRICA_REGION_ID = "africa";
|
|
||||||
public static final String ASIA_REGION_ID = "asia";
|
|
||||||
public static final String AUSTRALIA_AND_OCEANIA_REGION_ID = "australia-oceania";
|
|
||||||
public static final String CENTRAL_AMERICA_REGION_ID = "centralamerica";
|
|
||||||
public static final String EUROPE_REGION_ID = "europe";
|
|
||||||
public static final String NORTH_AMERICA_REGION_ID = "northamerica";
|
|
||||||
public static final String RUSSIA_REGION_ID = "russia";
|
|
||||||
public static final String SOUTH_AMERICA_REGION_ID = "southamerica";
|
|
||||||
public static final String WORLD = "world";
|
|
||||||
|
|
||||||
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(WorldRegion.class);
|
|
||||||
|
|
||||||
// Region data
|
|
||||||
private OsmandRegions.RegionData regionData;
|
|
||||||
|
|
||||||
// Hierarchy
|
|
||||||
private WorldRegion superregion;
|
|
||||||
private List<WorldRegion> subregions;
|
|
||||||
private List<WorldRegion> flattenedSubregions;
|
|
||||||
|
|
||||||
public OsmandRegions.RegionData getRegionData() {
|
|
||||||
return regionData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return regionData.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRegionId() {
|
|
||||||
return regionData.getRegionId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldRegion getSuperregion() {
|
|
||||||
return superregion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<WorldRegion> getSubregions() {
|
|
||||||
return subregions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<WorldRegion> getFlattenedSubregions() {
|
|
||||||
return flattenedSubregions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
|
|
||||||
WorldRegion that = (WorldRegion) o;
|
|
||||||
|
|
||||||
return !(getName() != null ? !getName().toLowerCase().equals(that.getName().toLowerCase()) : that.getName() != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return getName() != null ? getName().hashCode() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldRegion() {
|
|
||||||
superregion = null;
|
|
||||||
subregions = new LinkedList<>();
|
|
||||||
flattenedSubregions = new LinkedList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initWorld() {
|
|
||||||
regionId = "";
|
|
||||||
downloadsId = WORLD;
|
|
||||||
name = "";
|
|
||||||
superregion = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private WorldRegion init(String regionId, OsmandRegions osmandRegions, String name) {
|
|
||||||
this.regionId = regionId;
|
|
||||||
String downloadName = osmandRegions.getDownloadName(regionId);
|
|
||||||
if (downloadName != null) {
|
|
||||||
this.searchText = osmandRegions.getDownloadNameIndexLowercase(downloadName);
|
|
||||||
downloadsId = downloadName.toLowerCase();
|
|
||||||
} else {
|
|
||||||
downloadsId = regionId.toLowerCase();
|
|
||||||
}
|
|
||||||
if (name != null) {
|
|
||||||
this.name = name;
|
|
||||||
} else {
|
|
||||||
this.name = osmandRegions.getLocaleNameByFullName(regionId, false);
|
|
||||||
if (this.name == null) {
|
|
||||||
this.name = capitalize(regionId.replace('_', ' '));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void addSubregion(WorldRegion subregion, WorldRegion world) {
|
|
||||||
subregion.superregion = this;
|
|
||||||
subregions.add(subregion);
|
|
||||||
world.flattenedSubregions.add(subregion);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadWorldRegions(OsmandApplication app) {
|
|
||||||
OsmandRegions osmandRegions = app.getRegions();
|
|
||||||
Map<String, String> loadedItems = osmandRegions.getFullNamesToLowercaseCopy();
|
|
||||||
if (loadedItems.size() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
HashMap<String, WorldRegion> regionsLookupTable = new HashMap<>(loadedItems.size());
|
|
||||||
// Create main regions
|
|
||||||
Resources res = app.getResources();
|
|
||||||
|
|
||||||
WorldRegion africaRegion = createRegionAs(AFRICA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_africa));
|
|
||||||
addSubregion(africaRegion, this);
|
|
||||||
regionsLookupTable.put(africaRegion.regionId, africaRegion);
|
|
||||||
|
|
||||||
WorldRegion asiaRegion = createRegionAs(ASIA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_asia));
|
|
||||||
addSubregion(asiaRegion, this);
|
|
||||||
regionsLookupTable.put(asiaRegion.regionId, asiaRegion);
|
|
||||||
|
|
||||||
WorldRegion australiaAndOceaniaRegion = createRegionAs(AUSTRALIA_AND_OCEANIA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_oceania));
|
|
||||||
addSubregion(australiaAndOceaniaRegion, this);
|
|
||||||
regionsLookupTable.put(australiaAndOceaniaRegion.regionId, australiaAndOceaniaRegion);
|
|
||||||
|
|
||||||
WorldRegion centralAmericaRegion = createRegionAs(CENTRAL_AMERICA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_central_america));
|
|
||||||
addSubregion(centralAmericaRegion, this);
|
|
||||||
regionsLookupTable.put(centralAmericaRegion.getRegionId(), centralAmericaRegion);
|
|
||||||
|
|
||||||
WorldRegion europeRegion = createRegionAs(EUROPE_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_europe));
|
|
||||||
addSubregion(europeRegion, this);
|
|
||||||
regionsLookupTable.put(europeRegion.getRegionId(), europeRegion);
|
|
||||||
|
|
||||||
WorldRegion northAmericaRegion = createRegionAs(NORTH_AMERICA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_north_america));
|
|
||||||
addSubregion(northAmericaRegion, this);
|
|
||||||
regionsLookupTable.put(northAmericaRegion.getRegionId(), northAmericaRegion);
|
|
||||||
|
|
||||||
WorldRegion russiaRegion = createRegionAs(RUSSIA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_russia));
|
|
||||||
addSubregion(russiaRegion, this);
|
|
||||||
regionsLookupTable.put(russiaRegion.getRegionId(), russiaRegion);
|
|
||||||
|
|
||||||
WorldRegion southAmericaRegion = createRegionAs(SOUTH_AMERICA_REGION_ID,
|
|
||||||
loadedItems, osmandRegions, res.getString(R.string.index_name_south_america));
|
|
||||||
addSubregion(southAmericaRegion, this);
|
|
||||||
regionsLookupTable.put(southAmericaRegion.getRegionId(), southAmericaRegion);
|
|
||||||
|
|
||||||
// Process all regions
|
|
||||||
for (; ; ) {
|
|
||||||
int processedRegions = 0;
|
|
||||||
Iterator<Entry<String, String>> iterator = loadedItems.entrySet().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
String regionId = iterator.next().getKey();
|
|
||||||
String parentRegionId = osmandRegions.getParentFullName(regionId);
|
|
||||||
if (parentRegionId == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to find parent of this region
|
|
||||||
WorldRegion parentRegion = regionsLookupTable.get(parentRegionId);
|
|
||||||
if (parentRegion == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldRegion newRegion = new WorldRegion().init(regionId, osmandRegions, null);
|
|
||||||
parentRegion.addSubregion(newRegion, this);
|
|
||||||
regionsLookupTable.put(newRegion.getRegionId(), newRegion);
|
|
||||||
|
|
||||||
// Remove
|
|
||||||
processedRegions++;
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If all remaining are orphans, that's all
|
|
||||||
if (processedRegions == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Comparator<WorldRegion> nameComparator = new Comparator<WorldRegion>() {
|
|
||||||
@Override
|
|
||||||
public int compare(WorldRegion w1, WorldRegion w2) {
|
|
||||||
return w1.getName().compareTo(w2.getName());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
sortSubregions(this, nameComparator);
|
|
||||||
|
|
||||||
if (loadedItems.size() > 0) {
|
|
||||||
LOG.warn("Found orphaned regions: " + loadedItems.size());
|
|
||||||
for (String regionId : loadedItems.keySet()) {
|
|
||||||
LOG.warn("FullName = " + regionId + " parent=" + osmandRegions.getParentFullName(regionId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sortSubregions(WorldRegion region, Comparator<WorldRegion> comparator) {
|
|
||||||
Collections.sort(region.subregions, comparator);
|
|
||||||
for (WorldRegion r : region.subregions) {
|
|
||||||
if (r.subregions.size() > 0) {
|
|
||||||
sortSubregions(r, comparator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static WorldRegion createRegionAs(String regionId, Map<String, String> loadedItems,
|
|
||||||
OsmandRegions osmandRegions, String localizedName) {
|
|
||||||
WorldRegion worldRegion = new WorldRegion().init(regionId, osmandRegions, localizedName);
|
|
||||||
loadedItems.remove(regionId);
|
|
||||||
return worldRegion;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String capitalize(String s) {
|
|
||||||
String[] words = s.split(" ");
|
|
||||||
if (words[0].length() > 0) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(Algorithms.capitalizeFirstLetterAndLowercase(words[0]));
|
|
||||||
for (int i = 1; i < words.length; i++) {
|
|
||||||
sb.append(" ");
|
|
||||||
sb.append(Algorithms.capitalizeFirstLetterAndLowercase(words[i]));
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
} else {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldRegion getRegionById(String regionId) {
|
|
||||||
if (regionId.length() == 0) {
|
|
||||||
return this;
|
|
||||||
} else {
|
|
||||||
for (WorldRegion region : flattenedSubregions) {
|
|
||||||
if (region != null && region.getRegionId().equals(regionId)) {
|
|
||||||
return region;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,39 @@
|
||||||
package net.osmand.plus.download;
|
package net.osmand.plus.download;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.osmand.IProgress;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
|
import net.osmand.access.AccessibleToast;
|
||||||
|
import net.osmand.map.WorldRegion;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandSettings;
|
||||||
|
import net.osmand.plus.OsmandSettings.DrivingRegion;
|
||||||
|
import net.osmand.plus.OsmandSettings.MetricsConstants;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.Version;
|
||||||
|
import net.osmand.plus.activities.ActionBarProgressActivity;
|
||||||
|
import net.osmand.plus.activities.LocalIndexInfo;
|
||||||
|
import net.osmand.plus.activities.TabActivity;
|
||||||
|
import net.osmand.plus.base.BasicProgressAsyncTask;
|
||||||
|
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
||||||
|
import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
|
||||||
|
import net.osmand.plus.download.ui.ActiveDownloadsDialogFragment;
|
||||||
|
import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment;
|
||||||
|
import net.osmand.plus.download.ui.DownloadResourceGroupFragment;
|
||||||
|
import net.osmand.plus.download.ui.LocalIndexesFragment;
|
||||||
|
import net.osmand.plus.download.ui.UpdatesIndexFragment;
|
||||||
|
import net.osmand.plus.views.controls.PagerSlidingTabStrip;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -17,39 +51,6 @@ import android.view.View;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import net.osmand.IProgress;
|
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.access.AccessibleToast;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
|
||||||
import net.osmand.plus.OsmandSettings;
|
|
||||||
import net.osmand.plus.OsmandSettings.DrivingRegion;
|
|
||||||
import net.osmand.plus.OsmandSettings.MetricsConstants;
|
|
||||||
import net.osmand.plus.R;
|
|
||||||
import net.osmand.plus.Version;
|
|
||||||
import net.osmand.plus.WorldRegion;
|
|
||||||
import net.osmand.plus.activities.ActionBarProgressActivity;
|
|
||||||
import net.osmand.plus.activities.LocalIndexInfo;
|
|
||||||
import net.osmand.plus.activities.TabActivity;
|
|
||||||
import net.osmand.plus.base.BasicProgressAsyncTask;
|
|
||||||
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
|
||||||
import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
|
|
||||||
import net.osmand.plus.download.ui.ActiveDownloadsDialogFragment;
|
|
||||||
import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment;
|
|
||||||
import net.osmand.plus.download.ui.DownloadResourceGroupFragment;
|
|
||||||
import net.osmand.plus.download.ui.LocalIndexesFragment;
|
|
||||||
import net.osmand.plus.download.ui.UpdatesIndexFragment;
|
|
||||||
import net.osmand.plus.views.controls.PagerSlidingTabStrip;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class DownloadActivity extends ActionBarProgressActivity implements DownloadEvents {
|
public class DownloadActivity extends ActionBarProgressActivity implements DownloadEvents {
|
||||||
private static final Log LOG = PlatformUtil.getLog(DownloadActivity.class);
|
private static final Log LOG = PlatformUtil.getLog(DownloadActivity.class);
|
||||||
|
@ -211,7 +212,7 @@ public class DownloadActivity extends ActionBarProgressActivity implements Downl
|
||||||
@UiThread
|
@UiThread
|
||||||
public void downloadHasFinished() {
|
public void downloadHasFinished() {
|
||||||
visibleBanner.updateBannerInProgress();
|
visibleBanner.updateBannerInProgress();
|
||||||
if(downloadItem != null && !WorldRegion.WORLD.equals(downloadItem.getDownloadsId())) {
|
if(downloadItem != null && !WorldRegion.WORLD_BASEMAP.equals(downloadItem.getRegionDownloadNameLC())) {
|
||||||
boolean firstMap = getMyApplication().getSettings().FIRST_MAP_IS_DOWNLOADED.get();
|
boolean firstMap = getMyApplication().getSettings().FIRST_MAP_IS_DOWNLOADED.get();
|
||||||
if(firstMap) {
|
if(firstMap) {
|
||||||
initSettingsFirstMap(downloadItem);
|
initSettingsFirstMap(downloadItem);
|
||||||
|
@ -500,9 +501,9 @@ public class DownloadActivity extends ActionBarProgressActivity implements Downl
|
||||||
// TODO test set correctly (4 tests): when you download first Australia, Japan, Luxembourgh, US
|
// TODO test set correctly (4 tests): when you download first Australia, Japan, Luxembourgh, US
|
||||||
getMyApplication().getSettings().FIRST_MAP_IS_DOWNLOADED.set(false);
|
getMyApplication().getSettings().FIRST_MAP_IS_DOWNLOADED.set(false);
|
||||||
DrivingRegion drg = null;
|
DrivingRegion drg = null;
|
||||||
boolean americanSigns = "american".equals(reg.getRoadSigns(getMyApplication().getRegions()));
|
boolean americanSigns = "american".equals(reg.getRegionRoadSigns());
|
||||||
boolean leftHand = "yes".equals(reg.getLeftHandDriving(getMyApplication().getRegions()));
|
boolean leftHand = "yes".equals(reg.getRegionLeftHandDriving());
|
||||||
MetricsConstants mc = "miles".equals(reg.getMetric(getMyApplication().getRegions())) ?
|
MetricsConstants mc = "miles".equals(reg.getRegionMetric()) ?
|
||||||
MetricsConstants.MILES_AND_FOOTS : MetricsConstants.KILOMETERS_AND_METERS;
|
MetricsConstants.MILES_AND_FOOTS : MetricsConstants.KILOMETERS_AND_METERS;
|
||||||
for (DrivingRegion r : DrivingRegion.values()) {
|
for (DrivingRegion r : DrivingRegion.values()) {
|
||||||
if(r.americanSigns == americanSigns && r.leftHandDriving == leftHand &&
|
if(r.americanSigns == americanSigns && r.leftHandDriving == leftHand &&
|
||||||
|
@ -514,7 +515,7 @@ public class DownloadActivity extends ActionBarProgressActivity implements Downl
|
||||||
if (drg != null) {
|
if (drg != null) {
|
||||||
getMyApplication().getSettings().DRIVING_REGION.set(drg);
|
getMyApplication().getSettings().DRIVING_REGION.set(drg);
|
||||||
}
|
}
|
||||||
String lng = reg.getLang(getMyApplication().getRegions());
|
String lng = reg.getRegionLang();
|
||||||
if (lng != null) {
|
if (lng != null) {
|
||||||
String setTts = null;
|
String setTts = null;
|
||||||
for (String s : OsmandSettings.TTS_AVAILABLE_VOICES) {
|
for (String s : OsmandSettings.TTS_AVAILABLE_VOICES) {
|
||||||
|
@ -550,7 +551,7 @@ public class DownloadActivity extends ActionBarProgressActivity implements Downl
|
||||||
List<IndexItem> list = worldMaps.getIndividualResources();
|
List<IndexItem> list = worldMaps.getIndividualResources();
|
||||||
if(list != null) {
|
if(list != null) {
|
||||||
for(IndexItem ii : list) {
|
for(IndexItem ii : list) {
|
||||||
if(ii.getBasename().equalsIgnoreCase("world_basemap")) {
|
if(ii.getBasename().equalsIgnoreCase(WorldRegion.WORLD_BASEMAP)) {
|
||||||
worldMap = ii;
|
worldMap = ii;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,26 +266,26 @@ public class DownloadActivityType {
|
||||||
}
|
}
|
||||||
return getBasename(indexItem);
|
return getBasename(indexItem);
|
||||||
}
|
}
|
||||||
final String bn = getBasename(indexItem);
|
final String basename = getBasename(indexItem);
|
||||||
if (bn.endsWith(FileNameTranslationHelper.WIKI_NAME)){
|
if (basename.endsWith(FileNameTranslationHelper.WIKI_NAME)){
|
||||||
return FileNameTranslationHelper.getWikiName(ctx,bn);
|
return FileNameTranslationHelper.getWikiName(ctx,basename);
|
||||||
}
|
}
|
||||||
// if (this == HILLSHADE_FILE){
|
// if (this == HILLSHADE_FILE){
|
||||||
// return FileNameTranslationHelper.getHillShadeName(ctx, osmandRegions, bn);
|
// return FileNameTranslationHelper.getHillShadeName(ctx, osmandRegions, bn);
|
||||||
// }
|
// }
|
||||||
final String lc = bn.toLowerCase();
|
final String lc = basename.toLowerCase();
|
||||||
String std = FileNameTranslationHelper.getStandardMapName(ctx, lc);
|
String std = FileNameTranslationHelper.getStandardMapName(ctx, lc);
|
||||||
if (std != null) {
|
if (std != null) {
|
||||||
return std;
|
return std;
|
||||||
}
|
}
|
||||||
if (bn.contains("addresses-nationwide")) {
|
if (basename.contains("addresses-nationwide")) {
|
||||||
final int ind = bn.indexOf("addresses-nationwide");
|
final int ind = basename.indexOf("addresses-nationwide");
|
||||||
String downloadName = bn.substring(0, ind - 1) + bn.substring(ind + "addresses-nationwide".length());
|
String downloadName = basename.substring(0, ind - 1) + basename.substring(ind + "addresses-nationwide".length());
|
||||||
return osmandRegions.getLocaleName(downloadName, includingParent) +
|
return osmandRegions.getLocaleName(downloadName, includingParent) +
|
||||||
" "+ ctx.getString(R.string.index_item_nation_addresses);
|
" "+ ctx.getString(R.string.index_item_nation_addresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
return osmandRegions.getLocaleName(bn, includingParent);
|
return osmandRegions.getLocaleName(basename, includingParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTargetFileName(IndexItem item) {
|
public String getTargetFileName(IndexItem item) {
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
package net.osmand.plus.download;
|
package net.osmand.plus.download;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -11,9 +8,11 @@ import java.util.List;
|
||||||
|
|
||||||
import net.osmand.OsmAndCollator;
|
import net.osmand.OsmAndCollator;
|
||||||
import net.osmand.map.OsmandRegions;
|
import net.osmand.map.OsmandRegions;
|
||||||
|
import net.osmand.map.WorldRegion;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.WorldRegion;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
@SuppressLint("DefaultLocale")
|
@SuppressLint("DefaultLocale")
|
||||||
public class DownloadResourceGroup {
|
public class DownloadResourceGroup {
|
||||||
|
@ -316,7 +315,7 @@ public class DownloadResourceGroup {
|
||||||
|
|
||||||
public String getName(Context ctx) {
|
public String getName(Context ctx) {
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
return region.getName();
|
return region.getLocaleName();
|
||||||
} else if (type != null && type.resId != -1) {
|
} else if (type != null && type.resId != -1) {
|
||||||
return ctx.getString(type.resId);
|
return ctx.getString(type.resId);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -12,8 +12,9 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import net.osmand.IndexConstants;
|
import net.osmand.IndexConstants;
|
||||||
|
import net.osmand.map.OsmandRegions;
|
||||||
|
import net.osmand.map.WorldRegion;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.WorldRegion;
|
|
||||||
import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem;
|
import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem;
|
||||||
|
|
||||||
public class DownloadResources extends DownloadResourceGroup {
|
public class DownloadResources extends DownloadResourceGroup {
|
||||||
|
@ -30,7 +31,7 @@ public class DownloadResources extends DownloadResourceGroup {
|
||||||
|
|
||||||
public DownloadResources(OsmandApplication app) {
|
public DownloadResources(OsmandApplication app) {
|
||||||
super(null, DownloadResourceGroupType.WORLD, "");
|
super(null, DownloadResourceGroupType.WORLD, "");
|
||||||
this.region = app.getWorldRegion();
|
this.region = app.getRegions().getWorldRegion();
|
||||||
this.app = app;
|
this.app = app;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,12 +210,7 @@ public class DownloadResources extends DownloadResourceGroup {
|
||||||
|
|
||||||
DownloadResourceGroup worldMaps = new DownloadResourceGroup(this, DownloadResourceGroupType.WORLD_MAPS);
|
DownloadResourceGroup worldMaps = new DownloadResourceGroup(this, DownloadResourceGroupType.WORLD_MAPS);
|
||||||
Map<WorldRegion, List<IndexItem> > groupByRegion = new LinkedHashMap<WorldRegion, List<IndexItem>>();
|
Map<WorldRegion, List<IndexItem> > groupByRegion = new LinkedHashMap<WorldRegion, List<IndexItem>>();
|
||||||
|
OsmandRegions regs = app.getRegions();
|
||||||
Map<String, WorldRegion> downloadIdForRegion = new LinkedHashMap<String, WorldRegion>();
|
|
||||||
for(WorldRegion wg : region.getFlattenedSubregions()) {
|
|
||||||
downloadIdForRegion.put(wg.getDownloadsId(), wg);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IndexItem ii : resources) {
|
for (IndexItem ii : resources) {
|
||||||
if (ii.getType() == DownloadActivityType.VOICE_FILE) {
|
if (ii.getType() == DownloadActivityType.VOICE_FILE) {
|
||||||
if (ii.getFileName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) {
|
if (ii.getFileName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) {
|
||||||
|
@ -225,7 +221,7 @@ public class DownloadResources extends DownloadResourceGroup {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String basename = ii.getBasename().toLowerCase();
|
String basename = ii.getBasename().toLowerCase();
|
||||||
WorldRegion wg = downloadIdForRegion.get(basename);
|
WorldRegion wg = regs.getRegionDataByDownloadName(basename);
|
||||||
if (wg != null) {
|
if (wg != null) {
|
||||||
if (!groupByRegion.containsKey(wg)) {
|
if (!groupByRegion.containsKey(wg)) {
|
||||||
groupByRegion.put(wg, new ArrayList<IndexItem>());
|
groupByRegion.put(wg, new ArrayList<IndexItem>());
|
||||||
|
|
|
@ -1,5 +1,26 @@
|
||||||
package net.osmand.plus.download.ui;
|
package net.osmand.plus.download.ui;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.osmand.Collator;
|
||||||
|
import net.osmand.OsmAndCollator;
|
||||||
|
import net.osmand.map.OsmandRegions;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandSettings;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.download.DownloadActivity;
|
||||||
|
import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion;
|
||||||
|
import net.osmand.plus.download.DownloadActivityType;
|
||||||
|
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
||||||
|
import net.osmand.plus.download.DownloadResourceGroup;
|
||||||
|
import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
|
||||||
|
import net.osmand.plus.download.DownloadResources;
|
||||||
|
import net.osmand.plus.download.IndexItem;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
|
@ -19,28 +40,6 @@ import android.widget.RelativeLayout;
|
||||||
import android.widget.RelativeLayout.LayoutParams;
|
import android.widget.RelativeLayout.LayoutParams;
|
||||||
import android.widget.SearchView;
|
import android.widget.SearchView;
|
||||||
|
|
||||||
import net.osmand.Collator;
|
|
||||||
import net.osmand.OsmAndCollator;
|
|
||||||
import net.osmand.map.OsmandRegions;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
|
||||||
import net.osmand.plus.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
|
||||||
import net.osmand.plus.download.DownloadActivity;
|
|
||||||
import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion;
|
|
||||||
import net.osmand.plus.download.DownloadActivityType;
|
|
||||||
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
|
||||||
import net.osmand.plus.download.DownloadResourceGroup;
|
|
||||||
import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
|
|
||||||
import net.osmand.plus.download.DownloadResources;
|
|
||||||
import net.osmand.plus.download.IndexItem;
|
|
||||||
import net.osmand.util.Algorithms;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class SearchDialogFragment extends DialogFragment implements DownloadEvents, OnItemClickListener {
|
public class SearchDialogFragment extends DialogFragment implements DownloadEvents, OnItemClickListener {
|
||||||
|
|
||||||
public static final String TAG = "SearchDialogFragment";
|
public static final String TAG = "SearchDialogFragment";
|
||||||
|
@ -330,8 +329,8 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
|
|
||||||
private void processGroup(DownloadResourceGroup group, List<Object> filter, List<List<String>> conds) {
|
private void processGroup(DownloadResourceGroup group, List<Object> filter, List<List<String>> conds) {
|
||||||
String name = null;
|
String name = null;
|
||||||
if (group.getRegion() != null && group.getRegion().getSearchText() != null) {
|
if (group.getRegion() != null && group.getRegion().getRegionSearchText() != null) {
|
||||||
name = group.getRegion().getSearchText().toLowerCase();
|
name = group.getRegion().getRegionSearchText().toLowerCase();
|
||||||
}
|
}
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
name = group.getName(ctx).toLowerCase();
|
name = group.getName(ctx).toLowerCase();
|
||||||
|
|
|
@ -12,6 +12,7 @@ import net.osmand.binary.BinaryMapDataObject;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
import net.osmand.map.OsmandRegions;
|
import net.osmand.map.OsmandRegions;
|
||||||
|
import net.osmand.map.WorldRegion;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.resources.ResourceManager;
|
import net.osmand.plus.resources.ResourceManager;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
@ -248,10 +249,10 @@ public class DownloadedRegionsLayer extends OsmandMapLayer {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String fullName = osmandRegions.getFullName(o);
|
String fullName = osmandRegions.getFullName(o);
|
||||||
String downloadName = osmandRegions.getMapDownloadType(fullName);
|
WorldRegion rd = osmandRegions.getRegionData(fullName);
|
||||||
if (!Algorithms.isEmpty(downloadName)) {
|
if (rd != null && rd.isRegionMapDownload() && rd.getRegionDownloadName() != null) {
|
||||||
String name = osmandRegions.getLocaleName(downloadName, true); // Algorithms.capitalizeFirstLetterAndLowercase(o.getName());
|
String name = rd.getLocaleName();
|
||||||
if (checkIfObjectDownloaded(downloadName)) {
|
if (checkIfObjectDownloaded(rd.getRegionDownloadName())) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!set.add(name)) {
|
if (!set.add(name)) {
|
||||||
|
|
Loading…
Reference in a new issue