Workout details: add button to rotate charts activity

This commit is contained in:
a0z
2025-08-28 19:10:07 +02:00
committed by José Rebelo
parent 28a331f4f4
commit 21abc0767d
5 changed files with 49 additions and 10 deletions
@@ -47,12 +47,9 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.components.XAxis
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.listener.ChartTouchListener
import com.github.mikephil.charting.listener.OnChartGestureListener
import com.github.mikephil.charting.listener.OnChartValueSelectedListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -60,9 +57,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication
import nodomain.freeyourgadget.gadgetbridge.R
import nodomain.freeyourgadget.gadgetbridge.activities.ActivitySummariesChartFragment
import nodomain.freeyourgadget.gadgetbridge.activities.charts.DurationXLabelFormatter
import nodomain.freeyourgadget.gadgetbridge.activities.charts.marker.ValueMarker
import nodomain.freeyourgadget.gadgetbridge.activities.fit.FitViewerActivity
import nodomain.freeyourgadget.gadgetbridge.activities.maps.MapsTrackActivity
import nodomain.freeyourgadget.gadgetbridge.activities.maps.MapsTrackViewModel.Companion.getActivityPoints
import nodomain.freeyourgadget.gadgetbridge.activities.workouts.charts.ChartDataRepository
import nodomain.freeyourgadget.gadgetbridge.activities.workouts.charts.DefaultWorkoutCharts
@@ -450,7 +445,6 @@ class WorkoutDetailsFragment : Fragment(), MenuProvider {
isHighlightPerDragEnabled = false
isHighlightPerTapEnabled = false
isDragEnabled = false
}
lineChart.xAxis.apply {
setDrawLabels(true)
@@ -473,6 +467,7 @@ class WorkoutDetailsFragment : Fragment(), MenuProvider {
lineChart.axisRight.apply {
isEnabled = false
}
chart.lineChart(lineChart);
lineChart.data = chart.chartData as LineData?
lineChart.description.isEnabled = false;
lineChart.onChartGestureListener = object : OnChartGestureListener {
@@ -4,10 +4,12 @@ import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS_PER_SECOND;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_MINUTES_PER_KM;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SECONDS_PER_KM;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SPM;
import android.content.Context;
import android.graphics.Color;
import com.github.mikephil.charting.components.LegendEntry;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
@@ -27,6 +29,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries;
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate;
import nodomain.freeyourgadget.gadgetbridge.model.workout.WorkoutChart;
import nodomain.freeyourgadget.gadgetbridge.util.Accumulator;
public class DefaultWorkoutCharts {
public static List<WorkoutChart> buildDefaultCharts(final Context context,
@@ -41,6 +44,7 @@ public class DefaultWorkoutCharts {
final List<Entry> elevationDataPoints = new ArrayList<>();
boolean hasSpeedValues = false;
boolean hasCadenceValues = false;
final Accumulator cadenceAccumulator = new Accumulator();
for (int i = 0; i <= activityPoints.size() - 1; i++) {
final ActivityPoint point = activityPoints.get(i);
@@ -57,6 +61,7 @@ public class DefaultWorkoutCharts {
}
cadenceDataPoints.add(new Entry(tsShorten, point.getCadence()));
if (!hasCadenceValues && point.getCadence() > 0) {
cadenceAccumulator.add(point.getCadence());
hasCadenceValues = true;
}
}
@@ -87,14 +92,44 @@ public class DefaultWorkoutCharts {
if (hasCadenceValues && !cadenceDataPoints.isEmpty()) {
final String label = String.format("%s (%s)", context.getString(R.string.workout_cadence), getUnitString(context, getCadenceUnit(cycleUnit)));
final LineDataSet dataset = createDataSet(context, cadenceDataPoints, label, context.getResources().getColor(R.color.chart_line_speed));
final LineDataSet dataset = createDataSet(context, cadenceDataPoints, label, context.getResources().getColor(R.color.transparent));
dataset.setDrawCircles(true);
dataset.setDrawCircleHole(false);
dataset.setLineWidth(-1);
dataset.setCircleRadius(3f);
dataset.setMode(LineDataSet.Mode.CUBIC_BEZIER);
dataset.setCircleColor(context.getResources().getColor(R.color.chart_cadence_circle));
final ValueFormatter integerFormatter = new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
return String.valueOf((int) value);
}
};
charts.add(new WorkoutChart("cadence", context.getString(R.string.workout_cadence), ActivitySummaryEntries.GROUP_CADENCE, new LineData(dataset), integerFormatter));
float xAxisMaximum = Math.max((float) (cadenceAccumulator.getMax() + 30), (float) cadenceAccumulator.getAverage() * 2);
charts.add(new WorkoutChart(
"cadence",
context.getString(R.string.workout_cadence),
ActivitySummaryEntries.GROUP_CADENCE,
new LineData(dataset),
integerFormatter,
getUnitString(context, UNIT_SPM),
lineChart -> {
YAxis yAxisLeft = lineChart.getAxisLeft();
yAxisLeft.setAxisMinimum(0);
yAxisLeft.setAxisMaximum(xAxisMaximum);
YAxis yAxisRight = lineChart.getAxisRight();
yAxisRight.setAxisMinimum(0);
yAxisRight.setAxisMaximum(xAxisMaximum);
List<LegendEntry> legendEntries = new ArrayList<>(1);
LegendEntry hrEntry = new LegendEntry();
hrEntry.label = label;
hrEntry.formColor = context.getResources().getColor(R.color.chart_cadence_circle);
legendEntries.add(hrEntry);
lineChart.getLegend().setCustom(legendEntries);
return kotlin.Unit.INSTANCE;
}
)
);
}
if (!elevationDataPoints.isEmpty()) {
@@ -138,7 +173,7 @@ public class DefaultWorkoutCharts {
case JUMPS -> ActivitySummaryEntries.UNIT_JUMPS_PER_MINUTE;
case REPS -> ActivitySummaryEntries.UNIT_REPS_PER_MINUTE;
case REVOLUTIONS -> ActivitySummaryEntries.UNIT_REVS_PER_MINUTE;
default -> ActivitySummaryEntries.UNIT_SPM;
default -> UNIT_SPM;
};
}
}
@@ -153,6 +153,12 @@ class WorkoutChartsActivity : AbstractGBActivity(), MenuProvider {
true
}
android.R.id.home -> {
// back button
finish()
true
}
else -> false
}
}
@@ -1,5 +1,6 @@
package nodomain.freeyourgadget.gadgetbridge.model.workout
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.data.ChartData
import com.github.mikephil.charting.formatter.ValueFormatter
@@ -10,4 +11,5 @@ data class WorkoutChart @JvmOverloads constructor(
val chartData: ChartData<*>,
var chartYLabelFormatter: ValueFormatter? = null,
var unitString: String? = null,
val lineChart: (LineChart) -> Unit = {}
)
+1
View File
@@ -89,6 +89,7 @@
<color name="hr_zone_threshold_color" type="color">#FF7043</color>
<color name="hr_zone_maximum_color" type="color">#F44336</color>
<color name="chart_cadence_circle" type="color">#FF7043</color>
<color name="chart_line_speed" type="color">#80D8FF</color>
<color name="chart_line_elevation" type="color">#66BB6A</color>
<color name="chart_line_heart_rate" type="color">#F44336</color>