From 89b51cc7e0e611bce3e367ded8fd12c5c7af067d Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 16 Jan 2025 09:38:11 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../fields/contextmenu/DisableContextMenu.kt | 38 +++++++++++++++ .../ui/MultiWalletSeedPhraseImport.kt | 12 ++++- .../ui/MultiWalletSeedPhraseWordsCheck.kt | 35 +++++++++++--- .../wallet2/ui/CheckSeedPhraseScreen.kt | 46 ++++++++++++------- .../wallet2/ui/ImportSeedPhraseScreen.kt | 10 ++++ 5 files changed, 117 insertions(+), 24 deletions(-) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/fields/contextmenu/DisableContextMenu.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/fields/contextmenu/DisableContextMenu.kt b/core/ui/src/main/java/com/tangem/core/ui/components/fields/contextmenu/DisableContextMenu.kt new file mode 100644 index 0000000000..bf8c61037a --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/fields/contextmenu/DisableContextMenu.kt @@ -0,0 +1,38 @@ +package com.tangem.core.ui.components.fields.contextmenu + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.NonSkippableComposable +import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.platform.LocalTextToolbar +import androidx.compose.ui.platform.TextToolbar +import androidx.compose.ui.platform.TextToolbarStatus + +/** + * Composable component that used to disable context menu + * + * @param content content + */ +@Composable +@NonSkippableComposable +fun DisableContextMenu(content: @Composable () -> Unit) { + CompositionLocalProvider( + value = LocalTextToolbar provides EmptyTextToolbar, + content = content, + ) +} + +private object EmptyTextToolbar : TextToolbar { + + override val status: TextToolbarStatus = TextToolbarStatus.Hidden + + override fun hide() = Unit + + override fun showMenu( + rect: Rect, + onCopyRequested: (() -> Unit)?, + onPasteRequested: (() -> Unit)?, + onCutRequested: (() -> Unit)?, + onSelectAllRequested: (() -> Unit)?, + ) = Unit +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseImport.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseImport.kt index 5512fd5d07..f64fd62c0d 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseImport.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseImport.kt @@ -1,11 +1,11 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.ui import androidx.compose.animation.* -import com.tangem.core.ui.extensions.stringResourceSafe import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material.OutlinedTextField import androidx.compose.material3.Text @@ -16,6 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp @@ -24,6 +25,7 @@ import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.* import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.onboarding.v2.impl.R @@ -88,6 +90,10 @@ internal fun MultiWalletSeedPhraseImport(state: MultiWalletSeedPhraseUM.Import, label = stringResourceSafe(id = R.string.common_passphrase), placeholder = stringResourceSafe(id = R.string.send_optional_field), onIconClick = state.onPassphraseInfoClick, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + ), ) } @@ -142,6 +148,10 @@ private fun PhraseBlock(state: MultiWalletSeedPhraseUM.Import, modifier: Modifie singleLine = false, colors = TangemTextFieldsDefault.defaultTextFieldColors, visualTransformation = invalidWordsColorTransformation, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + ), ) Box( diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseWordsCheck.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseWordsCheck.kt index 9d37d02677..dfc2b1cd70 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseWordsCheck.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhraseWordsCheck.kt @@ -2,19 +2,27 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.ui import androidx.compose.foundation.layout.* 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.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastForEachIndexed import com.tangem.core.ui.R import com.tangem.core.ui.components.BasicDialog import com.tangem.core.ui.components.DialogButtonUM import com.tangem.core.ui.components.OutlineTextField import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.components.fields.contextmenu.DisableContextMenu import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme @@ -96,17 +104,30 @@ internal fun MultiWalletSeedPhraseWordsCheck( @Composable private fun Fields(state: MultiWalletSeedPhraseUM.GeneratedWordsCheck, modifier: Modifier = Modifier) { + val focusManager = LocalFocusManager.current + Column( modifier = modifier, verticalArrangement = Arrangement.spacedBy(16.dp), ) { - state.wordFields.forEach { field -> - OutlineTextField( - value = field.word, - onValueChange = field.onChange, - label = field.index.toString(), - isError = field.error, - ) + DisableContextMenu { + state.wordFields.fastForEachIndexed { index, field -> + OutlineTextField( + value = field.word, + onValueChange = field.onChange, + label = field.index.toString(), + isError = field.error, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + imeAction = if (index == state.wordFields.lastIndex) ImeAction.Done else ImeAction.Next, + ), + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() }, + onNext = { focusManager.moveFocus(focusDirection = FocusDirection.Down) }, + ), + ) + } } } } diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/CheckSeedPhraseScreen.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/CheckSeedPhraseScreen.kt index b9ee1576da..bf29010072 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/CheckSeedPhraseScreen.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/CheckSeedPhraseScreen.kt @@ -2,14 +2,22 @@ package com.tangem.feature.onboarding.presentation.wallet2.ui import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import com.tangem.core.ui.R import com.tangem.core.ui.components.OutlineTextField import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.components.fields.contextmenu.DisableContextMenu import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.onboarding.presentation.wallet2.model.CheckSeedPhraseState +import com.tangem.feature.onboarding.presentation.wallet2.model.TextFieldState import com.tangem.feature.onboarding.presentation.wallet2.ui.components.Description import com.tangem.feature.onboarding.presentation.wallet2.ui.components.OnboardingActionBlock import com.tangem.feature.onboarding.presentation.wallet2.ui.components.OnboardingDescriptionBlock @@ -72,25 +80,31 @@ fun CheckSeedPhraseScreen(state: CheckSeedPhraseState, modifier: Modifier = Modi @Composable private fun CheckSeedPhraseBlock(state: CheckSeedPhraseState, modifier: Modifier = Modifier) { Column(modifier) { - OutlineTextField( - value = state.tvSecondPhrase.textFieldValue, - onValueChange = state.tvSecondPhrase.onTextFieldValueChanged, - label = state.tvSecondPhrase.label, - isError = state.tvSecondPhrase.isError, - ) + CheckSeedPhraseTextField(state = state.tvSecondPhrase, imeAction = ImeAction.Next) + CheckSeedPhraseTextField(state = state.tvSeventhPhrase, imeAction = ImeAction.Next) + CheckSeedPhraseTextField(state = state.tvEleventhPhrase, imeAction = ImeAction.Done) + } +} - OutlineTextField( - value = state.tvSeventhPhrase.textFieldValue, - onValueChange = state.tvSeventhPhrase.onTextFieldValueChanged, - label = state.tvSeventhPhrase.label, - isError = state.tvSeventhPhrase.isError, - ) +@Composable +private fun CheckSeedPhraseTextField(state: TextFieldState, imeAction: ImeAction) { + val focusManager = LocalFocusManager.current + DisableContextMenu { OutlineTextField( - value = state.tvEleventhPhrase.textFieldValue, - onValueChange = state.tvEleventhPhrase.onTextFieldValueChanged, - label = state.tvEleventhPhrase.label, - isError = state.tvEleventhPhrase.isError, + value = state.textFieldValue, + onValueChange = state.onTextFieldValueChanged, + label = state.label, + isError = state.isError, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + imeAction = imeAction, + ), + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() }, + onNext = { focusManager.moveFocus(focusDirection = FocusDirection.Down) }, + ), ) } } \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/ImportSeedPhraseScreen.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/ImportSeedPhraseScreen.kt index 8f9c0f7056..bc6e59c4dd 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/ImportSeedPhraseScreen.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/ImportSeedPhraseScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -15,6 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider @@ -111,6 +113,10 @@ private fun PassphraseBlock( label = stringResourceSafe(id = R.string.common_passphrase), placeholder = stringResourceSafe(id = R.string.send_optional_field), onIconClick = onPassphraseInfoClick, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + ), ) } @@ -135,6 +141,10 @@ private fun PhraseBlock(state: ImportSeedPhraseState, modifier: Modifier = Modif style = SpanStyle(color = TangemTheme.colors.text.warning), ), colors = TangemTextFieldsDefault.defaultTextFieldColors, + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, + ), ) Box(