@@ -30,25 +30,30 @@ import androidx.compose.ui.text.style.TextAlign
3030import androidx.compose.ui.text.style.TextOverflow
3131import androidx.compose.ui.tooling.preview.PreviewParameter
3232import androidx.compose.ui.unit.dp
33- import androidx.hilt.lifecycle.viewmodel .compose.hiltViewModel
33+ import androidx.hilt.navigation .compose.hiltViewModel
3434import androidx.lifecycle.compose.collectAsStateWithLifecycle
3535import androidx.wear.compose.foundation.lazy.TransformingLazyColumn
3636import androidx.wear.compose.foundation.lazy.TransformingLazyColumnScope
3737import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState
3838import androidx.wear.compose.foundation.lazy.items
3939import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
40- import androidx.wear.compose.material.ExperimentalWearMaterialApi
4140import androidx.wear.compose.material3.AlertDialog
41+ import androidx.wear.compose.material3.ButtonDefaults
4242import androidx.wear.compose.material3.ButtonGroup
4343import androidx.wear.compose.material3.FilledIconButton
4444import androidx.wear.compose.material3.Icon
4545import androidx.wear.compose.material3.IconButtonShapes
4646import androidx.wear.compose.material3.ListHeader
47+ import androidx.wear.compose.material3.ListHeaderDefaults
4748import androidx.wear.compose.material3.LocalContentColor
4849import androidx.wear.compose.material3.MaterialTheme
4950import androidx.wear.compose.material3.PlaceholderState
5051import androidx.wear.compose.material3.ScreenScaffold
52+ import androidx.wear.compose.material3.SurfaceTransformation
5153import androidx.wear.compose.material3.Text
54+ import androidx.wear.compose.material3.lazy.TransformationSpec
55+ import androidx.wear.compose.material3.lazy.rememberTransformationSpec
56+ import androidx.wear.compose.material3.lazy.transformedHeight
5257import androidx.wear.compose.material3.placeholder
5358import androidx.wear.compose.material3.placeholderShimmer
5459import androidx.wear.compose.material3.rememberPlaceholderState
@@ -60,12 +65,7 @@ import com.example.jetcaster.core.player.model.toPlayerEpisode
6065import com.example.jetcaster.designsystem.component.HtmlTextContainer
6166import com.example.jetcaster.ui.components.MediumDateFormatter
6267import com.example.jetcaster.ui.preview.WearPreviewEpisodes
63- import com.google.android.horologist.annotations.ExperimentalHorologistApi
64- import com.google.android.horologist.compose.layout.ColumnItemType
65- import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults.listTextPadding
66- import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding
6768
68- @OptIn(ExperimentalWearMaterialApi ::class , ExperimentalHorologistApi ::class )
6969@Composable
7070fun EpisodeScreen (
7171 onPlayButtonClick : () -> Unit ,
@@ -87,7 +87,6 @@ fun EpisodeScreen(
8787 )
8888}
8989
90- @OptIn(ExperimentalHorologistApi ::class )
9190@Composable
9291fun EpisodeScreen (
9392 uiState : EpisodeScreenState ,
@@ -98,15 +97,9 @@ fun EpisodeScreen(
9897 onDismiss : () -> Unit ,
9998 modifier : Modifier = Modifier ,
10099) {
101- val contentPadding = rememberResponsiveColumnPadding(
102- first = ColumnItemType .ListHeader ,
103- last = ColumnItemType .Button ,
104- )
105-
106100 val columnState = rememberTransformingLazyColumnState()
107101 ScreenScaffold (
108102 scrollState = columnState,
109- contentPadding = contentPadding,
110103 modifier = modifier.placeholderShimmer(placeholderState),
111104 ) { contentPadding ->
112105 when (uiState) {
@@ -161,13 +154,23 @@ fun EpisodeScreenLoaded(
161154 placeholderState : PlaceholderState ,
162155 modifier : Modifier = Modifier ,
163156) {
157+ val transformationSpec = rememberTransformationSpec()
164158 TransformingLazyColumn (
165159 modifier = modifier,
166160 state = columnState,
167161 contentPadding = contentPadding,
168162 ) {
169163 item {
170- ListHeader {
164+ ListHeader (
165+ modifier = Modifier
166+ .fillMaxWidth()
167+ .minimumVerticalContentPadding(
168+ ListHeaderDefaults .minimumTopListContentPadding,
169+ ListHeaderDefaults .minimumBottomListContentPadding,
170+ )
171+ .transformedHeight(this , transformationSpec),
172+ transformation = SurfaceTransformation (transformationSpec),
173+ ) {
171174 Text (
172175 text = title,
173176 maxLines = 1 ,
@@ -184,11 +187,16 @@ fun EpisodeScreenLoaded(
184187 onPlayEpisode = onPlayEpisode,
185188 onAddToQueue = onAddToQueue,
186189 placeholderState = placeholderState,
190+ modifier = Modifier
191+ .fillMaxWidth()
192+ .minimumVerticalContentPadding(ButtonDefaults .minimumVerticalListContentPadding)
193+ .transformedHeight(this , transformationSpec),
187194 )
188195 }
189196 if (! placeholderState.isVisible) {
190197 episodeInfoContent(
191198 episode = episode,
199+ transformationSpec = transformationSpec,
192200 )
193201 }
194202 }
@@ -207,7 +215,7 @@ fun LoadedButtonsContent(
207215 val playInteractionSource = remember { MutableInteractionSource () }
208216 val addToQueueInteractionSource = remember { MutableInteractionSource () }
209217
210- ButtonGroup (modifier.fillMaxWidth(). padding(bottom = 16 .dp)) {
218+ ButtonGroup (modifier.padding(bottom = 16 .dp)) {
211219
212220 FilledIconButton (
213221 onClick = {
@@ -245,7 +253,7 @@ fun LoadedButtonsContent(
245253 }
246254}
247255
248- private fun TransformingLazyColumnScope.episodeInfoContent (episode : PlayerEpisode ) {
256+ private fun TransformingLazyColumnScope.episodeInfoContent (episode : PlayerEpisode , transformationSpec : TransformationSpec ) {
249257 val author = episode.author
250258 val duration = episode.duration
251259 val published = episode.published
@@ -258,6 +266,7 @@ private fun TransformingLazyColumnScope.episodeInfoContent(episode: PlayerEpisod
258266 maxLines = 1 ,
259267 overflow = TextOverflow .Ellipsis ,
260268 style = MaterialTheme .typography.bodyMedium,
269+ modifier = Modifier .transformedHeight(this , transformationSpec),
261270 )
262271 }
263272 }
@@ -282,7 +291,8 @@ private fun TransformingLazyColumnScope.episodeInfoContent(episode: PlayerEpisod
282291 overflow = TextOverflow .Ellipsis ,
283292 style = MaterialTheme .typography.bodySmall,
284293 modifier = Modifier
285- .padding(horizontal = 8 .dp),
294+ .padding(horizontal = 8 .dp)
295+ .transformedHeight(this , transformationSpec),
286296 )
287297 }
288298 if (summary != null ) {
@@ -293,14 +303,15 @@ private fun TransformingLazyColumnScope.episodeInfoContent(episode: PlayerEpisod
293303 text = it,
294304 style = MaterialTheme .typography.bodySmall,
295305 color = LocalContentColor .current,
296- modifier = Modifier .listTextPadding(),
306+ modifier = Modifier
307+ .padding(horizontal = 8 .dp)
308+ .transformedHeight(this , transformationSpec),
297309 )
298310 }
299311 }
300312 }
301313}
302314
303- @OptIn(ExperimentalHorologistApi ::class )
304315@WearPreviewDevices
305316@WearPreviewFontScales
306317@Composable
@@ -323,11 +334,6 @@ fun EpisodeScreenLoadingPreview(
323334 @PreviewParameter(WearPreviewEpisodes ::class )
324335 episode : PlayerEpisode ,
325336) {
326- val contentPadding = rememberResponsiveColumnPadding(
327- first = ColumnItemType .ListHeader ,
328- last = ColumnItemType .Button ,
329- )
330-
331337 val columnState = rememberTransformingLazyColumnState()
332338 EpisodeScreenLoaded (
333339 title = episode.title,
@@ -336,7 +342,7 @@ fun EpisodeScreenLoadingPreview(
336342 onPlayEpisode = { },
337343 onAddToQueue = { },
338344 columnState = columnState,
339- contentPadding = contentPadding ,
345+ contentPadding = PaddingValues () ,
340346 placeholderState = rememberPlaceholderState(isVisible = true ),
341347 )
342348}
@@ -349,19 +355,14 @@ fun EpisodeScreenLoadedPreview(
349355 episode : PlayerEpisode ,
350356) {
351357 val columnState = rememberTransformingLazyColumnState()
352- val contentPadding = rememberResponsiveColumnPadding(
353- first = ColumnItemType .ListHeader ,
354- last = ColumnItemType .Button ,
355- )
356-
357358 EpisodeScreenLoaded (
358359 title = episode.title,
359360 episode = episode,
360361 onPlayButtonClick = { },
361362 onPlayEpisode = { },
362363 onAddToQueue = { },
363364 columnState = columnState,
364- contentPadding = contentPadding ,
365+ contentPadding = PaddingValues () ,
365366 placeholderState = rememberPlaceholderState(isVisible = false ),
366367 )
367368}
0 commit comments