diff --git a/core/base/src/main/java/com/sadellie/unitto/core/base/KeypadSymbols.kt b/core/base/src/main/java/com/sadellie/unitto/core/base/KeypadSymbols.kt deleted file mode 100644 index 6ce7e6bd..00000000 --- a/core/base/src/main/java/com/sadellie/unitto/core/base/KeypadSymbols.kt +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Unitto is a unit converter for Android - * Copyright (c) 2022-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.core.base - -const val KEY_1 = "1" -const val KEY_2 = "2" -const val KEY_3 = "3" -const val KEY_4 = "4" -const val KEY_5 = "5" -const val KEY_6 = "6" -const val KEY_7 = "7" -const val KEY_8 = "8" -const val KEY_9 = "9" -const val KEY_0 = "0" - -const val KEY_BASE_A = "A" -const val KEY_BASE_B = "B" -const val KEY_BASE_C = "C" -const val KEY_BASE_D = "D" -const val KEY_BASE_E = "E" -const val KEY_BASE_F = "F" - -const val KEY_DOT = "." -const val KEY_COMMA = "," -const val KEY_E = "E" -const val KEY_PLUS = "+" - -const val KEY_MINUS = "-" -const val KEY_MINUS_DISPLAY = "–" - -const val KEY_DIVIDE = "/" -const val KEY_DIVIDE_DISPLAY = "÷" - -const val KEY_MULTIPLY = "*" -const val KEY_MULTIPLY_DISPLAY = "×" - -const val KEY_LEFT_BRACKET = "(" -const val KEY_RIGHT_BRACKET = ")" -const val KEY_EXPONENT = "^" -const val KEY_SQRT = "√" -const val KEY_PI = "π" -const val KEY_FACTORIAL = "!" -const val KEY_SIN = "sin(" -const val KEY_COS = "cos(" -const val KEY_TAN = "tan(" -const val KEY_E_SMALL = "e" -const val KEY_MODULO = "#" -const val KEY_LN = "ln(" -const val KEY_LOG = "log(" -const val KEY_PERCENT = "%" - -val OPERATORS by lazy { - listOf( - KEY_PLUS, - KEY_MINUS, - KEY_MINUS_DISPLAY, - KEY_MULTIPLY, - KEY_MULTIPLY_DISPLAY, - KEY_DIVIDE, - KEY_DIVIDE_DISPLAY, - KEY_SQRT, - KEY_EXPONENT, - ) -} - -val DIGITS by lazy { - listOf( - KEY_1, - KEY_2, - KEY_3, - KEY_4, - KEY_5, - KEY_6, - KEY_7, - KEY_8, - KEY_9, - KEY_0, - ) -} - -val INTERNAL_DISPLAY: Map = hashMapOf( - KEY_MINUS to KEY_MINUS_DISPLAY, - KEY_MULTIPLY to KEY_MULTIPLY_DISPLAY, - KEY_DIVIDE to KEY_DIVIDE_DISPLAY -) \ No newline at end of file diff --git a/core/base/src/main/java/com/sadellie/unitto/core/base/Token.kt b/core/base/src/main/java/com/sadellie/unitto/core/base/Token.kt new file mode 100644 index 00000000..79466798 --- /dev/null +++ b/core/base/src/main/java/com/sadellie/unitto/core/base/Token.kt @@ -0,0 +1,117 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2022-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.core.base + +object Token { + const val _1 = "1" + const val _2 = "2" + const val _3 = "3" + const val _4 = "4" + const val _5 = "5" + const val _6 = "6" + const val _7 = "7" + const val _8 = "8" + const val _9 = "9" + const val _0 = "0" + + const val baseA = "A" + const val baseB = "B" + const val baseC = "C" + const val baseD = "D" + const val baseE = "E" + const val baseF = "F" + + const val dot = "." + const val comma = "," + const val E = "E" + + const val plus = "+" + const val minus = "-" + const val minusDisplay = "–" + + const val divide = "/" + const val divideDisplay = "÷" + + const val multiply = "*" + const val multiplyDisplay = "×" + + const val leftBracket = "(" + const val rightBracket = ")" + const val exponent = "^" + const val sqrt = "√" + const val pi = "π" + const val factorial = "!" + const val sin = "sin(" + const val cos = "cos(" + const val tan = "tan(" + const val e = "e" + const val modulo = "#" + const val ln = "ln(" + const val log = "log(" + const val percent = "%" + + val operators by lazy { + listOf( + plus, + minus, + minusDisplay, + multiply, + multiplyDisplay, + divide, + divideDisplay, + sqrt, + exponent, + ) + } + + val digits by lazy { + listOf( + _1, + _2, + _3, + _4, + _5, + _6, + _7, + _8, + _9, + _0, + ) + } + + val internalToDisplay: Map = hashMapOf( + minus to minusDisplay, + multiply to multiplyDisplay, + divide to divideDisplay + ) + + val knownSymbols: List by lazy { + listOf( + sin, cos, tan, ln, log, + leftBracket, rightBracket, + exponent, sqrt, factorial, + modulo, e, percent, pi, + multiply, multiplyDisplay, + plus, minus, minusDisplay, divide, divideDisplay, + baseA, baseB, baseC, baseD, baseE, baseF, + _1, _2, _3, _4, _5, _6, _7, _8, _9, _0, + dot + ) + } +} diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt index 08912bdd..ac51abdb 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt @@ -20,12 +20,7 @@ package com.sadellie.unitto.core.ui import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.sadellie.unitto.core.base.INTERNAL_DISPLAY -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_COMMA -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_E -import com.sadellie.unitto.core.base.KEY_MINUS +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.base.Separator import java.math.BigDecimal import java.math.RoundingMode @@ -51,7 +46,7 @@ open class UnittoFormatter { /** * Fractional part separator. */ - var fractional = KEY_COMMA + var fractional = Token.comma private val timeDivisions by lazy { mapOf( @@ -77,7 +72,7 @@ open class UnittoFormatter { Separator.COMMA -> COMMA else -> SPACE } - fractional = if (separator == Separator.PERIOD) KEY_COMMA else KEY_DOT + fractional = if (separator == Separator.PERIOD) Token.comma else Token.dot } /** @@ -92,7 +87,7 @@ open class UnittoFormatter { */ fun format(input: String): String { // Don't do anything to engineering string. - if (input.contains(KEY_E)) return input.replace(KEY_DOT, fractional) + if (input.contains(Token.E)) return input.replace(Token.dot, fractional) var output = input @@ -103,7 +98,7 @@ open class UnittoFormatter { output = output.replace(it, formatNumber(it)) } - INTERNAL_DISPLAY.forEach { + Token.internalToDisplay.forEach { output = output.replace(it.key, it.value) } @@ -134,7 +129,7 @@ open class UnittoFormatter { Separator.COMMA -> COMMA else -> SPACE } - val sFractional = if (separator == Separator.PERIOD) KEY_COMMA else KEY_DOT + val sFractional = if (separator == Separator.PERIOD) Token.comma else Token.dot return input .replace(sGrouping, grouping) @@ -144,7 +139,7 @@ open class UnittoFormatter { fun removeFormat(input: String): String { return input .replace(grouping, "") - .replace(fractional, KEY_DOT) + .replace(fractional, Token.dot) } /** @@ -182,25 +177,25 @@ open class UnittoFormatter { */ @Composable fun formatTime(input: String, basicUnit: BigDecimal?): String { - if (basicUnit == null) return KEY_0 + if (basicUnit == null) return Token._0 try { // Don't need magic if the input is zero - if (BigDecimal(input).compareTo(BigDecimal.ZERO) == 0) return KEY_0 + if (BigDecimal(input).compareTo(BigDecimal.ZERO) == 0) return Token._0 } catch (e: NumberFormatException) { // For case such as "10-" and "(" - return KEY_0 + return Token._0 } // Attoseconds don't need "magic" if (basicUnit.compareTo(BigDecimal.ONE) == 0) return formatNumber(input) - var result = if (input.startsWith(KEY_MINUS)) KEY_MINUS else "" + var result = if (input.startsWith(Token.minus)) Token.minus else "" var remainingSeconds = BigDecimal(input) .abs() .multiply(basicUnit) .setScale(0, RoundingMode.HALF_EVEN) - if (remainingSeconds.compareTo(BigDecimal.ZERO) == 0) return KEY_0 + if (remainingSeconds.compareTo(BigDecimal.ZERO) == 0) return Token._0 timeDivisions.forEach { (timeStr, divider) -> val division = remainingSeconds.divideAndRemainder(divider) diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt index b612ae7c..f7342311 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt @@ -20,10 +20,7 @@ package com.sadellie.unitto.feature.calculator import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_MINUS -import com.sadellie.unitto.core.base.KEY_MINUS_DISPLAY -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.data.calculator.CalculatorHistoryRepository import com.sadellie.unitto.data.common.setMinimumRequiredScale import com.sadellie.unitto.data.common.toStringWith @@ -44,8 +41,8 @@ import kotlinx.coroutines.launch import org.mariuszgromada.math.mxparser.Expression import java.math.BigDecimal import javax.inject.Inject -import org.mariuszgromada.math.mxparser.mXparser as MathParser import org.mariuszgromada.math.mxparser.License as MathParserLicense +import org.mariuszgromada.math.mxparser.mXparser as MathParser @HiltViewModel internal class CalculatorViewModel @Inject constructor( @@ -169,11 +166,11 @@ internal class CalculatorViewModel @Inject constructor( */ private val String.clean: String get() { - val leftBrackets = count { it.toString() == KEY_LEFT_BRACKET } - val rightBrackets = count { it.toString() == KEY_RIGHT_BRACKET } + val leftBrackets = count { it.toString() == Token.leftBracket } + val rightBrackets = count { it.toString() == Token.rightBracket } val neededBrackets = leftBrackets - rightBrackets - return replace(KEY_MINUS_DISPLAY, KEY_MINUS) - .plus(KEY_RIGHT_BRACKET.repeat(neededBrackets.coerceAtLeast(0))) + return replace(Token.minusDisplay, Token.minus) + .plus(Token.rightBracket.repeat(neededBrackets.coerceAtLeast(0))) } init { diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt index ffb3bdef..2ae1fee1 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt @@ -20,44 +20,7 @@ package com.sadellie.unitto.feature.calculator import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 -import com.sadellie.unitto.core.base.KEY_BASE_A -import com.sadellie.unitto.core.base.KEY_BASE_B -import com.sadellie.unitto.core.base.KEY_BASE_C -import com.sadellie.unitto.core.base.KEY_BASE_D -import com.sadellie.unitto.core.base.KEY_BASE_E -import com.sadellie.unitto.core.base.KEY_BASE_F -import com.sadellie.unitto.core.base.KEY_COS -import com.sadellie.unitto.core.base.KEY_DIVIDE -import com.sadellie.unitto.core.base.KEY_DIVIDE_DISPLAY -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_EXPONENT -import com.sadellie.unitto.core.base.KEY_E_SMALL -import com.sadellie.unitto.core.base.KEY_FACTORIAL -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_LN -import com.sadellie.unitto.core.base.KEY_LOG -import com.sadellie.unitto.core.base.KEY_MINUS -import com.sadellie.unitto.core.base.KEY_MINUS_DISPLAY -import com.sadellie.unitto.core.base.KEY_MODULO -import com.sadellie.unitto.core.base.KEY_MULTIPLY -import com.sadellie.unitto.core.base.KEY_MULTIPLY_DISPLAY -import com.sadellie.unitto.core.base.KEY_PERCENT -import com.sadellie.unitto.core.base.KEY_PI -import com.sadellie.unitto.core.base.KEY_PLUS -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.core.base.KEY_SIN -import com.sadellie.unitto.core.base.KEY_SQRT -import com.sadellie.unitto.core.base.KEY_TAN +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.base.Separator import com.sadellie.unitto.core.ui.UnittoFormatter import kotlinx.coroutines.flow.MutableStateFlow @@ -80,20 +43,6 @@ class TextFieldController @Inject constructor() { private val cursorFixer by lazy { CursorFixer() } - private val knownSymbols: List by lazy { - listOf( - KEY_SIN, KEY_COS, KEY_TAN, KEY_LN, KEY_LOG, - KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, - KEY_EXPONENT, KEY_SQRT, KEY_FACTORIAL, - KEY_MODULO, KEY_E_SMALL, KEY_PERCENT, KEY_PI, - KEY_MULTIPLY, KEY_MULTIPLY_DISPLAY, - KEY_PLUS, KEY_MINUS, KEY_MINUS_DISPLAY, KEY_DIVIDE, KEY_DIVIDE_DISPLAY, - KEY_BASE_A, KEY_BASE_B, KEY_BASE_C, KEY_BASE_D, KEY_BASE_E, KEY_BASE_F, - KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, - KEY_DOT, - ) - } - fun addToInput(symbols: String) { val text = input.value.text @@ -175,7 +124,7 @@ class TextFieldController @Inject constructor() { fun inputTextWithoutFormatting() = input.value.text .replace(localFormatter.grouping, "") - .replace(localFormatter.fractional, KEY_DOT) + .replace(localFormatter.fractional, Token.dot) private fun String.fixFormat(): String = localFormatter.reFormat(this) @@ -184,7 +133,7 @@ class TextFieldController @Inject constructor() { var garbage = clearStr // String with unknown symbols - knownSymbols.forEach { + Token.knownSymbols.forEach { garbage = garbage.replace(it, " ") } @@ -194,17 +143,21 @@ class TextFieldController @Inject constructor() { } clearStr = clearStr - .replace(KEY_DIVIDE, KEY_DIVIDE_DISPLAY) - .replace(KEY_MULTIPLY, KEY_MULTIPLY_DISPLAY) - .replace(KEY_MINUS, KEY_MINUS_DISPLAY) + .replace(Token.divide, Token.divideDisplay) + .replace(Token.multiply, Token.multiplyDisplay) + .replace(Token.minus, Token.minusDisplay) return clearStr } inner class CursorFixer { - val illegalTokens by lazy { + private val illegalTokens by lazy { listOf( - KEY_COS, KEY_SIN, KEY_LN, KEY_LOG, KEY_TAN + Token.cos, + Token.sin, + Token.ln, + Token.log, + Token.tan ) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/CalculatorKeyboard.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/CalculatorKeyboard.kt index 114278b6..c51c5bad 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/CalculatorKeyboard.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/CalculatorKeyboard.kt @@ -46,35 +46,7 @@ import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 -import com.sadellie.unitto.core.base.KEY_COS -import com.sadellie.unitto.core.base.KEY_DIVIDE_DISPLAY -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_EXPONENT -import com.sadellie.unitto.core.base.KEY_E_SMALL -import com.sadellie.unitto.core.base.KEY_FACTORIAL -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_LN -import com.sadellie.unitto.core.base.KEY_LOG -import com.sadellie.unitto.core.base.KEY_MINUS_DISPLAY -import com.sadellie.unitto.core.base.KEY_MODULO -import com.sadellie.unitto.core.base.KEY_MULTIPLY_DISPLAY -import com.sadellie.unitto.core.base.KEY_PERCENT -import com.sadellie.unitto.core.base.KEY_PI -import com.sadellie.unitto.core.base.KEY_PLUS -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.core.base.KEY_SIN -import com.sadellie.unitto.core.base.KEY_SQRT -import com.sadellie.unitto.core.base.KEY_TAN +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.Formatter import com.sadellie.unitto.core.ui.common.KeyboardButtonAdditional import com.sadellie.unitto.core.ui.common.KeyboardButtonFilled @@ -163,7 +135,7 @@ private fun PortraitKeyboard( clearSymbols: () -> Unit, evaluate: () -> Unit ) { - val fractionalIcon = remember { if (Formatter.fractional == KEY_DOT) UnittoIcons.Dot else UnittoIcons.Comma } + val fractionalIcon = remember { if (Formatter.fractional == Token.dot) UnittoIcons.Dot else UnittoIcons.Comma } var showAdditional: Boolean by remember { mutableStateOf(false) } val expandRotation: Float by animateFloatAsState( targetValue = if (showAdditional) 0f else 180f, @@ -190,24 +162,24 @@ private fun PortraitKeyboard( // Additional buttons Column(modifier = weightModifier) { Row(Modifier, horizontalArrangement = Arrangement.spacedBy(2.dp)) { - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.SquareRoot, allowVibration) { addSymbol(KEY_SQRT) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Pi, allowVibration) { addSymbol(KEY_PI) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Exponent, allowVibration) { addSymbol(KEY_EXPONENT) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Factorial, allowVibration) { addSymbol(KEY_FACTORIAL) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.SquareRoot, allowVibration) { addSymbol(Token.sqrt) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Pi, allowVibration) { addSymbol(Token.pi) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Exponent, allowVibration) { addSymbol(Token.exponent) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Factorial, allowVibration) { addSymbol(Token.factorial) } } AnimatedVisibility(visible = showAdditional) { Column { Row(Modifier, horizontalArrangement = Arrangement.spacedBy(2.dp)) { KeyboardButtonAdditional(additionalButtonModifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Sin, allowVibration) { addSymbol(KEY_SIN) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Cos, allowVibration) { addSymbol(KEY_COS) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Tan, allowVibration) { addSymbol(KEY_TAN) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Sin, allowVibration) { addSymbol(Token.sin) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Cos, allowVibration) { addSymbol(Token.cos) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Tan, allowVibration) { addSymbol(Token.tan) } } Row(Modifier, horizontalArrangement = Arrangement.spacedBy(2.dp)) { - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Modulo, allowVibration) { addSymbol(KEY_MODULO) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.E, allowVibration) { addSymbol(KEY_E_SMALL) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Ln, allowVibration) { addSymbol(KEY_LN) } - KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Log, allowVibration) { addSymbol(KEY_LOG) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Modulo, allowVibration) { addSymbol(Token.modulo) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.E, allowVibration) { addSymbol(Token.e) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Ln, allowVibration) { addSymbol(Token.ln) } + KeyboardButtonAdditional(additionalButtonModifier, UnittoIcons.Log, allowVibration) { addSymbol(Token.log) } } } } @@ -222,33 +194,33 @@ private fun PortraitKeyboard( } Row(weightModifier) { - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.LeftBracket, allowVibration) { addSymbol(KEY_LEFT_BRACKET) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.RightBracket, allowVibration) { addSymbol(KEY_RIGHT_BRACKET) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Percent, allowVibration) { addSymbol(KEY_PERCENT) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Divide, allowVibration) { addSymbol(KEY_DIVIDE_DISPLAY) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.LeftBracket, allowVibration) { addSymbol(Token.leftBracket) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.RightBracket, allowVibration) { addSymbol(Token.rightBracket) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Percent, allowVibration) { addSymbol(Token.percent) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Divide, allowVibration) { addSymbol(Token.divideDisplay) } } Row(weightModifier) { - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key7, allowVibration) { addSymbol(KEY_7) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key8, allowVibration) { addSymbol(KEY_8) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key9, allowVibration) { addSymbol(KEY_9) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Multiply, allowVibration) { addSymbol(KEY_MULTIPLY_DISPLAY) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key7, allowVibration) { addSymbol(Token._7) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key8, allowVibration) { addSymbol(Token._8) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key9, allowVibration) { addSymbol(Token._9) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Multiply, allowVibration) { addSymbol(Token.multiplyDisplay) } } Row(weightModifier) { - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key4, allowVibration) { addSymbol(KEY_4) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key5, allowVibration) { addSymbol(KEY_5) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key6, allowVibration) { addSymbol(KEY_6) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Minus, allowVibration) { addSymbol(KEY_MINUS_DISPLAY) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key4, allowVibration) { addSymbol(Token._4) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key5, allowVibration) { addSymbol(Token._5) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key6, allowVibration) { addSymbol(Token._6) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Minus, allowVibration) { addSymbol(Token.minusDisplay) } } Row(weightModifier) { - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key1, allowVibration) { addSymbol(KEY_1) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key2, allowVibration) { addSymbol(KEY_2) } - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key3, allowVibration) { addSymbol(KEY_3) } - KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Plus, allowVibration) { addSymbol(KEY_PLUS) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key1, allowVibration) { addSymbol(Token._1) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key2, allowVibration) { addSymbol(Token._2) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key3, allowVibration) { addSymbol(Token._3) } + KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Plus, allowVibration) { addSymbol(Token.plus) } } Row(weightModifier) { - KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(KEY_0) } - KeyboardButtonLight(mainButtonModifier, fractionalIcon, allowVibration) { addSymbol(KEY_DOT) } + KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token._0) } + KeyboardButtonLight(mainButtonModifier, fractionalIcon, allowVibration) { addSymbol(Token.dot) } KeyboardButtonLight(mainButtonModifier, UnittoIcons.Delete, allowVibration, clearSymbols) { deleteSymbol() } KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Equal, allowVibration) { evaluate() } } @@ -266,52 +238,52 @@ private fun LandscapeKeyboard( clearSymbols: () -> Unit, evaluate: () -> Unit ) { - val fractionalIcon = remember { if (Formatter.fractional == KEY_DOT) UnittoIcons.Dot else UnittoIcons.Comma } + val fractionalIcon = remember { if (Formatter.fractional == Token.dot) UnittoIcons.Dot else UnittoIcons.Comma } Column(modifier = modifier) { val buttonModifier = Modifier.weight(1f).padding(2.dp) Row(Modifier.weight(1f)) { KeyboardButtonAdditional(buttonModifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.SquareRoot, allowVibration) { addSymbol(KEY_SQRT) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Pi, allowVibration) { addSymbol(KEY_PI) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.SquareRoot, allowVibration) { addSymbol(Token.sqrt) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Pi, allowVibration) { addSymbol(Token.pi) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key7, allowVibration) { addSymbol(KEY_7) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key8, allowVibration) { addSymbol(KEY_8) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key9, allowVibration) { addSymbol(KEY_9) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.LeftBracket, allowVibration) { addSymbol(KEY_LEFT_BRACKET) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.RightBracket, allowVibration) { addSymbol(KEY_RIGHT_BRACKET) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key7, allowVibration) { addSymbol(Token._7) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key8, allowVibration) { addSymbol(Token._8) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key9, allowVibration) { addSymbol(Token._9) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.LeftBracket, allowVibration) { addSymbol(Token.leftBracket) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.RightBracket, allowVibration) { addSymbol(Token.rightBracket) } } Row(Modifier.weight(1f)) { - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Modulo, allowVibration) { addSymbol(KEY_MODULO) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Exponent, allowVibration) { addSymbol(KEY_EXPONENT) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Factorial, allowVibration) { addSymbol(KEY_FACTORIAL) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Modulo, allowVibration) { addSymbol(Token.modulo) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Exponent, allowVibration) { addSymbol(Token.exponent) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Factorial, allowVibration) { addSymbol(Token.factorial) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key4, allowVibration) { addSymbol(KEY_4) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key5, allowVibration) { addSymbol(KEY_5) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key6, allowVibration) { addSymbol(KEY_6) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.Multiply, allowVibration) { addSymbol(KEY_MULTIPLY_DISPLAY) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.Divide, allowVibration) { addSymbol(KEY_DIVIDE_DISPLAY) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key4, allowVibration) { addSymbol(Token._4) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key5, allowVibration) { addSymbol(Token._5) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key6, allowVibration) { addSymbol(Token._6) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.Multiply, allowVibration) { addSymbol(Token.multiplyDisplay) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.Divide, allowVibration) { addSymbol(Token.divideDisplay) } } Row(Modifier.weight(1f)) { - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Sin, allowVibration) { addSymbol(KEY_SIN) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Cos, allowVibration) { addSymbol(KEY_COS) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Tan, allowVibration) { addSymbol(KEY_TAN) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Sin, allowVibration) { addSymbol(Token.sin) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Cos, allowVibration) { addSymbol(Token.cos) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Tan, allowVibration) { addSymbol(Token.tan) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key1, allowVibration) { addSymbol(KEY_1) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key2, allowVibration) { addSymbol(KEY_2) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key3, allowVibration) { addSymbol(KEY_3) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.Minus, allowVibration) { addSymbol(KEY_MINUS_DISPLAY) } - KeyboardButtonFilled(buttonModifier, UnittoIcons.Percent, allowVibration) { addSymbol(KEY_PERCENT) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key1, allowVibration) { addSymbol(Token._1) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key2, allowVibration) { addSymbol(Token._2) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key3, allowVibration) { addSymbol(Token._3) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.Minus, allowVibration) { addSymbol(Token.minusDisplay) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.Percent, allowVibration) { addSymbol(Token.percent) } } Row(Modifier.weight(1f)) { - KeyboardButtonAdditional(buttonModifier, UnittoIcons.E, allowVibration) { addSymbol(KEY_E_SMALL) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Ln, allowVibration) { addSymbol(KEY_LN) } - KeyboardButtonAdditional(buttonModifier, UnittoIcons.Log, allowVibration) { addSymbol(KEY_LOG) } - KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(KEY_0) } - KeyboardButtonLight(buttonModifier, fractionalIcon, allowVibration) { addSymbol(KEY_DOT) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.E, allowVibration) { addSymbol(Token.e) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Ln, allowVibration) { addSymbol(Token.ln) } + KeyboardButtonAdditional(buttonModifier, UnittoIcons.Log, allowVibration) { addSymbol(Token.log) } + KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, allowVibration) { addSymbol(Token.dot) } KeyboardButtonLight(buttonModifier, UnittoIcons.Delete, allowVibration, clearSymbols) { deleteSymbol() } - KeyboardButtonFilled(buttonModifier, UnittoIcons.Plus, allowVibration) { addSymbol(KEY_PLUS) } + KeyboardButtonFilled(buttonModifier, UnittoIcons.Plus, allowVibration) { addSymbol(Token.plus) } KeyboardButtonFilled(buttonModifier, UnittoIcons.Equal, allowVibration) { evaluate() } } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt index 89c10bc3..72fbe3b5 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt @@ -50,7 +50,7 @@ internal fun InputTextField( derivedStateOf { value.copy( // We replace this because internally input value is already formatted, but uses - // COMMA as separator. + // comma as separator. Formatter.fromSeparator(value.text, Separator.COMMA) ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt index 185f7752..6ba34cd6 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt @@ -18,7 +18,7 @@ package com.sadellie.unitto.feature.converter -import com.sadellie.unitto.core.base.KEY_0 +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.data.model.AbstractUnit /** @@ -37,9 +37,9 @@ import com.sadellie.unitto.data.model.AbstractUnit * @property allowVibration When true will vibrate on button clicks. */ data class ConverterUIState( - val inputValue: String = KEY_0, + val inputValue: String = Token._0, val calculatedValue: String? = null, - val resultValue: String = KEY_0, + val resultValue: String = Token._0, val showLoading: Boolean = true, val showError: Boolean = false, val unitFrom: AbstractUnit? = null, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt index 4336cd8b..adfa06f8 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt @@ -22,27 +22,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.keelar.exprk.ExpressionException import com.github.keelar.exprk.Expressions -import com.sadellie.unitto.core.base.DIGITS -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 -import com.sadellie.unitto.core.base.KEY_DIVIDE -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_EXPONENT -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_MINUS -import com.sadellie.unitto.core.base.KEY_MULTIPLY -import com.sadellie.unitto.core.base.KEY_PLUS -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.core.base.KEY_SQRT -import com.sadellie.unitto.core.base.OPERATORS +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.data.common.setMinimumRequiredScale import com.sadellie.unitto.data.common.toStringWith import com.sadellie.unitto.data.common.trimZeros @@ -103,7 +83,7 @@ class ConverterViewModel @Inject constructor( /** * Current input. Used when converting units. */ - private val _input: MutableStateFlow = MutableStateFlow(KEY_0) + private val _input: MutableStateFlow = MutableStateFlow(Token._0) /** * Calculation result. Null when [_input] is not an expression. @@ -118,7 +98,7 @@ class ConverterViewModel @Inject constructor( /** * Conversion result. */ - private val _result: MutableStateFlow = MutableStateFlow(KEY_0) + private val _result: MutableStateFlow = MutableStateFlow(Token._0) /** * True when loading something from network. @@ -180,23 +160,23 @@ class ConverterViewModel @Inject constructor( val lastSecondSymbol: String? = lastTwoSymbols.getOrNull(0) when (symbolToAdd) { - KEY_PLUS, KEY_DIVIDE, KEY_MULTIPLY, KEY_EXPONENT -> { + Token.plus, Token.divide, Token.multiply, Token.exponent -> { when { // Don't need expressions that start with zero - (_input.value == KEY_0) -> {} - (_input.value == KEY_MINUS) -> {} - (lastSymbol == KEY_LEFT_BRACKET) -> {} - (lastSymbol == KEY_SQRT) -> {} + (_input.value == Token._0) -> {} + (_input.value == Token.minus) -> {} + (lastSymbol == Token.leftBracket) -> {} + (lastSymbol == Token.sqrt) -> {} /** * For situations like "50+-", when user clicks "/" we delete "-" so it becomes * "50+". We don't add "/' here. User will click "/" second time and the input * will be "50/". */ - (lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_MINUS) -> { + (lastSecondSymbol in Token.operators) and (lastSymbol == Token.minus) -> { deleteDigit() } // Don't allow multiple operators near each other - (lastSymbol in OPERATORS) -> { + (lastSymbol in Token.operators) -> { deleteDigit() setInputSymbols(symbolToAdd) } @@ -205,29 +185,30 @@ class ConverterViewModel @Inject constructor( } } } - KEY_0 -> { + Token._0 -> { when { // Don't add zero if the input is already a zero - (_input.value == KEY_0) -> {} - (lastSymbol == KEY_RIGHT_BRACKET) -> { - processInput(KEY_MULTIPLY) + (_input.value == Token._0) -> {} + (lastSymbol == Token.rightBracket) -> { + processInput(Token.multiply) setInputSymbols(symbolToAdd) } // Prevents things like "-00" and "4+000" - ((lastSecondSymbol in OPERATORS + KEY_LEFT_BRACKET) and (lastSymbol == KEY_0)) -> {} + ((lastSecondSymbol in Token.operators + Token.leftBracket) and (lastSymbol == Token._0)) -> {} else -> { setInputSymbols(symbolToAdd) } } } - KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 -> { + Token._1, Token._2, Token._3, Token._4, Token._5, + Token._6, Token._7, Token._8, Token._9 -> { // Replace single zero (default input) if it's here when { - (_input.value == KEY_0) -> { + (_input.value == Token._0) -> { setInputSymbols(symbolToAdd, false) } - (lastSymbol == KEY_RIGHT_BRACKET) -> { - processInput(KEY_MULTIPLY) + (lastSymbol == Token.rightBracket) -> { + processInput(Token.multiply) setInputSymbols(symbolToAdd) } else -> { @@ -235,16 +216,16 @@ class ConverterViewModel @Inject constructor( } } } - KEY_MINUS -> { + Token.minus -> { when { // Replace single zero with minus (to support negative numbers) - (_input.value == KEY_0) -> { + (_input.value == Token._0) -> { setInputSymbols(symbolToAdd, false) } // Don't allow multiple minuses near each other - (lastSymbol.compareTo(KEY_MINUS) == 0) -> {} + (lastSymbol.compareTo(Token.minus) == 0) -> {} // Don't allow plus and minus be near each other - (lastSymbol == KEY_PLUS) -> { + (lastSymbol == Token.plus) -> { deleteDigit() setInputSymbols(symbolToAdd) } @@ -253,22 +234,22 @@ class ConverterViewModel @Inject constructor( } } } - KEY_DOT -> { + Token.dot -> { if (!_input.value - .takeLastWhile { it.toString() !in OPERATORS.minus(KEY_DOT) } - .contains(KEY_DOT) + .takeLastWhile { it.toString() !in Token.operators.minus(Token.dot) } + .contains(Token.dot) ) { setInputSymbols(symbolToAdd) } } - KEY_LEFT_BRACKET -> { + Token.leftBracket -> { when { // Replace single zero with minus (to support negative numbers) - (_input.value == KEY_0) -> { + (_input.value == Token._0) -> { setInputSymbols(symbolToAdd, false) } - (lastSymbol == KEY_RIGHT_BRACKET) || (lastSymbol in DIGITS) || (lastSymbol == KEY_DOT) -> { - processInput(KEY_MULTIPLY) + (lastSymbol == Token.rightBracket) || (lastSymbol in Token.digits) || (lastSymbol == Token.dot) -> { + processInput(Token.multiply) setInputSymbols(symbolToAdd) } else -> { @@ -276,14 +257,14 @@ class ConverterViewModel @Inject constructor( } } } - KEY_RIGHT_BRACKET -> { + Token.rightBracket -> { when { // Replace single zero with minus (to support negative numbers) - (_input.value == KEY_0) -> {} - (lastSymbol == KEY_LEFT_BRACKET) -> {} + (_input.value == Token._0) -> {} + (lastSymbol == Token.leftBracket) -> {} ( - _latestInputStack.filter { it == KEY_LEFT_BRACKET }.size == - _latestInputStack.filter { it == KEY_RIGHT_BRACKET }.size + _latestInputStack.filter { it == Token.leftBracket }.size == + _latestInputStack.filter { it == Token.rightBracket }.size ) -> { } else -> { @@ -291,14 +272,14 @@ class ConverterViewModel @Inject constructor( } } } - KEY_SQRT -> { + Token.sqrt -> { when { // Replace single zero with minus (to support negative numbers) - (_input.value == KEY_0) -> { + (_input.value == Token._0) -> { setInputSymbols(symbolToAdd, false) } - (lastSymbol == KEY_RIGHT_BRACKET) || (lastSymbol in DIGITS) || (lastSymbol == KEY_DOT) -> { - processInput(KEY_MULTIPLY) + (lastSymbol == Token.rightBracket) || (lastSymbol in Token.digits) || (lastSymbol == Token.dot) -> { + processInput(Token.multiply) setInputSymbols(symbolToAdd) } else -> { @@ -309,7 +290,7 @@ class ConverterViewModel @Inject constructor( else -> { when { // Replace single zero with minus (to support negative numbers) - (_input.value == KEY_0) -> { + (_input.value == Token._0) -> { setInputSymbols(symbolToAdd, false) } else -> { @@ -373,13 +354,13 @@ class ConverterViewModel @Inject constructor( */ fun deleteDigit() { // Default input, don't delete - if (_input.value == KEY_0) return + if (_input.value == Token._0) return val lastSymbol = _latestInputStack.removeLast() // If this value are same, it means that after deleting there will be no symbols left, set to default if (lastSymbol == _input.value) { - setInputSymbols(KEY_0, false) + setInputSymbols(Token._0, false) } else { _input.update { it.removeSuffix(lastSymbol) } } @@ -389,7 +370,7 @@ class ConverterViewModel @Inject constructor( * Clear [_input]. */ fun clearInput() { - setInputSymbols(KEY_0, false) + setInputSymbols(Token._0, false) } fun toggleFormatTime() { @@ -438,10 +419,10 @@ class ConverterViewModel @Inject constructor( // Now we close open brackets that user didn't close // AUTOCLOSE ALL BRACKETS - val leftBrackets = _input.value.count { it.toString() == KEY_LEFT_BRACKET } - val rightBrackets = _input.value.count { it.toString() == KEY_RIGHT_BRACKET } + val leftBrackets = _input.value.count { it.toString() == Token.leftBracket } + val rightBrackets = _input.value.count { it.toString() == Token.rightBracket } val neededBrackets = leftBrackets - rightBrackets - if (neededBrackets > 0) cleanInput += KEY_RIGHT_BRACKET.repeat(neededBrackets) + if (neededBrackets > 0) cleanInput += Token.rightBracket.repeat(neededBrackets) // Now we evaluate expression in input val evaluationResult: BigDecimal = try { @@ -466,7 +447,7 @@ class ConverterViewModel @Inject constructor( // 123.456 will be true // -123.456 will be true // -123.456-123 will be false (first minus gets removed, ending with 123.456) - if (_input.value.removePrefix(KEY_MINUS).all { it.toString() !in OPERATORS }) { + if (_input.value.removePrefix(Token.minus).all { it.toString() !in Token.operators }) { // No operators _calculated.update { null } } else { diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/Keyboard.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/Keyboard.kt index a13d0a70..aa33b395 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/Keyboard.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/Keyboard.kt @@ -27,31 +27,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 -import com.sadellie.unitto.core.base.KEY_BASE_A -import com.sadellie.unitto.core.base.KEY_BASE_B -import com.sadellie.unitto.core.base.KEY_BASE_C -import com.sadellie.unitto.core.base.KEY_BASE_D -import com.sadellie.unitto.core.base.KEY_BASE_E -import com.sadellie.unitto.core.base.KEY_BASE_F -import com.sadellie.unitto.core.base.KEY_DIVIDE -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_EXPONENT -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_MINUS -import com.sadellie.unitto.core.base.KEY_MULTIPLY -import com.sadellie.unitto.core.base.KEY_PLUS -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.core.base.KEY_SQRT +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.Formatter import com.sadellie.unitto.core.ui.common.KeyboardButtonFilled import com.sadellie.unitto.core.ui.common.KeyboardButtonLight @@ -119,7 +95,7 @@ private fun DefaultKeyboard( deleteDigit: () -> Unit, allowVibration: Boolean ) { - val fractionalIcon = remember { if (Formatter.fractional == KEY_DOT) UnittoIcons.Dot else UnittoIcons.Comma } + val fractionalIcon = remember { if (Formatter.fractional == Token.dot) UnittoIcons.Dot else UnittoIcons.Comma } Column { // Button modifier val bModifier = Modifier @@ -129,34 +105,34 @@ private fun DefaultKeyboard( // Column modifier val cModifier = Modifier.weight(1f) Row(cModifier) { - KeyboardButtonFilled(bModifier, UnittoIcons.LeftBracket, allowVibration) { addDigit(KEY_LEFT_BRACKET) } - KeyboardButtonFilled(bModifier, UnittoIcons.RightBracket, allowVibration) { addDigit(KEY_RIGHT_BRACKET) } - KeyboardButtonFilled(bModifier, UnittoIcons.Exponent, allowVibration) { addDigit(KEY_EXPONENT) } - KeyboardButtonFilled(bModifier, UnittoIcons.SquareRoot, allowVibration) { addDigit(KEY_SQRT) } + KeyboardButtonFilled(bModifier, UnittoIcons.LeftBracket, allowVibration) { addDigit(Token.leftBracket) } + KeyboardButtonFilled(bModifier, UnittoIcons.RightBracket, allowVibration) { addDigit(Token.rightBracket) } + KeyboardButtonFilled(bModifier, UnittoIcons.Exponent, allowVibration) { addDigit(Token.exponent) } + KeyboardButtonFilled(bModifier, UnittoIcons.SquareRoot, allowVibration) { addDigit(Token.sqrt) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key7, allowVibration) { addDigit(KEY_7) } - KeyboardButtonLight(bModifier, UnittoIcons.Key8, allowVibration) { addDigit(KEY_8) } - KeyboardButtonLight(bModifier, UnittoIcons.Key9, allowVibration) { addDigit(KEY_9) } - KeyboardButtonFilled(bModifier, UnittoIcons.Divide, allowVibration) { addDigit(KEY_DIVIDE) } + KeyboardButtonLight(bModifier, UnittoIcons.Key7, allowVibration) { addDigit(Token._7) } + KeyboardButtonLight(bModifier, UnittoIcons.Key8, allowVibration) { addDigit(Token._8) } + KeyboardButtonLight(bModifier, UnittoIcons.Key9, allowVibration) { addDigit(Token._9) } + KeyboardButtonFilled(bModifier, UnittoIcons.Divide, allowVibration) { addDigit(Token.divide) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key4, allowVibration) { addDigit(KEY_4) } - KeyboardButtonLight(bModifier, UnittoIcons.Key5, allowVibration) { addDigit(KEY_5) } - KeyboardButtonLight(bModifier, UnittoIcons.Key6, allowVibration) { addDigit(KEY_6) } - KeyboardButtonFilled(bModifier, UnittoIcons.Multiply, allowVibration) { addDigit(KEY_MULTIPLY) } + KeyboardButtonLight(bModifier, UnittoIcons.Key4, allowVibration) { addDigit(Token._4) } + KeyboardButtonLight(bModifier, UnittoIcons.Key5, allowVibration) { addDigit(Token._5) } + KeyboardButtonLight(bModifier, UnittoIcons.Key6, allowVibration) { addDigit(Token._6) } + KeyboardButtonFilled(bModifier, UnittoIcons.Multiply, allowVibration) { addDigit(Token.multiply) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key1, allowVibration) { addDigit(KEY_1) } - KeyboardButtonLight(bModifier, UnittoIcons.Key2, allowVibration) { addDigit(KEY_2) } - KeyboardButtonLight(bModifier, UnittoIcons.Key3, allowVibration) { addDigit(KEY_3) } - KeyboardButtonFilled(bModifier, UnittoIcons.Minus, allowVibration) { addDigit(KEY_MINUS) } + KeyboardButtonLight(bModifier, UnittoIcons.Key1, allowVibration) { addDigit(Token._1) } + KeyboardButtonLight(bModifier, UnittoIcons.Key2, allowVibration) { addDigit(Token._2) } + KeyboardButtonLight(bModifier, UnittoIcons.Key3, allowVibration) { addDigit(Token._3) } + KeyboardButtonFilled(bModifier, UnittoIcons.Minus, allowVibration) { addDigit(Token.minus) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(KEY_0) } - KeyboardButtonLight(bModifier, fractionalIcon, allowVibration) { addDigit(KEY_DOT) } + KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(Token._0) } + KeyboardButtonLight(bModifier, fractionalIcon, allowVibration) { addDigit(Token.dot) } KeyboardButtonLight(bModifier, UnittoIcons.Delete, allowVibration, clearInput) { deleteDigit() } - KeyboardButtonFilled(bModifier, UnittoIcons.Plus, allowVibration) { addDigit(KEY_PLUS) } + KeyboardButtonFilled(bModifier, UnittoIcons.Plus, allowVibration) { addDigit(Token.plus) } } } } @@ -178,32 +154,32 @@ private fun BaseKeyboard( val cModifier = Modifier.weight(1f) Row(cModifier) { - KeyboardButtonFilled(bModifier, UnittoIcons.KeyA, allowVibration) { addDigit(KEY_BASE_A) } - KeyboardButtonFilled(bModifier, UnittoIcons.KeyB, allowVibration) { addDigit(KEY_BASE_B) } - KeyboardButtonFilled(bModifier, UnittoIcons.KeyC, allowVibration) { addDigit(KEY_BASE_C) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyA, allowVibration) { addDigit(Token.baseA) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyB, allowVibration) { addDigit(Token.baseB) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyC, allowVibration) { addDigit(Token.baseC) } } Row(cModifier) { - KeyboardButtonFilled(bModifier, UnittoIcons.KeyD, allowVibration) { addDigit(KEY_BASE_D) } - KeyboardButtonFilled(bModifier, UnittoIcons.KeyE, allowVibration) { addDigit(KEY_BASE_E) } - KeyboardButtonFilled(bModifier, UnittoIcons.KeyF, allowVibration) { addDigit(KEY_BASE_F) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyD, allowVibration) { addDigit(Token.baseD) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyE, allowVibration) { addDigit(Token.baseE) } + KeyboardButtonFilled(bModifier, UnittoIcons.KeyF, allowVibration) { addDigit(Token.baseF) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key7, allowVibration) { addDigit(KEY_7) } - KeyboardButtonLight(bModifier, UnittoIcons.Key8, allowVibration) { addDigit(KEY_8) } - KeyboardButtonLight(bModifier, UnittoIcons.Key9, allowVibration) { addDigit(KEY_9) } + KeyboardButtonLight(bModifier, UnittoIcons.Key7, allowVibration) { addDigit(Token._7) } + KeyboardButtonLight(bModifier, UnittoIcons.Key8, allowVibration) { addDigit(Token._8) } + KeyboardButtonLight(bModifier, UnittoIcons.Key9, allowVibration) { addDigit(Token._9) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key4, allowVibration) { addDigit(KEY_4) } - KeyboardButtonLight(bModifier, UnittoIcons.Key5, allowVibration) { addDigit(KEY_5) } - KeyboardButtonLight(bModifier, UnittoIcons.Key6, allowVibration) { addDigit(KEY_6) } + KeyboardButtonLight(bModifier, UnittoIcons.Key4, allowVibration) { addDigit(Token._4) } + KeyboardButtonLight(bModifier, UnittoIcons.Key5, allowVibration) { addDigit(Token._5) } + KeyboardButtonLight(bModifier, UnittoIcons.Key6, allowVibration) { addDigit(Token._6) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key1, allowVibration) { addDigit(KEY_1) } - KeyboardButtonLight(bModifier, UnittoIcons.Key2, allowVibration) { addDigit(KEY_2) } - KeyboardButtonLight(bModifier, UnittoIcons.Key3, allowVibration) { addDigit(KEY_3) } + KeyboardButtonLight(bModifier, UnittoIcons.Key1, allowVibration) { addDigit(Token._1) } + KeyboardButtonLight(bModifier, UnittoIcons.Key2, allowVibration) { addDigit(Token._2) } + KeyboardButtonLight(bModifier, UnittoIcons.Key3, allowVibration) { addDigit(Token._3) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(KEY_0) } + KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(Token._0) } KeyboardButtonLight(Modifier.fillMaxSize().weight(2f).padding(4.dp), UnittoIcons.Delete, allowVibration, clearInput) { deleteDigit() } } } diff --git a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt index 77d604a9..013d6ae4 100644 --- a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt +++ b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt @@ -19,29 +19,10 @@ package com.sadellie.unitto.feature.converter import androidx.room.Room -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 -import com.sadellie.unitto.core.base.KEY_COMMA -import com.sadellie.unitto.core.base.KEY_DIVIDE -import com.sadellie.unitto.core.base.KEY_DOT -import com.sadellie.unitto.core.base.KEY_EXPONENT -import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET -import com.sadellie.unitto.core.base.KEY_MINUS -import com.sadellie.unitto.core.base.KEY_MULTIPLY -import com.sadellie.unitto.core.base.KEY_PLUS -import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.core.base.KEY_SQRT -import com.sadellie.unitto.data.units.AllUnitsRepository -import com.sadellie.unitto.data.database.UnittoDatabase +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.data.database.UnitsRepository +import com.sadellie.unitto.data.database.UnittoDatabase +import com.sadellie.unitto.data.units.AllUnitsRepository import com.sadellie.unitto.data.userprefs.DataStoreModule import com.sadellie.unitto.data.userprefs.UserPreferencesRepository import junit.framework.TestCase.assertEquals @@ -201,9 +182,11 @@ class ConverterViewModelTest { } listOf( - KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, - KEY_DOT, KEY_COMMA, KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, - KEY_PLUS, KEY_MINUS, KEY_DIVIDE, KEY_MULTIPLY, KEY_EXPONENT, KEY_SQRT + Token._1, Token._2, Token._3, Token._4, Token._5, + Token._6, Token._7, Token._8, Token._9, Token._0, + Token.dot, Token.comma, Token.leftBracket, Token.rightBracket, + Token.plus, Token.minus, Token.divide, Token.multiply, + Token.exponent, Token.sqrt ).forEach { // We enter one symbol and delete it, should be default as a result viewModel.processInput(it) @@ -216,9 +199,9 @@ class ConverterViewModelTest { viewModel.deleteDigit() // Now we check that we can delete multiple values - viewModel.processInput(KEY_3) - viewModel.processInput(KEY_SQRT) - viewModel.processInput(KEY_9) + viewModel.processInput(Token._3) + viewModel.processInput(Token.sqrt) + viewModel.processInput(Token._9) viewModel.deleteDigit() assertEquals("3*√", viewModel.uiStateFlow.value.inputValue) @@ -231,12 +214,12 @@ class ConverterViewModelTest { viewModel.uiStateFlow.collect() } - viewModel.processInput(KEY_3) + viewModel.processInput(Token._3) viewModel.clearInput() assertEquals(null, viewModel.uiStateFlow.value.calculatedValue) - viewModel.processInput(KEY_3) - viewModel.processInput(KEY_MULTIPLY) + viewModel.processInput(Token._3) + viewModel.processInput(Token.multiply) viewModel.clearInput() assertEquals(null, viewModel.uiStateFlow.value.calculatedValue) diff --git a/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/component/EpochKeyboard.kt b/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/component/EpochKeyboard.kt index 8fedab97..3e4b1753 100644 --- a/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/component/EpochKeyboard.kt +++ b/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/component/EpochKeyboard.kt @@ -25,16 +25,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.core.base.KEY_1 -import com.sadellie.unitto.core.base.KEY_2 -import com.sadellie.unitto.core.base.KEY_3 -import com.sadellie.unitto.core.base.KEY_4 -import com.sadellie.unitto.core.base.KEY_5 -import com.sadellie.unitto.core.base.KEY_6 -import com.sadellie.unitto.core.base.KEY_7 -import com.sadellie.unitto.core.base.KEY_8 -import com.sadellie.unitto.core.base.KEY_9 +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.KeyboardButtonLight import com.sadellie.unitto.core.ui.common.key.UnittoIcons import com.sadellie.unitto.core.ui.common.key.unittoicons.Delete @@ -71,22 +62,22 @@ internal fun EpochKeyboard( .weight(2f) .padding(4.dp) Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key7, false) { addSymbol(KEY_7) } - KeyboardButtonLight(bModifier, UnittoIcons.Key8, false) { addSymbol(KEY_8) } - KeyboardButtonLight(bModifier, UnittoIcons.Key9, false) { addSymbol(KEY_9) } + KeyboardButtonLight(bModifier, UnittoIcons.Key7, false) { addSymbol(Token._7) } + KeyboardButtonLight(bModifier, UnittoIcons.Key8, false) { addSymbol(Token._8) } + KeyboardButtonLight(bModifier, UnittoIcons.Key9, false) { addSymbol(Token._9) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key4, false) { addSymbol(KEY_4) } - KeyboardButtonLight(bModifier, UnittoIcons.Key5, false) { addSymbol(KEY_5) } - KeyboardButtonLight(bModifier, UnittoIcons.Key6, false) { addSymbol(KEY_6) } + KeyboardButtonLight(bModifier, UnittoIcons.Key4, false) { addSymbol(Token._4) } + KeyboardButtonLight(bModifier, UnittoIcons.Key5, false) { addSymbol(Token._5) } + KeyboardButtonLight(bModifier, UnittoIcons.Key6, false) { addSymbol(Token._6) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key1, false) { addSymbol(KEY_1) } - KeyboardButtonLight(bModifier, UnittoIcons.Key2, false) { addSymbol(KEY_2) } - KeyboardButtonLight(bModifier, UnittoIcons.Key3, false) { addSymbol(KEY_3) } + KeyboardButtonLight(bModifier, UnittoIcons.Key1, false) { addSymbol(Token._1) } + KeyboardButtonLight(bModifier, UnittoIcons.Key2, false) { addSymbol(Token._2) } + KeyboardButtonLight(bModifier, UnittoIcons.Key3, false) { addSymbol(Token._3) } } Row(cModifier) { - KeyboardButtonLight(bModifier, UnittoIcons.Key0, false) { addSymbol(KEY_0) } + KeyboardButtonLight(bModifier, UnittoIcons.Key0, false) { addSymbol(Token._0) } KeyboardButtonLight(dModifier, UnittoIcons.Delete, false, clearSymbols) { deleteSymbol() } } }