Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,29 @@ 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
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

Expand All @@ -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
Expand Down Expand Up @@ -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)
}
}
}

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -51,18 +50,16 @@ fun TaskScreen(
taskBody: @Composable () -> Unit,
) {
val isKeyboardOpen = WindowInsets.isImeVisible
var layoutCoordinates by remember { mutableStateOf<LayoutCoordinates?>(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)) },
Expand Down
Loading