Merge pull request #9261 from osmandapp/gpx_context_menu

Gpx context menu fixes
This commit is contained in:
vshcherb 2020-06-17 16:39:49 +02:00 committed by GitHub
commit 86378cbc93
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 54 additions and 31 deletions

View file

@ -957,6 +957,24 @@ public class GPXUtilities {
return ls;
}
public static QuadRect calculateBounds(List<WptPt> 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<WptPt> 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;

View file

@ -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;

View file

@ -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;
}

View file

@ -37,7 +37,6 @@ public class SelectedGpxMenuController extends MenuController {
public void buttonPressed() {
Intent intent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getTrackActivity());
intent.putExtra(TrackActivity.TRACK_FILE_NAME, item.getGpxFile().path);
intent.putExtra(TrackActivity.OPEN_TRACKS_LIST, true);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
mapActivity.startActivity(intent);
}

View file

@ -212,8 +212,8 @@ public class TrackDetailsMenu {
}
}
public void updateInfo(final View main) {
updateView(main);
public void updateInfo(final View main, boolean forceFitTrackOnMap) {
updateView(main, forceFitTrackOnMap);
}
@Nullable
@ -485,7 +485,7 @@ public class TrackDetailsMenu {
return xAxisPoints;
}
private void updateView(final View parentView) {
private void updateView(final View parentView, boolean forceFitTrackOnMap) {
MapActivity mapActivity = getMapActivity();
GpxDisplayItem gpxItem = getGpxItem();
if (mapActivity == null || gpxItem == null) {
@ -724,7 +724,7 @@ public class TrackDetailsMenu {
xAxisArrow.setVisibility(View.GONE);
}
refreshChart(chart, true);
refreshChart(chart, forceFitTrackOnMap);
}
private void updateChart(LineChart chart) {

View file

@ -23,6 +23,7 @@ import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
public static final String TAG = "TrackDetailsMenuFragment";
@ -91,14 +92,20 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
});
}
updateInfo();
MapContextMenu contextMenu = mapActivity.getContextMenu();
final boolean forceFitTrackOnMap;
if (contextMenu.isActive()) {
forceFitTrackOnMap = !(contextMenu.getPointDescription() != null && contextMenu.getPointDescription().isGpxPoint());
} else {
forceFitTrackOnMap = true;
}
updateInfo(forceFitTrackOnMap);
ViewTreeObserver vto = mainView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = mainView.getViewTreeObserver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
obs.removeOnGlobalLayoutListener(this);
@ -106,7 +113,7 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
obs.removeGlobalOnLayoutListener(this);
}
if (getMapActivity() != null) {
updateInfo();
updateInfo(forceFitTrackOnMap);
}
}
});
@ -165,7 +172,11 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
}
public void updateInfo() {
menu.updateInfo(mainView);
updateInfo(true);
}
public void updateInfo(boolean forceFitTrackOnMap) {
menu.updateInfo(mainView, forceFitTrackOnMap);
applyDayNightMode();
}

View file

@ -604,8 +604,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
for (SelectedGpxFile selectedGpxFile : selectedGpxFiles) {
List<TrkSegment> 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;
}

View file

@ -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 <WptPt> points, double segmentSize) {
public RenderableSegment(List<WptPt> 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<WptPt> pts) {
trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY,
Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
updateBounds(pts, 0);
}
protected void updateBounds(List<WptPt> 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<WptPt> 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);
}