diff --git a/mage/src/main/java/mil/nga/giat/mage/form/edit/FormEdit.kt b/mage/src/main/java/mil/nga/giat/mage/form/edit/FormEdit.kt index efff3b25..95d8f5c8 100644 --- a/mage/src/main/java/mil/nga/giat/mage/form/edit/FormEdit.kt +++ b/mage/src/main/java/mil/nga/giat/mage/form/edit/FormEdit.kt @@ -33,6 +33,8 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.sp +import androidx.compose.foundation.relocation.BringIntoViewRequester +import androidx.compose.foundation.relocation.bringIntoViewRequester import mil.nga.giat.mage.database.model.event.Event import mil.nga.giat.mage.form.field.* import mil.nga.giat.mage.form.FormState @@ -438,6 +440,7 @@ fun TextEdit( val pendingJob = remember { object { var value: Job? = null } } val lastHistoryText = remember { object { var value = fieldState.answer?.text ?: "" } } val isFirstChange = remember { object { var value = true } } + val bringIntoViewRequester = remember { BringIntoViewRequester() } var textFieldValue by remember { mutableStateOf(TextFieldValue(text = fieldState.answer?.text ?: "")) } val currentAnswerText = fieldState.answer?.text ?: "" @@ -459,6 +462,9 @@ fun TextEdit( val newText = newValue.text val capturedPrev = lastHistoryText.value onAnswer(newText) + scope.launch { + bringIntoViewRequester.bringIntoView() + } if (fieldState is TextFieldState) { pendingJob.value?.cancel() if (isFirstChange.value) { @@ -484,6 +490,7 @@ fun TextEdit( trailingIcon = icon, modifier = Modifier .fillMaxWidth() + .bringIntoViewRequester(bringIntoViewRequester) .onFocusChanged { focusState -> val focused = focusState.isFocused if (focused && fieldState is TextFieldState) { diff --git a/mage/src/main/java/mil/nga/giat/mage/observation/edit/ObservationEditScreen.kt b/mage/src/main/java/mil/nga/giat/mage/observation/edit/ObservationEditScreen.kt index c4732c92..12f06123 100644 --- a/mage/src/main/java/mil/nga/giat/mage/observation/edit/ObservationEditScreen.kt +++ b/mage/src/main/java/mil/nga/giat/mage/observation/edit/ObservationEditScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.* import androidx.compose.foundation.gestures.animateScrollBy +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.* import androidx.compose.material.* @@ -24,9 +25,11 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import kotlinx.android.parcel.Parcelize @@ -79,6 +82,7 @@ fun ObservationEditScreen( val scope = rememberCoroutineScope() val scaffoldState = rememberScaffoldState() val listState = rememberLazyListState() + val focusManager = LocalFocusManager.current val focusedUndoField by remember { derivedStateOf { @@ -86,8 +90,8 @@ fun ObservationEditScreen( ?.flatMap { it.fields } ?.firstOrNull { field -> field.isFocused && when (field) { - is TextFieldState -> field.isTypingActive && (field.canUndo || field.canRedo) - is NumberFieldState -> field.isTypingActive && (field.canUndo || field.canRedo) + is TextFieldState -> field.hasValue() || field.canUndo || field.canRedo + is NumberFieldState -> field.hasValue() || field.canUndo || field.canRedo else -> false } } @@ -134,7 +138,14 @@ fun ObservationEditScreen( } } - Column(modifier = Modifier.fillMaxSize().imePadding()) { + Column( + modifier = Modifier + .fillMaxSize() + .imePadding() + .pointerInput(Unit) { + detectTapGestures(onTap = { focusManager.clearFocus() }) + } + ) { if (isServerVersion5(LocalContext.current)) { ObservationMediaBar { onMediaAction?.invoke(MediaAction(it, null, null)) } }