Skip to content

Commit 21ea2d7

Browse files
committed
Workaround for broken dialog insets on Pixel
1 parent 3628d14 commit 21ea2d7

File tree

4 files changed

+66
-35
lines changed
  • app/src/main/kotlin/cz/muni/fi/rpg/ui
  • common/src
    • androidMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/dialogs
    • commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/responsive
  • desktop/src/jvmMain/kotlin/cz/frantisekmasa/wfrp_master/desktop

4 files changed

+66
-35
lines changed

app/src/main/kotlin/cz/muni/fi/rpg/ui/WfrpMasterApp.kt

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,34 +35,35 @@ import org.kodein.di.instance
3535
fun WfrpMasterApp() {
3636
ProvideDIContainer {
3737
val settings: SettingsStorage by localDI().instance()
38-
val keepScreenOn = settings.watch(AppSettings.KEEP_SCREEN_ON).collectWithLifecycle(null).value ?: true
38+
val keepScreenOn =
39+
settings.watch(AppSettings.KEEP_SCREEN_ON).collectWithLifecycle(null).value ?: true
3940

4041
if (keepScreenOn) {
4142
KeepScreenOn()
4243
}
4344

4445
Theme {
4546
Startup {
46-
ScreenWithBreakpoints {
47-
Column {
48-
NetworkStatusBanner()
49-
val intent = LocalActivity.current.intent
50-
val drawerState = rememberDrawerState(DrawerValue.Closed)
51-
val coroutineScope = rememberCoroutineScope()
47+
Column {
48+
NetworkStatusBanner()
49+
val intent = LocalActivity.current.intent
50+
val drawerState = rememberDrawerState(DrawerValue.Closed)
51+
val coroutineScope = rememberCoroutineScope()
5252

53-
Navigator(
54-
screens = rememberInitialScreens(intent?.data),
55-
onBackPressed = {
56-
if (drawerState.isOpen) {
57-
coroutineScope.launch { drawerState.close() }
58-
return@Navigator false
59-
}
53+
Navigator(
54+
screens = rememberInitialScreens(intent?.data),
55+
onBackPressed = {
56+
if (drawerState.isOpen) {
57+
coroutineScope.launch { drawerState.close() }
58+
return@Navigator false
59+
}
6060

61-
true
62-
},
63-
) { navigator ->
64-
SnackbarScaffold {
65-
DrawerShell(drawerState) {
61+
true
62+
},
63+
) { navigator ->
64+
SnackbarScaffold {
65+
DrawerShell(drawerState) {
66+
ScreenWithBreakpoints {
6667
SlideTransition(navigator) {
6768
ProvideNavigationTransaction(it) {
6869
it.Content()
Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package cz.frantisekmasa.wfrp_master.common.core.ui.dialogs
22

3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.height
5+
import androidx.compose.foundation.layout.width
36
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.SideEffect
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.platform.LocalView
410
import androidx.compose.ui.window.Dialog
511
import androidx.compose.ui.window.DialogProperties
12+
import androidx.compose.ui.window.DialogWindowProvider
13+
import cz.frantisekmasa.wfrp_master.common.core.ui.responsive.LocalScreenHeight
14+
import cz.frantisekmasa.wfrp_master.common.core.ui.responsive.LocalScreenWidth
615

716
@Composable
817
actual fun FullScreenDialog(
@@ -12,6 +21,25 @@ actual fun FullScreenDialog(
1221
Dialog(
1322
onDismissRequest = onDismissRequest,
1423
properties = DialogProperties(usePlatformDefaultWidth = false),
15-
content = content,
16-
)
24+
) {
25+
DisableScrim()
26+
27+
// On Pixel, the insets in dialog do not work properly, so we are just limiting the dialog
28+
// size to the screen size
29+
// See https://github.com/fmasa/wfrp-master/issues/429
30+
Box(
31+
Modifier.width(LocalScreenWidth.current)
32+
.height(LocalScreenHeight.current),
33+
) {
34+
content()
35+
}
36+
}
37+
}
38+
39+
@Composable
40+
fun DisableScrim() {
41+
val dialogWindow = (LocalView.current.parent as? DialogWindowProvider)?.window
42+
SideEffect {
43+
dialogWindow?.setDimAmount(0f)
44+
}
1745
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/responsive/Grid.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp
2222
import io.github.aakira.napier.Napier
2323

2424
val LocalScreenWidth = compositionLocalOf<Dp> { error("Wrap your screen by ScreenWithBreakpoints") }
25+
val LocalScreenHeight = compositionLocalOf<Dp> { error("Wrap your screen by ScreenWithBreakpoints") }
2526
val LocalBreakpoint = staticCompositionLocalOf<Breakpoint> { error("Wrap your screen by ScreenWithBreakpoints") }
2627
private const val GRID_COLUMNS = 12
2728

@@ -35,6 +36,7 @@ fun ScreenWithBreakpoints(content: @Composable () -> Unit) {
3536
CompositionLocalProvider(
3637
LocalBreakpoint provides breakpoint,
3738
LocalScreenWidth provides maxWidth,
39+
LocalScreenHeight provides maxHeight,
3840
content = content,
3941
)
4042
}

desktop/src/jvmMain/kotlin/cz/frantisekmasa/wfrp_master/desktop/ApplicationWindow.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,22 @@ fun ApplicationWindow(
5252
Theme {
5353
SnackbarScaffold {
5454
Startup {
55-
ScreenWithBreakpoints {
56-
val drawerState = rememberDrawerState(DrawerValue.Closed)
57-
val coroutineScope = rememberCoroutineScope()
55+
val drawerState = rememberDrawerState(DrawerValue.Closed)
56+
val coroutineScope = rememberCoroutineScope()
5857

59-
Navigator(
60-
screens = listOf(initialScreen),
61-
onBackPressed = {
62-
if (drawerState.isOpen) {
63-
coroutineScope.launch { drawerState.close() }
64-
return@Navigator false
65-
}
58+
Navigator(
59+
screens = listOf(initialScreen),
60+
onBackPressed = {
61+
if (drawerState.isOpen) {
62+
coroutineScope.launch { drawerState.close() }
63+
return@Navigator false
64+
}
6665

67-
true
68-
},
69-
) { navigator ->
70-
DrawerShell(drawerState) {
66+
true
67+
},
68+
) { navigator ->
69+
DrawerShell(drawerState) {
70+
ScreenWithBreakpoints {
7171
val screen = navigator.lastItem
7272

7373
navigator.saveableState("currentScreen") {

0 commit comments

Comments
 (0)