From 5174acb5d128fe570234c71a23604cef3f8ff2f8 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 22 Feb 2019 17:42:24 +0200 Subject: [PATCH] Work in progress --- .../main/java/net/osmand/GPXUtilities.java | 4 ++ .../main/java/net/osmand/util/Algorithms.java | 9 +++ OsmAnd/res/values/strings.xml | 2 +- .../src/net/osmand/plus/OsmAndFormatter.java | 7 +++ .../net/osmand/plus/helpers/GpxUiHelper.java | 45 +++++++++++++- .../other/TrackDetailsMenu.java | 59 +++++++++++++------ 6 files changed, 103 insertions(+), 23 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java index 339f91e3fd..b403449e24 100644 --- a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java @@ -158,12 +158,14 @@ public class GPXUtilities { public static class Elevation { public float distance; public int time; + public int timeOfDay; public float elevation; } public static class Speed { public float distance; public int time; + public int timeOfDay; public float speed; } @@ -610,6 +612,7 @@ public class GPXUtilities { } elevation1.time = timeDiff; + elevation1.timeOfDay = Algorithms.getDayTimeInSeconds(point.time, false); elevation1.distance = (j > 0) ? calculations[0] : 0; elevationData.add(elevation1); if (!hasElevationData && !Float.isNaN(elevation1.elevation) && totalDistance > 0) { @@ -626,6 +629,7 @@ public class GPXUtilities { Speed speed1 = new Speed(); speed1.speed = speed; speed1.time = timeDiff; + speed1.timeOfDay = Algorithms.getDayTimeInSeconds(point.time, false); speed1.distance = elevation1.distance; speedData.add(speed1); if (!hasSpeedData && speed1.speed > 0 && totalDistance > 0) { diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java index dcf6082a7f..66bc2a3fe0 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java @@ -1,5 +1,7 @@ package net.osmand.util; +import java.util.Calendar; +import java.util.TimeZone; import net.osmand.IProgress; import net.osmand.PlatformUtil; import net.osmand.router.GeneralRouter; @@ -746,4 +748,11 @@ public class Algorithms { is.close(); return map; } + + public static int getDayTimeInSeconds(long seconds, boolean defaultTimeZone) { + Calendar calendar = defaultTimeZone ? Calendar.getInstance(TimeZone.getDefault()) : Calendar.getInstance(); + calendar.setTimeInMillis(seconds * 1000); + int daytime = calendar.get(Calendar.HOUR)*3600 + calendar.get(Calendar.MINUTE)*60 + calendar.get(Calendar.SECOND); + return daytime; + } } \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index bad5196f87..98dafa6e3a 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,7 +9,7 @@ 3. If you modify the English strings file, please add new strings at the top of the file, this makes periodic reviews before releases easier. - For wording and consistency, please note https://osmand.net/help-online?id=technical-articles#Creating_a_Consistent_User_Experience Thx - Hardy ---> +--> Time of day Tracks on the map Please add Destination first Previous route diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index 6c9241b0b4..51e7c90dc4 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -3,6 +3,7 @@ package net.osmand.plus; import android.content.Context; import android.text.format.DateUtils; +import java.util.TimeZone; import net.osmand.data.Amenity; import net.osmand.data.City.CityType; import net.osmand.osm.AbstractPoiType; @@ -74,6 +75,12 @@ public class OsmAndFormatter { } } + public static String getFormattedTimeShort(long seconds) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(seconds * 1000); + return SIMPLE_TIME_OF_DAY_FORMAT.format(calendar.getTime()); + } + public static String getFormattedDate(Context context, long milliseconds) { return DateUtils.formatDateTime(context, milliseconds, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); } diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index 84b93a5c12..8118b754d6 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -58,6 +58,7 @@ import net.osmand.AndroidUtils; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.Location; +import net.osmand.PlatformUtil; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.GPXDatabase.GpxDataItem; @@ -100,6 +101,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.logging.Log; import static com.github.mikephil.charting.components.XAxis.XAxisPosition.BOTTOM; import static net.osmand.binary.RouteDataObject.HEIGHT_UNDEFINED; @@ -116,6 +118,7 @@ import static net.osmand.plus.download.DownloadActivity.formatMb; public class GpxUiHelper { private static final int OPEN_GPX_DOCUMENT_REQUEST = 1005; + private static final Log LOG = PlatformUtil.getLog(GpxUiHelper.class); public static String getDescription(OsmandApplication app, GPXFile result, File f, boolean html) { GPXTrackAnalysis analysis = result.getAnalysis(f == null ? 0 : f.lastModified()); @@ -1120,7 +1123,6 @@ public class GpxUiHelper { final boolean useHours = timeSpan / 3600000 > 0; xAxis.setGranularity(1f); xAxis.setValueFormatter(new IAxisValueFormatter() { - @Override public String getFormattedValue(float value, AxisBase axis) { int seconds = (int)value; @@ -1140,6 +1142,21 @@ public class GpxUiHelper { return 1f; } + private static float setupXAxisTimeOfDay(XAxis xAxis) { + xAxis.setGranularity(1f); + xAxis.setValueFormatter(new IAxisValueFormatter() { + @Override + public String getFormattedValue(float value, AxisBase axis) { + + + int seconds = (int)value/1000; + LOG.debug(OsmAndFormatter.getFormattedTimeShort(seconds)); + return OsmAndFormatter.getFormattedTimeShort(seconds); + } + }); + return 1f; + } + private static List calculateElevationArray(GPXTrackAnalysis analysis, GPXDataSetAxisType axisType, float divX, float convEle) { List values = new ArrayList<>(); @@ -1207,6 +1224,8 @@ public class GpxUiHelper { XAxis xAxis = mChart.getXAxis(); if (axisType == GPXDataSetAxisType.TIME && analysis.isTimeSpecified()) { divX = setupXAxisTime(xAxis, analysis.timeSpan); + } else if (axisType == GPXDataSetAxisType.TIMEOFDAY && analysis.isTimeSpecified()) { + divX = setupXAxisTimeOfDay(xAxis); } else { divX = setupXAxisDistance(ctx, xAxis, analysis.totalDistance); } @@ -1291,6 +1310,9 @@ public class GpxUiHelper { XAxis xAxis = mChart.getXAxis(); if (axisType == GPXDataSetAxisType.TIME && analysis.isTimeSpecified()) { divX = setupXAxisTime(xAxis, analysis.timeSpan); + } else if (axisType == GPXDataSetAxisType.TIMEOFDAY && analysis.isTimeSpecified()) { + divX = setupXAxisTimeOfDay(xAxis); + } else { divX = setupXAxisDistance(ctx, xAxis, analysis.totalDistance); } @@ -1336,13 +1358,29 @@ public class GpxUiHelper { float nextY; float x; for (Speed s : speedData) { - x = axisType == GPXDataSetAxisType.TIME ? s.time : s.distance; + switch(axisType) { + case TIME: + x = s.time; + break; + case TIMEOFDAY: + x = s.timeOfDay; + break; + default: + x = s.distance; + break; + } + if (x > 0) { if (axisType == GPXDataSetAxisType.TIME && x > 60) { values.add(new Entry(nextX + 1, 0)); values.add(new Entry(nextX + x - 1, 0)); } +// if (axisType == GPXDataSetAxisType.TIMEOFDAY) { +// values.add(new Entry(nextX + 1, 0)); +// values.add(new Entry(nextX + x - 1, 0)); +// } nextX += x / divX; + LOG.debug("X = " + x + ", divX = " + divX + ", nextX = " + nextX); if (Float.isNaN(divSpeed)) { nextY = s.speed * mulSpeed; } else { @@ -1651,7 +1689,8 @@ public class GpxUiHelper { public enum GPXDataSetAxisType { DISTANCE(R.string.distance, R.drawable.ic_action_marker_dark), - TIME(R.string.shared_string_time, R.drawable.ic_action_time); + TIME(R.string.shared_string_time, R.drawable.ic_action_time), + TIMEOFDAY(R.string.time_of_day, R.drawable.ic_action_time); private int stringId; private int imageId; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index daa999c553..782e2ca1e7 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -186,7 +186,8 @@ public class TrackDetailsMenu { if (ds != null && ds.size() > 0) { TrkSegment segment = getTrackSegment(chart); OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0); - if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) { + if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME || + gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { float time = pos * 1000; for (WptPt p : segment.points) { if (p.time - gpxItem.analysis.startTime >= time) { @@ -227,7 +228,7 @@ public class TrackDetailsMenu { float endTime = endPos * 1000; for (WptPt p : segment.points) { if (p.time - gpxItem.analysis.startTime >= startTime && - p.time - gpxItem.analysis.startTime <= endTime) { + p.time - gpxItem.analysis.startTime <= endTime) { if (left == 0 && right == 0) { left = p.getLongitude(); right = p.getLongitude(); @@ -241,6 +242,26 @@ public class TrackDetailsMenu { } } } + } else if (gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { + float startTime = startPos * 1000; + float endTime = endPos * 1000; + for (WptPt p : segment.points) { + if (p.time - gpxItem.analysis.startTime >= startTime && + p.time - gpxItem.analysis.startTime <= endTime) { + if (left == 0 && right == 0) { + left = p.getLongitude(); + right = p.getLongitude(); + top = p.getLatitude(); + bottom = p.getLatitude(); + } else { + left = Math.min(left, p.getLongitude()); + right = Math.max(right, p.getLongitude()); + top = Math.max(top, p.getLatitude()); + bottom = Math.min(bottom, p.getLatitude()); + } + } + } + } else { float startDistance = startPos * dataSet.getDivX(); float endDistance = endPos * dataSet.getDivX(); @@ -541,7 +562,6 @@ public class TrackDetailsMenu { return true; } }); - } optionsMenu.show(); } @@ -560,6 +580,9 @@ public class TrackDetailsMenu { if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) { xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_time)); xAxisTitle.setText(app.getString(R.string.shared_string_time)); + } else if (gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { + xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_time)); + xAxisTitle.setText(app.getString(R.string.time_of_day)); } else { xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_marker_dark)); xAxisTitle.setText(app.getString(R.string.distance)); @@ -570,23 +593,21 @@ public class TrackDetailsMenu { public void onClick(View v) { final PopupMenu optionsMenu = new PopupMenu(mapActivity, v); DirectionsDialogs.setupPopUpMenuIcon(optionsMenu); - final GPXDataSetAxisType type; - if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) { - type = GPXDataSetAxisType.DISTANCE; - } else { - type = GPXDataSetAxisType.TIME; + for (final GPXDataSetAxisType type : GPXDataSetAxisType.values()) { + MenuItem menuItem = optionsMenu.getMenu() + .add(type.getStringId()).setIcon(type.getImageDrawable(app)); + menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem mItem) { + + gpxItem.chartAxisType = type; + gpxItem.chartHighlightPos = -1; + gpxItem.chartMatrix = null; + update(); + return true; + } + }); } - MenuItem menuItem = optionsMenu.getMenu().add(type.getStringId()).setIcon(type.getImageDrawable(app)); - menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem mItem) { - gpxItem.chartAxisType = type; - gpxItem.chartHighlightPos = -1; - gpxItem.chartMatrix = null; - update(); - return true; - } - }); optionsMenu.show(); } });