Skip to content

Commit 14ae167

Browse files
authored
Merge pull request #242 from android/av/built-in-insets
Update material3 with built-in insets support
2 parents 4a1fb58 + 9be6e84 commit 14ae167

File tree

9 files changed

+158
-178
lines changed

9 files changed

+158
-178
lines changed

app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api
3131
import androidx.compose.material3.Icon
3232
import androidx.compose.material3.MaterialTheme
3333
import androidx.compose.material3.Scaffold
34-
import androidx.compose.material3.Surface
3534
import androidx.compose.material3.Text
3635
import androidx.compose.material3.windowsizeclass.WindowSizeClass
3736
import androidx.compose.runtime.Composable
@@ -45,13 +44,15 @@ import androidx.compose.ui.semantics.testTagsAsResourceId
4544
import androidx.navigation.NavDestination
4645
import androidx.navigation.NavDestination.Companion.hierarchy
4746
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaBackground
47+
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaGradientBackground
4848
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaNavigationBar
4949
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaNavigationBarItem
5050
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaNavigationRail
5151
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaNavigationRailItem
5252
import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.DrawableResourceIcon
5353
import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.ImageVectorIcon
5454
import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme
55+
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouDestination
5556
import com.google.samples.apps.nowinandroid.navigation.NiaNavHost
5657
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination
5758

@@ -66,13 +67,20 @@ fun NiaApp(
6667
appState: NiaAppState = rememberNiaAppState(windowSizeClass)
6768
) {
6869
NiaTheme {
69-
NiaBackground {
70+
val background: @Composable (@Composable () -> Unit) -> Unit =
71+
when (appState.currentDestination?.route) {
72+
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
73+
else -> { content -> NiaBackground(content = content) }
74+
}
75+
76+
background {
7077
Scaffold(
7178
modifier = Modifier.semantics {
7279
testTagsAsResourceId = true
7380
},
7481
containerColor = Color.Transparent,
7582
contentColor = MaterialTheme.colorScheme.onBackground,
83+
contentWindowInsets = WindowInsets(0, 0, 0, 0),
7684
bottomBar = {
7785
if (appState.shouldShowBottomBar) {
7886
NiaBottomBar(
@@ -158,42 +166,32 @@ private fun NiaBottomBar(
158166
onNavigateToDestination: (TopLevelDestination) -> Unit,
159167
currentDestination: NavDestination?
160168
) {
161-
// Wrap the navigation bar in a surface so the color behind the system
162-
// navigation is equal to the container color of the navigation bar.
163-
Surface(color = MaterialTheme.colorScheme.surface) {
164-
NiaNavigationBar(
165-
modifier = Modifier.windowInsetsPadding(
166-
WindowInsets.safeDrawing.only(
167-
WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
168-
)
169+
NiaNavigationBar {
170+
destinations.forEach { destination ->
171+
val selected =
172+
currentDestination?.hierarchy?.any { it.route == destination.route } == true
173+
NiaNavigationBarItem(
174+
selected = selected,
175+
onClick = { onNavigateToDestination(destination) },
176+
icon = {
177+
val icon = if (selected) {
178+
destination.selectedIcon
179+
} else {
180+
destination.unselectedIcon
181+
}
182+
when (icon) {
183+
is ImageVectorIcon -> Icon(
184+
imageVector = icon.imageVector,
185+
contentDescription = null
186+
)
187+
is DrawableResourceIcon -> Icon(
188+
painter = painterResource(id = icon.id),
189+
contentDescription = null
190+
)
191+
}
192+
},
193+
label = { Text(stringResource(destination.iconTextId)) }
169194
)
170-
) {
171-
destinations.forEach { destination ->
172-
val selected =
173-
currentDestination?.hierarchy?.any { it.route == destination.route } == true
174-
NiaNavigationBarItem(
175-
selected = selected,
176-
onClick = { onNavigateToDestination(destination) },
177-
icon = {
178-
val icon = if (selected) {
179-
destination.selectedIcon
180-
} else {
181-
destination.unselectedIcon
182-
}
183-
when (icon) {
184-
is ImageVectorIcon -> Icon(
185-
imageVector = icon.imageVector,
186-
contentDescription = null
187-
)
188-
is DrawableResourceIcon -> Icon(
189-
painter = painterResource(id = icon.id),
190-
contentDescription = null
191-
)
192-
}
193-
},
194-
label = { Text(stringResource(destination.iconTextId)) }
195-
)
196-
}
197195
}
198196
}
199197
}

core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616

1717
package com.google.samples.apps.nowinandroid.core.designsystem.component
1818

19+
import androidx.compose.foundation.shape.CircleShape
1920
import androidx.compose.material3.ExperimentalMaterial3Api
2021
import androidx.compose.material3.FilterChip
2122
import androidx.compose.material3.FilterChipDefaults
2223
import androidx.compose.material3.Icon
2324
import androidx.compose.material3.MaterialTheme
2425
import androidx.compose.material3.ProvideTextStyle
25-
import androidx.compose.material3.Shapes
2626
import androidx.compose.runtime.Composable
2727
import androidx.compose.ui.Modifier
2828
import androidx.compose.ui.graphics.Color
@@ -58,13 +58,13 @@ fun NiaFilterChip(
5858
},
5959
modifier = modifier,
6060
enabled = enabled,
61-
selectedIcon = {
61+
trailingIcon = {
6262
Icon(
6363
imageVector = NiaIcons.Check,
6464
contentDescription = null
6565
)
6666
},
67-
shape = Shapes.Full,
67+
shape = CircleShape,
6868
border = FilterChipDefaults.filterChipBorder(
6969
borderColor = MaterialTheme.colorScheme.onBackground,
7070
selectedBorderColor = MaterialTheme.colorScheme.onBackground,

core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ fun NiaNavigationBar(
8888
) {
8989
NavigationBar(
9090
modifier = modifier,
91-
containerColor = NiaNavigationDefaults.NavigationContainerColor,
9291
contentColor = NiaNavigationDefaults.navigationContentColor(),
9392
tonalElevation = 0.dp,
9493
content = content
@@ -155,7 +154,7 @@ fun NiaNavigationRail(
155154
) {
156155
NavigationRail(
157156
modifier = modifier,
158-
containerColor = NiaNavigationDefaults.NavigationContainerColor,
157+
containerColor = Color.Transparent,
159158
contentColor = NiaNavigationDefaults.navigationContentColor(),
160159
header = header,
161160
content = content
@@ -166,7 +165,6 @@ fun NiaNavigationRail(
166165
* Now in Android navigation default values.
167166
*/
168167
object NiaNavigationDefaults {
169-
val NavigationContainerColor = Color.Transparent
170168
@Composable
171169
fun navigationContentColor() = MaterialTheme.colorScheme.onSurfaceVariant
172170
@Composable

core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import androidx.compose.material.icons.Icons
2121
import androidx.compose.material.icons.filled.MoreVert
2222
import androidx.compose.material.icons.filled.Search
2323
import androidx.compose.material3.CenterAlignedTopAppBar
24+
import androidx.compose.material3.ExperimentalMaterial3Api
2425
import androidx.compose.material3.Icon
2526
import androidx.compose.material3.IconButton
2627
import androidx.compose.material3.MaterialTheme
@@ -33,6 +34,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
3334
import androidx.compose.ui.res.stringResource
3435
import androidx.compose.ui.tooling.preview.Preview
3536

37+
@OptIn(ExperimentalMaterial3Api::class)
3638
@Composable
3739
fun NiaTopAppBar(
3840
@StringRes titleRes: Int,
@@ -73,6 +75,7 @@ fun NiaTopAppBar(
7375
/**
7476
* Top app bar with action, displayed on the right
7577
*/
78+
@OptIn(ExperimentalMaterial3Api::class)
7679
@Composable
7780
fun NiaTopAppBar(
7881
@StringRes titleRes: Int,
@@ -98,6 +101,7 @@ fun NiaTopAppBar(
98101
)
99102
}
100103

104+
@OptIn(ExperimentalMaterial3Api::class)
101105
@Preview("Top App Bar")
102106
@Composable
103107
fun NiaTopAppBarPreview() {

feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,11 @@ import androidx.compose.foundation.layout.ExperimentalLayoutApi
2121
import androidx.compose.foundation.layout.PaddingValues
2222
import androidx.compose.foundation.layout.Spacer
2323
import androidx.compose.foundation.layout.WindowInsets
24-
import androidx.compose.foundation.layout.WindowInsetsSides
2524
import androidx.compose.foundation.layout.consumedWindowInsets
2625
import androidx.compose.foundation.layout.fillMaxSize
27-
import androidx.compose.foundation.layout.only
2826
import androidx.compose.foundation.layout.padding
2927
import androidx.compose.foundation.layout.safeDrawing
3028
import androidx.compose.foundation.layout.windowInsetsBottomHeight
31-
import androidx.compose.foundation.layout.windowInsetsPadding
3229
import androidx.compose.foundation.lazy.grid.GridCells.Adaptive
3330
import androidx.compose.foundation.lazy.grid.GridItemSpan
3431
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
@@ -45,7 +42,6 @@ import androidx.compose.ui.unit.dp
4542
import androidx.hilt.navigation.compose.hiltViewModel
4643
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
4744
import androidx.lifecycle.compose.collectAsStateWithLifecycle
48-
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaGradientBackground
4945
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopAppBar
5046
import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons
5147
import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState
@@ -72,46 +68,42 @@ fun BookmarksScreen(
7268
removeFromBookmarks: (String) -> Unit,
7369
modifier: Modifier = Modifier
7470
) {
75-
NiaGradientBackground {
76-
Scaffold(
77-
topBar = {
78-
NiaTopAppBar(
79-
titleRes = R.string.top_app_bar_title_saved,
80-
actionIcon = NiaIcons.AccountCircle,
81-
actionIconContentDescription = stringResource(
82-
id = R.string.top_app_bar_action_menu
83-
),
84-
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
85-
containerColor = Color.Transparent
86-
),
87-
modifier = Modifier.windowInsetsPadding(
88-
WindowInsets.safeDrawing.only(WindowInsetsSides.Top)
89-
)
90-
)
91-
},
92-
containerColor = Color.Transparent
93-
) { innerPadding ->
94-
LazyVerticalGrid(
95-
columns = Adaptive(300.dp),
96-
contentPadding = PaddingValues(16.dp),
97-
horizontalArrangement = Arrangement.spacedBy(32.dp),
98-
verticalArrangement = Arrangement.spacedBy(24.dp),
99-
modifier = modifier
100-
.fillMaxSize()
101-
.testTag("bookmarks:feed")
102-
.padding(innerPadding)
103-
.consumedWindowInsets(innerPadding)
104-
) {
105-
newsFeed(
106-
feedState = feedState,
107-
onNewsResourcesCheckedChanged = { id, _ -> removeFromBookmarks(id) },
108-
showLoadingUIIfLoading = true,
109-
loadingContentDescription = R.string.saved_loading
71+
Scaffold(
72+
topBar = {
73+
NiaTopAppBar(
74+
titleRes = R.string.top_app_bar_title_saved,
75+
actionIcon = NiaIcons.AccountCircle,
76+
actionIconContentDescription = stringResource(
77+
id = R.string.top_app_bar_action_menu
78+
),
79+
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
80+
containerColor = Color.Transparent
11081
)
82+
)
83+
},
84+
containerColor = Color.Transparent,
85+
contentWindowInsets = WindowInsets(0, 0, 0, 0)
86+
) { innerPadding ->
87+
LazyVerticalGrid(
88+
columns = Adaptive(300.dp),
89+
contentPadding = PaddingValues(16.dp),
90+
horizontalArrangement = Arrangement.spacedBy(32.dp),
91+
verticalArrangement = Arrangement.spacedBy(24.dp),
92+
modifier = modifier
93+
.fillMaxSize()
94+
.testTag("bookmarks:feed")
95+
.padding(innerPadding)
96+
.consumedWindowInsets(innerPadding)
97+
) {
98+
newsFeed(
99+
feedState = feedState,
100+
onNewsResourcesCheckedChanged = { id, _ -> removeFromBookmarks(id) },
101+
showLoadingUIIfLoading = true,
102+
loadingContentDescription = R.string.saved_loading
103+
)
111104

112-
item(span = { GridItemSpan(maxLineSpan) }) {
113-
Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.safeDrawing))
114-
}
105+
item(span = { GridItemSpan(maxLineSpan) }) {
106+
Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.safeDrawing))
115107
}
116108
}
117109
}

0 commit comments

Comments
 (0)