Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
2f7eac35cb
17 changed files with 405 additions and 44 deletions
|
@ -11,7 +11,9 @@ import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.ResultMatcher;
|
import net.osmand.ResultMatcher;
|
||||||
|
@ -205,14 +207,16 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
|
|
||||||
public static class RouteRegion extends BinaryIndexPart {
|
public static class RouteRegion extends BinaryIndexPart {
|
||||||
public int regionsRead;
|
public int regionsRead;
|
||||||
|
public List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>();
|
||||||
|
public Map<String, Integer> decodingRules = null;
|
||||||
List<RouteSubregion> subregions = new ArrayList<RouteSubregion>();
|
List<RouteSubregion> subregions = new ArrayList<RouteSubregion>();
|
||||||
List<RouteSubregion> basesubregions = new ArrayList<RouteSubregion>();
|
List<RouteSubregion> basesubregions = new ArrayList<RouteSubregion>();
|
||||||
List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>();
|
|
||||||
|
|
||||||
int nameTypeRule = -1;
|
int nameTypeRule = -1;
|
||||||
int refTypeRule = -1;
|
int refTypeRule = -1;
|
||||||
int destinationTypeRule = -1;
|
int destinationTypeRule = -1;
|
||||||
int destinationRefTypeRule = -1;
|
int destinationRefTypeRule = -1;
|
||||||
|
private RouteRegion referenceRouteRegion;
|
||||||
|
|
||||||
public String getPartName() {
|
public String getPartName() {
|
||||||
return "Routing";
|
return "Routing";
|
||||||
|
@ -223,11 +227,28 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER;
|
return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int searchRouteEncodingRule(String tag, String value) {
|
||||||
|
if(decodingRules == null) {
|
||||||
|
decodingRules = new LinkedHashMap<String, Integer>();
|
||||||
|
for(int i = 1; i < routeEncodingRules.size(); i++) {
|
||||||
|
RouteTypeRule rt = routeEncodingRules.get(i);
|
||||||
|
String ks = rt.getTag() +"#" + (rt.getValue() == null ? "" : rt.getValue());
|
||||||
|
decodingRules.put(ks, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String k = tag +"#" + (value == null ? "" : value);
|
||||||
|
if(decodingRules.containsKey(k)) {
|
||||||
|
return decodingRules.get(k).intValue();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
public RouteTypeRule quickGetEncodingRule(int id) {
|
public RouteTypeRule quickGetEncodingRule(int id) {
|
||||||
return routeEncodingRules.get(id);
|
return routeEncodingRules.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initRouteEncodingRule(int id, String tags, String val) {
|
public void initRouteEncodingRule(int id, String tags, String val) {
|
||||||
|
decodingRules = null;
|
||||||
while (routeEncodingRules.size() <= id) {
|
while (routeEncodingRules.size() <= id) {
|
||||||
routeEncodingRules.add(null);
|
routeEncodingRules.add(null);
|
||||||
}
|
}
|
||||||
|
@ -291,6 +312,101 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public RouteDataObject adopt(RouteDataObject o) {
|
||||||
|
if(o.region == this || o.region == referenceRouteRegion) {
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(routeEncodingRules.isEmpty()) {
|
||||||
|
routeEncodingRules.addAll(o.region.routeEncodingRules);
|
||||||
|
referenceRouteRegion= o.region;
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
RouteDataObject rdo = new RouteDataObject(this);
|
||||||
|
rdo.pointsX = o.pointsX;
|
||||||
|
rdo.pointsY = o.pointsY;
|
||||||
|
rdo.id = o.id;
|
||||||
|
rdo.restrictions = o.restrictions;
|
||||||
|
|
||||||
|
if (o.types != null) {
|
||||||
|
rdo.types = new int[o.types.length];
|
||||||
|
for (int i = 0; i < o.types.length; i++) {
|
||||||
|
RouteTypeRule tp = o.region.routeEncodingRules.get(o.types[i]);
|
||||||
|
int ruleId = searchRouteEncodingRule(tp.getTag(), tp.getValue());
|
||||||
|
if(ruleId != -1) {
|
||||||
|
rdo.types[i] = ruleId;
|
||||||
|
} else {
|
||||||
|
ruleId = routeEncodingRules.size() ;
|
||||||
|
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
|
||||||
|
rdo.types[i] = ruleId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (o.pointTypes != null) {
|
||||||
|
rdo.pointTypes = new int[o.pointTypes.length][];
|
||||||
|
for (int i = 0; i < o.pointTypes.length; i++) {
|
||||||
|
if (o.pointTypes[i] != null) {
|
||||||
|
rdo.pointTypes[i] = new int[o.pointTypes[i].length];
|
||||||
|
for (int j = 0; j < o.pointTypes[i].length; j++) {
|
||||||
|
RouteTypeRule tp = o.region.routeEncodingRules.get(o.pointTypes[i][j]);
|
||||||
|
int ruleId = searchRouteEncodingRule(tp.getTag(), tp.getValue());
|
||||||
|
if(ruleId != -1) {
|
||||||
|
rdo.pointTypes[i][j] = ruleId;
|
||||||
|
} else {
|
||||||
|
ruleId = routeEncodingRules.size() ;
|
||||||
|
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
|
||||||
|
rdo.pointTypes[i][j] = ruleId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (o.nameIds != null) {
|
||||||
|
rdo.nameIds = new int[o.nameIds.length];
|
||||||
|
rdo.names = new TIntObjectHashMap<>();
|
||||||
|
for (int i = 0; i < o.nameIds.length; i++) {
|
||||||
|
RouteTypeRule tp = o.region.routeEncodingRules.get(o.nameIds[i]);
|
||||||
|
int ruleId = searchRouteEncodingRule(tp.getTag(), null);
|
||||||
|
if(ruleId != -1) {
|
||||||
|
rdo.nameIds[i] = ruleId;
|
||||||
|
} else {
|
||||||
|
ruleId = routeEncodingRules.size() ;
|
||||||
|
initRouteEncodingRule(ruleId, tp.getTag(), null);
|
||||||
|
rdo.nameIds[i] = ruleId;
|
||||||
|
}
|
||||||
|
rdo.names.put(ruleId, o.names.get(o.nameIds[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rdo.pointNames = o.pointNames;
|
||||||
|
if (o.pointNameTypes != null) {
|
||||||
|
rdo.pointNameTypes = new int[o.pointNameTypes.length][];
|
||||||
|
// rdo.pointNames = new String[o.pointNameTypes.length][];
|
||||||
|
for (int i = 0; i < o.pointNameTypes.length; i++) {
|
||||||
|
if (o.pointNameTypes[i] != null) {
|
||||||
|
rdo.pointNameTypes[i] = new int[o.pointNameTypes[i].length];
|
||||||
|
// rdo.pointNames[i] = new String[o.pointNameTypes[i].length];
|
||||||
|
for (int j = 0; j < o.pointNameTypes[i].length; j++) {
|
||||||
|
RouteTypeRule tp = o.region.routeEncodingRules.get(o.pointNameTypes[i][j]);
|
||||||
|
int ruleId = searchRouteEncodingRule(tp.getTag(), null);
|
||||||
|
if(ruleId != -1) {
|
||||||
|
rdo.pointNameTypes[i][j] = ruleId;
|
||||||
|
} else {
|
||||||
|
ruleId = routeEncodingRules.size() ;
|
||||||
|
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
|
||||||
|
rdo.pointNameTypes[i][j] = ruleId;
|
||||||
|
}
|
||||||
|
// rdo.pointNames[i][j] = o.pointNames[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rdo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used in C++
|
// Used in C++
|
||||||
|
@ -360,7 +476,7 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
|
|
||||||
|
|
||||||
protected void readRouteIndex(RouteRegion region) throws IOException {
|
protected void readRouteIndex(RouteRegion region) throws IOException {
|
||||||
int routeEncodingRule =1;
|
int routeEncodingRule = 1;
|
||||||
while(true){
|
while(true){
|
||||||
int t = codedIS.readTag();
|
int t = codedIS.readTag();
|
||||||
int tag = WireFormat.getTagFieldNumber(t);
|
int tag = WireFormat.getTagFieldNumber(t);
|
||||||
|
|
|
@ -4,6 +4,7 @@ package net.osmand.binary;
|
||||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||||
|
@ -63,6 +64,105 @@ public class RouteDataObject {
|
||||||
this.id = copy.id;
|
this.id = copy.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean compareRoute(RouteDataObject thatObj) {
|
||||||
|
if (this.id == thatObj.id
|
||||||
|
&& Arrays.equals(this.pointsX, thatObj.pointsX)
|
||||||
|
&& Arrays.equals(this.pointsY, thatObj.pointsY)) {
|
||||||
|
if (this.region == null) {
|
||||||
|
throw new IllegalStateException("Illegal routing object: " + id);
|
||||||
|
}
|
||||||
|
if (thatObj.region == null) {
|
||||||
|
throw new IllegalStateException("Illegal routing object: " + thatObj.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean equals = true;
|
||||||
|
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
|
||||||
|
if (equals) {
|
||||||
|
if (this.names != null && thatObj.names != null) {
|
||||||
|
equals = Arrays.equals(this.names.values(), thatObj.names.values());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (equals) {
|
||||||
|
if (this.types == null || thatObj.types == null) {
|
||||||
|
equals = this.types == thatObj.types;
|
||||||
|
} else if (types.length != thatObj.types.length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < this.types.length && equals; i++) {
|
||||||
|
String thisTag = region.routeEncodingRules.get(types[i]).getTag();
|
||||||
|
String thisValue = region.routeEncodingRules.get(types[i]).getValue();
|
||||||
|
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.types[i]).getTag();
|
||||||
|
String thatValue = thatObj.region.routeEncodingRules.get(thatObj.types[i]).getValue();
|
||||||
|
equals = (thisTag.equals(thatTag) && thisValue.equals(thatValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (equals) {
|
||||||
|
if (this.nameIds == null || thatObj.nameIds == null) {
|
||||||
|
equals = this.nameIds == thatObj.nameIds;
|
||||||
|
} else if (nameIds.length != thatObj.nameIds.length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < this.nameIds.length && equals; i++) {
|
||||||
|
String thisTag = region.routeEncodingRules.get(nameIds[i]).getTag();
|
||||||
|
String thisValue = names.get(nameIds[i]);
|
||||||
|
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.nameIds[i]).getTag();
|
||||||
|
String thatValue = thatObj.names.get(thatObj.nameIds[i]);
|
||||||
|
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (equals) {
|
||||||
|
if (this.pointTypes == null || thatObj.pointTypes == null) {
|
||||||
|
equals = this.pointTypes == thatObj.pointTypes;
|
||||||
|
} else if (pointTypes.length != thatObj.pointTypes.length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < this.pointTypes.length && equals; i++) {
|
||||||
|
if (this.pointTypes[i] == null || thatObj.pointTypes[i] == null) {
|
||||||
|
equals = this.pointTypes[i] == thatObj.pointTypes[i];
|
||||||
|
} else if (pointTypes[i].length != thatObj.pointTypes[i].length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int j = 0; j < this.pointTypes[i].length && equals; j++) {
|
||||||
|
String thisTag = region.routeEncodingRules.get(pointTypes[i][j]).getTag();
|
||||||
|
String thisValue = region.routeEncodingRules.get(pointTypes[i][j]).getValue();
|
||||||
|
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.pointTypes[i][j]).getTag();
|
||||||
|
String thatValue = thatObj.region.routeEncodingRules.get(thatObj.pointTypes[i][j]).getValue();
|
||||||
|
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (equals) {
|
||||||
|
if (this.pointNameTypes == null || thatObj.pointNameTypes == null) {
|
||||||
|
equals = this.pointNameTypes == thatObj.pointNameTypes;
|
||||||
|
} else if (pointNameTypes.length != thatObj.pointNameTypes.length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < this.pointNameTypes.length && equals; i++) {
|
||||||
|
if (this.pointNameTypes[i] == null || thatObj.pointNameTypes[i] == null) {
|
||||||
|
equals = this.pointNameTypes[i] == thatObj.pointNameTypes[i];
|
||||||
|
} else if (pointNameTypes[i].length != thatObj.pointNameTypes[i].length) {
|
||||||
|
equals = false;
|
||||||
|
} else {
|
||||||
|
for (int j = 0; j < this.pointNameTypes[i].length && equals; j++) {
|
||||||
|
String thisTag = region.routeEncodingRules.get(pointNameTypes[i][j]).getTag();
|
||||||
|
String thisValue = pointNames[i][j];
|
||||||
|
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.pointNameTypes[i][j]).getTag();
|
||||||
|
String thatValue = thatObj.pointNames[i][j];
|
||||||
|
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public float[] calculateHeightArray() {
|
public float[] calculateHeightArray() {
|
||||||
if(heightDistanceArray != null) {
|
if(heightDistanceArray != null) {
|
||||||
return heightDistanceArray;
|
return heightDistanceArray;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
|
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="do_not_use_animations">Do not use animations</string>
|
<string name="do_not_use_animations">Do not use animations</string>
|
||||||
<string name="do_not_use_animations_descr">It disables animations in app</string>
|
<string name="do_not_use_animations_descr">Disables animations in the app</string>
|
||||||
<string name="keep_showing_on_map">Keep showing on map</string>
|
<string name="keep_showing_on_map">Keep showing on map</string>
|
||||||
<string name="exit_without_saving">Exit without saving?</string>
|
<string name="exit_without_saving">Exit without saving?</string>
|
||||||
<string name="line">Line</string>
|
<string name="line">Line</string>
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
<string name="do_not_send_anonymous_app_usage">Do not send anonymous app usage statistics</string>
|
<string name="do_not_send_anonymous_app_usage">Do not send anonymous app usage statistics</string>
|
||||||
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd collects information about which parts of the app you open. Your location is never sent, nor is anything you enter into the app or details of areas you view, search, or download.</string>
|
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd collects information about which parts of the app you open. Your location is never sent, nor is anything you enter into the app or details of areas you view, search, or download.</string>
|
||||||
<string name="do_not_show_startup_messages">Do not show messages at startup</string>
|
<string name="do_not_show_startup_messages">Do not show messages at startup</string>
|
||||||
<string name="do_not_show_startup_messages_desc">It displays app discounts & special local events messages</string>
|
<string name="do_not_show_startup_messages_desc">Suppresses displaying app discounts & special local event messages</string>
|
||||||
<string name="parking_options">Parking options</string>
|
<string name="parking_options">Parking options</string>
|
||||||
<string name="full_version_thanks">Thank you for purchasing the full version of OsmAnd!</string>
|
<string name="full_version_thanks">Thank you for purchasing the full version of OsmAnd!</string>
|
||||||
<string name="routing_attr_relief_smoothness_factor_hills_name">Hilly</string>
|
<string name="routing_attr_relief_smoothness_factor_hills_name">Hilly</string>
|
||||||
|
|
|
@ -22,6 +22,8 @@ import net.osmand.aidl.calculateroute.CalculateRouteParams;
|
||||||
|
|
||||||
import net.osmand.aidl.gpx.ImportGpxParams;
|
import net.osmand.aidl.gpx.ImportGpxParams;
|
||||||
import net.osmand.aidl.gpx.ShowGpxParams;
|
import net.osmand.aidl.gpx.ShowGpxParams;
|
||||||
|
import net.osmand.aidl.gpx.StartGpxRecordingParams;
|
||||||
|
import net.osmand.aidl.gpx.StopGpxRecordingParams;
|
||||||
import net.osmand.aidl.gpx.HideGpxParams;
|
import net.osmand.aidl.gpx.HideGpxParams;
|
||||||
import net.osmand.aidl.gpx.ASelectedGpxFile;
|
import net.osmand.aidl.gpx.ASelectedGpxFile;
|
||||||
|
|
||||||
|
@ -77,4 +79,7 @@ interface IOsmAndAidlInterface {
|
||||||
boolean removeFavorite(in RemoveFavoriteParams params);
|
boolean removeFavorite(in RemoveFavoriteParams params);
|
||||||
boolean updateFavorite(in UpdateFavoriteParams params);
|
boolean updateFavorite(in UpdateFavoriteParams params);
|
||||||
|
|
||||||
|
boolean startGpxRecording(in StartGpxRecordingParams params);
|
||||||
|
boolean stopGpxRecording(in StopGpxRecordingParams params);
|
||||||
|
|
||||||
}
|
}
|
|
@ -13,6 +13,8 @@ import net.osmand.IndexConstants;
|
||||||
import net.osmand.aidl.favorite.AFavorite;
|
import net.osmand.aidl.favorite.AFavorite;
|
||||||
import net.osmand.aidl.favorite.group.AFavoriteGroup;
|
import net.osmand.aidl.favorite.group.AFavoriteGroup;
|
||||||
import net.osmand.aidl.gpx.ASelectedGpxFile;
|
import net.osmand.aidl.gpx.ASelectedGpxFile;
|
||||||
|
import net.osmand.aidl.gpx.StartGpxRecordingParams;
|
||||||
|
import net.osmand.aidl.gpx.StopGpxRecordingParams;
|
||||||
import net.osmand.aidl.maplayer.AMapLayer;
|
import net.osmand.aidl.maplayer.AMapLayer;
|
||||||
import net.osmand.aidl.maplayer.point.AMapPoint;
|
import net.osmand.aidl.maplayer.point.AMapPoint;
|
||||||
import net.osmand.aidl.mapmarker.AMapMarker;
|
import net.osmand.aidl.mapmarker.AMapMarker;
|
||||||
|
@ -29,9 +31,11 @@ import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||||
import net.osmand.plus.MapMarkersHelper;
|
import net.osmand.plus.MapMarkersHelper;
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||||
import net.osmand.plus.helpers.ColorDialogs;
|
import net.osmand.plus.helpers.ColorDialogs;
|
||||||
|
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||||
import net.osmand.plus.views.AidlMapLayer;
|
import net.osmand.plus.views.AidlMapLayer;
|
||||||
import net.osmand.plus.views.MapInfoLayer;
|
import net.osmand.plus.views.MapInfoLayer;
|
||||||
import net.osmand.plus.views.OsmandMapLayer;
|
import net.osmand.plus.views.OsmandMapLayer;
|
||||||
|
@ -841,4 +845,24 @@ public class OsmandAidlApi {
|
||||||
app.sendBroadcast(intent);
|
app.sendBroadcast(intent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean startGpxRecording(StartGpxRecordingParams params) {
|
||||||
|
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||||
|
if (plugin != null) {
|
||||||
|
plugin.startGPXMonitoring(null);
|
||||||
|
plugin.updateControl();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean stopGpxRecording(StopGpxRecordingParams params) {
|
||||||
|
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||||
|
if (plugin != null) {
|
||||||
|
plugin.stopRecording();
|
||||||
|
plugin.updateControl();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@ import net.osmand.aidl.gpx.ASelectedGpxFile;
|
||||||
import net.osmand.aidl.gpx.HideGpxParams;
|
import net.osmand.aidl.gpx.HideGpxParams;
|
||||||
import net.osmand.aidl.gpx.ImportGpxParams;
|
import net.osmand.aidl.gpx.ImportGpxParams;
|
||||||
import net.osmand.aidl.gpx.ShowGpxParams;
|
import net.osmand.aidl.gpx.ShowGpxParams;
|
||||||
|
import net.osmand.aidl.gpx.StartGpxRecordingParams;
|
||||||
|
import net.osmand.aidl.gpx.StopGpxRecordingParams;
|
||||||
import net.osmand.aidl.map.SetMapLocationParams;
|
import net.osmand.aidl.map.SetMapLocationParams;
|
||||||
import net.osmand.aidl.maplayer.AddMapLayerParams;
|
import net.osmand.aidl.maplayer.AddMapLayerParams;
|
||||||
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
|
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
|
||||||
|
@ -320,5 +322,23 @@ public class OsmandAidlService extends Service {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startGpxRecording(StartGpxRecordingParams params) throws RemoteException {
|
||||||
|
try {
|
||||||
|
return getApi().startGpxRecording(params);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stopGpxRecording(StopGpxRecordingParams params) throws RemoteException {
|
||||||
|
try {
|
||||||
|
return getApi().stopGpxRecording(params);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
package net.osmand.aidl.gpx;
|
||||||
|
|
||||||
|
parcelable StartGpxRecordingParams;
|
40
OsmAnd/src/net/osmand/aidl/gpx/StartGpxRecordingParams.java
Normal file
40
OsmAnd/src/net/osmand/aidl/gpx/StartGpxRecordingParams.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package net.osmand.aidl.gpx;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
public class StartGpxRecordingParams implements Parcelable {
|
||||||
|
|
||||||
|
public StartGpxRecordingParams() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public StartGpxRecordingParams(Parcel in) {
|
||||||
|
readFromParcel(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<StartGpxRecordingParams> CREATOR = new Creator<StartGpxRecordingParams>() {
|
||||||
|
@Override
|
||||||
|
public StartGpxRecordingParams createFromParcel(Parcel in) {
|
||||||
|
return new StartGpxRecordingParams(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StartGpxRecordingParams[] newArray(int size) {
|
||||||
|
return new StartGpxRecordingParams[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel out, int flags) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readFromParcel(Parcel in) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
package net.osmand.aidl.gpx;
|
||||||
|
|
||||||
|
parcelable StopGpxRecordingParams;
|
40
OsmAnd/src/net/osmand/aidl/gpx/StopGpxRecordingParams.java
Normal file
40
OsmAnd/src/net/osmand/aidl/gpx/StopGpxRecordingParams.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package net.osmand.aidl.gpx;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
public class StopGpxRecordingParams implements Parcelable {
|
||||||
|
|
||||||
|
public StopGpxRecordingParams() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public StopGpxRecordingParams(Parcel in) {
|
||||||
|
readFromParcel(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<StopGpxRecordingParams> CREATOR = new Creator<StopGpxRecordingParams>() {
|
||||||
|
@Override
|
||||||
|
public StopGpxRecordingParams createFromParcel(Parcel in) {
|
||||||
|
return new StopGpxRecordingParams(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StopGpxRecordingParams[] newArray(int size) {
|
||||||
|
return new StopGpxRecordingParams[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel out, int flags) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readFromParcel(Parcel in) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -256,12 +256,17 @@ public class OsmandSettings {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWifiConnected() {
|
public boolean isWifiConnected() {
|
||||||
|
try {
|
||||||
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
NetworkInfo ni = mgr.getActiveNetworkInfo();
|
NetworkInfo ni = mgr.getActiveNetworkInfo();
|
||||||
return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI;
|
return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isInternetConnected() {
|
private boolean isInternetConnected() {
|
||||||
|
try {
|
||||||
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
NetworkInfo active = mgr.getActiveNetworkInfo();
|
NetworkInfo active = mgr.getActiveNetworkInfo();
|
||||||
if (active == null) {
|
if (active == null) {
|
||||||
|
@ -270,6 +275,9 @@ public class OsmandSettings {
|
||||||
NetworkInfo.State state = active.getState();
|
NetworkInfo.State state = active.getState();
|
||||||
return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING;
|
return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING;
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.text.format.DateFormat;
|
import android.text.format.DateFormat;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||||
import net.osmand.plus.GPXUtilities;
|
import net.osmand.plus.GPXUtilities;
|
||||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||||
import net.osmand.plus.GPXUtilities.GPXTrackAnalysis;
|
import net.osmand.plus.GPXUtilities.GPXTrackAnalysis;
|
||||||
|
@ -226,6 +227,11 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
||||||
warnings.add(warn);
|
warnings.add(warn);
|
||||||
return warnings;
|
return warnings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GPXFile gpx = data.get(f);
|
||||||
|
GPXTrackAnalysis analysis = gpx.getAnalysis(fout.lastModified());
|
||||||
|
GpxDataItem item = new GpxDataItem(fout, analysis);
|
||||||
|
ctx.getGpxDatabase().add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -479,6 +479,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
|
||||||
}
|
}
|
||||||
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_SHOW_STARTUP_MESSAGES, R.string.do_not_show_startup_messages, R.string.do_not_show_startup_messages_desc));
|
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_SHOW_STARTUP_MESSAGES, R.string.do_not_show_startup_messages, R.string.do_not_show_startup_messages_desc));
|
||||||
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_USE_ANIMATIONS, R.string.do_not_use_animations, R.string.do_not_use_animations_descr));
|
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_USE_ANIMATIONS, R.string.do_not_use_animations, R.string.do_not_use_animations_descr));
|
||||||
|
misc.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS, R.string.use_magnetic_sensor, R.string.use_magnetic_sensor_descr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,11 +51,6 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
|
||||||
cat.addPreference(createCheckBoxPreference(settings.USE_FAST_RECALCULATION,
|
cat.addPreference(createCheckBoxPreference(settings.USE_FAST_RECALCULATION,
|
||||||
R.string.use_fast_recalculation, R.string.use_fast_recalculation_desc));
|
R.string.use_fast_recalculation, R.string.use_fast_recalculation_desc));
|
||||||
|
|
||||||
|
|
||||||
cat.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS,
|
|
||||||
R.string.use_magnetic_sensor,
|
|
||||||
R.string.use_magnetic_sensor_descr));
|
|
||||||
|
|
||||||
final CheckBoxPreference openGlRender = createCheckBoxPreference(settings.USE_OPENGL_RENDER, R.string.use_opengl_render,R.string.use_opengl_render_descr);
|
final CheckBoxPreference openGlRender = createCheckBoxPreference(settings.USE_OPENGL_RENDER, R.string.use_opengl_render,R.string.use_opengl_render_descr);
|
||||||
cat.addPreference(openGlRender);
|
cat.addPreference(openGlRender);
|
||||||
|
|
||||||
|
|
|
@ -467,7 +467,7 @@ public class GpxUiHelper {
|
||||||
|
|
||||||
final ContextMenuItem item = adapter.getItem(position);
|
final ContextMenuItem item = adapter.getItem(position);
|
||||||
GPXInfo info = list.get(position);
|
GPXInfo info = list.get(position);
|
||||||
udpateGpxInfoView(v, item, info, getDataItem(info), showCurrentGpx && position == 0, app);
|
updateGpxInfoView(v, item, info, getDataItem(info), showCurrentGpx && position == 0, app);
|
||||||
|
|
||||||
if (item.getSelected() == null) {
|
if (item.getSelected() == null) {
|
||||||
v.findViewById(R.id.check_item).setVisibility(View.GONE);
|
v.findViewById(R.id.check_item).setVisibility(View.GONE);
|
||||||
|
@ -704,7 +704,7 @@ public class GpxUiHelper {
|
||||||
return dlg;
|
return dlg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void udpateGpxInfoView(View v, ContextMenuItem item, GPXInfo info, GpxDataItem dataItem, boolean currentlyRecordingTrack, OsmandApplication app) {
|
public static void updateGpxInfoView(View v, ContextMenuItem item, GPXInfo info, GpxDataItem dataItem, boolean currentlyRecordingTrack, OsmandApplication app) {
|
||||||
TextView viewName = ((TextView) v.findViewById(R.id.name));
|
TextView viewName = ((TextView) v.findViewById(R.id.name));
|
||||||
viewName.setText(item.getTitle().replace("/", " • ").trim());
|
viewName.setText(item.getTitle().replace("/", " • ").trim());
|
||||||
ImageView icon = (ImageView) v.findViewById(R.id.icon);
|
ImageView icon = (ImageView) v.findViewById(R.id.icon);
|
||||||
|
|
|
@ -1410,6 +1410,7 @@ public class MeasurementToolFragment extends Fragment {
|
||||||
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (showOnMapToggle.isChecked()) {
|
||||||
final String name = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
|
final String name = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
|
||||||
String fileName = name + GPX_SUFFIX;
|
String fileName = name + GPX_SUFFIX;
|
||||||
File fout = new File(dir, fileName);
|
File fout = new File(dir, fileName);
|
||||||
|
@ -1424,7 +1425,10 @@ public class MeasurementToolFragment extends Fragment {
|
||||||
} else {
|
} else {
|
||||||
saveType = SaveType.LINE;
|
saveType = SaveType.LINE;
|
||||||
}
|
}
|
||||||
saveNewGpx(dir, fileName, showOnMapToggle.isChecked(), saveType, true);
|
saveNewGpx(dir, fileName, true, saveType, true);
|
||||||
|
} else {
|
||||||
|
dismiss(mapActivity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -1441,12 +1445,7 @@ public class MeasurementToolFragment extends Fragment {
|
||||||
}
|
}
|
||||||
builder.setTitle(getString(R.string.exit_without_saving))
|
builder.setTitle(getString(R.string.exit_without_saving))
|
||||||
.setMessage(getString(R.string.unsaved_changes_will_be_lost))
|
.setMessage(getString(R.string.unsaved_changes_will_be_lost))
|
||||||
.setNegativeButton(R.string.shared_string_cancel, new DialogInterface.OnClickListener() {
|
.setNegativeButton(R.string.shared_string_cancel, null);
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
dismiss(mapActivity);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
builder.show();
|
builder.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,8 @@ public class AnimateDraggingMapThread {
|
||||||
final float mMoveX = rb.getPixXFromLatLon(startLat, startLon) - rb.getPixXFromLatLon(finalLat, finalLon);
|
final float mMoveX = rb.getPixXFromLatLon(startLat, startLon) - rb.getPixXFromLatLon(finalLat, finalLon);
|
||||||
final float mMoveY = rb.getPixYFromLatLon(startLat, startLon) - rb.getPixYFromLatLon(finalLat, finalLon);
|
final float mMoveY = rb.getPixYFromLatLon(startLat, startLon) - rb.getPixYFromLatLon(finalLat, finalLon);
|
||||||
|
|
||||||
final float animationTime = Math.max(450, (Math.abs(mStX) + Math.abs(mStY)) / 1200f * MOVE_MOVE_ANIMATION_TIME);
|
final boolean doNotUseAnimations = tileView.getSettings().DO_NOT_USE_ANIMATIONS.get();
|
||||||
|
final float animationTime = doNotUseAnimations ? 0 : Math.max(450, (Math.abs(mStX) + Math.abs(mStY)) / 1200f * MOVE_MOVE_ANIMATION_TIME);
|
||||||
|
|
||||||
startThreadAnimating(new Runnable() {
|
startThreadAnimating(new Runnable() {
|
||||||
|
|
||||||
|
@ -221,7 +222,7 @@ public class AnimateDraggingMapThread {
|
||||||
public void run() {
|
public void run() {
|
||||||
setTargetValues(endZoom, finalLat, finalLon);
|
setTargetValues(endZoom, finalLat, finalLon);
|
||||||
if(moveZoom != startZoom){
|
if(moveZoom != startZoom){
|
||||||
animatingZoomInThread(startZoom, startZoomFP, moveZoom, startZoomFP,ZOOM_MOVE_ANIMATION_TIME, notifyListener);
|
animatingZoomInThread(startZoom, startZoomFP, moveZoom, startZoomFP, doNotUseAnimations ? 0 : ZOOM_MOVE_ANIMATION_TIME, notifyListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!stopped){
|
if(!stopped){
|
||||||
|
@ -232,7 +233,7 @@ public class AnimateDraggingMapThread {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!stopped && (moveZoom != endZoom || startZoomFP != 0)) {
|
if (!stopped && (moveZoom != endZoom || startZoomFP != 0)) {
|
||||||
animatingZoomInThread(moveZoom, startZoomFP, endZoom, 0, ZOOM_MOVE_ANIMATION_TIME, notifyListener);
|
animatingZoomInThread(moveZoom, startZoomFP, endZoom, 0, doNotUseAnimations ? 0 : ZOOM_MOVE_ANIMATION_TIME, notifyListener);
|
||||||
}
|
}
|
||||||
tileView.setFractionalZoom(endZoom, 0, notifyListener);
|
tileView.setFractionalZoom(endZoom, 0, notifyListener);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue