@@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.consumeWindowInsets
1212import androidx.compose.foundation.layout.Row
1313import androidx.compose.foundation.layout.WindowInsets
1414import androidx.compose.foundation.layout.fillMaxSize
15+ import androidx.compose.foundation.layout.ime
1516import androidx.compose.foundation.layout.padding
1617import androidx.compose.foundation.layout.systemBars
1718import androidx.compose.material3.Scaffold
@@ -101,6 +102,12 @@ fun AppShell(
101102 var isPlayerFullscreen by remember { mutableStateOf(false ) }
102103 var bottomNavigationHeight by remember { mutableStateOf(0 .dp) }
103104 val density = LocalDensity .current
105+ val imeVisible = WindowInsets .ime.getBottom(density) > 0
106+ val appNavigationVisible = shouldShowAppNavigation(
107+ showsNavigation = showsNavigation,
108+ isPlayerFullscreen = isPlayerFullscreen,
109+ imeVisible = imeVisible,
110+ )
104111 var playerTransitionProgress by remember { mutableFloatStateOf(0f ) }
105112 val playerHostState by playerHostController.state.collectAsStateWithLifecycle()
106113 val appChromeVisible = isAppChromeVisible(playerHostState.target, isPlayerFullscreen)
@@ -164,7 +171,7 @@ fun AppShell(
164171 }
165172 },
166173 bottomBar = {
167- if (showsNavigation && ! isPlayerFullscreen ) {
174+ if (appNavigationVisible ) {
168175 AppBottomBar (
169176 expanded = tabletLayout,
170177 selectedTabRouteQualifiedName = selectedTabRouteQualifiedName,
@@ -199,14 +206,15 @@ fun AppShell(
199206 }
200207 PlayerHost (
201208 controller = playerHostController,
202- reserveNavigationBarInset = ! tabletLayout || ! showsNavigation || isPlayerFullscreen,
209+ reserveNavigationBarInset = (! tabletLayout && ! imeVisible) ||
210+ ! showsNavigation || isPlayerFullscreen,
203211 modifier = Modifier .padding(
204- bottom = if (tabletLayout && showsNavigation && ! isPlayerFullscreen ) bottomNavigationHeight else 0 .dp,
212+ bottom = if (tabletLayout && appNavigationVisible ) bottomNavigationHeight else 0 .dp,
205213 ).consumeWindowInsets(PaddingValues (
206- bottom = if (tabletLayout && showsNavigation && ! isPlayerFullscreen ) bottomNavigationHeight else 0 .dp,
214+ bottom = if (tabletLayout && appNavigationVisible ) bottomNavigationHeight else 0 .dp,
207215 )),
208216 bottomBarHeightDp = if (
209- ! tabletLayout && showsNavigation && ! isPlayerFullscreen
217+ ! tabletLayout && appNavigationVisible
210218 ) {
211219 NAV_BAR_HEIGHT_DP
212220 } else {
@@ -241,6 +249,12 @@ internal fun isAppChromeVisible(
241249 isPlayerFullscreen : Boolean ,
242250): Boolean = playerTarget != PlayerHostTarget .Expanded && ! isPlayerFullscreen
243251
252+ internal fun shouldShowAppNavigation (
253+ showsNavigation : Boolean ,
254+ isPlayerFullscreen : Boolean ,
255+ imeVisible : Boolean ,
256+ ): Boolean = showsNavigation && ! isPlayerFullscreen && ! imeVisible
257+
244258internal fun playerPhoneChromeAlpha (
245259 hasVideo : Boolean ,
246260 playerTarget : PlayerHostTarget ,
0 commit comments