From 963fb2f3b014563cbc24fbc225a4f40e514d3775 Mon Sep 17 00:00:00 2001 From: andreia Date: Tue, 14 Apr 2026 11:05:26 +0200 Subject: [PATCH 1/2] fix progress bar misaligned on photo task --- .../datacollection/DataCollectionFragment.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionFragment.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionFragment.kt index 00aba755b3..a50534459f 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionFragment.kt @@ -22,17 +22,19 @@ import android.view.View import android.view.ViewGroup import android.widget.ProgressBar import androidx.constraintlayout.widget.Guideline -import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnLayout import androidx.hilt.navigation.fragment.hiltNavGraphViewModels import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.lifecycle.Lifecycle +import androidx.lifecycle.asFlow import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import androidx.viewpager2.widget.ViewPager2 import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import kotlin.getValue +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import org.groundplatform.android.R import org.groundplatform.android.databinding.DataCollectionFragBinding @@ -40,7 +42,9 @@ import org.groundplatform.android.ui.common.AbstractFragment import org.groundplatform.android.ui.common.BackPressListener import org.groundplatform.android.ui.components.ConfirmationDialog import org.groundplatform.android.ui.home.HomeScreenFragmentDirections +import org.groundplatform.android.ui.main.MainViewModel import org.groundplatform.android.util.renderComposableDialog +import org.groundplatform.android.util.systemInsets import org.groundplatform.domain.model.locationofinterest.LoiReport import org.groundplatform.domain.model.task.Task @@ -50,6 +54,7 @@ class DataCollectionFragment : AbstractFragment(), BackPressListener { @Inject lateinit var viewPagerAdapterFactory: DataCollectionViewPagerAdapterFactory val viewModel: DataCollectionViewModel by hiltNavGraphViewModels(R.id.data_collection) + private val mainViewModel: MainViewModel by lazy { getViewModel(MainViewModel::class.java) } private lateinit var binding: DataCollectionFragBinding private lateinit var progressBar: ProgressBar @@ -88,7 +93,14 @@ class DataCollectionFragment : AbstractFragment(), BackPressListener { viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.footerVerticalPosition.collect { setProgressBarPosition(it) } + combine(mainViewModel.windowInsets.asFlow(), viewModel.footerVerticalPosition) { + insets, + position -> + Pair(insets, position) + } + .collect { (insets, position) -> + setProgressBarPosition(position - insets.systemInsets().top) + } } } @@ -139,11 +151,7 @@ class DataCollectionFragment : AbstractFragment(), BackPressListener { } private fun setProgressBarPosition(topPosition: Float) { - val insets = requireView().rootWindowInsets ?: return - val windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets) - val systemBarsInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) - - val guidelineTop = topPosition.toInt() - systemBarsInsets.top + val guidelineTop = topPosition.toInt() if (guidelineTop > 0) { guideline.setGuidelineBegin(guidelineTop) From e0a88d86172206013ad5f530720a4406ffce84ba Mon Sep 17 00:00:00 2001 From: andreia Date: Tue, 14 Apr 2026 16:45:49 +0200 Subject: [PATCH 2/2] store footer position instead of layout coordinates --- .../android/ui/datacollection/tasks/TaskScreen.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/TaskScreen.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/TaskScreen.kt index d39301a6c3..8b9bafc66a 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/TaskScreen.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/TaskScreen.kt @@ -21,11 +21,10 @@ import androidx.compose.foundation.layout.isImeVisible import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.LayoutCoordinates import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInWindow import org.groundplatform.android.ui.datacollection.components.ButtonActionState @@ -51,18 +50,16 @@ fun TaskScreen( taskBody: @Composable () -> Unit, ) { val isKeyboardOpen = WindowInsets.isImeVisible - var layoutCoordinates by remember { mutableStateOf(null) } + var footerPositionY by remember { mutableFloatStateOf(0f) } // Update footer position whenever layout changes or keyboard is toggled. - LaunchedEffect(isKeyboardOpen, layoutCoordinates) { - layoutCoordinates?.let { onFooterPositionUpdated(it.positionInWindow().y) } - } + LaunchedEffect(isKeyboardOpen, footerPositionY) { onFooterPositionUpdated(footerPositionY) } TaskViewLayout( header = taskHeader, footer = { TaskFooter( - modifier = Modifier.onGloballyPositioned { layoutCoordinates = it }, + modifier = Modifier.onGloballyPositioned { footerPositionY = it.positionInWindow().y }, content = footerContent, buttonActionStates = taskActionButtonsStates, onButtonClicked = { onAction(TaskScreenAction.OnButtonClicked(it)) },