diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index e3d5789d18..755164e655 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -1940,4 +1940,5 @@ Afghanistan, Albania, Algeria, Andorra, Angola, Anguilla, Antigua and Barbuda, A Choose whether to play a sound when shooting photos Invalid format: %s Remove all + Announce nearby favorites diff --git a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java index 86e83784fc..f4a1f8dab4 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java @@ -1,16 +1,16 @@ package net.osmand.plus; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import android.widget.ListView; import net.osmand.GeoidAltitudeCorrection; import net.osmand.PlatformUtil; import net.osmand.access.NavigationInfo; import net.osmand.binary.RouteDataObject; import net.osmand.data.LatLon; +import net.osmand.data.LocationPoint; import net.osmand.data.QuadPoint; import net.osmand.plus.OsmandSettings.OsmandPreference; import net.osmand.plus.routing.RoutingHelper; @@ -66,9 +66,7 @@ public class OsmAndLocationProvider implements SensorEventListener { private float[] mGravs = new float[3]; private float[] mGeoMags = new float[3]; private float previousCorrectionValue = 360; - - - + private static final boolean USE_KALMAN_FILTER = true; private static final float KALMAN_COEFFICIENT = 0.04f; @@ -104,8 +102,114 @@ public class OsmAndLocationProvider implements SensorEventListener { private float[] mRotationM = new float[9]; private OsmandPreference USE_MAGNETIC_FIELD_SENSOR_COMPASS; private OsmandPreference 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 locationPointsStates = new ConcurrentHashMap(); + private List visibleLocationPoints = new CopyOnWriteArrayList(); + private long locationPointsModified; + + public List getVisibleLocationPoints() { + return visibleLocationPoints; + } + + public void setVisibleLocationPoints(List 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 getComparator(final net.osmand.Location lastLocation){ + return new Comparator() { + @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 removeFromList(List items, Object item){ + List newArray = new ArrayList(); + Object[] oldArray = items.toArray(); + for (int i=0; i(newArray); + } + public class SimulationProvider { private int currentRoad; private int currentSegment; @@ -518,6 +622,10 @@ public class OsmAndLocationProvider implements SensorEventListener { private void updateLocation(net.osmand.Location loc ) { + if (app.getSettings().ANNOUNCE_NEARBY_FAVORITES.get()){ + sortVisibleLocationPoints(); + announceVisibleLocations(); + } for(OsmAndLocationListener l : locationListeners){ l.updateLocation(loc); } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 8f2369723a..882b96fb20 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -818,8 +818,8 @@ public class OsmandSettings { public final OsmandPreference GPX_CALCULATE_RTEPT = new BooleanPreference("gpx_routing_calculate_rtept", true).makeGlobal().cache(); public final OsmandPreference GPX_SPEAK_WPT = new BooleanPreference("speak_gpx_wpt", true).makeGlobal().cache(); public final OsmandPreference GPX_ROUTE_CALC = new BooleanPreference("calc_gpx_route", false).makeGlobal().cache(); - - + + public final OsmandPreference ANNOUNCE_NEARBY_FAVORITES = new BooleanPreference("announce_nearby_favorites", false).makeGlobal().cache(); public final OsmandPreference AVOID_TOLL_ROADS = new BooleanPreference("avoid_toll_roads", false).makeProfile().cache(); public final OsmandPreference AVOID_MOTORWAY = new BooleanPreference("avoid_motorway", false).makeProfile().cache(); diff --git a/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java b/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java index c1f6d688ea..68cbe0eaaa 100644 --- a/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java +++ b/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java @@ -25,8 +25,6 @@ public class TargetPointsHelper { private RoutingHelper routingHelper; private List> listeners = new ArrayList>(); private OsmandApplication ctx; - private List visibleLocationPoints = new CopyOnWriteArrayList(); - private long locationPointsModified; public TargetPointsHelper(OsmandApplication ctx){ this.ctx = ctx; @@ -69,47 +67,7 @@ public class TargetPointsHelper { return intermediatePoints; } - public List 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() { - @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 getIntermediatePointsWithTarget() { diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 6cb301f648..99acc6552b 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -642,6 +642,7 @@ public class MapActivityActions implements DialogProvider { mapActivity.getMapViewTrackingUtilities().switchToRoutePlanningMode(); mapActivity.getMapView().refreshMap(true); + mapActivity.getMapLayers().getMapControlsLayer().showDialog(); if(targets.hasTooLongDistanceToNavigate()) { app.showToastMessage(R.string.route_is_too_long); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 2c73c90814..b23ee8ebf1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -32,15 +32,14 @@ public class RouteCalculationResult { private final List directions; private final List segments; private final List alarmInfo; - private final List waypoints; private final String errorMessage; private final int[] listDistance; private final int[] intermediatePoints; - private final int[] waypointIndexes; private final float routingTime; protected int cacheCurrentTextDirectionInfo = -1; protected List cacheAgreggatedDirections; + protected List locationPoints = new ArrayList(); // Note always currentRoute > get(currentDirectionInfo).routeOffset, // but currentRoute <= get(currentDirectionInfo+1).routeOffset @@ -60,12 +59,9 @@ public class RouteCalculationResult { this.listDistance = new int[0]; this.directions = new ArrayList(); this.alarmInfo = new ArrayList(); - this.waypointIndexes = new int[0]; - this.waypoints = new ArrayList(); } - public RouteCalculationResult(List list, List directions, RouteCalculationParams params, - DataTileManager waypointsTm) { + public RouteCalculationResult(List list, List directions, RouteCalculationParams params) { this.routingTime = 0; this.errorMessage = null; 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); this.directions = Collections.unmodifiableList(localDirections); updateDirectionsTime(this.directions, this.listDistance); - this.waypoints = new ArrayList(); - this.waypointIndexes = calculateWaypointIndexes(list, waypointsTm, waypoints); } public RouteCalculationResult(List list, Location start, LatLon end, List intermediates, - Context ctx, boolean leftSide, float routingTime,DataTileManager waypointsTm) { + Context ctx, boolean leftSide, float routingTime, List waypoints) { this.routingTime = routingTime; + if(waypoints != null) { + this.locationPoints.addAll(waypoints); + } List computeDirections = new ArrayList(); this.errorMessage = null; this.intermediatePoints = new int[intermediates == null ? 0 : intermediates.size()]; @@ -115,36 +112,12 @@ public class RouteCalculationResult { this.directions = Collections.unmodifiableList(computeDirections); updateDirectionsTime(this.directions, this.listDistance); this.alarmInfo = Collections.unmodifiableList(alarms); - this.waypoints = new ArrayList(); + } - this.waypointIndexes = calculateWaypointIndexes(this.locations, waypointsTm, waypoints); + public List getLocationPoints() { + return locationPoints; } - - public List getWaypointsToAnnounce(Location loc) { - if (currentWaypointGPX != lastWaypointGPX && loc != null) { - ArrayList points = new ArrayList(); - 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 locations, List intermediates, List localDirections, int[] intermediatePoints) { if(intermediates != null && localDirections != null) { @@ -758,9 +731,6 @@ public class RouteCalculationResult { while (nextAlarmInfo < alarmInfo.size() && alarmInfo.get(nextAlarmInfo).locationIndex < currentRoute) { nextAlarmInfo++; } - while(lastWaypointGPX < waypointIndexes.length && waypointIndexes[lastWaypointGPX] <= currentRoute) { - lastWaypointGPX++; - } while(nextIntermediate < intermediatePoints.length) { RouteDirectionInfo dir = directions.get(intermediatePoints[nextIntermediate]); if(dir.routePointOffset < currentRoute) { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index c29bcb0517..26c3948fea 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -29,6 +29,7 @@ import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.DataTileManager; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; +import net.osmand.data.LocationPoint; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; @@ -203,12 +204,12 @@ public class RouteProvider { public static class GPXRouteParams { List points = new ArrayList(); List directions; - DataTileManager wpt; boolean calculateOsmAndRoute; boolean passWholeRoute; boolean calculateOsmAndRouteParts; boolean useIntermediatePointsRTE; - + private List wpt; + public List getPoints() { return points; } @@ -244,6 +245,9 @@ public class RouteProvider { useIntermediatePointsRTE = builder.useIntermediatePointsRTE; boolean announceWaypoints = builder.announceWaypoints; builder.calculateOsmAndRoute = false; // Disabled temporary builder.calculateOsmAndRoute; + if(announceWaypoints && !file.points.isEmpty()) { + wpt = new ArrayList(file.points ); + } if(file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)){ directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10); if(reverse){ @@ -273,14 +277,6 @@ public class RouteProvider { Collections.reverse(points); } } - wpt = null; - if(announceWaypoints && !file.points.isEmpty()) { - wpt = new DataTileManager(17); - for(WptPt w : file.points ) { - wpt.registerObjectXY(MapUtils.get31TileNumberX(w.lon), - MapUtils.get31TileNumberY(w.lat),w) ; - } - } return this; } @@ -358,7 +354,7 @@ public class RouteProvider { locs = findStartAndEndLocationsFromRoute(locs, params.start, params.end, startI, endI); List directions = calcDirections(startI, endI, rcr.getRouteDirections()); insertInitialSegment(params, locs, directions, true); - res = new RouteCalculationResult(locs, directions, params, null); + res = new RouteCalculationResult(locs, directions, params); } catch (RuntimeException e) { e.printStackTrace(); } @@ -392,7 +388,7 @@ public class RouteProvider { info.distance = 0; info.afterLeftTime = 0; } - RouteCalculationResult res = new RouteCalculationResult(gpxRoute, gpxDirections, routeParams, gpxParams.wpt); + RouteCalculationResult res = new RouteCalculationResult(gpxRoute, gpxDirections, routeParams); return res; } @@ -626,7 +622,7 @@ public class RouteProvider { } } 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 { @@ -777,13 +773,8 @@ public class RouteProvider { // something really strange better to see that message on the scren return emptyResult(); } else { - DataTileManager mngr = new DataTileManager(17); - List points = params.ctx.getFavorites().getFavouritePoints(); - 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); + RouteCalculationResult res = new RouteCalculationResult(result, params.start, params.end, + params.intermediates, params.ctx, params.leftSide, ctx.routingTime, params.gpxRoute == null? null: params.gpxRoute.wpt); return res; } } catch (RuntimeException e) { @@ -1000,7 +991,7 @@ public class RouteProvider { } } params.intermediates = null; - return new RouteCalculationResult(res, null, params, null); + return new RouteCalculationResult(res, null, params); } public GPXFile createOsmandRouterGPX(RouteCalculationResult srcRoute, OsmandApplication ctx){ @@ -1145,7 +1136,7 @@ public class RouteProvider { res.add(createLocation(pt)); } 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) { 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) { @@ -1247,7 +1238,7 @@ public class RouteProvider { location.setLatitude(lats[1]); location.setLongitude(lons[1]); dots.add(location); - return new RouteCalculationResult(dots,null,params,null); + return new RouteCalculationResult(dots,null,params); } } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 876c1864db..4498cadcb6 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -13,7 +13,6 @@ import net.osmand.data.LatLon; import net.osmand.data.LocationPoint; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities.GPXFile; -import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.NavigationService; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; @@ -26,7 +25,6 @@ import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RouteProvider.RouteService; -import net.osmand.plus.sherpafy.WaypointDialogHelper; import net.osmand.plus.voice.CommandPlayer; import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RouteSegmentResult; @@ -270,7 +268,6 @@ public class RoutingHelper { // 5. Update Voice router if (isFollowingMode) { // don't update in route planing mode - announceGpxWaypoints(currentLocation); boolean inRecalc = calculateRoute || isRouteBeingCalculated(); if (!inRecalc && !wrongMovementDirection) { voiceRouter.updateStatus(currentLocation, false); @@ -317,25 +314,6 @@ public class RoutingHelper { } } - - private void announceGpxWaypoints(Location currentLocation) { - if (currentLocation != null) { - List 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) { return MapUtils.getOrthogonalDistance(loc.getLatitude(), loc.getLongitude(), from.getLatitude(), from.getLongitude(), @@ -537,6 +515,12 @@ public class RoutingHelper { } private synchronized void setNewRoute(RouteCalculationResult res, Location start){ + ArrayList locationPoints = new ArrayList(); + 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(); route = res; if (isFollowingMode) { diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 8e285bc654..7bc46bcea1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -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) { currentSpeed = DEFAULT_SPEED; } diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/WaypointDialogHelper.java b/OsmAnd/src/net/osmand/plus/sherpafy/WaypointDialogHelper.java index 49193e639e..15f15b19c3 100644 --- a/OsmAnd/src/net/osmand/plus/sherpafy/WaypointDialogHelper.java +++ b/OsmAnd/src/net/osmand/plus/sherpafy/WaypointDialogHelper.java @@ -1,7 +1,6 @@ package net.osmand.plus.sherpafy; import android.app.AlertDialog; -import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -17,7 +16,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.*; import net.osmand.Location; -import net.osmand.data.LatLon; import net.osmand.data.LocationPoint; import net.osmand.plus.*; import net.osmand.plus.activities.FavouritesActivity; @@ -35,7 +33,7 @@ public class WaypointDialogHelper { private MapActivity mapActivity; private OsmandApplication app; private FrameLayout mainLayout; - private TargetPointsHelper targetPointsHelper; + private OsmAndLocationProvider locationProvider; public static boolean OVERLAP_LAYOUT = true; private long uiModified; @@ -43,14 +41,14 @@ public class WaypointDialogHelper { public WaypointDialogHelper(MapActivity mapActivity) { this.app = mapActivity.getMyApplication(); - targetPointsHelper = this.app.getTargetPointsHelper(); + locationProvider = this.app.getLocationProvider(); this.mapActivity = mapActivity; this.mainLayout = (FrameLayout) ((FrameLayout) mapActivity.getLayout()).getChildAt(0); } public void updateDialog() { - List vlp = targetPointsHelper.getVisibleLocationPoints(); - long locationPointsModified = targetPointsHelper.getLocationPointsModified(); + List vlp = locationProvider.getVisibleLocationPoints(); + long locationPointsModified = locationProvider.getLocationPointsModified(); if (locationPointsModified != uiModified) { uiModified = locationPointsModified; if (vlp.isEmpty()) { @@ -80,7 +78,7 @@ public class WaypointDialogHelper { btnN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - targetPointsHelper.removeVisibleLocationPoint(point); + locationProvider.removeVisibleLocationPoint(point); updateDialog(); } }); @@ -189,7 +187,7 @@ public class WaypointDialogHelper { } public void showAllDialog(){ - final List visibleLocationPoints = targetPointsHelper.getVisibleLocationPoints(); + final List visibleLocationPoints = locationProvider.getVisibleLocationPoints(); final ArrayAdapter listAdapter = new ArrayAdapter(mapActivity, R.layout.waypoint_reached, R.id.title, visibleLocationPoints) { @Override @@ -205,6 +203,13 @@ public class WaypointDialogHelper { v.findViewById(R.id.waypoint_icon).setLayoutParams(ll); } 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); ((ImageButton) remove).setImageDrawable(mapActivity.getResources().getDrawable( @@ -213,9 +218,9 @@ public class WaypointDialogHelper { remove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - LocationPoint point = targetPointsHelper.getVisibleLocationPoints().get(position); + LocationPoint point = locationProvider.getVisibleLocationPoints().get(position); remove(point); - targetPointsHelper.removeVisibleLocationPoint(point); + locationProvider.removeVisibleLocationPoint(point); notifyDataSetChanged(); } }); @@ -229,7 +234,7 @@ public class WaypointDialogHelper { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override 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() { @Override public void onClick(DialogInterface dialogInterface, int i) { - targetPointsHelper.removeAllVisiblePoints(); + locationProvider.clearAllVisiblePoints(); updateDialog(); } }); 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()); + } } diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index d65b7e45f4..9108ee9c5e 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -320,6 +320,10 @@ public class MapControlsLayer extends OsmandMapLayer { } } + public void showDialog(){ + mapInfoNavigationControl.setShowDialog(); + } + public WaypointDialogHelper getWaypointDialogHelper() { return waypointDialogHelper; } diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java b/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java index 8608a77c34..71f0ba45e1 100644 --- a/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java +++ b/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java @@ -26,7 +26,7 @@ public abstract class MapControls { protected int shadowColor; private boolean visible; private long delayTime; - + protected int gravity = Gravity.BOTTOM | Gravity.RIGHT; protected int margin; protected int vmargin; @@ -40,19 +40,19 @@ public abstract class MapControls { this.showUIHandler = showUIHandler; this.scaleCoefficient = scaleCoefficient; } - - + + public void setGravity(int gravity) { this.gravity = gravity; } - + public void setMargin(int margin) { this.margin = margin; } public void setVerticalMargin(int vmargin) { this.vmargin = vmargin; } - + protected ImageButton addImageButton(FrameLayout parent, int stringId, int resourceId) { Context ctx = mapActivity; ImageButton button = new ImageButton(ctx); @@ -73,17 +73,17 @@ public abstract class MapControls { applyAttributes(ctx, parent, button, stringId, resourceId, extraMargin); return button; } - + public void setNotifyClick(Runnable notifyClick) { this.notifyClick = notifyClick; } - + protected void notifyClicked() { if(notifyClick != null) { notifyClick.run(); } } - + private void applyAttributes(Context ctx, FrameLayout parent, View button, int stringId, int resourceId, int extraMargin) { @@ -124,12 +124,12 @@ public abstract class MapControls { public final void init(FrameLayout layout) { initControls(layout); } - + public final void show(FrameLayout layout) { visible = true; showControls(layout); } - + public final void showWithDelay(final FrameLayout layout, final long delay) { this.delayTime = System.currentTimeMillis() + delay; if(!visible) { @@ -158,25 +158,25 @@ public abstract class MapControls { } }, delay); } - + public final void hide(FrameLayout layout) { if(this.delayTime == 0) { visible = false; hideControls(layout); } } - + public final void forceHide(FrameLayout layout) { delayTime = 0; visible = false; hideControls(layout); mapActivity.getMapView().refreshMap(); } - + public boolean isVisible() { return visible; } - + protected boolean isLeft() { return (Gravity.LEFT & gravity) == Gravity.LEFT; } @@ -184,23 +184,23 @@ public abstract class MapControls { public boolean isBottom() { return (Gravity.BOTTOM & gravity) == Gravity.BOTTOM; } - - + + protected void initControls(FrameLayout layout) { } protected abstract void hideControls(FrameLayout layout); - + protected abstract void showControls(FrameLayout layout); - + public abstract void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode); - - + + public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) { return false; } - + public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { return false; } @@ -208,4 +208,8 @@ public abstract class MapControls { public void setExtraVerticalMargin(int extraVerticalMargin) { this.extraVerticalMargin = extraVerticalMargin; } + + public int getExtraVerticalMargin() { + return this.extraVerticalMargin; + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java b/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java index 7b99e389a4..f565ce6f2f 100644 --- a/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java +++ b/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java @@ -3,6 +3,9 @@ package net.osmand.plus.views.controls; import java.util.ArrayList; import java.util.List; +import android.graphics.Point; +import android.os.SystemClock; +import android.view.*; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; import net.osmand.data.RotatedTileBox; @@ -31,10 +34,6 @@ import android.graphics.Canvas; import android.graphics.PointF; import android.graphics.drawable.Drawable; 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.ArrayAdapter; import android.widget.Button; @@ -56,9 +55,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio private AlertDialog favoritesDialog; private boolean selectFromMapTouch; private boolean selectFromMapForTarget; - - - public MapRouteInfoControl(ContextMenuLayer contextMenu, + + private boolean showDialog = false; + + public MapRouteInfoControl(ContextMenuLayer contextMenu, MapActivity mapActivity, Handler showUIHandler, float scaleCoefficient) { super(mapActivity, showUIHandler, scaleCoefficient); this.contextMenu = contextMenu; @@ -86,6 +86,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio @Override public void showControls(FrameLayout parent) { infoButton = addButton(parent, R.string.route_info, R.drawable.map_btn_signpost); + if (showDialog){ + showDialog(); + showDialog = false; + } controlVisible = true; infoButton.setOnClickListener(new View.OnClickListener() { @Override @@ -98,9 +102,6 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio } } }); - if(getTargets().getPointToNavigate() == null) { - showDialog(); - } } private Dialog createDialog() { @@ -131,7 +132,7 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio lp.width = WindowManager.LayoutParams.WRAP_CONTENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; 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().requestFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setAttributes(lp); @@ -456,4 +457,8 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio infoButton.setBackgroundResource(R.drawable.map_btn_signpost); } } + + public void setShowDialog() { + showDialog = true; + } } diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapRoutePreferencesControl.java b/OsmAnd/src/net/osmand/plus/views/controls/MapRoutePreferencesControl.java index 3ba34e2e86..918b880e31 100644 --- a/OsmAnd/src/net/osmand/plus/views/controls/MapRoutePreferencesControl.java +++ b/OsmAnd/src/net/osmand/plus/views/controls/MapRoutePreferencesControl.java @@ -202,7 +202,7 @@ public class MapRoutePreferencesControl extends MapControls { settings.GPX_ROUTE_CALC.set(selected); rp.setCalculateOsmAndRoute(selected); updateParameters(); - } + } } if (gpxParam.id == R.string.calculate_osmand_route_without_internet) { 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) { settings.FAST_ROUTE_MODE.set(selected); } + if (gpxParam.id == R.string.announce_nearby_favorites){ + settings.ANNOUNCE_NEARBY_FAVORITES.set(selected); + } } private List getRoutingParameters(ApplicationMode am) { List list = new ArrayList(); + 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(); boolean osmandRouter = settings.ROUTER_SERVICE.get() == RouteService.OSMAND ; if(!osmandRouter) { @@ -255,6 +260,7 @@ public class MapRoutePreferencesControl extends MapControls { list.add(rp); } } + return list; } private String getString(int id) {