fix changing track info after enabling the "Join segments" option;
fix display track info with enabled/disabled "Join segments" option in chart;
This commit is contained in:
parent
fee1b8983e
commit
0c0d90d42c
4 changed files with 83 additions and 71 deletions
|
@ -36,6 +36,7 @@ import net.osmand.data.LatLon;
|
|||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
|
@ -66,6 +67,8 @@ public class TrackDetailsMenu {
|
|||
@Nullable
|
||||
private GpxDisplayItem gpxItem;
|
||||
@Nullable
|
||||
private SelectedGpxFile selectedGpxFile;
|
||||
@Nullable
|
||||
private TrackDetailsBarController toolbarController;
|
||||
@Nullable
|
||||
private TrkSegment segment;
|
||||
|
@ -101,6 +104,15 @@ public class TrackDetailsMenu {
|
|||
this.gpxItem = gpxItem;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public SelectedGpxFile getSelectedGpxFile() {
|
||||
return selectedGpxFile;
|
||||
}
|
||||
|
||||
public void setSelectedGpxFile(@NonNull SelectedGpxFile selectedGpxFile) {
|
||||
this.selectedGpxFile = selectedGpxFile;
|
||||
}
|
||||
|
||||
public boolean isVisible() {
|
||||
return visible;
|
||||
}
|
||||
|
@ -707,18 +719,19 @@ public class TrackDetailsMenu {
|
|||
if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) {
|
||||
for (int i = 0; i < gpxItem.chartTypes.length; i++) {
|
||||
OrderedLineDataSet dataSet = null;
|
||||
boolean withoutGaps = selectedGpxFile != null && (!selectedGpxFile.isJoinSegments() && gpxItem.isGeneralTrack());
|
||||
switch (gpxItem.chartTypes[i]) {
|
||||
case ALTITUDE:
|
||||
dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis,
|
||||
gpxItem.chartAxisType, false, true, false);
|
||||
gpxItem.chartAxisType, false, true, withoutGaps);
|
||||
break;
|
||||
case SPEED:
|
||||
dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis,
|
||||
gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, false);
|
||||
gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, withoutGaps);
|
||||
break;
|
||||
case SLOPE:
|
||||
dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis,
|
||||
gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, false);
|
||||
gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, withoutGaps);
|
||||
break;
|
||||
}
|
||||
if (dataSet != null) {
|
||||
|
|
|
@ -17,16 +17,16 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
||||
import net.osmand.plus.myplaces.SegmentActionsListener;
|
||||
import net.osmand.plus.widgets.TextViewEx;
|
||||
|
@ -40,32 +40,41 @@ public class GpxBlockStatisticsBuilder {
|
|||
private final OsmandApplication app;
|
||||
private RecyclerView blocksView;
|
||||
private final SelectedGpxFile selectedGpxFile;
|
||||
private final TrackDisplayHelper displayHelper;
|
||||
private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT};
|
||||
|
||||
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, TrackDisplayHelper displayHelper) {
|
||||
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) {
|
||||
this.app = app;
|
||||
this.selectedGpxFile = selectedGpxFile;
|
||||
this.displayHelper = displayHelper;
|
||||
}
|
||||
|
||||
public void setBlocksView(RecyclerView blocksView) {
|
||||
this.blocksView = blocksView;
|
||||
}
|
||||
|
||||
private GPXTrackAnalysis getAnalysis() {
|
||||
return selectedGpxFile.getTrackAnalysis(app);
|
||||
private GpxDisplayItem getDisplayItem(GPXFile gpxFile) {
|
||||
return GpxUiHelper.makeGpxDisplayItem(app, gpxFile);
|
||||
}
|
||||
|
||||
private GPXFile getGPXFile() {
|
||||
return selectedGpxFile.getGpxFile();
|
||||
}
|
||||
|
||||
public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
|
||||
GPXTrackAnalysis analysis = getAnalysis();
|
||||
float totalDistance = analysis.totalDistance;
|
||||
float timeSpan = analysis.timeSpan;
|
||||
List<StatBlock> items = new ArrayList<>();
|
||||
GPXFile gpxFile = getGPXFile();
|
||||
GpxDisplayItem gpxDisplayItem = null;
|
||||
GPXTrackAnalysis analysis = null;
|
||||
if (gpxFile.tracks.size() > 0) {
|
||||
gpxDisplayItem = getDisplayItem(gpxFile);
|
||||
analysis = gpxDisplayItem.analysis;
|
||||
}
|
||||
if (gpxDisplayItem != null && analysis != null) {
|
||||
boolean withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack();
|
||||
float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
|
||||
float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
|
||||
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
|
||||
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
|
||||
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
|
||||
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
|
||||
List<StatBlock> items = new ArrayList<>();
|
||||
|
||||
prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app),
|
||||
R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE);
|
||||
|
@ -80,11 +89,11 @@ public class GpxBlockStatisticsBuilder {
|
|||
prepareData(analysis, items, app.getString(R.string.shared_string_time_span),
|
||||
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
|
||||
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME);
|
||||
|
||||
if (Algorithms.isEmpty(items)) {
|
||||
AndroidUiHelper.updateVisibility(blocksView, false);
|
||||
} else {
|
||||
final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, actionsListener, activeColor, nightMode);
|
||||
}
|
||||
boolean isNotEmpty = !Algorithms.isEmpty(items);
|
||||
AndroidUiHelper.updateVisibility(blocksView, isNotEmpty);
|
||||
if (isNotEmpty && gpxDisplayItem != null) {
|
||||
final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, gpxDisplayItem, actionsListener, activeColor, nightMode);
|
||||
blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false));
|
||||
blocksView.setAdapter(sbAdapter);
|
||||
}
|
||||
|
@ -134,7 +143,6 @@ public class GpxBlockStatisticsBuilder {
|
|||
}
|
||||
|
||||
public class StatBlock {
|
||||
|
||||
private final String title;
|
||||
private final String value;
|
||||
private final int imageResId;
|
||||
|
@ -164,14 +172,17 @@ public class GpxBlockStatisticsBuilder {
|
|||
|
||||
private class BlockStatisticsAdapter extends RecyclerView.Adapter<BlockStatisticsViewHolder> {
|
||||
|
||||
private final List<StatBlock> statBlocks;
|
||||
private final GpxDisplayItem displayItem;
|
||||
private final SegmentActionsListener actionsListener;
|
||||
@ColorInt
|
||||
private final int activeColor;
|
||||
private final List<StatBlock> statBlocks;
|
||||
private final boolean nightMode;
|
||||
private final SegmentActionsListener actionsListener;
|
||||
|
||||
public BlockStatisticsAdapter(List<StatBlock> statBlocks, SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
|
||||
public BlockStatisticsAdapter(List<StatBlock> statBlocks, GpxDisplayItem displayItem,
|
||||
SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
|
||||
this.statBlocks = statBlocks;
|
||||
this.displayItem = displayItem;
|
||||
this.actionsListener = actionsListener;
|
||||
this.activeColor = activeColor;
|
||||
this.nightMode = nightMode;
|
||||
|
@ -200,21 +211,10 @@ public class GpxBlockStatisticsBuilder {
|
|||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
List<GpxDisplayGroup> groups = displayHelper.getDisplayGroups(filterTypes);
|
||||
GpxDisplayGroup group = null;
|
||||
for (GpxDisplayGroup g : groups) {
|
||||
if (g.isGeneralTrack()) {
|
||||
group = g;
|
||||
}
|
||||
}
|
||||
if (group == null && !groups.isEmpty()) {
|
||||
group = groups.get(0);
|
||||
}
|
||||
if (group != null) {
|
||||
GpxDisplayItem displayItem = group.getModifiableList().get(0);
|
||||
if (displayItem != null && displayItem.analysis != null) {
|
||||
GPXTrackAnalysis analysis = displayItem.analysis;
|
||||
if (displayItem != null && analysis != null) {
|
||||
ArrayList<GPXDataSetType> list = new ArrayList<>();
|
||||
if (displayItem.analysis.hasElevationData || displayItem.analysis.isSpeedSpecified() || displayItem.analysis.hasSpeedData) {
|
||||
if (analysis.hasElevationData || analysis.isSpeedSpecified() || analysis.hasSpeedData) {
|
||||
if (item.firstType != null) {
|
||||
list.add(item.firstType);
|
||||
}
|
||||
|
@ -227,7 +227,6 @@ public class GpxBlockStatisticsBuilder {
|
|||
actionsListener.openAnalyzeOnMap(displayItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
setImageDrawable(holder.imageView, item.imageResId, item.imageColorId);
|
||||
AndroidUtils.setBackgroundColor(app, holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark);
|
||||
|
|
|
@ -43,12 +43,11 @@ public class OverviewCard extends BaseCard {
|
|||
private final SelectedGpxFile selectedGpxFile;
|
||||
private final GpxBlockStatisticsBuilder blockStatisticsBuilder;
|
||||
|
||||
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper,
|
||||
@NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) {
|
||||
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) {
|
||||
super(mapActivity);
|
||||
this.actionsListener = actionsListener;
|
||||
this.selectedGpxFile = selectedGpxFile;
|
||||
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, displayHelper);
|
||||
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -326,7 +326,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
}
|
||||
headerContainer.addView(overviewCard.getView());
|
||||
} else {
|
||||
overviewCard = new OverviewCard(getMapActivity(), displayHelper, this, selectedGpxFile);
|
||||
overviewCard = new OverviewCard(getMapActivity(), this, selectedGpxFile);
|
||||
overviewCard.setListener(this);
|
||||
headerContainer.addView(overviewCard.build(getMapActivity()));
|
||||
}
|
||||
|
@ -1013,6 +1013,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
public void openAnalyzeOnMap(GpxDisplayItem gpxItem) {
|
||||
TrackDetailsMenu trackDetailsMenu = getMapActivity().getTrackDetailsMenu();
|
||||
trackDetailsMenu.setGpxItem(gpxItem);
|
||||
trackDetailsMenu.setSelectedGpxFile(selectedGpxFile);
|
||||
trackDetailsMenu.show();
|
||||
hide();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue