Skip to content

Commit 5a2d19e

Browse files
authored
[Wear] Updates to Compose 1.6 and bump SDK (#1696)
1. Updates to Compose 1.6 2. bump SDK 3. removes using Horologist for padding
2 parents d3ff757 + 7ac2aba commit 5a2d19e

10 files changed

Lines changed: 297 additions & 233 deletions

File tree

‎Jetcaster/gradle/libs.versions.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ androidx-test-ext-junit = "1.3.0"
2525
androidx-test-ext-truth = "1.7.0"
2626
androidx-tv-foundation = "1.0.0"
2727
androidx-tv-material = "1.1.0"
28-
androidx-wear-compose-material3 = "1.6.1"
29-
androidx-wear-compose = "1.6.1"
28+
androidx-wear-compose-material3 = "1.6.2"
29+
androidx-wear-compose = "1.6.2"
3030
androidx-window = "1.5.1"
3131
androidxHiltNavigationCompose = "1.3.0"
3232
androix-test-uiautomator = "2.3.0"

‎Jetcaster/wear/build.gradle‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ android {
2929
defaultConfig {
3030
applicationId "com.example.jetcaster"
3131
minSdk 26
32-
targetSdk 34
32+
targetSdk 37
3333
versionCode 1
3434
versionName "1.0"
3535
}
@@ -54,11 +54,15 @@ android {
5454
}
5555
}
5656

57-
/*kotlinOptions {
58-
jvmTarget = JavaVersion.VERSION_17.majorVersion
59-
freeCompilerArgs = freeCompilerArgs + "-opt-in=kotlin.RequiresOptIn"
60-
freeCompilerArgs = freeCompilerArgs + "-opt-in=com.google.android.horologist.annotations.ExperimentalHorologistApi"
61-
}*/
57+
kotlin {
58+
compilerOptions {
59+
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
60+
freeCompilerArgs.addAll([
61+
"-opt-in=kotlin.RequiresOptIn",
62+
"-opt-in=com.google.android.horologist.annotations.ExperimentalHorologistApi"
63+
])
64+
}
65+
}
6266
buildFeatures {
6367
compose true
6468
}
@@ -107,9 +111,6 @@ dependencies {
107111
implementation(libs.androidx.media3.session)
108112
implementation libs.androidx.media3.common.ktx
109113

110-
// Horologist for correct Compose layout
111-
implementation libs.horologist.compose.layout
112-
113114
//Horologist Media toolkit
114115
implementation libs.horologist.media.ui
115116
implementation libs.horologist.media.uimaterial3
@@ -152,7 +153,6 @@ dependencies {
152153
testImplementation libs.roborazzi
153154
testImplementation libs.roborazzi.compose
154155
testImplementation libs.roborazzi.rule
155-
testImplementation(libs.horologist.roboscreenshots)
156156

157157
androidTestImplementation libs.androidx.test.ext.junit
158158
androidTestImplementation libs.androidx.test.espresso.core

‎Jetcaster/wear/src/main/java/com/example/jetcaster/ui/components/MediaContent.kt‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,14 @@ import androidx.wear.compose.material3.AppScaffold
3434
import androidx.wear.compose.material3.ButtonDefaults
3535
import androidx.wear.compose.material3.FilledTonalButton
3636
import androidx.wear.compose.material3.ScreenScaffold
37+
import androidx.wear.compose.material3.SurfaceTransformation
3738
import androidx.wear.compose.material3.Text
3839
import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices
3940
import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales
4041
import coil.compose.AsyncImage
4142
import com.example.jetcaster.R
4243
import com.example.jetcaster.core.player.model.PlayerEpisode
4344
import com.example.jetcaster.ui.preview.WearPreviewEpisodes
44-
import com.google.android.horologist.compose.layout.ColumnItemType
45-
import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding
4645
import java.time.format.DateTimeFormatter
4746
import java.time.format.FormatStyle
4847

@@ -52,6 +51,7 @@ fun MediaContent(
5251
onItemClick: (PlayerEpisode) -> Unit,
5352
modifier: Modifier = Modifier,
5453
episodeArtworkPlaceholder: Painter = painterResource(id = R.drawable.music),
54+
transformation: SurfaceTransformation? = null,
5555
) {
5656
val mediaTitle = episode.title
5757
val duration = episode.duration
@@ -99,10 +99,10 @@ fun MediaContent(
9999
ButtonDefaults.LargeIconSize,
100100
)
101101
.clip(CircleShape),
102-
103102
)
104103
},
105104
modifier = modifier.fillMaxWidth(),
105+
transformation = transformation,
106106
)
107107
}
108108

@@ -115,11 +115,7 @@ fun MediaContentPreview(
115115
modifier: Modifier = Modifier,
116116
) {
117117
AppScaffold(modifier = modifier) {
118-
val contentPadding = rememberResponsiveColumnPadding(
119-
first = ColumnItemType.Button,
120-
)
121-
122-
ScreenScaffold(contentPadding = contentPadding) {
118+
ScreenScaffold { contentPadding ->
123119
Box(
124120
modifier = Modifier
125121
.fillMaxWidth()

‎Jetcaster/wear/src/main/java/com/example/jetcaster/ui/episode/EpisodeScreen.kt‎

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,30 @@ import androidx.compose.ui.text.style.TextAlign
3030
import androidx.compose.ui.text.style.TextOverflow
3131
import androidx.compose.ui.tooling.preview.PreviewParameter
3232
import androidx.compose.ui.unit.dp
33-
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
33+
import androidx.hilt.navigation.compose.hiltViewModel
3434
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3535
import androidx.wear.compose.foundation.lazy.TransformingLazyColumn
3636
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnScope
3737
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState
3838
import androidx.wear.compose.foundation.lazy.items
3939
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
40-
import androidx.wear.compose.material.ExperimentalWearMaterialApi
4140
import androidx.wear.compose.material3.AlertDialog
41+
import androidx.wear.compose.material3.ButtonDefaults
4242
import androidx.wear.compose.material3.ButtonGroup
4343
import androidx.wear.compose.material3.FilledIconButton
4444
import androidx.wear.compose.material3.Icon
4545
import androidx.wear.compose.material3.IconButtonShapes
4646
import androidx.wear.compose.material3.ListHeader
47+
import androidx.wear.compose.material3.ListHeaderDefaults
4748
import androidx.wear.compose.material3.LocalContentColor
4849
import androidx.wear.compose.material3.MaterialTheme
4950
import androidx.wear.compose.material3.PlaceholderState
5051
import androidx.wear.compose.material3.ScreenScaffold
52+
import androidx.wear.compose.material3.SurfaceTransformation
5153
import 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
5257
import androidx.wear.compose.material3.placeholder
5358
import androidx.wear.compose.material3.placeholderShimmer
5459
import androidx.wear.compose.material3.rememberPlaceholderState
@@ -60,12 +65,7 @@ import com.example.jetcaster.core.player.model.toPlayerEpisode
6065
import com.example.jetcaster.designsystem.component.HtmlTextContainer
6166
import com.example.jetcaster.ui.components.MediumDateFormatter
6267
import 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
7070
fun EpisodeScreen(
7171
onPlayButtonClick: () -> Unit,
@@ -87,7 +87,6 @@ fun EpisodeScreen(
8787
)
8888
}
8989

90-
@OptIn(ExperimentalHorologistApi::class)
9190
@Composable
9291
fun 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

Comments
 (0)