From a07992530c964de430c2c3793b12f77a44f63ec8 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:33:43 -0600 Subject: [PATCH] feat: Improve edge-to-edge and display cutout handling (#4669) --- .../java/com/geeksville/mesh/MainActivity.kt | 29 +++++++++++++------ .../main/java/com/geeksville/mesh/ui/Main.kt | 4 +-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 3b5dffc1e..0fbe657ce 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -26,6 +26,7 @@ import android.nfc.NdefMessage import android.nfc.NfcAdapter import android.os.Build import android.os.Bundle +import android.view.WindowManager import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle import androidx.activity.compose.ReportDrawnWhen @@ -75,6 +76,19 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) + enableEdgeToEdge() + + // Explicitly set the cutout mode to ALWAYS for Android 15+ to satisfy Play Console recommendations. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + window.attributes.layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS + } + + // Ensure the navigation bar remains seamless on modern Android versions + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + } + setContent { val theme by model.theme.collectAsStateWithLifecycle() val dynamic = theme == MODE_DYNAMIC @@ -85,15 +99,12 @@ class MainActivity : ComponentActivity() { else -> isSystemInDarkTheme() } - // Apply modern edge-to-edge drawing with theme-aware system bars - enableEdgeToEdge( - statusBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) { dark }, - navigationBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) { dark }, - ) - - // Ensure the navigation bar remains seamless on modern Android versions - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - window.isNavigationBarContrastEnforced = false + // Update system bar style when theme changes + androidx.compose.runtime.SideEffect { + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) { dark }, + navigationBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) { dark }, + ) } @Suppress("SpreadOperator") diff --git a/app/src/main/java/com/geeksville/mesh/ui/Main.kt b/app/src/main/java/com/geeksville/mesh/ui/Main.kt index c4f9d3fb5..8a31155eb 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -31,8 +31,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.recalculateWindowInsets -import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -448,7 +446,7 @@ fun MainScreen(uIViewModel: UIViewModel = hiltViewModel(), scanModel: ScannerVie NavHost( navController = navController, startDestination = NodesRoutes.NodesGraph, - modifier = Modifier.fillMaxSize().recalculateWindowInsets().safeDrawingPadding(), + modifier = Modifier.fillMaxSize(), ) { contactsGraph(navController, uIViewModel.scrollToTopEventFlow) nodesGraph(navController, uIViewModel.scrollToTopEventFlow)