Merge pull request #9313 from osmandapp/analyze_gpx_fixes
Analyze gpx fixes
This commit is contained in:
commit
998bec38ef
10 changed files with 210 additions and 87 deletions
|
@ -22,11 +22,11 @@ import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
|
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
|
|
||||||
import net.osmand.plus.activities.SavingTrackHelper;
|
import net.osmand.plus.activities.SavingTrackHelper;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper;
|
import net.osmand.plus.helpers.GpxUiHelper;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
|
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
@ -639,6 +639,12 @@ public class GpxSelectionHelper {
|
||||||
selectedGPXFiles = newSelectedGPXFiles;
|
selectedGPXFiles = newSelectedGPXFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateSelectedGpxFile(SelectedGpxFile selectedGpxFile) {
|
||||||
|
if (selectedGPXFiles.contains(selectedGpxFile)) {
|
||||||
|
saveCurrentSelections();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public SelectedGpxFile selectGpxFile(GPXFile gpx, boolean show, boolean notShowNavigationDialog) {
|
public SelectedGpxFile selectGpxFile(GPXFile gpx, boolean show, boolean notShowNavigationDialog) {
|
||||||
return selectGpxFile(gpx, show, notShowNavigationDialog, true, true, true);
|
return selectGpxFile(gpx, show, notShowNavigationDialog, true, true, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ public class SelectedGpxMenuBuilder extends MenuBuilder {
|
||||||
|
|
||||||
String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, app);
|
String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, app);
|
||||||
String max = OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app);
|
String max = OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app);
|
||||||
buildRow(view, getThemedIcon(R.drawable.ic_action_altitude_range_16), null, app.getString(R.string.altitude_range),
|
buildRow(view, getThemedIcon(R.drawable.ic_action_altitude_range), null, app.getString(R.string.altitude_range),
|
||||||
min + " - " + max, 0, null,
|
min + " - " + max, 0, null,
|
||||||
false, null, false, 0, false, false, false, null, false);
|
false, null, false, 0, false, false, false, null, false);
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class SelectedGpxMenuController extends MenuController {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
rightTitleButtonController.caption = mapActivity.getString(R.string.analyze_on_map);
|
rightTitleButtonController.caption = mapActivity.getString(R.string.analyze_on_map);
|
||||||
rightTitleButtonController.startIconId = R.drawable.ic_action_track_16;
|
rightTitleButtonController.startIconId = R.drawable.ic_action_analyze_intervals;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class OpenGpxDetailsTask extends AsyncTask<Void, Void, GpxSelectionHelper.GpxDisplayItem> {
|
private static class OpenGpxDetailsTask extends AsyncTask<Void, Void, GpxSelectionHelper.GpxDisplayItem> {
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package net.osmand.plus.mapcontextmenu.other;
|
||||||
|
|
||||||
|
import net.osmand.GPXUtilities.GPXFile;
|
||||||
|
import net.osmand.data.LatLon;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TrackChartPoints {
|
||||||
|
|
||||||
|
private List<LatLon> xAxisPoints;
|
||||||
|
private LatLon highlightedPoint;
|
||||||
|
private int segmentColor;
|
||||||
|
private GPXFile gpx;
|
||||||
|
|
||||||
|
public List<LatLon> getXAxisPoints() {
|
||||||
|
return xAxisPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LatLon getHighlightedPoint() {
|
||||||
|
return highlightedPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSegmentColor() {
|
||||||
|
return segmentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPXFile getGpx() {
|
||||||
|
return gpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setXAxisPoints(List<LatLon> xAxisPoints) {
|
||||||
|
this.xAxisPoints = xAxisPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHighlightedPoint(LatLon highlightedPoint) {
|
||||||
|
this.highlightedPoint = highlightedPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSegmentColor(int segmentColor) {
|
||||||
|
this.segmentColor = segmentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGpx(GPXFile gpx) {
|
||||||
|
this.gpx = gpx;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,9 @@
|
||||||
package net.osmand.plus.mapcontextmenu.other;
|
package net.osmand.plus.mapcontextmenu.other;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
@ -16,6 +18,7 @@ import com.github.mikephil.charting.data.Entry;
|
||||||
import com.github.mikephil.charting.data.LineData;
|
import com.github.mikephil.charting.data.LineData;
|
||||||
import com.github.mikephil.charting.highlight.Highlight;
|
import com.github.mikephil.charting.highlight.Highlight;
|
||||||
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||||
|
import com.github.mikephil.charting.listener.BarLineChartTouchListener;
|
||||||
import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture;
|
import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture;
|
||||||
import com.github.mikephil.charting.listener.OnChartGestureListener;
|
import com.github.mikephil.charting.listener.OnChartGestureListener;
|
||||||
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
||||||
|
@ -26,6 +29,7 @@ import net.osmand.GPXUtilities.GPXFile;
|
||||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||||
import net.osmand.GPXUtilities.TrkSegment;
|
import net.osmand.GPXUtilities.TrkSegment;
|
||||||
import net.osmand.GPXUtilities.WptPt;
|
import net.osmand.GPXUtilities.WptPt;
|
||||||
|
import net.osmand.Location;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.QuadRect;
|
import net.osmand.data.QuadRect;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
@ -39,6 +43,7 @@ import net.osmand.plus.helpers.GpxUiHelper;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
|
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
||||||
|
import net.osmand.plus.views.GPXLayer;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
|
||||||
|
|
||||||
|
@ -51,6 +56,8 @@ import static net.osmand.plus.SimplePopUpMenuItemAdapter.SimplePopUpMenuItem;
|
||||||
|
|
||||||
public class TrackDetailsMenu {
|
public class TrackDetailsMenu {
|
||||||
|
|
||||||
|
private static final int MAX_DISTANCE_LOCATION_PROJECTION = 20; // in meters
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private MapActivity mapActivity;
|
private MapActivity mapActivity;
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -66,9 +73,7 @@ public class TrackDetailsMenu {
|
||||||
private int topMarginPx;
|
private int topMarginPx;
|
||||||
private boolean visible;
|
private boolean visible;
|
||||||
private boolean hidding;
|
private boolean hidding;
|
||||||
|
private Location myLocation;
|
||||||
public TrackDetailsMenu() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public MapActivity getMapActivity() {
|
public MapActivity getMapActivity() {
|
||||||
|
@ -123,6 +128,35 @@ public class TrackDetailsMenu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateMyLocation(View mainView, Location location) {
|
||||||
|
MapActivity mapActivity = getMapActivity();
|
||||||
|
if (mapActivity != null) {
|
||||||
|
LineChart chart = mainView.findViewById(R.id.chart);
|
||||||
|
GpxDisplayItem gpxItem = getGpxItem();
|
||||||
|
TrkSegment segment = getTrackSegment(chart);
|
||||||
|
LineData lineData = chart.getLineData();
|
||||||
|
List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null;
|
||||||
|
if (ds != null && ds.size() > 0 && gpxItem != null && segment != null) {
|
||||||
|
RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox();
|
||||||
|
int mx = (int) tb.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
|
int my = (int) tb.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
|
int r = (int) (MAX_DISTANCE_LOCATION_PROJECTION * tb.getPixDensity());
|
||||||
|
WptPt point = GPXLayer.findPointNearSegment(tb, segment.points, r, mx, my);
|
||||||
|
if (point != null) {
|
||||||
|
int index = segment.points.indexOf(point);
|
||||||
|
gpxItem.locationOnMap = GPXLayer.createProjectionPoint(segment.points.get(index - 1), point, tb.getLatLonFromPixel(mx, my));
|
||||||
|
gpxItem.chartHighlightPos = (float) (gpxItem.locationOnMap.distance / ((OrderedLineDataSet) ds.get(0)).getDivX());
|
||||||
|
chart.highlightValue(gpxItem.chartHighlightPos, 0);
|
||||||
|
}
|
||||||
|
myLocation = location;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Location getMyLocation() {
|
||||||
|
return myLocation;
|
||||||
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
TrackDetailsMenuFragment fragment = getMenuFragment();
|
TrackDetailsMenuFragment fragment = getMenuFragment();
|
||||||
if (fragment != null) {
|
if (fragment != null) {
|
||||||
|
@ -516,6 +550,39 @@ public class TrackDetailsMenu {
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
final float minDragTriggerDist = AndroidUtils.dpToPx(app, 3);
|
||||||
|
chart.setOnTouchListener(new BarLineChartTouchListener(chart, chart.getViewPortHandler().getMatrixTouch(), 3f) {
|
||||||
|
private PointF touchStartPoint = new PointF();
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
switch (event.getAction() & MotionEvent.ACTION_MASK) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
saveTouchStart(event);
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_POINTER_DOWN:
|
||||||
|
if (event.getPointerCount() >= 2) {
|
||||||
|
saveTouchStart(event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
if (mTouchMode == NONE && mChart.hasNoDragOffset()) {
|
||||||
|
float touchDistance = distance(event.getX(), touchStartPoint.x, event.getY(), touchStartPoint.y);
|
||||||
|
if (Math.abs(touchDistance) > minDragTriggerDist) {
|
||||||
|
mTouchMode = DRAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.onTouch(v, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveTouchStart(MotionEvent event) {
|
||||||
|
touchStartPoint.x = event.getX();
|
||||||
|
touchStartPoint.y = event.getY();
|
||||||
|
}
|
||||||
|
});
|
||||||
chart.setOnChartGestureListener(new OnChartGestureListener() {
|
chart.setOnChartGestureListener(new OnChartGestureListener() {
|
||||||
boolean hasTranslated = false;
|
boolean hasTranslated = false;
|
||||||
float highlightDrawX = -1;
|
float highlightDrawX = -1;
|
||||||
|
@ -775,43 +842,4 @@ public class TrackDetailsMenu {
|
||||||
return NO_COLOR;
|
return NO_COLOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public static class TrackChartPoints {
|
|
||||||
private List<LatLon> xAxisPoints;
|
|
||||||
private LatLon highlightedPoint;
|
|
||||||
private int segmentColor;
|
|
||||||
private GPXFile gpx;
|
|
||||||
|
|
||||||
public List<LatLon> getXAxisPoints() {
|
|
||||||
return xAxisPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LatLon getHighlightedPoint() {
|
|
||||||
return highlightedPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSegmentColor() {
|
|
||||||
return segmentColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public GPXFile getGpx() {
|
|
||||||
return gpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setXAxisPoints(List<LatLon> xAxisPoints) {
|
|
||||||
this.xAxisPoints = xAxisPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHighlightedPoint(LatLon highlightedPoint) {
|
|
||||||
this.highlightedPoint = highlightedPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSegmentColor(int segmentColor) {
|
|
||||||
this.segmentColor = segmentColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGpx(GPXFile gpx) {
|
|
||||||
this.gpx = gpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,25 +14,31 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.Location;
|
||||||
|
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||||
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
|
public class TrackDetailsMenuFragment extends BaseOsmAndFragment implements OsmAndLocationListener {
|
||||||
|
|
||||||
public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
|
|
||||||
public static final String TAG = "TrackDetailsMenuFragment";
|
public static final String TAG = "TrackDetailsMenuFragment";
|
||||||
|
|
||||||
private TrackDetailsMenu menu;
|
private TrackDetailsMenu menu;
|
||||||
private View mainView;
|
private View mainView;
|
||||||
private boolean paused = true;
|
|
||||||
private boolean nightMode;
|
private boolean nightMode;
|
||||||
|
|
||||||
|
private boolean locationUpdateStarted;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private MapActivity getMapActivity() {
|
private MapActivity getMapActivity() {
|
||||||
return (MapActivity) getActivity();
|
return (MapActivity) getActivity();
|
||||||
|
@ -49,9 +55,7 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
|
||||||
MapActivity mapActivity = requireMapActivity();
|
MapActivity mapActivity = requireMapActivity();
|
||||||
menu = mapActivity.getTrackDetailsMenu();
|
menu = mapActivity.getTrackDetailsMenu();
|
||||||
nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
|
||||||
ContextThemeWrapper context =
|
View view = UiUtilities.getInflater(mapActivity, nightMode).inflate(R.layout.track_details, container, false);
|
||||||
new ContextThemeWrapper(mapActivity, !nightMode ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme);
|
|
||||||
View view = LayoutInflater.from(context).inflate(R.layout.track_details, container, false);
|
|
||||||
if (!AndroidUiHelper.isOrientationPortrait(mapActivity)) {
|
if (!AndroidUiHelper.isOrientationPortrait(mapActivity)) {
|
||||||
AndroidUtils.addStatusBarPadding21v(mapActivity, view);
|
AndroidUtils.addStatusBarPadding21v(mapActivity, view);
|
||||||
}
|
}
|
||||||
|
@ -129,13 +133,44 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
|
||||||
} else {
|
} else {
|
||||||
menu.onShow();
|
menu.onShow();
|
||||||
}
|
}
|
||||||
paused = false;
|
startLocationUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
paused = true;
|
stopLocationUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startLocationUpdate() {
|
||||||
|
OsmandApplication app = getMyApplication();
|
||||||
|
if (app != null && !locationUpdateStarted) {
|
||||||
|
locationUpdateStarted = true;
|
||||||
|
app.getLocationProvider().addLocationListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopLocationUpdate() {
|
||||||
|
OsmandApplication app = getMyApplication();
|
||||||
|
if (app != null && locationUpdateStarted) {
|
||||||
|
locationUpdateStarted = false;
|
||||||
|
app.getLocationProvider().removeLocationListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateLocation(final Location location) {
|
||||||
|
if (location != null && !MapUtils.areLatLonEqual(menu.getMyLocation(), location)) {
|
||||||
|
MapActivity mapActivity = getMapActivity();
|
||||||
|
if (mapActivity != null && mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation()) {
|
||||||
|
mapActivity.getMyApplication().runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
menu.updateMyLocation(mainView, location);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -151,10 +186,6 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
|
||||||
return R.color.status_bar_transparent_gradient;
|
return R.color.status_bar_transparent_gradient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPaused() {
|
|
||||||
return paused;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight() {
|
public int getHeight() {
|
||||||
if (mainView != null) {
|
if (mainView != null) {
|
||||||
return mainView.getHeight();
|
return mainView.getHeight();
|
||||||
|
@ -243,4 +274,4 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -68,7 +68,6 @@ import net.osmand.plus.OsmAndConstants;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandPlugin;
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
@ -82,6 +81,7 @@ import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||||
import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment;
|
import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment;
|
||||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||||
import net.osmand.plus.osmedit.OsmEditingPlugin;
|
import net.osmand.plus.osmedit.OsmEditingPlugin;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -1482,11 +1482,16 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
|
||||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
final SelectedGpxFile selectedGpxFile = selectedGpxHelper.getSelectedFileByPath(gpxInfo.file.getPath());
|
||||||
FileUtils.renameFile(getActivity(), gpxInfo.file, new RenameCallback() {
|
FileUtils.renameFile(getActivity(), gpxInfo.file, new RenameCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void renamedTo(File file) {
|
public void renamedTo(File file) {
|
||||||
asyncLoader = new LoadGpxTask();
|
asyncLoader = new LoadGpxTask();
|
||||||
asyncLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity());
|
asyncLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity());
|
||||||
|
if (selectedGpxFile != null && selectedGpxFile.getGpxFile() != null) {
|
||||||
|
selectedGpxFile.getGpxFile().path = file.getPath();
|
||||||
|
selectedGpxHelper.updateSelectedGpxFile(selectedGpxFile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -40,10 +40,9 @@ import net.osmand.plus.MapMarkersHelper.MapMarker;
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
|
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
|
|
||||||
import net.osmand.plus.base.PointImageDrawable;
|
import net.osmand.plus.base.PointImageDrawable;
|
||||||
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
|
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints;
|
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
|
||||||
import net.osmand.plus.render.OsmandRenderer;
|
import net.osmand.plus.render.OsmandRenderer;
|
||||||
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
|
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
||||||
|
@ -603,8 +602,11 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
for (TrkSegment segment : segments) {
|
for (TrkSegment segment : segments) {
|
||||||
QuadRect trackBounds = GPXUtilities.calculateBounds(segment.points);
|
QuadRect trackBounds = GPXUtilities.calculateBounds(segment.points);
|
||||||
if (QuadRect.trivialOverlap(tb.getLatLonBounds(), trackBounds)) {
|
if (QuadRect.trivialOverlap(tb.getLatLonBounds(), trackBounds)) {
|
||||||
SelectedGpxPoint selectedGpxPoint = findPointNearSegment(tb, selectedGpxFile, segment.points, r, mx, my);
|
WptPt nextPoint = findPointNearSegment(tb, segment.points, r, mx, my);
|
||||||
if (selectedGpxPoint != null) {
|
if (nextPoint != null) {
|
||||||
|
int index = segment.points.indexOf(nextPoint);
|
||||||
|
WptPt prevPoint = segment.points.get(index - 1);
|
||||||
|
SelectedGpxPoint selectedGpxPoint = createSelectedGpxPoint(selectedGpxFile, prevPoint, nextPoint, tb.getLatLonFromPixel(mx, my));
|
||||||
res.add(selectedGpxPoint);
|
res.add(selectedGpxPoint);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -613,7 +615,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private SelectedGpxPoint findPointNearSegment(RotatedTileBox tb, SelectedGpxFile selectedGpxFile, List<WptPt> points, int r, int mx, int my) {
|
public static WptPt findPointNearSegment(RotatedTileBox tb, List<WptPt> points, int r, int mx, int my) {
|
||||||
WptPt firstPoint = points.get(0);
|
WptPt firstPoint = points.get(0);
|
||||||
int ppx = (int) tb.getPixXFromLatLon(firstPoint.lat, firstPoint.lon);
|
int ppx = (int) tb.getPixXFromLatLon(firstPoint.lat, firstPoint.lon);
|
||||||
int ppy = (int) tb.getPixYFromLatLon(firstPoint.lat, firstPoint.lon);
|
int ppy = (int) tb.getPixYFromLatLon(firstPoint.lat, firstPoint.lon);
|
||||||
|
@ -625,7 +627,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
int py = (int) tb.getPixYFromLatLon(point.lat, point.lon);
|
int py = (int) tb.getPixYFromLatLon(point.lat, point.lon);
|
||||||
int cross = placeInBbox(px, py, mx, my, r, r);
|
int cross = placeInBbox(px, py, mx, my, r, r);
|
||||||
if (cross == 0) {
|
if (cross == 0) {
|
||||||
return createProjectionPoint(selectedGpxFile, points.get(i - 1), point, tb.getLatLonFromPixel(mx, my));
|
return point;
|
||||||
}
|
}
|
||||||
if ((pcross & cross) == 0) {
|
if ((pcross & cross) == 0) {
|
||||||
int mpx = px;
|
int mpx = px;
|
||||||
|
@ -636,7 +638,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
int mpynew = mpy / 2 + ppy / 2;
|
int mpynew = mpy / 2 + ppy / 2;
|
||||||
int mcrossnew = placeInBbox(mpxnew, mpynew, mx, my, r, r);
|
int mcrossnew = placeInBbox(mpxnew, mpynew, mx, my, r, r);
|
||||||
if (mcrossnew == 0) {
|
if (mcrossnew == 0) {
|
||||||
return createProjectionPoint(selectedGpxFile, points.get(i - 1), point, tb.getLatLonFromPixel(mx, my));
|
return point;
|
||||||
}
|
}
|
||||||
if ((mcrossnew & mcross) != 0) {
|
if ((mcrossnew & mcross) != 0) {
|
||||||
mpx = mpxnew;
|
mpx = mpxnew;
|
||||||
|
@ -659,19 +661,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SelectedGpxPoint createProjectionPoint(SelectedGpxFile selectedGpxFile, WptPt prevPoint, WptPt nextPoint, LatLon latLon) {
|
private SelectedGpxPoint createSelectedGpxPoint(SelectedGpxFile selectedGpxFile, WptPt prevPoint, WptPt nextPoint, LatLon latLon) {
|
||||||
LatLon projection = MapUtils.getProjection(latLon.getLatitude(), latLon.getLongitude(), prevPoint.lat, prevPoint.lon, nextPoint.lat, nextPoint.lon);
|
WptPt projectionPoint = createProjectionPoint(prevPoint, nextPoint, latLon);
|
||||||
|
|
||||||
WptPt projectionPoint = new WptPt();
|
|
||||||
projectionPoint.lat = projection.getLatitude();
|
|
||||||
projectionPoint.lon = projection.getLongitude();
|
|
||||||
projectionPoint.heading = prevPoint.heading;
|
|
||||||
projectionPoint.distance = prevPoint.distance + MapUtils.getDistance(projection, prevPoint.lat, prevPoint.lon);
|
|
||||||
projectionPoint.ele = getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.ele, nextPoint.distance, nextPoint.ele);
|
|
||||||
projectionPoint.speed = getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.speed, nextPoint.distance, nextPoint.speed);
|
|
||||||
if (prevPoint.time != 0 && nextPoint.time != 0) {
|
|
||||||
projectionPoint.time = (long) getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.time, nextPoint.distance, nextPoint.time);
|
|
||||||
}
|
|
||||||
|
|
||||||
Location prevPointLocation = new Location("");
|
Location prevPointLocation = new Location("");
|
||||||
prevPointLocation.setLatitude(prevPoint.lat);
|
prevPointLocation.setLatitude(prevPoint.lat);
|
||||||
|
@ -686,11 +677,28 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
return new SelectedGpxPoint(selectedGpxFile, projectionPoint, prevPointLocation);
|
return new SelectedGpxPoint(selectedGpxFile, projectionPoint, prevPointLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getValueByDistInterpolation(double projectionDist, double prevDist, double prevVal, double nextDist, double nextVal) {
|
public static WptPt createProjectionPoint(WptPt prevPoint, WptPt nextPoint, LatLon latLon) {
|
||||||
|
LatLon projection = MapUtils.getProjection(latLon.getLatitude(), latLon.getLongitude(), prevPoint.lat, prevPoint.lon, nextPoint.lat, nextPoint.lon);
|
||||||
|
|
||||||
|
WptPt projectionPoint = new WptPt();
|
||||||
|
projectionPoint.lat = projection.getLatitude();
|
||||||
|
projectionPoint.lon = projection.getLongitude();
|
||||||
|
projectionPoint.heading = prevPoint.heading;
|
||||||
|
projectionPoint.distance = prevPoint.distance + MapUtils.getDistance(projection, prevPoint.lat, prevPoint.lon);
|
||||||
|
projectionPoint.ele = getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.ele, nextPoint.distance, nextPoint.ele);
|
||||||
|
projectionPoint.speed = getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.speed, nextPoint.distance, nextPoint.speed);
|
||||||
|
if (prevPoint.time != 0 && nextPoint.time != 0) {
|
||||||
|
projectionPoint.time = (long) getValueByDistInterpolation(projectionPoint.distance, prevPoint.distance, prevPoint.time, nextPoint.distance, nextPoint.time);
|
||||||
|
}
|
||||||
|
|
||||||
|
return projectionPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double getValueByDistInterpolation(double projectionDist, double prevDist, double prevVal, double nextDist, double nextVal) {
|
||||||
return prevVal + (projectionDist - prevDist) * ((nextVal - prevVal) / (nextDist - prevDist));
|
return prevVal + (projectionDist - prevDist) * ((nextVal - prevVal) / (nextDist - prevDist));
|
||||||
}
|
}
|
||||||
|
|
||||||
int placeInBbox(int x, int y, int mx, int my, int halfw, int halfh) {
|
private static int placeInBbox(int x, int y, int mx, int my, int halfw, int halfh) {
|
||||||
int cross = 0;
|
int cross = 0;
|
||||||
cross |= (x < mx - halfw ? 1 : 0);
|
cross |= (x < mx - halfw ? 1 : 0);
|
||||||
cross |= (x > mx + halfw ? 2 : 0);
|
cross |= (x > mx + halfw ? 2 : 0);
|
||||||
|
@ -841,7 +849,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
private void syncGpx(GPXFile gpxFile) {
|
private void syncGpx(GPXFile gpxFile) {
|
||||||
MapMarkersGroup group = view.getApplication().getMapMarkersHelper().getMarkersGroup(gpxFile);
|
MapMarkersGroup group = view.getApplication().getMapMarkersHelper().getMarkersGroup(gpxFile);
|
||||||
if (group != null) {
|
if (group != null) {
|
||||||
mapMarkersHelper.runSynchronization(group);
|
mapMarkersHelper.runSynchronization(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints;
|
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.CompassRulerControlWidgetState;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.CompassRulerControlWidgetState;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopCoordinatesView;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopCoordinatesView;
|
||||||
|
|
|
@ -36,8 +36,7 @@ import net.osmand.osm.edit.Way;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints;
|
|
||||||
import net.osmand.plus.profiles.LocationIcon;
|
import net.osmand.plus.profiles.LocationIcon;
|
||||||
import net.osmand.plus.render.RenderingIcons;
|
import net.osmand.plus.render.RenderingIcons;
|
||||||
import net.osmand.plus.routing.RouteCalculationResult;
|
import net.osmand.plus.routing.RouteCalculationResult;
|
||||||
|
@ -104,7 +103,7 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont
|
||||||
this.transportHelper = helper.getTransportRoutingHelper();
|
this.transportHelper = helper.getTransportRoutingHelper();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTrackChartPoints(TrackDetailsMenu.TrackChartPoints trackChartPoints) {
|
public void setTrackChartPoints(TrackChartPoints trackChartPoints) {
|
||||||
this.trackChartPoints = trackChartPoints;
|
this.trackChartPoints = trackChartPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue