Skip to content

Commit

Permalink
Fix WindowInsets handling on iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisbanes committed Jul 12, 2023
1 parent 6562898 commit cb0370a
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
Expand Down Expand Up @@ -51,6 +54,7 @@ import app.tivi.common.compose.ui.plus
import app.tivi.common.ui.resources.MR
import app.tivi.data.compoundmodels.EntryWithShow
import app.tivi.data.models.Entry
import com.moriatsushi.insetsx.systemBars
import dev.icerock.moko.resources.compose.stringResource
import kotlin.math.roundToInt

Expand Down Expand Up @@ -114,6 +118,7 @@ fun <E : Entry> EntryGrid(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier,
) { paddingValues ->
val refreshing = lazyPagingItems.loadState.refresh == LoadStateLoading
Expand Down Expand Up @@ -202,6 +207,8 @@ private fun EntryGridAppBar(
)
}
},
windowInsets = WindowInsets.systemBars
.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top),
modifier = modifier,
scrollBehavior = scrollBehavior,
title = { Text(text = title) },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import androidx.compose.animation.Crossfade
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.only
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
Expand All @@ -23,6 +26,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import app.tivi.data.models.TraktUser
import com.moriatsushi.insetsx.systemBars

/**
* A wrapper around [TopAppBar] which allows some [bottomContent] below the bar, but within the same
Expand Down Expand Up @@ -56,16 +60,17 @@ fun TopAppBarWithBottomContent(
titleContentColor = LocalContentColor.current,
actionIconContentColor = LocalContentColor.current,
),
windowInsets = WindowInsets.systemBars
.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top),
)

bottomContent?.invoke(this)
}
}
}

@ExperimentalMaterial3Api
@Composable
fun TiviStandardAppBar(
fun TiviRootScreenAppBar(
title: String,
loggedIn: Boolean,
user: TraktUser?,
Expand All @@ -77,6 +82,8 @@ fun TiviStandardAppBar(
) {
TopAppBar(
modifier = modifier,
windowInsets = WindowInsets.systemBars
.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top),
scrollBehavior = scrollBehavior,
title = { Text(text = title) },
actions = {
Expand Down
2 changes: 1 addition & 1 deletion ios-app/Tivi/Tivi/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct ContentView: View {

var body: some View {
ComposeView(component: self.component)
.ignoresSafeArea(.all, edges: .bottom) // Compose has own keyboard handler
.ignoresSafeArea(.all, edges: .all)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
Expand Down Expand Up @@ -60,7 +61,7 @@ import app.tivi.common.compose.rememberTiviFlingBehavior
import app.tivi.common.compose.rememberTiviSnapFlingBehavior
import app.tivi.common.compose.ui.AutoSizedCircularProgressIndicator
import app.tivi.common.compose.ui.PosterCard
import app.tivi.common.compose.ui.TiviStandardAppBar
import app.tivi.common.compose.ui.TiviRootScreenAppBar
import app.tivi.common.ui.resources.MR
import app.tivi.data.compoundmodels.EntryWithShow
import app.tivi.data.models.Episode
Expand All @@ -70,6 +71,7 @@ import app.tivi.data.traktauth.TraktAuthState
import app.tivi.overlays.showInDialog
import app.tivi.screens.AccountScreen
import app.tivi.screens.DiscoverScreen
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.overlay.LocalOverlayHost
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Screen
Expand Down Expand Up @@ -164,7 +166,7 @@ internal fun Discover(

Scaffold(
topBar = {
TiviStandardAppBar(
TiviRootScreenAppBar(
title = stringResource(MR.strings.discover_title),
loggedIn = state.authState == TraktAuthState.LOGGED_IN,
user = state.user,
Expand All @@ -186,6 +188,7 @@ internal fun Discover(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier,
) { paddingValues ->
val refreshState = rememberPullRefreshState(refreshing = false, onRefresh = refresh)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
Expand Down Expand Up @@ -74,7 +75,7 @@ import app.tivi.common.compose.ui.EmptyContent
import app.tivi.common.compose.ui.PosterCard
import app.tivi.common.compose.ui.SearchTextField
import app.tivi.common.compose.ui.SortChip
import app.tivi.common.compose.ui.TiviStandardAppBar
import app.tivi.common.compose.ui.TiviRootScreenAppBar
import app.tivi.common.compose.ui.plus
import app.tivi.common.ui.resources.MR
import app.tivi.data.compoundmodels.LibraryShow
Expand All @@ -84,6 +85,7 @@ import app.tivi.data.traktauth.TraktAuthState
import app.tivi.overlays.showInDialog
import app.tivi.screens.AccountScreen
import app.tivi.screens.LibraryScreen
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.overlay.LocalOverlayHost
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Screen
Expand Down Expand Up @@ -174,7 +176,7 @@ internal fun Library(

Scaffold(
topBar = {
TiviStandardAppBar(
TiviRootScreenAppBar(
title = stringResource(MR.strings.library_title),
loggedIn = state.authState == TraktAuthState.LOGGED_IN,
user = state.user,
Expand All @@ -198,6 +200,7 @@ internal fun Library(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier.fillMaxSize(),
) { paddingValues ->
val refreshState = rememberPullRefreshState(
Expand Down
11 changes: 7 additions & 4 deletions ui/root/src/commonMain/kotlin/app/tivi/home/Home.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import androidx.compose.material3.NavigationDrawerItem
import androidx.compose.material3.NavigationRail
import androidx.compose.material3.NavigationRailItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.material3.windowsizeclass.WindowSizeClass
Expand All @@ -54,6 +53,7 @@ import app.tivi.screens.UpNextScreen
import com.moriatsushi.insetsx.navigationBars
import com.moriatsushi.insetsx.safeContentPadding
import com.moriatsushi.insetsx.statusBars
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.backstack.SaveableBackStack
import com.slack.circuit.foundation.NavigableCircuitContent
import com.slack.circuit.foundation.screen
Expand Down Expand Up @@ -95,8 +95,8 @@ internal fun Home(
)
}
},
contentWindowInsets = ScaffoldDefaults.contentWindowInsets
.exclude(WindowInsets.statusBars), // We let content handle the status bar
// We let content handle the status bar
contentWindowInsets = WindowInsets.systemBars.exclude(WindowInsets.statusBars),
modifier = modifier,
) { paddingValues ->
Row(
Expand Down Expand Up @@ -143,7 +143,10 @@ internal fun HomeNavigationBar(
onNavigationSelected: (Screen) -> Unit,
modifier: Modifier = Modifier,
) {
NavigationBar(modifier = modifier) {
NavigationBar(
modifier = modifier,
windowInsets = WindowInsets.navigationBars,
) {
for (item in HomeNavigationItems) {
NavigationBarItem(
icon = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
Expand Down Expand Up @@ -53,6 +54,7 @@ import app.tivi.common.ui.resources.MR
import app.tivi.data.models.TiviShow
import app.tivi.screens.SearchScreen
import com.moriatsushi.insetsx.statusBarsPadding
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Screen
import com.slack.circuit.runtime.ui.Ui
Expand Down Expand Up @@ -156,6 +158,7 @@ internal fun Search(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier,
) { padding ->
if (state.searchResults.isEmpty() && !state.refreshing) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.exclude
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
Expand Down Expand Up @@ -55,7 +57,6 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Snackbar
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
Expand Down Expand Up @@ -108,6 +109,7 @@ import app.tivi.data.models.TiviShow
import app.tivi.data.views.ShowsWatchStats
import app.tivi.screens.ShowDetailsScreen
import com.moriatsushi.insetsx.navigationBars
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Screen
import com.slack.circuit.runtime.ui.Ui
Expand Down Expand Up @@ -233,8 +235,7 @@ internal fun ShowDetails(
}
},
// The nav bar is handled by the root Scaffold
contentWindowInsets = ScaffoldDefaults.contentWindowInsets
.exclude(WindowInsets.navigationBars),
contentWindowInsets = WindowInsets.systemBars.exclude(WindowInsets.navigationBars),
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
) { contentPadding ->
Surface(modifier = Modifier.bodyWidth()) {
Expand Down Expand Up @@ -958,6 +959,8 @@ private fun ShowDetailsAppBar(
)
},
scrollBehavior = scrollBehavior,
windowInsets = WindowInsets.systemBars
.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top),
modifier = modifier,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ import app.tivi.data.compoundmodels.SeasonWithEpisodesAndWatches
import app.tivi.data.models.Episode
import app.tivi.data.models.Season
import app.tivi.screens.ShowSeasonsScreen
import com.moriatsushi.insetsx.statusBars
import com.moriatsushi.insetsx.systemBars
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Screen
import com.slack.circuit.runtime.ui.Ui
Expand Down Expand Up @@ -161,7 +161,6 @@ internal fun ShowSeasons(
}

Scaffold(
contentWindowInsets = WindowInsets.statusBars,
topBar = {
TopAppBarWithBottomContent(
title = { Text(text = state.show.title ?: "") },
Expand Down Expand Up @@ -204,6 +203,7 @@ internal fun ShowSeasons(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier
.testTag("show_seasons")
.fillMaxSize(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
Expand Down Expand Up @@ -68,7 +69,7 @@ import app.tivi.common.compose.rememberTiviFlingBehavior
import app.tivi.common.compose.ui.AsyncImage
import app.tivi.common.compose.ui.EmptyContent
import app.tivi.common.compose.ui.SortChip
import app.tivi.common.compose.ui.TiviStandardAppBar
import app.tivi.common.compose.ui.TiviRootScreenAppBar
import app.tivi.common.compose.ui.plus
import app.tivi.common.ui.resources.MR
import app.tivi.data.imagemodels.EpisodeImageModel
Expand All @@ -83,6 +84,7 @@ import app.tivi.overlays.showInDialog
import app.tivi.screens.AccountScreen
import app.tivi.screens.EpisodeTrackScreen
import app.tivi.screens.UpNextScreen
import com.moriatsushi.insetsx.systemBars
import com.seiko.imageloader.model.ImageResult
import com.slack.circuit.overlay.LocalOverlayHost
import com.slack.circuit.runtime.CircuitContext
Expand Down Expand Up @@ -179,7 +181,7 @@ internal fun UpNext(

Scaffold(
topBar = {
TiviStandardAppBar(
TiviRootScreenAppBar(
title = stringResource(MR.strings.upnext_title),
loggedIn = state.authState == TraktAuthState.LOGGED_IN,
user = state.user,
Expand All @@ -203,6 +205,7 @@ internal fun UpNext(
)
}
},
contentWindowInsets = WindowInsets.systemBars,
modifier = modifier.fillMaxSize(),
) { paddingValues ->
val refreshState = rememberPullRefreshState(
Expand Down

0 comments on commit cb0370a

Please sign in to comment.