diff --git a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java index 2de7234303..f750056bd3 100644 --- a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java +++ b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java @@ -22,11 +22,11 @@ import net.osmand.PlatformUtil; import net.osmand.data.LatLon; import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; -import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; +import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -639,6 +639,12 @@ public class GpxSelectionHelper { selectedGPXFiles = newSelectedGPXFiles; } + public void updateSelectedGpxFile(SelectedGpxFile selectedGpxFile) { + if (selectedGPXFiles.contains(selectedGpxFile)) { + saveCurrentSelections(); + } + } + public SelectedGpxFile selectGpxFile(GPXFile gpx, boolean show, boolean notShowNavigationDialog) { return selectGpxFile(gpx, show, notShowNavigationDialog, true, true, true); } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/SelectedGpxMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/SelectedGpxMenuBuilder.java index 9b97c41ed3..8fa994a81a 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/SelectedGpxMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/SelectedGpxMenuBuilder.java @@ -100,7 +100,7 @@ public class SelectedGpxMenuBuilder extends MenuBuilder { String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, 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, false, null, false, 0, false, false, false, null, false); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java index e6e48ac725..b9b89b5a36 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java @@ -57,7 +57,7 @@ public class SelectedGpxMenuController extends MenuController { } }; 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 { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackChartPoints.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackChartPoints.java new file mode 100644 index 0000000000..1ffc7087da --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackChartPoints.java @@ -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 xAxisPoints; + private LatLon highlightedPoint; + private int segmentColor; + private GPXFile gpx; + + public List getXAxisPoints() { + return xAxisPoints; + } + + public LatLon getHighlightedPoint() { + return highlightedPoint; + } + + public int getSegmentColor() { + return segmentColor; + } + + public GPXFile getGpx() { + return gpx; + } + + public void setXAxisPoints(List 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; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 98991fc351..1f3a8443d6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -1,7 +1,9 @@ package net.osmand.plus.mapcontextmenu.other; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Matrix; +import android.graphics.PointF; import android.view.MotionEvent; import android.view.View; 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.highlight.Highlight; 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.OnChartGestureListener; 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.TrkSegment; import net.osmand.GPXUtilities.WptPt; +import net.osmand.Location; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; 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.GPXDataSetType; 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.TopToolbarController; @@ -51,6 +56,8 @@ import static net.osmand.plus.SimplePopUpMenuItemAdapter.SimplePopUpMenuItem; public class TrackDetailsMenu { + private static final int MAX_DISTANCE_LOCATION_PROJECTION = 20; // in meters + @Nullable private MapActivity mapActivity; @Nullable @@ -66,9 +73,7 @@ public class TrackDetailsMenu { private int topMarginPx; private boolean visible; private boolean hidding; - - public TrackDetailsMenu() { - } + private Location myLocation; @Nullable 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 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() { TrackDetailsMenuFragment fragment = getMenuFragment(); 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() { boolean hasTranslated = false; float highlightDrawX = -1; @@ -775,43 +842,4 @@ public class TrackDetailsMenu { return NO_COLOR; } } - - public static class TrackChartPoints { - private List xAxisPoints; - private LatLon highlightedPoint; - private int segmentColor; - private GPXFile gpx; - - public List getXAxisPoints() { - return xAxisPoints; - } - - public LatLon getHighlightedPoint() { - return highlightedPoint; - } - - public int getSegmentColor() { - return segmentColor; - } - - public GPXFile getGpx() { - return gpx; - } - - public void setXAxisPoints(List 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; - } - } -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java index 7c63f9497e..6097f111e5 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java @@ -14,25 +14,31 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.view.ContextThemeWrapper; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; 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.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.BaseOsmAndFragment; import net.osmand.plus.helpers.AndroidUiHelper; 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"; private TrackDetailsMenu menu; private View mainView; - private boolean paused = true; private boolean nightMode; + private boolean locationUpdateStarted; + @Nullable private MapActivity getMapActivity() { return (MapActivity) getActivity(); @@ -49,9 +55,7 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { MapActivity mapActivity = requireMapActivity(); menu = mapActivity.getTrackDetailsMenu(); nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); - ContextThemeWrapper context = - new ContextThemeWrapper(mapActivity, !nightMode ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme); - View view = LayoutInflater.from(context).inflate(R.layout.track_details, container, false); + View view = UiUtilities.getInflater(mapActivity, nightMode).inflate(R.layout.track_details, container, false); if (!AndroidUiHelper.isOrientationPortrait(mapActivity)) { AndroidUtils.addStatusBarPadding21v(mapActivity, view); } @@ -129,13 +133,44 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { } else { menu.onShow(); } - paused = false; + startLocationUpdate(); } @Override public void 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 @@ -151,10 +186,6 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { return R.color.status_bar_transparent_gradient; } - public boolean isPaused() { - return paused; - } - public int getHeight() { if (mainView != null) { return mainView.getHeight(); @@ -243,4 +274,4 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { return false; } } -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java index fb317dc696..44d2c259eb 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java @@ -68,7 +68,6 @@ import net.osmand.plus.OsmAndConstants; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; 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.monitoring.OsmandMonitoringPlugin; import net.osmand.plus.osmedit.OsmEditingPlugin; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.util.Algorithms; import java.io.File; @@ -1482,11 +1482,16 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { + final SelectedGpxFile selectedGpxFile = selectedGpxHelper.getSelectedFileByPath(gpxInfo.file.getPath()); FileUtils.renameFile(getActivity(), gpxInfo.file, new RenameCallback() { @Override public void renamedTo(File file) { asyncLoader = new LoadGpxTask(); asyncLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity()); + if (selectedGpxFile != null && selectedGpxFile.getGpxFile() != null) { + selectedGpxFile.getGpxFile().path = file.getPath(); + selectedGpxHelper.updateSelectedGpxFile(selectedGpxFile); + } } }); return true; diff --git a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java index f61d0e56b7..fdc9ab950e 100644 --- a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java @@ -40,10 +40,9 @@ import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; - import net.osmand.plus.base.PointImageDrawable; 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.RenderingContext; import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; @@ -603,8 +602,11 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM for (TrkSegment segment : segments) { QuadRect trackBounds = GPXUtilities.calculateBounds(segment.points); if (QuadRect.trivialOverlap(tb.getLatLonBounds(), trackBounds)) { - SelectedGpxPoint selectedGpxPoint = findPointNearSegment(tb, selectedGpxFile, segment.points, r, mx, my); - if (selectedGpxPoint != null) { + WptPt nextPoint = findPointNearSegment(tb, segment.points, r, mx, my); + 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); break; } @@ -613,7 +615,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM } } - private SelectedGpxPoint findPointNearSegment(RotatedTileBox tb, SelectedGpxFile selectedGpxFile, List points, int r, int mx, int my) { + public static WptPt findPointNearSegment(RotatedTileBox tb, List points, int r, int mx, int my) { WptPt firstPoint = points.get(0); int ppx = (int) tb.getPixXFromLatLon(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 cross = placeInBbox(px, py, mx, my, r, r); if (cross == 0) { - return createProjectionPoint(selectedGpxFile, points.get(i - 1), point, tb.getLatLonFromPixel(mx, my)); + return point; } if ((pcross & cross) == 0) { int mpx = px; @@ -636,7 +638,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM int mpynew = mpy / 2 + ppy / 2; int mcrossnew = placeInBbox(mpxnew, mpynew, mx, my, r, r); if (mcrossnew == 0) { - return createProjectionPoint(selectedGpxFile, points.get(i - 1), point, tb.getLatLonFromPixel(mx, my)); + return point; } if ((mcrossnew & mcross) != 0) { mpx = mpxnew; @@ -659,19 +661,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM return null; } - private SelectedGpxPoint createProjectionPoint(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 = 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); - } + private SelectedGpxPoint createSelectedGpxPoint(SelectedGpxFile selectedGpxFile, WptPt prevPoint, WptPt nextPoint, LatLon latLon) { + WptPt projectionPoint = createProjectionPoint(prevPoint, nextPoint, latLon); Location prevPointLocation = new Location(""); prevPointLocation.setLatitude(prevPoint.lat); @@ -686,11 +677,28 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM 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)); } - 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; cross |= (x < mx - halfw ? 1 : 0); cross |= (x > mx + halfw ? 2 : 0); @@ -841,7 +849,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private void syncGpx(GPXFile gpxFile) { MapMarkersGroup group = view.getApplication().getMapMarkersHelper().getMarkersGroup(gpxFile); if (group != null) { - mapMarkersHelper.runSynchronization(group); + mapMarkersHelper.runSynchronization(group); } } diff --git a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java index f77a57e550..2f38894268 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java @@ -17,7 +17,7 @@ import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; 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.CompassRulerControlWidgetState; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopCoordinatesView; diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index c00b0e1d56..b6e31416ab 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -36,8 +36,7 @@ import net.osmand.osm.edit.Way; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; -import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; -import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints; +import net.osmand.plus.mapcontextmenu.other.TrackChartPoints; import net.osmand.plus.profiles.LocationIcon; import net.osmand.plus.render.RenderingIcons; import net.osmand.plus.routing.RouteCalculationResult; @@ -104,7 +103,7 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont this.transportHelper = helper.getTransportRoutingHelper(); } - public void setTrackChartPoints(TrackDetailsMenu.TrackChartPoints trackChartPoints) { + public void setTrackChartPoints(TrackChartPoints trackChartPoints) { this.trackChartPoints = trackChartPoints; }