diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/OutlinedDecimalTextField.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/OutlinedDecimalTextField.kt
new file mode 100644
index 00000000..7fe348e6
--- /dev/null
+++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/OutlinedDecimalTextField.kt
@@ -0,0 +1,65 @@
+/*
+ * Unitto is a unit converter for Android
+ * Copyright (c) 2024 Elshan Agaev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sadellie.unitto.core.ui.common.textfield
+
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.scaleIn
+import androidx.compose.animation.scaleOut
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Clear
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.OutlinedTextField
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+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.input.VisualTransformation
+
+@Composable
+fun OutlinedDecimalTextField(
+ modifier: Modifier,
+ value: TextFieldValue,
+ onValueChange: (TextFieldValue) -> Unit,
+ label: @Composable () -> Unit,
+ expressionFormatter: VisualTransformation,
+ imeAction: ImeAction = ImeAction.Next
+) {
+ OutlinedTextField(
+ modifier = modifier,
+ value = value,
+ onValueChange = onValueChange,
+ trailingIcon = {
+ AnimatedVisibility(value.text.isNotBlank(), enter = scaleIn(), exit = scaleOut()) {
+ IconButton(onClick = { onValueChange(TextFieldValue()) }) {
+ Icon(Icons.Outlined.Clear, null)
+ }
+ }
+ },
+ label = label,
+ singleLine = true,
+ visualTransformation = expressionFormatter,
+ keyboardOptions = KeyboardOptions(
+ keyboardType = KeyboardType.Decimal,
+ imeAction = imeAction
+ ),
+ )
+}
diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassScreen.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassScreen.kt
index e797a646..e1756357 100644
--- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassScreen.kt
+++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassScreen.kt
@@ -153,7 +153,6 @@ private fun BodyMassScreen(
onValueChange = updateHeight1,
label = "${stringResource(R.string.body_mass_height)}, ${stringResource(R.string.unit_centimeter_short)}",
expressionFormatter = expressionTransformer,
- imeAction = ImeAction.Next
)
} else {
Row(
@@ -165,7 +164,6 @@ private fun BodyMassScreen(
onValueChange = updateHeight1,
label = "${stringResource(R.string.body_mass_height)}, ${stringResource(R.string.unit_foot_short)}",
expressionFormatter = expressionTransformer,
- imeAction = ImeAction.Next
)
BodyMassTextField(
modifier = Modifier.weight(1f),
@@ -173,7 +171,6 @@ private fun BodyMassScreen(
onValueChange = updateHeight2,
label = "${stringResource(R.string.body_mass_height)}, ${stringResource(R.string.unit_inch_short)}",
expressionFormatter = expressionTransformer,
- imeAction = ImeAction.Next
)
}
}
diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassTextField.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassTextField.kt
index 9fc447f1..2df31fed 100644
--- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassTextField.kt
+++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassTextField.kt
@@ -19,32 +19,25 @@
package com.sadellie.unitto.feature.bodymass.components
import androidx.compose.animation.AnimatedContent
-import androidx.compose.foundation.text.KeyboardActions
-import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material3.LocalTextStyle
-import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-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.input.VisualTransformation
-import androidx.compose.ui.text.style.TextAlign
import com.sadellie.unitto.core.base.Token
+import com.sadellie.unitto.core.ui.common.textfield.OutlinedDecimalTextField
@Composable
internal fun BodyMassTextField(
modifier: Modifier,
value: TextFieldValue,
- onValueChange: (TextFieldValue) -> Unit,
label: String,
+ onValueChange: (TextFieldValue) -> Unit,
expressionFormatter: VisualTransformation,
- imeAction: ImeAction
+ imeAction: ImeAction = ImeAction.Next
) {
- val focusManager = LocalFocusManager.current
- OutlinedTextField(
+ OutlinedDecimalTextField(
modifier = modifier,
value = value,
onValueChange = {
@@ -56,13 +49,7 @@ internal fun BodyMassTextField(
onValueChange(it.copy(cleanText))
},
label = { AnimatedContent(label) { Text(it) } },
- singleLine = true,
- visualTransformation = expressionFormatter,
- keyboardOptions = KeyboardOptions(
- keyboardType = KeyboardType.Decimal,
- imeAction = imeAction
- ),
- textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.End),
- keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() })
+ expressionFormatter = expressionFormatter,
+ imeAction = imeAction
)
}
diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/DateCalculatorScreen.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/DateCalculatorScreen.kt
index aae07da8..1ac657cf 100644
--- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/DateCalculatorScreen.kt
+++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/DateCalculatorScreen.kt
@@ -26,11 +26,9 @@ import androidx.compose.material3.PrimaryTabRow
import androidx.compose.material3.Tab
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
@@ -63,7 +61,6 @@ internal fun DateCalculatorScreen(
val addSubtractLabel = "${stringResource(R.string.date_calculator_add)}/${stringResource(R.string.date_calculator_subtract)}"
val differenceLabel = stringResource(R.string.date_calculator_difference)
val focusManager = LocalFocusManager.current
- var showKeyboard by remember { mutableStateOf(false) }
val allTabs = remember { listOf(addSubtractLabel, differenceLabel) }
val pagerState = rememberPagerState { allTabs.size }
@@ -99,14 +96,9 @@ internal fun DateCalculatorScreen(
verticalAlignment = Alignment.Top
) { page ->
when (page) {
- 0 -> AddSubtractPage(
- showKeyboard = showKeyboard,
- toggleKeyboard = {showKeyboard = it }
- )
+ 0 -> AddSubtractPage()
1 -> {
- focusManager.clearFocus(true)
- showKeyboard = false
-
+ SideEffect { focusManager.clearFocus(true) }
DateDifferencePage()
}
}
diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractPage.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractPage.kt
index 5f81b29d..9e5fe973 100644
--- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractPage.kt
+++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractPage.kt
@@ -23,14 +23,10 @@ import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.provider.CalendarContract
-import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedContent
-import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.SizeTransform
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
-import androidx.compose.animation.slideInVertically
-import androidx.compose.animation.slideOutVertically
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
@@ -50,25 +46,20 @@ import androidx.compose.material.icons.filled.Event
import androidx.compose.material.icons.outlined.Add
import androidx.compose.material.icons.outlined.Remove
import androidx.compose.material3.FloatingActionButton
-import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SegmentedButton
import androidx.compose.material3.SegmentedButtonDefaults
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
-import com.sadellie.unitto.core.ui.WindowHeightSizeClass
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.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
@@ -77,12 +68,9 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.sadellie.unitto.core.base.R
-import com.sadellie.unitto.core.ui.LocalWindowSize
-import com.sadellie.unitto.core.ui.common.textfield.addTokens
-import com.sadellie.unitto.core.ui.common.textfield.deleteTokens
+import com.sadellie.unitto.core.ui.common.textfield.ExpressionTransformer
import com.sadellie.unitto.core.ui.showToast
import com.sadellie.unitto.feature.datecalculator.ZonedDateTimeUtils
-import com.sadellie.unitto.feature.datecalculator.components.AddSubtractKeyboard
import com.sadellie.unitto.feature.datecalculator.components.DateTimeDialogs
import com.sadellie.unitto.feature.datecalculator.components.DateTimeSelectorBlock
import com.sadellie.unitto.feature.datecalculator.components.DialogState
@@ -92,15 +80,11 @@ import java.time.ZonedDateTime
@Composable
internal fun AddSubtractPage(
viewModel: AddSubtractViewModel = hiltViewModel(),
- showKeyboard: Boolean,
- toggleKeyboard: (Boolean) -> Unit,
) {
val uiState = viewModel.uiState.collectAsStateWithLifecycle().value
AddSubtractView(
uiState = uiState,
- showKeyboard = showKeyboard,
- toggleKeyboard = toggleKeyboard,
updateStart = viewModel::updateStart,
updateYears = viewModel::updateYears,
updateMonths = viewModel::updateMonths,
@@ -115,8 +99,6 @@ internal fun AddSubtractPage(
@Composable
private fun AddSubtractView(
uiState: AddSubtractState,
- showKeyboard: Boolean,
- toggleKeyboard: (Boolean) -> Unit,
updateStart: (ZonedDateTime) -> Unit,
updateYears: (TextFieldValue) -> Unit,
updateMonths: (TextFieldValue) -> Unit,
@@ -126,20 +108,9 @@ private fun AddSubtractView(
updateAddition: (Boolean) -> Unit,
) {
val mContext = LocalContext.current
- val focusManager = LocalFocusManager.current
-
var dialogState by remember { mutableStateOf(DialogState.NONE) }
- var addSymbol: ((TextFieldValue) -> Unit)? by remember { mutableStateOf(null) }
- var focusedTextFieldValue: TextFieldValue? by remember { mutableStateOf(null) }
-
- LaunchedEffect(addSymbol, focusedTextFieldValue) {
- toggleKeyboard((addSymbol != null) and (focusedTextFieldValue != null))
- }
-
- BackHandler(showKeyboard) {
- focusManager.clearFocus()
- addSymbol = null
- focusedTextFieldValue = null
+ val expressionTransformer = remember(uiState.formatterSymbols) {
+ ExpressionTransformer(uiState.formatterSymbols)
}
val showResult = remember(uiState.start, uiState.result) { uiState.start != uiState.result }
@@ -241,127 +212,58 @@ private fun AddSubtractView(
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
TimeUnitTextField(
- modifier = Modifier
- .onFocusEvent {
- if (it.hasFocus) {
- addSymbol = updateYears
- focusedTextFieldValue = uiState.years
- }
- }
- .fillMaxWidth(),
+ modifier = Modifier.fillMaxWidth(),
value = uiState.years,
onValueChange = updateYears,
label = stringResource(R.string.date_calculator_years),
- formatterSymbols = uiState.formatterSymbols
+ expressionFormatter = expressionTransformer,
)
Row(
- modifier = Modifier
- .fillMaxWidth(),
+ modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
TimeUnitTextField(
- modifier = Modifier
- .onFocusEvent {
- if (it.hasFocus) {
- addSymbol = updateMonths
- focusedTextFieldValue = uiState.months
- }
- }
- .weight(1f),
+ modifier = Modifier.weight(1f),
value = uiState.months,
onValueChange = updateMonths,
label = stringResource(R.string.date_calculator_months),
- formatterSymbols = uiState.formatterSymbols
+ expressionFormatter = expressionTransformer,
)
TimeUnitTextField(
- modifier = Modifier
- .onFocusEvent {
- if (it.hasFocus) {
- addSymbol = updateDays
- focusedTextFieldValue = uiState.days
- }
- }
- .weight(1f),
+ modifier = Modifier.weight(1f),
value = uiState.days,
onValueChange = updateDays,
label = stringResource(R.string.date_calculator_days),
- formatterSymbols = uiState.formatterSymbols
+ expressionFormatter = expressionTransformer,
)
}
Row(
- modifier = Modifier
- .fillMaxWidth(),
+ modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
TimeUnitTextField(
- modifier = Modifier
- .onFocusEvent {
- if (it.hasFocus) {
- addSymbol = updateHours
- focusedTextFieldValue = uiState.hours
- }
- }
- .weight(1f),
+ modifier = Modifier.weight(1f),
value = uiState.hours,
onValueChange = updateHours,
label = stringResource(R.string.date_calculator_hours),
- formatterSymbols = uiState.formatterSymbols
+ expressionFormatter = expressionTransformer,
)
TimeUnitTextField(
- modifier = Modifier
- .onFocusEvent {
- if (it.hasFocus) {
- addSymbol = updateMinutes
- focusedTextFieldValue = uiState.minutes
- }
- }
- .weight(1f),
+ modifier = Modifier.weight(1f),
value = uiState.minutes,
onValueChange = updateMinutes,
label = stringResource(R.string.date_calculator_minutes),
- formatterSymbols = uiState.formatterSymbols
+ expressionFormatter = expressionTransformer,
+ imeAction = ImeAction.Done
)
}
}
}
}
- AnimatedVisibility(
- visible = showKeyboard,
- enter = slideInVertically { it / 2 } + fadeIn(),
- exit = slideOutVertically { it / 2 } + fadeOut()
- ) {
- HorizontalDivider()
- AddSubtractKeyboard(
- modifier = Modifier
- .weight(1f)
- .fillMaxWidth()
- .fillMaxHeight(if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) 0.4f else 0.6f)
- .padding(2.dp, 4.dp),
- addSymbol = {
- val newValue = focusedTextFieldValue?.addTokens(it)
- if (newValue != null) {
- addSymbol?.invoke(newValue)
- }
- },
- deleteSymbol = {
- val newValue = focusedTextFieldValue?.deleteTokens()
- if (newValue != null) {
- addSymbol?.invoke(newValue)
- }
- },
- onConfirm = {
- focusManager.clearFocus()
- addSymbol = null
- focusedTextFieldValue = null
- },
- allowVibration = uiState.allowVibration,
- imeAction = if (addSymbol == updateMinutes) ImeAction.Done else ImeAction.Next
- )
- }
}
DateTimeDialogs(
@@ -399,8 +301,6 @@ fun AddSubtractViewPreview() {
start = ZonedDateTimeUtils.nowWithMinutes(),
result = ZonedDateTimeUtils.nowWithMinutes().plusSeconds(1)
),
- showKeyboard = false,
- toggleKeyboard = {},
updateStart = {},
updateYears = {},
updateMonths = {},
diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/AddSubtractKeyboard.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/AddSubtractKeyboard.kt
deleted file mode 100644
index 533e1521..00000000
--- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/AddSubtractKeyboard.kt
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Unitto is a unit converter for Android
- * Copyright (c) 2023 Elshan Agaev
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package com.sadellie.unitto.feature.datecalculator.components
-
-import androidx.compose.animation.Crossfade
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusDirection
-import androidx.compose.ui.focus.FocusManager
-import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.tooling.preview.Preview
-import com.sadellie.unitto.core.base.Token
-import com.sadellie.unitto.core.ui.LocalWindowSize
-import com.sadellie.unitto.core.ui.WindowHeightSizeClass
-import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightTall
-import com.sadellie.unitto.core.ui.common.KeyboardButtonFilled
-import com.sadellie.unitto.core.ui.common.KeyboardButtonLight
-import com.sadellie.unitto.core.ui.common.KeypadFlow
-import com.sadellie.unitto.core.ui.common.icons.IconPack
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Backspace
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Check
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key0
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key1
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key2
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key3
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key4
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key5
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key6
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key7
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key8
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Key9
-import com.sadellie.unitto.core.ui.common.icons.iconpack.Tab
-
-@Composable
-internal fun AddSubtractKeyboard(
- modifier: Modifier,
- addSymbol: (String) -> Unit,
- deleteSymbol: () -> Unit,
- onConfirm: () -> Unit,
- allowVibration: Boolean,
- imeAction: ImeAction,
- focusManager: FocusManager = LocalFocusManager.current
-) {
- Row(
- modifier = modifier
- ) {
- KeypadFlow(
- modifier = Modifier
- .fillMaxHeight()
- .weight(3f),
- rows = 4,
- columns = 3
- ) { width, height ->
- val buttonModifier = Modifier
- .fillMaxWidth(width)
- .fillMaxHeight(height)
-
- KeyboardButtonLight(buttonModifier, IconPack.Key7, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._7) }
- KeyboardButtonLight(buttonModifier, IconPack.Key8, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._8) }
- KeyboardButtonLight(buttonModifier, IconPack.Key9, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._9) }
-
- KeyboardButtonLight(buttonModifier, IconPack.Key4, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._4) }
- KeyboardButtonLight(buttonModifier, IconPack.Key5, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._5) }
- KeyboardButtonLight(buttonModifier, IconPack.Key6, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._6) }
-
- KeyboardButtonLight(buttonModifier, IconPack.Key1, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._1) }
- KeyboardButtonLight(buttonModifier, IconPack.Key2, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._2) }
- KeyboardButtonLight(buttonModifier, IconPack.Key3, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._3) }
-
- Spacer(buttonModifier)
- KeyboardButtonLight(buttonModifier, IconPack.Key0, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._0) }
- Spacer(buttonModifier)
- }
-
- KeypadFlow(
- modifier = Modifier
- .fillMaxHeight()
- .weight(1f),
- rows = 2,
- columns = 1,
- // In digits keypad there are 4 rows with verticalPadding set to 10
- // In this keypad we have 2 times less rows, we use 2 times smaller verticalPadding -> 5
- verticalPadding = 5
- ) { width, height ->
- val mainButtonModifier = Modifier
- .fillMaxWidth(width)
- .fillMaxHeight(height)
- val actionIconHeight = if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) 0.8f else 1.3f
-
- Crossfade(
- targetState = imeAction == ImeAction.Next,
- modifier = mainButtonModifier,
- label = "Primary button animation"
- ) { showNext ->
- if (showNext) {
- KeyboardButtonFilled(Modifier.fillMaxSize(), IconPack.Tab, allowVibration, actionIconHeight) { focusManager.moveFocus(FocusDirection.Next) }
- } else {
- KeyboardButtonFilled(Modifier.fillMaxSize(), IconPack.Check, allowVibration, actionIconHeight) { onConfirm() }
- }
- }
- KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, allowVibration, actionIconHeight) { deleteSymbol() }
- }
-
- }
-}
-
-@Preview
-@Composable
-fun PreviewAddSubtractKeyboardNew() {
- AddSubtractKeyboard(
- modifier = Modifier
- .fillMaxSize(),
- addSymbol = {},
- deleteSymbol = {},
- onConfirm = {},
- allowVibration = true,
- imeAction = ImeAction.Next
- )
-}
diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/TimeUnitTextField.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/TimeUnitTextField.kt
index 8507c138..47fd1c6a 100644
--- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/TimeUnitTextField.kt
+++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/TimeUnitTextField.kt
@@ -18,50 +18,32 @@
package com.sadellie.unitto.feature.datecalculator.components
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.scaleIn
-import androidx.compose.animation.scaleOut
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Clear
-import androidx.compose.material3.Icon
-import androidx.compose.material3.IconButton
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.OutlinedTextField
+import androidx.compose.animation.AnimatedContent
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalTextInputService
+import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
-import com.sadellie.unitto.core.ui.common.textfield.ExpressionTransformer
-import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols
+import androidx.compose.ui.text.input.VisualTransformation
+import com.sadellie.unitto.core.ui.common.textfield.OutlinedDecimalTextField
@Composable
internal fun TimeUnitTextField(
modifier: Modifier,
value: TextFieldValue,
- onValueChange: (TextFieldValue) -> Unit,
label: String,
- formatterSymbols: FormatterSymbols
-) = CompositionLocalProvider(LocalTextInputService provides null) {
- OutlinedTextField(
+ onValueChange: (TextFieldValue) -> Unit,
+ expressionFormatter: VisualTransformation,
+ imeAction: ImeAction = ImeAction.Next,
+) {
+ OutlinedDecimalTextField(
modifier = modifier,
value = value,
onValueChange = { newValue ->
onValueChange(newValue.copy(newValue.text.filter { it.isDigit() }))
},
- label = { Text(label, color = MaterialTheme.colorScheme.onSurfaceVariant) },
- trailingIcon = {
- AnimatedVisibility(
- visible = value.text.isNotBlank(),
- enter = scaleIn(),
- exit = scaleOut()
- ) {
- IconButton(onClick = { onValueChange(TextFieldValue()) }) {
- Icon(Icons.Outlined.Clear, null)
- }
- }
- },
- visualTransformation = ExpressionTransformer(formatterSymbols)
+ label = { AnimatedContent(label) { Text(it) } },
+ expressionFormatter = expressionFormatter,
+ imeAction = imeAction
)
}