From bbf5918896131aefdf89d52fb9e86ff880cbd0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20de=20Isidro?= <5445152+hector6872@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:25:45 +0200 Subject: [PATCH] Fix edge-to-edge layout issues (#367) * Remove redundant setDecorFitsSystemWindows call * Fix edge-to-edge layout issues --- .../java/com/bitchat/android/MainActivity.kt | 38 ++++++++++--------- .../onboarding/BatteryOptimizationScreen.kt | 8 +--- .../onboarding/BluetoothCheckScreen.kt | 6 +-- .../android/onboarding/InitializingScreen.kt | 11 ++---- .../android/onboarding/LocationCheckScreen.kt | 5 +-- .../onboarding/PermissionExplanationScreen.kt | 3 +- 6 files changed, 32 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/MainActivity.kt b/app/src/main/java/com/bitchat/android/MainActivity.kt index cdcf871a..9ae550b1 100644 --- a/app/src/main/java/com/bitchat/android/MainActivity.kt +++ b/app/src/main/java/com/bitchat/android/MainActivity.kt @@ -1,7 +1,6 @@ package com.bitchat.android import android.content.Intent -import android.os.Build import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity @@ -9,14 +8,14 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels -import androidx.core.view.WindowCompat -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface +import androidx.compose.material3.Scaffold import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.repeatOnLifecycle @@ -40,8 +39,6 @@ import com.bitchat.android.onboarding.PermissionManager import com.bitchat.android.ui.ChatScreen import com.bitchat.android.ui.ChatViewModel import com.bitchat.android.ui.theme.BitchatTheme -import com.bitchat.android.ui.theme.ThemePreference -import com.bitchat.android.ui.theme.ThemePreferenceManager import com.bitchat.android.nostr.PoWPreferenceManager import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -71,10 +68,7 @@ class MainActivity : ComponentActivity() { // Enable edge-to-edge display for modern Android look enableEdgeToEdge() - - // Make status bar transparent and content can extend behind it - WindowCompat.setDecorFitsSystemWindows(window, false) - + // Initialize permission management permissionManager = PermissionManager(this) // Initialize core mesh service first @@ -106,11 +100,14 @@ class MainActivity : ComponentActivity() { setContent { BitchatTheme { - Surface( + Scaffold( modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { - OnboardingFlowScreen() + containerColor = MaterialTheme.colorScheme.background + ) { innerPadding -> + OnboardingFlowScreen(modifier = Modifier + .fillMaxSize() + .padding(innerPadding) + ) } } } @@ -132,7 +129,7 @@ class MainActivity : ComponentActivity() { } @Composable - private fun OnboardingFlowScreen() { + private fun OnboardingFlowScreen(modifier: Modifier = Modifier) { val context = LocalContext.current val onboardingState by mainViewModel.onboardingState.collectAsState() val bluetoothStatus by mainViewModel.bluetoothStatus.collectAsState() @@ -167,11 +164,12 @@ class MainActivity : ComponentActivity() { when (onboardingState) { OnboardingState.CHECKING -> { - InitializingScreen() + InitializingScreen(modifier) } OnboardingState.BLUETOOTH_CHECK -> { BluetoothCheckScreen( + modifier = modifier, status = bluetoothStatus, onEnableBluetooth = { mainViewModel.updateBluetoothLoading(true) @@ -186,6 +184,7 @@ class MainActivity : ComponentActivity() { OnboardingState.LOCATION_CHECK -> { LocationCheckScreen( + modifier = modifier, status = locationStatus, onEnableLocation = { mainViewModel.updateLocationLoading(true) @@ -200,6 +199,7 @@ class MainActivity : ComponentActivity() { OnboardingState.BATTERY_OPTIMIZATION_CHECK -> { BatteryOptimizationScreen( + modifier = modifier, status = batteryOptimizationStatus, onDisableBatteryOptimization = { mainViewModel.updateBatteryOptimizationLoading(true) @@ -218,6 +218,7 @@ class MainActivity : ComponentActivity() { OnboardingState.PERMISSION_EXPLANATION -> { PermissionExplanationScreen( + modifier = modifier, permissionCategories = permissionManager.getCategorizedPermissions(), onContinue = { mainViewModel.updateOnboardingState(OnboardingState.PERMISSION_REQUESTING) @@ -227,11 +228,11 @@ class MainActivity : ComponentActivity() { } OnboardingState.PERMISSION_REQUESTING -> { - InitializingScreen() + InitializingScreen(modifier) } OnboardingState.INITIALIZING -> { - InitializingScreen() + InitializingScreen(modifier) } OnboardingState.COMPLETE -> { @@ -257,6 +258,7 @@ class MainActivity : ComponentActivity() { OnboardingState.ERROR -> { InitializationErrorScreen( + modifier = modifier, errorMessage = errorMessage, onRetry = { mainViewModel.updateOnboardingState(OnboardingState.CHECKING) diff --git a/app/src/main/java/com/bitchat/android/onboarding/BatteryOptimizationScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/BatteryOptimizationScreen.kt index a5491f46..a026d47e 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/BatteryOptimizationScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/BatteryOptimizationScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight @@ -24,10 +23,9 @@ import com.bitchat.android.R * Screen shown when checking battery optimization status or requesting battery optimization disable */ - - @Composable fun BatteryOptimizationScreen( + modifier: Modifier, status: BatteryOptimizationStatus, onDisableBatteryOptimization: () -> Unit, onRetry: () -> Unit, @@ -37,9 +35,7 @@ fun BatteryOptimizationScreen( val colorScheme = MaterialTheme.colorScheme Box( - modifier = Modifier - .fillMaxSize() - .padding(32.dp), + modifier = modifier.padding(32.dp), contentAlignment = Alignment.Center ) { when (status) { diff --git a/app/src/main/java/com/bitchat/android/onboarding/BluetoothCheckScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/BluetoothCheckScreen.kt index 390df992..25dfd0d5 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/BluetoothCheckScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/BluetoothCheckScreen.kt @@ -3,7 +3,6 @@ package com.bitchat.android.onboarding import androidx.compose.animation.core.* import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* import androidx.compose.material.icons.outlined.* import androidx.compose.material3.* import androidx.compose.runtime.* @@ -21,6 +20,7 @@ import androidx.compose.ui.unit.dp */ @Composable fun BluetoothCheckScreen( + modifier: Modifier, status: BluetoothStatus, onEnableBluetooth: () -> Unit, onRetry: () -> Unit, @@ -29,9 +29,7 @@ fun BluetoothCheckScreen( val colorScheme = MaterialTheme.colorScheme Box( - modifier = Modifier - .fillMaxSize() - .padding(32.dp), + modifier = modifier.padding(32.dp), contentAlignment = Alignment.Center ) { when (status) { diff --git a/app/src/main/java/com/bitchat/android/onboarding/InitializingScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/InitializingScreen.kt index f6bc2174..24a0a953 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/InitializingScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/InitializingScreen.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.unit.dp * Loading screen shown during app initialization after permissions are granted */ @Composable -fun InitializingScreen() { +fun InitializingScreen(modifier: Modifier) { val colorScheme = MaterialTheme.colorScheme // Animated rotation for the loading indicator @@ -50,9 +50,7 @@ fun InitializingScreen() { } Box( - modifier = Modifier - .fillMaxSize() - .padding(32.dp), + modifier = modifier.padding(32.dp), contentAlignment = Alignment.Center ) { Column( @@ -152,6 +150,7 @@ fun InitializingScreen() { */ @Composable fun InitializationErrorScreen( + modifier: Modifier, errorMessage: String, onRetry: () -> Unit, onOpenSettings: () -> Unit @@ -159,9 +158,7 @@ fun InitializationErrorScreen( val colorScheme = MaterialTheme.colorScheme Box( - modifier = Modifier - .fillMaxSize() - .padding(32.dp), + modifier = modifier.padding(32.dp), contentAlignment = Alignment.Center ) { Column( diff --git a/app/src/main/java/com/bitchat/android/onboarding/LocationCheckScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/LocationCheckScreen.kt index 5a8f06fd..5a544e00 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/LocationCheckScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/LocationCheckScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp */ @Composable fun LocationCheckScreen( + modifier: Modifier, status: LocationStatus, onEnableLocation: () -> Unit, onRetry: () -> Unit, @@ -29,9 +30,7 @@ fun LocationCheckScreen( val colorScheme = MaterialTheme.colorScheme Box( - modifier = Modifier - .fillMaxSize() - .padding(32.dp), + modifier = modifier.padding(32.dp), contentAlignment = Alignment.Center ) { when (status) { diff --git a/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt index 2db177d8..a925567e 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.unit.sp */ @Composable fun PermissionExplanationScreen( + modifier: Modifier, permissionCategories: List, onContinue: () -> Unit ) { @@ -27,7 +28,7 @@ fun PermissionExplanationScreen( val scrollState = rememberScrollState() Box( - modifier = Modifier.fillMaxSize() + modifier = modifier ) { // Scrollable content Column(