Skip to content

Commit 47524da

Browse files
committed
Update dependencies and migrate Vico charting library to version 3.0.2.
1 parent da8927f commit 47524da

4 files changed

Lines changed: 79 additions & 94 deletions

File tree

android_app/app/src/main/java/com/health/openscale/ui/screen/components/MeasurementChart.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,19 @@ import com.health.openscale.core.facade.SettingsPreferenceKeys
6060
import com.health.openscale.core.model.EnrichedMeasurement
6161
import com.health.openscale.ui.shared.SharedViewModel
6262
import com.patrykandpatrick.vico.compose.cartesian.CartesianChartHost
63-
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberBottom
64-
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberEnd
65-
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberStart
63+
import com.patrykandpatrick.vico.compose.cartesian.Zoom
64+
import com.patrykandpatrick.vico.compose.cartesian.axis.HorizontalAxis
65+
import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis
66+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianValueFormatter
6667
import com.patrykandpatrick.vico.compose.cartesian.rememberCartesianChart
6768
import com.patrykandpatrick.vico.compose.cartesian.rememberVicoScrollState
6869
import com.patrykandpatrick.vico.compose.cartesian.rememberVicoZoomState
69-
import com.patrykandpatrick.vico.core.cartesian.Zoom
70-
import com.patrykandpatrick.vico.core.cartesian.axis.HorizontalAxis
71-
import com.patrykandpatrick.vico.core.cartesian.axis.VerticalAxis
72-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianValueFormatter
7370
import kotlinx.coroutines.flow.map
7471
import kotlinx.coroutines.launch
7572
import java.time.Instant
7673
import java.time.LocalDate
7774
import java.time.ZoneId
75+
import kotlin.collections.toTypedArray
7876

7977
/**
8078
* Represents a single, plottable data point for the chart,

android_app/app/src/main/java/com/health/openscale/ui/screen/components/MeasurementChartLayers.kt

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,50 +17,43 @@
1717
*/
1818
package com.health.openscale.ui.screen.components
1919

20-
import android.text.Layout
20+
import androidx.compose.foundation.shape.RoundedCornerShape
2121
import androidx.compose.material3.MaterialTheme
2222
import androidx.compose.runtime.Composable
2323
import androidx.compose.runtime.LaunchedEffect
2424
import androidx.compose.runtime.mutableStateOf
2525
import androidx.compose.runtime.remember
2626
import androidx.compose.ui.graphics.Color
27-
import androidx.compose.ui.graphics.toArgb
27+
import androidx.compose.ui.text.TextStyle
28+
import androidx.compose.ui.text.style.TextAlign
2829
import androidx.compose.ui.unit.dp
2930
import com.health.openscale.core.data.MeasurementType
3031
import com.health.openscale.core.data.UnitType
3132
import com.health.openscale.core.data.UserGoals
3233
import com.health.openscale.core.utils.LocaleUtils
3334
import com.health.openscale.ui.theme.White
35+
import com.patrykandpatrick.vico.compose.cartesian.axis.Axis
3436
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberAxisGuidelineComponent
35-
import com.patrykandpatrick.vico.compose.cartesian.layer.dashed
36-
import com.patrykandpatrick.vico.compose.cartesian.layer.point
37+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianChartModelProducer
38+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider
39+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianValueFormatter
40+
import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries
41+
import com.patrykandpatrick.vico.compose.cartesian.decoration.HorizontalLine
42+
import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer
3743
import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer
44+
import com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarker
45+
import com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarkerVisibilityListener
46+
import com.patrykandpatrick.vico.compose.cartesian.marker.DefaultCartesianMarker
3847
import com.patrykandpatrick.vico.compose.cartesian.marker.rememberDefaultCartesianMarker
39-
import com.patrykandpatrick.vico.compose.common.component.fixed
48+
import com.patrykandpatrick.vico.compose.common.Fill
49+
import com.patrykandpatrick.vico.compose.common.Insets
50+
import com.patrykandpatrick.vico.compose.common.LayeredComponent
51+
import com.patrykandpatrick.vico.compose.common.component.ShapeComponent
52+
import com.patrykandpatrick.vico.compose.common.component.TextComponent
4053
import com.patrykandpatrick.vico.compose.common.component.rememberLineComponent
4154
import com.patrykandpatrick.vico.compose.common.component.rememberShapeComponent
4255
import com.patrykandpatrick.vico.compose.common.component.rememberTextComponent
43-
import com.patrykandpatrick.vico.compose.common.component.shapeComponent
44-
import com.patrykandpatrick.vico.compose.common.fill
45-
import com.patrykandpatrick.vico.compose.common.insets
46-
import com.patrykandpatrick.vico.compose.common.shape.markerCorneredShape
47-
import com.patrykandpatrick.vico.compose.common.shape.rounded
48-
import com.patrykandpatrick.vico.core.cartesian.axis.Axis
49-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianChartModelProducer
50-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianLayerRangeProvider
51-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianValueFormatter
52-
import com.patrykandpatrick.vico.core.cartesian.data.lineSeries
53-
import com.patrykandpatrick.vico.core.cartesian.decoration.HorizontalLine
54-
import com.patrykandpatrick.vico.core.cartesian.layer.LineCartesianLayer
55-
import com.patrykandpatrick.vico.core.cartesian.marker.CartesianMarker
56-
import com.patrykandpatrick.vico.core.cartesian.marker.CartesianMarkerVisibilityListener
57-
import com.patrykandpatrick.vico.core.cartesian.marker.DefaultCartesianMarker
58-
import com.patrykandpatrick.vico.core.common.Fill
59-
import com.patrykandpatrick.vico.core.common.LayeredComponent
60-
import com.patrykandpatrick.vico.core.common.component.ShapeComponent
61-
import com.patrykandpatrick.vico.core.common.component.TextComponent
62-
import com.patrykandpatrick.vico.core.common.data.ExtraStore
63-
import com.patrykandpatrick.vico.core.common.shape.CorneredShape
56+
import com.patrykandpatrick.vico.compose.common.data.ExtraStore
6457
import java.time.LocalDate
6558
import java.time.ZoneId
6659
import java.time.format.DateTimeFormatter
@@ -247,22 +240,22 @@ internal fun createLineSpec(
247240
isPointConnected: Boolean = true,
248241
): LineCartesianLayer.Line {
249242
val lineStroke = when {
250-
!isPointConnected -> LineCartesianLayer.LineStroke.dashed(dashLength = 0.dp)
251-
isProjection -> LineCartesianLayer.LineStroke.dashed(thickness = 2.dp, dashLength = 4.dp, gapLength = 4.dp)
252-
else -> LineCartesianLayer.LineStroke.Continuous(thicknessDp = 2f)
243+
!isPointConnected -> LineCartesianLayer.LineStroke.Dashed(dashLength = 0.dp)
244+
isProjection -> LineCartesianLayer.LineStroke.Dashed(thickness = 2.dp, dashLength = 4.dp, gapLength = 4.dp)
245+
else -> LineCartesianLayer.LineStroke.Continuous(thickness = 2.dp)
253246
}
254247

255248
val lineFill = LineCartesianLayer.LineFill.single(
256-
fill = if (isPointConnected) Fill(color.toArgb()) else Fill(color.copy(alpha = 0.5f).toArgb())
249+
fill = if (isPointConnected) Fill(color) else Fill(color.copy(alpha = 0.5f))
257250
)
258251

259252
return LineCartesianLayer.Line(
260253
fill = lineFill,
261254
stroke = lineStroke,
262-
areaFill = if (statisticsMode && !isProjection) LineCartesianLayer.AreaFill.single(Fill(color.copy(alpha = 0.2f).toArgb())) else null,
255+
areaFill = if (statisticsMode && !isProjection) LineCartesianLayer.AreaFill.single(Fill(color.copy(alpha = 0.2f))) else null,
263256
pointProvider = if (showPoints && !statisticsMode && !isProjection) {
264257
LineCartesianLayer.PointProvider.single(
265-
LineCartesianLayer.point(ShapeComponent(fill(color.copy(alpha = 0.7f)), CorneredShape.Pill), 6.dp)
258+
LineCartesianLayer.Point(ShapeComponent(Fill(color.copy(alpha = 0.7f)),shape = RoundedCornerShape(50)), size = 6.dp)
266259
)
267260
} else null,
268261
pointConnector = LineCartesianLayer.PointConnector.cubic()
@@ -278,21 +271,26 @@ internal fun createLineSpec(
278271
@Composable
279272
internal fun rememberGoalLine(goal: UserGoals, type: MeasurementType?): HorizontalLine {
280273
val goalColor = type?.let { Color(it.color) } ?: MaterialTheme.colorScheme.onSurface
281-
val goalFill = fill(goalColor.copy(alpha = 0.7f))
274+
val goalFill = Fill(goalColor.copy(alpha = 0.7f))
282275
val line = rememberLineComponent(fill = goalFill, thickness = 2.dp)
283276
val labelComponent = rememberTextComponent(
284-
color = White,
285-
margins = insets(start = 6.dp),
286-
padding = insets(start = 8.dp, end = 8.dp, bottom = 2.dp, top = 2.dp),
287-
background = shapeComponent(goalFill, CorneredShape.rounded(topLeft = 4.dp, topRight = 4.dp, bottomLeft = 4.dp, bottomRight = 4.dp)),
277+
style = TextStyle(color = White),
278+
margins = Insets(start = 6.dp),
279+
padding = Insets(start = 8.dp, end = 8.dp, bottom = 2.dp, top = 2.dp),
280+
background = ShapeComponent(goalFill, shape = RoundedCornerShape(50)),
288281
)
289282

290283
return remember(goal, line) {
291284
HorizontalLine(
292285
y = { goal.goalValue.toDouble() },
293286
line = line,
294287
labelComponent = labelComponent,
295-
label = { LocaleUtils.formatValueForDisplay(goal.goalValue.toString(), type?.unit ?: UnitType.NONE) },
288+
label = {
289+
LocaleUtils.formatValueForDisplay(
290+
goal.goalValue.toString(),
291+
type?.unit ?: UnitType.NONE
292+
)
293+
},
296294
verticalAxisPosition = if (type?.isOnRightYAxis == true) Axis.Position.Vertical.End else Axis.Position.Vertical.Start
297295
)
298296
}
@@ -309,21 +307,19 @@ fun rememberMarker(
309307
valueFormatter: DefaultCartesianMarker.ValueFormatter = DefaultCartesianMarker.ValueFormatter.default(),
310308
showIndicator: Boolean = true,
311309
): CartesianMarker {
312-
val labelBackgroundShape = markerCorneredShape(CorneredShape.Corner.Rounded)
313310
val labelBackground = rememberShapeComponent(
314-
fill = fill(MaterialTheme.colorScheme.background),
315-
shape = labelBackgroundShape,
311+
fill = Fill(MaterialTheme.colorScheme.background),
312+
shape = RoundedCornerShape(50),
316313
strokeThickness = 1.dp,
317-
strokeFill = fill(MaterialTheme.colorScheme.outline),
314+
strokeFill = Fill(MaterialTheme.colorScheme.outline),
318315
)
319316
val label = rememberTextComponent(
320-
color = MaterialTheme.colorScheme.onSurface,
321-
textAlignment = Layout.Alignment.ALIGN_CENTER,
322-
padding = insets(horizontal = 8.dp, vertical = 4.dp),
317+
style = TextStyle(color = MaterialTheme.colorScheme.onSurface, textAlign = TextAlign.Center),
318+
padding = Insets(horizontal = 8.dp, vertical = 4.dp),
323319
background = labelBackground,
324320
minWidth = TextComponent.MinWidth.fixed(40.dp),
325321
)
326-
val indicatorFrontComponent = rememberShapeComponent(fill(MaterialTheme.colorScheme.surface), CorneredShape.Pill)
322+
val indicatorFrontComponent = rememberShapeComponent(Fill(MaterialTheme.colorScheme.surface), shape = RoundedCornerShape(50))
327323
val guideline = rememberAxisGuidelineComponent()
328324

329325
return rememberDefaultCartesianMarker(
@@ -332,13 +328,13 @@ fun rememberMarker(
332328
indicator = if (showIndicator) {
333329
{ color ->
334330
LayeredComponent(
335-
back = ShapeComponent(fill(color.copy(alpha = 0.15f)), CorneredShape.Pill),
331+
back = ShapeComponent(Fill(color.copy(alpha = 0.15f)), shape = RoundedCornerShape(50)),
336332
front = LayeredComponent(
337-
back = ShapeComponent(fill = fill(color), shape = CorneredShape.Pill),
333+
back = ShapeComponent(fill = Fill(color), shape = RoundedCornerShape(50)),
338334
front = indicatorFrontComponent,
339-
padding = insets(5.dp),
335+
padding = Insets(5.dp),
340336
),
341-
padding = insets(10.dp),
337+
padding = Insets(10.dp),
342338
)
343339
}
344340
} else null,

android_app/app/src/main/java/com/health/openscale/ui/screen/components/PeriodChart.kt

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,31 @@
1717
*/
1818
package com.health.openscale.ui.screen.components
1919

20-
import android.text.TextUtils
21-
import androidx.compose.foundation.gestures.detectTapGestures
2220
import androidx.compose.material3.MaterialTheme
2321
import androidx.compose.runtime.Composable
2422
import androidx.compose.runtime.LaunchedEffect
25-
import androidx.compose.runtime.getValue
26-
import androidx.compose.runtime.mutableStateOf
2723
import androidx.compose.runtime.remember
28-
import androidx.compose.runtime.setValue
2924
import androidx.compose.ui.Modifier
30-
import androidx.compose.ui.graphics.toArgb
31-
import androidx.compose.ui.input.pointer.pointerInput
32-
import androidx.compose.ui.unit.sp
25+
import androidx.compose.ui.unit.dp
3326
import com.patrykandpatrick.vico.compose.cartesian.CartesianChartHost
27+
import com.patrykandpatrick.vico.compose.cartesian.axis.HorizontalAxis
3428
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberAxisLabelComponent
35-
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberBottom
29+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianChartModelProducer
30+
import com.patrykandpatrick.vico.compose.cartesian.data.CartesianValueFormatter
31+
import com.patrykandpatrick.vico.compose.cartesian.data.columnSeries
32+
import com.patrykandpatrick.vico.compose.cartesian.layer.ColumnCartesianLayer
3633
import com.patrykandpatrick.vico.compose.cartesian.layer.rememberColumnCartesianLayer
37-
import com.patrykandpatrick.vico.compose.cartesian.layer.stacked
34+
import com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarker
35+
import com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarkerController
36+
import com.patrykandpatrick.vico.compose.cartesian.marker.ColumnCartesianLayerMarkerTarget
37+
import com.patrykandpatrick.vico.compose.cartesian.marker.DefaultCartesianMarker
38+
import com.patrykandpatrick.vico.compose.cartesian.marker.Interaction
3839
import com.patrykandpatrick.vico.compose.cartesian.rememberCartesianChart
39-
import com.patrykandpatrick.vico.core.cartesian.axis.HorizontalAxis
40-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianChartModelProducer
41-
import com.patrykandpatrick.vico.core.cartesian.data.CartesianValueFormatter
42-
import com.patrykandpatrick.vico.core.cartesian.data.columnSeries
43-
import com.patrykandpatrick.vico.core.cartesian.layer.ColumnCartesianLayer
44-
import com.patrykandpatrick.vico.core.cartesian.marker.CartesianMarker
45-
import com.patrykandpatrick.vico.core.cartesian.marker.Interaction
46-
import com.patrykandpatrick.vico.core.cartesian.marker.CartesianMarkerController
47-
import com.patrykandpatrick.vico.core.cartesian.marker.ColumnCartesianLayerMarkerTarget
48-
import com.patrykandpatrick.vico.core.cartesian.marker.DefaultCartesianMarker
49-
import com.patrykandpatrick.vico.core.common.Fill
50-
import com.patrykandpatrick.vico.core.common.component.LineComponent
51-
import com.patrykandpatrick.vico.core.common.data.ExtraStore
40+
import com.patrykandpatrick.vico.compose.common.Fill
41+
import com.patrykandpatrick.vico.compose.common.component.LineComponent
42+
import com.patrykandpatrick.vico.compose.common.data.ExtraStore
43+
import kotlin.collections.firstOrNull
44+
5245

5346
private val BottomAxisLabelKey = ExtraStore.Key<List<String>>()
5447

@@ -86,8 +79,8 @@ fun PeriodChart(
8679
onPeriodClick: (PeriodDataPoint?) -> Unit
8780
) {
8881
// Fill colors for unselected and selected bars
89-
val unselectedColor = Fill(MaterialTheme.colorScheme.primaryContainer.toArgb())
90-
val selectedColor = Fill(MaterialTheme.colorScheme.primary.toArgb())
82+
val unselectedColor = Fill(MaterialTheme.colorScheme.primaryContainer)
83+
val selectedColor = Fill(MaterialTheme.colorScheme.primary)
9184

9285
// Chart model producer that holds and updates the dataset
9386
val modelProducer = remember { CartesianChartModelProducer() }
@@ -96,11 +89,11 @@ fun PeriodChart(
9689
val columnLayer = rememberColumnCartesianLayer(
9790
ColumnCartesianLayer.ColumnProvider.series(
9891
listOf(
99-
LineComponent(fill = unselectedColor, thicknessDp = 12f),
100-
LineComponent(fill = selectedColor, thicknessDp = 12f)
92+
LineComponent(fill = unselectedColor, thickness = 12.dp),
93+
LineComponent(fill = selectedColor, thickness = 12.dp)
10194
)
10295
),
103-
mergeMode = { ColumnCartesianLayer.MergeMode.stacked() },
96+
mergeMode = { ColumnCartesianLayer.MergeMode.Stacked },
10497
)
10598

10699
// Update the chart model when data or selected period changes
@@ -132,8 +125,6 @@ fun PeriodChart(
132125
guideline = null,
133126
label = rememberAxisLabelComponent(
134127
lineCount = 2, // allow wrapping if needed
135-
textSize = 9.sp,
136-
truncateAt = TextUtils.TruncateAt.MARQUEE
137128
)
138129
),
139130
marker = rememberMarker(

android_app/gradle/libs.versions.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
[versions]
22
agp = "8.13.2"
3-
kotlin = "2.3.0"
3+
kotlin = "2.3.10"
44
coreKtx = "1.17.0"
55
junit = "4.13.2"
66
junitVersion = "1.3.0"
77
espressoCore = "3.7.0"
88
lifecycleRuntimeKtx = "2.10.0"
9-
activityCompose = "1.12.2"
10-
composeBom = "2025.12.01"
9+
activityCompose = "1.12.4"
10+
composeBom = "2026.02.01"
1111
room = "2.8.4"
12-
navigation = "2.9.6"
12+
navigation = "2.9.7"
1313
lifecycle = "2.10.0"
1414
datastore = "1.2.0"
15-
worker="2.11.0"
15+
worker="2.11.1"
1616
documentfile = "1.1.0"
1717
hilt = "2.57.2"
1818
hiltNavCompose = "1.3.0"
1919
androidxHilt = "1.3.0"
20-
composeCharts = "2.3.6"
20+
composeCharts = "3.0.2"
2121
composeReorderable = "3.0.0"
2222
compose-material = "1.7.8"
2323
constraintlayout-compose = "1.1.1"
2424
glance = "1.1.1"
2525
kotlinCsv = "1.10.0"
2626
blessedKotlin = "3.0.11"
2727
truth = "1.4.5"
28-
bouncycastle = "1.79"
28+
bouncycastle = "1.83"
2929

3030

3131
[libraries]

0 commit comments

Comments
 (0)