Skip to content

Commit af59afc

Browse files
authored
Merge pull request #564 from kiwicom/compose1.6
Update to Compose 1.6 (BC break in Text)
2 parents 0bb5004 + 18922e4 commit af59afc

File tree

76 files changed

+290
-215
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+290
-215
lines changed

catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt

+11-10
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan
1313
import androidx.compose.foundation.lazy.grid.LazyGridScope
1414
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
1515
import androidx.compose.foundation.lazy.grid.items
16+
import androidx.compose.material.icons.automirrored.rounded.Announcement
17+
import androidx.compose.material.icons.automirrored.rounded.Article
18+
import androidx.compose.material.icons.automirrored.rounded.LabelImportant
19+
import androidx.compose.material.icons.automirrored.rounded.ListAlt
20+
import androidx.compose.material.icons.automirrored.rounded.MenuOpen
1621
import androidx.compose.material.icons.outlined.ToggleOff
17-
import androidx.compose.material.icons.rounded.Announcement
18-
import androidx.compose.material.icons.rounded.Article
1922
import androidx.compose.material.icons.rounded.Ballot
2023
import androidx.compose.material.icons.rounded.BrightnessMedium
2124
import androidx.compose.material.icons.rounded.CheckBox
@@ -25,10 +28,7 @@ import androidx.compose.material.icons.rounded.DragHandle
2528
import androidx.compose.material.icons.rounded.EditAttributes
2629
import androidx.compose.material.icons.rounded.FormatSize
2730
import androidx.compose.material.icons.rounded.Keyboard
28-
import androidx.compose.material.icons.rounded.LabelImportant
2931
import androidx.compose.material.icons.rounded.LinearScale
30-
import androidx.compose.material.icons.rounded.ListAlt
31-
import androidx.compose.material.icons.rounded.MenuOpen
3232
import androidx.compose.material.icons.rounded.Palette
3333
import androidx.compose.material.icons.rounded.Rectangle
3434
import androidx.compose.material.icons.rounded.SignalWifiOff
@@ -66,6 +66,7 @@ import kiwi.orbit.compose.ui.controls.TopAppBarLarge
6666
import kiwi.orbit.compose.ui.foundation.ProvideMergedTextStyle
6767
import kiwi.orbit.compose.ui.utils.plus
6868
import kotlinx.serialization.ExperimentalSerializationApi
69+
import androidx.compose.material.icons.Icons.AutoMirrored.Rounded as AMMIcons
6970
import androidx.compose.material.icons.Icons.Outlined as OMIcons
7071
import androidx.compose.material.icons.Icons.Rounded as MIcons
7172
import kiwi.orbit.compose.catalog.semantics.MainScreenSemantics as Semantics
@@ -121,18 +122,18 @@ internal fun MainScreen(
121122
MenuItem("Segmented Switch", MIcons.ToggleOn, Semantics.SegmentedSwitchItemTag) {
122123
Destinations.SegmentedSwitch
123124
},
124-
MenuItem("Select Field", MIcons.MenuOpen, Semantics.SelectFieldItemTag) { Destinations.SelectField },
125+
MenuItem("Select Field", AMMIcons.MenuOpen, Semantics.SelectFieldItemTag) { Destinations.SelectField },
125126
MenuItem("Slider", MIcons.LinearScale, Semantics.SliderItemTag) { Destinations.Slider },
126127
MenuItem("Stepper", Icons.PlusCircle, Semantics.StepperItemTag) { Destinations.Stepper },
127-
MenuItem("SurfaceCard", MIcons.Article, Semantics.SurfaceCardItemTag) { Destinations.SurfaceCard },
128+
MenuItem("SurfaceCard", AMMIcons.Article, Semantics.SurfaceCardItemTag) { Destinations.SurfaceCard },
128129
MenuItem("Switch", MIcons.ToggleOn, Semantics.SwitchItemTag) { Destinations.Switch },
129130
MenuItem("Tabs", MIcons.Tab, Semantics.TabsItemTag) { Destinations.Tabs },
130-
MenuItem("Tag", MIcons.LabelImportant, Semantics.TagItemTag) { Destinations.Tag },
131+
MenuItem("Tag", AMMIcons.LabelImportant, Semantics.TagItemTag) { Destinations.Tag },
131132
MenuItem("Text Field", MIcons.Keyboard, Semantics.TextFieldItemTag) { Destinations.TextField },
132133
MenuItem("Tile", MIcons.Crop169, Semantics.TileItemTag) { Destinations.Tile },
133-
MenuItem("TileGroup", MIcons.ListAlt, Semantics.TileGroupItemTag) { Destinations.TileGroup },
134+
MenuItem("TileGroup", AMMIcons.ListAlt, Semantics.TileGroupItemTag) { Destinations.TileGroup },
134135
MenuItem("Timeline", Icons.RouteTwoStops, Semantics.TimelineItemTag) { Destinations.Timeline },
135-
MenuItem("Toast", MIcons.Announcement, Semantics.ToastItemTag) { Destinations.Toast },
136+
MenuItem("Toast", AMMIcons.Announcement, Semantics.ToastItemTag) { Destinations.Toast },
136137
MenuItem("TopAppBar", MIcons.WebAsset, Semantics.TopAppBarItemTag) { Destinations.TopAppBar },
137138
)
138139

gradle/libs.versions.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ accompanist-systemController = "com.google.accompanist:accompanist-systemuicontr
4444
coil = { module = "io.coil-kt:coil-compose", version = "2.4.0" }
4545
compose-animation = { module = "androidx.compose.animation:animation" }
4646
compose-animationGraphics = { module = "androidx.compose.animation:animation-graphics" }
47-
compose-bom = "dev.chrisbanes.compose:compose-bom:2023.04.00-beta02"
47+
compose-bom = "dev.chrisbanes.compose:compose-bom:2023.12.00-alpha03"
4848
# compiler dependency is defined to help Renovabot update the version
4949
compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose-compiler" }
5050
compose-foundation = { module = "androidx.compose.foundation:foundation" }
5151
compose-layout = { module = "androidx.compose.foundation:foundation-layout" }
5252
compose-material = { module = "androidx.compose.material:material" }
53-
compose-material3 = "androidx.compose.material3:material3:1.1.2"
53+
compose-material3 = "androidx.compose.material3:material3:1.2.0-alpha12"
5454
compose-materialRipple = { module = "androidx.compose.material:material-ripple" }
5555
compose-materialIconsExtended = { module = "androidx.compose.material:material-icons-extended" }
5656
compose-navigation = { module = "androidx.navigation:navigation-compose", version = "2.7.5" }

lint/src/main/kotlin/kiwi/orbit/compose/lint/detectors/MaterialDesignInsteadOrbitDesignDetector.kt

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class MaterialDesignInsteadOrbitDesignDetector : Detector(), Detector.UastScanne
120120
"kiwi.orbit.compose.ui.controls.Separator" to setOf(
121121
"androidx.compose.material.Divider",
122122
"androidx.compose.material3.Divider",
123+
"androidx.compose.material3.HorizontalDivider",
123124
),
124125
"kiwi.orbit.compose.ui.controls.IconButton" to setOf(
125126
"androidx.compose.material.IconButton",

readme.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
[![CI Build](https://img.shields.io/github/actions/workflow/status/kiwicom/orbit-compose/build.yml?branch=main)](https://github.com/kiwicom/orbit-compose/actions/workflows/build.yml)
1111
[![GitHub release](https://img.shields.io/github/v/release/kiwicom/orbit-compose)](https://github.com/kiwicom/orbit-compose/releases)
1212
[![Maven release](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Fkiwi%2Forbit%2Fcompose%2Fui%2Fmaven-metadata.xml)](https://search.maven.org/search?q=g:kiwi.orbit.compose)
13-
[![Compose 1.5](https://img.shields.io/badge/Compose-1.5-%232ec781)](https://developer.android.com/jetpack/androidx/releases/compose-kotlin)
14-
[![Material 3](https://img.shields.io/badge/Material-3-%230c57d0)](https://developer.android.com/jetpack/androidx/releases/compose-material3)
13+
[![Compose 1.6](https://img.shields.io/badge/Compose-1.6-00A991)](https://developer.android.com/jetpack/androidx/releases/compose-kotlin)
14+
[![Compose M3 1.2](https://img.shields.io/badge/Compose%20M3-1.2-00A991)](https://developer.android.com/jetpack/androidx/releases/compose-material3)
1515

1616
</div>
1717

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Collapse.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Box
99
import androidx.compose.foundation.layout.Column
1010
import androidx.compose.foundation.layout.Row
1111
import androidx.compose.foundation.layout.padding
12-
import androidx.compose.material3.Divider
1312
import androidx.compose.runtime.Composable
1413
import androidx.compose.runtime.getValue
1514
import androidx.compose.runtime.mutableStateOf
@@ -106,7 +105,7 @@ public fun Collapse(
106105
}
107106
}
108107
if (withSeparator) {
109-
Divider()
108+
Separator()
110109
}
111110
}
112111
}

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/LinearProgressIndicator.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public fun LinearProgressIndicator(
4848
label = "LinearProgressWidth",
4949
)
5050
androidx.compose.material3.LinearProgressIndicator(
51-
progress = animatedProgress,
51+
progress = { animatedProgress },
5252
modifier = modifier.fillMaxWidth(),
5353
color = color,
5454
trackColor = backgroundColor,

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/PasswordStrengthIndicator.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package kiwi.orbit.compose.ui.controls
22

33
import androidx.compose.animation.core.animateFloatAsState
44
import androidx.compose.foundation.layout.Arrangement
5-
import androidx.compose.foundation.layout.BoxWithConstraints
5+
import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.Column
77
import androidx.compose.foundation.layout.Row
88
import androidx.compose.foundation.layout.fillMaxWidth
@@ -42,7 +42,7 @@ public fun PasswordStrengthIndicator(
4242
LocalContentColor provides color,
4343
LocalTextStyle provides OrbitTheme.typography.bodySmallMedium,
4444
) {
45-
BoxWithConstraints(
45+
Box(
4646
modifier = Modifier.weight(1f),
4747
contentAlignment = Alignment.CenterEnd,
4848
) {

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Slider.kt

+132-53
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import androidx.compose.foundation.systemGestureExclusion
2424
import androidx.compose.material.ripple.rememberRipple
2525
import androidx.compose.material3.ExperimentalMaterial3Api
2626
import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement
27-
import androidx.compose.material3.SliderPositions
27+
import androidx.compose.material3.RangeSliderState
28+
import androidx.compose.material3.SliderState
2829
import androidx.compose.runtime.Composable
2930
import androidx.compose.runtime.CompositionLocalProvider
3031
import androidx.compose.runtime.LaunchedEffect
@@ -41,8 +42,9 @@ import androidx.compose.ui.composed
4142
import androidx.compose.ui.geometry.Offset
4243
import androidx.compose.ui.geometry.Rect
4344
import androidx.compose.ui.geometry.lerp
44-
import androidx.compose.ui.graphics.PointMode
45+
import androidx.compose.ui.graphics.Color
4546
import androidx.compose.ui.graphics.StrokeCap
47+
import androidx.compose.ui.graphics.drawscope.DrawScope
4648
import androidx.compose.ui.platform.LocalDensity
4749
import androidx.compose.ui.semantics.disabled
4850
import androidx.compose.ui.semantics.semantics
@@ -109,8 +111,8 @@ public fun Slider(
109111
enabled = enabled,
110112
)
111113
},
112-
track = { sliderPositions ->
113-
Track(enabled, sliderPositions)
114+
track = { sliderState ->
115+
Track(sliderState, enabled)
114116
},
115117
)
116118
}
@@ -166,8 +168,8 @@ public fun RangeSlider(
166168
enabled = enabled,
167169
)
168170
},
169-
track = { sliderPositions ->
170-
Track(enabled, sliderPositions)
171+
track = { sliderState ->
172+
Track(sliderState, enabled)
171173
},
172174
steps = steps,
173175
)
@@ -280,8 +282,65 @@ private fun Thumb(
280282
)
281283
}
282284

285+
@OptIn(ExperimentalMaterial3Api::class)
286+
@Composable
287+
private fun Track(
288+
sliderState: SliderState,
289+
enabled: Boolean,
290+
) {
291+
Track(
292+
steps = sliderState.steps,
293+
activeRangeStart = {
294+
calcFraction(
295+
sliderState.valueRange.start,
296+
sliderState.valueRange.endInclusive,
297+
0f,
298+
)
299+
},
300+
activeRangeEnd = {
301+
calcFraction(
302+
sliderState.valueRange.start,
303+
sliderState.valueRange.endInclusive,
304+
0f,
305+
)
306+
},
307+
enabled = enabled,
308+
)
309+
}
310+
311+
@OptIn(ExperimentalMaterial3Api::class)
312+
@Composable
313+
private fun Track(
314+
rangeSliderState: RangeSliderState,
315+
enabled: Boolean,
316+
) {
317+
Track(
318+
steps = rangeSliderState.steps,
319+
activeRangeStart = {
320+
calcFraction(
321+
rangeSliderState.valueRange.start,
322+
rangeSliderState.valueRange.endInclusive,
323+
rangeSliderState.activeRangeStart,
324+
)
325+
},
326+
activeRangeEnd = {
327+
calcFraction(
328+
rangeSliderState.valueRange.start,
329+
rangeSliderState.valueRange.endInclusive,
330+
rangeSliderState.activeRangeEnd,
331+
)
332+
},
333+
enabled = enabled,
334+
)
335+
}
336+
283337
@Composable
284-
private fun Track(enabled: Boolean, sliderPositions: SliderPositions) {
338+
private fun Track(
339+
steps: Int,
340+
activeRangeStart: () -> Float,
341+
activeRangeEnd: () -> Float,
342+
enabled: Boolean,
343+
) {
285344
val activeTrackColor = when (enabled) {
286345
true -> OrbitTheme.colors.info.normal
287346
false -> OrbitTheme.colors.content.disabled.copy(alpha = 0.38f)
@@ -298,60 +357,80 @@ private fun Track(enabled: Boolean, sliderPositions: SliderPositions) {
298357
true -> contentColorFor(inactiveTrackColor).copy(alpha = 0.38f)
299358
false -> contentColorFor(OrbitTheme.colors.surface.strong).copy(alpha = 0.24f)
300359
}
360+
val tickFractions = remember(steps) {
361+
if (steps == 0) floatArrayOf() else FloatArray(steps + 2) { it.toFloat() / (steps + 1) }
362+
}
301363
Canvas(
302364
Modifier
303365
.fillMaxWidth()
304-
.height(TrackSize),
366+
.height(TrackHeight),
305367
) {
306-
val isRtl = layoutDirection == LayoutDirection.Rtl
307-
val sliderLeft = Offset(0f - 9.9.dp.roundToPx(), center.y)
308-
val sliderRight = Offset(size.width + 9.9.dp.roundToPx(), center.y)
309-
val sliderStart = if (isRtl) sliderRight else sliderLeft
310-
val sliderEnd = if (isRtl) sliderLeft else sliderRight
311-
val dotStart = if (isRtl) Offset(size.width, center.y) else Offset(0f, center.y)
312-
val dotEnd = if (isRtl) Offset(0f, center.y) else Offset(size.width, center.y)
313-
val tickSize = TickSize.toPx()
314-
val trackStrokeWidth = TrackSize.toPx()
315-
drawLine(
368+
drawTrack(
369+
tickFractions,
370+
activeRangeStart(),
371+
activeRangeEnd(),
316372
inactiveTrackColor,
317-
sliderStart,
318-
sliderEnd,
319-
trackStrokeWidth,
320-
StrokeCap.Round,
321-
)
322-
val sliderValueEnd = Offset(
323-
sliderStart.x +
324-
(sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.endInclusive,
325-
center.y,
373+
activeTrackColor,
374+
inactiveTickColor,
375+
activeTickColor,
326376
)
377+
}
378+
}
327379

328-
val sliderValueStart = Offset(
329-
sliderStart.x +
330-
(sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.start,
331-
center.y,
332-
)
380+
private fun calcFraction(a: Float, b: Float, pos: Float) =
381+
(if (b - a == 0f) 0f else (pos - a) / (b - a)).coerceIn(0f, 1f)
333382

334-
drawLine(
335-
activeTrackColor,
336-
sliderValueStart,
337-
sliderValueEnd,
338-
trackStrokeWidth,
339-
StrokeCap.Round,
383+
private fun DrawScope.drawTrack(
384+
tickFractions: FloatArray,
385+
activeRangeStart: Float,
386+
activeRangeEnd: Float,
387+
inactiveTrackColor: Color,
388+
activeTrackColor: Color,
389+
inactiveTickColor: Color,
390+
activeTickColor: Color,
391+
) {
392+
val isRtl = layoutDirection == LayoutDirection.Rtl
393+
val sliderLeft = Offset(0f - 9.9.dp.roundToPx(), center.y)
394+
val sliderRight = Offset(size.width + 9.9.dp.roundToPx(), center.y)
395+
val sliderStart = if (isRtl) sliderRight else sliderLeft
396+
val sliderEnd = if (isRtl) sliderLeft else sliderRight
397+
val dotStart = if (isRtl) Offset(size.width, center.y) else Offset(0f, center.y)
398+
val dotEnd = if (isRtl) Offset(0f, center.y) else Offset(size.width, center.y)
399+
val tickSize = TickSize.toPx()
400+
val trackStrokeWidth = TrackHeight.toPx()
401+
drawLine(
402+
inactiveTrackColor,
403+
sliderStart,
404+
sliderEnd,
405+
trackStrokeWidth,
406+
StrokeCap.Round,
407+
)
408+
val sliderValueEnd = Offset(
409+
sliderStart.x +
410+
(sliderEnd.x - sliderStart.x) * activeRangeEnd,
411+
center.y,
412+
)
413+
414+
val sliderValueStart = Offset(
415+
sliderStart.x +
416+
(sliderEnd.x - sliderStart.x) * activeRangeStart,
417+
center.y,
418+
)
419+
420+
drawLine(
421+
activeTrackColor,
422+
sliderValueStart,
423+
sliderValueEnd,
424+
trackStrokeWidth,
425+
StrokeCap.Round,
426+
)
427+
for (tick in tickFractions) {
428+
val outsideFraction = tick > activeRangeEnd || tick < activeRangeStart
429+
drawCircle(
430+
color = if (outsideFraction) inactiveTickColor else activeTickColor,
431+
center = Offset(lerp(dotStart, dotEnd, tick).x, center.y),
432+
radius = tickSize / 2f,
340433
)
341-
sliderPositions.tickFractions.groupBy {
342-
it > sliderPositions.activeRange.endInclusive ||
343-
it < sliderPositions.activeRange.start
344-
}.forEach { (outsideFraction, list) ->
345-
drawPoints(
346-
list.map {
347-
Offset(lerp(dotStart, dotEnd, it).x, center.y)
348-
},
349-
PointMode.Points,
350-
(if (outsideFraction) inactiveTickColor else activeTickColor),
351-
tickSize,
352-
StrokeCap.Round,
353-
)
354-
}
355434
}
356435
}
357436

@@ -419,7 +498,7 @@ private fun Modifier.sliderSystemGestureExclusion(enabled: Boolean): Modifier {
419498
}
420499
}
421500

422-
private val TrackSize = 4.dp
501+
private val TrackHeight = 4.dp
423502
private val TickSize = 2.dp
424503

425504
@OrbitPreviews

0 commit comments

Comments
 (0)