Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
477a03b2b6
14 changed files with 231 additions and 186 deletions
|
@ -1940,4 +1940,5 @@ Afghanistan, Albania, Algeria, Andorra, Angola, Anguilla, Antigua and Barbuda, A
|
||||||
<string name="av_photo_play_sound_descr">Choose whether to play a sound when shooting photos</string>
|
<string name="av_photo_play_sound_descr">Choose whether to play a sound when shooting photos</string>
|
||||||
<string name="navigation_intent_invalid">Invalid format: %s</string>
|
<string name="navigation_intent_invalid">Invalid format: %s</string>
|
||||||
<string name="hide_all_waypoints">Remove all</string>
|
<string name="hide_all_waypoints">Remove all</string>
|
||||||
|
<string name="announce_nearby_favorites">Announce nearby favorites</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
package net.osmand.plus;
|
package net.osmand.plus;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.Iterator;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
import android.widget.ListView;
|
||||||
import net.osmand.GeoidAltitudeCorrection;
|
import net.osmand.GeoidAltitudeCorrection;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.access.NavigationInfo;
|
import net.osmand.access.NavigationInfo;
|
||||||
import net.osmand.binary.RouteDataObject;
|
import net.osmand.binary.RouteDataObject;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
import net.osmand.data.LocationPoint;
|
||||||
import net.osmand.data.QuadPoint;
|
import net.osmand.data.QuadPoint;
|
||||||
import net.osmand.plus.OsmandSettings.OsmandPreference;
|
import net.osmand.plus.OsmandSettings.OsmandPreference;
|
||||||
import net.osmand.plus.routing.RoutingHelper;
|
import net.osmand.plus.routing.RoutingHelper;
|
||||||
|
@ -66,9 +66,7 @@ public class OsmAndLocationProvider implements SensorEventListener {
|
||||||
private float[] mGravs = new float[3];
|
private float[] mGravs = new float[3];
|
||||||
private float[] mGeoMags = new float[3];
|
private float[] mGeoMags = new float[3];
|
||||||
private float previousCorrectionValue = 360;
|
private float previousCorrectionValue = 360;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static final boolean USE_KALMAN_FILTER = true;
|
private static final boolean USE_KALMAN_FILTER = true;
|
||||||
private static final float KALMAN_COEFFICIENT = 0.04f;
|
private static final float KALMAN_COEFFICIENT = 0.04f;
|
||||||
|
|
||||||
|
@ -104,8 +102,114 @@ public class OsmAndLocationProvider implements SensorEventListener {
|
||||||
private float[] mRotationM = new float[9];
|
private float[] mRotationM = new float[9];
|
||||||
private OsmandPreference<Boolean> USE_MAGNETIC_FIELD_SENSOR_COMPASS;
|
private OsmandPreference<Boolean> USE_MAGNETIC_FIELD_SENSOR_COMPASS;
|
||||||
private OsmandPreference<Boolean> USE_FILTER_FOR_COMPASS;
|
private OsmandPreference<Boolean> USE_FILTER_FOR_COMPASS;
|
||||||
|
|
||||||
|
private static final int NOT_ANNOUNCED = 0;
|
||||||
|
private static final int ANNOUNCED_ONCE = 1;
|
||||||
|
private static final int ANNOUNCED_TWICE = 2;
|
||||||
|
|
||||||
|
private ConcurrentHashMap<LocationPoint , Integer> locationPointsStates = new ConcurrentHashMap<LocationPoint, Integer>();
|
||||||
|
private List<LocationPoint> visibleLocationPoints = new CopyOnWriteArrayList<LocationPoint>();
|
||||||
|
private long locationPointsModified;
|
||||||
|
|
||||||
|
public List<LocationPoint> getVisibleLocationPoints() {
|
||||||
|
return visibleLocationPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVisibleLocationPoints(List<LocationPoint> points) {
|
||||||
|
locationPointsStates.clear();
|
||||||
|
visibleLocationPoints.clear();
|
||||||
|
if (points == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (LocationPoint p : points) {
|
||||||
|
locationPointsStates.put(p, NOT_ANNOUNCED);
|
||||||
|
visibleLocationPoints.add(p);
|
||||||
|
}
|
||||||
|
sortVisibleLocationPoints();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addVisibleLocationPoint(LocationPoint lp) {
|
||||||
|
this.locationPointsStates.put(lp, NOT_ANNOUNCED);
|
||||||
|
this.locationPointsModified = System.currentTimeMillis();
|
||||||
|
sortVisibleLocationPoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearAllVisiblePoints() {
|
||||||
|
this.locationPointsStates.clear();
|
||||||
|
this.visibleLocationPoints.clear();
|
||||||
|
this.locationPointsModified = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sortVisibleLocationPoints() {
|
||||||
|
net.osmand.Location lastLocation = getLastKnownLocation();
|
||||||
|
if (lastLocation != null) {
|
||||||
|
Object[] loc = visibleLocationPoints.toArray();
|
||||||
|
Arrays.sort(loc, getComparator(lastLocation));
|
||||||
|
visibleLocationPoints.clear();
|
||||||
|
for (Object aLoc : loc) {
|
||||||
|
visibleLocationPoints.add((LocationPoint) aLoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private Comparator<Object> getComparator(final net.osmand.Location lastLocation){
|
||||||
|
return new Comparator<Object>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Object locationPoint, Object locationPoint2) {
|
||||||
|
double d1 = MapUtils.getDistance(lastLocation.getLatitude(), lastLocation.getLongitude(),
|
||||||
|
((LocationPoint)locationPoint).getLatitude(), ((LocationPoint)locationPoint).getLongitude());
|
||||||
|
double d2 = MapUtils.getDistance(lastLocation.getLatitude(), lastLocation.getLongitude(),
|
||||||
|
((LocationPoint)locationPoint2).getLatitude(), ((LocationPoint)locationPoint2).getLongitude());
|
||||||
|
return Double.compare(d1, d2);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLocationPointsModified() {
|
||||||
|
return locationPointsModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVisibleLocationPoint(LocationPoint lp) {
|
||||||
|
this.visibleLocationPoints = removeFromList(visibleLocationPoints, lp);
|
||||||
|
this.locationPointsStates.remove(lp);
|
||||||
|
this.locationPointsModified = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void announceVisibleLocations() {
|
||||||
|
final net.osmand.Location lastLocation = getLastKnownLocation();
|
||||||
|
if (lastLocation != null && app.getRoutingHelper().isFollowingMode()) {
|
||||||
|
String nameToAnnounce = null;
|
||||||
|
for (LocationPoint point : locationPointsStates.keySet()) {
|
||||||
|
double d1 = MapUtils.getDistance(lastLocation.getLatitude(), lastLocation.getLongitude(),
|
||||||
|
point.getLatitude(), point.getLongitude());
|
||||||
|
int state = locationPointsStates.get(point);
|
||||||
|
if (state == NOT_ANNOUNCED && app.getRoutingHelper().getVoiceRouter().isDistanceLess(lastLocation.getSpeed(), d1, 500)){
|
||||||
|
nameToAnnounce = (nameToAnnounce == null? "":", ")+point.getName();
|
||||||
|
locationPointsStates.put(point, state + 1);
|
||||||
|
} else if(state == ANNOUNCED_ONCE && app.getRoutingHelper().getVoiceRouter().isDistanceLess(lastLocation.getSpeed(), d1, 150)){
|
||||||
|
nameToAnnounce = (nameToAnnounce == null? "":", ")+point.getName();
|
||||||
|
locationPointsStates.remove(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(nameToAnnounce!= null) {
|
||||||
|
app.getRoutingHelper().getVoiceRouter().announceWaypoint(nameToAnnounce);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<LocationPoint> removeFromList(List<LocationPoint> items, Object item){
|
||||||
|
List<LocationPoint> newArray = new ArrayList<LocationPoint>();
|
||||||
|
Object[] oldArray = items.toArray();
|
||||||
|
for (int i=0; i<oldArray.length; i++){
|
||||||
|
if (!item.equals(oldArray[i])){
|
||||||
|
newArray.add((LocationPoint)oldArray[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items.clear();
|
||||||
|
return new CopyOnWriteArrayList<LocationPoint>(newArray);
|
||||||
|
}
|
||||||
|
|
||||||
public class SimulationProvider {
|
public class SimulationProvider {
|
||||||
private int currentRoad;
|
private int currentRoad;
|
||||||
private int currentSegment;
|
private int currentSegment;
|
||||||
|
@ -518,6 +622,10 @@ public class OsmAndLocationProvider implements SensorEventListener {
|
||||||
|
|
||||||
|
|
||||||
private void updateLocation(net.osmand.Location loc ) {
|
private void updateLocation(net.osmand.Location loc ) {
|
||||||
|
if (app.getSettings().ANNOUNCE_NEARBY_FAVORITES.get()){
|
||||||
|
sortVisibleLocationPoints();
|
||||||
|
announceVisibleLocations();
|
||||||
|
}
|
||||||
for(OsmAndLocationListener l : locationListeners){
|
for(OsmAndLocationListener l : locationListeners){
|
||||||
l.updateLocation(loc);
|
l.updateLocation(loc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -818,8 +818,8 @@ public class OsmandSettings {
|
||||||
public final OsmandPreference<Boolean> GPX_CALCULATE_RTEPT = new BooleanPreference("gpx_routing_calculate_rtept", true).makeGlobal().cache();
|
public final OsmandPreference<Boolean> GPX_CALCULATE_RTEPT = new BooleanPreference("gpx_routing_calculate_rtept", true).makeGlobal().cache();
|
||||||
public final OsmandPreference<Boolean> GPX_SPEAK_WPT = new BooleanPreference("speak_gpx_wpt", true).makeGlobal().cache();
|
public final OsmandPreference<Boolean> GPX_SPEAK_WPT = new BooleanPreference("speak_gpx_wpt", true).makeGlobal().cache();
|
||||||
public final OsmandPreference<Boolean> GPX_ROUTE_CALC = new BooleanPreference("calc_gpx_route", false).makeGlobal().cache();
|
public final OsmandPreference<Boolean> GPX_ROUTE_CALC = new BooleanPreference("calc_gpx_route", false).makeGlobal().cache();
|
||||||
|
|
||||||
|
public final OsmandPreference<Boolean> ANNOUNCE_NEARBY_FAVORITES = new BooleanPreference("announce_nearby_favorites", false).makeGlobal().cache();
|
||||||
|
|
||||||
public final OsmandPreference<Boolean> AVOID_TOLL_ROADS = new BooleanPreference("avoid_toll_roads", false).makeProfile().cache();
|
public final OsmandPreference<Boolean> AVOID_TOLL_ROADS = new BooleanPreference("avoid_toll_roads", false).makeProfile().cache();
|
||||||
public final OsmandPreference<Boolean> AVOID_MOTORWAY = new BooleanPreference("avoid_motorway", false).makeProfile().cache();
|
public final OsmandPreference<Boolean> AVOID_MOTORWAY = new BooleanPreference("avoid_motorway", false).makeProfile().cache();
|
||||||
|
|
|
@ -25,8 +25,6 @@ public class TargetPointsHelper {
|
||||||
private RoutingHelper routingHelper;
|
private RoutingHelper routingHelper;
|
||||||
private List<StateChangedListener<Void>> listeners = new ArrayList<StateChangedListener<Void>>();
|
private List<StateChangedListener<Void>> listeners = new ArrayList<StateChangedListener<Void>>();
|
||||||
private OsmandApplication ctx;
|
private OsmandApplication ctx;
|
||||||
private List<LocationPoint> visibleLocationPoints = new CopyOnWriteArrayList<LocationPoint>();
|
|
||||||
private long locationPointsModified;
|
|
||||||
|
|
||||||
public TargetPointsHelper(OsmandApplication ctx){
|
public TargetPointsHelper(OsmandApplication ctx){
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
|
@ -69,47 +67,7 @@ public class TargetPointsHelper {
|
||||||
return intermediatePoints;
|
return intermediatePoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<LocationPoint> getVisibleLocationPoints() {
|
|
||||||
return visibleLocationPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addVisibleLocationPoint(LocationPoint lp) {
|
|
||||||
this.visibleLocationPoints.add(lp);
|
|
||||||
this.locationPointsModified = System.currentTimeMillis();
|
|
||||||
sortVisibleLocationPoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeAllVisiblePoints() {
|
|
||||||
this.locationPointsModified = System.currentTimeMillis();
|
|
||||||
visibleLocationPoints.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void sortVisibleLocationPoints() {
|
|
||||||
final Location lastLocation = ctx.getLocationProvider().getLastKnownLocation();
|
|
||||||
if(lastLocation != null) {
|
|
||||||
Collections.sort(this.visibleLocationPoints, new Comparator<LocationPoint>() {
|
|
||||||
@Override
|
|
||||||
public int compare(LocationPoint locationPoint, LocationPoint locationPoint2) {
|
|
||||||
double d1 = MapUtils.getDistance(lastLocation.getLatitude(), lastLocation.getLongitude(),
|
|
||||||
locationPoint.getLatitude(), locationPoint.getLongitude());
|
|
||||||
double d2 = MapUtils.getDistance(lastLocation.getLatitude(), lastLocation.getLongitude(),
|
|
||||||
locationPoint2.getLatitude(), locationPoint2.getLongitude());
|
|
||||||
return Double.compare(d1, d2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.locationPointsModified = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getLocationPointsModified() {
|
|
||||||
return locationPointsModified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeVisibleLocationPoint(LocationPoint lp) {
|
|
||||||
this.visibleLocationPoints.remove(lp);
|
|
||||||
this.locationPointsModified = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public List<LatLon> getIntermediatePointsWithTarget() {
|
public List<LatLon> getIntermediatePointsWithTarget() {
|
||||||
|
|
|
@ -642,6 +642,7 @@ public class MapActivityActions implements DialogProvider {
|
||||||
|
|
||||||
mapActivity.getMapViewTrackingUtilities().switchToRoutePlanningMode();
|
mapActivity.getMapViewTrackingUtilities().switchToRoutePlanningMode();
|
||||||
mapActivity.getMapView().refreshMap(true);
|
mapActivity.getMapView().refreshMap(true);
|
||||||
|
mapActivity.getMapLayers().getMapControlsLayer().showDialog();
|
||||||
if(targets.hasTooLongDistanceToNavigate()) {
|
if(targets.hasTooLongDistanceToNavigate()) {
|
||||||
app.showToastMessage(R.string.route_is_too_long);
|
app.showToastMessage(R.string.route_is_too_long);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,15 +32,14 @@ public class RouteCalculationResult {
|
||||||
private final List<RouteDirectionInfo> directions;
|
private final List<RouteDirectionInfo> directions;
|
||||||
private final List<RouteSegmentResult> segments;
|
private final List<RouteSegmentResult> segments;
|
||||||
private final List<AlarmInfo> alarmInfo;
|
private final List<AlarmInfo> alarmInfo;
|
||||||
private final List<LocationPoint> waypoints;
|
|
||||||
private final String errorMessage;
|
private final String errorMessage;
|
||||||
private final int[] listDistance;
|
private final int[] listDistance;
|
||||||
private final int[] intermediatePoints;
|
private final int[] intermediatePoints;
|
||||||
private final int[] waypointIndexes;
|
|
||||||
private final float routingTime;
|
private final float routingTime;
|
||||||
|
|
||||||
protected int cacheCurrentTextDirectionInfo = -1;
|
protected int cacheCurrentTextDirectionInfo = -1;
|
||||||
protected List<RouteDirectionInfo> cacheAgreggatedDirections;
|
protected List<RouteDirectionInfo> cacheAgreggatedDirections;
|
||||||
|
protected List<LocationPoint> locationPoints = new ArrayList<LocationPoint>();
|
||||||
|
|
||||||
// Note always currentRoute > get(currentDirectionInfo).routeOffset,
|
// Note always currentRoute > get(currentDirectionInfo).routeOffset,
|
||||||
// but currentRoute <= get(currentDirectionInfo+1).routeOffset
|
// but currentRoute <= get(currentDirectionInfo+1).routeOffset
|
||||||
|
@ -60,12 +59,9 @@ public class RouteCalculationResult {
|
||||||
this.listDistance = new int[0];
|
this.listDistance = new int[0];
|
||||||
this.directions = new ArrayList<RouteDirectionInfo>();
|
this.directions = new ArrayList<RouteDirectionInfo>();
|
||||||
this.alarmInfo = new ArrayList<AlarmInfo>();
|
this.alarmInfo = new ArrayList<AlarmInfo>();
|
||||||
this.waypointIndexes = new int[0];
|
|
||||||
this.waypoints = new ArrayList<LocationPoint>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RouteCalculationResult(List<Location> list, List<RouteDirectionInfo> directions, RouteCalculationParams params,
|
public RouteCalculationResult(List<Location> list, List<RouteDirectionInfo> directions, RouteCalculationParams params) {
|
||||||
DataTileManager<? extends LocationPoint> waypointsTm) {
|
|
||||||
this.routingTime = 0;
|
this.routingTime = 0;
|
||||||
this.errorMessage = null;
|
this.errorMessage = null;
|
||||||
this.intermediatePoints = new int[params.intermediates == null ? 0 : params.intermediates.size()];
|
this.intermediatePoints = new int[params.intermediates == null ? 0 : params.intermediates.size()];
|
||||||
|
@ -91,13 +87,14 @@ public class RouteCalculationResult {
|
||||||
calculateIntermediateIndexes(params.ctx, this.locations, params.intermediates, localDirections, this.intermediatePoints);
|
calculateIntermediateIndexes(params.ctx, this.locations, params.intermediates, localDirections, this.intermediatePoints);
|
||||||
this.directions = Collections.unmodifiableList(localDirections);
|
this.directions = Collections.unmodifiableList(localDirections);
|
||||||
updateDirectionsTime(this.directions, this.listDistance);
|
updateDirectionsTime(this.directions, this.listDistance);
|
||||||
this.waypoints = new ArrayList<LocationPoint>();
|
|
||||||
this.waypointIndexes = calculateWaypointIndexes(list, waypointsTm, waypoints);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RouteCalculationResult(List<RouteSegmentResult> list, Location start, LatLon end, List<LatLon> intermediates,
|
public RouteCalculationResult(List<RouteSegmentResult> list, Location start, LatLon end, List<LatLon> intermediates,
|
||||||
Context ctx, boolean leftSide, float routingTime,DataTileManager<LocationPoint> waypointsTm) {
|
Context ctx, boolean leftSide, float routingTime, List<LocationPoint> waypoints) {
|
||||||
this.routingTime = routingTime;
|
this.routingTime = routingTime;
|
||||||
|
if(waypoints != null) {
|
||||||
|
this.locationPoints.addAll(waypoints);
|
||||||
|
}
|
||||||
List<RouteDirectionInfo> computeDirections = new ArrayList<RouteDirectionInfo>();
|
List<RouteDirectionInfo> computeDirections = new ArrayList<RouteDirectionInfo>();
|
||||||
this.errorMessage = null;
|
this.errorMessage = null;
|
||||||
this.intermediatePoints = new int[intermediates == null ? 0 : intermediates.size()];
|
this.intermediatePoints = new int[intermediates == null ? 0 : intermediates.size()];
|
||||||
|
@ -115,36 +112,12 @@ public class RouteCalculationResult {
|
||||||
this.directions = Collections.unmodifiableList(computeDirections);
|
this.directions = Collections.unmodifiableList(computeDirections);
|
||||||
updateDirectionsTime(this.directions, this.listDistance);
|
updateDirectionsTime(this.directions, this.listDistance);
|
||||||
this.alarmInfo = Collections.unmodifiableList(alarms);
|
this.alarmInfo = Collections.unmodifiableList(alarms);
|
||||||
this.waypoints = new ArrayList<LocationPoint>();
|
}
|
||||||
|
|
||||||
this.waypointIndexes = calculateWaypointIndexes(this.locations, waypointsTm, waypoints);
|
public List<LocationPoint> getLocationPoints() {
|
||||||
|
return locationPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<LocationPoint> getWaypointsToAnnounce(Location loc) {
|
|
||||||
if (currentWaypointGPX != lastWaypointGPX && loc != null) {
|
|
||||||
ArrayList<LocationPoint> points = new ArrayList<LocationPoint>();
|
|
||||||
Location next = locations.get(currentRoute);
|
|
||||||
float dist = loc.distanceTo(next);
|
|
||||||
while (currentWaypointGPX < lastWaypointGPX) {
|
|
||||||
WptPt w = (WptPt) waypoints.get(currentWaypointGPX);
|
|
||||||
if(MapUtils.getDistance(w.lat, w.lon, next.getLatitude(), next.getLongitude()) > dist + 50) {
|
|
||||||
currentWaypointGPX++;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (currentWaypointGPX < lastWaypointGPX) {
|
|
||||||
WptPt w = (WptPt) waypoints.get(currentWaypointGPX);
|
|
||||||
if(MapUtils.getDistance(w.lat, w.lon, loc.getLatitude(), next.getLongitude()) < 60) {
|
|
||||||
currentWaypointGPX++;
|
|
||||||
points.add(w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return points;
|
|
||||||
}
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void calculateIntermediateIndexes(Context ctx, List<Location> locations,
|
private static void calculateIntermediateIndexes(Context ctx, List<Location> locations,
|
||||||
List<LatLon> intermediates, List<RouteDirectionInfo> localDirections, int[] intermediatePoints) {
|
List<LatLon> intermediates, List<RouteDirectionInfo> localDirections, int[] intermediatePoints) {
|
||||||
if(intermediates != null && localDirections != null) {
|
if(intermediates != null && localDirections != null) {
|
||||||
|
@ -758,9 +731,6 @@ public class RouteCalculationResult {
|
||||||
while (nextAlarmInfo < alarmInfo.size() && alarmInfo.get(nextAlarmInfo).locationIndex < currentRoute) {
|
while (nextAlarmInfo < alarmInfo.size() && alarmInfo.get(nextAlarmInfo).locationIndex < currentRoute) {
|
||||||
nextAlarmInfo++;
|
nextAlarmInfo++;
|
||||||
}
|
}
|
||||||
while(lastWaypointGPX < waypointIndexes.length && waypointIndexes[lastWaypointGPX] <= currentRoute) {
|
|
||||||
lastWaypointGPX++;
|
|
||||||
}
|
|
||||||
while(nextIntermediate < intermediatePoints.length) {
|
while(nextIntermediate < intermediatePoints.length) {
|
||||||
RouteDirectionInfo dir = directions.get(intermediatePoints[nextIntermediate]);
|
RouteDirectionInfo dir = directions.get(intermediatePoints[nextIntermediate]);
|
||||||
if(dir.routePointOffset < currentRoute) {
|
if(dir.routePointOffset < currentRoute) {
|
||||||
|
|
|
@ -29,6 +29,7 @@ import net.osmand.binary.BinaryMapIndexReader;
|
||||||
import net.osmand.data.DataTileManager;
|
import net.osmand.data.DataTileManager;
|
||||||
import net.osmand.data.FavouritePoint;
|
import net.osmand.data.FavouritePoint;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
import net.osmand.data.LocationPoint;
|
||||||
import net.osmand.plus.ApplicationMode;
|
import net.osmand.plus.ApplicationMode;
|
||||||
import net.osmand.plus.GPXUtilities;
|
import net.osmand.plus.GPXUtilities;
|
||||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||||
|
@ -203,12 +204,12 @@ public class RouteProvider {
|
||||||
public static class GPXRouteParams {
|
public static class GPXRouteParams {
|
||||||
List<Location> points = new ArrayList<Location>();
|
List<Location> points = new ArrayList<Location>();
|
||||||
List<RouteDirectionInfo> directions;
|
List<RouteDirectionInfo> directions;
|
||||||
DataTileManager<WptPt> wpt;
|
|
||||||
boolean calculateOsmAndRoute;
|
boolean calculateOsmAndRoute;
|
||||||
boolean passWholeRoute;
|
boolean passWholeRoute;
|
||||||
boolean calculateOsmAndRouteParts;
|
boolean calculateOsmAndRouteParts;
|
||||||
boolean useIntermediatePointsRTE;
|
boolean useIntermediatePointsRTE;
|
||||||
|
private List<LocationPoint> wpt;
|
||||||
|
|
||||||
public List<Location> getPoints() {
|
public List<Location> getPoints() {
|
||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
@ -244,6 +245,9 @@ public class RouteProvider {
|
||||||
useIntermediatePointsRTE = builder.useIntermediatePointsRTE;
|
useIntermediatePointsRTE = builder.useIntermediatePointsRTE;
|
||||||
boolean announceWaypoints = builder.announceWaypoints;
|
boolean announceWaypoints = builder.announceWaypoints;
|
||||||
builder.calculateOsmAndRoute = false; // Disabled temporary builder.calculateOsmAndRoute;
|
builder.calculateOsmAndRoute = false; // Disabled temporary builder.calculateOsmAndRoute;
|
||||||
|
if(announceWaypoints && !file.points.isEmpty()) {
|
||||||
|
wpt = new ArrayList<LocationPoint>(file.points );
|
||||||
|
}
|
||||||
if(file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)){
|
if(file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)){
|
||||||
directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10);
|
directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10);
|
||||||
if(reverse){
|
if(reverse){
|
||||||
|
@ -273,14 +277,6 @@ public class RouteProvider {
|
||||||
Collections.reverse(points);
|
Collections.reverse(points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wpt = null;
|
|
||||||
if(announceWaypoints && !file.points.isEmpty()) {
|
|
||||||
wpt = new DataTileManager<WptPt>(17);
|
|
||||||
for(WptPt w : file.points ) {
|
|
||||||
wpt.registerObjectXY(MapUtils.get31TileNumberX(w.lon),
|
|
||||||
MapUtils.get31TileNumberY(w.lat),w) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +354,7 @@ public class RouteProvider {
|
||||||
locs = findStartAndEndLocationsFromRoute(locs, params.start, params.end, startI, endI);
|
locs = findStartAndEndLocationsFromRoute(locs, params.start, params.end, startI, endI);
|
||||||
List<RouteDirectionInfo> directions = calcDirections(startI, endI, rcr.getRouteDirections());
|
List<RouteDirectionInfo> directions = calcDirections(startI, endI, rcr.getRouteDirections());
|
||||||
insertInitialSegment(params, locs, directions, true);
|
insertInitialSegment(params, locs, directions, true);
|
||||||
res = new RouteCalculationResult(locs, directions, params, null);
|
res = new RouteCalculationResult(locs, directions, params);
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -392,7 +388,7 @@ public class RouteProvider {
|
||||||
info.distance = 0;
|
info.distance = 0;
|
||||||
info.afterLeftTime = 0;
|
info.afterLeftTime = 0;
|
||||||
}
|
}
|
||||||
RouteCalculationResult res = new RouteCalculationResult(gpxRoute, gpxDirections, routeParams, gpxParams.wpt);
|
RouteCalculationResult res = new RouteCalculationResult(gpxRoute, gpxDirections, routeParams);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,7 +622,7 @@ public class RouteProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
params.intermediates = null;
|
params.intermediates = null;
|
||||||
return new RouteCalculationResult(res, null, params, null);
|
return new RouteCalculationResult(res, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected RouteCalculationResult findVectorMapsRoute(final RouteCalculationParams params, boolean calcGPXRoute) throws IOException {
|
protected RouteCalculationResult findVectorMapsRoute(final RouteCalculationParams params, boolean calcGPXRoute) throws IOException {
|
||||||
|
@ -777,13 +773,8 @@ public class RouteProvider {
|
||||||
// something really strange better to see that message on the scren
|
// something really strange better to see that message on the scren
|
||||||
return emptyResult();
|
return emptyResult();
|
||||||
} else {
|
} else {
|
||||||
DataTileManager mngr = new DataTileManager<Object>(17);
|
RouteCalculationResult res = new RouteCalculationResult(result, params.start, params.end,
|
||||||
List<FavouritePoint> points = params.ctx.getFavorites().getFavouritePoints();
|
params.intermediates, params.ctx, params.leftSide, ctx.routingTime, params.gpxRoute == null? null: params.gpxRoute.wpt);
|
||||||
for(FavouritePoint point : points){
|
|
||||||
mngr.registerObject(point.getLatitude(), point.getLongitude(), point);
|
|
||||||
}
|
|
||||||
RouteCalculationResult res = new RouteCalculationResult(result, params.start, params.end,
|
|
||||||
params.intermediates, params.ctx, params.leftSide, ctx.routingTime, mngr);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
|
@ -1000,7 +991,7 @@ public class RouteProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
params.intermediates = null;
|
params.intermediates = null;
|
||||||
return new RouteCalculationResult(res, null, params, null);
|
return new RouteCalculationResult(res, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GPXFile createOsmandRouterGPX(RouteCalculationResult srcRoute, OsmandApplication ctx){
|
public GPXFile createOsmandRouterGPX(RouteCalculationResult srcRoute, OsmandApplication ctx){
|
||||||
|
@ -1145,7 +1136,7 @@ public class RouteProvider {
|
||||||
res.add(createLocation(pt));
|
res.add(createLocation(pt));
|
||||||
}
|
}
|
||||||
params.intermediates = null;
|
params.intermediates = null;
|
||||||
return new RouteCalculationResult(res, null, params, null);
|
return new RouteCalculationResult(res, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1221,7 +1212,7 @@ public class RouteProvider {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return new RouteCalculationResult("Exception calling BRouter: " + e); //$NON-NLS-1$
|
return new RouteCalculationResult("Exception calling BRouter: " + e); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
return new RouteCalculationResult(res, null, params, null);
|
return new RouteCalculationResult(res, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private RouteCalculationResult findStraightRoute(RouteCalculationParams params) {
|
private RouteCalculationResult findStraightRoute(RouteCalculationParams params) {
|
||||||
|
@ -1247,7 +1238,7 @@ public class RouteProvider {
|
||||||
location.setLatitude(lats[1]);
|
location.setLatitude(lats[1]);
|
||||||
location.setLongitude(lons[1]);
|
location.setLongitude(lons[1]);
|
||||||
dots.add(location);
|
dots.add(location);
|
||||||
return new RouteCalculationResult(dots,null,params,null);
|
return new RouteCalculationResult(dots,null,params);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.LocationPoint;
|
import net.osmand.data.LocationPoint;
|
||||||
import net.osmand.plus.ApplicationMode;
|
import net.osmand.plus.ApplicationMode;
|
||||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||||
import net.osmand.plus.GPXUtilities.WptPt;
|
|
||||||
import net.osmand.plus.NavigationService;
|
import net.osmand.plus.NavigationService;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
@ -26,7 +25,6 @@ import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
|
||||||
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
|
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
|
||||||
import net.osmand.plus.routing.RouteProvider.RouteService;
|
import net.osmand.plus.routing.RouteProvider.RouteService;
|
||||||
import net.osmand.plus.sherpafy.WaypointDialogHelper;
|
|
||||||
import net.osmand.plus.voice.CommandPlayer;
|
import net.osmand.plus.voice.CommandPlayer;
|
||||||
import net.osmand.router.RouteCalculationProgress;
|
import net.osmand.router.RouteCalculationProgress;
|
||||||
import net.osmand.router.RouteSegmentResult;
|
import net.osmand.router.RouteSegmentResult;
|
||||||
|
@ -270,7 +268,6 @@ public class RoutingHelper {
|
||||||
// 5. Update Voice router
|
// 5. Update Voice router
|
||||||
if (isFollowingMode) {
|
if (isFollowingMode) {
|
||||||
// don't update in route planing mode
|
// don't update in route planing mode
|
||||||
announceGpxWaypoints(currentLocation);
|
|
||||||
boolean inRecalc = calculateRoute || isRouteBeingCalculated();
|
boolean inRecalc = calculateRoute || isRouteBeingCalculated();
|
||||||
if (!inRecalc && !wrongMovementDirection) {
|
if (!inRecalc && !wrongMovementDirection) {
|
||||||
voiceRouter.updateStatus(currentLocation, false);
|
voiceRouter.updateStatus(currentLocation, false);
|
||||||
|
@ -317,25 +314,6 @@ public class RoutingHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void announceGpxWaypoints(Location currentLocation) {
|
|
||||||
if (currentLocation != null) {
|
|
||||||
List<LocationPoint> wpt = route.getWaypointsToAnnounce(currentLocation);
|
|
||||||
if (wpt.size() > 0) {
|
|
||||||
String s = "";
|
|
||||||
for (LocationPoint w : wpt) {
|
|
||||||
if(!Algorithms.isEmpty(w.getName())) {
|
|
||||||
s = w.getName() +",";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!Algorithms.isEmpty(s)) {
|
|
||||||
voiceRouter.announceWaypoint(s);
|
|
||||||
// dialogHelper.addWptDialog(wpt.get(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static double getOrthogonalDistance(Location loc, Location from, Location to) {
|
private static double getOrthogonalDistance(Location loc, Location from, Location to) {
|
||||||
return MapUtils.getOrthogonalDistance(loc.getLatitude(),
|
return MapUtils.getOrthogonalDistance(loc.getLatitude(),
|
||||||
loc.getLongitude(), from.getLatitude(), from.getLongitude(),
|
loc.getLongitude(), from.getLatitude(), from.getLongitude(),
|
||||||
|
@ -537,6 +515,12 @@ public class RoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void setNewRoute(RouteCalculationResult res, Location start){
|
private synchronized void setNewRoute(RouteCalculationResult res, Location start){
|
||||||
|
ArrayList<LocationPoint> locationPoints = new ArrayList<LocationPoint>();
|
||||||
|
if (app.getSettings().ANNOUNCE_NEARBY_FAVORITES.get()){
|
||||||
|
locationPoints.addAll(app.getFavorites().getFavouritePoints());
|
||||||
|
}
|
||||||
|
locationPoints.addAll(res.getLocationPoints());
|
||||||
|
app.getLocationProvider().setVisibleLocationPoints(locationPoints);
|
||||||
final boolean newRoute = !this.route.isCalculated();
|
final boolean newRoute = !this.route.isCalculated();
|
||||||
route = res;
|
route = res;
|
||||||
if (isFollowingMode) {
|
if (isFollowingMode) {
|
||||||
|
|
|
@ -154,7 +154,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isDistanceLess(float currentSpeed, double dist, double etalon){
|
public boolean isDistanceLess(float currentSpeed, double dist, double etalon){
|
||||||
if(currentSpeed <= 0) {
|
if(currentSpeed <= 0) {
|
||||||
currentSpeed = DEFAULT_SPEED;
|
currentSpeed = DEFAULT_SPEED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package net.osmand.plus.sherpafy;
|
package net.osmand.plus.sherpafy;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
@ -17,7 +16,6 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.data.LatLon;
|
|
||||||
import net.osmand.data.LocationPoint;
|
import net.osmand.data.LocationPoint;
|
||||||
import net.osmand.plus.*;
|
import net.osmand.plus.*;
|
||||||
import net.osmand.plus.activities.FavouritesActivity;
|
import net.osmand.plus.activities.FavouritesActivity;
|
||||||
|
@ -35,7 +33,7 @@ public class WaypointDialogHelper {
|
||||||
private MapActivity mapActivity;
|
private MapActivity mapActivity;
|
||||||
private OsmandApplication app;
|
private OsmandApplication app;
|
||||||
private FrameLayout mainLayout;
|
private FrameLayout mainLayout;
|
||||||
private TargetPointsHelper targetPointsHelper;
|
private OsmAndLocationProvider locationProvider;
|
||||||
|
|
||||||
public static boolean OVERLAP_LAYOUT = true;
|
public static boolean OVERLAP_LAYOUT = true;
|
||||||
private long uiModified;
|
private long uiModified;
|
||||||
|
@ -43,14 +41,14 @@ public class WaypointDialogHelper {
|
||||||
|
|
||||||
public WaypointDialogHelper(MapActivity mapActivity) {
|
public WaypointDialogHelper(MapActivity mapActivity) {
|
||||||
this.app = mapActivity.getMyApplication();
|
this.app = mapActivity.getMyApplication();
|
||||||
targetPointsHelper = this.app.getTargetPointsHelper();
|
locationProvider = this.app.getLocationProvider();
|
||||||
this.mapActivity = mapActivity;
|
this.mapActivity = mapActivity;
|
||||||
this.mainLayout = (FrameLayout) ((FrameLayout) mapActivity.getLayout()).getChildAt(0);
|
this.mainLayout = (FrameLayout) ((FrameLayout) mapActivity.getLayout()).getChildAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDialog() {
|
public void updateDialog() {
|
||||||
List<LocationPoint> vlp = targetPointsHelper.getVisibleLocationPoints();
|
List<LocationPoint> vlp = locationProvider.getVisibleLocationPoints();
|
||||||
long locationPointsModified = targetPointsHelper.getLocationPointsModified();
|
long locationPointsModified = locationProvider.getLocationPointsModified();
|
||||||
if (locationPointsModified != uiModified) {
|
if (locationPointsModified != uiModified) {
|
||||||
uiModified = locationPointsModified;
|
uiModified = locationPointsModified;
|
||||||
if (vlp.isEmpty()) {
|
if (vlp.isEmpty()) {
|
||||||
|
@ -80,7 +78,7 @@ public class WaypointDialogHelper {
|
||||||
btnN.setOnClickListener(new View.OnClickListener() {
|
btnN.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
targetPointsHelper.removeVisibleLocationPoint(point);
|
locationProvider.removeVisibleLocationPoint(point);
|
||||||
updateDialog();
|
updateDialog();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -189,7 +187,7 @@ public class WaypointDialogHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showAllDialog(){
|
public void showAllDialog(){
|
||||||
final List<LocationPoint> visibleLocationPoints = targetPointsHelper.getVisibleLocationPoints();
|
final List<LocationPoint> visibleLocationPoints = locationProvider.getVisibleLocationPoints();
|
||||||
final ArrayAdapter<LocationPoint> listAdapter = new ArrayAdapter<LocationPoint>(mapActivity, R.layout.waypoint_reached, R.id.title,
|
final ArrayAdapter<LocationPoint> listAdapter = new ArrayAdapter<LocationPoint>(mapActivity, R.layout.waypoint_reached, R.id.title,
|
||||||
visibleLocationPoints) {
|
visibleLocationPoints) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -205,6 +203,13 @@ public class WaypointDialogHelper {
|
||||||
v.findViewById(R.id.waypoint_icon).setLayoutParams(ll);
|
v.findViewById(R.id.waypoint_icon).setLayoutParams(ll);
|
||||||
}
|
}
|
||||||
createView(v, getItem(position));
|
createView(v, getItem(position));
|
||||||
|
TextView text = (TextView) v.findViewById(R.id.waypoint_text);
|
||||||
|
text.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
showOnMap(visibleLocationPoints.get(position));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
View remove = v.findViewById(R.id.info_close);
|
View remove = v.findViewById(R.id.info_close);
|
||||||
((ImageButton) remove).setImageDrawable(mapActivity.getResources().getDrawable(
|
((ImageButton) remove).setImageDrawable(mapActivity.getResources().getDrawable(
|
||||||
|
@ -213,9 +218,9 @@ public class WaypointDialogHelper {
|
||||||
remove.setOnClickListener(new View.OnClickListener() {
|
remove.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
LocationPoint point = targetPointsHelper.getVisibleLocationPoints().get(position);
|
LocationPoint point = locationProvider.getVisibleLocationPoints().get(position);
|
||||||
remove(point);
|
remove(point);
|
||||||
targetPointsHelper.removeVisibleLocationPoint(point);
|
locationProvider.removeVisibleLocationPoint(point);
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -229,7 +234,7 @@ public class WaypointDialogHelper {
|
||||||
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||||
itemClick(visibleLocationPoints.get(i));
|
showOnMap(visibleLocationPoints.get(i));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -242,10 +247,18 @@ public class WaypointDialogHelper {
|
||||||
builder.setNegativeButton(mapActivity.getString(R.string.hide_all_waypoints), new DialogInterface.OnClickListener() {
|
builder.setNegativeButton(mapActivity.getString(R.string.hide_all_waypoints), new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
targetPointsHelper.removeAllVisiblePoints();
|
locationProvider.clearAllVisiblePoints();
|
||||||
updateDialog();
|
updateDialog();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.show();
|
builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showOnMap(LocationPoint locationPoint) {
|
||||||
|
// AnimateDraggingMapThread thread = mapActivity.getMapView().getAnimatedDraggingThread();
|
||||||
|
int fZoom = mapActivity.getMapView().getZoom() < 15 ? 15 : mapActivity.getMapView().getZoom();
|
||||||
|
// thread.startMoving(pointToNavigate.getLatitude(), pointToNavigate.getLongitude(), fZoom, true);
|
||||||
|
mapActivity.getMapView().setIntZoom(fZoom);
|
||||||
|
mapActivity.getMapView().setLatLon(locationPoint.getLatitude(), locationPoint.getLongitude());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,6 +320,10 @@ public class MapControlsLayer extends OsmandMapLayer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showDialog(){
|
||||||
|
mapInfoNavigationControl.setShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
public WaypointDialogHelper getWaypointDialogHelper() {
|
public WaypointDialogHelper getWaypointDialogHelper() {
|
||||||
return waypointDialogHelper;
|
return waypointDialogHelper;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ public abstract class MapControls {
|
||||||
protected int shadowColor;
|
protected int shadowColor;
|
||||||
private boolean visible;
|
private boolean visible;
|
||||||
private long delayTime;
|
private long delayTime;
|
||||||
|
|
||||||
protected int gravity = Gravity.BOTTOM | Gravity.RIGHT;
|
protected int gravity = Gravity.BOTTOM | Gravity.RIGHT;
|
||||||
protected int margin;
|
protected int margin;
|
||||||
protected int vmargin;
|
protected int vmargin;
|
||||||
|
@ -40,19 +40,19 @@ public abstract class MapControls {
|
||||||
this.showUIHandler = showUIHandler;
|
this.showUIHandler = showUIHandler;
|
||||||
this.scaleCoefficient = scaleCoefficient;
|
this.scaleCoefficient = scaleCoefficient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setGravity(int gravity) {
|
public void setGravity(int gravity) {
|
||||||
this.gravity = gravity;
|
this.gravity = gravity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMargin(int margin) {
|
public void setMargin(int margin) {
|
||||||
this.margin = margin;
|
this.margin = margin;
|
||||||
}
|
}
|
||||||
public void setVerticalMargin(int vmargin) {
|
public void setVerticalMargin(int vmargin) {
|
||||||
this.vmargin = vmargin;
|
this.vmargin = vmargin;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ImageButton addImageButton(FrameLayout parent, int stringId, int resourceId) {
|
protected ImageButton addImageButton(FrameLayout parent, int stringId, int resourceId) {
|
||||||
Context ctx = mapActivity;
|
Context ctx = mapActivity;
|
||||||
ImageButton button = new ImageButton(ctx);
|
ImageButton button = new ImageButton(ctx);
|
||||||
|
@ -73,17 +73,17 @@ public abstract class MapControls {
|
||||||
applyAttributes(ctx, parent, button, stringId, resourceId, extraMargin);
|
applyAttributes(ctx, parent, button, stringId, resourceId, extraMargin);
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNotifyClick(Runnable notifyClick) {
|
public void setNotifyClick(Runnable notifyClick) {
|
||||||
this.notifyClick = notifyClick;
|
this.notifyClick = notifyClick;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void notifyClicked() {
|
protected void notifyClicked() {
|
||||||
if(notifyClick != null) {
|
if(notifyClick != null) {
|
||||||
notifyClick.run();
|
notifyClick.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void applyAttributes(Context ctx, FrameLayout parent, View button, int stringId, int resourceId,
|
private void applyAttributes(Context ctx, FrameLayout parent, View button, int stringId, int resourceId,
|
||||||
int extraMargin) {
|
int extraMargin) {
|
||||||
|
@ -124,12 +124,12 @@ public abstract class MapControls {
|
||||||
public final void init(FrameLayout layout) {
|
public final void init(FrameLayout layout) {
|
||||||
initControls(layout);
|
initControls(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void show(FrameLayout layout) {
|
public final void show(FrameLayout layout) {
|
||||||
visible = true;
|
visible = true;
|
||||||
showControls(layout);
|
showControls(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void showWithDelay(final FrameLayout layout, final long delay) {
|
public final void showWithDelay(final FrameLayout layout, final long delay) {
|
||||||
this.delayTime = System.currentTimeMillis() + delay;
|
this.delayTime = System.currentTimeMillis() + delay;
|
||||||
if(!visible) {
|
if(!visible) {
|
||||||
|
@ -158,25 +158,25 @@ public abstract class MapControls {
|
||||||
}
|
}
|
||||||
}, delay);
|
}, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void hide(FrameLayout layout) {
|
public final void hide(FrameLayout layout) {
|
||||||
if(this.delayTime == 0) {
|
if(this.delayTime == 0) {
|
||||||
visible = false;
|
visible = false;
|
||||||
hideControls(layout);
|
hideControls(layout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void forceHide(FrameLayout layout) {
|
public final void forceHide(FrameLayout layout) {
|
||||||
delayTime = 0;
|
delayTime = 0;
|
||||||
visible = false;
|
visible = false;
|
||||||
hideControls(layout);
|
hideControls(layout);
|
||||||
mapActivity.getMapView().refreshMap();
|
mapActivity.getMapView().refreshMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisible() {
|
public boolean isVisible() {
|
||||||
return visible;
|
return visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isLeft() {
|
protected boolean isLeft() {
|
||||||
return (Gravity.LEFT & gravity) == Gravity.LEFT;
|
return (Gravity.LEFT & gravity) == Gravity.LEFT;
|
||||||
}
|
}
|
||||||
|
@ -184,23 +184,23 @@ public abstract class MapControls {
|
||||||
public boolean isBottom() {
|
public boolean isBottom() {
|
||||||
return (Gravity.BOTTOM & gravity) == Gravity.BOTTOM;
|
return (Gravity.BOTTOM & gravity) == Gravity.BOTTOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void initControls(FrameLayout layout) {
|
protected void initControls(FrameLayout layout) {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void hideControls(FrameLayout layout);
|
protected abstract void hideControls(FrameLayout layout);
|
||||||
|
|
||||||
protected abstract void showControls(FrameLayout layout);
|
protected abstract void showControls(FrameLayout layout);
|
||||||
|
|
||||||
|
|
||||||
public abstract void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode);
|
public abstract void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode);
|
||||||
|
|
||||||
|
|
||||||
public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) {
|
public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
|
public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -208,4 +208,8 @@ public abstract class MapControls {
|
||||||
public void setExtraVerticalMargin(int extraVerticalMargin) {
|
public void setExtraVerticalMargin(int extraVerticalMargin) {
|
||||||
this.extraVerticalMargin = extraVerticalMargin;
|
this.extraVerticalMargin = extraVerticalMargin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getExtraVerticalMargin() {
|
||||||
|
return this.extraVerticalMargin;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,9 @@ package net.osmand.plus.views.controls;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.graphics.Point;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import android.view.*;
|
||||||
import net.osmand.data.FavouritePoint;
|
import net.osmand.data.FavouritePoint;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
@ -31,10 +34,6 @@ import android.graphics.Canvas;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
@ -56,9 +55,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
|
||||||
private AlertDialog favoritesDialog;
|
private AlertDialog favoritesDialog;
|
||||||
private boolean selectFromMapTouch;
|
private boolean selectFromMapTouch;
|
||||||
private boolean selectFromMapForTarget;
|
private boolean selectFromMapForTarget;
|
||||||
|
|
||||||
|
private boolean showDialog = false;
|
||||||
public MapRouteInfoControl(ContextMenuLayer contextMenu,
|
|
||||||
|
public MapRouteInfoControl(ContextMenuLayer contextMenu,
|
||||||
MapActivity mapActivity, Handler showUIHandler, float scaleCoefficient) {
|
MapActivity mapActivity, Handler showUIHandler, float scaleCoefficient) {
|
||||||
super(mapActivity, showUIHandler, scaleCoefficient);
|
super(mapActivity, showUIHandler, scaleCoefficient);
|
||||||
this.contextMenu = contextMenu;
|
this.contextMenu = contextMenu;
|
||||||
|
@ -86,6 +86,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
|
||||||
@Override
|
@Override
|
||||||
public void showControls(FrameLayout parent) {
|
public void showControls(FrameLayout parent) {
|
||||||
infoButton = addButton(parent, R.string.route_info, R.drawable.map_btn_signpost);
|
infoButton = addButton(parent, R.string.route_info, R.drawable.map_btn_signpost);
|
||||||
|
if (showDialog){
|
||||||
|
showDialog();
|
||||||
|
showDialog = false;
|
||||||
|
}
|
||||||
controlVisible = true;
|
controlVisible = true;
|
||||||
infoButton.setOnClickListener(new View.OnClickListener() {
|
infoButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -98,9 +102,6 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(getTargets().getPointToNavigate() == null) {
|
|
||||||
showDialog();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dialog createDialog() {
|
private Dialog createDialog() {
|
||||||
|
@ -131,7 +132,7 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
|
||||||
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||||
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||||
lp.gravity = Gravity.BOTTOM;
|
lp.gravity = Gravity.BOTTOM;
|
||||||
lp.y = (int) (infoButton.getBottom() - infoButton.getTop() + scaleCoefficient * 5);
|
lp.y = (int) (infoButton.getBottom() - infoButton.getTop() + scaleCoefficient * 5 + getExtraVerticalMargin());
|
||||||
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
|
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
|
||||||
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
|
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
|
||||||
dialog.getWindow().setAttributes(lp);
|
dialog.getWindow().setAttributes(lp);
|
||||||
|
@ -456,4 +457,8 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
|
||||||
infoButton.setBackgroundResource(R.drawable.map_btn_signpost);
|
infoButton.setBackgroundResource(R.drawable.map_btn_signpost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setShowDialog() {
|
||||||
|
showDialog = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,7 +202,7 @@ public class MapRoutePreferencesControl extends MapControls {
|
||||||
settings.GPX_ROUTE_CALC.set(selected);
|
settings.GPX_ROUTE_CALC.set(selected);
|
||||||
rp.setCalculateOsmAndRoute(selected);
|
rp.setCalculateOsmAndRoute(selected);
|
||||||
updateParameters();
|
updateParameters();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gpxParam.id == R.string.calculate_osmand_route_without_internet) {
|
if (gpxParam.id == R.string.calculate_osmand_route_without_internet) {
|
||||||
settings.GPX_ROUTE_CALC_OSMAND_PARTS.set(selected);
|
settings.GPX_ROUTE_CALC_OSMAND_PARTS.set(selected);
|
||||||
|
@ -210,11 +210,16 @@ public class MapRoutePreferencesControl extends MapControls {
|
||||||
if (gpxParam.id == R.string.fast_route_mode) {
|
if (gpxParam.id == R.string.fast_route_mode) {
|
||||||
settings.FAST_ROUTE_MODE.set(selected);
|
settings.FAST_ROUTE_MODE.set(selected);
|
||||||
}
|
}
|
||||||
|
if (gpxParam.id == R.string.announce_nearby_favorites){
|
||||||
|
settings.ANNOUNCE_NEARBY_FAVORITES.set(selected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<LocalRoutingParameter> getRoutingParameters(ApplicationMode am) {
|
private List<LocalRoutingParameter> getRoutingParameters(ApplicationMode am) {
|
||||||
List<LocalRoutingParameter> list = new ArrayList<LocalRoutingParameter>();
|
List<LocalRoutingParameter> list = new ArrayList<LocalRoutingParameter>();
|
||||||
|
list.add(new OtherLocalRoutingParameter(R.string.announce_nearby_favorites,
|
||||||
|
mapActivity.getString(R.string.announce_nearby_favorites), settings.ANNOUNCE_NEARBY_FAVORITES.get()));
|
||||||
GPXRouteParamsBuilder rparams = mapActivity.getRoutingHelper().getCurrentGPXRoute();
|
GPXRouteParamsBuilder rparams = mapActivity.getRoutingHelper().getCurrentGPXRoute();
|
||||||
boolean osmandRouter = settings.ROUTER_SERVICE.get() == RouteService.OSMAND ;
|
boolean osmandRouter = settings.ROUTER_SERVICE.get() == RouteService.OSMAND ;
|
||||||
if(!osmandRouter) {
|
if(!osmandRouter) {
|
||||||
|
@ -255,6 +260,7 @@ public class MapRoutePreferencesControl extends MapControls {
|
||||||
list.add(rp);
|
list.add(rp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
private String getString(int id) {
|
private String getString(int id) {
|
||||||
|
|
Loading…
Reference in a new issue