From e225ad7b03693623bbad7fac3a60700248aee43d Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 17 Jun 2020 16:42:05 +0300 Subject: [PATCH] Fix gpx context menu navigation and add check for segment bounds --- .../main/java/net/osmand/GPXUtilities.java | 18 +++++++++++++ .../src/net/osmand/data/PointDescription.java | 4 +++ .../osmand/plus/activities/MapActivity.java | 5 ++++ .../src/net/osmand/plus/views/GPXLayer.java | 4 +-- .../src/net/osmand/plus/views/Renderable.java | 26 +++++-------------- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java index f3cb0f8b84..6eb20d0f15 100644 --- a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java @@ -957,6 +957,24 @@ public class GPXUtilities { return ls; } + public static QuadRect calculateBounds(List pts) { + QuadRect trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, + Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); + updateBounds(trackBounds, pts, 0); + + return trackBounds; + } + + public static void updateBounds(QuadRect trackBounds, List pts, int startIndex) { + for (int i = startIndex; i < pts.size(); i++) { + WptPt pt = pts.get(i); + trackBounds.right = Math.max(trackBounds.right, pt.lon); + trackBounds.left = Math.min(trackBounds.left, pt.lon); + trackBounds.top = Math.max(trackBounds.top, pt.lat); + trackBounds.bottom = Math.min(trackBounds.bottom, pt.lat); + } + } + public static class GPXFile extends GPXExtensions { public String author; public Metadata metadata; diff --git a/OsmAnd/src/net/osmand/data/PointDescription.java b/OsmAnd/src/net/osmand/data/PointDescription.java index 79b4cfe9e7..3057678526 100644 --- a/OsmAnd/src/net/osmand/data/PointDescription.java +++ b/OsmAnd/src/net/osmand/data/PointDescription.java @@ -289,6 +289,10 @@ public class PointDescription { return POINT_TYPE_CUSTOM_POI_FILTER.equals(type); } + public boolean isGpxPoint() { + return POINT_TYPE_GPX.equals(type); + } + @Override public int hashCode() { final int prime = 31; diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 9bc9d3e24b..e1b80ebf53 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -673,6 +673,11 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } if (trackDetailsMenu.isVisible()) { trackDetailsMenu.hide(true); + if (mapContextMenu.isActive() && mapContextMenu.getPointDescription() != null + && mapContextMenu.getPointDescription().isGpxPoint()) { + mapContextMenu.show(); + return; + } if (prevActivityIntent == null) { return; } diff --git a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java index ee73e581c9..ad6f8b89db 100644 --- a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java @@ -604,8 +604,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM for (SelectedGpxFile selectedGpxFile : selectedGpxFiles) { List segments = selectedGpxFile.getPointsToDisplay(); for (TrkSegment segment : segments) { - boolean nearSegment = isPointNearSegment(tb, segment.points, r, mx, my); - if (nearSegment) { + QuadRect trackBounds = GPXUtilities.calculateBounds(segment.points); + if (QuadRect.trivialOverlap(tb.getLatLonBounds(), trackBounds) && isPointNearSegment(tb, segment.points, r, mx, my)) { res.add(selectedGpxFile); break; } diff --git a/OsmAnd/src/net/osmand/plus/views/Renderable.java b/OsmAnd/src/net/osmand/plus/views/Renderable.java index 5204ca9332..e8bd0e75be 100644 --- a/OsmAnd/src/net/osmand/plus/views/Renderable.java +++ b/OsmAnd/src/net/osmand/plus/views/Renderable.java @@ -5,6 +5,7 @@ import android.graphics.Paint; import androidx.annotation.NonNull; +import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.WptPt; import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; @@ -61,10 +62,10 @@ public class Renderable { protected AsynchronousResampler culler = null; // The currently active resampler protected Paint paint = null; // MUST be set by 'updateLocalPaint' before use - public RenderableSegment(List points, double segmentSize) { + public RenderableSegment(List points, double segmentSize) { this.points = points; - calculateBounds(points); this.segmentSize = segmentSize; + trackBounds = GPXUtilities.calculateBounds(points); } protected void updateLocalPaint(Paint p) { @@ -90,23 +91,6 @@ public class Renderable { } } - private void calculateBounds(List pts) { - trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, - Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); - updateBounds(pts, 0); - } - - protected void updateBounds(List pts, int startIndex) { - pointSize = pts.size(); - for (int i = startIndex; i < pointSize; i++) { - WptPt pt = pts.get(i); - trackBounds.right = Math.max(trackBounds.right, pt.lon); - trackBounds.left = Math.min(trackBounds.left, pt.lon); - trackBounds.top = Math.max(trackBounds.top, pt.lat); - trackBounds.bottom = Math.min(trackBounds.bottom, pt.lat); - } - } - public void setRDP(List cull) { culled = cull; } @@ -198,7 +182,9 @@ public class Renderable { @Override public void drawSegment(double zoom, Paint p, Canvas canvas, RotatedTileBox tileBox) { if (points.size() != pointSize) { - updateBounds(points, pointSize); + int prevSize = pointSize; + pointSize = points.size(); + GPXUtilities.updateBounds(trackBounds, points, prevSize); } drawSingleSegment(zoom, p, canvas, tileBox); }