Skip to content

Commit 4f62a6a

Browse files
committed
Edge-to-edge content for better shared element transitions.
1 parent 9cbc052 commit 4f62a6a

File tree

4 files changed

+44
-25
lines changed
  • android/feature
    • content-viewer/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/contentviewer
    • home/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/home
    • kotlin-weekly-issue/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/kotlinweeklyissue
    • saved-for-later/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/savedforlater

4 files changed

+44
-25
lines changed

android/feature/content-viewer/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/contentviewer/ContentViewerScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,18 @@ import androidx.compose.foundation.layout.Box
1919
import androidx.compose.foundation.layout.Column
2020
import androidx.compose.foundation.layout.Spacer
2121
import androidx.compose.foundation.layout.WindowInsets
22+
import androidx.compose.foundation.layout.WindowInsetsSides
2223
import androidx.compose.foundation.layout.asPaddingValues
2324
import androidx.compose.foundation.layout.fillMaxSize
2425
import androidx.compose.foundation.layout.fillMaxWidth
2526
import androidx.compose.foundation.layout.height
26-
import androidx.compose.foundation.layout.navigationBarsPadding
27+
import androidx.compose.foundation.layout.navigationBars
28+
import androidx.compose.foundation.layout.only
2729
import androidx.compose.foundation.layout.padding
2830
import androidx.compose.foundation.layout.size
2931
import androidx.compose.foundation.layout.statusBars
3032
import androidx.compose.foundation.layout.width
33+
import androidx.compose.foundation.layout.windowInsetsPadding
3134
import androidx.compose.runtime.Composable
3235
import androidx.compose.runtime.DisposableEffect
3336
import androidx.compose.runtime.getValue
@@ -81,7 +84,7 @@ public fun SharedTransitionScope.ContentViewerScreen(
8184
Column(
8285
modifier = modifier
8386
.fillMaxSize()
84-
.navigationBarsPadding()
87+
.windowInsetsPadding(WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal))
8588
.background(KSTheme.colorScheme.background)
8689
.sharedBounds(
8790
rememberSharedContentState(key = boundsKey),

android/feature/home/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/home/HomeScreen.kt

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@ import androidx.compose.foundation.layout.Column
1818
import androidx.compose.foundation.layout.PaddingValues
1919
import androidx.compose.foundation.layout.Spacer
2020
import androidx.compose.foundation.layout.WindowInsets
21+
import androidx.compose.foundation.layout.WindowInsetsSides.Companion.Horizontal
2122
import androidx.compose.foundation.layout.asPaddingValues
2223
import androidx.compose.foundation.layout.fillMaxSize
2324
import androidx.compose.foundation.layout.fillMaxWidth
2425
import androidx.compose.foundation.layout.height
25-
import androidx.compose.foundation.layout.navigationBarsPadding
26+
import androidx.compose.foundation.layout.navigationBars
27+
import androidx.compose.foundation.layout.only
2628
import androidx.compose.foundation.layout.padding
2729
import androidx.compose.foundation.layout.size
2830
import androidx.compose.foundation.layout.statusBars
2931
import androidx.compose.foundation.layout.width
32+
import androidx.compose.foundation.layout.windowInsetsPadding
3033
import androidx.compose.foundation.lazy.LazyColumn
3134
import androidx.compose.foundation.lazy.LazyListState
3235
import androidx.compose.foundation.lazy.items
@@ -99,7 +102,7 @@ internal fun SharedTransitionScope.HomeScreen(
99102
Column(
100103
modifier = modifier
101104
.fillMaxSize()
102-
.navigationBarsPadding()
105+
.windowInsetsPadding(WindowInsets.navigationBars.only(Horizontal))
103106
.background(KSTheme.colorScheme.background),
104107
) {
105108
TopNavBar(
@@ -174,13 +177,13 @@ private fun SharedTransitionScope.ContentUi(
174177
modifier: Modifier = Modifier,
175178
) = trace("FeedList") {
176179
Box(
177-
modifier = modifier.fillMaxSize().navigationBarsPadding(),
180+
modifier = modifier.fillMaxSize(),
178181
contentAlignment = Alignment.TopCenter,
179182
) {
180183
LazyColumn(
181184
modifier = Modifier.testTag("home:feedList"),
182185
state = listState,
183-
contentPadding = ListContentPadding,
186+
contentPadding = calculateListContentPadding(),
184187
verticalArrangement = Arrangement.spacedBy(20.dp),
185188
) {
186189
items(
@@ -337,7 +340,7 @@ private fun ErrorUi(
337340
Column(
338341
modifier = modifier
339342
.fillMaxSize()
340-
.padding(ListContentPadding),
343+
.padding(calculateListContentPadding()),
341344
horizontalAlignment = Alignment.CenterHorizontally,
342345
verticalArrangement = Arrangement.Center,
343346
) {
@@ -361,12 +364,15 @@ private fun ErrorUi(
361364
}
362365
}
363366

364-
private val ListContentPadding = PaddingValues(
365-
top = 24.dp,
366-
start = 24.dp,
367-
end = 24.dp,
368-
bottom = 120.dp,
369-
)
367+
@Composable
368+
private fun calculateListContentPadding(): PaddingValues {
369+
return PaddingValues(
370+
top = 24.dp,
371+
start = 24.dp,
372+
end = 24.dp,
373+
bottom = 120.dp + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding(),
374+
)
375+
}
370376

371377
private val HomeUiState.contentKey: Int
372378
get() = when (this) {

android/feature/kotlin-weekly-issue/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/kotlinweeklyissue/KotlinWeeklyIssueScreen.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@ import androidx.compose.foundation.layout.Column
1818
import androidx.compose.foundation.layout.Row
1919
import androidx.compose.foundation.layout.Spacer
2020
import androidx.compose.foundation.layout.WindowInsets
21+
import androidx.compose.foundation.layout.WindowInsetsSides
2122
import androidx.compose.foundation.layout.asPaddingValues
2223
import androidx.compose.foundation.layout.fillMaxSize
2324
import androidx.compose.foundation.layout.fillMaxWidth
2425
import androidx.compose.foundation.layout.height
25-
import androidx.compose.foundation.layout.navigationBarsPadding
26+
import androidx.compose.foundation.layout.navigationBars
27+
import androidx.compose.foundation.layout.only
2628
import androidx.compose.foundation.layout.padding
2729
import androidx.compose.foundation.layout.size
2830
import androidx.compose.foundation.layout.statusBars
2931
import androidx.compose.foundation.layout.width
32+
import androidx.compose.foundation.layout.windowInsetsPadding
3033
import androidx.compose.foundation.lazy.LazyColumn
3134
import androidx.compose.foundation.lazy.items
3235
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -123,7 +126,7 @@ internal fun SharedTransitionScope.KotlinWeeklyIssueScreen(
123126
Column(
124127
modifier = modifier
125128
.fillMaxSize()
126-
.navigationBarsPadding()
129+
.windowInsetsPadding(WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal))
127130
.background(KSTheme.colorScheme.background),
128131
) {
129132
TopNavBar(
@@ -203,6 +206,7 @@ private fun ContentUi(
203206
) {
204207
LazyColumn(
205208
modifier = modifier,
209+
contentPadding = WindowInsets.navigationBars.asPaddingValues(),
206210
) {
207211
groupedItems.forEach { (group, items) ->
208212
stickyHeader {

android/feature/saved-for-later/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/savedforlater/SavedForLaterScreen.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ import androidx.compose.foundation.layout.Column
1616
import androidx.compose.foundation.layout.PaddingValues
1717
import androidx.compose.foundation.layout.Spacer
1818
import androidx.compose.foundation.layout.WindowInsets
19+
import androidx.compose.foundation.layout.WindowInsetsSides
1920
import androidx.compose.foundation.layout.asPaddingValues
2021
import androidx.compose.foundation.layout.fillMaxSize
2122
import androidx.compose.foundation.layout.height
22-
import androidx.compose.foundation.layout.navigationBarsPadding
23+
import androidx.compose.foundation.layout.navigationBars
24+
import androidx.compose.foundation.layout.only
2325
import androidx.compose.foundation.layout.padding
2426
import androidx.compose.foundation.layout.size
2527
import androidx.compose.foundation.layout.statusBars
28+
import androidx.compose.foundation.layout.windowInsetsPadding
2629
import androidx.compose.foundation.lazy.LazyColumn
2730
import androidx.compose.foundation.lazy.LazyListState
2831
import androidx.compose.foundation.lazy.items
@@ -84,7 +87,7 @@ internal fun SharedTransitionScope.SavedForLaterScreen(
8487
Column(
8588
modifier = modifier
8689
.fillMaxSize()
87-
.navigationBarsPadding()
90+
.windowInsetsPadding(WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal))
8891
.background(KSTheme.colorScheme.background),
8992
) {
9093
TopNavBar(
@@ -140,7 +143,7 @@ private fun SharedTransitionScope.ContentUi(
140143
LazyColumn(
141144
modifier = modifier.fillMaxSize(),
142145
state = listState,
143-
contentPadding = ListContentPadding,
146+
contentPadding = calculateListContentPadding(),
144147
verticalArrangement = Arrangement.spacedBy(20.dp),
145148
) {
146149
items(
@@ -223,7 +226,7 @@ private fun EmptyUi(
223226
Column(
224227
modifier = modifier
225228
.fillMaxSize()
226-
.padding(ListContentPadding),
229+
.padding(calculateListContentPadding()),
227230
horizontalAlignment = Alignment.CenterHorizontally,
228231
verticalArrangement = Arrangement.Center,
229232
) {
@@ -242,9 +245,12 @@ private fun EmptyUi(
242245
}
243246
}
244247

245-
private val ListContentPadding = PaddingValues(
246-
top = 24.dp,
247-
start = 24.dp,
248-
end = 24.dp,
249-
bottom = 120.dp,
250-
)
248+
@Composable
249+
private fun calculateListContentPadding(): PaddingValues {
250+
return PaddingValues(
251+
top = 24.dp,
252+
start = 24.dp,
253+
end = 24.dp,
254+
bottom = 120.dp + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding(),
255+
)
256+
}

0 commit comments

Comments
 (0)