diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/activities/TreeTrackerActivity.kt b/app/src/main/java/org/greenstand/android/TreeTracker/activities/TreeTrackerActivity.kt index f10bbfe5..51533b2a 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/activities/TreeTrackerActivity.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/activities/TreeTrackerActivity.kt @@ -17,7 +17,9 @@ package org.greenstand.android.TreeTracker.activities import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.ExperimentalComposeApi import org.greenstand.android.TreeTracker.models.LanguageSwitcher import org.greenstand.android.TreeTracker.models.TreeTrackerViewModelFactory @@ -37,6 +39,15 @@ class TreeTrackerActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.dark( + scrim = android.graphics.Color.argb(128, 0, 0, 0) // 50% black scrim + ), + navigationBarStyle = SystemBarStyle.dark( + scrim = android.graphics.Color.argb(128, 0, 0, 0) + ) + ) + languageSwitcher.applyCurrentLanguage(this) setContent { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/camera/ImageReviewScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/camera/ImageReviewScreen.kt index 75eed25a..5b34422b 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/camera/ImageReviewScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/camera/ImageReviewScreen.kt @@ -18,7 +18,12 @@ package org.greenstand.android.TreeTracker.camera import android.app.Activity import android.content.Intent import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -28,7 +33,8 @@ import androidx.compose.ui.unit.dp import org.greenstand.android.TreeTracker.activities.CaptureImageContract import org.greenstand.android.TreeTracker.models.NavRoute import org.greenstand.android.TreeTracker.root.LocalNavHostController -import org.greenstand.android.TreeTracker.view.* +import org.greenstand.android.TreeTracker.view.ApprovalButton +import org.greenstand.android.TreeTracker.view.LocalImage @Composable fun ImageReviewScreen(photoPath: String) { @@ -41,6 +47,7 @@ fun ImageReviewScreen(photoPath: String) { Row( modifier = Modifier .fillMaxWidth() + .navigationBarsPadding() .padding(bottom = 12.dp), horizontalArrangement = Arrangement.Center, ) { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/camera/SelfieScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/camera/SelfieScreen.kt index 8298adb3..5f76a8cf 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/camera/SelfieScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/camera/SelfieScreen.kt @@ -19,7 +19,9 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -49,6 +51,7 @@ fun SelfieScreen() { Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { TopBarTitle() }, @@ -56,6 +59,7 @@ fun SelfieScreen() { }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { InfoButton( modifier = Modifier.align(Alignment.Center), @@ -80,6 +84,7 @@ fun SelfieScreen() { Box( modifier = Modifier .fillMaxSize() + .padding(it) .padding(bottom = 10.dp), contentAlignment = Alignment.BottomCenter ) { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeCaptureScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeCaptureScreen.kt index 35303cf7..b94bb59b 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeCaptureScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeCaptureScreen.kt @@ -26,8 +26,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.CircularProgressIndicator @@ -95,7 +97,9 @@ fun TreeCaptureScreen( Scaffold( bottomBar = { ActionBar( - modifier = Modifier.background(color = AppColors.Gray), + modifier = Modifier + .navigationBarsPadding() + .background(color = AppColors.Gray), leftAction = { ArrowButton( isLeft = true, @@ -129,7 +133,7 @@ fun TreeCaptureScreen( } ) } - ) { + ) { padding -> if (state.isLocationAvailable == false) { CustomDialog( dialogIcon = painterResource(id = R.drawable.error_outline), @@ -162,6 +166,7 @@ fun TreeCaptureScreen( } ) ActionBar( + modifier = Modifier.background(Color.Black).statusBarsPadding(), leftAction = { UserImageButton( onClick = { @@ -204,15 +209,18 @@ fun TreeCaptureScreen( } @Composable -fun CaptureCustomLoading(isLoading: Boolean, progress: Float) { +fun CaptureCustomLoading( + modifier: Modifier = Modifier, + isLoading: Boolean, + progress: Float +) { if (isLoading) { Box( - modifier = Modifier + modifier = modifier .padding(bottom = 90.dp) .fillMaxSize(), contentAlignment = Alignment.BottomCenter ) { - Column( modifier = Modifier .align(Alignment.BottomCenter) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeImageReviewScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeImageReviewScreen.kt index 56d7453f..ea9fca85 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeImageReviewScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/capture/TreeImageReviewScreen.kt @@ -19,8 +19,10 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -57,8 +59,10 @@ fun TreeImageReviewScreen( val scope = rememberCoroutineScope() Scaffold( + modifier = Modifier, topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { TreeTrackerButton( modifier = Modifier @@ -77,6 +81,7 @@ fun TreeImageReviewScreen( Row( modifier = Modifier .fillMaxWidth() + .navigationBarsPadding() .padding(bottom = 12.dp), horizontalArrangement = Arrangement.Center, ) { @@ -117,7 +122,7 @@ fun TreeImageReviewScreen( ) } LocalImage( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().navigationBarsPadding(), imagePath = state.treeImagePath ?: "", contentDescription = null, contentScale = ContentScale.Fit diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardScreen.kt index 53ca28df..cba3c4f6 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardScreen.kt @@ -15,6 +15,7 @@ */ package org.greenstand.android.TreeTracker.dashboard +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -27,18 +28,27 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.progressSemantics import androidx.compose.material.ButtonColors +import androidx.compose.material.ProgressIndicatorDefaults import androidx.compose.material.Scaffold import androidx.compose.material.Snackbar import androidx.compose.material.SnackbarHost import androidx.compose.material.Text import androidx.compose.material.rememberScaffoldState -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ExperimentalComposeApi +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -154,11 +164,9 @@ fun Dashboard( } } } - ) { + ) { padding -> Column( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 20.dp), + modifier = Modifier.fillMaxSize().navigationBarsPadding(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { @@ -199,8 +207,7 @@ fun Dashboard( verticalArrangement = Arrangement.SpaceBetween, ) { DashboardUploadProgressBar( - progress = (state.treesRemainingToSync) - .toFloat() / (state.totalTreesToSync), + progress = state.uploadProgress, modifier = Modifier.weight(1f), ) Text( @@ -254,6 +261,7 @@ fun Dashboard( fun DashboardTopBar(state: DashboardState, onSettingsClicked: () -> Unit = { }, onOrgClicked: () -> Unit) { ActionBar( + modifier = Modifier.statusBarsPadding(), leftAction = { Box(modifier = Modifier .padding( 10.dp) @@ -304,10 +312,14 @@ fun DashboardUploadProgressBar( val stroke = with(LocalDensity.current) { Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Butt) } + val animatedProgress by animateFloatAsState( + targetValue = progress, + animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec + ) Canvas( modifier = modifier - .progressSemantics(progress) + .progressSemantics(animatedProgress) .fillMaxWidth() ) { val diameterOffset = stroke.width / 2 @@ -328,7 +340,7 @@ fun DashboardUploadProgressBar( ) drawProgress(AppColors.MediumGray, 180f) // Background progress. - drawProgress(AppColors.Orange, progress * 180f) // Foreground progress. + drawProgress(AppColors.Orange, animatedProgress * 180f) // Foreground progress. } } @@ -403,4 +415,4 @@ fun DashboardScreen_Preview( @PreviewParameter(DashboardPreviewParameter::class) viewModel: DashboardViewModel ) { DashboardScreen(viewModel = viewModel) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardViewModel.kt b/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardViewModel.kt index 2c76db2a..e9d95bfa 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/dashboard/DashboardViewModel.kt @@ -52,7 +52,9 @@ data class DashboardState( val isOrgButtonEnabled: Boolean = false, val showUnreadMessageNotification: Boolean = false, val showTreeSyncReminderDialog: Boolean = false -) +) { + val uploadProgress: Float = treesRemainingToSync.toFloat() / totalTreesToSync +} class DashboardViewModel( private val dao: TreeTrackerDAO, diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/devoptions/DevOptionsScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/devoptions/DevOptionsScreen.kt index fae2ff33..bb9b9d19 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/devoptions/DevOptionsScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/devoptions/DevOptionsScreen.kt @@ -16,13 +16,14 @@ package org.greenstand.android.TreeTracker.devoptions import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Checkbox -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ListItem import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.material.TextField @@ -32,6 +33,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp @@ -69,6 +71,7 @@ fun DevOptionsScreen( Scaffold( bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { onBackPressed() @@ -77,7 +80,7 @@ fun DevOptionsScreen( ) }, ) { - LazyColumn { + LazyColumn(modifier = Modifier.padding(it)) { items(state.params) { param -> ParamListItem(param) { newValue -> onParamUpdated(param, newValue) @@ -88,7 +91,6 @@ fun DevOptionsScreen( } } -@OptIn(ExperimentalMaterialApi::class) @Composable private fun ParamListItem( config: Config, @@ -109,25 +111,29 @@ private fun ParamListItem( ) } } -@OptIn(ExperimentalMaterialApi::class) + @Composable private fun BooleanParamListItem( config: BooleanConfig, onClicked: (Boolean) -> Unit, ) { - ListItem( - modifier = Modifier.padding(16.dp), - text = { Text(text = config.name) }, - trailing = { - Checkbox( - checked = config.defaultValue, - onCheckedChange = onClicked, - ) - } - ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = config.name, + modifier = Modifier.weight(1f) + ) + Checkbox( + checked = config.defaultValue, + onCheckedChange = onClicked, + ) + } } -@OptIn(ExperimentalMaterialApi::class) @Composable private fun IntParamListItem( config: IntConfig, @@ -135,11 +141,8 @@ private fun IntParamListItem( ) { var text: String by remember { mutableStateOf(config.defaultValue.toString()) } - Column { - ListItem( - modifier = Modifier.padding(16.dp), - text = { Text(text = config.name) }, - ) + Column(modifier = Modifier.padding(16.dp)) { + Text(text = config.name) TextField( value = text, onValueChange = { @@ -155,7 +158,6 @@ private fun IntParamListItem( } } -@OptIn(ExperimentalMaterialApi::class) @Composable private fun FloatParamListItem( config: FloatConfig, @@ -163,11 +165,8 @@ private fun FloatParamListItem( ) { var text: String by remember { mutableStateOf(config.defaultValue.toString()) } - Column { - ListItem( - modifier = Modifier.padding(16.dp), - text = { Text(text = config.name) }, - ) + Column(modifier = Modifier.padding(16.dp)) { + Text(text = config.name) TextField( value = text, onValueChange = { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/languagepicker/LanguageSelectScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/languagepicker/LanguageSelectScreen.kt index 7c5a74a5..82a97d84 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/languagepicker/LanguageSelectScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/languagepicker/LanguageSelectScreen.kt @@ -18,8 +18,10 @@ package org.greenstand.android.TreeTracker.languagepicker import android.app.Activity import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.Scaffold @@ -61,6 +63,7 @@ fun LanguageSelectScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { ArrowButton( isLeft = false, @@ -97,6 +100,7 @@ fun LanguageSelectScreen( @Composable fun LanguageTopBar() { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { TopBarTitle() } ) } diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/messages/announcementmessage/AnnouncementScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/messages/announcementmessage/AnnouncementScreen.kt index f92bc847..699c2906 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/messages/announcementmessage/AnnouncementScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/messages/announcementmessage/AnnouncementScreen.kt @@ -25,7 +25,9 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Scaffold @@ -65,6 +67,7 @@ fun AnnouncementScreen( Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { OtherChatIcon(state.from) }, @@ -72,6 +75,7 @@ fun AnnouncementScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton( isLeft = true, @@ -87,7 +91,8 @@ fun AnnouncementScreen( ) { Column( Modifier - .padding(top = 4.dp, start = 4.dp, end = 4.dp, bottom = 80.dp) + .padding(it) + .padding(top = 4.dp, start = 4.dp, end = 4.dp) .fillMaxSize() ) { Announcement(state = state) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/messages/directmessages/ChatScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/messages/directmessages/ChatScreen.kt index c23393be..86d41f12 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/messages/directmessages/ChatScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/messages/directmessages/ChatScreen.kt @@ -26,7 +26,9 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState @@ -84,6 +86,7 @@ fun ChatScreen( Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), leftAction = { OtherChatIcon(state.from) }, @@ -106,6 +109,7 @@ fun ChatScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton( isLeft = true, @@ -119,7 +123,7 @@ fun ChatScreen( } ) { Column( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize().padding(it) ) { Messages( state = state, @@ -129,7 +133,7 @@ fun ChatScreen( ) Box( modifier = Modifier - .padding(top = 4.dp, start = 4.dp, end = 4.dp, bottom = 80.dp) + .padding(top = 4.dp, start = 4.dp, end = 4.dp) .fillMaxWidth() .wrapContentHeight() ) { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/messages/individualmeassagelist/IndividualMessageListScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/messages/individualmeassagelist/IndividualMessageListScreen.kt index cc61c72b..521685a9 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/messages/individualmeassagelist/IndividualMessageListScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/messages/individualmeassagelist/IndividualMessageListScreen.kt @@ -17,10 +17,12 @@ package org.greenstand.android.TreeTracker.messages.individualmeassagelist import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.GridCells -import androidx.compose.foundation.lazy.LazyVerticalGrid -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -54,6 +56,7 @@ fun IndividualMessageListScreen( Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), leftAction = { state.currentUser?.photoPath?.let { UserImageButton( @@ -68,6 +71,7 @@ fun IndividualMessageListScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { ArrowButton( isLeft = false, @@ -96,9 +100,9 @@ fun IndividualMessageListScreen( ) { if (state.messages.isNotEmpty()) { LazyVerticalGrid( - cells = GridCells.Fixed(2), - modifier = Modifier.padding(it), // Padding for bottom bar. - contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 10.dp) + columns = GridCells.Fixed(2), + modifier = Modifier.padding(it), + contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 10.dp, bottom = it.calculateBottomPadding()) ) { items(state.messages) { message -> diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/messages/survey/SurveyScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/messages/survey/SurveyScreen.kt index 17a8c475..f78f3103 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/messages/survey/SurveyScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/messages/survey/SurveyScreen.kt @@ -23,11 +23,19 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Scaffold import androidx.compose.material.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -60,6 +68,7 @@ fun SurveyScreen( Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { UserImage(state.userImagePath) }, @@ -67,6 +76,7 @@ fun SurveyScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton( isLeft = true, @@ -96,7 +106,7 @@ fun SurveyScreen( } ) { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().padding(it), horizontalAlignment = Alignment.CenterHorizontally, ) { QuestionPrompt(promptText = state.currentQuestion?.prompt ?: "") diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/AddOrgScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/AddOrgScreen.kt index 2b6ee41e..32caa2b8 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/AddOrgScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/AddOrgScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.text.KeyboardActions @@ -57,6 +58,7 @@ fun AddOrgScreen(viewModel: AddOrgViewModel = viewModel(factory = LocalViewModel Scaffold( bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { CaptureSetupScopeManager.nav.navBackward(navController) @@ -74,7 +76,7 @@ fun AddOrgScreen(viewModel: AddOrgViewModel = viewModel(factory = LocalViewModel } ) { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().padding(it), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(120.dp)) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/OrgPickerScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/OrgPickerScreen.kt index bfae3938..130fd7b3 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/OrgPickerScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/orgpicker/OrgPickerScreen.kt @@ -20,11 +20,13 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.GridCells -import androidx.compose.foundation.lazy.LazyVerticalGrid -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -57,7 +59,9 @@ fun OrgPickerScreen(viewModel: OrgPickerViewModel = viewModel(factory = LocalVie Scaffold( topBar = { Box( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .statusBarsPadding(), contentAlignment = Alignment.Center ) { Text( @@ -74,6 +78,7 @@ fun OrgPickerScreen(viewModel: OrgPickerViewModel = viewModel(factory = LocalVie }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { ArrowButton( isLeft = false, @@ -83,10 +88,10 @@ fun OrgPickerScreen(viewModel: OrgPickerViewModel = viewModel(factory = LocalVie } ) }, - ) { + ) { padding -> LazyVerticalGrid( - cells = GridCells.Fixed(2), - modifier = Modifier.fillMaxSize(), + columns = GridCells.Fixed(2), + modifier = Modifier.fillMaxSize().padding(padding), horizontalArrangement = Arrangement.SpaceEvenly, verticalArrangement = Arrangement.Center ) { diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/profile/ProfileScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/profile/ProfileScreen.kt index d5d2e750..1dfea60f 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/profile/ProfileScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/profile/ProfileScreen.kt @@ -1,39 +1,37 @@ package org.greenstand.android.TreeTracker.profile import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.compose.foundation.Image import androidx.compose.foundation.clickable -import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material.Button -import androidx.compose.material.Divider +import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -42,15 +40,12 @@ import androidx.lifecycle.viewmodel.compose.viewModel import kotlinx.coroutines.launch import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.activities.CaptureImageContract -import org.greenstand.android.TreeTracker.models.NavRoute import org.greenstand.android.TreeTracker.root.LocalNavHostController -import org.greenstand.android.TreeTracker.root.LocalViewModelFactory -import org.greenstand.android.TreeTracker.settings.SettingsItem import org.greenstand.android.TreeTracker.theme.CustomTheme -import org.greenstand.android.TreeTracker.userselect.UserSelect import org.greenstand.android.TreeTracker.userselect.UserSelectState import org.greenstand.android.TreeTracker.userselect.UserSelectViewModel import org.greenstand.android.TreeTracker.userselect.UserSelectViewModelFactory +import org.greenstand.android.TreeTracker.utils.ValidationUtils import org.greenstand.android.TreeTracker.view.ActionBar import org.greenstand.android.TreeTracker.view.AppButtonColors import org.greenstand.android.TreeTracker.view.AppColors @@ -58,13 +53,6 @@ import org.greenstand.android.TreeTracker.view.ArrowButton import org.greenstand.android.TreeTracker.view.LocalImage import org.greenstand.android.TreeTracker.view.ProfileField import org.greenstand.android.TreeTracker.view.TreeTrackerButton -import java.io.File -import org.greenstand.android.TreeTracker.utils.ValidationUtils -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.runtime.getValue @Composable fun ProfileScreen( @@ -103,6 +91,7 @@ fun ProfileScreen( Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { Text( text = stringResource(id = R.string.profile_title), @@ -117,6 +106,7 @@ fun ProfileScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { navController.popBackStack() diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/sessionnote/SessionNoteScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/sessionnote/SessionNoteScreen.kt index e9ed697a..ba492640 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/sessionnote/SessionNoteScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/sessionnote/SessionNoteScreen.kt @@ -20,6 +20,8 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Scaffold @@ -51,6 +53,7 @@ fun SessionNoteScreen(viewModel: SessionNoteViewModel = viewModel(factory = Loca Scaffold( bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { CaptureSetupScopeManager.nav.navBackward(navController) @@ -67,7 +70,7 @@ fun SessionNoteScreen(viewModel: SessionNoteViewModel = viewModel(factory = Loca } ) { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().padding(it), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(120.dp)) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt index f0afac92..a57ae783 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt @@ -2,59 +2,50 @@ package org.greenstand.android.TreeTracker.settings import androidx.compose.foundation.Image import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.width import androidx.compose.material.Divider -import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold -import androidx.compose.material.SnackbarHostState import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment -import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign import androidx.lifecycle.viewmodel.compose.viewModel -import kotlinx.coroutines.launch import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.models.NavRoute -import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager import org.greenstand.android.TreeTracker.root.LocalNavHostController import org.greenstand.android.TreeTracker.root.LocalViewModelFactory -import org.greenstand.android.TreeTracker.signup.Credential import org.greenstand.android.TreeTracker.theme.CustomTheme -import org.greenstand.android.TreeTracker.userselect.UserSelectState -import org.greenstand.android.TreeTracker.userselect.UserSelectViewModel -import org.greenstand.android.TreeTracker.userselect.UserSelectViewModelFactory import org.greenstand.android.TreeTracker.view.ActionBar import org.greenstand.android.TreeTracker.view.AppButtonColors import org.greenstand.android.TreeTracker.view.AppColors -import org.greenstand.android.TreeTracker.view.AppColors.Green import org.greenstand.android.TreeTracker.view.AppColors.Red import org.greenstand.android.TreeTracker.view.ArrowButton -import org.greenstand.android.TreeTracker.view.LanguageButton -import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog -import org.greenstand.android.TreeTracker.view.TopBarTitle import org.greenstand.android.TreeTracker.view.UserButton import org.greenstand.android.TreeTracker.view.dialogs.CustomDialog +import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog @Composable fun SettingsScreen() { val navController = LocalNavHostController.current - val focusRequester = remember { FocusRequester() } - val context = LocalContext.current - val scope = rememberCoroutineScope() val viewModel: SettingsViewModel = viewModel(factory = LocalViewModelFactory.current) val state by viewModel.state.collectAsState(SettingsState()) @@ -63,6 +54,7 @@ fun SettingsScreen() { Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { Text( text = stringResource(id = R.string.settings), @@ -77,18 +69,19 @@ fun SettingsScreen() { }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { navController.popBackStack() } }, - - ) + ) } ) { Box( modifier = Modifier .fillMaxSize() + .padding(it) ) { Column( modifier = Modifier diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt b/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt index 6dc5cc8d..52c51620 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt @@ -18,23 +18,18 @@ package org.greenstand.android.TreeTracker.signup import android.content.Context import android.content.Intent import android.net.Uri -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -45,14 +40,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment -import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight @@ -71,23 +63,21 @@ import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.models.NavRoute import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager import org.greenstand.android.TreeTracker.root.LocalNavHostController -import org.greenstand.android.TreeTracker.settings.SettingsViewModel import org.greenstand.android.TreeTracker.theme.CustomTheme import org.greenstand.android.TreeTracker.utilities.Constants import org.greenstand.android.TreeTracker.view.ActionBar import org.greenstand.android.TreeTracker.view.AppButtonColors import org.greenstand.android.TreeTracker.view.AppColors import org.greenstand.android.TreeTracker.view.AppColors.Green -import org.greenstand.android.TreeTracker.view.ApprovalButton import org.greenstand.android.TreeTracker.view.ArrowButton import org.greenstand.android.TreeTracker.view.BorderedTextField import org.greenstand.android.TreeTracker.view.CustomSnackbar import org.greenstand.android.TreeTracker.view.LanguageButton -import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog import org.greenstand.android.TreeTracker.view.TopBarTitle import org.greenstand.android.TreeTracker.view.TreeTrackerButton import org.greenstand.android.TreeTracker.view.UserButton import org.greenstand.android.TreeTracker.view.dialogs.CustomDialog +import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog @Composable fun CredentialEntryView(viewModel: SignupViewModel, state: SignUpState) { @@ -100,6 +90,7 @@ fun CredentialEntryView(viewModel: SignupViewModel, state: SignUpState) { Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { TopBarTitle() }, rightAction = { LanguageButton() } ) @@ -107,6 +98,7 @@ fun CredentialEntryView(viewModel: SignupViewModel, state: SignUpState) { bottomBar = { if (state.showPrivacyDialog == false) { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { navController.popBackStack() diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/signup/NameEntryView.kt b/app/src/main/java/org/greenstand/android/TreeTracker/signup/NameEntryView.kt index 0b2a3d8a..1496f261 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/signup/NameEntryView.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/signup/NameEntryView.kt @@ -19,12 +19,18 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll +import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -49,13 +55,6 @@ import org.greenstand.android.TreeTracker.view.ArrowButton import org.greenstand.android.TreeTracker.view.BorderedTextField import org.greenstand.android.TreeTracker.view.LanguageButton import org.greenstand.android.TreeTracker.view.TopBarTitle -import org.greenstand.android.TreeTracker.utils.ValidationUtils -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.foundation.layout.padding -import androidx.compose.ui.unit.dp -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height @Composable fun NameEntryView(viewModel: SignupViewModel, state: SignUpState) { @@ -84,6 +83,7 @@ fun NameEntryView(viewModel: SignupViewModel, state: SignUpState) { Scaffold( topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), centerAction = { TopBarTitle() }, @@ -94,6 +94,7 @@ fun NameEntryView(viewModel: SignupViewModel, state: SignUpState) { }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { viewModel.goToCredentialEntry() diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/treeheight/TreeHeightColourSelection.kt b/app/src/main/java/org/greenstand/android/TreeTracker/treeheight/TreeHeightColourSelection.kt index 0659d19e..7306f4f7 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/treeheight/TreeHeightColourSelection.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/treeheight/TreeHeightColourSelection.kt @@ -21,8 +21,10 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.Scaffold @@ -54,9 +56,12 @@ fun TreeHeightScreen() { val state by viewModel.state.observeAsState(TreeHeightSelectionState()) Scaffold( + modifier = Modifier, topBar = { Box( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .statusBarsPadding(), contentAlignment = Alignment.Center ) { Text( @@ -73,6 +78,7 @@ fun TreeHeightScreen() { }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { ArrowButton( isLeft = false, @@ -92,7 +98,7 @@ fun TreeHeightScreen() { modifier = Modifier.padding(padding).fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(20.dp), - contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 30.dp) + contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 30.dp, bottom = padding.calculateBottomPadding()) ) { items(state.colors) { color -> val isSelected = color == state.selectedColor diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/userselect/UserSelect.kt b/app/src/main/java/org/greenstand/android/TreeTracker/userselect/UserSelect.kt index 107f50ba..faa98373 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/userselect/UserSelect.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/userselect/UserSelect.kt @@ -17,10 +17,11 @@ package org.greenstand.android.TreeTracker.userselect import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.GridCells -import androidx.compose.foundation.lazy.LazyVerticalGrid -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -59,6 +60,7 @@ fun UserSelect( Scaffold( bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), centerAction = { if (isCreateUserEnabled) { OrangeAddButton( @@ -99,9 +101,9 @@ fun UserSelect( } ) { LazyVerticalGrid( - cells = GridCells.Fixed(2), - modifier = Modifier.padding(it), // Padding for bottom bar. - contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 10.dp) + modifier = Modifier.statusBarsPadding(), + columns = GridCells.Fixed(2), + contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 10.dp, bottom = it.calculateBottomPadding()) ) { items(state.users) { user -> UserButton( diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/utilities/GpsUtils.kt b/app/src/main/java/org/greenstand/android/TreeTracker/utilities/GpsUtils.kt index ba55fffd..a0d15e7a 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/utilities/GpsUtils.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/utilities/GpsUtils.kt @@ -17,11 +17,10 @@ package org.greenstand.android.TreeTracker.utilities import android.content.Context import android.location.LocationManager -import androidx.activity.ComponentActivity class GpsUtils(val context: Context) { fun hasGPSDevice(): Boolean { - val locationManager = context.getSystemService(ComponentActivity.LOCATION_SERVICE) as LocationManager + val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager val locationProviders = locationManager.allProviders return locationProviders.contains(LocationManager.GPS_PROVIDER) } diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/WalletSelectScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/WalletSelectScreen.kt index 8bed8907..bd1ed4ed 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/WalletSelectScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/WalletSelectScreen.kt @@ -21,7 +21,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.Scaffold @@ -62,8 +64,10 @@ fun WalletSelectScreen( val scope = rememberCoroutineScope() Scaffold( + modifier = Modifier, topBar = { ActionBar( + modifier = Modifier.statusBarsPadding(), leftAction = { state.currentUser?.photoPath?.let { UserImageButton( @@ -78,6 +82,7 @@ fun WalletSelectScreen( }, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), rightAction = { ArrowButton( isLeft = false, @@ -107,11 +112,11 @@ fun WalletSelectScreen( LazyColumn( modifier = Modifier .fillMaxSize() + .padding(it) .padding( start = 10.dp, top = 10.dp, end = 10.dp, - bottom = 90.dp ) ) { state.currentUser?.let { currentUser -> diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/addwallet/AddWalletScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/addwallet/AddWalletScreen.kt index c78c6467..f9764586 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/addwallet/AddWalletScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/walletselect/addwallet/AddWalletScreen.kt @@ -18,6 +18,7 @@ package org.greenstand.android.TreeTracker.walletselect.addwallet import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions @@ -54,8 +55,10 @@ fun AddWalletScreen( val state by viewModel.state.observeAsState(AddWalletState()) Scaffold( + modifier = Modifier, bottomBar = { ActionBar( + modifier = Modifier.navigationBarsPadding(), leftAction = { ArrowButton(isLeft = true) { CaptureSetupScopeManager.nav.navBackward(navController) @@ -78,6 +81,7 @@ fun AddWalletScreen( contentAlignment = Alignment.TopCenter, modifier = Modifier .fillMaxSize() + .padding(it) .padding(top = 120.dp) ) { BorderedTextField( diff --git a/app/src/test/java/org/greenstand/android/TreeTracker/utils/LiveDataUtilTest.kt b/app/src/test/java/org/greenstand/android/TreeTracker/utils/LiveDataUtilTest.kt index 84336d32..e532681c 100644 --- a/app/src/test/java/org/greenstand/android/TreeTracker/utils/LiveDataUtilTest.kt +++ b/app/src/test/java/org/greenstand/android/TreeTracker/utils/LiveDataUtilTest.kt @@ -37,7 +37,7 @@ fun LiveData.getOrAwaitValueTest( var data: T? = null val latch = CountDownLatch(1) val observer = object : Observer { - override fun onChanged(o: T?) { + override fun onChanged(o: T) { data = o latch.countDown() this@getOrAwaitValueTest.removeObserver(this) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 346e6b43..53d3148c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,8 +24,8 @@ androidxWork = "2.7.1" androidxLegacySupport = "1.0.0" # Compose -compose = "1.1.1" -composeActivity = "1.3.0" +compose = "1.6.7" +composeActivity = "1.9.0" composeNavigation = "2.5.0" composeCompiler = "1.5.14" accompanist = "0.21.1-beta"