Search in sources :

Example 1 with OrderedLineDataSet

use of net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet in project Osmand by osmandapp.

the class TrackDetailsMenu method getRect.

private QuadRect getRect(LineChart chart, float startPos, float endPos) {
    double left = 0, right = 0;
    double top = 0, bottom = 0;
    List<ILineDataSet> ds = chart.getLineData().getDataSets();
    if (ds != null && ds.size() > 0) {
        TrkSegment segment = getTrackSegment(chart);
        OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0);
        if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) {
            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();
            double previousSplitDistance = 0;
            for (int i = 0; i < segment.points.size(); i++) {
                WptPt currentPoint = segment.points.get(i);
                if (i != 0) {
                    WptPt previousPoint = segment.points.get(i - 1);
                    if (currentPoint.distance < previousPoint.distance) {
                        previousSplitDistance += previousPoint.distance;
                    }
                }
                if (previousSplitDistance + currentPoint.distance >= startDistance && previousSplitDistance + currentPoint.distance <= endDistance) {
                    if (left == 0 && right == 0) {
                        left = currentPoint.getLongitude();
                        right = currentPoint.getLongitude();
                        top = currentPoint.getLatitude();
                        bottom = currentPoint.getLatitude();
                    } else {
                        left = Math.min(left, currentPoint.getLongitude());
                        right = Math.max(right, currentPoint.getLongitude());
                        top = Math.max(top, currentPoint.getLatitude());
                        bottom = Math.min(bottom, currentPoint.getLatitude());
                    }
                }
            }
        }
    }
    return new QuadRect(left, top, right, bottom);
}
Also used : WptPt(net.osmand.plus.GPXUtilities.WptPt) ILineDataSet(com.github.mikephil.charting.interfaces.datasets.ILineDataSet) OrderedLineDataSet(net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet) TrkSegment(net.osmand.plus.GPXUtilities.TrkSegment) QuadRect(net.osmand.data.QuadRect)

Example 2 with OrderedLineDataSet

use of net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet in project Osmand by osmandapp.

the class TrackDetailsMenu method updateView.

private void updateView(final View parentView) {
    GPXTrackAnalysis analysis = gpxItem.analysis;
    if (analysis == null || gpxItem.chartTypes == null) {
        parentView.setVisibility(View.GONE);
        if (analysis != null && analysis.isBoundsCalculated()) {
            mapActivity.getMapView().fitRectToMap(analysis.left, analysis.right, analysis.top, analysis.bottom, 0, 0, 0);
        }
        return;
    }
    final LineChart chart = (LineChart) parentView.findViewById(R.id.chart);
    chart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {

        @Override
        public void onValueSelected(Entry e, Highlight h) {
            refreshChart(chart, false);
        }

        @Override
        public void onNothingSelected() {
        }
    });
    chart.setOnChartGestureListener(new OnChartGestureListener() {

        boolean hasTranslated = false;

        float highlightDrawX = -1;

        @Override
        public void onChartGestureStart(MotionEvent me, ChartGesture lastPerformedGesture) {
            hasTranslated = false;
            if (chart.getHighlighted() != null && chart.getHighlighted().length > 0) {
                highlightDrawX = chart.getHighlighted()[0].getDrawX();
            } else {
                highlightDrawX = -1;
            }
        }

        @Override
        public void onChartGestureEnd(MotionEvent me, ChartGesture lastPerformedGesture) {
            if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || lastPerformedGesture == ChartGesture.X_ZOOM || lastPerformedGesture == ChartGesture.Y_ZOOM || lastPerformedGesture == ChartGesture.PINCH_ZOOM || lastPerformedGesture == ChartGesture.DOUBLE_TAP || lastPerformedGesture == ChartGesture.ROTATE) {
                gpxItem.chartMatrix = new Matrix(chart.getViewPortHandler().getMatrixTouch());
                refreshChart(chart, true);
            }
        }

        @Override
        public void onChartLongPressed(MotionEvent me) {
        }

        @Override
        public void onChartDoubleTapped(MotionEvent me) {
        }

        @Override
        public void onChartSingleTapped(MotionEvent me) {
        }

        @Override
        public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
        }

        @Override
        public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
        }

        @Override
        public void onChartTranslate(MotionEvent me, float dX, float dY) {
            hasTranslated = true;
            if (highlightDrawX != -1) {
                Highlight h = chart.getHighlightByTouchPoint(highlightDrawX, 0f);
                if (h != null) {
                    chart.highlightValue(h);
                    refreshChart(chart, false);
                }
            }
        }
    });
    final OsmandApplication app = mapActivity.getMyApplication();
    final IconsCache ic = app.getIconsCache();
    GpxUiHelper.setupGPXChart(app, chart, 4);
    List<ILineDataSet> dataSets = new ArrayList<>();
    if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) {
        for (int i = 0; i < gpxItem.chartTypes.length; i++) {
            OrderedLineDataSet dataSet = null;
            switch(gpxItem.chartTypes[i]) {
                case ALTITUDE:
                    dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, gpxItem.chartAxisType, false, true);
                    break;
                case SPEED:
                    dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true);
                    break;
                case SLOPE:
                    dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true);
                    break;
            }
            if (dataSet != null) {
                dataSets.add(dataSet);
            }
        }
    }
    Collections.sort(dataSets, new Comparator<ILineDataSet>() {

        @Override
        public int compare(ILineDataSet ds1, ILineDataSet ds2) {
            OrderedLineDataSet dataSet1 = (OrderedLineDataSet) ds1;
            OrderedLineDataSet dataSet2 = (OrderedLineDataSet) ds2;
            return dataSet1.getPriority() > dataSet2.getPriority() ? -1 : (dataSet1.getPriority() == dataSet2.getPriority() ? 0 : 1);
        }
    });
    chart.setData(new LineData(dataSets));
    updateChart(chart);
    View yAxis = parentView.findViewById(R.id.y_axis);
    ImageView yAxisIcon = (ImageView) parentView.findViewById(R.id.y_axis_icon);
    TextView yAxisTitle = (TextView) parentView.findViewById(R.id.y_axis_title);
    View yAxisArrow = parentView.findViewById(R.id.y_axis_arrow);
    final List<GPXDataSetType[]> availableTypes = new ArrayList<>();
    boolean hasSlopeChart = false;
    if (analysis.hasElevationData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE });
        if (gpxItem.chartAxisType != GPXDataSetAxisType.TIME) {
            availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SLOPE });
        }
    }
    if (analysis.hasSpeedData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SPEED });
    }
    if (analysis.hasElevationData && gpxItem.chartAxisType != GPXDataSetAxisType.TIME) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE });
    }
    if (analysis.hasElevationData && analysis.hasSpeedData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED });
    }
    for (GPXDataSetType t : gpxItem.chartTypes) {
        if (t == GPXDataSetType.SLOPE) {
            hasSlopeChart = true;
            break;
        }
    }
    yAxisIcon.setImageDrawable(GPXDataSetType.getImageDrawable(app, gpxItem.chartTypes));
    yAxisTitle.setText(GPXDataSetType.getName(app, gpxItem.chartTypes));
    if (availableTypes.size() > 0) {
        yAxis.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                final PopupMenu optionsMenu = new PopupMenu(mapActivity, v);
                DirectionsDialogs.setupPopUpMenuIcon(optionsMenu);
                for (final GPXDataSetType[] types : availableTypes) {
                    MenuItem menuItem = optionsMenu.getMenu().add(GPXDataSetType.getName(app, types)).setIcon(GPXDataSetType.getImageDrawable(app, types));
                    menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                        @Override
                        public boolean onMenuItemClick(MenuItem mItem) {
                            gpxItem.chartTypes = types;
                            update();
                            return true;
                        }
                    });
                }
                optionsMenu.show();
            }
        });
        yAxisArrow.setVisibility(View.VISIBLE);
    } else {
        yAxis.setOnClickListener(null);
        yAxis.setBackgroundResource(0);
        yAxisArrow.setVisibility(View.GONE);
    }
    View xAxis = parentView.findViewById(R.id.x_axis);
    ImageView xAxisIcon = (ImageView) parentView.findViewById(R.id.x_axis_icon);
    TextView xAxisTitle = (TextView) parentView.findViewById(R.id.x_axis_title);
    View xAxisArrow = parentView.findViewById(R.id.x_axis_arrow);
    if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) {
        xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_time));
        xAxisTitle.setText(app.getString(R.string.shared_string_time));
    } else {
        xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_marker_dark));
        xAxisTitle.setText(app.getString(R.string.distance));
    }
    if (analysis.isTimeSpecified() && !hasSlopeChart) {
        xAxis.setOnClickListener(new View.OnClickListener() {

            @Override
            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;
                }
                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();
            }
        });
        xAxisArrow.setVisibility(View.VISIBLE);
    } else {
        xAxis.setOnClickListener(null);
        xAxis.setBackgroundResource(0);
        xAxisArrow.setVisibility(View.GONE);
    }
    refreshChart(chart, true);
}
Also used : OnChartValueSelectedListener(com.github.mikephil.charting.listener.OnChartValueSelectedListener) Highlight(com.github.mikephil.charting.highlight.Highlight) OsmandApplication(net.osmand.plus.OsmandApplication) ArrayList(java.util.ArrayList) ChartGesture(com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture) Entry(com.github.mikephil.charting.data.Entry) Matrix(android.graphics.Matrix) ILineDataSet(com.github.mikephil.charting.interfaces.datasets.ILineDataSet) GPXDataSetType(net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType) TextView(android.widget.TextView) ImageView(android.widget.ImageView) OnChartGestureListener(com.github.mikephil.charting.listener.OnChartGestureListener) GPXTrackAnalysis(net.osmand.plus.GPXUtilities.GPXTrackAnalysis) MenuItem(android.view.MenuItem) ImageView(android.widget.ImageView) View(android.view.View) TextView(android.widget.TextView) MotionEvent(android.view.MotionEvent) LineData(com.github.mikephil.charting.data.LineData) GPXDataSetAxisType(net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType) OrderedLineDataSet(net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet) IconsCache(net.osmand.plus.IconsCache) LineChart(com.github.mikephil.charting.charts.LineChart) PopupMenu(android.support.v7.widget.PopupMenu)

Example 3 with OrderedLineDataSet

use of net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet in project Osmand by osmandapp.

the class TrackDetailsMenu method getPoint.

private WptPt getPoint(LineChart chart, float pos) {
    WptPt wpt = null;
    List<ILineDataSet> ds = chart.getLineData().getDataSets();
    if (ds != null && ds.size() > 0) {
        TrkSegment segment = getTrackSegment(chart);
        OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0);
        if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) {
            float time = pos * 1000;
            for (WptPt p : segment.points) {
                if (p.time - gpxItem.analysis.startTime >= time) {
                    wpt = p;
                    break;
                }
            }
        } else {
            float distance = pos * dataSet.getDivX();
            double previousSplitDistance = 0;
            for (int i = 0; i < segment.points.size(); i++) {
                WptPt currentPoint = segment.points.get(i);
                if (i != 0) {
                    WptPt previousPoint = segment.points.get(i - 1);
                    if (currentPoint.distance < previousPoint.distance) {
                        previousSplitDistance += previousPoint.distance;
                    }
                }
                if (previousSplitDistance + currentPoint.distance >= distance) {
                    wpt = currentPoint;
                    break;
                }
            }
        }
    }
    return wpt;
}
Also used : WptPt(net.osmand.plus.GPXUtilities.WptPt) ILineDataSet(com.github.mikephil.charting.interfaces.datasets.ILineDataSet) OrderedLineDataSet(net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet) TrkSegment(net.osmand.plus.GPXUtilities.TrkSegment)

Aggregations

ILineDataSet (com.github.mikephil.charting.interfaces.datasets.ILineDataSet)3 OrderedLineDataSet (net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet)3 TrkSegment (net.osmand.plus.GPXUtilities.TrkSegment)2 WptPt (net.osmand.plus.GPXUtilities.WptPt)2 Matrix (android.graphics.Matrix)1 PopupMenu (android.support.v7.widget.PopupMenu)1 MenuItem (android.view.MenuItem)1 MotionEvent (android.view.MotionEvent)1 View (android.view.View)1 ImageView (android.widget.ImageView)1 TextView (android.widget.TextView)1 LineChart (com.github.mikephil.charting.charts.LineChart)1 Entry (com.github.mikephil.charting.data.Entry)1 LineData (com.github.mikephil.charting.data.LineData)1 Highlight (com.github.mikephil.charting.highlight.Highlight)1 ChartGesture (com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture)1 OnChartGestureListener (com.github.mikephil.charting.listener.OnChartGestureListener)1 OnChartValueSelectedListener (com.github.mikephil.charting.listener.OnChartValueSelectedListener)1 ArrayList (java.util.ArrayList)1 QuadRect (net.osmand.data.QuadRect)1