Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit d851554c authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

feat(preference): preference text dialog automatically requests focus on text input

parent c273001e
Loading
Loading
Loading
Loading
+34 −7
Original line number Diff line number Diff line
@@ -4,14 +4,27 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium
import app.k9mail.core.ui.compose.designsystem.molecule.input.TextInput
import app.k9mail.core.ui.compose.designsystem.molecule.input.AdvancedTextInput
import app.k9mail.core.ui.compose.theme2.MainTheme
import kotlinx.coroutines.delay
import net.thunderbird.core.ui.compose.preference.api.PreferenceSetting

// This a workaround for a bug in Compose, preventing the keyboard been show when requesting focus on a dialog,
// see: https://issuetracker.google.com/issues/204502668
private const val EDIT_TEXT_FOCUS_DELAY = 200L

@Composable
internal fun PreferenceDialogTextView(
    preference: PreferenceSetting.Text,
@@ -20,13 +33,26 @@ internal fun PreferenceDialogTextView(
    onDismissRequest: () -> Unit,
    modifier: Modifier = Modifier,
) {
    val currentText = rememberSaveable { mutableStateOf(preference.value) }
    val focusRequester = remember { FocusRequester() }
    var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) {
        mutableStateOf(
            TextFieldValue(
                text = preference.value,
                selection = TextRange(preference.value.length),
            ),
        )
    }

    LaunchedEffect(Unit) {
        delay(EDIT_TEXT_FOCUS_DELAY)
        focusRequester.requestFocus()
    }

    PreferenceDialogLayout(
        title = preference.title(),
        icon = preference.icon(),
        onConfirmClick = {
            onConfirmClick(preference.copy(value = currentText.value))
            onConfirmClick(preference.copy(value = textFieldValue.text))
        },
        onDismissClick = onDismissClick,
        onDismissRequest = onDismissRequest,
@@ -38,12 +64,13 @@ internal fun PreferenceDialogTextView(
            Spacer(modifier = Modifier.height(MainTheme.spacings.default))
        }

        TextInput(
            text = currentText.value,
        AdvancedTextInput(
            text = textFieldValue,
            contentPadding = PaddingValues(),
            onTextChange = {
                currentText.value = it
            onTextChange = { changedText ->
                textFieldValue = changedText
            },
            modifier = Modifier.focusRequester(focusRequester),
        )
    }
}