Fix edge-to-edge layout issues (#367)

* Remove redundant setDecorFitsSystemWindows call

* Fix edge-to-edge layout issues
This commit is contained in:
Héctor de Isidro
2025-09-02 14:25:45 +02:00
committed by GitHub
parent e380408b28
commit bbf5918896
6 changed files with 32 additions and 39 deletions
@@ -1,7 +1,6 @@
package com.bitchat.android package com.bitchat.android
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
@@ -9,14 +8,14 @@ import androidx.activity.OnBackPressedCallback
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels 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.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Scaffold
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.repeatOnLifecycle 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.ChatScreen
import com.bitchat.android.ui.ChatViewModel import com.bitchat.android.ui.ChatViewModel
import com.bitchat.android.ui.theme.BitchatTheme 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 com.bitchat.android.nostr.PoWPreferenceManager
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -71,10 +68,7 @@ class MainActivity : ComponentActivity() {
// Enable edge-to-edge display for modern Android look // Enable edge-to-edge display for modern Android look
enableEdgeToEdge() enableEdgeToEdge()
// Make status bar transparent and content can extend behind it
WindowCompat.setDecorFitsSystemWindows(window, false)
// Initialize permission management // Initialize permission management
permissionManager = PermissionManager(this) permissionManager = PermissionManager(this)
// Initialize core mesh service first // Initialize core mesh service first
@@ -106,11 +100,14 @@ class MainActivity : ComponentActivity() {
setContent { setContent {
BitchatTheme { BitchatTheme {
Surface( Scaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background containerColor = MaterialTheme.colorScheme.background
) { ) { innerPadding ->
OnboardingFlowScreen() OnboardingFlowScreen(modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
)
} }
} }
} }
@@ -132,7 +129,7 @@ class MainActivity : ComponentActivity() {
} }
@Composable @Composable
private fun OnboardingFlowScreen() { private fun OnboardingFlowScreen(modifier: Modifier = Modifier) {
val context = LocalContext.current val context = LocalContext.current
val onboardingState by mainViewModel.onboardingState.collectAsState() val onboardingState by mainViewModel.onboardingState.collectAsState()
val bluetoothStatus by mainViewModel.bluetoothStatus.collectAsState() val bluetoothStatus by mainViewModel.bluetoothStatus.collectAsState()
@@ -167,11 +164,12 @@ class MainActivity : ComponentActivity() {
when (onboardingState) { when (onboardingState) {
OnboardingState.CHECKING -> { OnboardingState.CHECKING -> {
InitializingScreen() InitializingScreen(modifier)
} }
OnboardingState.BLUETOOTH_CHECK -> { OnboardingState.BLUETOOTH_CHECK -> {
BluetoothCheckScreen( BluetoothCheckScreen(
modifier = modifier,
status = bluetoothStatus, status = bluetoothStatus,
onEnableBluetooth = { onEnableBluetooth = {
mainViewModel.updateBluetoothLoading(true) mainViewModel.updateBluetoothLoading(true)
@@ -186,6 +184,7 @@ class MainActivity : ComponentActivity() {
OnboardingState.LOCATION_CHECK -> { OnboardingState.LOCATION_CHECK -> {
LocationCheckScreen( LocationCheckScreen(
modifier = modifier,
status = locationStatus, status = locationStatus,
onEnableLocation = { onEnableLocation = {
mainViewModel.updateLocationLoading(true) mainViewModel.updateLocationLoading(true)
@@ -200,6 +199,7 @@ class MainActivity : ComponentActivity() {
OnboardingState.BATTERY_OPTIMIZATION_CHECK -> { OnboardingState.BATTERY_OPTIMIZATION_CHECK -> {
BatteryOptimizationScreen( BatteryOptimizationScreen(
modifier = modifier,
status = batteryOptimizationStatus, status = batteryOptimizationStatus,
onDisableBatteryOptimization = { onDisableBatteryOptimization = {
mainViewModel.updateBatteryOptimizationLoading(true) mainViewModel.updateBatteryOptimizationLoading(true)
@@ -218,6 +218,7 @@ class MainActivity : ComponentActivity() {
OnboardingState.PERMISSION_EXPLANATION -> { OnboardingState.PERMISSION_EXPLANATION -> {
PermissionExplanationScreen( PermissionExplanationScreen(
modifier = modifier,
permissionCategories = permissionManager.getCategorizedPermissions(), permissionCategories = permissionManager.getCategorizedPermissions(),
onContinue = { onContinue = {
mainViewModel.updateOnboardingState(OnboardingState.PERMISSION_REQUESTING) mainViewModel.updateOnboardingState(OnboardingState.PERMISSION_REQUESTING)
@@ -227,11 +228,11 @@ class MainActivity : ComponentActivity() {
} }
OnboardingState.PERMISSION_REQUESTING -> { OnboardingState.PERMISSION_REQUESTING -> {
InitializingScreen() InitializingScreen(modifier)
} }
OnboardingState.INITIALIZING -> { OnboardingState.INITIALIZING -> {
InitializingScreen() InitializingScreen(modifier)
} }
OnboardingState.COMPLETE -> { OnboardingState.COMPLETE -> {
@@ -257,6 +258,7 @@ class MainActivity : ComponentActivity() {
OnboardingState.ERROR -> { OnboardingState.ERROR -> {
InitializationErrorScreen( InitializationErrorScreen(
modifier = modifier,
errorMessage = errorMessage, errorMessage = errorMessage,
onRetry = { onRetry = {
mainViewModel.updateOnboardingState(OnboardingState.CHECKING) mainViewModel.updateOnboardingState(OnboardingState.CHECKING)
@@ -12,7 +12,6 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight 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 * Screen shown when checking battery optimization status or requesting battery optimization disable
*/ */
@Composable @Composable
fun BatteryOptimizationScreen( fun BatteryOptimizationScreen(
modifier: Modifier,
status: BatteryOptimizationStatus, status: BatteryOptimizationStatus,
onDisableBatteryOptimization: () -> Unit, onDisableBatteryOptimization: () -> Unit,
onRetry: () -> Unit, onRetry: () -> Unit,
@@ -37,9 +35,7 @@ fun BatteryOptimizationScreen(
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
Box( Box(
modifier = Modifier modifier = modifier.padding(32.dp),
.fillMaxSize()
.padding(32.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
when (status) { when (status) {
@@ -3,7 +3,6 @@ package com.bitchat.android.onboarding
import androidx.compose.animation.core.* import androidx.compose.animation.core.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material.icons.outlined.* import androidx.compose.material.icons.outlined.*
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
@@ -21,6 +20,7 @@ import androidx.compose.ui.unit.dp
*/ */
@Composable @Composable
fun BluetoothCheckScreen( fun BluetoothCheckScreen(
modifier: Modifier,
status: BluetoothStatus, status: BluetoothStatus,
onEnableBluetooth: () -> Unit, onEnableBluetooth: () -> Unit,
onRetry: () -> Unit, onRetry: () -> Unit,
@@ -29,9 +29,7 @@ fun BluetoothCheckScreen(
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
Box( Box(
modifier = Modifier modifier = modifier.padding(32.dp),
.fillMaxSize()
.padding(32.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
when (status) { when (status) {
@@ -17,7 +17,7 @@ import androidx.compose.ui.unit.dp
* Loading screen shown during app initialization after permissions are granted * Loading screen shown during app initialization after permissions are granted
*/ */
@Composable @Composable
fun InitializingScreen() { fun InitializingScreen(modifier: Modifier) {
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
// Animated rotation for the loading indicator // Animated rotation for the loading indicator
@@ -50,9 +50,7 @@ fun InitializingScreen() {
} }
Box( Box(
modifier = Modifier modifier = modifier.padding(32.dp),
.fillMaxSize()
.padding(32.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Column( Column(
@@ -152,6 +150,7 @@ fun InitializingScreen() {
*/ */
@Composable @Composable
fun InitializationErrorScreen( fun InitializationErrorScreen(
modifier: Modifier,
errorMessage: String, errorMessage: String,
onRetry: () -> Unit, onRetry: () -> Unit,
onOpenSettings: () -> Unit onOpenSettings: () -> Unit
@@ -159,9 +158,7 @@ fun InitializationErrorScreen(
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
Box( Box(
modifier = Modifier modifier = modifier.padding(32.dp),
.fillMaxSize()
.padding(32.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Column( Column(
@@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp
*/ */
@Composable @Composable
fun LocationCheckScreen( fun LocationCheckScreen(
modifier: Modifier,
status: LocationStatus, status: LocationStatus,
onEnableLocation: () -> Unit, onEnableLocation: () -> Unit,
onRetry: () -> Unit, onRetry: () -> Unit,
@@ -29,9 +30,7 @@ fun LocationCheckScreen(
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
Box( Box(
modifier = Modifier modifier = modifier.padding(32.dp),
.fillMaxSize()
.padding(32.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
when (status) { when (status) {
@@ -20,6 +20,7 @@ import androidx.compose.ui.unit.sp
*/ */
@Composable @Composable
fun PermissionExplanationScreen( fun PermissionExplanationScreen(
modifier: Modifier,
permissionCategories: List<PermissionCategory>, permissionCategories: List<PermissionCategory>,
onContinue: () -> Unit onContinue: () -> Unit
) { ) {
@@ -27,7 +28,7 @@ fun PermissionExplanationScreen(
val scrollState = rememberScrollState() val scrollState = rememberScrollState()
Box( Box(
modifier = Modifier.fillMaxSize() modifier = modifier
) { ) {
// Scrollable content // Scrollable content
Column( Column(