From b2030ad9dc5860eb065c4cfa91c803914833cef6 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sun, 4 Feb 2024 19:16:10 +0300 Subject: [PATCH 01/46] Remove RPN experiment --- app/src/main/java/com/sadellie/unitto/App.kt | 1 - .../com/sadellie/unitto/UnittoNavigation.kt | 2 - .../sadellie/evaluatto/RPNCalculation.kt | 37 --- .../io/github/sadellie/evaluatto/RPNEngine.kt | 191 ------------- .../sadellie/evaluatto/RPNEngineKtTest.kt | 256 ------------------ .../repository/UserPreferencesRepository.kt | 2 - .../data/model/userprefs/AppPreferences.kt | 1 - .../unitto/data/userprefs/PreferenceExt.kt | 4 - .../unitto/data/userprefs/PreferenceModels.kt | 1 - .../unitto/data/userprefs/PrefsKeys.kt | 2 +- .../unitto/data/userprefs/UserPreferences.kt | 7 - .../unitto/feature/calculator/InputBox.kt | 120 -------- .../calculator/RPNCalculatorKeyboard.kt | 229 ---------------- .../feature/calculator/RPNCalculatorScreen.kt | 134 --------- .../calculator/RPNCalculatorUIState.kt | 36 --- .../calculator/RPNCalculatorViewModel.kt | 118 -------- .../unitto/feature/calculator/RPNInputEdit.kt | 25 -- .../navigation/CalculatorNavigation.kt | 17 +- .../calculator/CalculatorSettingsScreen.kt | 88 ++---- .../calculator/CalculatorSettingsUIState.kt | 29 -- .../calculator/CalculatorSettingsViewModel.kt | 20 +- 21 files changed, 31 insertions(+), 1289 deletions(-) delete mode 100644 data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNCalculation.kt delete mode 100644 data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNEngine.kt delete mode 100644 data/evaluatto/src/test/java/io/github/sadellie/evaluatto/RPNEngineKtTest.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/InputBox.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorKeyboard.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorScreen.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorUIState.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorViewModel.kt delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNInputEdit.kt delete mode 100644 feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsUIState.kt diff --git a/app/src/main/java/com/sadellie/unitto/App.kt b/app/src/main/java/com/sadellie/unitto/App.kt index c6762e63..3b8cf1b0 100644 --- a/app/src/main/java/com/sadellie/unitto/App.kt +++ b/app/src/main/java/com/sadellie/unitto/App.kt @@ -112,7 +112,6 @@ internal fun ComponentActivity.App(prefs: AppPreferences?) { navController = navController, themmoController = it, startDestination = prefs.startingScreen, - rpnMode = prefs.rpnMode, openDrawer = { drawerScope.launch { drawerState.open() } } ) } diff --git a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt index a6bae2ec..43be9a39 100644 --- a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt +++ b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt @@ -42,7 +42,6 @@ internal fun UnittoNavigation( themmoController: ThemmoController, startDestination: String, openDrawer: () -> Unit, - rpnMode: Boolean, ) { NavHost( navController = navController, @@ -65,7 +64,6 @@ internal fun UnittoNavigation( calculatorGraph( openDrawer = openDrawer, - rpnMode = rpnMode, navigateToSettings = navController::navigateToSettings ) diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNCalculation.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNCalculation.kt deleted file mode 100644 index ea6603cc..00000000 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNCalculation.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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 io.github.sadellie.evaluatto - -sealed class RPNCalculation { - data object Negate : RPNCalculation() - - data object Clear : RPNCalculation() - data object Enter : RPNCalculation() - data object RotateUp : RPNCalculation() - data object RotateDown : RPNCalculation() - data object Swap : RPNCalculation() - data object Pop : RPNCalculation() - - data object Plus : RPNCalculation() - data object Minus : RPNCalculation() - data object Multiply : RPNCalculation() - data object Divide : RPNCalculation() - data object Percent : RPNCalculation() - data object Power : RPNCalculation() // unused -} diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNEngine.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNEngine.kt deleted file mode 100644 index 40f531eb..00000000 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/RPNEngine.kt +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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 io.github.sadellie.evaluatto - -import com.sadellie.unitto.core.base.MAX_PRECISION -import java.math.BigDecimal -import java.math.RoundingMode - -sealed class RPNResult { - - /** - * Both input and stack were changed. - * - * @property input New input. Empty when `null`. - * @property stack New stack. - */ - data class Result( - val input: BigDecimal?, - val stack: List, - ) : RPNResult() - - /** - * Only input has been changed. - * - * @property input New input. - */ - data class NewInput( - val input: BigDecimal, - ) : RPNResult() - - /** - * Only stack has been changed. - * - * @property stack New stack. - */ - data class NewStack( - val stack: List, - ) : RPNResult() - - /** - * Something is wrong. Input/stack is empty or there ane not enough stack objects. - */ - data object BadInput : RPNResult() - - /** - * Dividing by zero, duh - */ - data object DivideByZero : RPNResult() -} - -// vroom vroom mfs -// overdose on early returns -fun RPNCalculation.perform( - input: String, - stack: List, -): RPNResult { - when (this) { - RPNCalculation.Clear -> { - return RPNResult.Result(null, emptyList()) - } - - RPNCalculation.Enter -> { - val inputBD = input.toBigDecimalOrNull() ?: return RPNResult.BadInput - return RPNResult.Result(null, stack + inputBD) - } - - RPNCalculation.Negate -> { - val inputBD = input.toBigDecimalOrNull() ?: return RPNResult.BadInput - val result = inputBD.negate() - return RPNResult.NewInput(result) - } - - RPNCalculation.RotateUp -> { - if (stack.size < 2) return RPNResult.BadInput - return RPNResult.NewStack(stack.rotateUp()) - } - - RPNCalculation.RotateDown -> { - if (stack.size < 2) return RPNResult.BadInput - return RPNResult.NewStack(stack.rotateDown()) - } - - RPNCalculation.Swap -> { - if (stack.isEmpty()) return RPNResult.BadInput - if (input.isEmpty()) { - // Swap last 2 in stack - if (stack.size < 2) return RPNResult.BadInput - return RPNResult.NewStack(stack.swapLastTwo()) - } - - // Swap last and input - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - return RPNResult.Result(lastFromStack, stack.dropLast(1) + inputBD) - } - - RPNCalculation.Pop -> { - val lastStacked = stack.lastOrNull() ?: return RPNResult.BadInput - return RPNResult.Result(lastStacked, stack.dropLast(1)) - } - - RPNCalculation.Plus -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - val result = lastFromStack.plus(inputBD) - return RPNResult.Result(result, stack.dropLast(1)) - } - - RPNCalculation.Minus -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - val result = lastFromStack.minus(inputBD) - return RPNResult.Result(result, stack.dropLast(1)) - } - - RPNCalculation.Multiply -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - val result = lastFromStack.multiply(inputBD) - return RPNResult.Result(result, stack.dropLast(1)) - } - - RPNCalculation.Divide -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - if (inputBD.compareTo(BigDecimal.ZERO) == 0) return RPNResult.DivideByZero - - val result = lastFromStack.divide(inputBD, MAX_PRECISION, RoundingMode.HALF_EVEN) - return RPNResult.Result(result, stack.dropLast(1)) - } - - RPNCalculation.Percent -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - // 100 * 24 / 100 = - val result = lastFromStack - .multiply(inputBD) - .divide(bigDecimalHundred, MAX_PRECISION, RoundingMode.HALF_EVEN) - return RPNResult.Result(result, stack.dropLast(1)) - } - - RPNCalculation.Power -> { - val (lastFromStack, inputBD) = operands(stack, input) ?: return RPNResult.BadInput - val result = lastFromStack.pow(inputBD) - return RPNResult.Result(result, stack.dropLast(1)) - } - } -} - -private val bigDecimalHundred by lazy { BigDecimal("100") } - -private fun operands( - stack: List, - input: String, -): Pair? { - val first = stack.lastOrNull() ?: return null - val second = input.toBigDecimalOrNull() ?: return null - - return first to second -} - -private fun List.swapLastTwo(): List { - if (size < 2) return this - return this - .dropLast(2) - .plus(get(lastIndex)) - .plus(get(lastIndex - 1)) -} - -private fun List.rotateUp(): List { - if (size < 2) return this - return this - .drop(1) - .plus(first()) -} - -private fun List.rotateDown(): List { - if (size < 2) return this - return listOf(last()) - .plus(this.dropLast(1)) -} diff --git a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/RPNEngineKtTest.kt b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/RPNEngineKtTest.kt deleted file mode 100644 index 7d3a2e60..00000000 --- a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/RPNEngineKtTest.kt +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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 io.github.sadellie.evaluatto - -import com.sadellie.unitto.core.base.MAX_PRECISION -import org.junit.Assert.assertEquals -import org.junit.Test -import java.math.BigDecimal - -class RPNEngineKtTest { - - @Test - fun testBadOperands() { - // no funny business if input and/or stack is empty - val actual = RPNCalculation.Divide.perform( - input = "", - stack = emptyList() - ) - - assertEquals(RPNResult.BadInput, actual) - } - - @Test - fun testDivide() { - val actual = RPNCalculation.Divide.perform( - input = "2", - stack = listOf(BigDecimal("5")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("2.5").setScale(MAX_PRECISION), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testDivideByZero() { - val actual = RPNCalculation.Divide.perform( - input = "0", - stack = listOf(BigDecimal("5")) - ) - - assertEquals(RPNResult.DivideByZero, actual) - } - - @Test - fun testMinus() { - val actual = RPNCalculation.Minus.perform( - input = "2", - stack = listOf(BigDecimal("5")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("3"), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testMultiply() { - val actual = RPNCalculation.Multiply.perform( - input = "2", - stack = listOf(BigDecimal("5")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("10"), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testNegate() { - val actual = RPNCalculation.Negate.perform( - input = "2", - stack = listOf(BigDecimal("5")) - ) - - if (actual !is RPNResult.NewInput) throw Exception("Wrong return") - - assertEquals(BigDecimal("-2"), actual.input) - } - - @Test - fun testPercent() { - val actual = RPNCalculation.Percent.perform( - input = "150", - stack = listOf(BigDecimal("69")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("103.5").setScale(MAX_PRECISION), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testPlus() { - val actual = RPNCalculation.Plus.perform( - input = "150", - stack = listOf(BigDecimal("69")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("219"), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testPower() { - val actual = RPNCalculation.Power.perform( - input = "3", - stack = listOf(BigDecimal("2")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("8"), actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testRotateUp() { - val actual = RPNCalculation.RotateUp.perform( - input = "", - stack = listOf(BigDecimal("1"), BigDecimal("2"), BigDecimal("3")) - ) - - if (actual !is RPNResult.NewStack) throw Exception("Wrong return") - - assertEquals(listOf(BigDecimal("2"), BigDecimal("3"), BigDecimal("1")), actual.stack) - } - - @Test - fun testRotateDown() { - val actual = RPNCalculation.RotateDown.perform( - input = "", - stack = listOf(BigDecimal("1"), BigDecimal("2"), BigDecimal("3")) - ) - - if (actual !is RPNResult.NewStack) throw Exception("Wrong return") - - assertEquals(listOf(BigDecimal("3"), BigDecimal("1"), BigDecimal("2")), actual.stack) - } - - @Test - fun testPop() { - val actual = RPNCalculation.Pop.perform( - input = "", - stack = listOf(BigDecimal("1"), BigDecimal("2"), BigDecimal("3")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("3"), actual.input) - assertEquals(listOf(BigDecimal("1"), BigDecimal("2")), actual.stack) - } - - @Test - fun testClear() { - val actual = RPNCalculation.Clear.perform( - input = "3", - stack = listOf(BigDecimal("2")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(null, actual.input) - assertEquals(emptyList(), actual.stack) - } - - @Test - fun testEnter() { - val actual = RPNCalculation.Enter.perform( - input = "3", - stack = listOf(BigDecimal("2")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(null, actual.input) - assertEquals(listOf(BigDecimal("2"), BigDecimal("3")), actual.stack) - } - - @Test - fun testSwap() { - val actual = RPNCalculation.Swap.perform( - input = "3", - stack = listOf(BigDecimal("2")) - ) - - if (actual !is RPNResult.Result) throw Exception("Wrong return") - - assertEquals(BigDecimal("2"), actual.input) - assertEquals(listOf(BigDecimal("3")), actual.stack) - } - - @Test - fun testSwapEmptyInput() { - val actual = RPNCalculation.Swap.perform( - input = "", - stack = listOf(BigDecimal("1"), BigDecimal("2")) - ) - - if (actual !is RPNResult.NewStack) throw Exception("Wrong return") - - assertEquals(listOf(BigDecimal("2"), BigDecimal("1")), actual.stack) - } - - @Test - fun testSwapEmptyInputNotEnoughInStack() { - val actual = RPNCalculation.Swap.perform( - input = "", - stack = listOf(BigDecimal("1")) - ) - - assertEquals(RPNResult.BadInput, actual) - } - - @Test - fun testSwapEmptyStack() { - val actual = RPNCalculation.Swap.perform( - input = "123", - stack = emptyList() - ) - - assertEquals(RPNResult.BadInput, actual) - } - - @Test - fun testSwapEmptyBoth() { - val actual = RPNCalculation.Swap.perform( - input = "", - stack = emptyList() - ) - - assertEquals(RPNResult.BadInput, actual) - } -} diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt index 36c65d62..b8d3d74b 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt @@ -92,6 +92,4 @@ interface UserPreferencesRepository { suspend fun updatePartialHistoryView(enabled: Boolean) suspend fun updateAcButton(enabled: Boolean) - - suspend fun updateRpnMode(enabled: Boolean) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AppPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AppPreferences.kt index 7de30184..00004d5b 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AppPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AppPreferences.kt @@ -30,6 +30,5 @@ interface AppPreferences { val startingScreen: String val enableToolsExperiment: Boolean val systemFont: Boolean - val rpnMode: Boolean val enableVibrations: Boolean } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index c0e6336a..cb394150 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -134,10 +134,6 @@ fun Preferences.getAcButton(): Boolean { return this[PrefsKeys.AC_BUTTON] ?: true } -fun Preferences.getRpnMode(): Boolean { - return this[PrefsKeys.RPN_MODE] ?: false -} - private inline fun T.letTryOrNull(block: (T) -> R): R? = try { this?.let(block) } catch (e: Exception) { diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt index 2a60d1d9..d9b09e13 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt @@ -44,7 +44,6 @@ data class AppPreferencesImpl( override val startingScreen: String, override val enableToolsExperiment: Boolean, override val systemFont: Boolean, - override val rpnMode: Boolean, override val enableVibrations: Boolean, ) : AppPreferences diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt index c3c23cb1..0c65ccce 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt @@ -37,7 +37,7 @@ object PrefsKeys { val ENABLE_VIBRATIONS = booleanPreferencesKey("ENABLE_VIBRATIONS_PREF_KEY") val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY") val AC_BUTTON = booleanPreferencesKey("AC_BUTTON_PREF_KEY") - val RPN_MODE = booleanPreferencesKey("RPN_MODE_PREF_KEY") + // val RPN_MODE = booleanPreferencesKey("RPN_MODE_PREF_KEY") // FORMATTER val DIGITS_PRECISION = intPreferencesKey("DIGITS_PRECISION_PREF_KEY") diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt index 57d3e616..92213e0e 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt @@ -62,7 +62,6 @@ class UserPreferencesRepositoryImpl @Inject constructor( startingScreen = preferences.getStartingScreen(), enableToolsExperiment = preferences.getEnableToolsExperiment(), systemFont = preferences.getSystemFont(), - rpnMode = preferences.getRpnMode(), enableVibrations = preferences.getEnableVibrations(), ) } @@ -291,10 +290,4 @@ class UserPreferencesRepositoryImpl @Inject constructor( preferences[PrefsKeys.AC_BUTTON] = enabled } } - - override suspend fun updateRpnMode(enabled: Boolean) { - dataStore.edit { preferences -> - preferences[PrefsKeys.RPN_MODE] = enabled - } - } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/InputBox.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/InputBox.kt deleted file mode 100644 index a8b84558..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/InputBox.kt +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.base.OutputFormat -import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField -import com.sadellie.unitto.core.ui.common.textfield.FixedInputTextField -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols -import com.sadellie.unitto.data.common.format -import java.math.BigDecimal - -@Composable -internal fun InputBox( - modifier: Modifier, - input: TextFieldValue, - onCursorChange: (TextRange) -> Unit, - stack: List, - formatterSymbols: FormatterSymbols, - precision: Int, - outputFormat: Int, -) { - val listState = rememberLazyListState() - - LaunchedEffect(stack) { - listState.animateScrollToItem(stack.lastIndex.coerceAtLeast(0)) - } - - Column( - modifier = modifier - .clip(RoundedCornerShape(24.dp)) - .fillMaxWidth() - .background(MaterialTheme.colorScheme.surfaceVariant) - .padding(start = 12.dp, end = 12.dp, bottom = 12.dp), - verticalArrangement = Arrangement.Bottom - ) { - LazyColumn( - modifier = Modifier.weight(1f), - state = listState, - verticalArrangement = Arrangement.Bottom, - ) { - items(stack) { - FixedInputTextField( - modifier = Modifier.fillMaxWidth(), - value = it.format(precision, outputFormat), - formatterSymbols = formatterSymbols, - textColor = MaterialTheme.colorScheme.onSurfaceVariant, - onClick = {} - ) - } - } - - ExpressionTextField( - modifier = Modifier - .fillMaxWidth() - .fillMaxHeight(0.25f), - value = input, - minRatio = 0.6f, - onCursorChange = onCursorChange, - formatterSymbols = formatterSymbols, - textColor = MaterialTheme.colorScheme.onSurfaceVariant - ) - } -} - -@Preview(device = "spec:width=1080px,height=2160px,dpi=440") -@Composable -fun PreviewInputBox() { - InputBox( - modifier = Modifier.fillMaxSize(), - input = TextFieldValue("123456.789"), - onCursorChange = {}, - stack = listOf( - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - ), - formatterSymbols = FormatterSymbols.Spaces, - precision = 3, - outputFormat = OutputFormat.PLAIN - ) -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorKeyboard.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorKeyboard.kt deleted file mode 100644 index f38788ab..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorKeyboard.kt +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -import androidx.compose.foundation.layout.Column -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.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -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.KeyboardButtonAdditional -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightShort -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightTall -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightTallAdditional -import com.sadellie.unitto.core.ui.common.KeyboardButtonFilled -import com.sadellie.unitto.core.ui.common.KeyboardButtonLight -import com.sadellie.unitto.core.ui.common.KeyboardButtonTertiary -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.Clear -import com.sadellie.unitto.core.ui.common.icons.iconpack.Comma -import com.sadellie.unitto.core.ui.common.icons.iconpack.Divide -import com.sadellie.unitto.core.ui.common.icons.iconpack.Dot -import com.sadellie.unitto.core.ui.common.icons.iconpack.Down -import com.sadellie.unitto.core.ui.common.icons.iconpack.Enter -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.Minus -import com.sadellie.unitto.core.ui.common.icons.iconpack.Multiply -import com.sadellie.unitto.core.ui.common.icons.iconpack.Percent -import com.sadellie.unitto.core.ui.common.icons.iconpack.Plus -import com.sadellie.unitto.core.ui.common.icons.iconpack.Pop -import com.sadellie.unitto.core.ui.common.icons.iconpack.Swap -import com.sadellie.unitto.core.ui.common.icons.iconpack.Unary -import com.sadellie.unitto.core.ui.common.icons.iconpack.Up -import io.github.sadellie.evaluatto.RPNCalculation - -@Composable -internal fun RPNCalculatorKeyboard( - modifier: Modifier, - fractional: String, - middleZero: Boolean, - onCalculationClick: (RPNCalculation) -> Unit, - onInputEditClick: (RPNInputEdit) -> Unit, -) { - val fractionalIcon = remember(fractional) { if (fractional == Token.Digit.dot) IconPack.Dot else IconPack.Comma } - - if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) { - RPNCalculatorKeyboardLandscape( - modifier = modifier, - fractionalIcon = fractionalIcon, - middleZero = middleZero, - onCalculationClick = onCalculationClick, - onInputEditClick = onInputEditClick - ) - } else { - RPNCalculatorKeyboardPortrait( - modifier = modifier, - fractionalIcon = fractionalIcon, - middleZero = middleZero, - onCalculationClick = onCalculationClick, - onInputEditClick = onInputEditClick - ) - } -} - -@Composable -private fun RPNCalculatorKeyboardPortrait( - modifier: Modifier, - fractionalIcon: ImageVector, - middleZero: Boolean, - onCalculationClick: (RPNCalculation) -> Unit, - onInputEditClick: (RPNInputEdit) -> Unit, -) { - Column( - modifier = modifier - ) { - KeypadFlow( - modifier = Modifier.fillMaxHeight(0.1f).fillMaxWidth(), - rows = 1, - columns = 4 - ) { width, height -> - val aModifier = Modifier - .fillMaxWidth(width) - .fillMaxHeight(height) - - KeyboardButtonAdditional(aModifier, IconPack.Swap, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.Swap) } - KeyboardButtonAdditional(aModifier, IconPack.Up, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.RotateUp) } - KeyboardButtonAdditional(aModifier, IconPack.Down, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.RotateDown) } - KeyboardButtonAdditional(aModifier, IconPack.Pop, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.Pop) } - } - - KeypadFlow( - modifier = Modifier.weight(1f).fillMaxSize(), - rows = 5, - columns = 4 - ) { width, height -> - val bModifier = Modifier - .fillMaxWidth(width) - .fillMaxHeight(height) - - KeyboardButtonTertiary(bModifier, IconPack.Clear, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Clear) } - KeyboardButtonFilled(bModifier, IconPack.Unary, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Negate) } - KeyboardButtonFilled(bModifier, IconPack.Percent, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Percent) } - KeyboardButtonFilled(bModifier, IconPack.Divide, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Divide) } - - KeyboardButtonLight(bModifier, IconPack.Key7, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._7)) } - KeyboardButtonLight(bModifier, IconPack.Key8, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._8)) } - KeyboardButtonLight(bModifier, IconPack.Key9, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._9)) } - KeyboardButtonFilled(bModifier, IconPack.Multiply, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Multiply) } - - KeyboardButtonLight(bModifier, IconPack.Key4, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._4)) } - KeyboardButtonLight(bModifier, IconPack.Key5, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._5)) } - KeyboardButtonLight(bModifier, IconPack.Key6, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._6)) } - KeyboardButtonFilled(bModifier, IconPack.Minus, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Minus) } - - KeyboardButtonLight(bModifier, IconPack.Key1, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._1)) } - KeyboardButtonLight(bModifier, IconPack.Key2, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._2)) } - KeyboardButtonLight(bModifier, IconPack.Key3, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._3)) } - KeyboardButtonFilled(bModifier, IconPack.Plus, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Plus) } - - if (middleZero) { - KeyboardButtonLight(bModifier, fractionalIcon, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Dot) } - KeyboardButtonLight(bModifier, IconPack.Key0, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._0)) } - } else { - KeyboardButtonLight(bModifier, IconPack.Key0, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._0)) } - KeyboardButtonLight(bModifier, fractionalIcon, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Dot) } - } - KeyboardButtonLight(bModifier, IconPack.Backspace, null, KeyboardButtonContentHeightTall) { onInputEditClick(RPNInputEdit.Delete) } - KeyboardButtonFilled(bModifier, IconPack.Enter, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Enter) } - } - } -} - -@Composable -private fun RPNCalculatorKeyboardLandscape( - modifier: Modifier, - fractionalIcon: ImageVector, - middleZero: Boolean, - onCalculationClick: (RPNCalculation) -> Unit, - onInputEditClick: (RPNInputEdit) -> Unit, -) { - KeypadFlow( - modifier = modifier, - rows = 4, - columns = 6 - ) { width, height -> - val bModifier = Modifier - .fillMaxHeight(height) - .fillMaxWidth(width) - - KeyboardButtonAdditional(bModifier, IconPack.Swap, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.Swap) } - KeyboardButtonLight(bModifier, IconPack.Key7, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._7)) } - KeyboardButtonLight(bModifier, IconPack.Key8, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._8)) } - KeyboardButtonLight(bModifier, IconPack.Key9, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._9)) } - KeyboardButtonTertiary(bModifier, IconPack.Clear, null, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Clear) } - KeyboardButtonFilled(bModifier, IconPack.Unary, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Negate) } - - KeyboardButtonAdditional(bModifier, IconPack.Up, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.RotateUp) } - KeyboardButtonLight(bModifier, IconPack.Key4, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._4)) } - KeyboardButtonLight(bModifier, IconPack.Key5, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._5)) } - KeyboardButtonLight(bModifier, IconPack.Key6, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._6)) } - KeyboardButtonFilled(bModifier, IconPack.Multiply, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Multiply) } - KeyboardButtonFilled(bModifier, IconPack.Divide, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Divide) } - - KeyboardButtonAdditional(bModifier, IconPack.Down, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.RotateDown) } - KeyboardButtonLight(bModifier, IconPack.Key1, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._1)) } - KeyboardButtonLight(bModifier, IconPack.Key2, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._2)) } - KeyboardButtonLight(bModifier, IconPack.Key3, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._3)) } - KeyboardButtonFilled(bModifier, IconPack.Plus, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Plus) } - KeyboardButtonFilled(bModifier, IconPack.Minus, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Minus) } - - KeyboardButtonAdditional(bModifier, IconPack.Pop, null, KeyboardButtonContentHeightTallAdditional) { onCalculationClick(RPNCalculation.Pop) } - if (middleZero) { - KeyboardButtonLight(bModifier, fractionalIcon, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Dot) } - KeyboardButtonLight(bModifier, IconPack.Key0, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._0)) } - } else { - KeyboardButtonLight(bModifier, IconPack.Key0, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Digit(Token.Digit._0)) } - KeyboardButtonLight(bModifier, fractionalIcon, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Dot) } - } - KeyboardButtonLight(bModifier, IconPack.Backspace, null, KeyboardButtonContentHeightShort) { onInputEditClick(RPNInputEdit.Delete) } - KeyboardButtonFilled(bModifier, IconPack.Percent, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Percent) } - KeyboardButtonFilled(bModifier, IconPack.Enter, null, KeyboardButtonContentHeightShort) { onCalculationClick(RPNCalculation.Enter) } - } -} - -@Preview(device = "spec:parent=pixel_5,orientation=portrait") -@Preview(device = "spec:parent=pixel_5,orientation=landscape") -@Composable -private fun PreviewKeyboard() { - RPNCalculatorKeyboard( - modifier = Modifier.fillMaxSize(), - fractional = Token.Digit.dot, - middleZero = false, - onCalculationClick = {}, - onInputEditClick = {} - ) -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorScreen.kt deleted file mode 100644 index 7028b939..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorScreen.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import com.sadellie.unitto.core.ui.WindowHeightSizeClass -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.sadellie.unitto.core.base.OutputFormat -import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.LocalWindowSize -import com.sadellie.unitto.core.ui.common.MenuButton -import com.sadellie.unitto.core.ui.common.SettingsButton -import com.sadellie.unitto.core.ui.common.EmptyScreen -import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols -import io.github.sadellie.evaluatto.RPNCalculation -import java.math.BigDecimal - -@Composable -internal fun RPNCalculatorRoute( - openDrawer: () -> Unit, - navigateToSettings: () -> Unit, - viewModel: RPNCalculatorViewModel = hiltViewModel(), -) { - when (val uiState = viewModel.uiState.collectAsStateWithLifecycle().value) { - RPNCalculatorUIState.Loading -> EmptyScreen() - is RPNCalculatorUIState.Ready -> RPNCalculatorScreen( - uiState = uiState, - openDrawer = openDrawer, - navigateToSettings = navigateToSettings, - onCursorChange = viewModel::onCursorChange, - onCalculationClick = viewModel::onCalculationClick, - onInputEditClick = viewModel::onInputEdit - ) - } -} - -@Composable -internal fun RPNCalculatorScreen( - uiState: RPNCalculatorUIState.Ready, - openDrawer: () -> Unit, - navigateToSettings: () -> Unit, - onCursorChange: (TextRange) -> Unit, - onCalculationClick: (RPNCalculation) -> Unit, - onInputEditClick: (RPNInputEdit) -> Unit, -) { - ScaffoldWithTopBar( - title = { Text(stringResource(id = R.string.calculator_title)) }, - navigationIcon = { MenuButton(openDrawer) }, - actions = { SettingsButton(navigateToSettings) } - ) { paddingValues -> - Column( - Modifier.padding(paddingValues) - ) { - InputBox( - modifier = Modifier - .padding(8.dp) - .fillMaxHeight(if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) 0.3f else 0.5f), - input = uiState.input, - stack = uiState.stack, - formatterSymbols = uiState.formatterSymbols, - precision = uiState.precision, - outputFormat = uiState.outputFormat, - onCursorChange = onCursorChange - ) - RPNCalculatorKeyboard( - modifier = Modifier - .padding(horizontal = 4.dp) - .fillMaxSize(), - fractional = uiState.formatterSymbols.fractional, - middleZero = uiState.middleZero, - onCalculationClick = onCalculationClick, - onInputEditClick = onInputEditClick - ) - } - } -} - -@Preview(widthDp = 432, heightDp = 1008, device = "spec:parent=pixel_5,orientation=portrait") -@Preview(widthDp = 432, heightDp = 864, device = "spec:parent=pixel_5,orientation=portrait") -@Preview(widthDp = 597, heightDp = 1393, device = "spec:parent=pixel_5,orientation=portrait") -@Composable -private fun RPNCalculatorScreenPreview() { - RPNCalculatorScreen( - uiState = RPNCalculatorUIState.Ready( - input = TextFieldValue("test"), - stack = listOf( - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - BigDecimal("123456.7890"), - ), - precision = 3, - outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces, - middleZero = true, - ), - openDrawer = {}, - navigateToSettings = {}, - onCalculationClick = {}, - onInputEditClick = {}, - onCursorChange = {} - ) -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorUIState.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorUIState.kt deleted file mode 100644 index 4db3230d..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorUIState.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols -import java.math.BigDecimal - -internal sealed class RPNCalculatorUIState { - data object Loading : RPNCalculatorUIState() - - data class Ready( - val input: TextFieldValue, - val stack: List, - val precision: Int, - val outputFormat: Int, - val formatterSymbols: FormatterSymbols, - val middleZero: Boolean, - ) : RPNCalculatorUIState() -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorViewModel.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorViewModel.kt deleted file mode 100644 index 2de873d3..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNCalculatorViewModel.kt +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.input.TextFieldValue -import androidx.lifecycle.SavedStateHandle -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.base.Token -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols -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.getTextField -import com.sadellie.unitto.data.common.format -import com.sadellie.unitto.data.common.stateIn -import com.sadellie.unitto.data.model.repository.UserPreferencesRepository -import dagger.hilt.android.lifecycle.HiltViewModel -import io.github.sadellie.evaluatto.RPNCalculation -import io.github.sadellie.evaluatto.RPNResult -import io.github.sadellie.evaluatto.perform -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import java.math.BigDecimal -import javax.inject.Inject - -@HiltViewModel -internal class RPNCalculatorViewModel @Inject constructor( - userPrefsRepository: UserPreferencesRepository, - private val savedStateHandle: SavedStateHandle, -) : ViewModel() { - - private val _inputKey = "RPN_CALCULATOR_INPUT" - private val _input = MutableStateFlow(savedStateHandle.getTextField(_inputKey)) - private val _stack = MutableStateFlow(emptyList()) - private val _prefs = userPrefsRepository.calculatorPrefs.stateIn(viewModelScope, null) - - val uiState = combine( - _prefs, - _input, - _stack - ) { prefs, input, stack -> - prefs ?: return@combine RPNCalculatorUIState.Loading - - return@combine RPNCalculatorUIState.Ready( - input = input, - stack = stack, - precision = prefs.precision, - outputFormat = prefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator), - middleZero = prefs.middleZero - ) - } - .stateIn(viewModelScope, RPNCalculatorUIState.Loading) - - fun onInputEdit(action: RPNInputEdit) { - val input = _input.value - val newInput = when (action) { - is RPNInputEdit.Digit -> input.addTokens(action.value) - RPNInputEdit.Dot -> { - if (_input.value.text.contains(Token.Digit.dot)) return - input.addTokens(Token.Digit.dot) - } - RPNInputEdit.Delete -> input.deleteTokens() - } - - _input.update { newInput } - savedStateHandle[_inputKey] = newInput.text - } - - fun onCalculationClick(action: RPNCalculation) = viewModelScope.launch { - val prefs = _prefs.value ?: return@launch - - val newResult = withContext(Dispatchers.Default) { - action.perform(_input.value.text, _stack.value) - } - - when (newResult) { - is RPNResult.Result -> { - val newInput = newResult.input?.format(prefs.precision, prefs.outputFormat) ?: "" - _input.update { TextFieldValue(newInput, TextRange(newInput.length)) } - _stack.update { newResult.stack } - } - - is RPNResult.NewStack -> { - _stack.update { newResult.stack } - } - - is RPNResult.NewInput -> { - val newInput = newResult.input.format(prefs.precision, prefs.outputFormat) - _input.update { TextFieldValue(newInput, TextRange(newInput.length)) } - } - RPNResult.BadInput, RPNResult.DivideByZero -> Unit - } - } - - fun onCursorChange(selection: TextRange) = _input.update { it.copy(selection = selection) } -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNInputEdit.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNInputEdit.kt deleted file mode 100644 index 28a391d9..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/RPNInputEdit.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.calculator - -sealed class RPNInputEdit { - data class Digit(val value: String) : RPNInputEdit() - data object Delete : RPNInputEdit() - data object Dot : RPNInputEdit() -} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt index d6f6f262..b3d62764 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt @@ -24,13 +24,11 @@ import com.sadellie.unitto.core.ui.model.DrawerItem import com.sadellie.unitto.core.ui.unittoComposable import com.sadellie.unitto.core.ui.unittoNavigation import com.sadellie.unitto.feature.calculator.CalculatorRoute -import com.sadellie.unitto.feature.calculator.RPNCalculatorRoute private val graph = DrawerItem.Calculator.graph private val start = DrawerItem.Calculator.start fun NavGraphBuilder.calculatorGraph( - rpnMode: Boolean, openDrawer: () -> Unit, navigateToSettings: () -> Unit ) { @@ -42,17 +40,10 @@ fun NavGraphBuilder.calculatorGraph( ) ) { unittoComposable(start) { - if (rpnMode) { - RPNCalculatorRoute( - openDrawer = openDrawer, - navigateToSettings = navigateToSettings - ) - } else { - CalculatorRoute( - navigateToMenu = openDrawer, - navigateToSettings = navigateToSettings - ) - } + CalculatorRoute( + navigateToMenu = openDrawer, + navigateToSettings = navigateToSettings + ) } } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt index ee25cc90..480edaaa 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt @@ -18,7 +18,6 @@ package com.sadellie.unitto.feature.settings.calculator -import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons @@ -29,84 +28,51 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.NavigateUpButton +import com.sadellie.unitto.core.base.Separator import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem +import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar +import com.sadellie.unitto.data.model.userprefs.CalculatorPreferences +import com.sadellie.unitto.data.userprefs.CalculatorPreferencesImpl @Composable internal fun CalculatorSettingsRoute( viewModel: CalculatorSettingsViewModel = hiltViewModel(), navigateUpAction: () -> Unit, ) { - when (val prefs = viewModel.uiState.collectAsStateWithLifecycle().value) { - CalculatorSettingsUIState.Loading -> EmptyScreen() + when (val prefs = viewModel.prefs.collectAsStateWithLifecycle().value) { + null -> EmptyScreen() else -> { CalculatorSettingsScreen( - uiState = prefs, + prefs = prefs, navigateUpAction = navigateUpAction, updatePartialHistoryView = viewModel::updatePartialHistoryView, - updateRpnMode = viewModel::updateRpnMode, ) } } } -// TODO Translate @Composable private fun CalculatorSettingsScreen( - uiState: CalculatorSettingsUIState, + prefs: CalculatorPreferences, navigateUpAction: () -> Unit, updatePartialHistoryView: (Boolean) -> Unit, - updateRpnMode: (Boolean) -> Unit, ) { ScaffoldWithLargeTopBar( title = stringResource(R.string.calculator_title), navigationIcon = { NavigateUpButton(navigateUpAction) } ) { padding -> Column(Modifier.padding(padding)) { -// SingleChoiceSegmentedButtonRow( -// modifier = Modifier -// .fillMaxWidth() -// .padding(16.dp) -// ) { -// SegmentedButton( -// selected = uiState is CalculatorSettingsUIState.Standard, -// onClick = { updateRpnMode(false) }, -// shape = SegmentedButtonDefaults.itemShape(index = 0, count = 2), -// ) { -// Text("Standard") -// } -// SegmentedButton( -// selected = uiState == CalculatorSettingsUIState.RPN, -// onClick = { updateRpnMode(true) }, -// shape = SegmentedButtonDefaults.itemShape(index = 1, count = 2), -// ) { -// Text("RPN") -// } -// } - - Crossfade( - targetState = uiState, - label = "Mode switch" - ) { state -> - when (state) { - is CalculatorSettingsUIState.Standard -> { - Column { - ListItem( - headlineText = stringResource(R.string.settings_partial_history_view), - icon = Icons.Default.Timer, - supportingText = stringResource(R.string.settings_partial_history_view_support), - switchState = state.partialHistoryView, - onSwitchChange = updatePartialHistoryView - ) - } - } - - else -> Unit - } - } + ListItem( + headlineText = stringResource(R.string.settings_partial_history_view), + icon = Icons.Default.Timer, + supportingText = stringResource(R.string.settings_partial_history_view_support), + switchState = prefs.partialHistoryView, + onSwitchChange = updatePartialHistoryView + ) } } } @@ -115,22 +81,16 @@ private fun CalculatorSettingsScreen( @Composable private fun PreviewCalculatorSettingsScreenStandard() { CalculatorSettingsScreen( - uiState = CalculatorSettingsUIState.Standard( - partialHistoryView = true, + prefs = CalculatorPreferencesImpl( + radianMode = true, + separator = Separator.SPACE, + middleZero = false, + acButton = false, + partialHistoryView = false, + precision = 3, + outputFormat = OutputFormat.PLAIN ), navigateUpAction = {}, updatePartialHistoryView = {}, - updateRpnMode = {} - ) -} - -@Preview -@Composable -private fun PreviewCalculatorSettingsScreenRPN() { - CalculatorSettingsScreen( - uiState = CalculatorSettingsUIState.RPN, - navigateUpAction = {}, - updatePartialHistoryView = {}, - updateRpnMode = {} ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsUIState.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsUIState.kt deleted file mode 100644 index 899cb51e..00000000 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsUIState.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.settings.calculator - -internal sealed class CalculatorSettingsUIState { - data object Loading : CalculatorSettingsUIState() - - data object RPN : CalculatorSettingsUIState() - - data class Standard( - val partialHistoryView: Boolean, - ) : CalculatorSettingsUIState() -} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsViewModel.kt index 41b4c69a..eb4e3ff5 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsViewModel.kt @@ -23,7 +23,6 @@ import androidx.lifecycle.viewModelScope import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import javax.inject.Inject @@ -31,25 +30,10 @@ import javax.inject.Inject internal class CalculatorSettingsViewModel @Inject constructor( private val userPrefsRepository: UserPreferencesRepository, ) : ViewModel() { - val uiState = combine( - userPrefsRepository.appPrefs, - userPrefsRepository.calculatorPrefs, - ) { app, calc -> - if (app.rpnMode) { - CalculatorSettingsUIState.RPN - } else { - CalculatorSettingsUIState.Standard( - partialHistoryView = calc.partialHistoryView, - ) - } - } - .stateIn(viewModelScope, CalculatorSettingsUIState.Loading) + val prefs = userPrefsRepository.calculatorPrefs + .stateIn(viewModelScope, null) fun updatePartialHistoryView(enabled: Boolean) = viewModelScope.launch { userPrefsRepository.updatePartialHistoryView(enabled) } - - fun updateRpnMode(enabled: Boolean) = viewModelScope.launch { - userPrefsRepository.updateRpnMode(enabled) - } } From 9a865b40490a5f2a445ed905d2f26791ff9f1a6d Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sun, 4 Feb 2024 19:50:54 +0300 Subject: [PATCH 02/46] Rewrite FixedExpressionInputTextField --- .../common/textfield/FixedInputTextFIeld.kt | 86 +++++++++---------- .../calculator/components/HistoryList.kt | 6 +- 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt index 9cdee727..94e79271 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt @@ -18,76 +18,72 @@ package com.sadellie.unitto.core.ui.common.textfield +import android.content.ClipData +import android.content.Context +import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -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.graphics.Color +import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalTextInputService -import androidx.compose.ui.platform.LocalTextToolbar -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.textfield.texttoolbar.UnittoTextToolbar import com.sadellie.unitto.core.ui.theme.LocalNumberTypography @Composable -fun FixedInputTextField( +fun FixedExpressionInputTextField( modifier: Modifier = Modifier, value: String, formatterSymbols: FormatterSymbols, textColor: Color, onClick: (cleanValue: String) -> Unit ) { - val clipboardManager = LocalClipboardManager.current - val expression = value.take(1000) - var expressionValue by remember(expression) { - mutableStateOf(TextFieldValue(expression, TextRange(expression.length))) - } + val clipboardManager = FormattedExpressionClipboardManager( + formatterSymbols = formatterSymbols, + clipboardManager = LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) + as android.content.ClipboardManager + ) - val expressionInteractionSource = remember(expression) { MutableInteractionSource() } - LaunchedEffect(expressionInteractionSource) { - expressionInteractionSource.interactions.collect { - if (it is PressInteraction.Release) onClick(value) - } - } - - CompositionLocalProvider( - LocalTextInputService provides null, - LocalTextToolbar provides UnittoTextToolbar( - view = LocalView.current, - copyCallback = { - clipboardManager.copyWithFractional(expressionValue, formatterSymbols) - expressionValue = expressionValue.copy(selection = TextRange(expressionValue.selection.end)) - } - ) - ) { - BasicTextField( - value = expressionValue, - onValueChange = { expressionValue = it }, - maxLines = 1, + CompositionLocalProvider(LocalClipboardManager provides clipboardManager) { + SelectionContainer( modifier = modifier + .clickable { onClick(value) } .fillMaxWidth() .padding(horizontal = 8.dp) .horizontalScroll(rememberScrollState(), reverseScrolling = true), - textStyle = LocalNumberTypography.current.displaySmall.copy(color = textColor, textAlign = TextAlign.End), - readOnly = true, - visualTransformation = ExpressionTransformer(formatterSymbols), - interactionSource = expressionInteractionSource + ) { + Text( + text = value.formatExpression(formatterSymbols), + style = LocalNumberTypography.current.displaySmall + .copy(color = textColor, textAlign = TextAlign.End), + ) + } + } +} + +private class FormattedExpressionClipboardManager( + private val formatterSymbols: FormatterSymbols, + private val clipboardManager: android.content.ClipboardManager +): ClipboardManager { + override fun getText(): AnnotatedString? = null + + override fun setText(annotatedString: AnnotatedString) { + clipboardManager.setPrimaryClip( + ClipData.newPlainText( + PLAIN_TEXT_LABEL, + annotatedString + .text + .replace(formatterSymbols.grouping, "") + ) ) } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt index 986d8ca7..c4269727 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.textfield.FixedInputTextField +import com.sadellie.unitto.core.ui.common.textfield.FixedExpressionInputTextField import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.data.model.HistoryItem import java.text.SimpleDateFormat @@ -132,14 +132,14 @@ private fun HistoryListItem( modifier = modifier.height(HistoryItemHeight), verticalArrangement = Arrangement.Center ) { - FixedInputTextField( + FixedExpressionInputTextField( value = historyItem.expression, formatterSymbols = formatterSymbols, textColor = MaterialTheme.colorScheme.onSurfaceVariant, onClick = addTokens, ) - FixedInputTextField( + FixedExpressionInputTextField( value = historyItem.result, formatterSymbols = formatterSymbols, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f), From 402f48ee1f5e214e743ae642bacddf5eaceb188b Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sun, 4 Feb 2024 23:48:22 +0300 Subject: [PATCH 03/46] Delete calculator history item by one closes #58 --- .../common/textfield/ClipboardManagerExt.kt | 2 + .../common/textfield/FixedInputTextFIeld.kt | 14 +-- .../CalculatorHistoryRepositoryImpl.kt | 4 + .../data/database/CalculatorHistoryDao.kt | 3 + .../repository/CalculatorHistoryRepository.kt | 6 +- .../feature/calculator/CalculatorScreen.kt | 53 +++++---- .../feature/calculator/CalculatorViewModel.kt | 5 + .../calculator/components/HistoryList.kt | 109 +++++++++++++----- 8 files changed, 135 insertions(+), 61 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt index f3ef26bb..a606b219 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt @@ -50,3 +50,5 @@ internal fun ClipboardManager.copy(value: TextFieldValue) = this.setText( .text ) ) + +internal const val PLAIN_TEXT_LABEL = "plain text" diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt index 94e79271..e7306ff8 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt @@ -23,7 +23,6 @@ import android.content.Context import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.Text @@ -36,7 +35,6 @@ import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.ui.theme.LocalNumberTypography @Composable @@ -45,7 +43,7 @@ fun FixedExpressionInputTextField( value: String, formatterSymbols: FormatterSymbols, textColor: Color, - onClick: (cleanValue: String) -> Unit + onClick: () -> Unit, ) { val clipboardManager = FormattedExpressionClipboardManager( formatterSymbols = formatterSymbols, @@ -55,13 +53,13 @@ fun FixedExpressionInputTextField( CompositionLocalProvider(LocalClipboardManager provides clipboardManager) { SelectionContainer( - modifier = modifier - .clickable { onClick(value) } - .fillMaxWidth() - .padding(horizontal = 8.dp) - .horizontalScroll(rememberScrollState(), reverseScrolling = true), + modifier = Modifier + .horizontalScroll(rememberScrollState()) // Must be first + .clickable(onClick = onClick) + .then(modifier) ) { Text( + modifier = Modifier.fillMaxWidth(), text = value.formatExpression(formatterSymbols), style = LocalNumberTypography.current.displaySmall .copy(color = textColor, textAlign = TextAlign.End), diff --git a/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt index cabc826f..7feb497a 100644 --- a/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt +++ b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt @@ -53,6 +53,10 @@ class CalculatorHistoryRepositoryImpl @Inject constructor( ) } + override suspend fun delete(item: HistoryItem) { + calculatorHistoryDao.delete(item.id) + } + override suspend fun clear() { calculatorHistoryDao.clear() } diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt index 6e83cc3e..3720083e 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt @@ -32,6 +32,9 @@ interface CalculatorHistoryDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(vararg historyEntity: CalculatorHistoryEntity) + @Query("DELETE FROM calculator_history WHERE entityId = :entityId") + suspend fun delete(entityId: Int) + @Query("DELETE FROM calculator_history") suspend fun clear() } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/CalculatorHistoryRepository.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/CalculatorHistoryRepository.kt index ce10de75..de010c19 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/CalculatorHistoryRepository.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/CalculatorHistoryRepository.kt @@ -26,7 +26,11 @@ interface CalculatorHistoryRepository { suspend fun add( expression: String, - result: String + result: String, + ) + + suspend fun delete( + item: HistoryItem, ) suspend fun clear() diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index a852154e..d986482e 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -101,7 +101,8 @@ internal fun CalculatorRoute( toggleCalculatorMode = viewModel::updateRadianMode, equal = viewModel::equal, clearHistory = viewModel::clearHistory, - addBracket = viewModel::addBracket + addBracket = viewModel::addBracket, + onDelete = viewModel::deleteHistoryItem, ) } @@ -117,7 +118,8 @@ internal fun CalculatorScreen( onCursorChange: (TextRange) -> Unit, toggleCalculatorMode: (Boolean) -> Unit, equal: () -> Unit, - clearHistory: () -> Unit + clearHistory: () -> Unit, + onDelete: (HistoryItem) -> Unit, ) { when (uiState) { is CalculatorUIState.Loading -> EmptyScreen() @@ -132,7 +134,8 @@ internal fun CalculatorScreen( toggleAngleMode = { toggleCalculatorMode(!uiState.radianMode) }, equal = equal, clearHistory = clearHistory, - addBracket = addBracket + addBracket = addBracket, + onDelete = onDelete, ) } } @@ -149,18 +152,27 @@ private fun Ready( onCursorChange: (TextRange) -> Unit, toggleAngleMode: () -> Unit, equal: () -> Unit, - clearHistory: () -> Unit + clearHistory: () -> Unit, + onDelete: (HistoryItem) -> Unit, ) { val focusManager = LocalFocusManager.current var showClearHistoryDialog by rememberSaveable { mutableStateOf(false) } - var showClearHistoryButton by rememberSaveable { mutableStateOf(false) } + val dragState = remember { + AnchoredDraggableState( + initialValue = DragState.CLOSED, + positionalThreshold = { 0f }, + velocityThreshold = { 0f }, + animationSpec = tween() + ) + } + val isOpen = dragState.currentValue == DragState.OPEN ScaffoldWithTopBar( title = { Text(stringResource(R.string.calculator_title)) }, navigationIcon = { MenuButton { navigateToMenu() } }, colors = TopAppBarDefaults.topAppBarColors(MaterialTheme.colorScheme.surfaceVariant), actions = { - Crossfade(showClearHistoryButton, label = "Clear button reveal") { + Crossfade(isOpen, label = "Clear button reveal") { if (it) { IconButton( onClick = { showClearHistoryDialog = true }, @@ -187,15 +199,6 @@ private fun Ready( val textBoxHeight = maxHeight * textBoxFill - val dragState = remember { - AnchoredDraggableState( - initialValue = DragState.CLOSED, - positionalThreshold = { 0f }, - velocityThreshold = { 0f }, - animationSpec = tween() - ) - } - var historyListHeight by remember { mutableStateOf(0.dp) } val keyboardHeight by remember(historyListHeight, textBoxHeight) { derivedStateOf { @@ -234,10 +237,6 @@ private fun Ready( focusManager.clearFocus() } - LaunchedEffect(dragState.currentValue) { - showClearHistoryButton = dragState.currentValue == DragState.OPEN - } - BackHandler(dragState.currentValue != DragState.CLOSED) { coroutineScope.launch { dragState.animateTo(DragState.CLOSED) @@ -251,7 +250,9 @@ private fun Ready( .height(historyListHeight), historyItems = uiState.history, formatterSymbols = uiState.formatterSymbols, - addTokens = addSymbol + addTokens = addSymbol, + onDelete = onDelete, + showDeleteButtons = isOpen ) TextBox( @@ -274,7 +275,14 @@ private fun Ready( CalculatorKeyboard( modifier = Modifier .semantics { testTag = "ready" } - .offset { IntOffset(x = 0, y = (historyListHeight + textBoxHeight).toPx().roundToInt()) } + .offset { + IntOffset( + x = 0, + y = (historyListHeight + textBoxHeight) + .toPx() + .roundToInt() + ) + } .height(keyboardHeight) .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 4.dp), @@ -375,6 +383,7 @@ private fun PreviewCalculatorScreen() { toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {} + addBracket = {}, + onDelete = {}, ) } \ No newline at end of file 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 93ecc99b..bce8601c 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 @@ -32,6 +32,7 @@ import com.sadellie.unitto.core.ui.common.textfield.getTextField import com.sadellie.unitto.data.common.format import com.sadellie.unitto.data.common.isExpression import com.sadellie.unitto.data.common.stateIn +import com.sadellie.unitto.data.model.HistoryItem import com.sadellie.unitto.data.model.repository.CalculatorHistoryRepository import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -180,6 +181,10 @@ internal class CalculatorViewModel @Inject constructor( calculatorHistoryRepository.clear() } + fun deleteHistoryItem(item: HistoryItem) = viewModelScope.launch(Dispatchers.IO) { + calculatorHistoryRepository.delete(item) + } + fun equal() = viewModelScope.launch { val prefs = _prefs.value ?: return@launch if (_equalClicked.value) return@launch diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt index c4269727..7ba3c09b 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -18,10 +18,15 @@ package com.sadellie.unitto.feature.calculator.components +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.Crossfade import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.LazyColumn @@ -29,7 +34,9 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.History +import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -53,18 +60,26 @@ internal fun HistoryList( historyItems: List, formatterSymbols: FormatterSymbols, addTokens: (String) -> Unit, + onDelete: (HistoryItem) -> Unit, + showDeleteButtons: Boolean, ) { - if (historyItems.isEmpty()) { - HistoryListPlaceholder( - modifier = modifier, - ) - } else { - HistoryListContent( - modifier = modifier, - historyItems = historyItems, - addTokens = addTokens, - formatterSymbols = formatterSymbols, - ) + Crossfade( + targetState = historyItems.isEmpty() + ) { emptyList -> + if (emptyList) { + HistoryListPlaceholder( + modifier = modifier, + ) + } else { + HistoryListContent( + modifier = modifier, + historyItems = historyItems, + formatterSymbols = formatterSymbols, + addTokens = addTokens, + onDelete = onDelete, + showDeleteButtons = showDeleteButtons, + ) + } } } @@ -92,19 +107,24 @@ private fun HistoryListPlaceholder( private fun HistoryListContent( modifier: Modifier, historyItems: List, - addTokens: (String) -> Unit, formatterSymbols: FormatterSymbols, + addTokens: (String) -> Unit, + onDelete: (HistoryItem) -> Unit, + showDeleteButtons: Boolean, ) { val state = rememberLazyListState() val focusManager = LocalFocusManager.current - // Very bad workaround for https://issuetracker.google.com/issues/295745063 - // Will remove once the fix is released + // Selection handles cause lag LaunchedEffect(state.isScrollInProgress) { focusManager.clearFocus(true) } - LaunchedEffect(historyItems) { state.scrollToItem(0) } + LaunchedEffect(historyItems) { + // Don't scroll when the UI is in state where user can delete an item. This fixes items + // placement animation + if (!showDeleteButtons) state.scrollToItem(0) + } LazyColumn( modifier = modifier, @@ -113,9 +133,12 @@ private fun HistoryListContent( ) { items(historyItems, { it.id }) { historyItem -> HistoryListItem( + modifier = Modifier.animateItemPlacement(), historyItem = historyItem, formatterSymbols = formatterSymbols, addTokens = addTokens, + onDelete = { onDelete(historyItem) }, + showDeleteButton = showDeleteButtons, ) } } @@ -127,24 +150,48 @@ private fun HistoryListItem( historyItem: HistoryItem, formatterSymbols: FormatterSymbols, addTokens: (String) -> Unit, + onDelete: () -> Unit, + showDeleteButton: Boolean, ) { - Column( + Row( modifier = modifier.height(HistoryItemHeight), - verticalArrangement = Arrangement.Center + verticalAlignment = Alignment.CenterVertically, ) { - FixedExpressionInputTextField( - value = historyItem.expression, - formatterSymbols = formatterSymbols, - textColor = MaterialTheme.colorScheme.onSurfaceVariant, - onClick = addTokens, - ) + AnimatedVisibility(visible = showDeleteButton) { + IconButton(onClick = onDelete) { + Icon( + modifier = Modifier, + imageVector = Icons.Outlined.Close, + contentDescription = stringResource(R.string.delete_label), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + Column( + modifier = Modifier + .weight(1f) + .fillMaxHeight(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.End + ) { + FixedExpressionInputTextField( + modifier = Modifier + .fillMaxWidth(), + value = historyItem.expression, + formatterSymbols = formatterSymbols, + textColor = MaterialTheme.colorScheme.onSurfaceVariant, + onClick = { addTokens(historyItem.expression) }, + ) - FixedExpressionInputTextField( - value = historyItem.result, - formatterSymbols = formatterSymbols, - textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f), - onClick = addTokens, - ) + FixedExpressionInputTextField( + modifier = Modifier + .fillMaxWidth(), + value = historyItem.result, + formatterSymbols = formatterSymbols, + textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f), + onClick = { addTokens(historyItem.result) }, + ) + } } } @@ -179,6 +226,8 @@ private fun PreviewHistoryList() { .fillMaxSize(), historyItems = historyItems, formatterSymbols = FormatterSymbols.Spaces, - addTokens = {} + addTokens = {}, + onDelete = {}, + showDeleteButtons = true, ) } From bf9bf378127465987ac05f6b9cf1c321d99cd545 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 5 Feb 2024 00:10:23 +0300 Subject: [PATCH 04/46] Clean up build files --- data/backup/build.gradle.kts | 4 ---- data/converter/build.gradle.kts | 3 --- feature/calculator/build.gradle.kts | 4 ---- feature/converter/build.gradle.kts | 3 --- feature/settings/build.gradle.kts | 1 - feature/timezone/build.gradle.kts | 1 - settings.gradle.kts | 34 ++++++++++++++--------------- 7 files changed, 17 insertions(+), 33 deletions(-) diff --git a/data/backup/build.gradle.kts b/data/backup/build.gradle.kts index ec96ab57..4543573c 100644 --- a/data/backup/build.gradle.kts +++ b/data/backup/build.gradle.kts @@ -34,10 +34,6 @@ android { } dependencies { - implementation(libs.androidx.datastore.datastore.preferences) - implementation(libs.com.github.sadellie.themmo.core) - implementation(project(":data:database")) - implementation(project(":data:model")) implementation(project(":data:userprefs")) } diff --git a/data/converter/build.gradle.kts b/data/converter/build.gradle.kts index ccaf2c9b..43f19b5a 100644 --- a/data/converter/build.gradle.kts +++ b/data/converter/build.gradle.kts @@ -35,9 +35,6 @@ android { } dependencies { - implementation(libs.androidx.lifecycle.lifecycle.runtime.compose) - implementation(libs.androidx.datastore.datastore.preferences) - implementation(libs.com.squareup.moshi.moshi.kotlin) implementation(libs.com.squareup.retrofit2.converter.moshi) diff --git a/feature/calculator/build.gradle.kts b/feature/calculator/build.gradle.kts index 6fa0b2f3..7fa35518 100644 --- a/feature/calculator/build.gradle.kts +++ b/feature/calculator/build.gradle.kts @@ -31,10 +31,6 @@ dependencies { testImplementation(libs.org.robolectric.robolectric) testImplementation(libs.org.jetbrains.kotlinx.kotlinx.coroutines.test) - implementation(libs.androidx.glance.glance) - implementation(libs.androidx.glance.glance.appwidget) - implementation(libs.androidx.glance.glance.material3) - implementation(project(":data:calculator")) implementation(project(":data:common")) implementation(project(":data:database")) diff --git a/feature/converter/build.gradle.kts b/feature/converter/build.gradle.kts index 8bdfcc50..762210f9 100644 --- a/feature/converter/build.gradle.kts +++ b/feature/converter/build.gradle.kts @@ -36,9 +36,6 @@ dependencies { ksp(libs.androidx.room.compiler) testImplementation(libs.androidx.datastore.datastore.preferences) - implementation(libs.com.squareup.moshi.moshi.kotlin) - implementation(libs.com.squareup.retrofit2.converter.moshi) - implementation(project(":data:common")) implementation(project(":data:database")) implementation(project(":data:evaluatto")) diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 9a36944c..47072fd5 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -37,5 +37,4 @@ dependencies { implementation(project(":data:model")) implementation(project(":data:licenses")) implementation(project(":data:userprefs")) - implementation(project(":feature:glance")) } diff --git a/feature/timezone/build.gradle.kts b/feature/timezone/build.gradle.kts index 40d7989f..9b54f75c 100644 --- a/feature/timezone/build.gradle.kts +++ b/feature/timezone/build.gradle.kts @@ -29,7 +29,6 @@ android.namespace = "com.sadellie.unitto.feature.timezone" dependencies { testImplementation(libs.org.robolectric.robolectric) - implementation(libs.com.github.sadellie.themmo) implementation(libs.org.burnoutcrew.composereorderable.reorderable) implementation(libs.androidx.appcompat.appcompat) diff --git a/settings.gradle.kts b/settings.gradle.kts index a36678e5..c7712e0c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,23 +36,23 @@ dependencyResolutionManagement { } rootProject.name = "Unitto" include(":app") -include(":data:converter") +include(":benchmark") include(":core:base") include(":core:ui") -include(":feature:converter") -include(":feature:calculator") -include(":feature:datecalculator") -include(":feature:timezone") -include(":feature:bodymass") -include(":feature:settings") -include(":feature:glance") -include(":data:userprefs") -include(":data:licenses") -include(":data:calculator") -include(":data:database") -include(":data:model") -include(":data:common") -include(":data:evaluatto") -include(":data:timezone") include(":data:backup") -include(":benchmark") +include(":data:calculator") +include(":data:common") +include(":data:converter") +include(":data:database") +include(":data:evaluatto") +include(":data:licenses") +include(":data:model") +include(":data:timezone") +include(":data:userprefs") +include(":feature:bodymass") +include(":feature:calculator") +include(":feature:converter") +include(":feature:datecalculator") +include(":feature:glance") +include(":feature:settings") +include(":feature:timezone") From 5c81a1c6750f833c206ae922b4a1324766d125ab Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 5 Feb 2024 23:30:20 +0300 Subject: [PATCH 05/46] Prepare for text2 Enabled physical keyboard support (#148), but not tested --- .../common/textfield/ClipboardManagerExt.kt | 55 ++++--- .../ui/common/textfield/InputTextField.kt | 139 ++++++------------ .../calculator/CalculatorScreenTest.kt | 17 ++- .../feature/calculator/CalculatorScreen.kt | 15 +- .../feature/calculator/CalculatorViewModel.kt | 4 +- .../feature/calculator/components/TextBox.kt | 27 ++-- .../feature/converter/ConverterScreen.kt | 77 +++++----- .../feature/converter/ConverterViewModel.kt | 3 +- 8 files changed, 148 insertions(+), 189 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt index a606b219..600d5efb 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt @@ -18,37 +18,46 @@ package com.sadellie.unitto.core.ui.common.textfield +import android.content.ClipData import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.input.TextFieldValue import com.sadellie.unitto.core.base.Token /** - * Copy value to clipboard with fractional symbols. + * Unformatted values are expected. Basically what BigDecimal and Expression parser use. * - * Example: - * "123456.789" will be copied as "123456,789" - * - * @param value Internal [TextFieldValue] without formatting with [Token.Digit.dot] as fractional. + * @property formatterSymbols Current [FormatterSymbols]. + * @property clipboardManager [android.content.ClipboardManager] provided by system. */ -internal fun ClipboardManager.copyWithFractional( - value: TextFieldValue, - formatterSymbols: FormatterSymbols -) = this.setText( - AnnotatedString( - value.annotatedString - .subSequence(value.selection) - .text - .replace(Token.Digit.dot, formatterSymbols.fractional) +internal class ExpressionClipboardManager( + private val formatterSymbols: FormatterSymbols, + private val clipboardManager: android.content.ClipboardManager +): ClipboardManager { + override fun setText(annotatedString: AnnotatedString) = clipboardManager.setPrimaryClip( + ClipData.newPlainText( + PLAIN_TEXT_LABEL, + annotatedString + .text + .replace(Token.Digit.dot, formatterSymbols.fractional) + ) ) -) -internal fun ClipboardManager.copy(value: TextFieldValue) = this.setText( - AnnotatedString( - value.annotatedString - .subSequence(value.selection) - .text - ) -) + override fun getText(): AnnotatedString? = clipboardManager.primaryClip?.let { primaryClip -> + if (primaryClip.itemCount > 0) { + val clipText = primaryClip.getItemAt(0)?.text ?:return@let null + + clipText + .toString() + .toAnnotatedString() + } else { + null + } + } + + override fun hasText() = + clipboardManager.primaryClipDescription?.hasMimeType("text/*") ?: false +} internal const val PLAIN_TEXT_LABEL = "plain text" + +private fun CharSequence.toAnnotatedString(): AnnotatedString = AnnotatedString(this.toString()) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt index bb7e02e9..4ebc36b5 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt @@ -18,7 +18,7 @@ package com.sadellie.unitto.core.ui.common.textfield -import androidx.compose.foundation.clickable +import android.content.Context import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.BasicTextField @@ -32,27 +32,19 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalTextInputService -import androidx.compose.ui.platform.LocalTextToolbar -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.platform.TextToolbar import androidx.compose.ui.text.TextLayoutResult -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.TextUnit import com.sadellie.unitto.core.ui.common.autosize.AutoSizeTextStyleBox -import com.sadellie.unitto.core.ui.common.textfield.texttoolbar.UnittoTextToolbar import com.sadellie.unitto.core.ui.theme.LocalNumberTypography @Composable @@ -60,105 +52,86 @@ fun ExpressionTextField( modifier: Modifier, value: TextFieldValue, minRatio: Float = 1f, - cutCallback: () -> Unit = {}, - pasteCallback: (String) -> Unit = {}, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, textColor: Color = MaterialTheme.colorScheme.onSurfaceVariant, formatterSymbols: FormatterSymbols, readOnly: Boolean = false, placeholder: String = "", ) { - val localView = LocalView.current - val clipboardManager = LocalClipboardManager.current - val expressionTransformer = remember(formatterSymbols) { ExpressionTransformer(formatterSymbols) } - - fun copyCallback() { - clipboardManager.copyWithFractional(value, formatterSymbols) - onCursorChange(TextRange(value.selection.end)) + val context = LocalContext.current + val clipboardManager = remember(formatterSymbols) { + ExpressionClipboardManager( + formatterSymbols = formatterSymbols, + clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) + as android.content.ClipboardManager + ) + } + val expressionTransformer = remember(formatterSymbols) { + ExpressionTransformer(formatterSymbols) } - val textToolbar: UnittoTextToolbar = if (readOnly) { - UnittoTextToolbar( - view = localView, - copyCallback = ::copyCallback, - ) - } else { - UnittoTextToolbar( - view = localView, - copyCallback = ::copyCallback, - pasteCallback = { - pasteCallback(clipboardManager.getText()?.text?.clearAndFilterExpression(formatterSymbols) ?: "") + CompositionLocalProvider( + LocalClipboardManager provides clipboardManager + ) { + AutoSizeTextField( + modifier = modifier, + value = value, + onValueChange = { + onValueChange(it.copy(text = it.text.clearAndFilterExpression(formatterSymbols))) }, - cutCallback = { - clipboardManager.copyWithFractional(value, formatterSymbols) - cutCallback() - } + placeholder = placeholder, + readOnly = readOnly, + textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), + visualTransformation = expressionTransformer, + cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), + minRatio = minRatio ) } +} +@Composable +fun NumberBaseTextField( + modifier: Modifier, + value: TextFieldValue, + minRatio: Float = 1f, + onValueChange: (TextFieldValue) -> Unit, + textColor: Color = MaterialTheme.colorScheme.onSurfaceVariant, + readOnly: Boolean = false, + placeholder: String = "", +) { AutoSizeTextField( modifier = modifier, value = value, - onValueChange = { onCursorChange(it.selection) }, + onValueChange = { + onValueChange(it.copy(text = it.text.clearAndFilterNumberBase())) + }, placeholder = placeholder, - textToolbar = textToolbar, readOnly = readOnly, textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), - visualTransformation = expressionTransformer, cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), minRatio = minRatio ) } @Composable -fun UnformattedTextField( +fun SimpleTextField( modifier: Modifier, value: TextFieldValue, minRatio: Float = 1f, - cutCallback: () -> Unit = {}, - pasteCallback: (String) -> Unit = {}, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, textColor: Color = MaterialTheme.colorScheme.onSurfaceVariant, readOnly: Boolean = false, placeholder: String = "", ) { - val localView = LocalView.current - val clipboardManager = LocalClipboardManager.current - fun copyCallback() { - clipboardManager.copy(value) - onCursorChange(TextRange(value.selection.end)) - } - - val textToolbar: UnittoTextToolbar = remember(readOnly) { - if (readOnly) { - UnittoTextToolbar( - view = localView, - copyCallback = ::copyCallback, - ) - } else { - UnittoTextToolbar( - view = localView, - copyCallback = ::copyCallback, - pasteCallback = { - pasteCallback(clipboardManager.getText()?.text?.clearAndFilterNumberBase() ?: "") - }, - cutCallback = { - clipboardManager.copy(value) - cutCallback() - } - ) - } - } - AutoSizeTextField( modifier = modifier, value = value, - onValueChange = { onCursorChange(it.selection) }, + onValueChange = onValueChange, placeholder = placeholder, - textToolbar = textToolbar, readOnly = readOnly, - textStyle = LocalNumberTypography.current.displayLarge.copy(color = textColor), - minRatio = minRatio, + textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), + cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), + minRatio = minRatio ) } @@ -166,7 +139,6 @@ fun UnformattedTextField( * Based on: https://gist.github.com/inidamleader/b594d35362ebcf3cedf81055df519300 * * @param placeholder Placeholder text, shown when [value] is empty. - * @param textToolbar [TextToolbar] with modified actions in menu. * @param alignment The alignment of the text within its container. * @see [BasicTextField] * @see [AutoSizeTextStyleBox] @@ -177,7 +149,6 @@ private fun AutoSizeTextField( value: TextFieldValue, onValueChange: (TextFieldValue) -> Unit, placeholder: String? = null, - textToolbar: TextToolbar = LocalTextToolbar.current, enabled: Boolean = true, readOnly: Boolean = false, textStyle: TextStyle = TextStyle.Default, @@ -206,28 +177,14 @@ private fun AutoSizeTextField( ) { CompositionLocalProvider( LocalTextInputService provides null, - LocalTextToolbar provides textToolbar ) { - val currentTextToolbar = LocalTextToolbar.current val style = LocalTextStyle.current - val focusRequester = remember { FocusRequester() } BasicTextField( value = value, onValueChange = onValueChange, modifier = Modifier - .fillMaxWidth() - .focusRequester(focusRequester) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = null, - onClick = { - currentTextToolbar.hide() - focusRequester.requestFocus() - onValueChange(value.copy(selection = TextRange.Zero)) - currentTextToolbar.showMenu(Rect(Offset.Zero, 0f)) - } - ), + .fillMaxWidth(), enabled = enabled, readOnly = readOnly, textStyle = style, diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index 653c3253..f6e8547e 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -46,11 +46,12 @@ class CalculatorScreenTest { addTokens = {}, clearInput = {}, deleteTokens = {}, - onCursorChange = {}, + onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {} + addBracket = {}, + onDelete = {}, ) } @@ -69,7 +70,6 @@ class CalculatorScreenTest { outputFormat = OutputFormat.PLAIN, formatterSymbols = FormatterSymbols.Spaces, history = emptyList(), - allowVibration = false, middleZero = false, acButton = true, partialHistoryView = true @@ -79,11 +79,12 @@ class CalculatorScreenTest { addTokens = {}, clearInput = {}, deleteTokens = {}, - onCursorChange = {}, + onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {} + addBracket = {}, + onDelete = {}, ) } @@ -103,7 +104,6 @@ class CalculatorScreenTest { outputFormat = OutputFormat.PLAIN, formatterSymbols = FormatterSymbols.Spaces, history = emptyList(), - allowVibration = false, middleZero = false, acButton = true, partialHistoryView = true @@ -113,11 +113,12 @@ class CalculatorScreenTest { addTokens = {}, clearInput = {}, deleteTokens = {}, - onCursorChange = {}, + onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {} + addBracket = {}, + onDelete = {}, ) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index d986482e..3018ea8a 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -56,7 +56,6 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset @@ -97,7 +96,7 @@ internal fun CalculatorRoute( addTokens = viewModel::addTokens, clearInput = viewModel::clearInput, deleteTokens = viewModel::deleteTokens, - onCursorChange = viewModel::onCursorChange, + onValueChange = viewModel::updateInput, toggleCalculatorMode = viewModel::updateRadianMode, equal = viewModel::equal, clearHistory = viewModel::clearHistory, @@ -115,7 +114,7 @@ internal fun CalculatorScreen( addBracket: () -> Unit, clearInput: () -> Unit, deleteTokens: () -> Unit, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, toggleCalculatorMode: (Boolean) -> Unit, equal: () -> Unit, clearHistory: () -> Unit, @@ -130,7 +129,7 @@ internal fun CalculatorScreen( addSymbol = addTokens, clearSymbols = clearInput, deleteSymbol = deleteTokens, - onCursorChange = onCursorChange, + onValueChange = onValueChange, toggleAngleMode = { toggleCalculatorMode(!uiState.radianMode) }, equal = equal, clearHistory = clearHistory, @@ -149,7 +148,7 @@ private fun Ready( addBracket: () -> Unit, clearSymbols: () -> Unit, deleteSymbol: () -> Unit, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, toggleAngleMode: () -> Unit, equal: () -> Unit, clearHistory: () -> Unit, @@ -266,9 +265,7 @@ private fun Ready( ), formatterSymbols = uiState.formatterSymbols, input = uiState.input, - deleteSymbol = deleteSymbol, - addSymbol = addSymbol, - onCursorChange = onCursorChange, + onValueChange = onValueChange, output = uiState.output ) @@ -379,7 +376,7 @@ private fun PreviewCalculatorScreen() { addTokens = {}, clearInput = {}, deleteTokens = {}, - onCursorChange = {}, + onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, 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 bce8601c..1a70fbcc 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 @@ -166,11 +166,11 @@ internal class CalculatorViewModel @Inject constructor( TextFieldValue() } - fun onCursorChange(selection: TextRange) = _input.update { + fun updateInput(value: TextFieldValue) = _input.update { // Without this line: will place token (even in the middle of the input) and place cursor at // the end. This line also removes fractional output once user touches input text field _equalClicked.update { false } - it.copy(selection = selection) + value } fun updateRadianMode(newValue: Boolean) = viewModelScope.launch { diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt index f94099ed..e1daaf1a 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt @@ -37,14 +37,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowHeightSizeClass import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols -import com.sadellie.unitto.core.ui.common.textfield.UnformattedTextField +import com.sadellie.unitto.core.ui.common.textfield.SimpleTextField import com.sadellie.unitto.feature.calculator.CalculationResult @Composable @@ -52,9 +51,7 @@ fun TextBox( modifier: Modifier, formatterSymbols: FormatterSymbols, input: TextFieldValue, - deleteSymbol: () -> Unit, - addSymbol: (String) -> Unit, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, output: CalculationResult, ) { Column( @@ -77,9 +74,7 @@ fun TextBox( .padding(horizontal = 8.dp), value = input, minRatio = 0.5f, - cutCallback = deleteSymbol, - pasteCallback = addSymbol, - onCursorChange = onCursorChange, + onValueChange = onValueChange, formatterSymbols = formatterSymbols ) if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) { @@ -105,9 +100,9 @@ fun TextBox( .padding(horizontal = 8.dp), value = outputTF, minRatio = 0.8f, - onCursorChange = { outputTF = outputTF.copy(selection = it) }, - formatterSymbols = formatterSymbols, + onValueChange = { outputTF = it }, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.6f), + formatterSymbols = formatterSymbols, readOnly = true, ) } @@ -123,36 +118,36 @@ fun TextBox( .padding(horizontal = 8.dp), value = outputTF, minRatio = 0.8f, - onCursorChange = { outputTF = outputTF.copy(selection = it) }, - formatterSymbols = formatterSymbols, + onValueChange = { outputTF = it }, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.6f), + formatterSymbols = formatterSymbols, readOnly = true, ) } is CalculationResult.DivideByZeroError -> { - UnformattedTextField( + SimpleTextField( modifier = Modifier .weight(2f) .fillMaxWidth() .padding(horizontal = 8.dp), value = TextFieldValue(stringResource(output.label)), minRatio = 0.8f, - onCursorChange = {}, + onValueChange = {}, textColor = MaterialTheme.colorScheme.error, readOnly = true, ) } is CalculationResult.Error -> { - UnformattedTextField( + SimpleTextField( modifier = Modifier .weight(2f) .fillMaxWidth() .padding(horizontal = 8.dp), value = TextFieldValue(stringResource(output.label)), minRatio = 0.8f, - onCursorChange = {}, + onValueChange = {}, textColor = MaterialTheme.colorScheme.error, readOnly = true, ) diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index eb9548f3..824aedd8 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -64,7 +64,6 @@ import androidx.compose.ui.focus.onFocusEvent import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -83,7 +82,8 @@ import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.core.ui.common.SettingsButton import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols -import com.sadellie.unitto.core.ui.common.textfield.UnformattedTextField +import com.sadellie.unitto.core.ui.common.textfield.NumberBaseTextField +import com.sadellie.unitto.core.ui.common.textfield.SimpleTextField import com.sadellie.unitto.core.ui.datetime.formatDateWeekDayMonthYear import com.sadellie.unitto.data.common.format import com.sadellie.unitto.data.converter.UnitID @@ -114,7 +114,7 @@ internal fun ConverterRoute( processInput = viewModel::addTokens, deleteDigit = viewModel::deleteTokens, clearInput = viewModel::clearInput, - onCursorChange = viewModel::onCursorChange, + onValueChange = viewModel::updateInput, onFocusOnInput2 = viewModel::updateFocused, onErrorClick = viewModel::updateCurrencyRates, addBracket = viewModel::addBracket @@ -132,7 +132,7 @@ private fun ConverterScreen( processInput: (String) -> Unit, deleteDigit: () -> Unit, clearInput: () -> Unit, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, onFocusOnInput2: (Boolean) -> Unit, onErrorClick: (AbstractUnit) -> Unit, addBracket: () -> Unit, @@ -148,7 +148,7 @@ private fun ConverterScreen( NumberBase( modifier = Modifier.padding(it), uiState = uiState, - onCursorChange = onCursorChange, + onValueChange = onValueChange, processInput = processInput, deleteDigit = deleteDigit, navigateToLeftScreen = navigateToLeftScreen, @@ -167,7 +167,7 @@ private fun ConverterScreen( Default( modifier = Modifier.padding(it), uiState = uiState, - onCursorChange = onCursorChange, + onValueChange = onValueChange, onFocusOnInput2 = onFocusOnInput2, processInput = processInput, deleteDigit = deleteDigit, @@ -204,7 +204,7 @@ private fun UnitConverterTopBar( private fun NumberBase( modifier: Modifier, uiState: UnitConverterUIState.NumberBase, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, processInput: (String) -> Unit, deleteDigit: () -> Unit, navigateToLeftScreen: () -> Unit, @@ -218,14 +218,12 @@ private fun NumberBase( ColumnWithConstraints(modifier = contentModifier) { val textFieldModifier = Modifier.weight(2f) - UnformattedTextField( + NumberBaseTextField( modifier = textFieldModifier, minRatio = 0.7f, placeholder = Token.Digit._0, value = uiState.input, - onCursorChange = onCursorChange, - pasteCallback = processInput, - cutCallback = deleteDigit, + onValueChange = onValueChange, ) AnimatedUnitShortName(stringResource(uiState.unitFrom.shortName)) @@ -261,7 +259,7 @@ private fun NumberBase( private fun Default( modifier: Modifier, uiState: UnitConverterUIState.Default, - onCursorChange: (TextRange) -> Unit, + onValueChange: (TextFieldValue) -> Unit, onFocusOnInput2: (Boolean) -> Unit, processInput: (String) -> Unit, deleteDigit: () -> Unit, @@ -330,13 +328,11 @@ private fun Default( ) { ExpressionTextField( modifier = Modifier.fillMaxWidth().weight(1f), - minRatio = 0.7f, - placeholder = Token.Digit._0, value = uiState.input1, - onCursorChange = onCursorChange, - pasteCallback = processInput, - cutCallback = deleteDigit, + minRatio = 0.7f, + onValueChange = onValueChange, formatterSymbols = uiState.formatterSymbols, + placeholder = Token.Digit._0, ) AnimatedUnitShortName(stringResource(uiState.unitFrom.shortName)) } @@ -351,13 +347,11 @@ private fun Default( ExpressionTextField( modifier = Modifier.fillMaxWidth().weight(1f) .onFocusEvent { state -> onFocusOnInput2(state.hasFocus) }, - minRatio = 0.7f, - placeholder = Token.Digit._0, value = uiState.input2, - onCursorChange = onCursorChange, - pasteCallback = processInput, - cutCallback = deleteDigit, + minRatio = 0.7f, + onValueChange = onValueChange, formatterSymbols = uiState.formatterSymbols, + placeholder = Token.Digit._0, ) AnimatedUnitShortName(stringResource(R.string.unit_inch_short)) } @@ -365,13 +359,11 @@ private fun Default( } else { ExpressionTextField( modifier = textFieldModifier, - minRatio = 0.7f, - placeholder = Token.Digit._0, value = uiState.input1, - onCursorChange = onCursorChange, - pasteCallback = processInput, - cutCallback = deleteDigit, + minRatio = 0.7f, + onValueChange = onValueChange, formatterSymbols = uiState.formatterSymbols, + placeholder = Token.Digit._0, ) AnimatedVisibility( visible = calculation.text.isNotEmpty(), @@ -382,10 +374,10 @@ private fun Default( ExpressionTextField( modifier = Modifier, value = calculation, - onCursorChange = { calculation = calculation.copy(selection = it) }, - formatterSymbols = uiState.formatterSymbols, minRatio = 0.7f, + onValueChange = { calculation = it }, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f), + formatterSymbols = uiState.formatterSymbols, readOnly = true ) } @@ -456,20 +448,20 @@ private fun ConverterResultTextField( when (result) { is ConverterResult.Loading -> { - UnformattedTextField( + SimpleTextField( modifier = modifier, value = TextFieldValue(stringResource(R.string.loading_label)), - onCursorChange = {}, + onValueChange = {}, minRatio = 0.7f, readOnly = true ) } is ConverterResult.Error -> { - UnformattedTextField( + SimpleTextField( modifier = modifier, value = TextFieldValue(stringResource(R.string.error_label)), - onCursorChange = { onErrorClick() }, + onValueChange = { onErrorClick() }, minRatio = 0.7f, readOnly = true, textColor = MaterialTheme.colorScheme.error, @@ -480,20 +472,29 @@ private fun ConverterResultTextField( ExpressionTextField( modifier = modifier, value = resultTextField, - onCursorChange = { resultTextField = resultTextField.copy(selection = it) }, + minRatio = 0.7f, + onValueChange = { resultTextField = it }, formatterSymbols = formatterSymbols, + readOnly = true + ) + } + + is ConverterResult.NumberBase -> { + NumberBaseTextField( + modifier = modifier, + value = resultTextField, + onValueChange = { resultTextField = it }, minRatio = 0.7f, readOnly = true ) } - is ConverterResult.NumberBase, is ConverterResult.Time, is ConverterResult.FootInch -> { - UnformattedTextField( + SimpleTextField( modifier = modifier, value = resultTextField, - onCursorChange = { resultTextField = resultTextField.copy(selection = it) }, + onValueChange = { resultTextField = it }, minRatio = 0.7f, readOnly = true ) @@ -585,7 +586,7 @@ private fun PreviewConverterScreen() { processInput = {}, deleteDigit = {}, clearInput = {}, - onCursorChange = {}, + onValueChange = {}, onFocusOnInput2 = {}, onErrorClick = {}, addBracket = {} 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 70a3e623..3bcc19b5 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 @@ -18,7 +18,6 @@ package com.sadellie.unitto.feature.converter -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel @@ -321,7 +320,7 @@ internal class ConverterViewModel @Inject constructor( } } - fun onCursorChange(selection: TextRange) = _input1.update { it.copy(selection = selection) } + fun updateInput(value: TextFieldValue) = _input1.update { value } fun updateCurrencyRates(unit: AbstractUnit) { _loadCurrenciesJob = viewModelScope.launch(Dispatchers.IO) { From 32eb7422d5ad7a2ed3828d6be096bab27399f3d4 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Tue, 6 Feb 2024 18:07:25 +0300 Subject: [PATCH 06/46] Refactor UnitGroupsScreen --- .../sadellie/unitto/data/model/UnitGroup.kt | 9 +- .../repository/UserPreferencesRepository.kt | 4 + .../unitto/data/userprefs/PreferenceExt.kt | 65 ++++++---- .../unitto/data/userprefs/PreferenceModels.kt | 3 +- .../unitto/data/userprefs/PrefsKeys.kt | 2 + .../unitto/data/userprefs/UserPreferences.kt | 20 ++- .../feature/converter/components/ChipsRow.kt | 5 +- .../converter/ConverterSettingsScreen.kt | 4 +- .../settings/navigation/SettingsNavigation.kt | 4 +- .../unitgroups/UnitGroupsRepository .kt | 115 ------------------ .../settings/unitgroups/UnitGroupsScreen.kt | 103 ++++++++++++---- .../settings/unitgroups/UnitGroupsUIState.kt | 30 +++++ .../unitgroups/UnitGroupsViewModel.kt | 93 ++++++-------- 13 files changed, 219 insertions(+), 238 deletions(-) delete mode 100644 feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsRepository .kt create mode 100644 feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt index 03510dab..d49f79d1 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt @@ -21,17 +21,10 @@ package com.sadellie.unitto.data.model import androidx.annotation.StringRes import com.sadellie.unitto.core.base.R -val ALL_UNIT_GROUPS: List by lazy { - UnitGroup.entries -} - -/** - * As not all measurements can be converted between each other, we separate them into groups. - * Within one group all measurements can be converted - */ enum class UnitGroup( @StringRes val res: Int ) { + // NOTE: This order is used as default for new users LENGTH(res = R.string.unit_group_length), CURRENCY(res = R.string.unit_group_currency), MASS(res = R.string.unit_group_mass), diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt index b8d3d74b..a88a5dbd 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt @@ -71,6 +71,10 @@ interface UserPreferencesRepository { suspend fun updateShownUnitGroups(shownUnitGroups: List) + suspend fun addShownUnitGroup(unitGroup: UnitGroup) + + suspend fun removeShownUnitGroup(unitGroup: UnitGroup) + suspend fun updateLastReadChangelog(value: String) suspend fun updateVibrations(enabled: Boolean) diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index cb394150..39e5e744 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -23,90 +23,105 @@ import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.Separator import com.sadellie.unitto.core.base.TopLevelDestinations import com.sadellie.unitto.data.converter.UnitID -import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import io.github.sadellie.themmo.core.MonetMode import io.github.sadellie.themmo.core.ThemingMode -fun Preferences.getEnableDynamicTheme(): Boolean { +internal fun Preferences.getEnableDynamicTheme(): Boolean { return this[PrefsKeys.ENABLE_DYNAMIC_THEME] ?: true } -fun Preferences.getThemingMode(): ThemingMode { +internal fun Preferences.getThemingMode(): ThemingMode { return this[PrefsKeys.THEMING_MODE] ?.letTryOrNull { ThemingMode.valueOf(it) } ?: ThemingMode.AUTO } -fun Preferences.getEnableAmoledTheme(): Boolean { +internal fun Preferences.getEnableAmoledTheme(): Boolean { return this[PrefsKeys.ENABLE_AMOLED_THEME] ?: false } -fun Preferences.getCustomColor(): Long { +internal fun Preferences.getCustomColor(): Long { return this[PrefsKeys.CUSTOM_COLOR] ?: 16L // From Color.Unspecified } -fun Preferences.getMonetMode(): MonetMode { +internal fun Preferences.getMonetMode(): MonetMode { return this[PrefsKeys.MONET_MODE] ?.letTryOrNull { MonetMode.valueOf(it) } ?: MonetMode.TonalSpot } -fun Preferences.getStartingScreen(): String { +internal fun Preferences.getStartingScreen(): String { return this[PrefsKeys.STARTING_SCREEN] ?: TopLevelDestinations.CALCULATOR_GRAPH } -fun Preferences.getEnableToolsExperiment(): Boolean { +internal fun Preferences.getEnableToolsExperiment(): Boolean { return this[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] ?: false } -fun Preferences.getSystemFont(): Boolean { +internal fun Preferences.getSystemFont(): Boolean { return this[PrefsKeys.SYSTEM_FONT] ?: false } -fun Preferences.getLastReadChangelog(): String { +internal fun Preferences.getLastReadChangelog(): String { return this[PrefsKeys.LAST_READ_CHANGELOG] ?: "" } -fun Preferences.getEnableVibrations(): Boolean { +internal fun Preferences.getEnableVibrations(): Boolean { return this[PrefsKeys.ENABLE_VIBRATIONS] ?: true } -fun Preferences.getRadianMode(): Boolean { +internal fun Preferences.getRadianMode(): Boolean { return this[PrefsKeys.RADIAN_MODE] ?: true } -fun Preferences.getSeparator(): Int { +internal fun Preferences.getSeparator(): Int { return this[PrefsKeys.SEPARATOR] ?: Separator.SPACE } -fun Preferences.getMiddleZero(): Boolean { +internal fun Preferences.getMiddleZero(): Boolean { return this[PrefsKeys.MIDDLE_ZERO] ?: true } -fun Preferences.getPartialHistoryView(): Boolean { +internal fun Preferences.getPartialHistoryView(): Boolean { return this[PrefsKeys.PARTIAL_HISTORY_VIEW] ?: true } -fun Preferences.getDigitsPrecision(): Int { +internal fun Preferences.getDigitsPrecision(): Int { return this[PrefsKeys.DIGITS_PRECISION] ?: 3 } -fun Preferences.getOutputFormat(): Int { +internal fun Preferences.getOutputFormat(): Int { return this[PrefsKeys.OUTPUT_FORMAT] ?: OutputFormat.PLAIN } -fun Preferences.getUnitConverterFormatTime(): Boolean { +internal fun Preferences.getUnitConverterFormatTime(): Boolean { return this[PrefsKeys.UNIT_CONVERTER_FORMAT_TIME] ?: false } -fun Preferences.getUnitConverterSorting(): UnitsListSorting { +internal fun Preferences.getUnitConverterSorting(): UnitsListSorting { return this[PrefsKeys.UNIT_CONVERTER_SORTING] ?.let { UnitsListSorting.valueOf(it) } ?: UnitsListSorting.USAGE } -fun Preferences.getShownUnitGroups(): List { +// TODO Remove when 80% users are on sets +internal fun Preferences.getShownUnitGroups(): List { +// Uncomment once legacy is gone +// return this[PrefsKeys.ENABLED_UNIT_GROUPS] +// ?.letTryOrNull { stringSet: Set -> +// stringSet.map { UnitGroup.valueOf(it) } +// } ?: UnitGroup.entries + + // Try new method + val unitGroups: List? = this[PrefsKeys.ENABLED_UNIT_GROUPS] + ?.letTryOrNull { stringSet: Set -> + stringSet.map { UnitGroup.valueOf(it) } + } + + if (!unitGroups.isNullOrEmpty()) return unitGroups + + // Failed to get from sets, try old method return this[PrefsKeys.SHOWN_UNIT_GROUPS] ?.letTryOrNull { list -> list @@ -114,23 +129,23 @@ fun Preferences.getShownUnitGroups(): List { .split(",") .map { UnitGroup.valueOf(it) } } - ?: ALL_UNIT_GROUPS + ?: UnitGroup.entries } -fun Preferences.getUnitConverterFavoritesOnly(): Boolean { +internal fun Preferences.getUnitConverterFavoritesOnly(): Boolean { return this[PrefsKeys.UNIT_CONVERTER_FAVORITES_ONLY] ?: false } -fun Preferences.getLatestLeftSide(): String { +internal fun Preferences.getLatestLeftSide(): String { return this[PrefsKeys.LATEST_LEFT_SIDE] ?: UnitID.kilometer } -fun Preferences.getLatestRightSide(): String { +internal fun Preferences.getLatestRightSide(): String { return this[PrefsKeys.LATEST_RIGHT_SIDE] ?: UnitID.mile } -fun Preferences.getAcButton(): Boolean { +internal fun Preferences.getAcButton(): Boolean { return this[PrefsKeys.AC_BUTTON] ?: true } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt index d9b09e13..6b152cde 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt @@ -18,7 +18,6 @@ package com.sadellie.unitto.data.userprefs -import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.userprefs.AboutPreferences @@ -90,7 +89,7 @@ data class FormattingPreferencesImpl( ) : FormattingPreferences data class UnitGroupsPreferencesImpl( - override val shownUnitGroups: List = ALL_UNIT_GROUPS, + override val shownUnitGroups: List = UnitGroup.entries, ) : UnitGroupsPreferences data class AddSubtractPreferencesImpl( diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt index 0c65ccce..9b70976d 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt @@ -22,6 +22,7 @@ import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.core.stringSetPreferencesKey object PrefsKeys { // COMMON @@ -52,6 +53,7 @@ object PrefsKeys { val LATEST_LEFT_SIDE = stringPreferencesKey("LATEST_LEFT_SIDE_PREF_KEY") val LATEST_RIGHT_SIDE = stringPreferencesKey("LATEST_RIGHT_SIDE_PREF_KEY") val SHOWN_UNIT_GROUPS = stringPreferencesKey("SHOWN_UNIT_GROUPS_PREF_KEY") + val ENABLED_UNIT_GROUPS = stringSetPreferencesKey("ENABLED_UNIT_GROUPS_PREF_KEY") val UNIT_CONVERTER_FAVORITES_ONLY = booleanPreferencesKey("UNIT_CONVERTER_FAVORITES_ONLY_PREF_KEY") val UNIT_CONVERTER_FORMAT_TIME = booleanPreferencesKey("UNIT_CONVERTER_FORMAT_TIME_PREF_KEY") val UNIT_CONVERTER_SORTING = stringPreferencesKey("UNIT_CONVERTER_SORTING_PREF_KEY") diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt index 92213e0e..56e20694 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt @@ -221,7 +221,25 @@ class UserPreferencesRepositoryImpl @Inject constructor( override suspend fun updateShownUnitGroups(shownUnitGroups: List) { dataStore.edit { preferences -> - preferences[PrefsKeys.SHOWN_UNIT_GROUPS] = shownUnitGroups.joinToString(",") + preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = shownUnitGroups + .map { it.name } + .toSet() + } + } + + override suspend fun addShownUnitGroup(unitGroup: UnitGroup) { + dataStore.edit { preferences -> + preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = preferences[PrefsKeys.ENABLED_UNIT_GROUPS] + ?.plus(unitGroup.name) + ?: emptySet() + } + } + + override suspend fun removeShownUnitGroup(unitGroup: UnitGroup) { + dataStore.edit { preferences -> + preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = preferences[PrefsKeys.ENABLED_UNIT_GROUPS] + ?.minus(unitGroup.name) + ?: emptySet() } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt index 4d9b6e2a..55f54072 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt @@ -41,7 +41,6 @@ import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.common.AssistChip import com.sadellie.unitto.core.ui.common.FilterChip -import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS import com.sadellie.unitto.data.model.UnitGroup /** @@ -55,7 +54,7 @@ import com.sadellie.unitto.data.model.UnitGroup */ @Composable internal fun ChipsRow( - items: List = ALL_UNIT_GROUPS, + items: List = UnitGroup.entries, chosenUnitGroup: UnitGroup?, selectAction: (UnitGroup?) -> Unit, navigateToSettingsAction: () -> Unit, @@ -105,7 +104,7 @@ fun PreviewUnittoChips() { } ChipsRow( - items = ALL_UNIT_GROUPS, + items = UnitGroup.entries, chosenUnitGroup = selected, selectAction = { selectAction(it) }, navigateToSettingsAction = {}, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt index ffd84316..7d462f30 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt @@ -41,7 +41,7 @@ import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar -import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.userprefs.ConverterPreferences import com.sadellie.unitto.data.userprefs.ConverterPreferencesImpl @@ -139,7 +139,7 @@ private fun PreviewConverterSettingsScreen() { outputFormat = OutputFormat.PLAIN, unitConverterFormatTime = false, unitConverterSorting = UnitsListSorting.USAGE, - shownUnitGroups = ALL_UNIT_GROUPS, + shownUnitGroups = UnitGroup.entries, unitConverterFavoritesOnly = false, enableToolsExperiment = false, latestLeftSideUnit = "kilometer", diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt index fcb77b70..1229e1fe 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt @@ -34,7 +34,7 @@ import com.sadellie.unitto.feature.settings.formatting.FormattingRoute import com.sadellie.unitto.feature.settings.language.LanguageRoute import com.sadellie.unitto.feature.settings.startingscreen.StartingScreenRoute import com.sadellie.unitto.feature.settings.thirdparty.ThirdPartyLicensesScreen -import com.sadellie.unitto.feature.settings.unitgroups.UnitGroupsScreen +import com.sadellie.unitto.feature.settings.unitgroups.UnitGroupsRoute import io.github.sadellie.themmo.ThemmoController private val graph = DrawerItem.Settings.graph @@ -115,7 +115,7 @@ fun NavGraphBuilder.settingGraph( } unittoStackedComposable(unitsGroupRoute) { - UnitGroupsScreen( + UnitGroupsRoute( navigateUpAction = navController::navigateUp, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsRepository .kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsRepository .kt deleted file mode 100644 index e4d258ae..00000000 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsRepository .kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.settings.unitgroups - -import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS -import com.sadellie.unitto.data.model.UnitGroup -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import org.burnoutcrew.reorderable.ItemPosition -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Repository that holds information about shown and hidden [UnitGroup]s and provides methods to - * show/hide [UnitGroup]s. - */ -@Singleton -class UnitGroupsRepository @Inject constructor() { - - /** - * Mutex is need needed because we work with flow (sync stuff). - */ - private val mutex = Mutex() - - /** - * Currently shown [UnitGroup]s. - */ - var shownUnitGroups = MutableStateFlow(listOf()) - private set - - /** - * Currently hidden [UnitGroup]s. - */ - var hiddenUnitGroups = MutableStateFlow(listOf()) - private set - - /** - * Sets [shownUnitGroups] and updates [hiddenUnitGroups] as a side effect. [hiddenUnitGroups] is - * everything from [ALL_UNIT_GROUPS] that was not in [shownUnitGroups]. - * - * @param list List of [UnitGroup]s that need to be shown. - */ - suspend fun updateShownGroups(list: List) { - mutex.withLock { - shownUnitGroups.value = list - hiddenUnitGroups.value = ALL_UNIT_GROUPS - list.toSet() - } - } - - /** - * Moves [UnitGroup] from [shownUnitGroups] to [hiddenUnitGroups] - * - * @param unitGroup [UnitGroup] to hide. - */ - suspend fun markUnitGroupAsHidden(unitGroup: UnitGroup) { - mutex.withLock { - shownUnitGroups.value = shownUnitGroups.value - unitGroup - // Newly hidden unit will appear at the top of the list - hiddenUnitGroups.value = listOf(unitGroup) + hiddenUnitGroups.value - } - } - - /** - * Moves [UnitGroup] from [hiddenUnitGroups] to [shownUnitGroups] - * - * @param unitGroup [UnitGroup] to show. - */ - suspend fun markUnitGroupAsShown(unitGroup: UnitGroup) { - mutex.withLock { - hiddenUnitGroups.value = hiddenUnitGroups.value - unitGroup - shownUnitGroups.value = shownUnitGroups.value + unitGroup - } - } - - /** - * Moves [UnitGroup] in [shownUnitGroups] from one index to another (reorder). - * - * @param from Position from which we need to move from - * @param to Position where to put [UnitGroup] - */ - suspend fun moveShownUnitGroups(from: ItemPosition, to: ItemPosition) { - mutex.withLock { - shownUnitGroups.value = shownUnitGroups.value.toMutableList().apply { - val initialIndex = shownUnitGroups.value.indexOfFirst { it == from.key } - /** - * No such item. Happens when dragging item and clicking "remove" while item is - * still being dragged. - */ - if (initialIndex == -1) return - - add( - shownUnitGroups.value.indexOfFirst { it == to.key }, - removeAt(initialIndex) - ) - } - } - } -} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt index 29413f26..0cb62042 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt @@ -40,18 +40,23 @@ import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview 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.common.EmptyScreen import com.sadellie.unitto.core.ui.common.Header import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar +import com.sadellie.unitto.data.model.UnitGroup import org.burnoutcrew.reorderable.ReorderableItem import org.burnoutcrew.reorderable.detectReorder import org.burnoutcrew.reorderable.detectReorderAfterLongPress @@ -59,22 +64,52 @@ import org.burnoutcrew.reorderable.rememberReorderableLazyListState import org.burnoutcrew.reorderable.reorderable @Composable -internal fun UnitGroupsScreen( +internal fun UnitGroupsRoute( viewModel: UnitGroupsViewModel = hiltViewModel(), navigateUpAction: () -> Unit, +) { + when (val uiState = viewModel.uiState.collectAsStateWithLifecycle().value) { + UnitGroupsUIState.Loading -> EmptyScreen() + is UnitGroupsUIState.Ready -> UnitGroupsScreen( + uiState = uiState, + navigateUpAction = navigateUpAction, + updateShownUnitGroups = viewModel::updateShownUnitGroups, + addShownUnitGroup = viewModel::addShownUnitGroup, + removeShownUnitGroup = viewModel::removeShownUnitGroup, + ) + } +} + +@Composable +private fun UnitGroupsScreen( + uiState: UnitGroupsUIState.Ready, + navigateUpAction: () -> Unit, + updateShownUnitGroups: (List) -> Unit, + addShownUnitGroup: (UnitGroup) -> Unit, + removeShownUnitGroup: (UnitGroup) -> Unit, ) { ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_unit_groups_title), navigationIcon = { NavigateUpButton(navigateUpAction) } ) { paddingValues -> - - val shownUnits = viewModel.shownUnitGroups.collectAsState() - val hiddenUnits = viewModel.hiddenUnitGroups.collectAsState() - + val copiedShownList = rememberUpdatedState(uiState.shownUnitGroups) as MutableState val state = rememberReorderableLazyListState( - onMove = viewModel::onMove, - canDragOver = { from, _ -> viewModel.canDragOver(from) }, - onDragEnd = { _, _ -> viewModel.onDragEnd() } + onMove = { from, to -> + copiedShownList.value = copiedShownList.value + .toMutableList() + .apply { + // -1 for list header + add(to.index - 1, removeAt(from.index - 1)) + } + }, + canDragOver = { draggedOver, _ -> + // offset by 1 for list header + draggedOver.index in 1..(copiedShownList.value.lastIndex + 1) + }, + onDragEnd = onDragEnd@{ from, to -> + if (from == to) return@onDragEnd + updateShownUnitGroups(copiedShownList.value) + } ) LazyColumn( @@ -90,12 +125,18 @@ internal fun UnitGroupsScreen( ) } - items(shownUnits.value, { it }) { item -> + items(copiedShownList.value, { it }) { item -> ReorderableItem(state, key = item) { isDragging -> val transition = updateTransition(isDragging, label = "draggedTransition") val background by transition.animateColor(label = "background") { if (it) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surface } + val textColor by transition.animateColor(label = "background") { + if (it) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface + } + val iconColor by transition.animateColor(label = "background") { + if (it) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.outline + } val itemPadding by transition.animateDp(label = "itemPadding") { if (it) 16.dp else 0.dp } @@ -105,28 +146,29 @@ internal fun UnitGroupsScreen( modifier = Modifier .padding(horizontal = itemPadding) .clip(CircleShape) - .clickable { viewModel.hideUnitGroup(item) } + .clickable { removeShownUnitGroup(item) } .detectReorderAfterLongPress(state), colors = ListItemDefaults.colors( - containerColor = background + containerColor = background, + headlineColor = textColor, + leadingIconColor = iconColor, + trailingIconColor = iconColor, ), leadingContent = { Icon( - Icons.Default.RemoveCircle, - stringResource(R.string.settings_disable_unit_group_description), - tint = MaterialTheme.colorScheme.outline, + imageVector = Icons.Default.RemoveCircle, + contentDescription = stringResource(R.string.settings_disable_unit_group_description), modifier = Modifier.clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = { viewModel.hideUnitGroup(item) } + onClick = { removeShownUnitGroup(item) } ) ) }, trailingContent = { Icon( - Icons.Default.DragHandle, - stringResource(R.string.settings_reorder_unit_group_description), - tint = MaterialTheme.colorScheme.outline, + imageVector = Icons.Default.DragHandle, + contentDescription = stringResource(R.string.settings_reorder_unit_group_description), modifier = Modifier .clickable( interactionSource = remember { MutableInteractionSource() }, @@ -148,11 +190,11 @@ internal fun UnitGroupsScreen( ) } - items(hiddenUnits.value, { it }) { + items(uiState.hiddenUnitGroups, { it }) { ListItem( modifier = Modifier .background(MaterialTheme.colorScheme.surface) - .clickable { viewModel.returnUnitGroup(it) } + .clickable { addShownUnitGroup(it) } .animateItemPlacement(), headlineContent = { Text(stringResource(it.res)) }, trailingContent = { @@ -163,7 +205,7 @@ internal fun UnitGroupsScreen( modifier = Modifier.clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = { viewModel.returnUnitGroup(it) } + onClick = { addShownUnitGroup(it) } ) ) } @@ -172,3 +214,20 @@ internal fun UnitGroupsScreen( } } } + +@Preview +@Composable +private fun PreviewUnitGroupsScreen() { + val shownUnitGroups = UnitGroup.entries.take(4) + + UnitGroupsScreen( + uiState = UnitGroupsUIState.Ready( + shownUnitGroups = shownUnitGroups, + hiddenUnitGroups = UnitGroup.entries - shownUnitGroups.toSet() + ), + navigateUpAction = {}, + updateShownUnitGroups = {}, + addShownUnitGroup = {}, + removeShownUnitGroup = {}, + ) +} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt new file mode 100644 index 00000000..08d1a1b1 --- /dev/null +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt @@ -0,0 +1,30 @@ +/* + * Unitto is a calculator 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.feature.settings.unitgroups + +import com.sadellie.unitto.data.model.UnitGroup + +internal sealed class UnitGroupsUIState { + data object Loading: UnitGroupsUIState() + + data class Ready( + val shownUnitGroups: List, + val hiddenUnitGroups: List + ): UnitGroupsUIState() +} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt index 47245de9..bd8e8285 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt @@ -20,75 +20,52 @@ package com.sadellie.unitto.feature.settings.unitgroups import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import org.burnoutcrew.reorderable.ItemPosition import javax.inject.Inject @HiltViewModel -class UnitGroupsViewModel @Inject constructor( +internal class UnitGroupsViewModel @Inject constructor( private val userPrefsRepository: UserPreferencesRepository, - private val unitGroupsRepository: UnitGroupsRepository, ) : ViewModel() { - val shownUnitGroups = unitGroupsRepository.shownUnitGroups - val hiddenUnitGroups = unitGroupsRepository.hiddenUnitGroups - /** - * @see UnitGroupsRepository.markUnitGroupAsHidden - * @see UserPreferencesRepository.updateShownUnitGroups - */ - fun hideUnitGroup(unitGroup: UnitGroup) { - viewModelScope.launch { - unitGroupsRepository.markUnitGroupAsHidden(unitGroup) - userPrefsRepository.updateShownUnitGroups(unitGroupsRepository.shownUnitGroups.value) - } - } - - /** - * @see UnitGroupsRepository.markUnitGroupAsShown - * @see UserPreferencesRepository.updateShownUnitGroups - */ - fun returnUnitGroup(unitGroup: UnitGroup) { - viewModelScope.launch { - unitGroupsRepository.markUnitGroupAsShown(unitGroup) - userPrefsRepository.updateShownUnitGroups(unitGroupsRepository.shownUnitGroups.value) - } - } - - /** - * @see UnitGroupsRepository.moveShownUnitGroups - */ - fun onMove(from: ItemPosition, to: ItemPosition) { - viewModelScope.launch { - unitGroupsRepository.moveShownUnitGroups(from, to) - } - } - - /** - * @see UserPreferencesRepository.updateShownUnitGroups - */ - fun onDragEnd() { - viewModelScope.launch { - userPrefsRepository.updateShownUnitGroups(unitGroupsRepository.shownUnitGroups.value) - } - } - - /** - * Prevent from dragging over non-draggable items (headers and hidden) - * - * @param pos Position we are dragging over. - * @return True if can drag over given item. - */ - fun canDragOver(pos: ItemPosition) = shownUnitGroups.value.any { it == pos.key } - - init { - viewModelScope.launch { - unitGroupsRepository.updateShownGroups( - userPrefsRepository.unitGroupsPrefs.first().shownUnitGroups + val uiState = userPrefsRepository.unitGroupsPrefs + .map { + UnitGroupsUIState.Ready( + shownUnitGroups = it.shownUnitGroups, + hiddenUnitGroups = UnitGroup.entries - it.shownUnitGroups.toSet() ) } + .stateIn(viewModelScope, UnitGroupsUIState.Loading) + + /** + * @see UserPreferencesRepository.removeShownUnitGroup + */ + fun removeShownUnitGroup(unitGroup: UnitGroup) { + viewModelScope.launch { + userPrefsRepository.removeShownUnitGroup(unitGroup) + } + } + + /** + * @see UserPreferencesRepository.addShownUnitGroup + */ + fun addShownUnitGroup(unitGroup: UnitGroup) { + viewModelScope.launch { + userPrefsRepository.addShownUnitGroup(unitGroup) + } + } + + /** + * @see UserPreferencesRepository.updateShownUnitGroups + */ + fun updateShownUnitGroups(unitGroups: List) { + viewModelScope.launch { + userPrefsRepository.updateShownUnitGroups(unitGroups) + } } } From 67a4852741ab7855e77a36faae3e69d5fa8fa5a7 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Tue, 6 Feb 2024 18:07:54 +0300 Subject: [PATCH 07/46] Refactor Tokenizer --- .../github/sadellie/evaluatto/Expression.kt | 2 +- .../io/github/sadellie/evaluatto/Tokenizer.kt | 433 +++++++++--------- .../io/github/sadellie/evaluatto/Helpers.kt | 4 +- 3 files changed, 216 insertions(+), 223 deletions(-) diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt index c86b0ce1..4b453c05 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt @@ -35,7 +35,7 @@ class Expression( private val radianMode: Boolean = true, private val roundingMode: RoundingMode = RoundingMode.HALF_EVEN ) { - private val tokens = Tokenizer(input).tokenize() + private val tokens = input.tokenize() private var cursorPosition = 0 /** diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt index 129ba237..237f2355 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt @@ -26,188 +26,169 @@ sealed class TokenizerException(message: String) : Exception(message) { class BadScientificNotation : TokenizerException("Expected plus or minus symbol after \"E\"") } -class Tokenizer(private val streamOfTokens: String) { - // Don't create object at all? - fun tokenize(): List { - var cursor = 0 - val tokens: MutableList = mutableListOf() +fun String.tokenize(): List { + var cursor = 0 + val tokens: MutableList = mutableListOf() - while (cursor != streamOfTokens.length) { - val nextToken = peekTokenAfter(cursor) + while (cursor != this.length) { + val nextToken = peekTokenAfter(this, cursor) - if (nextToken != null) { - tokens.add(nextToken) - cursor += nextToken.length - } else { - // Didn't find any token, move left slowly (by 1 symbol) - cursor++ - } + if (nextToken != null) { + tokens.add(nextToken) + cursor += nextToken.length + } else { + // Didn't find any token, move left slowly (by 1 symbol) + cursor++ } - - return tokens.repairLexicon() } - private fun peekTokenAfter(cursor: Int): String? { - Token.expressionTokens.forEach { token -> - val subs = streamOfTokens - .substring( - cursor, - (cursor + token.length).coerceAtMost(streamOfTokens.length) - ) - if (subs == token) { - // Got a digit, see if there are other digits coming after - if (token in Token.Digit.allWithDot) { - val number = streamOfTokens - .substring(cursor) - .takeWhile { Token.Digit.allWithDot.contains(it.toString()) } + return tokens.repairLexicon() +} - if (number.count { it.toString() == Token.Digit.dot } > 1) { - throw TokenizerException.TooManyFractionSymbols() - } +private fun peekTokenAfter( + streamOfTokens: String, + cursor: Int +): String? { + Token.expressionTokens.forEach { token -> + val subs = streamOfTokens + .substring( + cursor, + (cursor + token.length).coerceAtMost(streamOfTokens.length) + ) + if (subs == token) { + // Got a digit, see if there are other digits coming after + if (token in Token.Digit.allWithDot) { + val number = streamOfTokens + .substring(cursor) + .takeWhile { Token.Digit.allWithDot.contains(it.toString()) } - return number - } - return token - } - } - return null - } - - private fun List.repairLexicon(): List { - return this - .missingClosingBrackets() - .unpackNotation() - .missingMultiply() - .unpackAllPercents() - // input like 80%80% should be treated as 80%*80%. - // After unpacking we get (80/100)(80/100), the multiply is missing (!!!) - // No, we can't unpack before fixing missing multiply. - // Ideally we we need to add missing multiply for 80%80% - // In that case unpackAllPercents gets input with all operators 80%*80% in this case - // Can't be done right now since missingMultiply checks for tokens in front only - .missingMultiply() - } - - private fun List.missingClosingBrackets(): List { - val leftBracket = this.count { it == Token.Operator.leftBracket } - val rightBrackets = this.count { it == Token.Operator.rightBracket } - val neededBrackets = leftBracket - rightBrackets - - if (neededBrackets <= 0) return this - - var fixed = this - repeat(neededBrackets) { - fixed = fixed + Token.Operator.rightBracket - } - return fixed - } - - private fun List.missingMultiply(): List { - val result = this.toMutableList() - val original = this - var offset = 0 - - fun addTokenAfter(index: Int) { - result.add(index + 1 + offset, Token.Operator.multiply) - offset += 1 - } - - original.forEachIndexed { index, token -> - when { - // This will not insert multiply between digits because they are grouped into a - // single token. It's not possible to get separate digit tokens near each other - // Things like ["123", "456"] are impossible, will be ["123456"] - token.isDigitToken() || - token in Token.Const.all || - token == Token.Operator.rightBracket -> { - val tokenInFront = original.tokenInFront(index) ?: return@forEachIndexed - - when { - tokenInFront == Token.Operator.leftBracket || - tokenInFront in Token.Func.all || - tokenInFront in Token.Const.all || - tokenInFront == Token.Operator.sqrt || - tokenInFront.isDigitToken() -> { - addTokenAfter(index) - } - } - } - } - } - - return result - } - - private fun List.unpackAllPercents(): List { - var result = this - while (result.contains(Token.Operator.percent)) { - val percIndex = result.indexOf(Token.Operator.percent) - result = result.unpackPercentAt(percIndex) - } - return result - } - - private fun List.unpackNotation(): List { - // Transform 1E+7 ==> 1*10^7 - // Transform 1E-7 ==> 1/10^7 - val result = this.toMutableList() - val listIterator = result.listIterator() - - while (listIterator.hasNext()) { - if (listIterator.next() == Token.DisplayOnly.engineeringE) { - listIterator.remove() - - val tokenAfterE = try { - listIterator.next() - } catch (e: Exception) { - throw TokenizerException.BadScientificNotation() + if (number.count { it.toString() == Token.Digit.dot } > 1) { + throw TokenizerException.TooManyFractionSymbols() } - listIterator.remove() + return number + } + return token + } + } + return null +} - when (tokenAfterE) { - Token.Operator.minus -> listIterator.add(Token.Operator.divide) - Token.Operator.plus -> listIterator.add(Token.Operator.multiply) - else -> throw TokenizerException.BadScientificNotation() - } +private fun MutableList.repairLexicon(): List { + return this + .missingClosingBrackets() + .unpackNotation() + .missingMultiply() + .unpackAllPercents() + // input like 80%80% should be treated as 80%*80%. + // After unpacking we get (80/100)(80/100), the multiply is missing (!!!) + // No, we can't unpack before fixing missing multiply. + // Ideally we we need to add missing multiply for 80%80% + // In that case unpackAllPercents gets input with all operators 80%*80% in this case + // Can't be done right now since missingMultiply checks for tokens in front only + .missingMultiply() +} - listIterator.add("10") - listIterator.add(Token.Operator.power) +private fun MutableList.missingClosingBrackets(): MutableList { + val leftBracket = this.count { it == Token.Operator.leftBracket } + val rightBrackets = this.count { it == Token.Operator.rightBracket } + val neededBrackets = leftBracket - rightBrackets + + if (neededBrackets <= 0) return this + + repeat(neededBrackets) { + this.add(Token.Operator.rightBracket) + } + return this +} + +private fun MutableList.missingMultiply(): MutableList { + val iterator = this.listIterator() + + while (iterator.hasNext()) { + val currentToken = iterator.next() + + // Need two token for checks + if (!iterator.hasNext()) break + + val isDigit = currentToken.isDigitToken() + val isConst = currentToken in Token.Const.all + val isRightBracket = currentToken == Token.Operator.rightBracket + + // may need a multiplication after + if (isDigit || isConst || isRightBracket) { + // Peek next, but then go back + val tokenAfter = iterator.next() + iterator.previous() + + if (tokenAfter == Token.Operator.leftBracket || + tokenAfter in Token.Func.all || + tokenAfter in Token.Const.all || + tokenAfter == Token.Operator.sqrt || + tokenAfter.isDigitToken()) { + + iterator.add(Token.Operator.multiply) } } - - return result } - private fun List.unpackPercentAt(percentIndex: Int): List { - var cursor = percentIndex + return this +} - // get whatever is the percentage - val percentage = this.getNumberOrExpressionBefore(percentIndex) - // Move cursor - cursor -= percentage.size +private fun MutableList.unpackNotation(): MutableList { + // Transform 1E+7 ==> 1*10^7 + // Transform 1E-7 ==> 1/10^7 + val iterator = this.listIterator() - // get the operator in front - cursor -= 1 - val operator = this.getOrNull(cursor) + while (iterator.hasNext()) { + if (iterator.next() == Token.DisplayOnly.engineeringE) { + iterator.remove() - // Don't go further - if ((operator == null) or (operator !in listOf(Token.Operator.plus, Token.Operator.minus))) { - val mutList = this.toMutableList() + val tokenAfterE = try { + iterator.next() + } catch (e: Exception) { + throw TokenizerException.BadScientificNotation() + } - // Remove percentage - mutList.removeAt(percentIndex) + iterator.remove() - //Add opening bracket before percentage - mutList.add(percentIndex - percentage.size, Token.Operator.leftBracket) + when (tokenAfterE) { + Token.Operator.minus -> iterator.add(Token.Operator.divide) + Token.Operator.plus -> iterator.add(Token.Operator.multiply) + else -> throw TokenizerException.BadScientificNotation() + } - // Add "/ 100" and closing bracket - mutList.addAll(percentIndex + 1, listOf(Token.Operator.divide, "100", Token.Operator.rightBracket)) - - return mutList + iterator.add("10") + iterator.add(Token.Operator.power) } - // Get the base - val base = this.getBaseBefore(cursor) + } + + return this +} + +private fun MutableList.unpackAllPercents(): MutableList { + var result = this + while (result.contains(Token.Operator.percent)) { + val percIndex = result.indexOf(Token.Operator.percent) + result = result.unpackPercentAt(percIndex) + } + return result +} + +private fun MutableList.unpackPercentAt(percentIndex: Int): MutableList { + var cursor = percentIndex + + // get whatever is the percentage + val percentage = this.getNumberOrExpressionBefore(percentIndex) + // Move cursor + cursor -= percentage.size + + // get the operator in front + cursor -= 1 + val operator = this.getOrNull(cursor) + + // Don't go further + if ((operator == null) or (operator !in listOf(Token.Operator.plus, Token.Operator.minus))) { val mutList = this.toMutableList() // Remove percentage @@ -216,71 +197,83 @@ class Tokenizer(private val streamOfTokens: String) { //Add opening bracket before percentage mutList.add(percentIndex - percentage.size, Token.Operator.leftBracket) - // Add "/ 100" and other stuff - mutList.addAll( - percentIndex + 1, - listOf( - Token.Operator.divide, - "100", - Token.Operator.multiply, - Token.Operator.leftBracket, - *base.toTypedArray(), - Token.Operator.rightBracket, - Token.Operator.rightBracket - ) - ) + // Add "/ 100" and closing bracket + mutList.addAll(percentIndex + 1, listOf(Token.Operator.divide, "100", Token.Operator.rightBracket)) return mutList } + // Get the base + val base = this.getBaseBefore(cursor) + val mutList = this.toMutableList() - private fun List.getNumberOrExpressionBefore(pos: Int): List { - val digits = Token.Digit.allWithDot.map { it[0] } + // Remove percentage + mutList.removeAt(percentIndex) - val tokenInFront = this[pos - 1] + //Add opening bracket before percentage + mutList.add(percentIndex - percentage.size, Token.Operator.leftBracket) - // Just number - if (tokenInFront.all { it in digits }) return listOf(tokenInFront) + // Add "/ 100" and other stuff + mutList.addAll( + percentIndex + 1, + listOf( + Token.Operator.divide, + "100", + Token.Operator.multiply, + Token.Operator.leftBracket, + *base.toTypedArray(), + Token.Operator.rightBracket, + Token.Operator.rightBracket + ) + ) - // For cases like "100+(2+5)|%". The check above won't pass, so the next expected thing is - // a number in brackets. Anything else is not expected. - if (tokenInFront != Token.Operator.rightBracket) throw TokenizerException.FailedToUnpackNumber() - - // Start walking left until we get balanced brackets - var cursor = pos - 1 - var leftBrackets = 0 - var rightBrackets = 1 // We set 1 because we start with closing bracket - - while (leftBrackets != rightBrackets) { - cursor-- - val currentToken = this[cursor] - if (currentToken == Token.Operator.leftBracket) leftBrackets++ - if (currentToken == Token.Operator.rightBracket) rightBrackets++ - } - - return this.subList(cursor, pos) - } - - private fun List.getBaseBefore(pos: Int): List { - var cursor = pos - var leftBrackets = 0 - var rightBrackets = 0 - - while ((--cursor >= 0)) { - val currentToken = this[cursor] - - if (currentToken == Token.Operator.leftBracket) leftBrackets++ - if (currentToken == Token.Operator.rightBracket) rightBrackets++ - - if (leftBrackets > rightBrackets) break - } - - // Return cursor back to last token - cursor += 1 - - return this.subList(cursor, pos) - } - - private fun String.isDigitToken(): Boolean = first().toString() in Token.Digit.allWithDot - - private fun List.tokenInFront(index: Int): String? = getOrNull(index + 1) + return mutList } + +private fun MutableList.getNumberOrExpressionBefore(pos: Int): List { + val digits = Token.Digit.allWithDot.map { it[0] } + + val tokenInFront = this[pos - 1] + + // Just number + if (tokenInFront.all { it in digits }) return listOf(tokenInFront) + + // For cases like "100+(2+5)|%". The check above won't pass, so the next expected thing is + // a number in brackets. Anything else is not expected. + if (tokenInFront != Token.Operator.rightBracket) throw TokenizerException.FailedToUnpackNumber() + + // Start walking left until we get balanced brackets + var cursor = pos - 1 + var leftBrackets = 0 + var rightBrackets = 1 // We set 1 because we start with closing bracket + + while (leftBrackets != rightBrackets) { + cursor-- + val currentToken = this[cursor] + if (currentToken == Token.Operator.leftBracket) leftBrackets++ + if (currentToken == Token.Operator.rightBracket) rightBrackets++ + } + + return this.subList(cursor, pos) +} + +private fun List.getBaseBefore(pos: Int): List { + var cursor = pos + var leftBrackets = 0 + var rightBrackets = 0 + + while ((--cursor >= 0)) { + val currentToken = this[cursor] + + if (currentToken == Token.Operator.leftBracket) leftBrackets++ + if (currentToken == Token.Operator.rightBracket) rightBrackets++ + + if (leftBrackets > rightBrackets) break + } + + // Return cursor back to last token + cursor += 1 + + return this.subList(cursor, pos) +} + +private fun String.isDigitToken(): Boolean = first().toString() in Token.Digit.allWithDot diff --git a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt index 55861c01..2b1c9e31 100644 --- a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt +++ b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt @@ -40,7 +40,7 @@ fun assertExprFail( } fun assertLex(expected: List, actual: String) = - assertEquals(expected, Tokenizer(actual).tokenize()) + assertEquals(expected, actual.tokenize()) fun assertLex(expected: String, actual: String) = - assertEquals(expected, Tokenizer(actual).tokenize().joinToString("")) + assertEquals(expected, actual.tokenize().joinToString("")) From 0dcfc359bd9d54cc7bc7c5f39b31587086288677 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 7 Feb 2024 21:56:51 +0300 Subject: [PATCH 08/46] Nothing to see here, move on --- .../feature/settings/about/AboutScreen.kt | 48 +--- .../feature/settings/about/AboutViewModel.kt | 39 --- .../settings/bouncingemoji/BouncingEmoji.kt | 243 ++++++++++++++++++ .../settings/navigation/SettingsNavigation.kt | 11 +- 4 files changed, 266 insertions(+), 75 deletions(-) delete mode 100644 feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutViewModel.kt create mode 100644 feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt index 0b979aed..8b619074 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt @@ -18,7 +18,6 @@ package com.sadellie.unitto.feature.settings.about -import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.lazy.LazyColumn @@ -42,44 +41,31 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.BuildConfig import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.NavigateUpButton -import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem +import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.openLink -import com.sadellie.unitto.core.ui.showToast -import com.sadellie.unitto.data.model.userprefs.AboutPreferences -import com.sadellie.unitto.data.userprefs.AboutPreferencesImpl @Composable internal fun AboutRoute( - viewModel: AboutViewModel = hiltViewModel(), navigateUpAction: () -> Unit, navigateToThirdParty: () -> Unit, + navigateToEasterEgg: () -> Unit, ) { - when (val prefs = viewModel.prefs.collectAsStateWithLifecycle().value) { - null -> EmptyScreen() - else -> { - AboutScreen( - prefs = prefs, - navigateUpAction = navigateUpAction, - navigateToThirdParty = navigateToThirdParty, - enableToolsExperiment = viewModel::enableToolsExperiment - ) - } - } + AboutScreen( + navigateUpAction = navigateUpAction, + navigateToThirdParty = navigateToThirdParty, + navigateToEasterEgg = navigateToEasterEgg + ) } @Composable private fun AboutScreen( - prefs: AboutPreferences, navigateUpAction: () -> Unit, navigateToThirdParty: () -> Unit, - enableToolsExperiment: () -> Unit, + navigateToEasterEgg: () -> Unit, ) { val mContext = LocalContext.current var aboutItemClick: Int by rememberSaveable { mutableIntStateOf(0) } @@ -157,16 +143,11 @@ private fun AboutScreen( headlineText = stringResource(R.string.settings_version_name), supportingText = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})", modifier = Modifier.combinedClickable { - if (prefs.enableToolsExperiment) { - showToast(mContext, "Experiments features are already enabled!", Toast.LENGTH_LONG) - return@combinedClickable - } - aboutItemClick++ - if (aboutItemClick < 7) return@combinedClickable - - enableToolsExperiment() - showToast(mContext, "Experimental features enabled!", Toast.LENGTH_LONG) + if (aboutItemClick > 5) { + aboutItemClick = 0 + navigateToEasterEgg() + } } ) } @@ -195,11 +176,8 @@ private fun AboutScreen( @Composable fun PreviewAboutScreen() { AboutScreen( - prefs = AboutPreferencesImpl( - enableToolsExperiment = false - ), navigateUpAction = {}, navigateToThirdParty = {}, - enableToolsExperiment = {} + navigateToEasterEgg = {} ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutViewModel.kt deleted file mode 100644 index bf6c145b..00000000 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutViewModel.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.settings.about - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.data.common.stateIn -import com.sadellie.unitto.data.model.repository.UserPreferencesRepository -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -internal class AboutViewModel @Inject constructor( - private val userPrefsRepository: UserPreferencesRepository, -) : ViewModel() { - val prefs = userPrefsRepository.aboutPrefs - .stateIn(viewModelScope, null) - - fun enableToolsExperiment() = viewModelScope.launch { - userPrefsRepository.updateToolsExperiment(true) - } -} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt new file mode 100644 index 00000000..4bbb2706 --- /dev/null +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt @@ -0,0 +1,243 @@ +/* + * Unitto is a calculator 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.feature.settings.bouncingemoji + +import androidx.annotation.FloatRange +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.animateFloatAsState +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.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import com.sadellie.unitto.core.ui.common.NavigateUpButton +import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlin.math.absoluteValue +import kotlin.math.roundToInt +import kotlin.random.Random + +@Composable +internal fun BouncingEmojiRoute( + navigateUpAction: () -> Unit, +) { + ScaffoldWithTopBar( + title = { AnimatedText("Bouncy boy") }, + navigationIcon = { NavigateUpButton(navigateUpAction) } + ) { paddingValues -> + BouncingEmojiScreen( + modifier = Modifier + .padding(paddingValues) + .fillMaxSize(), + ) + } +} + +/** + * @param modifier [Modifier] that will be applied to the surrounding [BoxWithConstraints]. + * @param initialX Initial horizontal position. 0 means left, 1 means right. + * @param initialY Initial vertical position. 0 means top, 1 means bottom. + */ +@Composable +private fun BouncingEmojiScreen( + modifier: Modifier, + @FloatRange(0.0, 1.0) initialX: Float = Random.nextFloat(), + @FloatRange(0.0, 1.0) initialY: Float = Random.nextFloat(), +) { + val density = LocalDensity.current + var speed by remember { mutableFloatStateOf(1f) } + + CompositionLocalProvider( + value = LocalDensity provides Density(density.density, fontScale = 1f) + ) { + BoxWithConstraints( + modifier = modifier.clickable { + speed = Random.nextFloat() + } + ) { + val width = constraints.maxWidth + val height = constraints.maxHeight + val ballSize = 96.dp + val ballSizePx = with(LocalDensity.current) { ballSize.toPx().roundToInt() } + + var x by rememberSaveable { mutableFloatStateOf((width - ballSizePx) * initialX) } + var y by rememberSaveable { mutableFloatStateOf((height - ballSizePx) * initialY) } + + val animatedX = animateFloatAsState(x) + val animatedY = animateFloatAsState(y) + + var xSpeed by rememberSaveable { mutableFloatStateOf(10f) } + var ySpeed by rememberSaveable { mutableFloatStateOf(10f) } + + var bounces by remember { mutableFloatStateOf(0f) } + var edgeHits by rememberSaveable { mutableFloatStateOf(0f) } + var emoji by remember { mutableStateOf("❤") } + var mood by remember { mutableStateOf("prepare for impact") } + + Column( + modifier = Modifier.offset { + IntOffset( + animatedX.value.roundToInt(), + animatedY.value.roundToInt() + ) + }, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + modifier = Modifier + .background(MaterialTheme.colorScheme.primaryContainer, CircleShape) + .size(ballSize), + contentAlignment = Alignment.Center + ) { + AnimatedText(emoji, MaterialTheme.typography.displayMedium) + } + AnimatedText(mood) + } + + Column { + AnimatedText("Speed: ${xSpeed.absoluteValue * speed}") + AnimatedText("Bounces: $bounces") + AnimatedText("Edge hits: $edgeHits") + AnimatedText("Luck: ${edgeHits / bounces}") + } + + LaunchedEffect( + key1 = Unit, + key2 = speed + ) { + while (isActive) { + x += xSpeed * speed + y += ySpeed * speed + + val rightBounce = x > width - ballSizePx + val leftBounce = x < 0 + val bottomBounce = y > height - ballSizePx + val topBounce = y < 0 + var bouncedEdges = 0 + + if (rightBounce || leftBounce) { + xSpeed = -xSpeed + bouncedEdges++ + } + + if (topBounce || bottomBounce) { + ySpeed = -ySpeed + bouncedEdges++ + } + + // Count edge hit as 1 bounce + when(bouncedEdges) { + 2 -> { + edgeHits++ + bounces++ + mood = winnerMood.random() + emoji = winnerEmoji.random() + } + 1 -> { + bounces++ + mood = looserMood.random() + emoji = looserEmoji.random() + } + } + + delay(1) + } + } + } + } +} + +@Composable +private fun AnimatedText( + text: String, + style: TextStyle = LocalTextStyle.current +) { + AnimatedContent( + targetState = text, + transitionSpec = { + slideInVertically { height -> height } + fadeIn() togetherWith + slideOutVertically { height -> -height } + fadeOut() + } + ) { + Text( + text = it, + style = style, + color = MaterialTheme.colorScheme.onBackground + ) + } +} + +private val looserEmoji by lazy { + listOf("🤡", "😭", "👿", "💀", "💩") +} + +private val winnerEmoji by lazy { + listOf("🤠", "🤑", "😎", "🥇") +} + +private val looserMood by lazy { + listOf("sus", "bruh", "no cap", "fr fr", "vibing", "oof", "F", "mood", "L+ratio", "yeet") +} + +private val winnerMood by lazy { + listOf("ayoo", "W", "skill", "sheeesh", "bro is cheating") +} + +@Preview +@Composable +private fun PreviewBouncingEmojiScreen() { + BouncingEmojiScreen( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .size(400.dp, 550.dp), + initialX = 0.5f, + initialY = 0.5f, + ) +} diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt index 1229e1fe..2d979b94 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt @@ -27,6 +27,7 @@ import com.sadellie.unitto.core.ui.unittoNavigation import com.sadellie.unitto.core.ui.unittoStackedComposable import com.sadellie.unitto.feature.settings.SettingsRoute import com.sadellie.unitto.feature.settings.about.AboutRoute +import com.sadellie.unitto.feature.settings.bouncingemoji.BouncingEmojiRoute import com.sadellie.unitto.feature.settings.calculator.CalculatorSettingsRoute import com.sadellie.unitto.feature.settings.converter.ConverterSettingsRoute import com.sadellie.unitto.feature.settings.display.DisplayRoute @@ -48,6 +49,7 @@ internal const val aboutRoute = "about_route" internal const val formattingRoute = "formatting_route" internal const val calculatorSettingsRoute = "calculator_settings_route" internal const val converterSettingsRoute = "converter_settings_route" +internal const val bouncingEmoji = "bouncing_emoji_route" fun NavController.navigateToSettings() { navigate(DrawerItem.Settings.start) @@ -123,7 +125,8 @@ fun NavGraphBuilder.settingGraph( unittoStackedComposable(aboutRoute) { AboutRoute( navigateUpAction = navController::navigateUp, - navigateToThirdParty = { navController.navigate(thirdPartyRoute) } + navigateToThirdParty = { navController.navigate(thirdPartyRoute) }, + navigateToEasterEgg = { navController.navigate(bouncingEmoji) }, ) } @@ -132,5 +135,11 @@ fun NavGraphBuilder.settingGraph( navigateUpAction = navController::navigateUp, ) } + + unittoStackedComposable(bouncingEmoji) { + BouncingEmojiRoute( + navigateUpAction = navController::navigateUp + ) + } } } From 886efdc8b7259c21e29d8b1803b6733f3c951a03 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 7 Feb 2024 22:11:51 +0300 Subject: [PATCH 09/46] Expose WindowSizeClass Fix previews and let them declare their own WindowSizeClass --- .../java/com/sadellie/unitto/core/ui/LocalWindowSize.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt index 7a7fd006..e7684c0f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt @@ -36,9 +36,10 @@ import androidx.compose.ui.util.fastForEach import androidx.window.layout.WindowMetricsCalculator val LocalWindowSize: ProvidableCompositionLocal = compositionLocalOf { - WindowSizeClass.calculateFromSize( - size = Size.Zero, - density = defaultDensity + // Phone in portrait mode + WindowSizeClass( + heightSizeClass = WindowHeightSizeClass.Medium, + widthSizeClass = WindowWidthSizeClass.Compact, ) } @@ -80,7 +81,7 @@ fun calculateWindowSizeClass(activity: Activity): WindowSizeClass { * @property heightSizeClass height-based window size class ([WindowHeightSizeClass]) */ @Immutable -class WindowSizeClass private constructor( +class WindowSizeClass( val widthSizeClass: WindowWidthSizeClass, val heightSizeClass: WindowHeightSizeClass ) { From 3c10fb9b0c9c94dc3d8830cb2c29124aacf88444 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 7 Feb 2024 23:42:51 +0300 Subject: [PATCH 10/46] Refactor LeftSideScreen and RightSideScreen Reusable UnitsList --- .../feature/converter/LeftSideScreen.kt | 59 +++------- .../feature/converter/RightSideScreen.kt | 79 +++++-------- .../feature/converter/components/UnitsList.kt | 110 ++++++++++++++++++ 3 files changed, 151 insertions(+), 97 deletions(-) create mode 100644 feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt index 03b6e039..35060b7d 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt @@ -18,13 +18,9 @@ package com.sadellie.unitto.feature.converter -import androidx.compose.animation.Crossfade import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -33,12 +29,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.res.stringResource +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.SearchPlaceholder import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.SearchBar import com.sadellie.unitto.data.converter.UnitID @@ -46,10 +41,9 @@ import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.feature.converter.components.BasicUnitListItem import com.sadellie.unitto.feature.converter.components.ChipsRow import com.sadellie.unitto.feature.converter.components.FavoritesButton -import com.sadellie.unitto.feature.converter.components.UnitGroupHeader +import com.sadellie.unitto.feature.converter.components.UnitsList import java.math.BigDecimal @Composable @@ -129,43 +123,20 @@ private fun LeftSideScreen( } } ) { paddingValues -> - Crossfade( - targetState = uiState.units.isNotEmpty(), + val resources = LocalContext.current.resources + UnitsList( modifier = Modifier.padding(paddingValues), - label = "Units list" - ) { hasUnits -> - when (hasUnits) { - true -> LazyColumn(Modifier.fillMaxSize()) { - uiState.units.forEach { (unitGroup, units) -> - item(unitGroup.name) { - UnitGroupHeader(Modifier.animateItemPlacement(), unitGroup) - } - - items(units, { it.id }) { - BasicUnitListItem( - modifier = Modifier.animateItemPlacement(), - name = stringResource(it.displayName), - supportLabel = stringResource(it.shortName), - isFavorite = it.isFavorite, - isSelected = it.id == uiState.unitFrom.id, - onClick = { - onQueryChange(TextFieldValue()) - updateUnitFrom(it) - navigateUp() - }, - favoriteUnit = { favoriteUnit(it) } - ) - } - } - } - - false -> SearchPlaceholder( - onButtonClick = navigateToUnitGroups, - supportText = stringResource(R.string.converter_no_results_support), - buttonLabel = stringResource(R.string.open_settings_label) - ) - } - } + groupedUnits = uiState.units, + navigateToUnitGroups = navigateToUnitGroups, + currentUnitId = uiState.unitFrom.id, + supportLabel = { resources.getString(it.shortName) }, + onClick = { + onQueryChange(TextFieldValue()) + updateUnitFrom(it) + navigateUp() + }, + favoriteUnit = { favoriteUnit(it) } + ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt index 32e16b2f..cb413666 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt @@ -18,38 +18,32 @@ package com.sadellie.unitto.feature.converter -import androidx.compose.animation.Crossfade -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.Scaffold import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.res.stringResource +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.SearchPlaceholder import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.SearchBar import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.common.format +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.DefaultUnit import com.sadellie.unitto.data.model.unit.NormalUnit import com.sadellie.unitto.data.model.unit.NumberBaseUnit -import com.sadellie.unitto.data.converter.UnitID -import com.sadellie.unitto.feature.converter.components.BasicUnitListItem import com.sadellie.unitto.feature.converter.components.FavoritesButton -import com.sadellie.unitto.feature.converter.components.UnitGroupHeader +import com.sadellie.unitto.feature.converter.components.UnitsList import java.math.BigDecimal @Composable @@ -103,52 +97,31 @@ private fun RightSideScreen( ) } ) { paddingValues -> - Crossfade( - targetState = uiState.units.isNotEmpty(), + val resources = LocalContext.current.resources + UnitsList( modifier = Modifier.padding(paddingValues), - label = "Units list" - ) { hasUnits -> - when (hasUnits) { - true -> LazyColumn(Modifier.fillMaxSize()) { - uiState.units.forEach { (unitGroup, units) -> - item(unitGroup.name) { - UnitGroupHeader(Modifier.animateItemPlacement(), unitGroup) - } - - items(units, { it.id }) { - BasicUnitListItem( - modifier = Modifier.animateItemPlacement(), - name = stringResource(it.displayName), - supportLabel = formatUnitToSupportLabel( - unitFrom = uiState.unitFrom, - unitTo = it, - input = uiState.input, - shortName = stringResource(it.shortName), - scale = uiState.scale, - outputFormat = uiState.outputFormat, - formatterSymbols = uiState.formatterSymbols, - readyCurrencies = uiState.currencyRateUpdateState is CurrencyRateUpdateState.Ready, - ), - isFavorite = it.isFavorite, - isSelected = it.id == uiState.unitTo.id, - onClick = { - onQueryChange(TextFieldValue()) - updateUnitTo(it) - navigateUp() - }, - favoriteUnit = { favoriteUnit(it) } - ) - } - } - } - - false -> SearchPlaceholder( - onButtonClick = navigateToUnitGroups, - supportText = stringResource(R.string.converter_no_results_support), - buttonLabel = stringResource(R.string.open_settings_label) + groupedUnits = uiState.units, + navigateToUnitGroups = navigateToUnitGroups, + currentUnitId = uiState.unitTo.id, + supportLabel = { + formatUnitToSupportLabel( + unitFrom = uiState.unitFrom, + unitTo = it, + input = uiState.input, + shortName = resources.getString(it.shortName), + scale = uiState.scale, + outputFormat = uiState.outputFormat, + formatterSymbols = uiState.formatterSymbols, + readyCurrencies = uiState.currencyRateUpdateState is CurrencyRateUpdateState.Ready, ) - } - } + }, + onClick = { + onQueryChange(TextFieldValue()) + updateUnitTo(it) + navigateUp() + }, + favoriteUnit = { favoriteUnit(it) } + ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt new file mode 100644 index 00000000..cb5212d4 --- /dev/null +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt @@ -0,0 +1,110 @@ +/* + * Unitto is a calculator 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.feature.converter.components + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.core.ui.common.SearchPlaceholder +import com.sadellie.unitto.data.converter.UnitID +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.model.unit.AbstractUnit +import com.sadellie.unitto.data.model.unit.NormalUnit +import java.math.BigDecimal + +@Composable +internal fun UnitsList( + modifier: Modifier, + groupedUnits: Map>, + navigateToUnitGroups: () -> Unit, + currentUnitId: String, + supportLabel: (AbstractUnit) -> String, + onClick: (AbstractUnit) -> Unit, + favoriteUnit: (AbstractUnit) -> Unit, +) { + Crossfade( + modifier = modifier, + targetState = groupedUnits.isNotEmpty(), + label = "Units list" + ) { hasUnits -> + when (hasUnits) { + true -> LazyColumn( + modifier = Modifier.fillMaxSize() + ) { + groupedUnits.forEach { (group, units) -> + item(group.name) { + UnitGroupHeader(Modifier.animateItemPlacement(), group) + } + + items(units, { it.id }) { + BasicUnitListItem( + modifier = Modifier.animateItemPlacement(), + name = stringResource(it.displayName), + supportLabel = supportLabel(it), + isFavorite = it.isFavorite, + isSelected = it.id == currentUnitId, + onClick = { onClick(it) }, + favoriteUnit = { favoriteUnit(it) }, + ) + } + } + } + + false -> SearchPlaceholder( + onButtonClick = navigateToUnitGroups, + supportText = stringResource(R.string.converter_no_results_support), + buttonLabel = stringResource(R.string.open_settings_label) + ) + } + } +} + +@Preview +@Composable +private fun PreviewUnitsList() { + val resources = LocalContext.current.resources + val groupedUnits: Map> = mapOf( + UnitGroup.LENGTH to listOf( + NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), + NormalUnit(UnitID.kilometer, BigDecimal.valueOf(1.0E+21), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), + NormalUnit(UnitID.nautical_mile, BigDecimal.valueOf(1.852E+21), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), + NormalUnit(UnitID.inch, BigDecimal.valueOf(25_400_000_000_000_000), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), + NormalUnit(UnitID.foot, BigDecimal.valueOf(304_800_000_000_002_200), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), + NormalUnit(UnitID.yard, BigDecimal.valueOf(914_400_000_000_006_400), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), + NormalUnit(UnitID.mile, BigDecimal.valueOf(1_609_344_000_000_010_500_000.0), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), + ) + ) + + UnitsList( + modifier = Modifier.fillMaxSize(), + groupedUnits = groupedUnits, + navigateToUnitGroups = {}, + currentUnitId = UnitID.mile, + supportLabel = { resources.getString(it.shortName) }, + onClick = {}, + favoriteUnit = {} + ) +} From 3d2a63fe95d9aff5c4f21ceecfa88841dbe22d1d Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Thu, 8 Feb 2024 23:12:04 +0300 Subject: [PATCH 11/46] =?UTF-8?q?Forgor=20how=20sets=20work=20=F0=9F=92=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unitto/data/userprefs/PreferenceExt.kt | 18 ++---------------- .../unitto/data/userprefs/PrefsKeys.kt | 2 -- .../unitto/data/userprefs/UserPreferences.kt | 18 +++++++++--------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index 39e5e744..7e222bb3 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -105,23 +105,7 @@ internal fun Preferences.getUnitConverterSorting(): UnitsListSorting { ?.let { UnitsListSorting.valueOf(it) } ?: UnitsListSorting.USAGE } -// TODO Remove when 80% users are on sets internal fun Preferences.getShownUnitGroups(): List { -// Uncomment once legacy is gone -// return this[PrefsKeys.ENABLED_UNIT_GROUPS] -// ?.letTryOrNull { stringSet: Set -> -// stringSet.map { UnitGroup.valueOf(it) } -// } ?: UnitGroup.entries - - // Try new method - val unitGroups: List? = this[PrefsKeys.ENABLED_UNIT_GROUPS] - ?.letTryOrNull { stringSet: Set -> - stringSet.map { UnitGroup.valueOf(it) } - } - - if (!unitGroups.isNullOrEmpty()) return unitGroups - - // Failed to get from sets, try old method return this[PrefsKeys.SHOWN_UNIT_GROUPS] ?.letTryOrNull { list -> list @@ -149,6 +133,8 @@ internal fun Preferences.getAcButton(): Boolean { return this[PrefsKeys.AC_BUTTON] ?: true } +internal fun List.packToString(): String = this.joinToString(",") + private inline fun T.letTryOrNull(block: (T) -> R): R? = try { this?.let(block) } catch (e: Exception) { diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt index 9b70976d..0c65ccce 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt @@ -22,7 +22,6 @@ import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.core.stringSetPreferencesKey object PrefsKeys { // COMMON @@ -53,7 +52,6 @@ object PrefsKeys { val LATEST_LEFT_SIDE = stringPreferencesKey("LATEST_LEFT_SIDE_PREF_KEY") val LATEST_RIGHT_SIDE = stringPreferencesKey("LATEST_RIGHT_SIDE_PREF_KEY") val SHOWN_UNIT_GROUPS = stringPreferencesKey("SHOWN_UNIT_GROUPS_PREF_KEY") - val ENABLED_UNIT_GROUPS = stringSetPreferencesKey("ENABLED_UNIT_GROUPS_PREF_KEY") val UNIT_CONVERTER_FAVORITES_ONLY = booleanPreferencesKey("UNIT_CONVERTER_FAVORITES_ONLY_PREF_KEY") val UNIT_CONVERTER_FORMAT_TIME = booleanPreferencesKey("UNIT_CONVERTER_FORMAT_TIME_PREF_KEY") val UNIT_CONVERTER_SORTING = stringPreferencesKey("UNIT_CONVERTER_SORTING_PREF_KEY") diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt index 56e20694..6d8a97f3 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt @@ -221,25 +221,25 @@ class UserPreferencesRepositoryImpl @Inject constructor( override suspend fun updateShownUnitGroups(shownUnitGroups: List) { dataStore.edit { preferences -> - preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = shownUnitGroups - .map { it.name } - .toSet() + preferences[PrefsKeys.SHOWN_UNIT_GROUPS] = shownUnitGroups.packToString() } } override suspend fun addShownUnitGroup(unitGroup: UnitGroup) { dataStore.edit { preferences -> - preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = preferences[PrefsKeys.ENABLED_UNIT_GROUPS] - ?.plus(unitGroup.name) - ?: emptySet() + preferences[PrefsKeys.SHOWN_UNIT_GROUPS] = preferences + .getShownUnitGroups() + .plus(unitGroup) + .packToString() } } override suspend fun removeShownUnitGroup(unitGroup: UnitGroup) { dataStore.edit { preferences -> - preferences[PrefsKeys.ENABLED_UNIT_GROUPS] = preferences[PrefsKeys.ENABLED_UNIT_GROUPS] - ?.minus(unitGroup.name) - ?: emptySet() + preferences[PrefsKeys.SHOWN_UNIT_GROUPS] = preferences + .getShownUnitGroups() + .minus(unitGroup) + .packToString() } } From 9d76c168ec1deee8c54de1d70fdeaeddb99a9323 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Thu, 8 Feb 2024 23:12:19 +0300 Subject: [PATCH 12/46] Flex chips --- .../sadellie/unitto/core/ui/common/Chip.kt | 54 ++--- .../feature/converter/LeftSideScreen.kt | 8 +- .../feature/converter/components/ChipsRow.kt | 218 ++++++++++++++---- 3 files changed, 202 insertions(+), 78 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt index d9ba0520..21ce2c59 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt @@ -18,7 +18,8 @@ package com.sadellie.unitto.core.ui.common -import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateColor +import androidx.compose.animation.core.updateTransition import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -26,7 +27,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.AssistChipDefaults import androidx.compose.material3.FilterChipDefaults @@ -40,6 +40,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview @@ -48,41 +49,37 @@ import androidx.compose.ui.unit.dp @Composable fun FilterChip( modifier: Modifier = Modifier, - selected: Boolean, + isSelected: Boolean, onClick: () -> Unit, label: String, - imageVector: ImageVector, - contentDescription: String, ) { + val transition = updateTransition(targetState = isSelected, label = "Selected transition") + val backgroundColor = transition.animateColor(label = "Background color") { + if (it) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surface + } + val borderColor = transition.animateColor(label = "Border color") { + if (it) Color.Transparent else MaterialTheme.colorScheme.outline + } + Row( modifier = modifier - .background( - color = if (selected) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surface, - shape = FilterChipDefaults.shape - ) + .padding(vertical = 8.dp) + .clip(FilterChipDefaults.shape) + .clickable { onClick() } + .background(backgroundColor.value) .border( width = 1.dp, - color = if (selected) Color.Transparent else MaterialTheme.colorScheme.outline, + color = borderColor.value, shape = FilterChipDefaults.shape ) .height(FilterChipDefaults.Height) - .clickable { onClick() } - .padding(start = 8.dp, end = 16.dp), + .padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically ) { - AnimatedVisibility(visible = selected) { - Icon( - modifier = Modifier.height(FilterChipDefaults.IconSize), - imageVector = imageVector, - contentDescription = contentDescription, - tint = MaterialTheme.colorScheme.onPrimaryContainer - ) - } Text( - modifier = Modifier.padding(start = 8.dp), text = label, style = MaterialTheme.typography.labelLarge, - color = if (selected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurfaceVariant + color = if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurfaceVariant ) } } @@ -96,17 +93,16 @@ fun AssistChip( ) { Row( modifier = modifier - .background( - color = MaterialTheme.colorScheme.surface, - shape = AssistChipDefaults.shape - ) + .padding(vertical = 8.dp) + .clip(FilterChipDefaults.shape) + .clickable { onClick() } + .background(MaterialTheme.colorScheme.surface) .border( width = 1.dp, color = MaterialTheme.colorScheme.outline, shape = AssistChipDefaults.shape ) .height(32.dp) - .clickable { onClick() } .padding(horizontal = 8.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -135,10 +131,8 @@ fun PreviewFilterChip() { var isSelected by remember { mutableStateOf(true) } FilterChip( - selected = isSelected, + isSelected = isSelected, onClick = { isSelected = !isSelected }, label = "Label", - imageVector = Icons.Default.Check, - contentDescription = "" ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt index 35060b7d..6bea6401 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt @@ -20,6 +20,7 @@ package com.sadellie.unitto.feature.converter import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme @@ -32,6 +33,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.common.EmptyScreen @@ -114,10 +116,12 @@ private fun LeftSideScreen( ) ChipsRow( + modifier = Modifier + .padding(start = 8.dp, end = 8.dp, bottom = 4.dp) + .fillMaxWidth(), chosenUnitGroup = uiState.unitGroup, items = uiState.shownUnitGroups, selectAction = updateUnitGroup, - lazyListState = chipsRowLazyListState, navigateToSettingsAction = navigateToUnitGroups ) } @@ -161,7 +165,7 @@ private fun LeftSideScreenPreview() { units = units, query = TextFieldValue("test"), favorites = false, - shownUnitGroups = listOf(UnitGroup.LENGTH, UnitGroup.TEMPERATURE, UnitGroup.CURRENCY), + shownUnitGroups = UnitGroup.entries, unitGroup = units.keys.toList().first(), sorting = UnitsListSorting.USAGE, ), diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt index 55f54072..9b21b646 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt @@ -18,23 +18,30 @@ package com.sadellie.unitto.feature.converter.components -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.ExpandLess +import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.Placeable +import androidx.compose.ui.layout.SubcomposeLayout import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -50,51 +57,156 @@ import com.sadellie.unitto.data.model.UnitGroup * @param chosenUnitGroup Currently selected [UnitGroup] * @param selectAction Action to perform when a chip is clicked * @param navigateToSettingsAction Action to perform when clicking settings chip at the end - * @param lazyListState Used for animated scroll when entering unit selection screen */ @Composable internal fun ChipsRow( - items: List = UnitGroup.entries, + modifier: Modifier, + items: List, chosenUnitGroup: UnitGroup?, selectAction: (UnitGroup?) -> Unit, navigateToSettingsAction: () -> Unit, - lazyListState: LazyListState ) { - LazyRow( - modifier = Modifier - .padding(bottom = 4.dp) - .fillMaxWidth(), - state = lazyListState, - contentPadding = PaddingValues(8.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - items(items, key = { it.name }) { item -> - val selected: Boolean = item == chosenUnitGroup - FilterChip( - selected = selected, - onClick = { selectAction(if (selected) null else item) }, - label = stringResource(item.res), - imageVector = Icons.Default.Check, - contentDescription = stringResource(R.string.checked_filter_description) - ) + var expanded by remember { mutableStateOf(false) } + val chipModifier = Modifier.padding(horizontal = 4.dp) + + AnimatedContent( + targetState = expanded, + transitionSpec = { + expandVertically(expandFrom = Alignment.Top) { it } + fadeIn() togetherWith + shrinkVertically(shrinkTowards = Alignment.Top) { it } + fadeOut() + } + ) { isExpanded -> + FlexRow( + modifier = modifier, + maxRows = if (isExpanded) Int.MAX_VALUE else 2, + mainContent = { + items.forEach { item -> + val selected: Boolean = item == chosenUnitGroup + FilterChip( + modifier = chipModifier, + isSelected = selected, + onClick = { + selectAction(if (selected) null else item) + expanded = false + }, + label = stringResource(item.res), + ) + } + + AssistChip( + modifier = chipModifier, + onClick = navigateToSettingsAction, + imageVector = Icons.Default.Settings, + contentDescription = stringResource(R.string.open_settings_label) + ) + + if (expanded) { + AssistChip( + modifier = chipModifier, + onClick = { expanded = false }, + imageVector = Icons.Default.ExpandLess, + contentDescription = "" // TODO + ) + } + }, + expandContent = { + AssistChip( + modifier = chipModifier, + onClick = { expanded = true }, + imageVector = Icons.Default.ExpandMore, + contentDescription = "" // TODO + ) + }, + ) + } +} + +/** + * Foldable row that places a specified element if overflown. + * + * @param modifier [Modifier] to be applied to this layout. + * @param maxRows Max amount of rows including with [expandContent]. + * @param mainContent Main content (list of items) that will be folded. + * @param expandContent Item that will be placed at the end if given [maxRows] wasn't high enough to + * place all [mainContent] items. + */ +@Composable +private fun FlexRow( + modifier: Modifier = Modifier, + maxRows: Int = Int.MAX_VALUE, + mainContent: @Composable () -> Unit, + expandContent: @Composable () -> Unit, +) { + SubcomposeLayout( + modifier = modifier + ) { constraints -> + val localConstraints = constraints.copy(minWidth = 0, minHeight = 0) + val layoutWidth = localConstraints.maxWidth + + val mainMeasurables = subcompose(FlexRowSlots.Main, mainContent) + val expandMeasurables = subcompose( + slotId = FlexRowSlots.Expand, + content = { expandContent() } + ).map { + it.measure(localConstraints) + } + val expandContentWidth = expandMeasurables.sumOf { it.measuredWidth } + + val placeables = mutableListOf>(mutableListOf()) + + var widthLeft = layoutWidth + var index = 0 + for (measurable in mainMeasurables) { + val mainPlaceable = measurable.measure(localConstraints) + + val lastAvailableRow = placeables.size >= maxRows + val notLastItem = index < mainMeasurables.lastIndex + + // count expandContent width only for last row and not last main placeable + val measuredWidth = if (lastAvailableRow and notLastItem) { + mainPlaceable.measuredWidth + expandContentWidth + } else { + mainPlaceable.measuredWidth + } + + // need new row + if (widthLeft <= measuredWidth) { + // Can't add more rows, add expandContent + if (lastAvailableRow) { + expandMeasurables.forEach { + placeables.last().add(it) + } + break + } + + placeables.add(mutableListOf()) + widthLeft = layoutWidth + } + placeables.last().add(mainPlaceable) + index++ + widthLeft -= mainPlaceable.measuredWidth } - /** - * Usually this chip is placed at the start, but since we scroll to currently selected - * chip, user may never find it. There is higher chance that user will notice this chip when - * scrolling right (to the last one). - */ - item("settings") { - AssistChip( - onClick = navigateToSettingsAction, - imageVector = Icons.Default.Settings, - contentDescription = stringResource(R.string.open_settings_label) - ) + val flattenPlaceables = placeables.flatten() + val layoutHeight = placeables.size * (flattenPlaceables.maxByOrNull { it.height }?.height ?: 0) + + layout(layoutWidth, layoutHeight) { + var yPos = 0 + placeables.forEach { row -> + var xPos = 0 + row.forEach { placeable -> + placeable.place(x = xPos, y = yPos) + xPos += placeable.width + } + yPos += row.maxByOrNull { it.height }?.height ?: 0 + } } } } -@Preview +private enum class FlexRowSlots { Main, Expand } + +@Preview(device = "spec:width=380dp,height=850.9dp,dpi=440") @Composable fun PreviewUnittoChips() { var selected by remember { mutableStateOf(UnitGroup.LENGTH) } @@ -103,11 +215,25 @@ fun PreviewUnittoChips() { selected = unitGroup } - ChipsRow( - items = UnitGroup.entries, - chosenUnitGroup = selected, - selectAction = { selectAction(it) }, - navigateToSettingsAction = {}, - lazyListState = rememberLazyListState() - ) + Column { + ChipsRow( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .fillMaxWidth(), + items = UnitGroup.entries.take(7), + chosenUnitGroup = selected, + selectAction = { selectAction(it) }, + navigateToSettingsAction = {}, + ) + + ChipsRow( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .fillMaxWidth(), + items = UnitGroup.entries.take(10), + chosenUnitGroup = selected, + selectAction = { selectAction(it) }, + navigateToSettingsAction = {}, + ) + } } From 7cbbb846af4e2f604099823a95944740843bae0e Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Fri, 9 Feb 2024 23:25:08 +0300 Subject: [PATCH 13/46] Refactor unit selector screens decrease duplicate logic in ConverterViewModel --- .../sadellie/unitto/data/common/FlowUtils.kt | 40 +++++ .../feature/converter/ConverterScreen.kt | 32 ++-- .../feature/converter/ConverterViewModel.kt | 135 ---------------- .../feature/converter/LeftSideUIState.kt | 38 ----- ...ideScreen.kt => UnitFromSelectorScreen.kt} | 47 +++--- ...tSideUIState.kt => UnitSelectorUIState.kt} | 39 +++-- .../converter/UnitSelectorViewModel.kt | 149 ++++++++++++++++++ ...tSideScreen.kt => UnitToSelectorScreen.kt} | 60 ++++--- .../feature/converter/components/UnitsList.kt | 19 ++- .../navigation/ConverterNavigation.kt | 118 ++++++++++++-- 10 files changed, 404 insertions(+), 273 deletions(-) delete mode 100644 feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideUIState.kt rename feature/converter/src/main/java/com/sadellie/unitto/feature/converter/{LeftSideScreen.kt => UnitFromSelectorScreen.kt} (83%) rename feature/converter/src/main/java/com/sadellie/unitto/feature/converter/{RightSideUIState.kt => UnitSelectorUIState.kt} (59%) create mode 100644 feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt rename feature/converter/src/main/java/com/sadellie/unitto/feature/converter/{RightSideScreen.kt => UnitToSelectorScreen.kt} (81%) diff --git a/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt index 4861dd77..087040dc 100644 --- a/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt @@ -154,5 +154,45 @@ fun combine( ) } +@Suppress("UNCHECKED_CAST", "UNUSED") +fun combine( + flow: Flow, + flow2: Flow, + flow3: Flow, + flow4: Flow, + flow5: Flow, + flow6: Flow, + flow7: Flow, + flow8: Flow, + flow9: Flow, + flow10: Flow, + transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): Flow = + kotlinx.coroutines.flow.combine( + flow, + flow2, + flow3, + flow4, + flow5, + flow6, + flow7, + flow8, + flow9, + flow10 + ) { args: Array<*> -> + transform( + args[0] as T1, + args[1] as T2, + args[2] as T3, + args[3] as T4, + args[4] as T5, + args[5] as T6, + args[6] as T7, + args[7] as T8, + args[8] as T9, + args[9] as T10, + ) + } + fun Flow.stateIn(scope: CoroutineScope, initialValue: T): StateFlow = stateIn(scope, SharingStarted.WhileSubscribed(5000L), initialValue) diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index 824aedd8..7291f8d4 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -97,8 +97,8 @@ import java.util.Locale @Composable internal fun ConverterRoute( viewModel: ConverterViewModel = hiltViewModel(), - navigateToLeftScreen: () -> Unit, - navigateToRightScreen: () -> Unit, + navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, + navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, navigateToMenu: () -> Unit, navigateToSettings: () -> Unit, ) { @@ -124,8 +124,8 @@ internal fun ConverterRoute( @Composable private fun ConverterScreen( uiState: UnitConverterUIState, - navigateToLeftScreen: () -> Unit, - navigateToRightScreen: () -> Unit, + navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, + navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, navigateToSettings: () -> Unit, navigateToMenu: () -> Unit, swapUnits: () -> Unit, @@ -207,9 +207,9 @@ private fun NumberBase( onValueChange: (TextFieldValue) -> Unit, processInput: (String) -> Unit, deleteDigit: () -> Unit, - navigateToLeftScreen: () -> Unit, + navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, swapUnits: () -> Unit, - navigateToRightScreen: () -> Unit, + navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, clearInput: () -> Unit, ) { PortraitLandscape( @@ -239,8 +239,8 @@ private fun NumberBase( unitFromLabel = stringResource(uiState.unitFrom.displayName), unitToLabel = stringResource(uiState.unitTo.displayName), swapUnits = swapUnits, - navigateToLeftScreen = navigateToLeftScreen, - navigateToRightScreen = navigateToRightScreen + navigateToLeftScreen = { navigateToLeftScreen(uiState) }, + navigateToRightScreen = { navigateToRightScreen(uiState) } ) } }, @@ -263,9 +263,9 @@ private fun Default( onFocusOnInput2: (Boolean) -> Unit, processInput: (String) -> Unit, deleteDigit: () -> Unit, - navigateToLeftScreen: () -> Unit, + navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, swapUnits: () -> Unit, - navigateToRightScreen: () -> Unit, + navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, clearInput: () -> Unit, refreshCurrencyRates: (AbstractUnit) -> Unit, addBracket: () -> Unit, @@ -327,7 +327,9 @@ private fun Default( .weight(1f) ) { ExpressionTextField( - modifier = Modifier.fillMaxWidth().weight(1f), + modifier = Modifier + .fillMaxWidth() + .weight(1f), value = uiState.input1, minRatio = 0.7f, onValueChange = onValueChange, @@ -345,7 +347,9 @@ private fun Default( .weight(1f) ) { ExpressionTextField( - modifier = Modifier.fillMaxWidth().weight(1f) + modifier = Modifier + .fillMaxWidth() + .weight(1f) .onFocusEvent { state -> onFocusOnInput2(state.hasFocus) }, value = uiState.input2, minRatio = 0.7f, @@ -405,8 +409,8 @@ private fun Default( unitFromLabel = stringResource(uiState.unitFrom.displayName), unitToLabel = stringResource(uiState.unitTo.displayName), swapUnits = swapUnits, - navigateToLeftScreen = navigateToLeftScreen, - navigateToRightScreen = navigateToRightScreen + navigateToLeftScreen = { navigateToLeftScreen(uiState) }, + navigateToRightScreen = { navigateToRightScreen(uiState) } ) } }, 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 3bcc19b5..f5ea3f4e 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 @@ -33,7 +33,6 @@ import com.sadellie.unitto.data.common.isExpression import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup -import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.repository.UnitsRepository import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import com.sadellie.unitto.data.model.unit.AbstractUnit @@ -45,12 +44,10 @@ import io.github.sadellie.evaluatto.ExpressionException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.getAndUpdate import kotlinx.coroutines.flow.mapLatest -import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -74,13 +71,6 @@ internal class ConverterViewModel @Inject constructor( private val _unitFrom = MutableStateFlow(null) private val _unitTo = MutableStateFlow(null) - private val _leftQuery = MutableStateFlow(TextFieldValue()) - private val _leftUnits = MutableStateFlow>>(emptyMap()) - private val _leftUnitGroup = MutableStateFlow(null) - - private val _rightQuery = MutableStateFlow(TextFieldValue()) - private val _rightUnits = MutableStateFlow>>(emptyMap()) - private val _currenciesState = MutableStateFlow(CurrencyRateUpdateState.Nothing) private var _loadCurrenciesJob: Job? = null @@ -160,81 +150,6 @@ internal class ConverterViewModel @Inject constructor( } .stateIn(viewModelScope, UnitConverterUIState.Loading) - val leftSideUIState = combine( - _unitFrom, - _leftQuery, - _leftUnits, - _leftUnitGroup, - userPrefsRepository.converterPrefs, - unitsRepo.units - ) { unitFrom, query, units, unitGroup, prefs, _ -> - unitFrom ?: return@combine LeftSideUIState.Loading - - return@combine LeftSideUIState.Ready( - unitFrom = unitFrom, - sorting = prefs.unitConverterSorting, - shownUnitGroups = prefs.shownUnitGroups, - favorites = prefs.unitConverterFavoritesOnly, - query = query, - units = units, - unitGroup = unitGroup - ) - } - .mapLatest { - if (it !is LeftSideUIState.Ready) return@mapLatest it - - filterUnitsLeft( - query = it.query, - unitGroup = it.unitGroup, - favoritesOnly = it.favorites, - sorting = it.sorting, - shownUnitGroups = it.shownUnitGroups, - ) - it - } - .stateIn(viewModelScope, SharingStarted.Lazily, LeftSideUIState.Loading) - - val rightSideUIState = combine( - _unitFrom, - _unitTo, - _input1, - _calculation, - _rightQuery, - _rightUnits, - userPrefsRepository.converterPrefs, - _currenciesState, - unitsRepo.units, - ) { unitFrom, unitTo, input, calculation, query, units, prefs, currenciesState, _ -> - unitFrom ?: return@combine RightSideUIState.Loading - unitTo ?: return@combine RightSideUIState.Loading - - return@combine RightSideUIState.Ready( - unitFrom = unitFrom, - unitTo = unitTo, - sorting = prefs.unitConverterSorting, - favorites = prefs.unitConverterFavoritesOnly, - input = (calculation?.toPlainString() ?: input.text).replace(Token.Operator.minus, "-"), - scale = prefs.precision, - outputFormat = prefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator), - currencyRateUpdateState = currenciesState, - query = query, - units = units, - ) - } - .mapLatest { - if (it !is RightSideUIState.Ready) return@mapLatest it - - filterUnitsRight( - query = it.query, - unitGroup = it.unitFrom.group, - favoritesOnly = it.favorites, - sorting = it.sorting, - ) - it - } - .stateIn(viewModelScope, SharingStarted.Lazily, RightSideUIState.Loading) - fun swapUnits() { _unitFrom .getAndUpdate { _unitTo.value } @@ -380,56 +295,6 @@ internal class ConverterViewModel @Inject constructor( } } - fun queryChangeLeft(query: TextFieldValue) = _leftQuery.update { query } - - fun queryChangeRight(query: TextFieldValue) = _rightQuery.update { query } - - fun favoritesOnlyChange(enabled: Boolean) = viewModelScope.launch { - userPrefsRepository.updateUnitConverterFavoritesOnly(enabled) - } - - fun updateUnitGroupLeft(unitGroup: UnitGroup?) = _leftUnitGroup.update { unitGroup } - - fun favoriteUnit(unit: AbstractUnit) = viewModelScope.launch { - unitsRepo.favorite(unit) - } - - private fun filterUnitsLeft( - query: TextFieldValue, - unitGroup: UnitGroup?, - favoritesOnly: Boolean, - sorting: UnitsListSorting, - shownUnitGroups: List, - ) = viewModelScope.launch(Dispatchers.Default) { - _leftUnits.update { - unitsRepo.filterUnits( - query = query.text, - unitGroup = unitGroup, - favoritesOnly = favoritesOnly, - hideBrokenUnits = false, - sorting = sorting, - shownUnitGroups = shownUnitGroups - ) - } - } - - private fun filterUnitsRight( - query: TextFieldValue, - unitGroup: UnitGroup?, - favoritesOnly: Boolean, - sorting: UnitsListSorting, - ) = viewModelScope.launch(Dispatchers.Default) { - _rightUnits.update { - unitsRepo.filterUnits( - query = query.text, - unitGroup = unitGroup, - favoritesOnly = favoritesOnly, - hideBrokenUnits = true, - sorting = sorting, - ) - } - } - private fun convertDefault( unitFrom: DefaultUnit, unitTo: DefaultUnit, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideUIState.kt deleted file mode 100644 index 7ef72129..00000000 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideUIState.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.feature.converter - -import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.data.model.UnitGroup -import com.sadellie.unitto.data.model.UnitsListSorting -import com.sadellie.unitto.data.model.unit.AbstractUnit - -internal sealed class LeftSideUIState { - data object Loading : LeftSideUIState() - - data class Ready( - val unitFrom: AbstractUnit, - val query: TextFieldValue, - val units: Map> = emptyMap(), - val favorites: Boolean, - val shownUnitGroups: List, - val unitGroup: UnitGroup?, - val sorting: UnitsListSorting, - ) : LeftSideUIState() -} diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt similarity index 83% rename from feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt rename to feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt index 6bea6401..8561deed 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/LeftSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt @@ -49,31 +49,32 @@ import com.sadellie.unitto.feature.converter.components.UnitsList import java.math.BigDecimal @Composable -internal fun LeftSideRoute( - viewModel: ConverterViewModel, +internal fun UnitFromSelectorRoute( + unitSelectorViewModel: UnitSelectorViewModel, + converterViewModel: ConverterViewModel, navigateUp: () -> Unit, navigateToUnitGroups: () -> Unit, ) { when ( - val uiState = viewModel.leftSideUIState.collectAsStateWithLifecycle().value + val uiState = unitSelectorViewModel.unitFromUIState.collectAsStateWithLifecycle().value ) { - is LeftSideUIState.Loading -> EmptyScreen() - is LeftSideUIState.Ready -> LeftSideScreen( + is UnitSelectorUIState.UnitFrom -> UnitFromSelectorScreen( uiState = uiState, - onQueryChange = viewModel::queryChangeLeft, - toggleFavoritesOnly = viewModel::favoritesOnlyChange, - updateUnitFrom = viewModel::updateUnitFrom, - updateUnitGroup = viewModel::updateUnitGroupLeft, - favoriteUnit = viewModel::favoriteUnit, + onQueryChange = unitSelectorViewModel::updateSelectorQuery, + toggleFavoritesOnly = unitSelectorViewModel::updateShowFavoritesOnly, + updateUnitFrom = converterViewModel::updateUnitFrom, + updateUnitGroup = unitSelectorViewModel::updateSelectedUnitGroup, + favoriteUnit = unitSelectorViewModel::favoriteUnit, navigateUp = navigateUp, navigateToUnitGroups = navigateToUnitGroups, ) + else -> EmptyScreen() } } @Composable -private fun LeftSideScreen( - uiState: LeftSideUIState.Ready, +private fun UnitFromSelectorScreen( + uiState: UnitSelectorUIState.UnitFrom, onQueryChange: (TextFieldValue) -> Unit, toggleFavoritesOnly: (Boolean) -> Unit, updateUnitFrom: (AbstractUnit) -> Unit, @@ -87,8 +88,6 @@ private fun LeftSideScreen( val chipsRowLazyListState = rememberLazyListState() LaunchedEffect(uiState.unitFrom, uiState.shownUnitGroups) { - updateUnitGroup(uiState.unitFrom.group) - kotlin.runCatching { val groupToSelect = uiState.shownUnitGroups.indexOf(uiState.unitFrom.group) if (groupToSelect > -1) { @@ -108,8 +107,8 @@ private fun LeftSideScreen( onQueryChange = onQueryChange, navigateUp = navigateUp, trailingIcon = { - FavoritesButton(uiState.favorites) { - toggleFavoritesOnly(!uiState.favorites) + FavoritesButton(uiState.showFavoritesOnly) { + toggleFavoritesOnly(!uiState.showFavoritesOnly) } }, scrollBehavior = scrollBehavior @@ -119,7 +118,7 @@ private fun LeftSideScreen( modifier = Modifier .padding(start = 8.dp, end = 8.dp, bottom = 4.dp) .fillMaxWidth(), - chosenUnitGroup = uiState.unitGroup, + chosenUnitGroup = uiState.selectedUnitGroup, items = uiState.shownUnitGroups, selectAction = updateUnitGroup, navigateToSettingsAction = navigateToUnitGroups @@ -130,7 +129,7 @@ private fun LeftSideScreen( val resources = LocalContext.current.resources UnitsList( modifier = Modifier.padding(paddingValues), - groupedUnits = uiState.units, + searchResult = uiState.units, navigateToUnitGroups = navigateToUnitGroups, currentUnitId = uiState.unitFrom.id, supportLabel = { resources.getString(it.shortName) }, @@ -146,7 +145,7 @@ private fun LeftSideScreen( @Preview @Composable -private fun LeftSideScreenPreview() { +private fun UnitFromSelectorScreenPreview() { val units: Map> = mapOf( UnitGroup.LENGTH to listOf( NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), @@ -159,14 +158,14 @@ private fun LeftSideScreenPreview() { ) ) - LeftSideScreen( - uiState = LeftSideUIState.Ready( + UnitFromSelectorScreen( + uiState = UnitSelectorUIState.UnitFrom( unitFrom = units.values.first().first(), - units = units, query = TextFieldValue("test"), - favorites = false, + units = UnitSearchResult.Success(units), + selectedUnitGroup = UnitGroup.SPEED, shownUnitGroups = UnitGroup.entries, - unitGroup = units.keys.toList().first(), + showFavoritesOnly = false, sorting = UnitsListSorting.USAGE, ), onQueryChange = {}, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt similarity index 59% rename from feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt rename to feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt index 1148f800..03d6bcec 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt @@ -1,6 +1,6 @@ /* * Unitto is a calculator for Android - * Copyright (c) 2023-2024 Elshan Agaev + * 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 @@ -24,20 +24,39 @@ import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.unit.AbstractUnit -internal sealed class RightSideUIState { - data object Loading : RightSideUIState() +internal sealed class UnitSelectorUIState { + data object Loading : UnitSelectorUIState() - data class Ready( + data class UnitFrom( + val query: TextFieldValue, + val unitFrom: AbstractUnit, + val shownUnitGroups: List, + val showFavoritesOnly: Boolean, + val units: UnitSearchResult, + val selectedUnitGroup: UnitGroup?, + val sorting: UnitsListSorting, + ) : UnitSelectorUIState() + + data class UnitTo( + val query: TextFieldValue, val unitFrom: AbstractUnit, val unitTo: AbstractUnit, - val query: TextFieldValue, - val units: Map>, - val favorites: Boolean, + val showFavoritesOnly: Boolean, + val units: UnitSearchResult, + val input: String?, val sorting: UnitsListSorting, - val input: String, val scale: Int, val outputFormat: Int, val formatterSymbols: FormatterSymbols, - val currencyRateUpdateState: CurrencyRateUpdateState, - ) : RightSideUIState() + ) : UnitSelectorUIState() +} + +internal sealed class UnitSearchResult { + data object Empty : UnitSearchResult() + + data object Loading : UnitSearchResult() + + data class Success( + val units: Map> + ) : UnitSearchResult() } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt new file mode 100644 index 00000000..e35672ac --- /dev/null +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt @@ -0,0 +1,149 @@ +/* + * Unitto is a calculator 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.feature.converter + +import androidx.compose.ui.text.input.TextFieldValue +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols +import com.sadellie.unitto.data.common.stateIn +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.model.repository.UnitsRepository +import com.sadellie.unitto.data.model.repository.UserPreferencesRepository +import com.sadellie.unitto.data.model.unit.AbstractUnit +import com.sadellie.unitto.feature.converter.navigation.inputArg +import com.sadellie.unitto.feature.converter.navigation.unitFromIdArg +import com.sadellie.unitto.feature.converter.navigation.unitGroupArg +import com.sadellie.unitto.feature.converter.navigation.unitToIdArg +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +internal class UnitSelectorViewModel @Inject constructor( + private val userPrefsRepository: UserPreferencesRepository, + private val unitsRepo: UnitsRepository, + savedStateHandle: SavedStateHandle +) : ViewModel() { + private val _query = MutableStateFlow(TextFieldValue()) + private val _searchResults = MutableStateFlow(UnitSearchResult.Loading) + private val _selectedUnitGroup = MutableStateFlow(savedStateHandle.get(unitGroupArg)) + private val _unitFromId = savedStateHandle.get(unitFromIdArg) + private val _unitToId = savedStateHandle.get(unitToIdArg) + private val _input = savedStateHandle.get(inputArg) + + val unitFromUIState: StateFlow = combine( + _query, + _searchResults, + _selectedUnitGroup, + userPrefsRepository.converterPrefs, + ) { query, searchResults, selectedUnitGroup, prefs -> + if (_unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + + return@combine UnitSelectorUIState.UnitFrom( + query = query, + unitFrom = unitsRepo.getById(_unitFromId), + shownUnitGroups = prefs.shownUnitGroups, + showFavoritesOnly = prefs.unitConverterFavoritesOnly, + units = searchResults, + selectedUnitGroup = selectedUnitGroup, + sorting = prefs.unitConverterSorting, + ) + } + .mapLatest { ui -> + if (ui is UnitSelectorUIState.UnitFrom) { + _searchResults.update { + val result = unitsRepo.filterUnits( + query = ui.query.text, + unitGroup = ui.selectedUnitGroup, + favoritesOnly = ui.showFavoritesOnly, + hideBrokenUnits = false, + sorting = ui.sorting, + shownUnitGroups = ui.shownUnitGroups + ) + + if (result.isEmpty()) UnitSearchResult.Empty else UnitSearchResult.Success(result) + } + } + + ui + } + .stateIn(viewModelScope, UnitSelectorUIState.Loading) + + val unitToUIState: StateFlow = combine( + _query, + _searchResults, + userPrefsRepository.converterPrefs, + unitsRepo.units, + ) { query, searchResults, prefs, _ -> + if (_unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + if (_unitToId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + + UnitSelectorUIState.UnitTo( + query = query, + unitFrom = unitsRepo.getById(_unitFromId), + unitTo = unitsRepo.getById(_unitToId), + showFavoritesOnly = prefs.unitConverterFavoritesOnly, + units = searchResults, + input = _input, + sorting = prefs.unitConverterSorting, + scale = prefs.precision, + outputFormat = prefs.outputFormat, + formatterSymbols = AllFormatterSymbols.getById(prefs.separator), + ) + } + .mapLatest { ui -> + if (ui is UnitSelectorUIState.UnitTo) { + _searchResults.update { + if (ui.unitFrom.group == UnitGroup.CURRENCY) unitsRepo.updateRates(ui.unitFrom) + + val result = unitsRepo.filterUnits( + query = ui.query.text, + unitGroup = ui.unitFrom.group, + favoritesOnly = ui.showFavoritesOnly, + hideBrokenUnits = true, + sorting = ui.sorting, + ) + + if (result.isEmpty()) UnitSearchResult.Empty else UnitSearchResult.Success(result) + } + } + ui + } + .stateIn(viewModelScope, UnitSelectorUIState.Loading) + + fun updateSelectorQuery(value: TextFieldValue) = _query.update { value } + + fun updateShowFavoritesOnly(value: Boolean) = viewModelScope.launch { + userPrefsRepository.updateUnitConverterFavoritesOnly(value) + } + + fun updateSelectedUnitGroup(value: UnitGroup?) = _selectedUnitGroup.update { value } + + fun favoriteUnit(unit: AbstractUnit) = viewModelScope.launch(Dispatchers.IO) { + unitsRepo.favorite(unit) + } +} diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt similarity index 81% rename from feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt rename to feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt index cb413666..55df0e29 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/RightSideScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt @@ -47,31 +47,31 @@ import com.sadellie.unitto.feature.converter.components.UnitsList import java.math.BigDecimal @Composable -internal fun RightSideRoute( - viewModel: ConverterViewModel, +internal fun UnitToSelectorRoute( + unitSelectorViewModel: UnitSelectorViewModel, + converterViewModel: ConverterViewModel, navigateUp: () -> Unit, navigateToUnitGroups: () -> Unit, ) { when ( - val uiState = viewModel.rightSideUIState.collectAsStateWithLifecycle().value + val uiState = unitSelectorViewModel.unitToUIState.collectAsStateWithLifecycle().value ) { - is RightSideUIState.Loading -> EmptyScreen() - is RightSideUIState.Ready -> - RightSideScreen( - uiState = uiState, - onQueryChange = viewModel::queryChangeRight, - toggleFavoritesOnly = viewModel::favoritesOnlyChange, - updateUnitTo = viewModel::updateUnitTo, - favoriteUnit = viewModel::favoriteUnit, - navigateUp = navigateUp, - navigateToUnitGroups = navigateToUnitGroups, - ) + is UnitSelectorUIState.UnitTo -> UnitToSelectorScreen( + uiState = uiState, + onQueryChange = unitSelectorViewModel::updateSelectorQuery, + toggleFavoritesOnly = unitSelectorViewModel::updateShowFavoritesOnly, + updateUnitTo = converterViewModel::updateUnitTo, + favoriteUnit = unitSelectorViewModel::favoriteUnit, + navigateUp = navigateUp, + navigateToUnitGroups = navigateToUnitGroups, + ) + else -> EmptyScreen() } } @Composable -private fun RightSideScreen( - uiState: RightSideUIState.Ready, +private fun UnitToSelectorScreen( + uiState: UnitSelectorUIState.UnitTo, onQueryChange: (TextFieldValue) -> Unit, toggleFavoritesOnly: (Boolean) -> Unit, updateUnitTo: (AbstractUnit) -> Unit, @@ -89,8 +89,8 @@ private fun RightSideScreen( onQueryChange = onQueryChange, navigateUp = navigateUp, trailingIcon = { - FavoritesButton(uiState.favorites) { - toggleFavoritesOnly(!uiState.favorites) + FavoritesButton(uiState.showFavoritesOnly) { + toggleFavoritesOnly(!uiState.showFavoritesOnly) } }, scrollBehavior = scrollBehavior @@ -100,7 +100,7 @@ private fun RightSideScreen( val resources = LocalContext.current.resources UnitsList( modifier = Modifier.padding(paddingValues), - groupedUnits = uiState.units, + searchResult = uiState.units, navigateToUnitGroups = navigateToUnitGroups, currentUnitId = uiState.unitTo.id, supportLabel = { @@ -112,7 +112,6 @@ private fun RightSideScreen( scale = uiState.scale, outputFormat = uiState.outputFormat, formatterSymbols = uiState.formatterSymbols, - readyCurrencies = uiState.currencyRateUpdateState is CurrencyRateUpdateState.Ready, ) }, onClick = { @@ -128,15 +127,13 @@ private fun RightSideScreen( private fun formatUnitToSupportLabel( unitFrom: AbstractUnit?, unitTo: AbstractUnit?, - input: String, + input: String?, shortName: String, scale: Int, outputFormat: Int, formatterSymbols: FormatterSymbols, - readyCurrencies: Boolean, ): String { - if ((unitFrom?.group == UnitGroup.CURRENCY) and !readyCurrencies) return shortName - if (input.isEmpty()) return shortName + if (input.isNullOrEmpty()) return shortName try { if ((unitFrom is DefaultUnit) and (unitTo is DefaultUnit)) { @@ -168,7 +165,7 @@ private fun formatUnitToSupportLabel( @Preview @Composable -private fun RightSideScreenPreview() { +private fun UnitToSelectorPreview() { val units: Map> = mapOf( UnitGroup.LENGTH to listOf( NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), @@ -181,19 +178,18 @@ private fun RightSideScreenPreview() { ) ) - RightSideScreen( - uiState = RightSideUIState.Ready( + UnitToSelectorScreen( + uiState = UnitSelectorUIState.UnitTo( unitFrom = units.values.first().first(), - units = units, - query = TextFieldValue(), - favorites = false, + unitTo = units.values.first().first(), + query = TextFieldValue("test"), + units = UnitSearchResult.Success(units), + showFavoritesOnly = false, sorting = UnitsListSorting.USAGE, - unitTo = units.values.first()[1], input = "100", scale = 3, outputFormat = OutputFormat.PLAIN, formatterSymbols = FormatterSymbols.Spaces, - currencyRateUpdateState = CurrencyRateUpdateState.Nothing ), onQueryChange = {}, toggleFavoritesOnly = {}, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt index cb5212d4..16c1b169 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt @@ -33,12 +33,13 @@ import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit +import com.sadellie.unitto.feature.converter.UnitSearchResult import java.math.BigDecimal @Composable internal fun UnitsList( modifier: Modifier, - groupedUnits: Map>, + searchResult: UnitSearchResult, navigateToUnitGroups: () -> Unit, currentUnitId: String, supportLabel: (AbstractUnit) -> String, @@ -47,14 +48,14 @@ internal fun UnitsList( ) { Crossfade( modifier = modifier, - targetState = groupedUnits.isNotEmpty(), + targetState = searchResult, label = "Units list" - ) { hasUnits -> - when (hasUnits) { - true -> LazyColumn( + ) { result -> + when (result) { + is UnitSearchResult.Success -> LazyColumn( modifier = Modifier.fillMaxSize() ) { - groupedUnits.forEach { (group, units) -> + result.units.forEach { (group, units) -> item(group.name) { UnitGroupHeader(Modifier.animateItemPlacement(), group) } @@ -73,11 +74,13 @@ internal fun UnitsList( } } - false -> SearchPlaceholder( + UnitSearchResult.Empty -> SearchPlaceholder( onButtonClick = navigateToUnitGroups, supportText = stringResource(R.string.converter_no_results_support), buttonLabel = stringResource(R.string.open_settings_label) ) + + UnitSearchResult.Loading -> Unit } } } @@ -100,7 +103,7 @@ private fun PreviewUnitsList() { UnitsList( modifier = Modifier.fillMaxSize(), - groupedUnits = groupedUnits, + searchResult = UnitSearchResult.Success(units = groupedUnits), navigateToUnitGroups = {}, currentUnitId = UnitID.mile, supportLabel = { resources.getString(it.shortName) }, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt index 1033121b..288f0bb0 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt @@ -22,19 +22,42 @@ import androidx.compose.runtime.remember import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.navArgument import androidx.navigation.navDeepLink import com.sadellie.unitto.core.ui.model.DrawerItem import com.sadellie.unitto.core.ui.unittoComposable import com.sadellie.unitto.core.ui.unittoNavigation +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.feature.converter.ConverterRoute import com.sadellie.unitto.feature.converter.ConverterViewModel -import com.sadellie.unitto.feature.converter.LeftSideRoute -import com.sadellie.unitto.feature.converter.RightSideRoute +import com.sadellie.unitto.feature.converter.CurrencyRateUpdateState +import com.sadellie.unitto.feature.converter.UnitConverterUIState +import com.sadellie.unitto.feature.converter.UnitFromSelectorRoute +import com.sadellie.unitto.feature.converter.UnitToSelectorRoute private val graph = DrawerItem.Converter.graph private val start = DrawerItem.Converter.start -private const val LEFT = "left" -private const val RIGHT = "right" + +private const val UNIT_FROM = "unitFromSelector" +private const val UNIT_TO = "unitToSelector" +internal const val unitGroupArg = "unitGroupArg" +internal const val unitFromIdArg = "unitFromId" +internal const val unitToIdArg = "unitToIdArg" +internal const val inputArg = "inputArg" + +private const val UNIT_FROM_ROUTE = "$UNIT_FROM/{$unitFromIdArg}/{$unitGroupArg}" +private const val UNIT_TO_ROUTE = "$UNIT_TO/{$unitFromIdArg}/{$unitToIdArg}/{$inputArg}" +private fun NavHostController.navigateLeft( + unitFromId: String, + unitGroup: UnitGroup, +) = navigate("$UNIT_FROM/$unitFromId/$unitGroup") + +private fun NavHostController.navigateRight( + unitFromId: String, + unitToId: String, + input: String?, +) = navigate("$UNIT_TO/$unitFromId/$unitToId/$input") fun NavGraphBuilder.converterGraph( openDrawer: () -> Unit, @@ -58,36 +81,107 @@ fun NavGraphBuilder.converterGraph( ConverterRoute( viewModel = parentViewModel, - navigateToLeftScreen = { navController.navigate(LEFT) }, - navigateToRightScreen = { navController.navigate(RIGHT) }, + // Navigation logic is here, but should actually be in ConverterScreen + navigateToLeftScreen = { uiState: UnitConverterUIState -> + when (uiState) { + is UnitConverterUIState.Default -> navController + .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) + + is UnitConverterUIState.NumberBase -> navController + .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) + + else -> Unit + } + }, + navigateToRightScreen = { uiState: UnitConverterUIState -> + when (uiState) { + is UnitConverterUIState.Default -> { + // Don't allow converting if still loading currencies + val convertingCurrencies = uiState.unitFrom.group == UnitGroup.CURRENCY + val currenciesReady = + uiState.currencyRateUpdateState is CurrencyRateUpdateState.Ready + + val input: String? = if (convertingCurrencies and !currenciesReady) { + null + } else { + (uiState.calculation?.toPlainString() ?: uiState.input1.text) + .ifEmpty { null } + } + + navController.navigateRight( + uiState.unitFrom.id, + uiState.unitTo.id, + input + ) + } + + is UnitConverterUIState.NumberBase -> { + val input = uiState.input.text.ifEmpty { null } + navController.navigateRight( + uiState.unitFrom.id, + uiState.unitTo.id, + input + ) + } + + UnitConverterUIState.Loading -> Unit + } + }, navigateToSettings = navigateToSettings, navigateToMenu = openDrawer ) } - unittoComposable(LEFT) { backStackEntry -> + unittoComposable( + route = UNIT_FROM_ROUTE, + arguments = listOf( + navArgument(unitFromIdArg) { + type = NavType.StringType + }, + navArgument(unitGroupArg) { + type = NavType.EnumType(UnitGroup::class.java) + }, + ) + ) { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry(graph) } val parentViewModel = hiltViewModel(parentEntry) - LeftSideRoute( - viewModel = parentViewModel, + UnitFromSelectorRoute( + unitSelectorViewModel = hiltViewModel(), + converterViewModel = parentViewModel, navigateUp = navController::navigateUp, navigateToUnitGroups = navigateToUnitGroups ) } - unittoComposable(RIGHT) { backStackEntry -> + unittoComposable( + route = UNIT_TO_ROUTE, + arguments = listOf( + navArgument(unitFromIdArg) { + type = NavType.StringType + }, + navArgument(unitToIdArg) { + type = NavType.StringType + }, + navArgument(inputArg) { + type = NavType.StringType + nullable = true + defaultValue = null + }, + ) + ) { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry(graph) } val parentViewModel = hiltViewModel(parentEntry) - RightSideRoute( - viewModel = parentViewModel, + UnitToSelectorRoute( + unitSelectorViewModel = hiltViewModel(), + converterViewModel = parentViewModel, navigateUp = navController::navigateUp, navigateToUnitGroups = navigateToUnitGroups ) From 80f162474819767b24d4668a61765bd9a601cd71 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sat, 10 Feb 2024 17:09:30 +0300 Subject: [PATCH 14/46] Cleaner UI closes #182 --- app/src/main/java/com/sadellie/unitto/App.kt | 3 +- .../com/sadellie/unitto/UnittoNavigation.kt | 33 +++++----- .../common/{MenuButton.kt => DrawerButton.kt} | 8 +-- .../unitto/core/ui/common/NavigationDrawer.kt | 12 ++-- .../core/ui/common/ScaffoldWithTopBar.kt | 6 +- .../unitto/core/ui/common/SettingsButton.kt | 34 ----------- .../unitto/core/ui/common/SheetContent.kt | 26 ++++---- .../unitto/core/ui/model/DrawerItem.kt | 4 +- .../unitto/feature/bodymass/BodyMassScreen.kt | 12 +--- .../feature/bodymass/navigation/Navigation.kt | 2 - .../calculator/CalculatorScreenTest.kt | 15 ++--- .../feature/calculator/CalculatorScreen.kt | 61 ++++++++----------- .../navigation/CalculatorNavigation.kt | 4 +- .../feature/converter/ConverterScreen.kt | 33 ++++------ .../navigation/ConverterNavigation.kt | 4 +- .../datecalculator/DateCalculatorScreen.kt | 18 ++---- .../navigation/DateCalculatorNavigation.kt | 6 +- .../unitto/feature/settings/SettingsScreen.kt | 18 ++++-- .../settings/navigation/SettingsNavigation.kt | 9 +-- .../unitto/feature/timezone/TimeZoneScreen.kt | 20 +++--- .../timezone/navigation/TimeZoneNavigation.kt | 6 +- 21 files changed, 130 insertions(+), 204 deletions(-) rename core/ui/src/main/java/com/sadellie/unitto/core/ui/common/{MenuButton.kt => DrawerButton.kt} (89%) delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SettingsButton.kt diff --git a/app/src/main/java/com/sadellie/unitto/App.kt b/app/src/main/java/com/sadellie/unitto/App.kt index 3b8cf1b0..a6df4a61 100644 --- a/app/src/main/java/com/sadellie/unitto/App.kt +++ b/app/src/main/java/com/sadellie/unitto/App.kt @@ -92,7 +92,8 @@ internal fun ComponentActivity.App(prefs: AppPreferences?) { modifier = Modifier, state = drawerState, gesturesEnabled = gesturesEnabled, - tabs = DrawerItem.main, + mainTabs = DrawerItem.main, + additionalTabs = DrawerItem.additional, currentDestination = navBackStackEntry?.destination?.route, onItemClick = { destination -> drawerScope.launch { drawerState.close() } diff --git a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt index 43be9a39..64c9daa8 100644 --- a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt +++ b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt @@ -30,7 +30,6 @@ import com.sadellie.unitto.feature.bodymass.navigation.bodyMassGraph import com.sadellie.unitto.feature.calculator.navigation.calculatorGraph import com.sadellie.unitto.feature.converter.navigation.converterGraph import com.sadellie.unitto.feature.datecalculator.navigation.dateCalculatorGraph -import com.sadellie.unitto.feature.settings.navigation.navigateToSettings import com.sadellie.unitto.feature.settings.navigation.navigateToUnitGroups import com.sadellie.unitto.feature.settings.navigation.settingGraph import com.sadellie.unitto.feature.timezone.navigation.timeZoneGraph @@ -48,39 +47,35 @@ internal fun UnittoNavigation( startDestination = startDestination, modifier = Modifier.background(MaterialTheme.colorScheme.background), enterTransition = { fadeIn() }, - exitTransition = { fadeOut() } + exitTransition = { fadeOut() }, ) { + calculatorGraph( + openDrawer = openDrawer, + ) + converterGraph( openDrawer = openDrawer, navController = navController, - navigateToSettings = navController::navigateToSettings, - navigateToUnitGroups = navController::navigateToUnitGroups - ) - - settingGraph( - themmoController = themmoController, - navController = navController - ) - - calculatorGraph( - openDrawer = openDrawer, - navigateToSettings = navController::navigateToSettings + navigateToUnitGroups = navController::navigateToUnitGroups, ) dateCalculatorGraph( - navigateToMenu = openDrawer, - navigateToSettings = navController::navigateToSettings + openDrawer = openDrawer, ) timeZoneGraph( - navigateToMenu = openDrawer, - navigateToSettings = navController::navigateToSettings, + openDrawer = openDrawer, navController = navController, ) bodyMassGraph( openDrawer = openDrawer, - navigateToSettings = navController::navigateToSettings, + ) + + settingGraph( + openDrawer = openDrawer, + navController = navController, + themmoController = themmoController, ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerButton.kt similarity index 89% rename from core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt rename to core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerButton.kt index 1ad07c8e..94d93ca9 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerButton.kt @@ -27,16 +27,16 @@ import androidx.compose.ui.res.stringResource import com.sadellie.unitto.core.base.R /** - * Button that is used in Top bars + * Button that is used in Top bars to open drawer. * * @param onClick Action to be called when button is clicked. */ @Composable -fun MenuButton(onClick: () -> Unit) { +fun DrawerButton(onClick: () -> Unit) { IconButton(onClick = onClick) { Icon( - Icons.Outlined.Menu, - contentDescription = stringResource(R.string.open_menu_description) + imageVector = Icons.Outlined.Menu, + contentDescription = stringResource(R.string.open_menu_description), ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt index 95567aec..0e906d14 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt @@ -111,7 +111,8 @@ fun NavigationDrawer( modifier: Modifier, gesturesEnabled: Boolean, state: DrawerState = rememberDrawerState(), - tabs: List, + mainTabs: List, + additionalTabs: List, currentDestination: String?, onItemClick: (DrawerItem) -> Unit, content: @Composable () -> Unit, @@ -126,7 +127,8 @@ fun NavigationDrawer( .verticalScroll(rememberScrollState()) ) { SheetContent( - tabs = tabs, + mainTabs = mainTabs, + additionalTabs = additionalTabs, currentDestination = currentDestination, onItemClick = onItemClick ) @@ -144,7 +146,8 @@ fun NavigationDrawer( .verticalScroll(rememberScrollState()) ) { SheetContent( - tabs = tabs, + mainTabs = mainTabs, + additionalTabs = additionalTabs, currentDestination = currentDestination, onItemClick = onItemClick ) @@ -279,7 +282,8 @@ private fun PreviewUnittoModalNavigationDrawerClose() { modifier = Modifier, state = drawerState, gesturesEnabled = true, - tabs = DrawerItem.main, + mainTabs = DrawerItem.main, + additionalTabs = DrawerItem.additional, currentDestination = DrawerItem.Calculator.start, onItemClick = {}, content = { diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt index 2283e5ee..02e719ec 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt @@ -71,7 +71,11 @@ fun ScaffoldWithTopBar( ) { CenterAlignedTopAppBar( title = title, - navigationIcon = if (LocalWindowSize.current.widthSizeClass != WindowWidthSizeClass.Expanded) navigationIcon else { {} }, + navigationIcon = { + if (LocalWindowSize.current.widthSizeClass != WindowWidthSizeClass.Expanded) { + navigationIcon() + } + }, actions = actions, colors = colors, scrollBehavior = scrollBehavior, diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SettingsButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SettingsButton.kt deleted file mode 100644 index 16d1aeb3..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SettingsButton.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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 - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Settings -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import com.sadellie.unitto.core.base.R - -@Composable -fun SettingsButton(onClick: () -> Unit) { - IconButton(onClick) { - Icon(Icons.Outlined.Settings, stringResource(R.string.open_settings_label)) - } -} diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt index 8d5d5524..aeb6efba 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt @@ -39,15 +39,14 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.LocalWindowSize -import com.sadellie.unitto.core.ui.WindowHeightSizeClass import com.sadellie.unitto.core.ui.model.DrawerItem import kotlinx.coroutines.delay @Suppress("UnusedReceiverParameter") @Composable internal fun ColumnScope.SheetContent( - tabs: List, + mainTabs: List, + additionalTabs: List, currentDestination: String?, onItemClick: (DrawerItem) -> Unit, ) { @@ -79,7 +78,7 @@ internal fun ColumnScope.SheetContent( ) } - tabs.forEach { drawerItem -> + mainTabs.forEach { drawerItem -> val selected = drawerItem.start == currentDestination DrawerItem( modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding), @@ -90,15 +89,15 @@ internal fun ColumnScope.SheetContent( ) } - // Top bar (and settings button in it) is not visible for compact height - if (LocalWindowSize.current.heightSizeClass == WindowHeightSizeClass.Compact) { - HorizontalDivider(Modifier.padding(horizontal = 12.dp, vertical = 8.dp)) + HorizontalDivider(Modifier.padding(horizontal = 12.dp, vertical = 8.dp)) + additionalTabs.forEach { drawerItem -> + val selected = drawerItem.start == currentDestination DrawerItem( modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding), - destination = DrawerItem.Settings, - icon = DrawerItem.Settings.defaultIcon, - selected = false, + destination = drawerItem, + icon = if (selected) drawerItem.selectedIcon else drawerItem.defaultIcon, + selected = selected, onClick = onItemClick ) } @@ -109,7 +108,12 @@ internal fun ColumnScope.SheetContent( private fun PreviewDrawerSheet() { Column { SheetContent( - tabs = listOf( + mainTabs = listOf( + DrawerItem.Calculator, + DrawerItem.Calculator, + DrawerItem.Calculator, + ), + additionalTabs = listOf( DrawerItem.Calculator, DrawerItem.Calculator, DrawerItem.Calculator, diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt index 831eba37..e4123d27 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt @@ -139,7 +139,9 @@ sealed class DrawerItem( all } + val additional = listOf(Settings) + // Only routes, not graphs! - val startRoutes by lazy { main.map { it.start } } + val startRoutes by lazy { (main + additional).map { it.start } } } } 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 de0f3ce0..87cc77cc 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 @@ -50,12 +50,11 @@ 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.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen -import com.sadellie.unitto.core.ui.common.MenuButton import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.core.ui.common.SegmentedButton import com.sadellie.unitto.core.ui.common.SegmentedButtonsRow -import com.sadellie.unitto.core.ui.common.SettingsButton import com.sadellie.unitto.core.ui.common.textfield.ExpressionTransformer import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.openLink @@ -67,8 +66,7 @@ import java.math.BigDecimal @Composable internal fun BodyMassRoute( openDrawer: () -> Unit, - navigateToSettings: () -> Unit, - viewModel: BodyMassViewModel = hiltViewModel() + viewModel: BodyMassViewModel = hiltViewModel(), ) { when (val uiState = viewModel.uiState.collectAsStateWithLifecycle().value) { UIState.Loading -> EmptyScreen() @@ -79,7 +77,6 @@ internal fun BodyMassRoute( updateWeight = viewModel::updateWeight, updateIsMetric = viewModel::updateIsMetric, openDrawer = openDrawer, - navigateToSettings = navigateToSettings ) } } @@ -92,7 +89,6 @@ private fun BodyMassScreen( updateWeight: (TextFieldValue) -> Unit, updateIsMetric: (Boolean) -> Unit, openDrawer: () -> Unit, - navigateToSettings: () -> Unit, ) { val mContext = LocalContext.current val expressionTransformer = remember(uiState.formatterSymbols) { @@ -106,8 +102,7 @@ private fun BodyMassScreen( ScaffoldWithTopBar( title = { Text(stringResource(R.string.body_mass_title)) }, - navigationIcon = { MenuButton(openDrawer) }, - actions = { SettingsButton(navigateToSettings) } + navigationIcon = { DrawerButton(openDrawer) }, ) { paddingValues -> Column( modifier = Modifier @@ -235,6 +230,5 @@ fun PreviewBodyMassScreen() { updateWeight = {}, updateIsMetric = {}, openDrawer = {}, - navigateToSettings = {} ) } diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt index e0496054..3327456b 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt @@ -30,7 +30,6 @@ private val start = DrawerItem.BodyMass.start fun NavGraphBuilder.bodyMassGraph( openDrawer: () -> Unit, - navigateToSettings: () -> Unit ) { unittoNavigation( startDestination = start, @@ -42,7 +41,6 @@ fun NavGraphBuilder.bodyMassGraph( unittoComposable(start) { BodyMassRoute( openDrawer = openDrawer, - navigateToSettings = navigateToSettings ) } } diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index f6e8547e..f1be2ea8 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -41,16 +41,15 @@ class CalculatorScreenTest { setContent { CalculatorScreen( uiState = CalculatorUIState.Loading, - navigateToMenu = {}, - navigateToSettings = {}, + openDrawer = {}, addTokens = {}, + addBracket = {}, clearInput = {}, deleteTokens = {}, onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {}, onDelete = {}, ) } @@ -74,16 +73,15 @@ class CalculatorScreenTest { acButton = true, partialHistoryView = true ), - navigateToMenu = {}, - navigateToSettings = {}, + openDrawer = {}, addTokens = {}, + addBracket = {}, clearInput = {}, deleteTokens = {}, onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {}, onDelete = {}, ) } @@ -108,16 +106,15 @@ class CalculatorScreenTest { acButton = true, partialHistoryView = true ), - navigateToMenu = {}, - navigateToSettings = {}, + openDrawer = {}, addTokens = {}, + addBracket = {}, clearInput = {}, deleteTokens = {}, onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {}, onDelete = {}, ) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index 3018ea8a..a298bf95 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -19,7 +19,7 @@ package com.sadellie.unitto.feature.calculator import androidx.activity.compose.BackHandler -import androidx.compose.animation.Crossfade +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.gestures.AnchoredDraggableState @@ -66,10 +66,9 @@ import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowHeightSizeClass +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen -import com.sadellie.unitto.core.ui.common.MenuButton import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar -import com.sadellie.unitto.core.ui.common.SettingsButton import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.data.model.HistoryItem import com.sadellie.unitto.feature.calculator.components.CalculatorKeyboard @@ -83,24 +82,22 @@ import kotlin.math.roundToInt @Composable internal fun CalculatorRoute( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, - viewModel: CalculatorViewModel = hiltViewModel() + openDrawer: () -> Unit, + viewModel: CalculatorViewModel = hiltViewModel(), ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle() CalculatorScreen( uiState = uiState.value, - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings, + openDrawer = openDrawer, addTokens = viewModel::addTokens, + addBracket = viewModel::addBracket, clearInput = viewModel::clearInput, deleteTokens = viewModel::deleteTokens, onValueChange = viewModel::updateInput, toggleCalculatorMode = viewModel::updateRadianMode, equal = viewModel::equal, clearHistory = viewModel::clearHistory, - addBracket = viewModel::addBracket, onDelete = viewModel::deleteHistoryItem, ) } @@ -108,8 +105,7 @@ internal fun CalculatorRoute( @Composable internal fun CalculatorScreen( uiState: CalculatorUIState, - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, addTokens: (String) -> Unit, addBracket: () -> Unit, clearInput: () -> Unit, @@ -124,16 +120,15 @@ internal fun CalculatorScreen( is CalculatorUIState.Loading -> EmptyScreen() is CalculatorUIState.Ready -> Ready( uiState = uiState, - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings, + openDrawer = openDrawer, addSymbol = addTokens, + addBracket = addBracket, clearSymbols = clearInput, deleteSymbol = deleteTokens, onValueChange = onValueChange, toggleAngleMode = { toggleCalculatorMode(!uiState.radianMode) }, equal = equal, clearHistory = clearHistory, - addBracket = addBracket, onDelete = onDelete, ) } @@ -142,8 +137,7 @@ internal fun CalculatorScreen( @Composable private fun Ready( uiState: CalculatorUIState.Ready, - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, addSymbol: (String) -> Unit, addBracket: () -> Unit, clearSymbols: () -> Unit, @@ -167,25 +161,21 @@ private fun Ready( val isOpen = dragState.currentValue == DragState.OPEN ScaffoldWithTopBar( - title = { Text(stringResource(R.string.calculator_title)) }, - navigationIcon = { MenuButton { navigateToMenu() } }, + title = {}, + navigationIcon = { DrawerButton { openDrawer() } }, colors = TopAppBarDefaults.topAppBarColors(MaterialTheme.colorScheme.surfaceVariant), actions = { - Crossfade(isOpen, label = "Clear button reveal") { - if (it) { - IconButton( - onClick = { showClearHistoryDialog = true }, - content = { - Icon( - Icons.Default.Delete, - stringResource(R.string.clear_history_label) - ) - }, - modifier = Modifier.semantics { testTag = "historyButton" } - ) - } else { - SettingsButton(navigateToSettings) - } + AnimatedVisibility(isOpen, label = "Clear button reveal") { + IconButton( + onClick = { showClearHistoryDialog = true }, + content = { + Icon( + Icons.Default.Delete, + stringResource(R.string.clear_history_label) + ) + }, + modifier = Modifier.semantics { testTag = "historyButton" } + ) } } ) { paddingValues -> @@ -371,16 +361,15 @@ private fun PreviewCalculatorScreen() { acButton = true, partialHistoryView = true ), - navigateToMenu = {}, - navigateToSettings = {}, + openDrawer = {}, addTokens = {}, + addBracket = {}, clearInput = {}, deleteTokens = {}, onValueChange = {}, toggleCalculatorMode = {}, equal = {}, clearHistory = {}, - addBracket = {}, onDelete = {}, ) } \ No newline at end of file diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt index b3d62764..0cfeac6c 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt @@ -30,7 +30,6 @@ private val start = DrawerItem.Calculator.start fun NavGraphBuilder.calculatorGraph( openDrawer: () -> Unit, - navigateToSettings: () -> Unit ) { unittoNavigation( startDestination = start, @@ -41,8 +40,7 @@ fun NavGraphBuilder.calculatorGraph( ) { unittoComposable(start) { CalculatorRoute( - navigateToMenu = openDrawer, - navigateToSettings = navigateToSettings + openDrawer = openDrawer, ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index 7291f8d4..b57f6660 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -75,11 +75,10 @@ import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.LocalLocale import com.sadellie.unitto.core.ui.common.ColumnWithConstraints +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen -import com.sadellie.unitto.core.ui.common.MenuButton import com.sadellie.unitto.core.ui.common.PortraitLandscape import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar -import com.sadellie.unitto.core.ui.common.SettingsButton import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.NumberBaseTextField @@ -99,8 +98,7 @@ internal fun ConverterRoute( viewModel: ConverterViewModel = hiltViewModel(), navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, ) { val uiState = viewModel.converterUiState.collectAsStateWithLifecycle() @@ -108,8 +106,7 @@ internal fun ConverterRoute( uiState = uiState.value, navigateToLeftScreen = navigateToLeftScreen, navigateToRightScreen = navigateToRightScreen, - navigateToSettings = navigateToSettings, - navigateToMenu = navigateToMenu, + openDrawer = openDrawer, swapUnits = viewModel::swapUnits, processInput = viewModel::addTokens, deleteDigit = viewModel::deleteTokens, @@ -126,8 +123,7 @@ private fun ConverterScreen( uiState: UnitConverterUIState, navigateToLeftScreen: (uiState: UnitConverterUIState) -> Unit, navigateToRightScreen: (uiState: UnitConverterUIState) -> Unit, - navigateToSettings: () -> Unit, - navigateToMenu: () -> Unit, + openDrawer: () -> Unit, swapUnits: () -> Unit, processInput: (String) -> Unit, deleteDigit: () -> Unit, @@ -142,8 +138,7 @@ private fun ConverterScreen( is UnitConverterUIState.NumberBase -> { UnitConverterTopBar( - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings + openDrawer = openDrawer, ) { NumberBase( modifier = Modifier.padding(it), @@ -161,8 +156,7 @@ private fun ConverterScreen( is UnitConverterUIState.Default -> { UnitConverterTopBar( - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings + openDrawer = openDrawer, ) { Default( modifier = Modifier.padding(it), @@ -185,16 +179,12 @@ private fun ConverterScreen( @Composable private fun UnitConverterTopBar( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, content: @Composable (PaddingValues) -> Unit ) { ScaffoldWithTopBar( - title = { Text(stringResource(R.string.unit_converter_title)) }, - navigationIcon = { MenuButton { navigateToMenu() } }, - actions = { - SettingsButton(navigateToSettings) - }, + title = {}, + navigationIcon = { DrawerButton { openDrawer() } }, colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = Color.Transparent), content = { content(it) } ) @@ -584,8 +574,7 @@ private fun PreviewConverterScreen() { uiState = UnitConverterUIState.Loading, navigateToLeftScreen = {}, navigateToRightScreen = {}, - navigateToSettings = {}, - navigateToMenu = {}, + openDrawer = {}, swapUnits = {}, processInput = {}, deleteDigit = {}, @@ -593,6 +582,6 @@ private fun PreviewConverterScreen() { onValueChange = {}, onFocusOnInput2 = {}, onErrorClick = {}, - addBracket = {} + addBracket = {}, ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt index 288f0bb0..fe8a3c85 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt @@ -62,7 +62,6 @@ private fun NavHostController.navigateRight( fun NavGraphBuilder.converterGraph( openDrawer: () -> Unit, navController: NavHostController, - navigateToSettings: () -> Unit, navigateToUnitGroups: () -> Unit, ) { unittoNavigation( @@ -127,8 +126,7 @@ fun NavGraphBuilder.converterGraph( UnitConverterUIState.Loading -> Unit } }, - navigateToSettings = navigateToSettings, - navigateToMenu = openDrawer + openDrawer = openDrawer, ) } 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 d9d84fa7..0f089140 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 @@ -35,8 +35,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.MenuButton -import com.sadellie.unitto.core.ui.common.SettingsButton +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.feature.datecalculator.addsubtract.AddSubtractPage import com.sadellie.unitto.feature.datecalculator.difference.DateDifferencePage @@ -44,19 +43,16 @@ import kotlinx.coroutines.launch @Composable internal fun DateCalculatorRoute( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, ) { DateCalculatorScreen( - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings, + openDrawer = openDrawer, ) } @Composable internal fun DateCalculatorScreen( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, ) { val addSubtractLabel = "${stringResource(R.string.date_calculator_add)}/${stringResource(R.string.date_calculator_subtract)}" val differenceLabel = stringResource(R.string.date_calculator_difference) @@ -69,8 +65,7 @@ internal fun DateCalculatorScreen( ScaffoldWithTopBar( modifier = Modifier, title = { Text(stringResource(R.string.date_calculator_title)) }, - navigationIcon = { MenuButton(navigateToMenu) }, - actions = { SettingsButton(navigateToSettings) }, + navigationIcon = { DrawerButton(openDrawer) }, ) { paddingValues -> Column( modifier = Modifier.padding(paddingValues), @@ -111,7 +106,6 @@ internal fun DateCalculatorScreen( @Composable private fun DateCalculatorScreenPreview() { DateCalculatorScreen( - navigateToMenu = {}, - navigateToSettings = {}, + openDrawer = {}, ) } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt index 767b8819..f1bc0ab6 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt @@ -29,8 +29,7 @@ private val graph = DrawerItem.DateCalculator.graph private val start = DrawerItem.DateCalculator.start fun NavGraphBuilder.dateCalculatorGraph( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit + openDrawer: () -> Unit, ) { unittoNavigation( startDestination = start, @@ -41,8 +40,7 @@ fun NavGraphBuilder.dateCalculatorGraph( ) { unittoComposable(start) { DateCalculatorRoute( - navigateToMenu = navigateToMenu, - navigateToSettings = navigateToSettings + openDrawer = openDrawer, ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt index af3f9665..2a000fd7 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt @@ -75,10 +75,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.BuildConfig import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.core.ui.LocalWindowSize +import com.sadellie.unitto.core.ui.WindowWidthSizeClass import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.Header import com.sadellie.unitto.core.ui.common.ListItem -import com.sadellie.unitto.core.ui.common.NavigateUpButton +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.core.ui.showToast @@ -97,7 +99,7 @@ import java.time.format.DateTimeFormatter @Composable internal fun SettingsRoute( viewModel: SettingsViewModel = hiltViewModel(), - navigateUp: () -> Unit, + openDrawer: () -> Unit, navControllerAction: (String) -> Unit, ) { val mContext = LocalContext.current @@ -115,7 +117,7 @@ internal fun SettingsRoute( is SettingsUIState.Ready -> SettingsScreen( uiState = uiState, - navigateUp = navigateUp, + openDrawer = openDrawer, navControllerAction = navControllerAction, updateLastReadChangelog = viewModel::updateLastReadChangelog, updateVibrations = viewModel::updateVibrations, @@ -129,7 +131,7 @@ internal fun SettingsRoute( @Composable private fun SettingsScreen( uiState: SettingsUIState.Ready, - navigateUp: () -> Unit, + openDrawer: () -> Unit, navControllerAction: (String) -> Unit, updateLastReadChangelog: (String) -> Unit, updateVibrations: (Boolean) -> Unit, @@ -158,7 +160,11 @@ private fun SettingsScreen( ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_title), - navigationIcon = { NavigateUpButton(navigateUp) }, + navigationIcon = { + if (LocalWindowSize.current.widthSizeClass != WindowWidthSizeClass.Expanded) { + DrawerButton(openDrawer) + } + }, actions = { IconButton( onClick = { showMenu = !showMenu }, @@ -336,7 +342,7 @@ private fun PreviewSettingsScreen() { SettingsScreen( uiState = uiState, - navigateUp = {}, + openDrawer = {}, navControllerAction = {}, updateLastReadChangelog = { uiState = uiState.copy(showUpdateChangelog = false) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt index 2d979b94..b620ae10 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt @@ -51,17 +51,14 @@ internal const val calculatorSettingsRoute = "calculator_settings_route" internal const val converterSettingsRoute = "converter_settings_route" internal const val bouncingEmoji = "bouncing_emoji_route" -fun NavController.navigateToSettings() { - navigate(DrawerItem.Settings.start) -} - fun NavController.navigateToUnitGroups() { navigate(unitsGroupRoute) } fun NavGraphBuilder.settingGraph( - themmoController: ThemmoController, + openDrawer: () -> Unit, navController: NavHostController, + themmoController: ThemmoController, ) { unittoNavigation( startDestination = start, @@ -72,7 +69,7 @@ fun NavGraphBuilder.settingGraph( ) { unittoStackedComposable(start) { SettingsRoute( - navigateUp = navController::navigateUp, + openDrawer = openDrawer, navControllerAction = navController::navigate ) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt index 60acd6c0..32e3d496 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt @@ -73,8 +73,7 @@ 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.common.MenuButton -import com.sadellie.unitto.core.ui.common.SettingsButton +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.core.ui.common.datetimepicker.TimePickerDialog @@ -94,8 +93,7 @@ import java.time.ZonedDateTime @Composable internal fun TimeZoneRoute( viewModel: TimeZoneViewModel = hiltViewModel(), - openMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, navigateToAddTimeZone: (ZonedDateTime) -> Unit, ) { when (val uiState = viewModel.uiState.collectAsStateWithLifecycle().value) { @@ -103,8 +101,7 @@ internal fun TimeZoneRoute( is TimeZoneUIState.Ready -> { TimeZoneScreen( uiState = uiState, - openMenu = openMenu, - navigateToSettings = navigateToSettings, + openDrawer = openDrawer, navigateToAddTimeZone = navigateToAddTimeZone, setCurrentTime = viewModel::setCurrentTime, setSelectedTime = viewModel::setSelectedTime, @@ -122,8 +119,7 @@ internal fun TimeZoneRoute( @Composable private fun TimeZoneScreen( uiState: TimeZoneUIState.Ready, - openMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, navigateToAddTimeZone: (ZonedDateTime) -> Unit, setCurrentTime: () -> Unit, setSelectedTime: (ZonedDateTime) -> Unit, @@ -179,8 +175,7 @@ private fun TimeZoneScreen( ScaffoldWithTopBar( title = { Text(stringResource(R.string.time_zone_title)) }, - navigationIcon = { MenuButton(openMenu) }, - actions = { SettingsButton(navigateToSettings) }, + navigationIcon = { DrawerButton(openDrawer) }, floatingActionButton = { LargeFloatingActionButton( onClick = { @@ -366,8 +361,7 @@ fun PreviewTimeZoneScreen() { selectedTimeZone = null, dialogState = TimeZoneDialogState.Nothing ), - openMenu = {}, - navigateToSettings = {}, + openDrawer = {}, navigateToAddTimeZone = {}, setCurrentTime = {}, setSelectedTime = {}, @@ -375,6 +369,6 @@ fun PreviewTimeZoneScreen() { delete = {}, updateLabel = { _, _ -> }, selectTimeZone = {}, - setDialogState = {} + setDialogState = {}, ) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt index fb2c6c53..ff2a8dcf 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt @@ -50,8 +50,7 @@ private fun NavController.navigateToAddTimeZone( } fun NavGraphBuilder.timeZoneGraph( - navigateToMenu: () -> Unit, - navigateToSettings: () -> Unit, + openDrawer: () -> Unit, navController: NavHostController, ) { unittoNavigation( @@ -68,8 +67,7 @@ fun NavGraphBuilder.timeZoneGraph( } TimeZoneRoute( - openMenu = navigateToMenu, - navigateToSettings = navigateToSettings, + openDrawer = openDrawer, navigateToAddTimeZone = navController::navigateToAddTimeZone ) } From 5a7fd41cf59296639252de654cf250e3587c9774 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sat, 10 Feb 2024 17:12:33 +0300 Subject: [PATCH 15/46] Red Salsa (Preview 1) --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e9a3d6f7..7def97b7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -versionCode = "36" -versionName = "Quick Silver" +versionCode = "37" +versionName = "Red Salsa" androidxBrowserBrowser = "1.7.0" androidGradlePlugin = "8.2.1" From ebb5fc52e0d3563866910912d7052fa2e99fc57f Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Sun, 11 Feb 2024 22:58:26 +0300 Subject: [PATCH 16/46] Fix factorial of 0 closes #186 --- .../main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt | 2 ++ .../java/io/github/sadellie/evaluatto/ExpressionSimpleTest.kt | 3 +++ 2 files changed, 5 insertions(+) diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt index c0553397..6da0b407 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt @@ -93,6 +93,8 @@ internal fun BigDecimal.factorial(): BigDecimal { if (this < BigDecimal.ZERO) throw ExpressionException.FactorialCalculation() if (this > maxFactorial) throw ExpressionException.TooBig() + if (this.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ONE + var expr = this for (i in 1 until this.toInt()) { expr *= BigDecimal(i) diff --git a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/ExpressionSimpleTest.kt b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/ExpressionSimpleTest.kt index e394f36b..03419438 100644 --- a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/ExpressionSimpleTest.kt +++ b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/ExpressionSimpleTest.kt @@ -108,4 +108,7 @@ class ExpressionSimpleTest { @Test fun expression28() = assertExpr("e", "2.7182818285") + + @Test + fun expression29() = assertExpr("0!", "1") } From 224ddd8bada0ab2feac4c9a8e2354ed541d83702 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 12 Feb 2024 22:10:01 +0300 Subject: [PATCH 17/46] Use strings for BigDecimals --- .../converter/collections/Acceleration.kt | 44 ++++++------- .../data/converter/collections/Angle.kt | 14 ++-- .../unitto/data/converter/collections/Area.kt | 30 ++++----- .../unitto/data/converter/collections/Data.kt | 42 ++++++------ .../converter/collections/DataTransfer.kt | 42 ++++++------ .../collections/ElectrostaticCapacitance.kt | 26 ++++---- .../data/converter/collections/Energy.kt | 28 ++++---- .../data/converter/collections/FlowRate.kt | 44 ++++++------- .../unitto/data/converter/collections/Flux.kt | 16 ++--- .../data/converter/collections/Force.kt | 32 ++++----- .../converter/collections/FuelConsumption.kt | 20 +++--- .../data/converter/collections/Length.kt | 52 +++++++-------- .../data/converter/collections/Luminance.kt | 40 +++++------ .../unitto/data/converter/collections/Mass.kt | 42 ++++++------ .../data/converter/collections/NumberBase.kt | 32 ++++----- .../data/converter/collections/Power.kt | 12 ++-- .../data/converter/collections/Prefix.kt | 52 +++++++-------- .../data/converter/collections/Pressure.kt | 60 ++++++++--------- .../data/converter/collections/Speed.kt | 66 +++++++++---------- .../data/converter/collections/Temperature.kt | 30 ++++----- .../unitto/data/converter/collections/Time.kt | 22 +++---- .../data/converter/collections/Torque.kt | 36 +++++----- .../data/converter/collections/Volume.kt | 50 +++++++------- .../converter/UnitFromSelectorScreen.kt | 14 ++-- .../feature/converter/UnitToSelectorScreen.kt | 14 ++-- .../feature/converter/components/UnitsList.kt | 14 ++-- .../converter/ConverterUIStateKtTest.kt | 20 +++--- 27 files changed, 447 insertions(+), 447 deletions(-) diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Acceleration.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Acceleration.kt index 550b3e23..0b79419a 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Acceleration.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Acceleration.kt @@ -27,27 +27,27 @@ import java.math.BigDecimal internal val accelerationCollection: List by lazy { listOf( - NormalUnit(UnitID.attometer_per_square_second, BigDecimal.valueOf(1), UnitGroup.ACCELERATION, R.string.unit_attometer_per_square_second, R.string.unit_attometer_per_square_second_short), - NormalUnit(UnitID.femtometer_per_square_second, BigDecimal.valueOf(1E+3), UnitGroup.ACCELERATION, R.string.unit_femtometer_per_square_second, R.string.unit_femtometer_per_square_second_short), - NormalUnit(UnitID.picometer_per_square_second, BigDecimal.valueOf(1E+6), UnitGroup.ACCELERATION, R.string.unit_picometer_per_square_second, R.string.unit_picometer_per_square_second_short), - NormalUnit(UnitID.nanometer_per_square_second, BigDecimal.valueOf(1E+9), UnitGroup.ACCELERATION, R.string.unit_nanometer_per_square_second, R.string.unit_nanometer_per_square_second_short), - NormalUnit(UnitID.micrometer_per_square_second, BigDecimal.valueOf(1E+12), UnitGroup.ACCELERATION, R.string.unit_micrometer_per_square_second, R.string.unit_micrometer_per_square_second_short), - NormalUnit(UnitID.millimeter_per_square_second, BigDecimal.valueOf(1E+15), UnitGroup.ACCELERATION, R.string.unit_millimeter_per_square_second, R.string.unit_millimeter_per_square_second_short), - NormalUnit(UnitID.centimeter_per_square_second, BigDecimal.valueOf(1E+16), UnitGroup.ACCELERATION, R.string.unit_centimeter_per_square_second, R.string.unit_centimeter_per_square_second_short), - NormalUnit(UnitID.decimeter_per_square_second, BigDecimal.valueOf(1E+17), UnitGroup.ACCELERATION, R.string.unit_decimeter_per_square_second, R.string.unit_decimeter_per_square_second_short), - NormalUnit(UnitID.meter_per_square_second, BigDecimal.valueOf(1E+18), UnitGroup.ACCELERATION, R.string.unit_meter_per_square_second, R.string.unit_meter_per_square_second_short), - NormalUnit(UnitID.kilometer_per_square_second, BigDecimal.valueOf(1E+21), UnitGroup.ACCELERATION, R.string.unit_kilometer_per_square_second, R.string.unit_kilometer_per_square_second_short), - NormalUnit(UnitID.dekameter_per_square_second, BigDecimal.valueOf(1E+19), UnitGroup.ACCELERATION, R.string.unit_dekameter_per_square_second, R.string.unit_dekameter_per_square_second_short), - NormalUnit(UnitID.hectometer_per_square_second, BigDecimal.valueOf(1E+20), UnitGroup.ACCELERATION, R.string.unit_hectometer_per_square_second, R.string.unit_hectometer_per_square_second_short), - NormalUnit(UnitID.gal, BigDecimal.valueOf(1E+16), UnitGroup.ACCELERATION, R.string.unit_gal, R.string.unit_gal_short), - NormalUnit(UnitID.mercury_surface_gravity, BigDecimal.valueOf(3.7E+18), UnitGroup.ACCELERATION, R.string.unit_mercury_surface_gravity, R.string.unit_mercury_surface_gravity_short), - NormalUnit(UnitID.venus_surface_gravity, BigDecimal.valueOf(8.87E+18), UnitGroup.ACCELERATION, R.string.unit_venus_surface_gravity, R.string.unit_venus_surface_gravity_short), - NormalUnit(UnitID.earth_surface_gravity, BigDecimal.valueOf(9.80655E+18), UnitGroup.ACCELERATION, R.string.unit_earth_surface_gravity, R.string.unit_earth_surface_gravity_short), - NormalUnit(UnitID.mars_surface_gravity, BigDecimal.valueOf(3.71E+18), UnitGroup.ACCELERATION, R.string.unit_mars_surface_gravity, R.string.unit_mars_surface_gravity_short), - NormalUnit(UnitID.jupiter_surface_gravity, BigDecimal.valueOf(2.479E+19), UnitGroup.ACCELERATION, R.string.unit_jupiter_surface_gravity, R.string.unit_jupiter_surface_gravity_short), - NormalUnit(UnitID.saturn_surface_gravity, BigDecimal.valueOf(1.044E+19), UnitGroup.ACCELERATION, R.string.unit_saturn_surface_gravity, R.string.unit_saturn_surface_gravity_short), - NormalUnit(UnitID.uranus_surface_gravity, BigDecimal.valueOf(8.87E+18), UnitGroup.ACCELERATION, R.string.unit_uranus_surface_gravity, R.string.unit_uranus_surface_gravity_short), - NormalUnit(UnitID.neptune_surface_gravity, BigDecimal.valueOf(1.115E+19), UnitGroup.ACCELERATION, R.string.unit_neptune_surface_gravity, R.string.unit_neptune_surface_gravity_short), - NormalUnit(UnitID.sun_surface_gravity, BigDecimal.valueOf(2.74E+20), UnitGroup.ACCELERATION, R.string.unit_sun_surface_gravity, R.string.unit_sun_surface_gravity_short), + NormalUnit(UnitID.attometer_per_square_second, BigDecimal("1"), UnitGroup.ACCELERATION, R.string.unit_attometer_per_square_second, R.string.unit_attometer_per_square_second_short), + NormalUnit(UnitID.femtometer_per_square_second, BigDecimal("1000"), UnitGroup.ACCELERATION, R.string.unit_femtometer_per_square_second, R.string.unit_femtometer_per_square_second_short), + NormalUnit(UnitID.picometer_per_square_second, BigDecimal("1000000"), UnitGroup.ACCELERATION, R.string.unit_picometer_per_square_second, R.string.unit_picometer_per_square_second_short), + NormalUnit(UnitID.nanometer_per_square_second, BigDecimal("1000000000"), UnitGroup.ACCELERATION, R.string.unit_nanometer_per_square_second, R.string.unit_nanometer_per_square_second_short), + NormalUnit(UnitID.micrometer_per_square_second, BigDecimal("1000000000000"), UnitGroup.ACCELERATION, R.string.unit_micrometer_per_square_second, R.string.unit_micrometer_per_square_second_short), + NormalUnit(UnitID.millimeter_per_square_second, BigDecimal("1000000000000000"), UnitGroup.ACCELERATION, R.string.unit_millimeter_per_square_second, R.string.unit_millimeter_per_square_second_short), + NormalUnit(UnitID.centimeter_per_square_second, BigDecimal("10000000000000000"), UnitGroup.ACCELERATION, R.string.unit_centimeter_per_square_second, R.string.unit_centimeter_per_square_second_short), + NormalUnit(UnitID.decimeter_per_square_second, BigDecimal("100000000000000000"), UnitGroup.ACCELERATION, R.string.unit_decimeter_per_square_second, R.string.unit_decimeter_per_square_second_short), + NormalUnit(UnitID.meter_per_square_second, BigDecimal("1000000000000000000"), UnitGroup.ACCELERATION, R.string.unit_meter_per_square_second, R.string.unit_meter_per_square_second_short), + NormalUnit(UnitID.kilometer_per_square_second, BigDecimal("1000000000000000000000"), UnitGroup.ACCELERATION, R.string.unit_kilometer_per_square_second, R.string.unit_kilometer_per_square_second_short), + NormalUnit(UnitID.dekameter_per_square_second, BigDecimal("10000000000000000000"), UnitGroup.ACCELERATION, R.string.unit_dekameter_per_square_second, R.string.unit_dekameter_per_square_second_short), + NormalUnit(UnitID.hectometer_per_square_second, BigDecimal("100000000000000000000"), UnitGroup.ACCELERATION, R.string.unit_hectometer_per_square_second, R.string.unit_hectometer_per_square_second_short), + NormalUnit(UnitID.gal, BigDecimal("10000000000000000"), UnitGroup.ACCELERATION, R.string.unit_gal, R.string.unit_gal_short), + NormalUnit(UnitID.mercury_surface_gravity, BigDecimal("3700000000000000000"), UnitGroup.ACCELERATION, R.string.unit_mercury_surface_gravity, R.string.unit_mercury_surface_gravity_short), + NormalUnit(UnitID.venus_surface_gravity, BigDecimal("8870000000000000000"), UnitGroup.ACCELERATION, R.string.unit_venus_surface_gravity, R.string.unit_venus_surface_gravity_short), + NormalUnit(UnitID.earth_surface_gravity, BigDecimal("9806550000000000000"), UnitGroup.ACCELERATION, R.string.unit_earth_surface_gravity, R.string.unit_earth_surface_gravity_short), + NormalUnit(UnitID.mars_surface_gravity, BigDecimal("3710000000000000000"), UnitGroup.ACCELERATION, R.string.unit_mars_surface_gravity, R.string.unit_mars_surface_gravity_short), + NormalUnit(UnitID.jupiter_surface_gravity, BigDecimal("24790000000000000000"), UnitGroup.ACCELERATION, R.string.unit_jupiter_surface_gravity, R.string.unit_jupiter_surface_gravity_short), + NormalUnit(UnitID.saturn_surface_gravity, BigDecimal("10440000000000000000"), UnitGroup.ACCELERATION, R.string.unit_saturn_surface_gravity, R.string.unit_saturn_surface_gravity_short), + NormalUnit(UnitID.uranus_surface_gravity, BigDecimal("8870000000000000000"), UnitGroup.ACCELERATION, R.string.unit_uranus_surface_gravity, R.string.unit_uranus_surface_gravity_short), + NormalUnit(UnitID.neptune_surface_gravity, BigDecimal("11150000000000000000"), UnitGroup.ACCELERATION, R.string.unit_neptune_surface_gravity, R.string.unit_neptune_surface_gravity_short), + NormalUnit(UnitID.sun_surface_gravity, BigDecimal("274000000000000000000"), UnitGroup.ACCELERATION, R.string.unit_sun_surface_gravity, R.string.unit_sun_surface_gravity_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Angle.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Angle.kt index 1ab225c6..caa436ea 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Angle.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Angle.kt @@ -19,19 +19,19 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val angleCollection: List by lazy { listOf( - NormalUnit(UnitID.angle_second, BigDecimal.valueOf(1), UnitGroup.ANGLE, R.string.unit_angle_second, R.string.unit_angle_second_short), - NormalUnit(UnitID.angle_minute, BigDecimal.valueOf(60), UnitGroup.ANGLE, R.string.unit_angle_minute, R.string.unit_angle_minute_short), - NormalUnit(UnitID.degree, BigDecimal.valueOf(3600), UnitGroup.ANGLE, R.string.unit_degree, R.string.unit_degree_short), - NormalUnit(UnitID.radian, BigDecimal.valueOf(206264.8062471), UnitGroup.ANGLE, R.string.unit_radian, R.string.unit_radian_short), - NormalUnit(UnitID.sextant, BigDecimal.valueOf(216000), UnitGroup.ANGLE, R.string.unit_sextant, R.string.unit_sextant_short), - NormalUnit(UnitID.turn, BigDecimal.valueOf(1296000), UnitGroup.ANGLE, R.string.unit_turn, R.string.unit_turn_short), + NormalUnit(UnitID.angle_second, BigDecimal("1"), UnitGroup.ANGLE, R.string.unit_angle_second, R.string.unit_angle_second_short), + NormalUnit(UnitID.angle_minute, BigDecimal("60"), UnitGroup.ANGLE, R.string.unit_angle_minute, R.string.unit_angle_minute_short), + NormalUnit(UnitID.degree, BigDecimal("3600"), UnitGroup.ANGLE, R.string.unit_degree, R.string.unit_degree_short), + NormalUnit(UnitID.radian, BigDecimal("206264.8062471"), UnitGroup.ANGLE, R.string.unit_radian, R.string.unit_radian_short), + NormalUnit(UnitID.sextant, BigDecimal("216000"), UnitGroup.ANGLE, R.string.unit_sextant, R.string.unit_sextant_short), + NormalUnit(UnitID.turn, BigDecimal("1296000"), UnitGroup.ANGLE, R.string.unit_turn, R.string.unit_turn_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Area.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Area.kt index 998e7c91..19aee8df 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Area.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Area.kt @@ -19,27 +19,27 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val areaCollection: List by lazy { listOf( - NormalUnit(UnitID.cent, BigDecimal.valueOf(6.083246572E+33), UnitGroup.AREA, R.string.unit_cent, R.string.unit_cent_short), - NormalUnit(UnitID.acre, BigDecimal.valueOf(6.083246572E+31), UnitGroup.AREA, R.string.unit_acre, R.string.unit_acre_short), - NormalUnit(UnitID.hectare, BigDecimal.valueOf(1.503202964E+32), UnitGroup.AREA, R.string.unit_hectare, R.string.unit_hectare_short ), - NormalUnit(UnitID.square_foot, BigDecimal.valueOf(1.396521251E+27), UnitGroup.AREA, R.string.unit_square_foot, R.string.unit_square_foot_short), - NormalUnit(UnitID.square_mile, BigDecimal.valueOf(3.893277806E+34), UnitGroup.AREA, R.string.unit_square_mile, R.string.unit_square_mile_short), - NormalUnit(UnitID.square_yard, BigDecimal.valueOf(1.256869126E+28), UnitGroup.AREA, R.string.unit_square_yard, R.string.unit_square_yard_short), - NormalUnit(UnitID.square_inch, BigDecimal.valueOf(9.698064247E+24), UnitGroup.AREA, R.string.unit_square_inch, R.string.unit_square_inch_short), - NormalUnit(UnitID.square_micrometer, BigDecimal.valueOf(1.503202964E+16), UnitGroup.AREA, R.string.unit_square_micrometer, R.string.unit_square_micrometer_short), - NormalUnit(UnitID.square_millimeter, BigDecimal.valueOf(1.503202964E+22), UnitGroup.AREA, R.string.unit_square_millimeter, R.string.unit_square_millimeter_short), - NormalUnit(UnitID.square_centimeter, BigDecimal.valueOf(1.503202964E+24), UnitGroup.AREA, R.string.unit_square_centimeter, R.string.unit_square_centimeter_short), - NormalUnit(UnitID.square_decimeter, BigDecimal.valueOf(1.503202964E+26), UnitGroup.AREA, R.string.unit_square_decimeter, R.string.unit_square_decimeter_short), - NormalUnit(UnitID.square_meter, BigDecimal.valueOf(1.503202964E+28), UnitGroup.AREA, R.string.unit_square_meter, R.string.unit_square_meter_short), - NormalUnit(UnitID.square_kilometer, BigDecimal.valueOf(1.503202964E+34), UnitGroup.AREA, R.string.unit_square_kilometer, R.string.unit_square_kilometer_short), - NormalUnit(UnitID.electron_cross_section, BigDecimal.valueOf(1.0), UnitGroup.AREA, R.string.unit_electron_cross_section, R.string.unit_electron_cross_section_short), + NormalUnit(UnitID.cent, BigDecimal("6083246572000000000000000000000000"), UnitGroup.AREA, R.string.unit_cent, R.string.unit_cent_short), + NormalUnit(UnitID.acre, BigDecimal("60832465720000000000000000000000"), UnitGroup.AREA, R.string.unit_acre, R.string.unit_acre_short), + NormalUnit(UnitID.hectare, BigDecimal("150320296400000000000000000000000"), UnitGroup.AREA, R.string.unit_hectare, R.string.unit_hectare_short ), + NormalUnit(UnitID.square_foot, BigDecimal("1396521251000000000000000000"), UnitGroup.AREA, R.string.unit_square_foot, R.string.unit_square_foot_short), + NormalUnit(UnitID.square_mile, BigDecimal("38932778060000000000000000000000000"), UnitGroup.AREA, R.string.unit_square_mile, R.string.unit_square_mile_short), + NormalUnit(UnitID.square_yard, BigDecimal("12568691260000000000000000000"), UnitGroup.AREA, R.string.unit_square_yard, R.string.unit_square_yard_short), + NormalUnit(UnitID.square_inch, BigDecimal("9698064247000000000000000"), UnitGroup.AREA, R.string.unit_square_inch, R.string.unit_square_inch_short), + NormalUnit(UnitID.square_micrometer, BigDecimal("15032029640000000"), UnitGroup.AREA, R.string.unit_square_micrometer, R.string.unit_square_micrometer_short), + NormalUnit(UnitID.square_millimeter, BigDecimal("15032029640000000000000"), UnitGroup.AREA, R.string.unit_square_millimeter, R.string.unit_square_millimeter_short), + NormalUnit(UnitID.square_centimeter, BigDecimal("1503202964000000000000000"), UnitGroup.AREA, R.string.unit_square_centimeter, R.string.unit_square_centimeter_short), + NormalUnit(UnitID.square_decimeter, BigDecimal("150320296400000000000000000"), UnitGroup.AREA, R.string.unit_square_decimeter, R.string.unit_square_decimeter_short), + NormalUnit(UnitID.square_meter, BigDecimal("15032029640000000000000000000"), UnitGroup.AREA, R.string.unit_square_meter, R.string.unit_square_meter_short), + NormalUnit(UnitID.square_kilometer, BigDecimal("15032029640000000000000000000000000"), UnitGroup.AREA, R.string.unit_square_kilometer, R.string.unit_square_kilometer_short), + NormalUnit(UnitID.electron_cross_section, BigDecimal("1"), UnitGroup.AREA, R.string.unit_electron_cross_section, R.string.unit_electron_cross_section_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Data.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Data.kt index 6a34e733..109901b9 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Data.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Data.kt @@ -19,33 +19,33 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val dataCollection: List by lazy { listOf( - NormalUnit(UnitID.bit, BigDecimal.valueOf(1), UnitGroup.DATA, R.string.unit_bit, R.string.unit_bit_short), - NormalUnit(UnitID.kibibit, BigDecimal.valueOf(1_024), UnitGroup.DATA, R.string.unit_kibibit, R.string.unit_kibibit_short), - NormalUnit(UnitID.kilobit, BigDecimal.valueOf(1_000), UnitGroup.DATA, R.string.unit_kilobit, R.string.unit_kilobit_short), - NormalUnit(UnitID.megabit, BigDecimal.valueOf(1_000_000), UnitGroup.DATA, R.string.unit_megabit, R.string.unit_megabit_short), - NormalUnit(UnitID.mebibit, BigDecimal.valueOf(1_048_576), UnitGroup.DATA, R.string.unit_mebibit, R.string.unit_mebibit_short), - NormalUnit(UnitID.gigabit, BigDecimal.valueOf(1_000_000_000), UnitGroup.DATA, R.string.unit_gigabit, R.string.unit_gigabit_short), - NormalUnit(UnitID.gibibit, BigDecimal.valueOf(1_073_741_824), UnitGroup.DATA, R.string.unit_gibibit, R.string.unit_gibibit_short), - NormalUnit(UnitID.terabit, BigDecimal.valueOf(1_000_000_000_000), UnitGroup.DATA, R.string.unit_terabit, R.string.unit_terabit_short), - NormalUnit(UnitID.petabit, BigDecimal.valueOf(1_000_000_000_000_000), UnitGroup.DATA, R.string.unit_petabit, R.string.unit_petabit_short), - NormalUnit(UnitID.exabit, BigDecimal.valueOf(1_000_000_000_000_000_000), UnitGroup.DATA, R.string.unit_exabit, R.string.unit_exabit_short), - NormalUnit(UnitID.byte, BigDecimal.valueOf(8), UnitGroup.DATA, R.string.unit_byte, R.string.unit_byte_short), - NormalUnit(UnitID.kibibyte, BigDecimal.valueOf(8_192), UnitGroup.DATA, R.string.unit_kibibyte, R.string.unit_kibibyte_short), - NormalUnit(UnitID.kilobyte, BigDecimal.valueOf(8_000), UnitGroup.DATA, R.string.unit_kilobyte, R.string.unit_kilobyte_short), - NormalUnit(UnitID.megabyte, BigDecimal.valueOf(8_000_000), UnitGroup.DATA, R.string.unit_megabyte, R.string.unit_megabyte_short), - NormalUnit(UnitID.mebibyte, BigDecimal.valueOf(8_388_608), UnitGroup.DATA, R.string.unit_mebibyte, R.string.unit_mebibyte_short), - NormalUnit(UnitID.gigabyte, BigDecimal.valueOf(8_000_000_000), UnitGroup.DATA, R.string.unit_gigabyte, R.string.unit_gigabyte_short), - NormalUnit(UnitID.gibibyte, BigDecimal.valueOf(8_589_934_592), UnitGroup.DATA, R.string.unit_gibibyte, R.string.unit_gibibyte_short), - NormalUnit(UnitID.terabyte, BigDecimal.valueOf(8_000_000_000_000), UnitGroup.DATA, R.string.unit_terabyte, R.string.unit_terabyte_short), - NormalUnit(UnitID.petabyte, BigDecimal.valueOf(8_000_000_000_000_000), UnitGroup.DATA, R.string.unit_petabyte, R.string.unit_petabyte_short), - NormalUnit(UnitID.exabyte, BigDecimal.valueOf(8_000_000_000_000_000_000), UnitGroup.DATA, R.string.unit_exabyte, R.string.unit_exabyte_short), + NormalUnit(UnitID.bit, BigDecimal("1"), UnitGroup.DATA, R.string.unit_bit, R.string.unit_bit_short), + NormalUnit(UnitID.kibibit, BigDecimal("1024"), UnitGroup.DATA, R.string.unit_kibibit, R.string.unit_kibibit_short), + NormalUnit(UnitID.kilobit, BigDecimal("1000"), UnitGroup.DATA, R.string.unit_kilobit, R.string.unit_kilobit_short), + NormalUnit(UnitID.megabit, BigDecimal("1000000"), UnitGroup.DATA, R.string.unit_megabit, R.string.unit_megabit_short), + NormalUnit(UnitID.mebibit, BigDecimal("1048576"), UnitGroup.DATA, R.string.unit_mebibit, R.string.unit_mebibit_short), + NormalUnit(UnitID.gigabit, BigDecimal("1000000000"), UnitGroup.DATA, R.string.unit_gigabit, R.string.unit_gigabit_short), + NormalUnit(UnitID.gibibit, BigDecimal("1073741824"), UnitGroup.DATA, R.string.unit_gibibit, R.string.unit_gibibit_short), + NormalUnit(UnitID.terabit, BigDecimal("1000000000000"), UnitGroup.DATA, R.string.unit_terabit, R.string.unit_terabit_short), + NormalUnit(UnitID.petabit, BigDecimal("1000000000000000"), UnitGroup.DATA, R.string.unit_petabit, R.string.unit_petabit_short), + NormalUnit(UnitID.exabit, BigDecimal("1000000000000000000"), UnitGroup.DATA, R.string.unit_exabit, R.string.unit_exabit_short), + NormalUnit(UnitID.byte, BigDecimal("8"), UnitGroup.DATA, R.string.unit_byte, R.string.unit_byte_short), + NormalUnit(UnitID.kibibyte, BigDecimal("8192"), UnitGroup.DATA, R.string.unit_kibibyte, R.string.unit_kibibyte_short), + NormalUnit(UnitID.kilobyte, BigDecimal("8000"), UnitGroup.DATA, R.string.unit_kilobyte, R.string.unit_kilobyte_short), + NormalUnit(UnitID.megabyte, BigDecimal("8000000"), UnitGroup.DATA, R.string.unit_megabyte, R.string.unit_megabyte_short), + NormalUnit(UnitID.mebibyte, BigDecimal("8388608"), UnitGroup.DATA, R.string.unit_mebibyte, R.string.unit_mebibyte_short), + NormalUnit(UnitID.gigabyte, BigDecimal("8000000000"), UnitGroup.DATA, R.string.unit_gigabyte, R.string.unit_gigabyte_short), + NormalUnit(UnitID.gibibyte, BigDecimal("8589934592"), UnitGroup.DATA, R.string.unit_gibibyte, R.string.unit_gibibyte_short), + NormalUnit(UnitID.terabyte, BigDecimal("8000000000000"), UnitGroup.DATA, R.string.unit_terabyte, R.string.unit_terabyte_short), + NormalUnit(UnitID.petabyte, BigDecimal("8000000000000000"), UnitGroup.DATA, R.string.unit_petabyte, R.string.unit_petabyte_short), + NormalUnit(UnitID.exabyte, BigDecimal("8000000000000000000"), UnitGroup.DATA, R.string.unit_exabyte, R.string.unit_exabyte_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/DataTransfer.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/DataTransfer.kt index 87ee983f..8b2cb3ff 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/DataTransfer.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/DataTransfer.kt @@ -19,33 +19,33 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val dataTransferCollection: List by lazy { listOf( - NormalUnit(UnitID.bit_per_second, BigDecimal.valueOf(1), UnitGroup.DATA_TRANSFER, R.string.unit_bit_per_second, R.string.unit_bit_per_second_short), - NormalUnit(UnitID.kibibit_per_second, BigDecimal.valueOf(1_024), UnitGroup.DATA_TRANSFER, R.string.unit_kibibit_per_second, R.string.unit_kibibit_per_second_short), - NormalUnit(UnitID.kilobit_per_second, BigDecimal.valueOf(1_000), UnitGroup.DATA_TRANSFER, R.string.unit_kilobit_per_second, R.string.unit_kilobit_per_second_short), - NormalUnit(UnitID.megabit_per_second, BigDecimal.valueOf(1_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_megabit_per_second, R.string.unit_megabit_per_second_short), - NormalUnit(UnitID.mebibit_per_second, BigDecimal.valueOf(1_048_576), UnitGroup.DATA_TRANSFER, R.string.unit_mebibit_per_second, R.string.unit_mebibit_per_second_short), - NormalUnit(UnitID.gigabit_per_second, BigDecimal.valueOf(1_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_gigabit_per_second, R.string.unit_gigabit_per_second_short), - NormalUnit(UnitID.gibibit_per_second, BigDecimal.valueOf(1_073_741_824), UnitGroup.DATA_TRANSFER, R.string.unit_gibibit_per_second, R.string.unit_gibibit_per_second_short), - NormalUnit(UnitID.terabit_per_second, BigDecimal.valueOf(1_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_terabit_per_second, R.string.unit_terabit_per_second_short), - NormalUnit(UnitID.petabit_per_second, BigDecimal.valueOf(1_000_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_petabit_per_second, R.string.unit_petabit_per_second_short), - NormalUnit(UnitID.exabit_per_second, BigDecimal.valueOf(1_000_000_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_exabit_per_second, R.string.unit_exabit_per_second_short), - NormalUnit(UnitID.byte_per_second, BigDecimal.valueOf(8), UnitGroup.DATA_TRANSFER, R.string.unit_byte_per_second, R.string.unit_byte_per_second_short), - NormalUnit(UnitID.kibibyte_per_second, BigDecimal.valueOf(8_192), UnitGroup.DATA_TRANSFER, R.string.unit_kibibyte_per_second, R.string.unit_kibibyte_per_second_short), - NormalUnit(UnitID.kilobyte_per_second, BigDecimal.valueOf(8_000), UnitGroup.DATA_TRANSFER, R.string.unit_kilobyte_per_second, R.string.unit_kilobyte_per_second_short), - NormalUnit(UnitID.megabyte_per_second, BigDecimal.valueOf(8_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_megabyte_per_second, R.string.unit_megabyte_per_second_short), - NormalUnit(UnitID.mebibyte_per_second, BigDecimal.valueOf(8_388_608), UnitGroup.DATA_TRANSFER, R.string.unit_mebibyte_per_second, R.string.unit_mebibyte_per_second_short), - NormalUnit(UnitID.gigabyte_per_second, BigDecimal.valueOf(8_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_gigabyte_per_second, R.string.unit_gigabyte_per_second_short), - NormalUnit(UnitID.gibibyte_per_second, BigDecimal.valueOf(8_589_934_592), UnitGroup.DATA_TRANSFER, R.string.unit_gibibyte_per_second, R.string.unit_gibibyte_per_second_short), - NormalUnit(UnitID.terabyte_per_second, BigDecimal.valueOf(8_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_terabyte_per_second, R.string.unit_terabyte_per_second_short), - NormalUnit(UnitID.petabyte_per_second, BigDecimal.valueOf(8_000_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_petabyte_per_second, R.string.unit_petabyte_per_second_short), - NormalUnit(UnitID.exabyte_per_second, BigDecimal.valueOf(8_000_000_000_000_000_000), UnitGroup.DATA_TRANSFER, R.string.unit_exabyte_per_second, R.string.unit_exabyte_per_second_short), + NormalUnit(UnitID.bit_per_second, BigDecimal("1"), UnitGroup.DATA_TRANSFER, R.string.unit_bit_per_second, R.string.unit_bit_per_second_short), + NormalUnit(UnitID.kibibit_per_second, BigDecimal("1024"), UnitGroup.DATA_TRANSFER, R.string.unit_kibibit_per_second, R.string.unit_kibibit_per_second_short), + NormalUnit(UnitID.kilobit_per_second, BigDecimal("1000"), UnitGroup.DATA_TRANSFER, R.string.unit_kilobit_per_second, R.string.unit_kilobit_per_second_short), + NormalUnit(UnitID.megabit_per_second, BigDecimal("1000000"), UnitGroup.DATA_TRANSFER, R.string.unit_megabit_per_second, R.string.unit_megabit_per_second_short), + NormalUnit(UnitID.mebibit_per_second, BigDecimal("1048576"), UnitGroup.DATA_TRANSFER, R.string.unit_mebibit_per_second, R.string.unit_mebibit_per_second_short), + NormalUnit(UnitID.gigabit_per_second, BigDecimal("1000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_gigabit_per_second, R.string.unit_gigabit_per_second_short), + NormalUnit(UnitID.gibibit_per_second, BigDecimal("1073741824"), UnitGroup.DATA_TRANSFER, R.string.unit_gibibit_per_second, R.string.unit_gibibit_per_second_short), + NormalUnit(UnitID.terabit_per_second, BigDecimal("1000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_terabit_per_second, R.string.unit_terabit_per_second_short), + NormalUnit(UnitID.petabit_per_second, BigDecimal("1000000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_petabit_per_second, R.string.unit_petabit_per_second_short), + NormalUnit(UnitID.exabit_per_second, BigDecimal("1000000000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_exabit_per_second, R.string.unit_exabit_per_second_short), + NormalUnit(UnitID.byte_per_second, BigDecimal("8"), UnitGroup.DATA_TRANSFER, R.string.unit_byte_per_second, R.string.unit_byte_per_second_short), + NormalUnit(UnitID.kibibyte_per_second, BigDecimal("8192"), UnitGroup.DATA_TRANSFER, R.string.unit_kibibyte_per_second, R.string.unit_kibibyte_per_second_short), + NormalUnit(UnitID.kilobyte_per_second, BigDecimal("8000"), UnitGroup.DATA_TRANSFER, R.string.unit_kilobyte_per_second, R.string.unit_kilobyte_per_second_short), + NormalUnit(UnitID.megabyte_per_second, BigDecimal("8000000"), UnitGroup.DATA_TRANSFER, R.string.unit_megabyte_per_second, R.string.unit_megabyte_per_second_short), + NormalUnit(UnitID.mebibyte_per_second, BigDecimal("8388608"), UnitGroup.DATA_TRANSFER, R.string.unit_mebibyte_per_second, R.string.unit_mebibyte_per_second_short), + NormalUnit(UnitID.gigabyte_per_second, BigDecimal("8000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_gigabyte_per_second, R.string.unit_gigabyte_per_second_short), + NormalUnit(UnitID.gibibyte_per_second, BigDecimal("8589934592"), UnitGroup.DATA_TRANSFER, R.string.unit_gibibyte_per_second, R.string.unit_gibibyte_per_second_short), + NormalUnit(UnitID.terabyte_per_second, BigDecimal("8000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_terabyte_per_second, R.string.unit_terabyte_per_second_short), + NormalUnit(UnitID.petabyte_per_second, BigDecimal("8000000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_petabyte_per_second, R.string.unit_petabyte_per_second_short), + NormalUnit(UnitID.exabyte_per_second, BigDecimal("8000000000000000000"), UnitGroup.DATA_TRANSFER, R.string.unit_exabyte_per_second, R.string.unit_exabyte_per_second_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/ElectrostaticCapacitance.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/ElectrostaticCapacitance.kt index 2f1b3f9b..b977c1f5 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/ElectrostaticCapacitance.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/ElectrostaticCapacitance.kt @@ -19,25 +19,25 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val electrostaticCapacitance: List by lazy { listOf( - NormalUnit(UnitID.attofarad, BigDecimal.valueOf(1), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_attofarad, R.string.unit_attofarad_short), - NormalUnit(UnitID.picofarad, BigDecimal.valueOf(1E+6), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_picofarad, R.string.unit_picofarad_short), - NormalUnit(UnitID.statfarad, BigDecimal.valueOf(1112650.0561), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_statfarad, R.string.unit_statfarad_short), - NormalUnit(UnitID.nanofarad, BigDecimal.valueOf(1E+9), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_nanofarad, R.string.unit_nanofarad_short), - NormalUnit(UnitID.microfarad, BigDecimal.valueOf(1E+12), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_microfarad, R.string.unit_microfarad_short), - NormalUnit(UnitID.millifarad, BigDecimal.valueOf(1E+15), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_millifarad, R.string.unit_millifarad_short), - NormalUnit(UnitID.farad, BigDecimal.valueOf(1E+18), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_farad, R.string.unit_farad_short), - NormalUnit(UnitID.kilofarad, BigDecimal.valueOf(1E+21), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_kilofarad, R.string.unit_kilofarad_short), - NormalUnit(UnitID.megafarad, BigDecimal.valueOf(1E+24), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_megafarad, R.string.unit_megafarad_short), - NormalUnit(UnitID.gigafarad, BigDecimal.valueOf(1E+27), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_gigafarad, R.string.unit_gigafarad_short), - NormalUnit(UnitID.petafarad, BigDecimal.valueOf(1E+33), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_petafarad, R.string.unit_petafarad_short), - NormalUnit(UnitID.exafarad, BigDecimal.valueOf(1E+36), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_exafarad, R.string.unit_exafarad_short), + NormalUnit(UnitID.attofarad, BigDecimal("1"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_attofarad, R.string.unit_attofarad_short), + NormalUnit(UnitID.picofarad, BigDecimal("1000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_picofarad, R.string.unit_picofarad_short), + NormalUnit(UnitID.statfarad, BigDecimal("1112650.0561"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_statfarad, R.string.unit_statfarad_short), + NormalUnit(UnitID.nanofarad, BigDecimal("1000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_nanofarad, R.string.unit_nanofarad_short), + NormalUnit(UnitID.microfarad, BigDecimal("1000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_microfarad, R.string.unit_microfarad_short), + NormalUnit(UnitID.millifarad, BigDecimal("1000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_millifarad, R.string.unit_millifarad_short), + NormalUnit(UnitID.farad, BigDecimal("1000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_farad, R.string.unit_farad_short), + NormalUnit(UnitID.kilofarad, BigDecimal("1000000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_kilofarad, R.string.unit_kilofarad_short), + NormalUnit(UnitID.megafarad, BigDecimal("1000000000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_megafarad, R.string.unit_megafarad_short), + NormalUnit(UnitID.gigafarad, BigDecimal("1000000000000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_gigafarad, R.string.unit_gigafarad_short), + NormalUnit(UnitID.petafarad, BigDecimal("1000000000000000000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_petafarad, R.string.unit_petafarad_short), + NormalUnit(UnitID.exafarad, BigDecimal("1000000000000000000000000000000000000"), UnitGroup.ELECTROSTATIC_CAPACITANCE, R.string.unit_exafarad, R.string.unit_exafarad_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Energy.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Energy.kt index 8101c72c..cc928cd5 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Energy.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Energy.kt @@ -19,26 +19,26 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val energyCollection: List by lazy { listOf( - NormalUnit(UnitID.electron_volt, BigDecimal.valueOf(0.160217733), UnitGroup.ENERGY, R.string.unit_electron_volt, R.string.unit_electron_volt_short), - NormalUnit(UnitID.attojoule, BigDecimal.valueOf(1), UnitGroup.ENERGY, R.string.unit_attojoule, R.string.unit_attojoule_short), - NormalUnit(UnitID.joule, BigDecimal.valueOf(1E+18), UnitGroup.ENERGY, R.string.unit_joule, R.string.unit_joule_short), - NormalUnit(UnitID.kilojoule, BigDecimal.valueOf(1E+21), UnitGroup.ENERGY, R.string.unit_kilojoule, R.string.unit_kilojoule_short), - NormalUnit(UnitID.megajoule, BigDecimal.valueOf(1E+24), UnitGroup.ENERGY, R.string.unit_megajoule, R.string.unit_megajoule_short), - NormalUnit(UnitID.gigajoule, BigDecimal.valueOf(1E+27), UnitGroup.ENERGY, R.string.unit_gigajoule, R.string.unit_gigajoule_short), - NormalUnit(UnitID.energy_ton, BigDecimal.valueOf(4.184E+27), UnitGroup.ENERGY, R.string.unit_energy_ton, R.string.unit_energy_ton_short), - NormalUnit(UnitID.kiloton, BigDecimal.valueOf(4.184E+30), UnitGroup.ENERGY, R.string.unit_kiloton, R.string.unit_kiloton_short), - NormalUnit(UnitID.megaton, BigDecimal.valueOf(4.184E+33), UnitGroup.ENERGY, R.string.unit_megaton, R.string.unit_megaton_short), - NormalUnit(UnitID.gigaton, BigDecimal.valueOf(4.184E+36), UnitGroup.ENERGY, R.string.unit_gigaton, R.string.unit_gigaton_short), - NormalUnit(UnitID.energy_horse_power_metric, BigDecimal.valueOf(2.6477955E+24), UnitGroup.ENERGY, R.string.unit_energy_horse_power_metric, R.string.unit_energy_horse_power_metric_short), - NormalUnit(UnitID.calorie_th, BigDecimal.valueOf(4184E+15), UnitGroup.ENERGY, R.string.unit_calorie_th, R.string.unit_calorie_th_short), - NormalUnit(UnitID.kilocalorie_th, BigDecimal.valueOf(4184E+18), UnitGroup.ENERGY, R.string.unit_kilocalorie_th, R.string.unit_kilocalorie_th_short), + NormalUnit(UnitID.electron_volt, BigDecimal("0.160217733"), UnitGroup.ENERGY, R.string.unit_electron_volt, R.string.unit_electron_volt_short), + NormalUnit(UnitID.attojoule, BigDecimal("1.00"), UnitGroup.ENERGY, R.string.unit_attojoule, R.string.unit_attojoule_short), + NormalUnit(UnitID.joule, BigDecimal("1000000000000000000"), UnitGroup.ENERGY, R.string.unit_joule, R.string.unit_joule_short), + NormalUnit(UnitID.kilojoule, BigDecimal("1000000000000000000000"), UnitGroup.ENERGY, R.string.unit_kilojoule, R.string.unit_kilojoule_short), + NormalUnit(UnitID.megajoule, BigDecimal("1000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_megajoule, R.string.unit_megajoule_short), + NormalUnit(UnitID.gigajoule, BigDecimal("1000000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_gigajoule, R.string.unit_gigajoule_short), + NormalUnit(UnitID.energy_ton, BigDecimal("4184000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_energy_ton, R.string.unit_energy_ton_short), + NormalUnit(UnitID.kiloton, BigDecimal("4184000000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_kiloton, R.string.unit_kiloton_short), + NormalUnit(UnitID.megaton, BigDecimal("4184000000000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_megaton, R.string.unit_megaton_short), + NormalUnit(UnitID.gigaton, BigDecimal("4184000000000000000000000000000000000"), UnitGroup.ENERGY, R.string.unit_gigaton, R.string.unit_gigaton_short), + NormalUnit(UnitID.energy_horse_power_metric, BigDecimal("2647795500000000000000000"), UnitGroup.ENERGY, R.string.unit_energy_horse_power_metric, R.string.unit_energy_horse_power_metric_short), + NormalUnit(UnitID.calorie_th, BigDecimal("4184000000000000000"), UnitGroup.ENERGY, R.string.unit_calorie_th, R.string.unit_calorie_th_short), + NormalUnit(UnitID.kilocalorie_th, BigDecimal("4184000000000000000000"), UnitGroup.ENERGY, R.string.unit_kilocalorie_th, R.string.unit_kilocalorie_th_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FlowRate.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FlowRate.kt index cfa7b6f7..0126ef92 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FlowRate.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FlowRate.kt @@ -19,34 +19,34 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.ReverseUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal val flowRateCollection: List by lazy { listOf( - ReverseUnit(UnitID.liter_per_hour, BigDecimal.valueOf(3600000), UnitGroup.FLOW_RATE, R.string.unit_liter_per_hour, R.string.unit_liter_per_hour_short), - ReverseUnit(UnitID.liter_per_minute, BigDecimal.valueOf(60000), UnitGroup.FLOW_RATE, R.string.unit_liter_per_minute, R.string.unit_liter_per_minute_short), - ReverseUnit(UnitID.liter_per_second, BigDecimal.valueOf(1000), UnitGroup.FLOW_RATE, R.string.unit_liter_per_second, R.string.unit_liter_per_second_short), - ReverseUnit(UnitID.milliliter_per_hour, BigDecimal.valueOf(3600000000), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_hour, R.string.unit_milliliter_per_hour_short), - ReverseUnit(UnitID.milliliter_per_minute, BigDecimal.valueOf(60000000), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_minute, R.string.unit_milliliter_per_minute_short), - ReverseUnit(UnitID.milliliter_per_second, BigDecimal.valueOf(1000000), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_second, R.string.unit_milliliter_per_second_short), - ReverseUnit(UnitID.cubic_meter_per_hour, BigDecimal.valueOf(3600), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_hour, R.string.unit_cubic_meter_per_hour_short), - ReverseUnit(UnitID.cubic_meter_per_minute, BigDecimal.valueOf(60), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_minute, R.string.unit_cubic_meter_per_minute_short), - ReverseUnit(UnitID.cubic_meter_per_second, BigDecimal.valueOf(1), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_second, R.string.unit_cubic_meter_per_second_short), - ReverseUnit(UnitID.cubic_millimeter_per_hour, BigDecimal.valueOf(3600000000000), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_hour, R.string.unit_cubic_millimeter_per_hour_short), - ReverseUnit(UnitID.cubic_millimeter_per_minute, BigDecimal.valueOf(60000000000), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_minute, R.string.unit_cubic_millimeter_per_minute_short), - ReverseUnit(UnitID.cubic_millimeter_per_second, BigDecimal.valueOf(1000000000), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_second, R.string.unit_cubic_millimeter_per_second_short), - ReverseUnit(UnitID.cubic_foot_per_hour, BigDecimal.valueOf(127132.80019736), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_hour, R.string.unit_cubic_foot_per_hour_short), - ReverseUnit(UnitID.cubic_foot_per_minute, BigDecimal.valueOf(2118.8800032893), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_minute, R.string.unit_cubic_foot_per_minute_short), - ReverseUnit(UnitID.cubic_foot_per_second, BigDecimal.valueOf(35.314666721489), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_second, R.string.unit_cubic_foot_per_second_short), - ReverseUnit(UnitID.gallons_per_hour_us, BigDecimal.valueOf(951019.38848933), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_hour_us, R.string.unit_gallon_per_hour_us_short), - ReverseUnit(UnitID.gallons_per_minute_us, BigDecimal.valueOf(15850.323141489), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_minute_us, R.string.unit_gallon_per_minute_us_short), - ReverseUnit(UnitID.gallons_per_second_us, BigDecimal.valueOf(264.17205235815), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_second_us, R.string.unit_gallon_per_second_us_short), - ReverseUnit(UnitID.gallons_per_hour_imperial, BigDecimal.valueOf(791889.29387672), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_hour_imperial, R.string.unit_gallon_per_hour_imperial_short), - ReverseUnit(UnitID.gallons_per_minute_imperial, BigDecimal.valueOf(13198.154897945), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_minute_imperial, R.string.unit_gallon_per_minute_imperial_short), - ReverseUnit(UnitID.gallons_per_second_imperial, BigDecimal.valueOf(219.96924829909), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_second_imperial, R.string.unit_gallon_per_second_imperial_short), + ReverseUnit(UnitID.liter_per_hour, BigDecimal("3600000"), UnitGroup.FLOW_RATE, R.string.unit_liter_per_hour, R.string.unit_liter_per_hour_short), + ReverseUnit(UnitID.liter_per_minute, BigDecimal("60000"), UnitGroup.FLOW_RATE, R.string.unit_liter_per_minute, R.string.unit_liter_per_minute_short), + ReverseUnit(UnitID.liter_per_second, BigDecimal("1000"), UnitGroup.FLOW_RATE, R.string.unit_liter_per_second, R.string.unit_liter_per_second_short), + ReverseUnit(UnitID.milliliter_per_hour, BigDecimal("3600000000"), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_hour, R.string.unit_milliliter_per_hour_short), + ReverseUnit(UnitID.milliliter_per_minute, BigDecimal("60000000"), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_minute, R.string.unit_milliliter_per_minute_short), + ReverseUnit(UnitID.milliliter_per_second, BigDecimal("1000000"), UnitGroup.FLOW_RATE, R.string.unit_milliliter_per_second, R.string.unit_milliliter_per_second_short), + ReverseUnit(UnitID.cubic_meter_per_hour, BigDecimal("3600"), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_hour, R.string.unit_cubic_meter_per_hour_short), + ReverseUnit(UnitID.cubic_meter_per_minute, BigDecimal("60"), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_minute, R.string.unit_cubic_meter_per_minute_short), + ReverseUnit(UnitID.cubic_meter_per_second, BigDecimal("1"), UnitGroup.FLOW_RATE, R.string.unit_cubic_meter_per_second, R.string.unit_cubic_meter_per_second_short), + ReverseUnit(UnitID.cubic_millimeter_per_hour, BigDecimal("3600000000000"), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_hour, R.string.unit_cubic_millimeter_per_hour_short), + ReverseUnit(UnitID.cubic_millimeter_per_minute, BigDecimal("60000000000"), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_minute, R.string.unit_cubic_millimeter_per_minute_short), + ReverseUnit(UnitID.cubic_millimeter_per_second, BigDecimal("1000000000"), UnitGroup.FLOW_RATE, R.string.unit_cubic_millimeter_per_second, R.string.unit_cubic_millimeter_per_second_short), + ReverseUnit(UnitID.cubic_foot_per_hour, BigDecimal("127132.80019736"), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_hour, R.string.unit_cubic_foot_per_hour_short), + ReverseUnit(UnitID.cubic_foot_per_minute, BigDecimal("2118.8800032893"), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_minute, R.string.unit_cubic_foot_per_minute_short), + ReverseUnit(UnitID.cubic_foot_per_second, BigDecimal("35.314666721489"), UnitGroup.FLOW_RATE, R.string.unit_cubic_foot_per_second, R.string.unit_cubic_foot_per_second_short), + ReverseUnit(UnitID.gallons_per_hour_us, BigDecimal("951019.38848933"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_hour_us, R.string.unit_gallon_per_hour_us_short), + ReverseUnit(UnitID.gallons_per_minute_us, BigDecimal("15850.323141489"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_minute_us, R.string.unit_gallon_per_minute_us_short), + ReverseUnit(UnitID.gallons_per_second_us, BigDecimal("264.17205235815"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_second_us, R.string.unit_gallon_per_second_us_short), + ReverseUnit(UnitID.gallons_per_hour_imperial, BigDecimal("791889.29387672"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_hour_imperial, R.string.unit_gallon_per_hour_imperial_short), + ReverseUnit(UnitID.gallons_per_minute_imperial, BigDecimal("13198.154897945"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_minute_imperial, R.string.unit_gallon_per_minute_imperial_short), + ReverseUnit(UnitID.gallons_per_second_imperial, BigDecimal("219.96924829909"), UnitGroup.FLOW_RATE, R.string.unit_gallon_per_second_imperial, R.string.unit_gallon_per_second_imperial_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Flux.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Flux.kt index 71bd5b38..b39c16a1 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Flux.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Flux.kt @@ -19,20 +19,20 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val fluxCollection: List by lazy { listOf( - NormalUnit(UnitID.maxwell, BigDecimal.valueOf(1), UnitGroup.FLUX, R.string.unit_maxwell, R.string.unit_maxwell_short), - NormalUnit(UnitID.microweber, BigDecimal.valueOf(100), UnitGroup.FLUX, R.string.unit_microweber, R.string.unit_microweber_short), - NormalUnit(UnitID.milliweber, BigDecimal.valueOf(100000), UnitGroup.FLUX, R.string.unit_milliweber, R.string.unit_milliweber_short), - NormalUnit(UnitID.weber, BigDecimal.valueOf(100000000), UnitGroup.FLUX, R.string.unit_weber, R.string.unit_weber_short), - NormalUnit(UnitID.kiloweber, BigDecimal.valueOf(100000000000), UnitGroup.FLUX, R.string.unit_kiloweber, R.string.unit_kiloweber_short), - NormalUnit(UnitID.megaweber, BigDecimal.valueOf(100000000000000), UnitGroup.FLUX, R.string.unit_megaweber, R.string.unit_megaweber_short), - NormalUnit(UnitID.gigaweber, BigDecimal.valueOf(100000000000000000), UnitGroup.FLUX, R.string.unit_gigaweber, R.string.unit_gigaweber_short), + NormalUnit(UnitID.maxwell, BigDecimal("1"), UnitGroup.FLUX, R.string.unit_maxwell, R.string.unit_maxwell_short), + NormalUnit(UnitID.microweber, BigDecimal("100"), UnitGroup.FLUX, R.string.unit_microweber, R.string.unit_microweber_short), + NormalUnit(UnitID.milliweber, BigDecimal("100000"), UnitGroup.FLUX, R.string.unit_milliweber, R.string.unit_milliweber_short), + NormalUnit(UnitID.weber, BigDecimal("100000000"), UnitGroup.FLUX, R.string.unit_weber, R.string.unit_weber_short), + NormalUnit(UnitID.kiloweber, BigDecimal("100000000000"), UnitGroup.FLUX, R.string.unit_kiloweber, R.string.unit_kiloweber_short), + NormalUnit(UnitID.megaweber, BigDecimal("100000000000000"), UnitGroup.FLUX, R.string.unit_megaweber, R.string.unit_megaweber_short), + NormalUnit(UnitID.gigaweber, BigDecimal("100000000000000000"), UnitGroup.FLUX, R.string.unit_gigaweber, R.string.unit_gigaweber_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Force.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Force.kt index 183cb5b8..1a750c27 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Force.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Force.kt @@ -19,28 +19,28 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal val forceCollection: List by lazy { listOf( - NormalUnit(UnitID.attonewton, BigDecimal.valueOf(1), UnitGroup.FORCE, R.string.unit_attonewton, R.string.unit_attonewton_short), - NormalUnit(UnitID.dyne, BigDecimal.valueOf(1E+13), UnitGroup.FORCE, R.string.unit_dyne, R.string.unit_dyne_short), - NormalUnit(UnitID.millinewton, BigDecimal.valueOf(1E+15), UnitGroup.FORCE, R.string.unit_millinewton, R.string.unit_millinewton_short), - NormalUnit(UnitID.joule_per_centimeter, BigDecimal.valueOf(1E+16), UnitGroup.FORCE, R.string.unit_joule_per_centimeter, R.string.unit_joule_per_centimeter_short), - NormalUnit(UnitID.newton, BigDecimal.valueOf(1E+18), UnitGroup.FORCE, R.string.unit_newton, R.string.unit_newton_short), - NormalUnit(UnitID.joule_per_meter, BigDecimal.valueOf(1E+18), UnitGroup.FORCE, R.string.unit_joule_per_meter, R.string.unit_joule_per_meter_short), - NormalUnit(UnitID.kilonewton, BigDecimal.valueOf(1E+21), UnitGroup.FORCE, R.string.unit_kilonewton, R.string.unit_kilonewton_short), - NormalUnit(UnitID.gram_force, BigDecimal.valueOf(9.80665E+15), UnitGroup.FORCE, R.string.unit_gram_force, R.string.unit_gram_force_short), - NormalUnit(UnitID.kilogram_force, BigDecimal.valueOf(9.80665E+18), UnitGroup.FORCE, R.string.unit_kilogram_force, R.string.unit_kilogram_force_short), - NormalUnit(UnitID.ton_force, BigDecimal.valueOf(9.80665E+21), UnitGroup.FORCE, R.string.unit_ton_force, R.string.unit_ton_force_short), - NormalUnit(UnitID.ounce_force, BigDecimal.valueOf(2.78013850953423008E17), UnitGroup.FORCE, R.string.unit_ounce_force, R.string.unit_ounce_force_short), - NormalUnit(UnitID.pound_force, BigDecimal.valueOf(4.4482216152550001E18), UnitGroup.FORCE, R.string.unit_pound_force, R.string.unit_pound_force_short), - NormalUnit(UnitID.kilopound_force, BigDecimal.valueOf(4.448221615255E+21), UnitGroup.FORCE, R.string.unit_kilopound_force, R.string.unit_kilopound_force_short), - NormalUnit(UnitID.pond, BigDecimal.valueOf(9.80665E+15), UnitGroup.FORCE, R.string.unit_pond, R.string.unit_pond_short), - NormalUnit(UnitID.kilopond, BigDecimal.valueOf(9.80665E+18), UnitGroup.FORCE, R.string.unit_kilopond, R.string.unit_kilopond_short), + NormalUnit(UnitID.attonewton, BigDecimal("1"), UnitGroup.FORCE, R.string.unit_attonewton, R.string.unit_attonewton_short), + NormalUnit(UnitID.dyne, BigDecimal("10000000000000"), UnitGroup.FORCE, R.string.unit_dyne, R.string.unit_dyne_short), + NormalUnit(UnitID.millinewton, BigDecimal("1000000000000000"), UnitGroup.FORCE, R.string.unit_millinewton, R.string.unit_millinewton_short), + NormalUnit(UnitID.joule_per_centimeter, BigDecimal("10000000000000000"), UnitGroup.FORCE, R.string.unit_joule_per_centimeter, R.string.unit_joule_per_centimeter_short), + NormalUnit(UnitID.newton, BigDecimal("1000000000000000000"), UnitGroup.FORCE, R.string.unit_newton, R.string.unit_newton_short), + NormalUnit(UnitID.joule_per_meter, BigDecimal("1000000000000000000"), UnitGroup.FORCE, R.string.unit_joule_per_meter, R.string.unit_joule_per_meter_short), + NormalUnit(UnitID.kilonewton, BigDecimal("1000000000000000000000"), UnitGroup.FORCE, R.string.unit_kilonewton, R.string.unit_kilonewton_short), + NormalUnit(UnitID.gram_force, BigDecimal("9806650000000000"), UnitGroup.FORCE, R.string.unit_gram_force, R.string.unit_gram_force_short), + NormalUnit(UnitID.kilogram_force, BigDecimal("9806650000000000000"), UnitGroup.FORCE, R.string.unit_kilogram_force, R.string.unit_kilogram_force_short), + NormalUnit(UnitID.ton_force, BigDecimal("9806650000000000000000"), UnitGroup.FORCE, R.string.unit_ton_force, R.string.unit_ton_force_short), + NormalUnit(UnitID.ounce_force, BigDecimal("278013850953423000"), UnitGroup.FORCE, R.string.unit_ounce_force, R.string.unit_ounce_force_short), + NormalUnit(UnitID.pound_force, BigDecimal("4448221615255000000"), UnitGroup.FORCE, R.string.unit_pound_force, R.string.unit_pound_force_short), + NormalUnit(UnitID.kilopound_force, BigDecimal("4448221615255000000000"), UnitGroup.FORCE, R.string.unit_kilopound_force, R.string.unit_kilopound_force_short), + NormalUnit(UnitID.pond, BigDecimal("9806650000000000"), UnitGroup.FORCE, R.string.unit_pond, R.string.unit_pond_short), + NormalUnit(UnitID.kilopond, BigDecimal("9806650000000000000"), UnitGroup.FORCE, R.string.unit_kilopond, R.string.unit_kilopond_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FuelConsumption.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FuelConsumption.kt index 9587fafc..bf5ec752 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FuelConsumption.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/FuelConsumption.kt @@ -28,15 +28,15 @@ import java.math.BigDecimal val fuelConsumptionCollection: List by lazy { listOf( - NormalUnit( UnitID.kilometer_per_liter, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_km_per_l, R.string.unit_km_per_l_short), - BackwardUnit(UnitID.liter_per_kilometer, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_km, R.string.unit_l_per_km_short), - BackwardUnit(UnitID.liter_per_100_kilometer, BigDecimal.valueOf(100), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_100_km, R.string.unit_l_per_100_km_short), - NormalUnit( UnitID.mile_per_gallon_uk, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_uk, R.string.unit_mi_per_gallon_uk_short), - NormalUnit( UnitID.mile_per_gallon_us, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_us, R.string.unit_mi_per_gallon_us_short), - NormalUnit( UnitID.mile_us_per_liter, BigDecimal.valueOf(1.609344), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_us_per_l, R.string.unit_mi_us_per_l_short), - BackwardUnit(UnitID.gallon_us_per_mile, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_mile, R.string.unit_gallon_us_per_mile_short), - BackwardUnit(UnitID.gallon_uk_per_mile, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_mile, R.string.unit_gallon_uk_per_mile_short), - BackwardUnit(UnitID.gallon_us_per_100_mile, BigDecimal.valueOf(42.51437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_100_mile, R.string.unit_gallon_us_per_100_mile_short), - BackwardUnit(UnitID.gallon_uk_per_100_mile, BigDecimal.valueOf(35.400618996), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_100_mile, R.string.unit_gallon_uk_per_100_mile_short), + NormalUnit( UnitID.kilometer_per_liter, BigDecimal("1"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_km_per_l, R.string.unit_km_per_l_short), + BackwardUnit(UnitID.liter_per_kilometer, BigDecimal("1"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_km, R.string.unit_l_per_km_short), + BackwardUnit(UnitID.liter_per_100_kilometer, BigDecimal("100"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_100_km, R.string.unit_l_per_100_km_short), + NormalUnit( UnitID.mile_per_gallon_uk, BigDecimal("0.35400619"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_uk, R.string.unit_mi_per_gallon_uk_short), + NormalUnit( UnitID.mile_per_gallon_us, BigDecimal("0.4251437075"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_us, R.string.unit_mi_per_gallon_us_short), + NormalUnit( UnitID.mile_us_per_liter, BigDecimal("1.609344"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_us_per_l, R.string.unit_mi_us_per_l_short), + BackwardUnit(UnitID.gallon_us_per_mile, BigDecimal("0.4251437075"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_mile, R.string.unit_gallon_us_per_mile_short), + BackwardUnit(UnitID.gallon_uk_per_mile, BigDecimal("0.35400619"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_mile, R.string.unit_gallon_uk_per_mile_short), + BackwardUnit(UnitID.gallon_us_per_100_mile, BigDecimal("42.51437075"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_100_mile, R.string.unit_gallon_us_per_100_mile_short), + BackwardUnit(UnitID.gallon_uk_per_100_mile, BigDecimal("35.400618996"), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_100_mile, R.string.unit_gallon_uk_per_100_mile_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Length.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Length.kt index 9cdba506..4bb1f83c 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Length.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Length.kt @@ -27,31 +27,31 @@ import java.math.BigDecimal internal val lengthCollection: List by lazy { listOf( - NormalUnit(UnitID.attometer, BigDecimal.valueOf(1.0), UnitGroup.LENGTH, R.string.unit_attometer, R.string.unit_attometer_short), - NormalUnit(UnitID.nanometer, BigDecimal.valueOf(1.0E+9), UnitGroup.LENGTH, R.string.unit_nanometer, R.string.unit_nanometer_short), - NormalUnit(UnitID.micrometer, BigDecimal.valueOf(1.0E+12), UnitGroup.LENGTH, R.string.unit_micrometer, R.string.unit_micrometer_short), - NormalUnit(UnitID.millimeter, BigDecimal.valueOf(1.0E+15), UnitGroup.LENGTH, R.string.unit_millimeter, R.string.unit_millimeter_short), - NormalUnit(UnitID.centimeter, BigDecimal.valueOf(1.0E+16), UnitGroup.LENGTH, R.string.unit_centimeter, R.string.unit_centimeter_short), - NormalUnit(UnitID.decimeter, BigDecimal.valueOf(1.0E+17), UnitGroup.LENGTH, R.string.unit_decimeter, R.string.unit_decimeter_short), - NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), - NormalUnit(UnitID.kilometer, BigDecimal.valueOf(1.0E+21), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), - NormalUnit(UnitID.nautical_mile, BigDecimal.valueOf(1.852E+21), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), - NormalUnit(UnitID.inch, BigDecimal.valueOf(25_400_000_000_000_000), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), - NormalUnit(UnitID.foot, BigDecimal.valueOf(304_800_000_000_000_000), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), - NormalUnit(UnitID.yard, BigDecimal.valueOf(914_400_000_000_006_400), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), - NormalUnit(UnitID.mile, BigDecimal.valueOf(1_609_344_000_000_010_500_000.0), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), - NormalUnit(UnitID.light_year, BigDecimal.valueOf(9.460730472E+33), UnitGroup.LENGTH, R.string.unit_light_year, R.string.unit_light_year_short), - NormalUnit(UnitID.parsec, BigDecimal.valueOf(3.08567758149136E+34), UnitGroup.LENGTH, R.string.unit_parsec, R.string.unit_parsec_short), - NormalUnit(UnitID.kiloparsec, BigDecimal.valueOf(3.08567758149136E+37), UnitGroup.LENGTH, R.string.unit_kiloparsec, R.string.unit_kiloparsec_short), - NormalUnit(UnitID.megaparsec, BigDecimal.valueOf(3.08567758149136E+40), UnitGroup.LENGTH, R.string.unit_megaparsec, R.string.unit_megaparsec_short), - NormalUnit(UnitID.mercury_equatorial_radius, BigDecimal.valueOf(2.4397E+24), UnitGroup.LENGTH, R.string.unit_mercury_equatorial_radius, R.string.unit_mercury_equatorial_radius_short), - NormalUnit(UnitID.venus_equatorial_radius, BigDecimal.valueOf(6.0518E+24), UnitGroup.LENGTH, R.string.unit_venus_equatorial_radius, R.string.unit_venus_equatorial_radius_short), - NormalUnit(UnitID.earth_equatorial_radius, BigDecimal.valueOf(6.371E+24), UnitGroup.LENGTH, R.string.unit_earth_equatorial_radius, R.string.unit_earth_equatorial_radius_short), - NormalUnit(UnitID.mars_equatorial_radius, BigDecimal.valueOf(3.3895E+24), UnitGroup.LENGTH, R.string.unit_mars_equatorial_radius, R.string.unit_mars_equatorial_radius_short), - NormalUnit(UnitID.jupiter_equatorial_radius, BigDecimal.valueOf(6.9911E+25), UnitGroup.LENGTH, R.string.unit_jupiter_equatorial_radius, R.string.unit_jupiter_equatorial_radius_short), - NormalUnit(UnitID.saturn_equatorial_radius, BigDecimal.valueOf(5.8232E+25), UnitGroup.LENGTH, R.string.unit_saturn_equatorial_radius, R.string.unit_saturn_equatorial_radius_short), - NormalUnit(UnitID.uranus_equatorial_radius, BigDecimal.valueOf(2.5362E+25), UnitGroup.LENGTH, R.string.unit_uranus_equatorial_radius, R.string.unit_uranus_equatorial_radius_short), - NormalUnit(UnitID.neptune_equatorial_radius, BigDecimal.valueOf(2.4622E+25), UnitGroup.LENGTH, R.string.unit_neptune_equatorial_radius, R.string.unit_neptune_equatorial_radius_short), - NormalUnit(UnitID.sun_equatorial_radius, BigDecimal.valueOf(6.95508E+26), UnitGroup.LENGTH, R.string.unit_sun_equatorial_radius, R.string.unit_sun_equatorial_radius_short), + NormalUnit(UnitID.attometer, BigDecimal("1"), UnitGroup.LENGTH, R.string.unit_attometer, R.string.unit_attometer_short), + NormalUnit(UnitID.nanometer, BigDecimal("1000000000"), UnitGroup.LENGTH, R.string.unit_nanometer, R.string.unit_nanometer_short), + NormalUnit(UnitID.micrometer, BigDecimal("1000000000000"), UnitGroup.LENGTH, R.string.unit_micrometer, R.string.unit_micrometer_short), + NormalUnit(UnitID.millimeter, BigDecimal("1000000000000000"), UnitGroup.LENGTH, R.string.unit_millimeter, R.string.unit_millimeter_short), + NormalUnit(UnitID.centimeter, BigDecimal("10000000000000000"), UnitGroup.LENGTH, R.string.unit_centimeter, R.string.unit_centimeter_short), + NormalUnit(UnitID.decimeter, BigDecimal("100000000000000000"), UnitGroup.LENGTH, R.string.unit_decimeter, R.string.unit_decimeter_short), + NormalUnit(UnitID.meter, BigDecimal("1000000000000000000"), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), + NormalUnit(UnitID.kilometer, BigDecimal("1000000000000000000000"), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), + NormalUnit(UnitID.nautical_mile, BigDecimal("1852000000000000000000"), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), + NormalUnit(UnitID.inch, BigDecimal("25400000000000000"), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), + NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), + NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), + NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), + NormalUnit(UnitID.light_year, BigDecimal("9460730472000000000000000000000000"), UnitGroup.LENGTH, R.string.unit_light_year, R.string.unit_light_year_short), + NormalUnit(UnitID.parsec, BigDecimal("30856775814913600000000000000000000"), UnitGroup.LENGTH, R.string.unit_parsec, R.string.unit_parsec_short), + NormalUnit(UnitID.kiloparsec, BigDecimal("30856775814913600000000000000000000000"), UnitGroup.LENGTH, R.string.unit_kiloparsec, R.string.unit_kiloparsec_short), + NormalUnit(UnitID.megaparsec, BigDecimal("30856775814913600000000000000000000000000"), UnitGroup.LENGTH, R.string.unit_megaparsec, R.string.unit_megaparsec_short), + NormalUnit(UnitID.mercury_equatorial_radius, BigDecimal("2439700000000000000000000"), UnitGroup.LENGTH, R.string.unit_mercury_equatorial_radius, R.string.unit_mercury_equatorial_radius_short), + NormalUnit(UnitID.venus_equatorial_radius, BigDecimal("6051800000000000000000000"), UnitGroup.LENGTH, R.string.unit_venus_equatorial_radius, R.string.unit_venus_equatorial_radius_short), + NormalUnit(UnitID.earth_equatorial_radius, BigDecimal("6371000000000000000000000"), UnitGroup.LENGTH, R.string.unit_earth_equatorial_radius, R.string.unit_earth_equatorial_radius_short), + NormalUnit(UnitID.mars_equatorial_radius, BigDecimal("3389500000000000000000000"), UnitGroup.LENGTH, R.string.unit_mars_equatorial_radius, R.string.unit_mars_equatorial_radius_short), + NormalUnit(UnitID.jupiter_equatorial_radius, BigDecimal("69911000000000000000000000"), UnitGroup.LENGTH, R.string.unit_jupiter_equatorial_radius, R.string.unit_jupiter_equatorial_radius_short), + NormalUnit(UnitID.saturn_equatorial_radius, BigDecimal("58232000000000000000000000"), UnitGroup.LENGTH, R.string.unit_saturn_equatorial_radius, R.string.unit_saturn_equatorial_radius_short), + NormalUnit(UnitID.uranus_equatorial_radius, BigDecimal("25362000000000000000000000"), UnitGroup.LENGTH, R.string.unit_uranus_equatorial_radius, R.string.unit_uranus_equatorial_radius_short), + NormalUnit(UnitID.neptune_equatorial_radius, BigDecimal("24622000000000000000000000"), UnitGroup.LENGTH, R.string.unit_neptune_equatorial_radius, R.string.unit_neptune_equatorial_radius_short), + NormalUnit(UnitID.sun_equatorial_radius, BigDecimal("695508000000000000000000000"), UnitGroup.LENGTH, R.string.unit_sun_equatorial_radius, R.string.unit_sun_equatorial_radius_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Luminance.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Luminance.kt index e8e844e9..65fd29d2 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Luminance.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Luminance.kt @@ -19,32 +19,32 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal val luminanceCollection: List by lazy { listOf( - NormalUnit(UnitID.candela_per_square_meter, BigDecimal.valueOf(31415926.5359), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_meter, R.string.unit_candela_per_square_meter_short), - NormalUnit(UnitID.candela_per_square_centimeter, BigDecimal.valueOf(314159265359), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_centimeter, R.string.unit_candela_per_square_centimeter_short), - NormalUnit(UnitID.candela_per_square_foot, BigDecimal.valueOf(338158218.89), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_foot, R.string.unit_candela_per_square_foot_short), - NormalUnit(UnitID.candela_per_square_inch, BigDecimal.valueOf(48694783520), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_inch, R.string.unit_candela_per_square_inch_short), - NormalUnit(UnitID.kilocandela_per_square_meter, BigDecimal.valueOf(31415926535.9), UnitGroup.LUMINANCE, R.string.unit_kilocandela_per_square_meter, R.string.unit_kilocandela_per_square_meter_short), - NormalUnit(UnitID.stilb, BigDecimal.valueOf(314159265359), UnitGroup.LUMINANCE, R.string.unit_stilb, R.string.unit_stilb_short), - NormalUnit(UnitID.lumen_per_square_meter_per_steradian, BigDecimal.valueOf(31415926.5359), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_meter_per_steradian, R.string.unit_lumen_per_square_meter_per_steradian_short), - NormalUnit(UnitID.lumen_per_square_centimeter_per_steradian, BigDecimal.valueOf(314159265359), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_centimeter_per_steradian, R.string.unit_lumen_per_square_centimeter_per_steradian_short), - NormalUnit(UnitID.lumen_per_square_foot_per_steradian, BigDecimal.valueOf(338158218.89), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_foot_per_steradian, R.string.unit_lumen_per_square_foot_per_steradian_short), - NormalUnit(UnitID.watt_per_square_centimeter_per_steradian, BigDecimal.valueOf(214570778240185), UnitGroup.LUMINANCE, R.string.unit_watt_per_square_centimeter_per_steradian, R.string.unit_watt_per_square_centimeter_per_steradian_short), - NormalUnit(UnitID.nit, BigDecimal.valueOf(31415926.5359), UnitGroup.LUMINANCE, R.string.unit_nit, R.string.unit_nit_short), - NormalUnit(UnitID.millinit, BigDecimal.valueOf(31415.9265359), UnitGroup.LUMINANCE, R.string.unit_millinit, R.string.unit_millinit_short), - NormalUnit(UnitID.lambert, BigDecimal.valueOf(100000000000), UnitGroup.LUMINANCE, R.string.unit_lambert, R.string.unit_lambert_short), - NormalUnit(UnitID.millilambert, BigDecimal.valueOf(100000000), UnitGroup.LUMINANCE, R.string.unit_millilambert, R.string.unit_millilambert_short), - NormalUnit(UnitID.foot_lambert, BigDecimal.valueOf(107639104.167), UnitGroup.LUMINANCE, R.string.unit_foot_lambert, R.string.unit_foot_lambert_short), - NormalUnit(UnitID.apostilb, BigDecimal.valueOf(10000000), UnitGroup.LUMINANCE, R.string.unit_apostilb, R.string.unit_apostilb_short), - NormalUnit(UnitID.blondel, BigDecimal.valueOf(10000000), UnitGroup.LUMINANCE, R.string.unit_blondel, R.string.unit_blondel_short), - NormalUnit(UnitID.skot, BigDecimal.valueOf(10000), UnitGroup.LUMINANCE, R.string.unit_skot, R.string.unit_skot_short), - NormalUnit(UnitID.bril, BigDecimal.valueOf(1), UnitGroup.LUMINANCE, R.string.unit_bril, R.string.unit_bril_short), + NormalUnit(UnitID.candela_per_square_meter, BigDecimal("31415926.5359"), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_meter, R.string.unit_candela_per_square_meter_short), + NormalUnit(UnitID.candela_per_square_centimeter, BigDecimal("314159265359"), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_centimeter, R.string.unit_candela_per_square_centimeter_short), + NormalUnit(UnitID.candela_per_square_foot, BigDecimal("338158218.89"), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_foot, R.string.unit_candela_per_square_foot_short), + NormalUnit(UnitID.candela_per_square_inch, BigDecimal("48694783520"), UnitGroup.LUMINANCE, R.string.unit_candela_per_square_inch, R.string.unit_candela_per_square_inch_short), + NormalUnit(UnitID.kilocandela_per_square_meter, BigDecimal("31415926535.9"), UnitGroup.LUMINANCE, R.string.unit_kilocandela_per_square_meter, R.string.unit_kilocandela_per_square_meter_short), + NormalUnit(UnitID.stilb, BigDecimal("314159265359"), UnitGroup.LUMINANCE, R.string.unit_stilb, R.string.unit_stilb_short), + NormalUnit(UnitID.lumen_per_square_meter_per_steradian, BigDecimal("31415926.5359"), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_meter_per_steradian, R.string.unit_lumen_per_square_meter_per_steradian_short), + NormalUnit(UnitID.lumen_per_square_centimeter_per_steradian, BigDecimal("314159265359"), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_centimeter_per_steradian, R.string.unit_lumen_per_square_centimeter_per_steradian_short), + NormalUnit(UnitID.lumen_per_square_foot_per_steradian, BigDecimal("338158218.89"), UnitGroup.LUMINANCE, R.string.unit_lumen_per_square_foot_per_steradian, R.string.unit_lumen_per_square_foot_per_steradian_short), + NormalUnit(UnitID.watt_per_square_centimeter_per_steradian, BigDecimal("214570778240185"), UnitGroup.LUMINANCE, R.string.unit_watt_per_square_centimeter_per_steradian, R.string.unit_watt_per_square_centimeter_per_steradian_short), + NormalUnit(UnitID.nit, BigDecimal("31415926.5359"), UnitGroup.LUMINANCE, R.string.unit_nit, R.string.unit_nit_short), + NormalUnit(UnitID.millinit, BigDecimal("31415.9265359"), UnitGroup.LUMINANCE, R.string.unit_millinit, R.string.unit_millinit_short), + NormalUnit(UnitID.lambert, BigDecimal("100000000000"), UnitGroup.LUMINANCE, R.string.unit_lambert, R.string.unit_lambert_short), + NormalUnit(UnitID.millilambert, BigDecimal("100000000"), UnitGroup.LUMINANCE, R.string.unit_millilambert, R.string.unit_millilambert_short), + NormalUnit(UnitID.foot_lambert, BigDecimal("107639104.167"), UnitGroup.LUMINANCE, R.string.unit_foot_lambert, R.string.unit_foot_lambert_short), + NormalUnit(UnitID.apostilb, BigDecimal("10000000"), UnitGroup.LUMINANCE, R.string.unit_apostilb, R.string.unit_apostilb_short), + NormalUnit(UnitID.blondel, BigDecimal("10000000"), UnitGroup.LUMINANCE, R.string.unit_blondel, R.string.unit_blondel_short), + NormalUnit(UnitID.skot, BigDecimal("10000"), UnitGroup.LUMINANCE, R.string.unit_skot, R.string.unit_skot_short), + NormalUnit(UnitID.bril, BigDecimal("1"), UnitGroup.LUMINANCE, R.string.unit_bril, R.string.unit_bril_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Mass.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Mass.kt index e406bd2a..5e3aa85e 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Mass.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Mass.kt @@ -27,26 +27,26 @@ import java.math.BigDecimal internal val massCollection: List by lazy { listOf( - NormalUnit(UnitID.electron_mass_rest, BigDecimal.valueOf(9.1093897E-28), UnitGroup.MASS, R.string.unit_electron_mass_rest, R.string.unit_electron_mass_rest_short), - NormalUnit(UnitID.atomic_mass_unit, BigDecimal.valueOf(1.6605402E-24), UnitGroup.MASS, R.string.unit_atomic_mass_unit, R.string.unit_atomic_mass_unit_short), - NormalUnit(UnitID.microgram, BigDecimal(1E-6), UnitGroup.MASS, R.string.unit_microgram, R.string.unit_microgram_short), - NormalUnit(UnitID.milligram, BigDecimal.valueOf(1E-3), UnitGroup.MASS, R.string.unit_milligram, R.string.unit_milligram_short), - NormalUnit(UnitID.grain, BigDecimal.valueOf(0.06479891), UnitGroup.MASS, R.string.unit_grain, R.string.unit_grain_short), - NormalUnit(UnitID.gram, BigDecimal.valueOf(1), UnitGroup.MASS, R.string.unit_gram, R.string.unit_gram_short), - NormalUnit(UnitID.kilogram, BigDecimal.valueOf(1E+3), UnitGroup.MASS, R.string.unit_kilogram, R.string.unit_kilogram_short), - NormalUnit(UnitID.metric_ton, BigDecimal.valueOf(1E+6), UnitGroup.MASS, R.string.unit_metric_ton, R.string.unit_metric_ton_short), - NormalUnit(UnitID.imperial_ton, BigDecimal.valueOf(1016046.9088), UnitGroup.MASS, R.string.unit_imperial_ton, R.string.unit_imperial_ton_short), - NormalUnit(UnitID.ounce, BigDecimal.valueOf(28.349523125), UnitGroup.MASS, R.string.unit_ounce, R.string.unit_ounce_short), - NormalUnit(UnitID.carat, BigDecimal.valueOf(0.2), UnitGroup.MASS, R.string.unit_carat, R.string.unit_carat_short), - NormalUnit(UnitID.pound, BigDecimal.valueOf(453.59237), UnitGroup.MASS, R.string.unit_pound, R.string.unit_pound_short), - NormalUnit(UnitID.mercury_mass, BigDecimal.valueOf(3.30104E+26), UnitGroup.MASS, R.string.unit_mercury_mass, R.string.unit_mercury_mass_short), - NormalUnit(UnitID.venus_mass, BigDecimal.valueOf(4.86732E+27), UnitGroup.MASS, R.string.unit_venus_mass, R.string.unit_venus_mass_short), - NormalUnit(UnitID.earth_mass, BigDecimal.valueOf(5.97219E+27), UnitGroup.MASS, R.string.unit_earth_mass, R.string.unit_earth_mass_short), - NormalUnit(UnitID.mars_mass, BigDecimal.valueOf(6.41693E+26), UnitGroup.MASS, R.string.unit_mars_mass, R.string.unit_mars_mass_short), - NormalUnit(UnitID.jupiter_mass, BigDecimal.valueOf(1.89813E+30), UnitGroup.MASS, R.string.unit_jupiter_mass, R.string.unit_jupiter_mass_short), - NormalUnit(UnitID.saturn_mass, BigDecimal.valueOf(5.68319E+29), UnitGroup.MASS, R.string.unit_saturn_mass, R.string.unit_saturn_mass_short), - NormalUnit(UnitID.uranus_mass, BigDecimal.valueOf(8.68103E+28), UnitGroup.MASS, R.string.unit_uranus_mass, R.string.unit_uranus_mass_short), - NormalUnit(UnitID.neptune_mass, BigDecimal.valueOf(1.0241E+29), UnitGroup.MASS, R.string.unit_neptune_mass, R.string.unit_neptune_mass_short), - NormalUnit(UnitID.sun_mass, BigDecimal.valueOf(1.9891E+33), UnitGroup.MASS, R.string.unit_sun_mass, R.string.unit_sun_mass_short), + NormalUnit(UnitID.electron_mass_rest, BigDecimal("0.00000000000000000000000000091093897"), UnitGroup.MASS, R.string.unit_electron_mass_rest, R.string.unit_electron_mass_rest_short), + NormalUnit(UnitID.atomic_mass_unit, BigDecimal("0.0000000000000000000000016605402"), UnitGroup.MASS, R.string.unit_atomic_mass_unit, R.string.unit_atomic_mass_unit_short), + NormalUnit(UnitID.microgram, BigDecimal("0.000001"), UnitGroup.MASS, R.string.unit_microgram, R.string.unit_microgram_short), + NormalUnit(UnitID.milligram, BigDecimal("0.001"), UnitGroup.MASS, R.string.unit_milligram, R.string.unit_milligram_short), + NormalUnit(UnitID.grain, BigDecimal("0.06479891"), UnitGroup.MASS, R.string.unit_grain, R.string.unit_grain_short), + NormalUnit(UnitID.gram, BigDecimal("1"), UnitGroup.MASS, R.string.unit_gram, R.string.unit_gram_short), + NormalUnit(UnitID.kilogram, BigDecimal("1000"), UnitGroup.MASS, R.string.unit_kilogram, R.string.unit_kilogram_short), + NormalUnit(UnitID.metric_ton, BigDecimal("1000000"), UnitGroup.MASS, R.string.unit_metric_ton, R.string.unit_metric_ton_short), + NormalUnit(UnitID.imperial_ton, BigDecimal("1016046.9088"), UnitGroup.MASS, R.string.unit_imperial_ton, R.string.unit_imperial_ton_short), + NormalUnit(UnitID.ounce, BigDecimal("28.349523125"), UnitGroup.MASS, R.string.unit_ounce, R.string.unit_ounce_short), + NormalUnit(UnitID.carat, BigDecimal("0.2"), UnitGroup.MASS, R.string.unit_carat, R.string.unit_carat_short), + NormalUnit(UnitID.pound, BigDecimal("453.59237"), UnitGroup.MASS, R.string.unit_pound, R.string.unit_pound_short), + NormalUnit(UnitID.mercury_mass, BigDecimal("330104000000000000000000000"), UnitGroup.MASS, R.string.unit_mercury_mass, R.string.unit_mercury_mass_short), + NormalUnit(UnitID.venus_mass, BigDecimal("4867320000000000000000000000"), UnitGroup.MASS, R.string.unit_venus_mass, R.string.unit_venus_mass_short), + NormalUnit(UnitID.earth_mass, BigDecimal("5972190000000000000000000000"), UnitGroup.MASS, R.string.unit_earth_mass, R.string.unit_earth_mass_short), + NormalUnit(UnitID.mars_mass, BigDecimal("641693000000000000000000000"), UnitGroup.MASS, R.string.unit_mars_mass, R.string.unit_mars_mass_short), + NormalUnit(UnitID.jupiter_mass, BigDecimal("1898130000000000000000000000000"), UnitGroup.MASS, R.string.unit_jupiter_mass, R.string.unit_jupiter_mass_short), + NormalUnit(UnitID.saturn_mass, BigDecimal("568319000000000000000000000000"), UnitGroup.MASS, R.string.unit_saturn_mass, R.string.unit_saturn_mass_short), + NormalUnit(UnitID.uranus_mass, BigDecimal("86810300000000000000000000000"), UnitGroup.MASS, R.string.unit_uranus_mass, R.string.unit_uranus_mass_short), + NormalUnit(UnitID.neptune_mass, BigDecimal("102410000000000000000000000000"), UnitGroup.MASS, R.string.unit_neptune_mass, R.string.unit_neptune_mass_short), + NormalUnit(UnitID.sun_mass, BigDecimal("1989100000000000000000000000000000"), UnitGroup.MASS, R.string.unit_sun_mass, R.string.unit_sun_mass_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/NumberBase.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/NumberBase.kt index 03b7466e..09a5854a 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/NumberBase.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/NumberBase.kt @@ -19,28 +19,28 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NumberBaseUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val numberBaseCollection: List by lazy { listOf( - NumberBaseUnit(UnitID.binary, BigDecimal.valueOf(2.0), UnitGroup.NUMBER_BASE, R.string.unit_binary, R.string.unit_binary_short), - NumberBaseUnit(UnitID.ternary, BigDecimal.valueOf(3.0), UnitGroup.NUMBER_BASE, R.string.unit_ternary, R.string.unit_ternary_short), - NumberBaseUnit(UnitID.quaternary, BigDecimal.valueOf(4.0), UnitGroup.NUMBER_BASE, R.string.unit_quaternary, R.string.unit_quaternary_short), - NumberBaseUnit(UnitID.quinary, BigDecimal.valueOf(5.0), UnitGroup.NUMBER_BASE, R.string.unit_quinary, R.string.unit_quinary_short), - NumberBaseUnit(UnitID.senary, BigDecimal.valueOf(6.0), UnitGroup.NUMBER_BASE, R.string.unit_senary, R.string.unit_senary_short), - NumberBaseUnit(UnitID.septenary, BigDecimal.valueOf(7.0), UnitGroup.NUMBER_BASE, R.string.unit_septenary, R.string.unit_septenary_short), - NumberBaseUnit(UnitID.octal, BigDecimal.valueOf(8.0), UnitGroup.NUMBER_BASE, R.string.unit_octal, R.string.unit_octal_short), - NumberBaseUnit(UnitID.nonary, BigDecimal.valueOf(9.0), UnitGroup.NUMBER_BASE, R.string.unit_nonary, R.string.unit_nonary_short), - NumberBaseUnit(UnitID.decimal, BigDecimal.valueOf(10.0), UnitGroup.NUMBER_BASE, R.string.unit_decimal, R.string.unit_decimal_short), - NumberBaseUnit(UnitID.undecimal, BigDecimal.valueOf(11.0), UnitGroup.NUMBER_BASE, R.string.unit_undecimal, R.string.unit_undecimal_short), - NumberBaseUnit(UnitID.duodecimal, BigDecimal.valueOf(12.0), UnitGroup.NUMBER_BASE, R.string.unit_duodecimal, R.string.unit_duodecimal_short), - NumberBaseUnit(UnitID.tridecimal, BigDecimal.valueOf(13.0), UnitGroup.NUMBER_BASE, R.string.unit_tridecimal, R.string.unit_tridecimal_short), - NumberBaseUnit(UnitID.tetradecimal, BigDecimal.valueOf(14.0), UnitGroup.NUMBER_BASE, R.string.unit_tetradecimal, R.string.unit_tetradecimal_short), - NumberBaseUnit(UnitID.pentadecimal, BigDecimal.valueOf(15.0), UnitGroup.NUMBER_BASE, R.string.unit_pentadecimal, R.string.unit_pentadecimal_short), - NumberBaseUnit(UnitID.hexadecimal, BigDecimal.valueOf(16.0), UnitGroup.NUMBER_BASE, R.string.unit_hexadecimal, R.string.unit_hexadecimal_short), + NumberBaseUnit(UnitID.binary, BigDecimal("2.0"), UnitGroup.NUMBER_BASE, R.string.unit_binary, R.string.unit_binary_short), + NumberBaseUnit(UnitID.ternary, BigDecimal("3.0"), UnitGroup.NUMBER_BASE, R.string.unit_ternary, R.string.unit_ternary_short), + NumberBaseUnit(UnitID.quaternary, BigDecimal("4.0"), UnitGroup.NUMBER_BASE, R.string.unit_quaternary, R.string.unit_quaternary_short), + NumberBaseUnit(UnitID.quinary, BigDecimal("5.0"), UnitGroup.NUMBER_BASE, R.string.unit_quinary, R.string.unit_quinary_short), + NumberBaseUnit(UnitID.senary, BigDecimal("6.0"), UnitGroup.NUMBER_BASE, R.string.unit_senary, R.string.unit_senary_short), + NumberBaseUnit(UnitID.septenary, BigDecimal("7.0"), UnitGroup.NUMBER_BASE, R.string.unit_septenary, R.string.unit_septenary_short), + NumberBaseUnit(UnitID.octal, BigDecimal("8.0"), UnitGroup.NUMBER_BASE, R.string.unit_octal, R.string.unit_octal_short), + NumberBaseUnit(UnitID.nonary, BigDecimal("9.0"), UnitGroup.NUMBER_BASE, R.string.unit_nonary, R.string.unit_nonary_short), + NumberBaseUnit(UnitID.decimal, BigDecimal("10.0"), UnitGroup.NUMBER_BASE, R.string.unit_decimal, R.string.unit_decimal_short), + NumberBaseUnit(UnitID.undecimal, BigDecimal("11.0"), UnitGroup.NUMBER_BASE, R.string.unit_undecimal, R.string.unit_undecimal_short), + NumberBaseUnit(UnitID.duodecimal, BigDecimal("12.0"), UnitGroup.NUMBER_BASE, R.string.unit_duodecimal, R.string.unit_duodecimal_short), + NumberBaseUnit(UnitID.tridecimal, BigDecimal("13.0"), UnitGroup.NUMBER_BASE, R.string.unit_tridecimal, R.string.unit_tridecimal_short), + NumberBaseUnit(UnitID.tetradecimal, BigDecimal("14.0"), UnitGroup.NUMBER_BASE, R.string.unit_tetradecimal, R.string.unit_tetradecimal_short), + NumberBaseUnit(UnitID.pentadecimal, BigDecimal("15.0"), UnitGroup.NUMBER_BASE, R.string.unit_pentadecimal, R.string.unit_pentadecimal_short), + NumberBaseUnit(UnitID.hexadecimal, BigDecimal("16.0"), UnitGroup.NUMBER_BASE, R.string.unit_hexadecimal, R.string.unit_hexadecimal_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Power.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Power.kt index 5ed8b2b3..381ed636 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Power.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Power.kt @@ -19,18 +19,18 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val powerCollection: List by lazy { listOf( - NormalUnit(UnitID.attowatt, BigDecimal.valueOf(1), UnitGroup.POWER, R.string.unit_attowatt, R.string.unit_attowatt_short), - NormalUnit(UnitID.watt, BigDecimal.valueOf(1_000_000_000_000_000_000), UnitGroup.POWER, R.string.unit_watt, R.string.unit_watt_short), - NormalUnit(UnitID.kilowatt, BigDecimal.valueOf(1.0E+21), UnitGroup.POWER, R.string.unit_kilowatt, R.string.unit_kilowatt_short), - NormalUnit(UnitID.megawatt, BigDecimal.valueOf(1.0E+24), UnitGroup.POWER, R.string.unit_megawatt, R.string.unit_megawatt_short), - NormalUnit(UnitID.horse_power_mechanical, BigDecimal.valueOf(745_699_871_582_285_700_000.0), UnitGroup.POWER, R.string.unit_horse_power_mechanical, R.string.unit_horse_power_mechanical_short), + NormalUnit(UnitID.attowatt, BigDecimal("1"), UnitGroup.POWER, R.string.unit_attowatt, R.string.unit_attowatt_short), + NormalUnit(UnitID.watt, BigDecimal("1000000000000000000"), UnitGroup.POWER, R.string.unit_watt, R.string.unit_watt_short), + NormalUnit(UnitID.kilowatt, BigDecimal("1000000000000000000000"), UnitGroup.POWER, R.string.unit_kilowatt, R.string.unit_kilowatt_short), + NormalUnit(UnitID.megawatt, BigDecimal("1000000000000000000000000"), UnitGroup.POWER, R.string.unit_megawatt, R.string.unit_megawatt_short), + NormalUnit(UnitID.horse_power_mechanical, BigDecimal("745699871582285700000"), UnitGroup.POWER, R.string.unit_horse_power_mechanical, R.string.unit_horse_power_mechanical_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Prefix.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Prefix.kt index 2b3fd3e6..8a850c5d 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Prefix.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Prefix.kt @@ -19,38 +19,38 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal val prefixCollection: List by lazy { listOf( - NormalUnit(UnitID.prefix_quetta, BigDecimal.valueOf(1E+30), UnitGroup.PREFIX, R.string.unit_prefix_quetta, R.string.unit_prefix_quetta_short), - NormalUnit(UnitID.prefix_ronna, BigDecimal.valueOf(1E+27), UnitGroup.PREFIX, R.string.unit_prefix_ronna, R.string.unit_prefix_ronna_short), - NormalUnit(UnitID.prefix_yotta, BigDecimal.valueOf(1E+24), UnitGroup.PREFIX, R.string.unit_prefix_yotta, R.string.unit_prefix_yotta_short), - NormalUnit(UnitID.prefix_zetta, BigDecimal.valueOf(1E+21), UnitGroup.PREFIX, R.string.unit_prefix_zetta, R.string.unit_prefix_zetta_short), - NormalUnit(UnitID.prefix_exa, BigDecimal.valueOf(1E+18), UnitGroup.PREFIX, R.string.unit_prefix_exa, R.string.unit_prefix_exa_short), - NormalUnit(UnitID.prefix_peta, BigDecimal.valueOf(1E+15), UnitGroup.PREFIX, R.string.unit_prefix_peta, R.string.unit_prefix_peta_short), - NormalUnit(UnitID.prefix_tera, BigDecimal.valueOf(1E+12), UnitGroup.PREFIX, R.string.unit_prefix_tera, R.string.unit_prefix_tera_short), - NormalUnit(UnitID.prefix_giga, BigDecimal.valueOf(1E+9), UnitGroup.PREFIX, R.string.unit_prefix_giga, R.string.unit_prefix_giga_short), - NormalUnit(UnitID.prefix_mega, BigDecimal.valueOf(1E+6), UnitGroup.PREFIX, R.string.unit_prefix_mega, R.string.unit_prefix_mega_short), - NormalUnit(UnitID.prefix_kilo, BigDecimal.valueOf(1E+3), UnitGroup.PREFIX, R.string.unit_prefix_kilo, R.string.unit_prefix_kilo_short), - NormalUnit(UnitID.prefix_hecto, BigDecimal.valueOf(1E+2), UnitGroup.PREFIX, R.string.unit_prefix_hecto, R.string.unit_prefix_hecto_short), - NormalUnit(UnitID.prefix_deca, BigDecimal.valueOf(1E+1), UnitGroup.PREFIX, R.string.unit_prefix_deca, R.string.unit_prefix_deca_short), - NormalUnit(UnitID.prefix_base, BigDecimal.valueOf(1E+0), UnitGroup.PREFIX, R.string.unit_prefix_base, R.string.unit_prefix_base_short), - NormalUnit(UnitID.prefix_deci, BigDecimal.valueOf(1E-1), UnitGroup.PREFIX, R.string.unit_prefix_deci, R.string.unit_prefix_deci_short), - NormalUnit(UnitID.prefix_centi, BigDecimal.valueOf(1E-2), UnitGroup.PREFIX, R.string.unit_prefix_centi, R.string.unit_prefix_centi_short), - NormalUnit(UnitID.prefix_milli, BigDecimal.valueOf(1E-3), UnitGroup.PREFIX, R.string.unit_prefix_milli, R.string.unit_prefix_milli_short), - NormalUnit(UnitID.prefix_micro, BigDecimal.valueOf(1E-6), UnitGroup.PREFIX, R.string.unit_prefix_micro, R.string.unit_prefix_micro_short), - NormalUnit(UnitID.prefix_nano, BigDecimal.valueOf(1E-9), UnitGroup.PREFIX, R.string.unit_prefix_nano, R.string.unit_prefix_nano_short), - NormalUnit(UnitID.prefix_pico, BigDecimal.valueOf(1E-12), UnitGroup.PREFIX, R.string.unit_prefix_pico, R.string.unit_prefix_pico_short), - NormalUnit(UnitID.prefix_femto, BigDecimal.valueOf(1E-15), UnitGroup.PREFIX, R.string.unit_prefix_femto, R.string.unit_prefix_femto_short), - NormalUnit(UnitID.prefix_atto, BigDecimal.valueOf(1E-18), UnitGroup.PREFIX, R.string.unit_prefix_atto, R.string.unit_prefix_atto_short), - NormalUnit(UnitID.prefix_zepto, BigDecimal.valueOf(1E-21), UnitGroup.PREFIX, R.string.unit_prefix_zepto, R.string.unit_prefix_zepto_short), - NormalUnit(UnitID.prefix_yocto, BigDecimal.valueOf(1E-24), UnitGroup.PREFIX, R.string.unit_prefix_yocto, R.string.unit_prefix_yocto_short), - NormalUnit(UnitID.prefix_ronto, BigDecimal.valueOf(1E-27), UnitGroup.PREFIX, R.string.unit_prefix_ronto, R.string.unit_prefix_ronto_short), - NormalUnit(UnitID.prefix_quecto, BigDecimal.valueOf(1E-30), UnitGroup.PREFIX, R.string.unit_prefix_quecto, R.string.unit_prefix_quecto_short), + NormalUnit(UnitID.prefix_quetta, BigDecimal("1000000000000000000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_quetta, R.string.unit_prefix_quetta_short), + NormalUnit(UnitID.prefix_ronna, BigDecimal("1000000000000000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_ronna, R.string.unit_prefix_ronna_short), + NormalUnit(UnitID.prefix_yotta, BigDecimal("1000000000000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_yotta, R.string.unit_prefix_yotta_short), + NormalUnit(UnitID.prefix_zetta, BigDecimal("1000000000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_zetta, R.string.unit_prefix_zetta_short), + NormalUnit(UnitID.prefix_exa, BigDecimal("1000000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_exa, R.string.unit_prefix_exa_short), + NormalUnit(UnitID.prefix_peta, BigDecimal("1000000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_peta, R.string.unit_prefix_peta_short), + NormalUnit(UnitID.prefix_tera, BigDecimal("1000000000000"), UnitGroup.PREFIX, R.string.unit_prefix_tera, R.string.unit_prefix_tera_short), + NormalUnit(UnitID.prefix_giga, BigDecimal("1000000000"), UnitGroup.PREFIX, R.string.unit_prefix_giga, R.string.unit_prefix_giga_short), + NormalUnit(UnitID.prefix_mega, BigDecimal("1000000"), UnitGroup.PREFIX, R.string.unit_prefix_mega, R.string.unit_prefix_mega_short), + NormalUnit(UnitID.prefix_kilo, BigDecimal("1000"), UnitGroup.PREFIX, R.string.unit_prefix_kilo, R.string.unit_prefix_kilo_short), + NormalUnit(UnitID.prefix_hecto, BigDecimal("100"), UnitGroup.PREFIX, R.string.unit_prefix_hecto, R.string.unit_prefix_hecto_short), + NormalUnit(UnitID.prefix_deca, BigDecimal("10"), UnitGroup.PREFIX, R.string.unit_prefix_deca, R.string.unit_prefix_deca_short), + NormalUnit(UnitID.prefix_base, BigDecimal("1"), UnitGroup.PREFIX, R.string.unit_prefix_base, R.string.unit_prefix_base_short), + NormalUnit(UnitID.prefix_deci, BigDecimal("0.1"), UnitGroup.PREFIX, R.string.unit_prefix_deci, R.string.unit_prefix_deci_short), + NormalUnit(UnitID.prefix_centi, BigDecimal("0.01"), UnitGroup.PREFIX, R.string.unit_prefix_centi, R.string.unit_prefix_centi_short), + NormalUnit(UnitID.prefix_milli, BigDecimal("0.001"), UnitGroup.PREFIX, R.string.unit_prefix_milli, R.string.unit_prefix_milli_short), + NormalUnit(UnitID.prefix_micro, BigDecimal("0.000001"), UnitGroup.PREFIX, R.string.unit_prefix_micro, R.string.unit_prefix_micro_short), + NormalUnit(UnitID.prefix_nano, BigDecimal("0.000000001"), UnitGroup.PREFIX, R.string.unit_prefix_nano, R.string.unit_prefix_nano_short), + NormalUnit(UnitID.prefix_pico, BigDecimal("0.000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_pico, R.string.unit_prefix_pico_short), + NormalUnit(UnitID.prefix_femto, BigDecimal("0.000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_femto, R.string.unit_prefix_femto_short), + NormalUnit(UnitID.prefix_atto, BigDecimal("0.000000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_atto, R.string.unit_prefix_atto_short), + NormalUnit(UnitID.prefix_zepto, BigDecimal("0.000000000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_zepto, R.string.unit_prefix_zepto_short), + NormalUnit(UnitID.prefix_yocto, BigDecimal("0.000000000000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_yocto, R.string.unit_prefix_yocto_short), + NormalUnit(UnitID.prefix_ronto, BigDecimal("0.000000000000000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_ronto, R.string.unit_prefix_ronto_short), + NormalUnit(UnitID.prefix_quecto, BigDecimal("0.000000000000000000000000000001"), UnitGroup.PREFIX, R.string.unit_prefix_quecto, R.string.unit_prefix_quecto_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Pressure.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Pressure.kt index c2cca732..79379f53 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Pressure.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Pressure.kt @@ -27,35 +27,35 @@ import java.math.BigDecimal internal val pressureCollection: List by lazy { listOf( - NormalUnit(UnitID.attopascal, BigDecimal.valueOf(1), UnitGroup.PRESSURE, R.string.unit_attopascal, R.string.unit_attopascal_short), - NormalUnit(UnitID.femtopascal, BigDecimal.valueOf(1E+3), UnitGroup.PRESSURE, R.string.unit_femtopascal, R.string.unit_femtopascal_short), - NormalUnit(UnitID.picopascal, BigDecimal.valueOf(1E+6), UnitGroup.PRESSURE, R.string.unit_picopascal, R.string.unit_picopascal_short), - NormalUnit(UnitID.nanopascal, BigDecimal.valueOf(1E+9), UnitGroup.PRESSURE, R.string.unit_nanopascal, R.string.unit_nanopascal_short), - NormalUnit(UnitID.micropascal, BigDecimal.valueOf(1E+12), UnitGroup.PRESSURE, R.string.unit_micropascal, R.string.unit_micropascal_short), - NormalUnit(UnitID.millipascal, BigDecimal.valueOf(1E+15), UnitGroup.PRESSURE, R.string.unit_millipascal, R.string.unit_millipascal_short), - NormalUnit(UnitID.centipascal, BigDecimal.valueOf(1E+16), UnitGroup.PRESSURE, R.string.unit_centipascal, R.string.unit_centipascal_short), - NormalUnit(UnitID.decipascal, BigDecimal.valueOf(1E+17), UnitGroup.PRESSURE, R.string.unit_decipascal, R.string.unit_decipascal_short), - NormalUnit(UnitID.pascal, BigDecimal.valueOf(1E+18), UnitGroup.PRESSURE, R.string.unit_pascal, R.string.unit_pascal_short), - NormalUnit(UnitID.dekapascal, BigDecimal.valueOf(1E+19), UnitGroup.PRESSURE, R.string.unit_dekapascal, R.string.unit_dekapascal_short), - NormalUnit(UnitID.hectopascal, BigDecimal.valueOf(1E+20), UnitGroup.PRESSURE, R.string.unit_hectopascal, R.string.unit_hectopascal_short), - NormalUnit(UnitID.millibar, BigDecimal.valueOf(1E+20), UnitGroup.PRESSURE, R.string.unit_millibar, R.string.unit_millibar_short), - NormalUnit(UnitID.bar, BigDecimal.valueOf(1E+23), UnitGroup.PRESSURE, R.string.unit_bar, R.string.unit_bar_short), - NormalUnit(UnitID.kilopascal, BigDecimal.valueOf(1E+21), UnitGroup.PRESSURE, R.string.unit_kilopascal, R.string.unit_kilopascal_short), - NormalUnit(UnitID.megapascal, BigDecimal.valueOf(1E+24), UnitGroup.PRESSURE, R.string.unit_megapascal, R.string.unit_megapascal_short), - NormalUnit(UnitID.gigapascal, BigDecimal.valueOf(1E+27), UnitGroup.PRESSURE, R.string.unit_gigapascal, R.string.unit_gigapascal_short), - NormalUnit(UnitID.terapascal, BigDecimal.valueOf(1E+30), UnitGroup.PRESSURE, R.string.unit_terapascal, R.string.unit_terapascal_short), - NormalUnit(UnitID.petapascal, BigDecimal.valueOf(1E+33), UnitGroup.PRESSURE, R.string.unit_petapascal, R.string.unit_petapascal_short), - NormalUnit(UnitID.exapascal, BigDecimal.valueOf(1E+36), UnitGroup.PRESSURE, R.string.unit_exapascal, R.string.unit_exapascal_short), - NormalUnit(UnitID.psi, BigDecimal.valueOf(6.8947572931783E+21), UnitGroup.PRESSURE, R.string.unit_psi, R.string.unit_psi_short), - NormalUnit(UnitID.ksi, BigDecimal.valueOf(6.8947572931783E+24), UnitGroup.PRESSURE, R.string.unit_ksi, R.string.unit_ksi_short), - NormalUnit(UnitID.standard_atmosphere, BigDecimal.valueOf(101.325E+21), UnitGroup.PRESSURE, R.string.unit_standard_atmosphere, R.string.unit_standard_atmosphere_short), - NormalUnit(UnitID.torr, BigDecimal.valueOf(1.3332236842108281E+20), UnitGroup.PRESSURE, R.string.unit_torr, R.string.unit_torr_short), - NormalUnit(UnitID.micron_of_mercury, BigDecimal.valueOf(1.3332236842108281E+17), UnitGroup.PRESSURE, R.string.unit_micron_of_mercury, R.string.unit_micron_of_mercury_short), - NormalUnit(UnitID.millimeter_of_mercury, BigDecimal.valueOf(1.3332236842108281E+20), UnitGroup.PRESSURE, R.string.unit_millimeter_of_mercury, R.string.unit_millimeter_of_mercury_short), - NormalUnit(UnitID.kilogram_force_per_square_meter, BigDecimal.valueOf(9.80665E+18), UnitGroup.PRESSURE, R.string.unit_kilogram_force_per_square_meter, R.string.unit_kilogram_force_per_square_meter_short), - NormalUnit(UnitID.kilogram_force_per_square_centimeter, BigDecimal.valueOf(9.80665E+22), UnitGroup.PRESSURE, R.string.unit_kilogram_force_per_square_centimeter, R.string.unit_kilogram_force_per_square_centimeter_short), - NormalUnit(UnitID.gram_force_per_square_centimeter, BigDecimal.valueOf(9.80665E+19), UnitGroup.PRESSURE, R.string.unit_gram_force_per_square_centimeter, R.string.unit_gram_force_per_square_centimeter_short), - NormalUnit(UnitID.pound_force_per_square_foot, BigDecimal.valueOf(4.788025898E+19), UnitGroup.PRESSURE, R.string.unit_pound_force_per_square_foot, R.string.unit_pound_force_per_square_foot_short), - NormalUnit(UnitID.pound_force_per_square_inch, BigDecimal.valueOf(6.8947572931783E+21), UnitGroup.PRESSURE, R.string.unit_pound_force_per_square_inch, R.string.unit_pound_force_per_square_inch_short), + NormalUnit(UnitID.attopascal, BigDecimal("1"), UnitGroup.PRESSURE, R.string.unit_attopascal, R.string.unit_attopascal_short), + NormalUnit(UnitID.femtopascal, BigDecimal("1000"), UnitGroup.PRESSURE, R.string.unit_femtopascal, R.string.unit_femtopascal_short), + NormalUnit(UnitID.picopascal, BigDecimal("1000000"), UnitGroup.PRESSURE, R.string.unit_picopascal, R.string.unit_picopascal_short), + NormalUnit(UnitID.nanopascal, BigDecimal("1000000000"), UnitGroup.PRESSURE, R.string.unit_nanopascal, R.string.unit_nanopascal_short), + NormalUnit(UnitID.micropascal, BigDecimal("1000000000000"), UnitGroup.PRESSURE, R.string.unit_micropascal, R.string.unit_micropascal_short), + NormalUnit(UnitID.millipascal, BigDecimal("1000000000000000"), UnitGroup.PRESSURE, R.string.unit_millipascal, R.string.unit_millipascal_short), + NormalUnit(UnitID.centipascal, BigDecimal("10000000000000000"), UnitGroup.PRESSURE, R.string.unit_centipascal, R.string.unit_centipascal_short), + NormalUnit(UnitID.decipascal, BigDecimal("100000000000000000"), UnitGroup.PRESSURE, R.string.unit_decipascal, R.string.unit_decipascal_short), + NormalUnit(UnitID.pascal, BigDecimal("1000000000000000000"), UnitGroup.PRESSURE, R.string.unit_pascal, R.string.unit_pascal_short), + NormalUnit(UnitID.dekapascal, BigDecimal("10000000000000000000"), UnitGroup.PRESSURE, R.string.unit_dekapascal, R.string.unit_dekapascal_short), + NormalUnit(UnitID.hectopascal, BigDecimal("100000000000000000000"), UnitGroup.PRESSURE, R.string.unit_hectopascal, R.string.unit_hectopascal_short), + NormalUnit(UnitID.millibar, BigDecimal("100000000000000000000"), UnitGroup.PRESSURE, R.string.unit_millibar, R.string.unit_millibar_short), + NormalUnit(UnitID.bar, BigDecimal("100000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_bar, R.string.unit_bar_short), + NormalUnit(UnitID.kilopascal, BigDecimal("1000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_kilopascal, R.string.unit_kilopascal_short), + NormalUnit(UnitID.megapascal, BigDecimal("1000000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_megapascal, R.string.unit_megapascal_short), + NormalUnit(UnitID.gigapascal, BigDecimal("1000000000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_gigapascal, R.string.unit_gigapascal_short), + NormalUnit(UnitID.terapascal, BigDecimal("1000000000000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_terapascal, R.string.unit_terapascal_short), + NormalUnit(UnitID.petapascal, BigDecimal("1000000000000000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_petapascal, R.string.unit_petapascal_short), + NormalUnit(UnitID.exapascal, BigDecimal("1000000000000000000000000000000000000"), UnitGroup.PRESSURE, R.string.unit_exapascal, R.string.unit_exapascal_short), + NormalUnit(UnitID.psi, BigDecimal("6894757293178300000000"), UnitGroup.PRESSURE, R.string.unit_psi, R.string.unit_psi_short), + NormalUnit(UnitID.ksi, BigDecimal("6894757293178300000000000"), UnitGroup.PRESSURE, R.string.unit_ksi, R.string.unit_ksi_short), + NormalUnit(UnitID.standard_atmosphere, BigDecimal("101325000000000000000000"), UnitGroup.PRESSURE, R.string.unit_standard_atmosphere, R.string.unit_standard_atmosphere_short), + NormalUnit(UnitID.torr, BigDecimal("133322368421082810000"), UnitGroup.PRESSURE, R.string.unit_torr, R.string.unit_torr_short), + NormalUnit(UnitID.micron_of_mercury, BigDecimal("133322368421082810"), UnitGroup.PRESSURE, R.string.unit_micron_of_mercury, R.string.unit_micron_of_mercury_short), + NormalUnit(UnitID.millimeter_of_mercury, BigDecimal("133322368421082810000"), UnitGroup.PRESSURE, R.string.unit_millimeter_of_mercury, R.string.unit_millimeter_of_mercury_short), + NormalUnit(UnitID.kilogram_force_per_square_meter, BigDecimal("9806650000000000000"), UnitGroup.PRESSURE, R.string.unit_kilogram_force_per_square_meter, R.string.unit_kilogram_force_per_square_meter_short), + NormalUnit(UnitID.kilogram_force_per_square_centimeter, BigDecimal("98066500000000000000000"), UnitGroup.PRESSURE, R.string.unit_kilogram_force_per_square_centimeter, R.string.unit_kilogram_force_per_square_centimeter_short), + NormalUnit(UnitID.gram_force_per_square_centimeter, BigDecimal("98066500000000000000"), UnitGroup.PRESSURE, R.string.unit_gram_force_per_square_centimeter, R.string.unit_gram_force_per_square_centimeter_short), + NormalUnit(UnitID.pound_force_per_square_foot, BigDecimal("47880258980000000000"), UnitGroup.PRESSURE, R.string.unit_pound_force_per_square_foot, R.string.unit_pound_force_per_square_foot_short), + NormalUnit(UnitID.pound_force_per_square_inch, BigDecimal("6894757293178300000000"), UnitGroup.PRESSURE, R.string.unit_pound_force_per_square_inch, R.string.unit_pound_force_per_square_inch_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Speed.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Speed.kt index f9c066d4..6712989c 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Speed.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Speed.kt @@ -28,38 +28,38 @@ import java.math.BigDecimal internal val speedCollection: List by lazy { listOf( - NormalUnit( UnitID.millimeter_per_hour, BigDecimal.valueOf(1), UnitGroup.SPEED, R.string.unit_millimeter_per_hour, R.string.unit_millimeter_per_hour_short), - NormalUnit( UnitID.millimeter_per_minute, BigDecimal.valueOf(60), UnitGroup.SPEED, R.string.unit_millimeter_per_minute, R.string.unit_millimeter_per_minute_short), - NormalUnit( UnitID.millimeter_per_second, BigDecimal.valueOf(3_600), UnitGroup.SPEED, R.string.unit_millimeter_per_second, R.string.unit_millimeter_per_second_short), - NormalUnit( UnitID.centimeter_per_hour, BigDecimal.valueOf(10), UnitGroup.SPEED, R.string.unit_centimeter_per_hour, R.string.unit_centimeter_per_hour_short), - NormalUnit( UnitID.centimeter_per_minute, BigDecimal.valueOf(600), UnitGroup.SPEED, R.string.unit_centimeter_per_minute, R.string.unit_centimeter_per_minute_short), - NormalUnit( UnitID.centimeter_per_second, BigDecimal.valueOf(36_000), UnitGroup.SPEED, R.string.unit_centimeter_per_second, R.string.unit_centimeter_per_second_short), - NormalUnit( UnitID.meter_per_hour, BigDecimal.valueOf(1_000), UnitGroup.SPEED, R.string.unit_meter_per_hour, R.string.unit_meter_per_hour_short), - NormalUnit( UnitID.meter_per_minute, BigDecimal.valueOf(60_000), UnitGroup.SPEED, R.string.unit_meter_per_minute, R.string.unit_meter_per_minute_short), - NormalUnit( UnitID.meter_per_second, BigDecimal.valueOf(3_600_000), UnitGroup.SPEED, R.string.unit_meter_per_second, R.string.unit_meter_per_second_short), - NormalUnit( UnitID.kilometer_per_hour, BigDecimal.valueOf(1_000_000), UnitGroup.SPEED, R.string.unit_kilometer_per_hour, R.string.unit_kilometer_per_hour_short), - NormalUnit( UnitID.kilometer_per_minute, BigDecimal.valueOf(60_000_000), UnitGroup.SPEED, R.string.unit_kilometer_per_minute, R.string.unit_kilometer_per_minute_short), - NormalUnit( UnitID.kilometer_per_second, BigDecimal.valueOf(3_600_000_000), UnitGroup.SPEED, R.string.unit_kilometer_per_second, R.string.unit_kilometer_per_second_short), - NormalUnit( UnitID.foot_per_hour, BigDecimal.valueOf(304.8), UnitGroup.SPEED, R.string.unit_foot_per_hour, R.string.unit_foot_per_hour_short), - NormalUnit( UnitID.foot_per_minute, BigDecimal.valueOf(18_288), UnitGroup.SPEED, R.string.unit_foot_per_minute, R.string.unit_foot_per_minute_short), - NormalUnit( UnitID.foot_per_second, BigDecimal.valueOf(1_097_280), UnitGroup.SPEED, R.string.unit_foot_per_second, R.string.unit_foot_per_second_short), - NormalUnit( UnitID.yard_per_hour, BigDecimal.valueOf(914.4), UnitGroup.SPEED, R.string.unit_yard_per_hour, R.string.unit_yard_per_hour_short), - NormalUnit( UnitID.yard_per_minute, BigDecimal.valueOf(54_864), UnitGroup.SPEED, R.string.unit_yard_per_minute, R.string.unit_yard_per_minute_short), - NormalUnit( UnitID.yard_per_second, BigDecimal.valueOf(3_291_840), UnitGroup.SPEED, R.string.unit_yard_per_second, R.string.unit_yard_per_second_short), - NormalUnit( UnitID.mile_per_hour, BigDecimal.valueOf(1_609_344), UnitGroup.SPEED, R.string.unit_mile_per_hour, R.string.unit_mile_per_hour_short), - NormalUnit( UnitID.mile_per_minute, BigDecimal.valueOf(96_560_640), UnitGroup.SPEED, R.string.unit_mile_per_minute, R.string.unit_mile_per_minute_short), - NormalUnit( UnitID.mile_per_second, BigDecimal.valueOf(5_793_638_400), UnitGroup.SPEED, R.string.unit_mile_per_second, R.string.unit_mile_per_second_short), - BackwardUnit(UnitID.minute_per_kilometer, BigDecimal.valueOf(60_000_000), UnitGroup.SPEED, R.string.unit_minute_per_kilometer, R.string.unit_minute_per_kilometer_short), - BackwardUnit(UnitID.minute_per_mile, BigDecimal.valueOf(96_560_640), UnitGroup.SPEED, R.string.unit_minute_per_mile, R.string.unit_minute_per_mile_short), - BackwardUnit(UnitID.hour_per_kilometer, BigDecimal.valueOf(1_000_000), UnitGroup.SPEED, R.string.unit_hour_per_kilometer, R.string.unit_hour_per_kilometer_short), - BackwardUnit(UnitID.hour_per_mile, BigDecimal.valueOf(1_609_344), UnitGroup.SPEED, R.string.unit_hour_per_mile, R.string.unit_hour_per_mile_short), - NormalUnit( UnitID.knot, BigDecimal.valueOf(1_852_000), UnitGroup.SPEED, R.string.unit_knot, R.string.unit_knot_short), - NormalUnit( UnitID.velocity_of_light_in_vacuum, BigDecimal.valueOf(1_079_252_848_799_998), UnitGroup.SPEED, R.string.unit_velocity_of_light_in_vacuum, R.string.unit_velocity_of_light_in_vacuum_short), - NormalUnit( UnitID.cosmic_velocity_first, BigDecimal.valueOf(28_440_000_000), UnitGroup.SPEED, R.string.unit_cosmic_velocity_first, R.string.unit_cosmic_velocity_first_short), - NormalUnit( UnitID.cosmic_velocity_second, BigDecimal.valueOf(40_320_000_000), UnitGroup.SPEED, R.string.unit_cosmic_velocity_second, R.string.unit_cosmic_velocity_second_short), - NormalUnit( UnitID.cosmic_velocity_third, BigDecimal.valueOf(60_012_000_000), UnitGroup.SPEED, R.string.unit_cosmic_velocity_third, R.string.unit_cosmic_velocity_third_short), - NormalUnit( UnitID.earths_orbital_speed, BigDecimal.valueOf(107_154_000_000), UnitGroup.SPEED, R.string.unit_earths_orbital_speed, R.string.unit_earths_orbital_speed_short), - NormalUnit( UnitID.mach, BigDecimal.valueOf(1_236_960_000), UnitGroup.SPEED, R.string.unit_mach, R.string.unit_mach_short), - NormalUnit( UnitID.mach_si_standard, BigDecimal.valueOf(1_062_167_040), UnitGroup.SPEED, R.string.unit_mach_si_standard, R.string.unit_mach_si_standard_short), + NormalUnit( UnitID.millimeter_per_hour, BigDecimal("1"), UnitGroup.SPEED, R.string.unit_millimeter_per_hour, R.string.unit_millimeter_per_hour_short), + NormalUnit( UnitID.millimeter_per_minute, BigDecimal("60"), UnitGroup.SPEED, R.string.unit_millimeter_per_minute, R.string.unit_millimeter_per_minute_short), + NormalUnit( UnitID.millimeter_per_second, BigDecimal("3600"), UnitGroup.SPEED, R.string.unit_millimeter_per_second, R.string.unit_millimeter_per_second_short), + NormalUnit( UnitID.centimeter_per_hour, BigDecimal("10"), UnitGroup.SPEED, R.string.unit_centimeter_per_hour, R.string.unit_centimeter_per_hour_short), + NormalUnit( UnitID.centimeter_per_minute, BigDecimal("600"), UnitGroup.SPEED, R.string.unit_centimeter_per_minute, R.string.unit_centimeter_per_minute_short), + NormalUnit( UnitID.centimeter_per_second, BigDecimal("36000"), UnitGroup.SPEED, R.string.unit_centimeter_per_second, R.string.unit_centimeter_per_second_short), + NormalUnit( UnitID.meter_per_hour, BigDecimal("1000"), UnitGroup.SPEED, R.string.unit_meter_per_hour, R.string.unit_meter_per_hour_short), + NormalUnit( UnitID.meter_per_minute, BigDecimal("60000"), UnitGroup.SPEED, R.string.unit_meter_per_minute, R.string.unit_meter_per_minute_short), + NormalUnit( UnitID.meter_per_second, BigDecimal("3600000"), UnitGroup.SPEED, R.string.unit_meter_per_second, R.string.unit_meter_per_second_short), + NormalUnit( UnitID.kilometer_per_hour, BigDecimal("1000000"), UnitGroup.SPEED, R.string.unit_kilometer_per_hour, R.string.unit_kilometer_per_hour_short), + NormalUnit( UnitID.kilometer_per_minute, BigDecimal("60000000"), UnitGroup.SPEED, R.string.unit_kilometer_per_minute, R.string.unit_kilometer_per_minute_short), + NormalUnit( UnitID.kilometer_per_second, BigDecimal("3600000000"), UnitGroup.SPEED, R.string.unit_kilometer_per_second, R.string.unit_kilometer_per_second_short), + NormalUnit( UnitID.foot_per_hour, BigDecimal("304.8"), UnitGroup.SPEED, R.string.unit_foot_per_hour, R.string.unit_foot_per_hour_short), + NormalUnit( UnitID.foot_per_minute, BigDecimal("18288"), UnitGroup.SPEED, R.string.unit_foot_per_minute, R.string.unit_foot_per_minute_short), + NormalUnit( UnitID.foot_per_second, BigDecimal("1097280"), UnitGroup.SPEED, R.string.unit_foot_per_second, R.string.unit_foot_per_second_short), + NormalUnit( UnitID.yard_per_hour, BigDecimal("914.4"), UnitGroup.SPEED, R.string.unit_yard_per_hour, R.string.unit_yard_per_hour_short), + NormalUnit( UnitID.yard_per_minute, BigDecimal("54864"), UnitGroup.SPEED, R.string.unit_yard_per_minute, R.string.unit_yard_per_minute_short), + NormalUnit( UnitID.yard_per_second, BigDecimal("3291840"), UnitGroup.SPEED, R.string.unit_yard_per_second, R.string.unit_yard_per_second_short), + NormalUnit( UnitID.mile_per_hour, BigDecimal("1609344"), UnitGroup.SPEED, R.string.unit_mile_per_hour, R.string.unit_mile_per_hour_short), + NormalUnit( UnitID.mile_per_minute, BigDecimal("96560640"), UnitGroup.SPEED, R.string.unit_mile_per_minute, R.string.unit_mile_per_minute_short), + NormalUnit( UnitID.mile_per_second, BigDecimal("5793638400"), UnitGroup.SPEED, R.string.unit_mile_per_second, R.string.unit_mile_per_second_short), + BackwardUnit(UnitID.minute_per_kilometer, BigDecimal("60000000"), UnitGroup.SPEED, R.string.unit_minute_per_kilometer, R.string.unit_minute_per_kilometer_short), + BackwardUnit(UnitID.minute_per_mile, BigDecimal("96560640"), UnitGroup.SPEED, R.string.unit_minute_per_mile, R.string.unit_minute_per_mile_short), + BackwardUnit(UnitID.hour_per_kilometer, BigDecimal("1000000"), UnitGroup.SPEED, R.string.unit_hour_per_kilometer, R.string.unit_hour_per_kilometer_short), + BackwardUnit(UnitID.hour_per_mile, BigDecimal("1609344"), UnitGroup.SPEED, R.string.unit_hour_per_mile, R.string.unit_hour_per_mile_short), + NormalUnit( UnitID.knot, BigDecimal("1852000"), UnitGroup.SPEED, R.string.unit_knot, R.string.unit_knot_short), + NormalUnit( UnitID.velocity_of_light_in_vacuum, BigDecimal("1079252848799998"), UnitGroup.SPEED, R.string.unit_velocity_of_light_in_vacuum, R.string.unit_velocity_of_light_in_vacuum_short), + NormalUnit( UnitID.cosmic_velocity_first, BigDecimal("28440000000"), UnitGroup.SPEED, R.string.unit_cosmic_velocity_first, R.string.unit_cosmic_velocity_first_short), + NormalUnit( UnitID.cosmic_velocity_second, BigDecimal("40320000000"), UnitGroup.SPEED, R.string.unit_cosmic_velocity_second, R.string.unit_cosmic_velocity_second_short), + NormalUnit( UnitID.cosmic_velocity_third, BigDecimal("60012000000"), UnitGroup.SPEED, R.string.unit_cosmic_velocity_third, R.string.unit_cosmic_velocity_third_short), + NormalUnit( UnitID.earths_orbital_speed, BigDecimal("107154000000"), UnitGroup.SPEED, R.string.unit_earths_orbital_speed, R.string.unit_earths_orbital_speed_short), + NormalUnit( UnitID.mach, BigDecimal("1236960000"), UnitGroup.SPEED, R.string.unit_mach, R.string.unit_mach_short), + NormalUnit( UnitID.mach_si_standard, BigDecimal("1062167040"), UnitGroup.SPEED, R.string.unit_mach_si_standard, R.string.unit_mach_si_standard_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Temperature.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Temperature.kt index bdbef2b0..5ede22af 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Temperature.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Temperature.kt @@ -20,10 +20,10 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.MAX_PRECISION import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.TemperatureUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal import java.math.RoundingMode @@ -40,14 +40,14 @@ internal val temperatureCollection: List by lazy { UnitID.fahrenheit -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .times(BigDecimal.valueOf(1.8)) - .plus(BigDecimal(32)) + .times(BigDecimal("1.8")) + .plus(BigDecimal("32")) } UnitID.kelvin -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .plus(BigDecimal.valueOf(273.15)) + .plus(BigDecimal("273.15")) } else -> value @@ -65,17 +65,17 @@ internal val temperatureCollection: List by lazy { UnitID.celsius -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(32)) - .times(BigDecimal(5)) - .div(BigDecimal(9)) + .minus(BigDecimal("32")) + .times(BigDecimal("5")) + .div(BigDecimal("9")) } UnitID.kelvin -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(32)) - .times(BigDecimal(5)) - .div(BigDecimal(9)) - .add(BigDecimal.valueOf(273.15)) + .minus(BigDecimal("32")) + .times(BigDecimal("5")) + .div(BigDecimal("9")) + .add(BigDecimal("273.15")) } else -> value } @@ -92,14 +92,14 @@ internal val temperatureCollection: List by lazy { UnitID.celsius -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(273.15)) + .minus(BigDecimal("273.15")) } UnitID.fahrenheit -> { value .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal.valueOf(273.15)) - .times(BigDecimal.valueOf(1.8)) - .plus(BigDecimal(32)) + .minus(BigDecimal("273.15")) + .times(BigDecimal("1.8")) + .plus(BigDecimal("32")) } else -> value } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Time.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Time.kt index 3c9c4c13..b6da3f8c 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Time.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Time.kt @@ -19,23 +19,23 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal internal val timeCollection: List by lazy { listOf( - NormalUnit(UnitID.attosecond, BigDecimal.valueOf(1), UnitGroup.TIME, R.string.unit_attosecond, R.string.unit_attosecond_short), - NormalUnit(UnitID.nanosecond, BigDecimal.valueOf(1_000_000_000), UnitGroup.TIME, R.string.unit_nanosecond, R.string.unit_nanosecond_short), - NormalUnit(UnitID.microsecond, BigDecimal.valueOf(1_000_000_000_000), UnitGroup.TIME, R.string.unit_microsecond, R.string.unit_microsecond_short), - NormalUnit(UnitID.millisecond, BigDecimal.valueOf(1_000_000_000_000_000), UnitGroup.TIME, R.string.unit_millisecond, R.string.unit_millisecond_short), - NormalUnit(UnitID.jiffy, BigDecimal.valueOf(10_000_000_000_000_000), UnitGroup.TIME, R.string.unit_jiffy, R.string.unit_jiffy_short), - NormalUnit(UnitID.second, BigDecimal.valueOf(1_000_000_000_000_000_000), UnitGroup.TIME, R.string.unit_second, R.string.unit_second_short), - NormalUnit(UnitID.minute, BigDecimal.valueOf(60_000_000_000_000_000_000.0), UnitGroup.TIME, R.string.unit_minute, R.string.unit_minute_short), - NormalUnit(UnitID.hour, BigDecimal.valueOf(3_600_000_000_000_000_000_000.0), UnitGroup.TIME, R.string.unit_hour, R.string.unit_hour_short), - NormalUnit(UnitID.day, BigDecimal.valueOf(86_400_000_000_000_000_000_000.0), UnitGroup.TIME, R.string.unit_day, R.string.unit_day_short), - NormalUnit(UnitID.week, BigDecimal.valueOf(604_800_000_000_000_000_000_000.0), UnitGroup.TIME, R.string.unit_week, R.string.unit_week_short), + NormalUnit(UnitID.attosecond, BigDecimal("1"), UnitGroup.TIME, R.string.unit_attosecond, R.string.unit_attosecond_short), + NormalUnit(UnitID.nanosecond, BigDecimal("1000000000"), UnitGroup.TIME, R.string.unit_nanosecond, R.string.unit_nanosecond_short), + NormalUnit(UnitID.microsecond, BigDecimal("1000000000000"), UnitGroup.TIME, R.string.unit_microsecond, R.string.unit_microsecond_short), + NormalUnit(UnitID.millisecond, BigDecimal("1000000000000000"), UnitGroup.TIME, R.string.unit_millisecond, R.string.unit_millisecond_short), + NormalUnit(UnitID.jiffy, BigDecimal("10000000000000000"), UnitGroup.TIME, R.string.unit_jiffy, R.string.unit_jiffy_short), + NormalUnit(UnitID.second, BigDecimal("1000000000000000000"), UnitGroup.TIME, R.string.unit_second, R.string.unit_second_short), + NormalUnit(UnitID.minute, BigDecimal("60000000000000000000"), UnitGroup.TIME, R.string.unit_minute, R.string.unit_minute_short), + NormalUnit(UnitID.hour, BigDecimal("3600000000000000000000"), UnitGroup.TIME, R.string.unit_hour, R.string.unit_hour_short), + NormalUnit(UnitID.day, BigDecimal("86400000000000000000000"), UnitGroup.TIME, R.string.unit_day, R.string.unit_day_short), + NormalUnit(UnitID.week, BigDecimal("604800000000000000000000"), UnitGroup.TIME, R.string.unit_week, R.string.unit_week_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Torque.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Torque.kt index dc2bb25e..9eb39b50 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Torque.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Torque.kt @@ -19,30 +19,30 @@ package com.sadellie.unitto.data.converter.collections import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.converter.UnitID import java.math.BigDecimal val torqueCollection: List by lazy { listOf( - NormalUnit(UnitID.dyne_millimeter, BigDecimal.valueOf(1), UnitGroup.TORQUE, R.string.unit_dyne_millimeter, R.string.unit_dyne_millimeter_short), - NormalUnit(UnitID.dyne_centimeter, BigDecimal.valueOf(10), UnitGroup.TORQUE, R.string.unit_dyne_centimeter, R.string.unit_dyne_centimeter_short), - NormalUnit(UnitID.dyne_meter, BigDecimal.valueOf(1000), UnitGroup.TORQUE, R.string.unit_dyne_meter, R.string.unit_dyne_meter_short), - NormalUnit(UnitID.newton_millimeter, BigDecimal.valueOf(100000), UnitGroup.TORQUE, R.string.unit_newton_millimeter, R.string.unit_newton_millimeter_short), - NormalUnit(UnitID.newton_centimeter, BigDecimal.valueOf(1000000), UnitGroup.TORQUE, R.string.unit_newton_centimeter, R.string.unit_newton_centimeter_short), - NormalUnit(UnitID.newton_meter, BigDecimal.valueOf(100000000), UnitGroup.TORQUE, R.string.unit_newton_meter, R.string.unit_newton_meter_short), - NormalUnit(UnitID.kilonewton_meter, BigDecimal.valueOf(100000000000), UnitGroup.TORQUE, R.string.unit_kilonewton_meter, R.string.unit_kilonewton_meter_short), - NormalUnit(UnitID.gram_force_millimeter, BigDecimal.valueOf(980.665), UnitGroup.TORQUE, R.string.unit_gram_force_millimeter, R.string.unit_gram_force_millimeter_short), - NormalUnit(UnitID.gram_force_centimeter, BigDecimal.valueOf(9806.65), UnitGroup.TORQUE, R.string.unit_gram_force_centimeter, R.string.unit_gram_force_centimeter_short), - NormalUnit(UnitID.kilogram_force_millimeter, BigDecimal.valueOf(980665), UnitGroup.TORQUE, R.string.unit_kilogram_force_millimeter, R.string.unit_kilogram_force_millimeter_short), - NormalUnit(UnitID.gram_force_meter, BigDecimal.valueOf(980665), UnitGroup.TORQUE, R.string.unit_gram_force_meter, R.string.unit_gram_force_meter_short), - NormalUnit(UnitID.kilogram_force_centimeter, BigDecimal.valueOf(9806650), UnitGroup.TORQUE, R.string.unit_kilogram_force_centimeter, R.string.unit_kilogram_force_centimeter_short), - NormalUnit(UnitID.kilogram_force_meter, BigDecimal.valueOf(980665000), UnitGroup.TORQUE, R.string.unit_kilogram_force_meter, R.string.unit_kilogram_force_meter_short), - NormalUnit(UnitID.ounce_force_foot, BigDecimal.valueOf(8473862.4), UnitGroup.TORQUE, R.string.unit_ounce_force_foot, R.string.unit_ounce_force_foot_short), - NormalUnit(UnitID.ounce_force_inch, BigDecimal.valueOf(706155.2), UnitGroup.TORQUE, R.string.unit_ounce_force_inch, R.string.unit_ounce_force_inch_short), - NormalUnit(UnitID.pound_force_foot, BigDecimal.valueOf(135581800), UnitGroup.TORQUE, R.string.unit_pound_force_foot, R.string.unit_pound_force_foot_short), - NormalUnit(UnitID.pound_force_inch, BigDecimal.valueOf(1.1298483333333334E7), UnitGroup.TORQUE, R.string.unit_pound_force_inch, R.string.unit_pound_force_inch_short), + NormalUnit(UnitID.dyne_millimeter, BigDecimal("1"), UnitGroup.TORQUE, R.string.unit_dyne_millimeter, R.string.unit_dyne_millimeter_short), + NormalUnit(UnitID.dyne_centimeter, BigDecimal("10"), UnitGroup.TORQUE, R.string.unit_dyne_centimeter, R.string.unit_dyne_centimeter_short), + NormalUnit(UnitID.dyne_meter, BigDecimal("1000"), UnitGroup.TORQUE, R.string.unit_dyne_meter, R.string.unit_dyne_meter_short), + NormalUnit(UnitID.newton_millimeter, BigDecimal("100000"), UnitGroup.TORQUE, R.string.unit_newton_millimeter, R.string.unit_newton_millimeter_short), + NormalUnit(UnitID.newton_centimeter, BigDecimal("1000000"), UnitGroup.TORQUE, R.string.unit_newton_centimeter, R.string.unit_newton_centimeter_short), + NormalUnit(UnitID.newton_meter, BigDecimal("100000000"), UnitGroup.TORQUE, R.string.unit_newton_meter, R.string.unit_newton_meter_short), + NormalUnit(UnitID.kilonewton_meter, BigDecimal("100000000000"), UnitGroup.TORQUE, R.string.unit_kilonewton_meter, R.string.unit_kilonewton_meter_short), + NormalUnit(UnitID.gram_force_millimeter, BigDecimal("980.665"), UnitGroup.TORQUE, R.string.unit_gram_force_millimeter, R.string.unit_gram_force_millimeter_short), + NormalUnit(UnitID.gram_force_centimeter, BigDecimal("9806.65"), UnitGroup.TORQUE, R.string.unit_gram_force_centimeter, R.string.unit_gram_force_centimeter_short), + NormalUnit(UnitID.kilogram_force_millimeter, BigDecimal("980665"), UnitGroup.TORQUE, R.string.unit_kilogram_force_millimeter, R.string.unit_kilogram_force_millimeter_short), + NormalUnit(UnitID.gram_force_meter, BigDecimal("980665"), UnitGroup.TORQUE, R.string.unit_gram_force_meter, R.string.unit_gram_force_meter_short), + NormalUnit(UnitID.kilogram_force_centimeter, BigDecimal("9806650"), UnitGroup.TORQUE, R.string.unit_kilogram_force_centimeter, R.string.unit_kilogram_force_centimeter_short), + NormalUnit(UnitID.kilogram_force_meter, BigDecimal("980665000"), UnitGroup.TORQUE, R.string.unit_kilogram_force_meter, R.string.unit_kilogram_force_meter_short), + NormalUnit(UnitID.ounce_force_foot, BigDecimal("8473862.4"), UnitGroup.TORQUE, R.string.unit_ounce_force_foot, R.string.unit_ounce_force_foot_short), + NormalUnit(UnitID.ounce_force_inch, BigDecimal("706155.2"), UnitGroup.TORQUE, R.string.unit_ounce_force_inch, R.string.unit_ounce_force_inch_short), + NormalUnit(UnitID.pound_force_foot, BigDecimal("135581800"), UnitGroup.TORQUE, R.string.unit_pound_force_foot, R.string.unit_pound_force_foot_short), + NormalUnit(UnitID.pound_force_inch, BigDecimal("11298483.333333334"), UnitGroup.TORQUE, R.string.unit_pound_force_inch, R.string.unit_pound_force_inch_short), ) } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Volume.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Volume.kt index 894eb1ef..c32b456b 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Volume.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/collections/Volume.kt @@ -27,30 +27,30 @@ import java.math.BigDecimal internal val volumeCollection: List by lazy { listOf( - NormalUnit(UnitID.attoliter, BigDecimal.valueOf(1), UnitGroup.VOLUME, R.string.unit_attoliter, R.string.unit_attoliter_short), - NormalUnit(UnitID.milliliter, BigDecimal.valueOf(1_000_000_000_000_000), UnitGroup.VOLUME, R.string.unit_milliliter, R.string.unit_milliliter_short), - NormalUnit(UnitID.liter, BigDecimal.valueOf(1_000_000_000_000_000_000), UnitGroup.VOLUME, R.string.unit_liter, R.string.unit_liter_short), - NormalUnit(UnitID.us_liquid_gallon, BigDecimal.valueOf(3_785_411_783_999_977_000), UnitGroup.VOLUME, R.string.unit_us_liquid_gallon, R.string.unit_us_liquid_gallon_short), - NormalUnit(UnitID.us_liquid_quart, BigDecimal.valueOf(946_352_945_999_994_200), UnitGroup.VOLUME, R.string.unit_us_liquid_quart, R.string.unit_us_liquid_quart_short), - NormalUnit(UnitID.us_liquid_pint, BigDecimal.valueOf(473_176_472_999_997_100), UnitGroup.VOLUME, R.string.unit_us_liquid_pint, R.string.unit_us_liquid_pint_short), - NormalUnit(UnitID.us_legal_cup, BigDecimal.valueOf(236_588_236_499_998_560), UnitGroup.VOLUME, R.string.unit_us_legal_cup, R.string.unit_us_legal_cup_short), - NormalUnit(UnitID.us_fluid_ounce, BigDecimal.valueOf(29_573_529_562_499_996), UnitGroup.VOLUME, R.string.unit_us_fluid_ounce, R.string.unit_us_fluid_ounce_short), - NormalUnit(UnitID.us_tablespoon, BigDecimal.valueOf(14_786_764_781_249_998), UnitGroup.VOLUME, R.string.unit_us_tablespoon, R.string.unit_us_tablespoon_short), - NormalUnit(UnitID.us_teaspoon, BigDecimal.valueOf(4_928_921_593_749_952), UnitGroup.VOLUME, R.string.unit_us_teaspoon, R.string.unit_us_teaspoon_short), - NormalUnit(UnitID.imperial_gallon, BigDecimal.valueOf(4_546_089_999_999_954_400), UnitGroup.VOLUME, R.string.unit_imperial_gallon, R.string.unit_imperial_gallon_short), - NormalUnit(UnitID.imperial_quart, BigDecimal.valueOf(1_136_522_500_000_001_400), UnitGroup.VOLUME, R.string.unit_imperial_quart, R.string.unit_imperial_quart_short), - NormalUnit(UnitID.imperial_pint, BigDecimal.valueOf(568_261_250_000_000_700), UnitGroup.VOLUME, R.string.unit_imperial_pint, R.string.unit_imperial_pint_short), - NormalUnit(UnitID.imperial_cup, BigDecimal.valueOf(284_130_625_000_000_350), UnitGroup.VOLUME, R.string.unit_imperial_cup, R.string.unit_imperial_cup_short), - NormalUnit(UnitID.imperial_fluid_ounce, BigDecimal.valueOf(28_413_062_500_000_036), UnitGroup.VOLUME, R.string.unit_imperial_fluid_ounce, R.string.unit_imperial_fluid_ounce_short), - NormalUnit(UnitID.imperial_tablespoon, BigDecimal.valueOf(17_758_164_062_500_148), UnitGroup.VOLUME, R.string.unit_imperial_tablespoon, R.string.unit_imperial_tablespoon_short), - NormalUnit(UnitID.imperial_teaspoon, BigDecimal.valueOf(5_919_388_020_833_314), UnitGroup.VOLUME, R.string.unit_imperial_teaspoon, R.string.unit_imperial_teaspoon_short), - NormalUnit(UnitID.cubic_millimeter, BigDecimal.valueOf(1_000_000_000_000), UnitGroup.VOLUME, R.string.unit_cubic_millimeter, R.string.unit_cubic_millimeter_short), - NormalUnit(UnitID.cubic_centimeter, BigDecimal.valueOf(1_000_000_000_000_000), UnitGroup.VOLUME, R.string.unit_cubic_centimeter, R.string.unit_cubic_centimeter_short), - NormalUnit(UnitID.cubic_meter, BigDecimal.valueOf(1.0E+21), UnitGroup.VOLUME, R.string.unit_cubic_meter, R.string.unit_cubic_meter_short), - NormalUnit(UnitID.cubic_kilometer, BigDecimal.valueOf(1.0E+30), UnitGroup.VOLUME, R.string.unit_cubic_kilometer, R.string.unit_cubic_kilometer_short), - NormalUnit(UnitID.cubic_inch, BigDecimal.valueOf(1.6387064E+16), UnitGroup.VOLUME, R.string.unit_cubic_inch, R.string.unit_cubic_inch_short), - NormalUnit(UnitID.cubic_foot, BigDecimal.valueOf(2.831684659E+19), UnitGroup.VOLUME, R.string.unit_cubic_foot, R.string.unit_cubic_foot_short), - NormalUnit(UnitID.cubic_yard, BigDecimal.valueOf(7.645548579839955E+20), UnitGroup.VOLUME, R.string.unit_cubic_yard, R.string.unit_cubic_yard_short), - NormalUnit(UnitID.cubic_mile, BigDecimal.valueOf(4.168181825440539E+30), UnitGroup.VOLUME, R.string.unit_cubic_mile, R.string.unit_cubic_mile_short), + NormalUnit(UnitID.attoliter, BigDecimal("1"), UnitGroup.VOLUME, R.string.unit_attoliter, R.string.unit_attoliter_short), + NormalUnit(UnitID.milliliter, BigDecimal("1000000000000000"), UnitGroup.VOLUME, R.string.unit_milliliter, R.string.unit_milliliter_short), + NormalUnit(UnitID.liter, BigDecimal("1000000000000000000"), UnitGroup.VOLUME, R.string.unit_liter, R.string.unit_liter_short), + NormalUnit(UnitID.us_liquid_gallon, BigDecimal("3785411783999977000"), UnitGroup.VOLUME, R.string.unit_us_liquid_gallon, R.string.unit_us_liquid_gallon_short), + NormalUnit(UnitID.us_liquid_quart, BigDecimal("946352945999994200"), UnitGroup.VOLUME, R.string.unit_us_liquid_quart, R.string.unit_us_liquid_quart_short), + NormalUnit(UnitID.us_liquid_pint, BigDecimal("473176472999997100"), UnitGroup.VOLUME, R.string.unit_us_liquid_pint, R.string.unit_us_liquid_pint_short), + NormalUnit(UnitID.us_legal_cup, BigDecimal("236588236499998560"), UnitGroup.VOLUME, R.string.unit_us_legal_cup, R.string.unit_us_legal_cup_short), + NormalUnit(UnitID.us_fluid_ounce, BigDecimal("29573529562499996"), UnitGroup.VOLUME, R.string.unit_us_fluid_ounce, R.string.unit_us_fluid_ounce_short), + NormalUnit(UnitID.us_tablespoon, BigDecimal("14786764781249998"), UnitGroup.VOLUME, R.string.unit_us_tablespoon, R.string.unit_us_tablespoon_short), + NormalUnit(UnitID.us_teaspoon, BigDecimal("4928921593749952"), UnitGroup.VOLUME, R.string.unit_us_teaspoon, R.string.unit_us_teaspoon_short), + NormalUnit(UnitID.imperial_gallon, BigDecimal("4546089999999954400"), UnitGroup.VOLUME, R.string.unit_imperial_gallon, R.string.unit_imperial_gallon_short), + NormalUnit(UnitID.imperial_quart, BigDecimal("1136522500000001400"), UnitGroup.VOLUME, R.string.unit_imperial_quart, R.string.unit_imperial_quart_short), + NormalUnit(UnitID.imperial_pint, BigDecimal("568261250000000700"), UnitGroup.VOLUME, R.string.unit_imperial_pint, R.string.unit_imperial_pint_short), + NormalUnit(UnitID.imperial_cup, BigDecimal("284130625000000350"), UnitGroup.VOLUME, R.string.unit_imperial_cup, R.string.unit_imperial_cup_short), + NormalUnit(UnitID.imperial_fluid_ounce, BigDecimal("28413062500000036"), UnitGroup.VOLUME, R.string.unit_imperial_fluid_ounce, R.string.unit_imperial_fluid_ounce_short), + NormalUnit(UnitID.imperial_tablespoon, BigDecimal("17758164062500148"), UnitGroup.VOLUME, R.string.unit_imperial_tablespoon, R.string.unit_imperial_tablespoon_short), + NormalUnit(UnitID.imperial_teaspoon, BigDecimal("5919388020833314"), UnitGroup.VOLUME, R.string.unit_imperial_teaspoon, R.string.unit_imperial_teaspoon_short), + NormalUnit(UnitID.cubic_millimeter, BigDecimal("1000000000000"), UnitGroup.VOLUME, R.string.unit_cubic_millimeter, R.string.unit_cubic_millimeter_short), + NormalUnit(UnitID.cubic_centimeter, BigDecimal("1000000000000000"), UnitGroup.VOLUME, R.string.unit_cubic_centimeter, R.string.unit_cubic_centimeter_short), + NormalUnit(UnitID.cubic_meter, BigDecimal("1000000000000000000000"), UnitGroup.VOLUME, R.string.unit_cubic_meter, R.string.unit_cubic_meter_short), + NormalUnit(UnitID.cubic_kilometer, BigDecimal("1000000000000000000000000000000"), UnitGroup.VOLUME, R.string.unit_cubic_kilometer, R.string.unit_cubic_kilometer_short), + NormalUnit(UnitID.cubic_inch, BigDecimal("16387064000000000"), UnitGroup.VOLUME, R.string.unit_cubic_inch, R.string.unit_cubic_inch_short), + NormalUnit(UnitID.cubic_foot, BigDecimal("28316846590000000000"), UnitGroup.VOLUME, R.string.unit_cubic_foot, R.string.unit_cubic_foot_short), + NormalUnit(UnitID.cubic_yard, BigDecimal("764554857983995500000"), UnitGroup.VOLUME, R.string.unit_cubic_yard, R.string.unit_cubic_yard_short), + NormalUnit(UnitID.cubic_mile, BigDecimal("4168181825440539000000000000000"), UnitGroup.VOLUME, R.string.unit_cubic_mile, R.string.unit_cubic_mile_short), ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt index 8561deed..c9dd489f 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt @@ -148,13 +148,13 @@ private fun UnitFromSelectorScreen( private fun UnitFromSelectorScreenPreview() { val units: Map> = mapOf( UnitGroup.LENGTH to listOf( - NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), - NormalUnit(UnitID.kilometer, BigDecimal.valueOf(1.0E+21), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), - NormalUnit(UnitID.nautical_mile, BigDecimal.valueOf(1.852E+21), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), - NormalUnit(UnitID.inch, BigDecimal.valueOf(25_400_000_000_000_000), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), - NormalUnit(UnitID.foot, BigDecimal.valueOf(304_800_000_000_002_200), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), - NormalUnit(UnitID.yard, BigDecimal.valueOf(914_400_000_000_006_400), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), - NormalUnit(UnitID.mile, BigDecimal.valueOf(1_609_344_000_000_010_500_000.0), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), + NormalUnit(UnitID.meter, BigDecimal("1000000000000000000"), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), + NormalUnit(UnitID.kilometer, BigDecimal("1000000000000000000000"), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), + NormalUnit(UnitID.nautical_mile, BigDecimal("1852000000000000000000"), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), + NormalUnit(UnitID.inch, BigDecimal("25400000000000000"), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), + NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), + NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), + NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), ) ) diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt index 55df0e29..ae918bf6 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt @@ -168,13 +168,13 @@ private fun formatUnitToSupportLabel( private fun UnitToSelectorPreview() { val units: Map> = mapOf( UnitGroup.LENGTH to listOf( - NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), - NormalUnit(UnitID.kilometer, BigDecimal.valueOf(1.0E+21), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), - NormalUnit(UnitID.nautical_mile, BigDecimal.valueOf(1.852E+21), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), - NormalUnit(UnitID.inch, BigDecimal.valueOf(25_400_000_000_000_000), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), - NormalUnit(UnitID.foot, BigDecimal.valueOf(304_800_000_000_002_200), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), - NormalUnit(UnitID.yard, BigDecimal.valueOf(914_400_000_000_006_400), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), - NormalUnit(UnitID.mile, BigDecimal.valueOf(1_609_344_000_000_010_500_000.0), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), + NormalUnit(UnitID.meter, BigDecimal("1000000000000000000"), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), + NormalUnit(UnitID.kilometer, BigDecimal("1000000000000000000000"), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), + NormalUnit(UnitID.nautical_mile, BigDecimal("1852000000000000000000"), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), + NormalUnit(UnitID.inch, BigDecimal("25400000000000000"), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), + NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), + NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), + NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), ) ) diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt index 16c1b169..743c5316 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt @@ -91,13 +91,13 @@ private fun PreviewUnitsList() { val resources = LocalContext.current.resources val groupedUnits: Map> = mapOf( UnitGroup.LENGTH to listOf( - NormalUnit(UnitID.meter, BigDecimal.valueOf(1.0E+18), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), - NormalUnit(UnitID.kilometer, BigDecimal.valueOf(1.0E+21), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), - NormalUnit(UnitID.nautical_mile, BigDecimal.valueOf(1.852E+21), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), - NormalUnit(UnitID.inch, BigDecimal.valueOf(25_400_000_000_000_000), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), - NormalUnit(UnitID.foot, BigDecimal.valueOf(304_800_000_000_002_200), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), - NormalUnit(UnitID.yard, BigDecimal.valueOf(914_400_000_000_006_400), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), - NormalUnit(UnitID.mile, BigDecimal.valueOf(1_609_344_000_000_010_500_000.0), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), + NormalUnit(UnitID.meter, BigDecimal("1000000000000000000"), UnitGroup.LENGTH, R.string.unit_meter, R.string.unit_meter_short), + NormalUnit(UnitID.kilometer, BigDecimal("1000000000000000000000"), UnitGroup.LENGTH, R.string.unit_kilometer, R.string.unit_kilometer_short), + NormalUnit(UnitID.nautical_mile, BigDecimal("1852000000000000000000"), UnitGroup.LENGTH, R.string.unit_nautical_mile, R.string.unit_nautical_mile_short), + NormalUnit(UnitID.inch, BigDecimal("25400000000000000"), UnitGroup.LENGTH, R.string.unit_inch, R.string.unit_inch_short), + NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), + NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), + NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), ) ) diff --git a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt index fc99362e..b1632226 100644 --- a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt +++ b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt @@ -33,7 +33,7 @@ class ConverterUIStateKtTest { @Test fun format() { val formatterSymbols = FormatterSymbols.Spaces - var basicValue = BigDecimal.valueOf(1) + var basicValue = BigDecimal("1") val mContext: Context = RuntimeEnvironment.getApplication().applicationContext fun String.formatTime() = formatTime(basicValue.multiply(BigDecimal(this))) @@ -44,14 +44,14 @@ class ConverterUIStateKtTest { Assert.assertEquals("−0.05as", "-0.05".formatTime()) Assert.assertEquals("0", "0".formatTime()) - basicValue = BigDecimal.valueOf(86_400_000_000_000_000_000_000.0) + basicValue = BigDecimal("86400000000000000000000") Assert.assertEquals("−28d", "-28".formatTime()) Assert.assertEquals("−1h 12m", "-0.05".formatTime()) Assert.assertEquals("0", "0".formatTime()) Assert.assertEquals("0", "-0".formatTime()) // DAYS - basicValue = BigDecimal.valueOf(86_400_000_000_000_000_000_000.0) + basicValue = BigDecimal("86400000000000000000000") Assert.assertEquals("12h", "0.5".formatTime()) Assert.assertEquals("1h 12m", "0.05".formatTime()) Assert.assertEquals("7m 12s", "0.005".formatTime()) @@ -61,7 +61,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("90d 7m 12s", "90.005".formatTime()) // HOURS - basicValue = BigDecimal.valueOf(3_600_000_000_000_000_000_000.0) + basicValue = BigDecimal("3600000000000000000000") Assert.assertEquals("30m", "0.5".formatTime()) Assert.assertEquals("3m", "0.05".formatTime()) Assert.assertEquals("18s", "0.005".formatTime()) @@ -71,7 +71,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("3d 18h 18s", "90.005".formatTime()) // MINUTES - basicValue = BigDecimal.valueOf(60_000_000_000_000_000_000.0) + basicValue = BigDecimal("60000000000000000000") Assert.assertEquals("30s", "0.5".formatTime()) Assert.assertEquals("3s", "0.05".formatTime()) Assert.assertEquals("300ms", "0.005".formatTime()) @@ -81,7 +81,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("1h 30m 300ms", "90.005".formatTime()) // SECONDS - basicValue = BigDecimal.valueOf(1_000_000_000_000_000_000) + basicValue = BigDecimal("1000000000000000000") Assert.assertEquals("500ms", "0.5".formatTime()) Assert.assertEquals("50ms", "0.05".formatTime()) Assert.assertEquals("5ms", "0.005".formatTime()) @@ -91,7 +91,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("1m 30s 5ms", "90.005".formatTime()) // MILLISECONDS - basicValue = BigDecimal.valueOf(1_000_000_000_000_000) + basicValue = BigDecimal("1000000000000000") Assert.assertEquals("500µs", "0.5".formatTime()) Assert.assertEquals("50µs", "0.05".formatTime()) Assert.assertEquals("5µs", "0.005".formatTime()) @@ -101,7 +101,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("90ms 5µs", "90.005".formatTime()) // MICROSECONDS - basicValue = BigDecimal.valueOf(1_000_000_000_000) + basicValue = BigDecimal("1000000000000") Assert.assertEquals("500ns", "0.5".formatTime()) Assert.assertEquals("50ns", "0.05".formatTime()) Assert.assertEquals("5ns", "0.005".formatTime()) @@ -111,7 +111,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("90µs 5ns", "90.005".formatTime()) // NANOSECONDS - basicValue = BigDecimal.valueOf(1_000_000_000) + basicValue = BigDecimal("1000000000") Assert.assertEquals("500 000 000as", "0.5".formatTime()) Assert.assertEquals("50 000 000as", "0.05".formatTime()) Assert.assertEquals("5 000 000as", "0.005".formatTime()) @@ -121,7 +121,7 @@ class ConverterUIStateKtTest { Assert.assertEquals("90ns 5 000 000as", "90.005".formatTime()) // ATTOSECONDS - basicValue = BigDecimal.valueOf(1) + basicValue = BigDecimal("1") Assert.assertEquals("0.5as", "0.5".formatTime()) Assert.assertEquals("0.05as", "0.05".formatTime()) Assert.assertEquals("0.005as", "0.005".formatTime()) From 263a1139dcc1f8afe18a2e82f86fd94f7aa919df Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 12 Feb 2024 22:12:07 +0300 Subject: [PATCH 18/46] Refactor FormatterSymbols closes #90 --- .../{Separator.kt => FormatterSymbols.kt} | 16 +- .../com/sadellie/unitto/core/base/Token.kt | 4 + core/base/src/main/res/values/strings.xml | 2 + .../unitto/core/base/SeparatorTest.kt | 45 --- .../sadellie/unitto/core/base/TokenTest.kt | 10 +- .../common/textfield/ClipboardManagerExt.kt | 1 + .../common/textfield/ExpressionTransformer.kt | 1 + .../common/textfield/FixedInputTextFIeld.kt | 1 + .../common/textfield/FormatterExtensions.kt | 1 + .../ui/common/textfield/FormatterSymbols.kt | 46 --- .../ui/common/textfield/InputTextField.kt | 1 + .../core/ui/CleanAndFilterExpression.kt | 26 +- .../core/ui/ExpressionTransformerTest.kt | 5 +- .../unitto/core/ui/FormatterExpressionTest.kt | 9 +- .../repository/UserPreferencesRepository.kt | 2 +- .../model/userprefs/AddSubtractPreferences.kt | 4 +- .../model/userprefs/BodyMassPreferences.kt | 4 +- .../model/userprefs/CalculatorPreferences.kt | 4 +- .../model/userprefs/ConverterPreferences.kt | 3 +- .../model/userprefs/FormattingPreferences.kt | 4 +- .../unitto/data/userprefs/PreferenceExt.kt | 20 +- .../unitto/data/userprefs/PreferenceModels.kt | 11 +- .../unitto/data/userprefs/PrefsKeys.kt | 2 + ...es.kt => UserPreferencesRepositoryImpl.kt} | 18 +- .../unitto/feature/bodymass/BodyMassScreen.kt | 5 +- .../feature/bodymass/BodyMassViewModel.kt | 3 +- .../unitto/feature/bodymass/UIState.kt | 2 +- .../bodymass/components/BodyMassResult.kt | 5 +- .../calculator/CalculatorScreenTest.kt | 7 +- .../feature/calculator/CalculatorScreen.kt | 5 +- .../feature/calculator/CalculatorUIState.kt | 2 +- .../feature/calculator/CalculatorViewModel.kt | 3 +- .../components/CalculatorKeyboard.kt | 13 +- .../calculator/components/HistoryList.kt | 5 +- .../feature/calculator/components/TextBox.kt | 2 +- .../feature/converter/ConverterScreen.kt | 4 +- .../feature/converter/ConverterUIState.kt | 2 +- .../feature/converter/ConverterViewModel.kt | 3 +- .../feature/converter/UnitSelectorUIState.kt | 2 +- .../converter/UnitSelectorViewModel.kt | 3 +- .../feature/converter/UnitToSelectorScreen.kt | 5 +- .../converter/components/ConverterKeyboard.kt | 7 +- .../converter/ConverterUIStateKtTest.kt | 5 +- .../addsubtract/AddSubtractUIState.kt | 5 +- .../addsubtract/AddSubtractViewModel.kt | 3 +- .../difference/DateDifferencePage.kt | 5 +- .../difference/DateDifferenceViewModel.kt | 3 +- .../difference/DifferenceUIState.kt | 2 +- .../feature/glance/glance/CalculatorWidget.kt | 5 +- .../calculator/CalculatorSettingsScreen.kt | 5 +- .../converter/ConverterSettingsScreen.kt | 5 +- .../settings/formatting/FormattingScreen.kt | 286 ++++++++++-------- .../settings/formatting/FormattingUIState.kt | 3 +- .../formatting/FormattingViewModel.kt | 10 +- 54 files changed, 323 insertions(+), 332 deletions(-) rename core/base/src/main/java/com/sadellie/unitto/core/base/{Separator.kt => FormatterSymbols.kt} (73%) delete mode 100644 core/base/src/test/java/com/sadellie/unitto/core/base/SeparatorTest.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterSymbols.kt rename data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/{UserPreferences.kt => UserPreferencesRepositoryImpl.kt} (94%) diff --git a/core/base/src/main/java/com/sadellie/unitto/core/base/Separator.kt b/core/base/src/main/java/com/sadellie/unitto/core/base/FormatterSymbols.kt similarity index 73% rename from core/base/src/main/java/com/sadellie/unitto/core/base/Separator.kt rename to core/base/src/main/java/com/sadellie/unitto/core/base/FormatterSymbols.kt index b5559383..8281ec1d 100644 --- a/core/base/src/main/java/com/sadellie/unitto/core/base/Separator.kt +++ b/core/base/src/main/java/com/sadellie/unitto/core/base/FormatterSymbols.kt @@ -1,6 +1,6 @@ /* * Unitto is a calculator for Android - * Copyright (c) 2022-2024 Elshan Agaev + * 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 @@ -19,10 +19,12 @@ package com.sadellie.unitto.core.base /** - * Separators mean symbols that separate fractional part + * Formatter symbols. Always use [Token]. + * + * @property grouping Symbol fpr thousands separator. + * @property fractional Symbol decimal separator. */ -object Separator { - const val SPACE = 0 - const val PERIOD = 1 - const val COMMA = 2 -} +data class FormatterSymbols( + val grouping: String, + val fractional: String, +) 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 index fbc9f5d6..d7ed1d75 100644 --- 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 @@ -20,6 +20,10 @@ package com.sadellie.unitto.core.base @Suppress("ObjectPropertyName") object Token { + const val SPACE = " " + const val PERIOD = "." + const val COMMA = "," + object Digit { const val _1 = "1" const val _2 = "2" diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index dc3ef0bb..c9818640 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -245,6 +245,7 @@ Alternatively you can use "Export" --> Currency rates are updated daily. There\'s no real-time market monitoring in the app Wrong currency rates? Dark + Decimal separator Disable unit group Display App look and feel @@ -301,6 +302,7 @@ Maybe this can be labeled better? Let me know. It should be something that can d Use system font for texts in app Terms and Conditions Third party licenses + Thousands separator Settings Translate this app Join POEditor project to help diff --git a/core/base/src/test/java/com/sadellie/unitto/core/base/SeparatorTest.kt b/core/base/src/test/java/com/sadellie/unitto/core/base/SeparatorTest.kt deleted file mode 100644 index cf101bda..00000000 --- a/core/base/src/test/java/com/sadellie/unitto/core/base/SeparatorTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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.base - -import org.junit.Assert -import org.junit.Test - -class SeparatorTest { - - @Test - fun testExists() { - Assert.assertNotNull(Separator) - } - - @Test - fun testSeparatorSpace() { - Assert.assertEquals(0, Separator.SPACE) - } - - @Test - fun testSeparatorPeriod() { - Assert.assertEquals(1, Separator.PERIOD) - } - - @Test - fun testSeparatorComma() { - Assert.assertEquals(2, Separator.COMMA) - } -} \ No newline at end of file diff --git a/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt b/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt index 376d25d7..63f7fa3d 100644 --- a/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt +++ b/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt @@ -22,6 +22,14 @@ import org.junit.Assert import org.junit.Test class TokenTest { + + @Test + fun testFormatterSymbols() { + Assert.assertEquals(" ", Token.SPACE) + Assert.assertEquals(".", Token.PERIOD) + Assert.assertEquals(",", Token.COMMA) + } + @Test fun testDigit() { Assert.assertEquals("1234567890", Token.Digit.all.joinToString("")) @@ -126,7 +134,7 @@ class TokenTest { "e", ).joinToString("") - Assert.assertEquals("1234567890.$operator$func$consts", Token.expressionTokens.joinToString("")) + Assert.assertEquals("1234567890.$operator$func${consts}E", Token.expressionTokens.joinToString("")) } @Test diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt index 600d5efb..a11ef8e8 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt @@ -21,6 +21,7 @@ package com.sadellie.unitto.core.ui.common.textfield import android.content.ClipData import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.text.AnnotatedString +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.Token /** diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt index ea9fa187..2c0812b9 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.OffsetMapping import androidx.compose.ui.text.input.TransformedText import androidx.compose.ui.text.input.VisualTransformation +import com.sadellie.unitto.core.base.FormatterSymbols class ExpressionTransformer(private val formatterSymbols: FormatterSymbols) : VisualTransformation { diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt index e7306ff8..79a37aac 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextAlign +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.ui.theme.LocalNumberTypography @Composable diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt index 75bd31ef..cbf6a1ae 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt @@ -18,6 +18,7 @@ package com.sadellie.unitto.core.ui.common.textfield +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.Token private val numbersRegex by lazy { Regex("[\\d.]+") } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterSymbols.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterSymbols.kt deleted file mode 100644 index a1462edd..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterSymbols.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Unitto is a calculator for Android - * Copyright (c) 2023-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 com.sadellie.unitto.core.base.Separator - -sealed class FormatterSymbols(val grouping: String, val fractional: String) { - data object Spaces : FormatterSymbols(" ", ".") - data object Period : FormatterSymbols(".", ",") - data object Comma : FormatterSymbols(",", ".") -} - -object AllFormatterSymbols { - private val allFormatterSymbols by lazy { - hashMapOf( - Separator.SPACE to FormatterSymbols.Spaces, - Separator.PERIOD to FormatterSymbols.Period, - Separator.COMMA to FormatterSymbols.Comma - ) - } - - /** - * Defaults to [FormatterSymbols.Spaces] if not found. - * - * @see Separator - */ - fun getById(separator: Int): FormatterSymbols { - return allFormatterSymbols.getOrElse(separator) { FormatterSymbols.Spaces } - } -} diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt index 4ebc36b5..c8ce2e52 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt @@ -44,6 +44,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.TextUnit +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.ui.common.autosize.AutoSizeTextStyleBox import com.sadellie.unitto.core.ui.theme.LocalNumberTypography diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt index 147e7a97..0fc30be9 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt @@ -18,40 +18,44 @@ package com.sadellie.unitto.core.ui -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.clearAndFilterExpression import org.junit.Assert.assertEquals import org.junit.Test class CleanAndFilterExpression { + + private val formatterSymbols = FormatterSymbols(Token.COMMA, Token.PERIOD) + @Test fun noAdditionalSymbols() { - assertEquals("123", "123".clearAndFilterExpression(FormatterSymbols.Comma)) - assertEquals("123.456", "123.456".clearAndFilterExpression(FormatterSymbols.Comma)) + assertEquals("123", "123".clearAndFilterExpression(formatterSymbols)) + assertEquals("123.456", "123.456".clearAndFilterExpression(formatterSymbols)) } @Test fun hasFormatterSymbol() { - assertEquals("123456", "123,456".clearAndFilterExpression(FormatterSymbols.Comma)) - assertEquals("123456.789", "123,456.789".clearAndFilterExpression(FormatterSymbols.Comma)) + assertEquals("123456", "123,456".clearAndFilterExpression(formatterSymbols)) + assertEquals("123456.789", "123,456.789".clearAndFilterExpression(formatterSymbols)) } @Test fun hasWrongFormatterSymbol() { - assertEquals("123456", "123 456".clearAndFilterExpression(FormatterSymbols.Comma)) - assertEquals("123456.789", "123 456.789".clearAndFilterExpression(FormatterSymbols.Comma)) + assertEquals("123456", "123 456".clearAndFilterExpression(formatterSymbols)) + assertEquals("123456.789", "123 456.789".clearAndFilterExpression(formatterSymbols)) } @Test fun fractionExpression() { - assertEquals("1600+1234÷56789", "1,600 1234⁄56789".clearAndFilterExpression(FormatterSymbols.Comma)) - assertEquals("123456.789+1234÷56789", "123,456.789 1234⁄56789".clearAndFilterExpression(FormatterSymbols.Comma)) + assertEquals("1600+1234÷56789", "1,600 1234⁄56789".clearAndFilterExpression(formatterSymbols)) + assertEquals("123456.789+1234÷56789", "123,456.789 1234⁄56789".clearAndFilterExpression(formatterSymbols)) } @Test fun garbage() { // 'e' is a known symbol - assertEquals("eeee−123", "pee pee poo poo -123".clearAndFilterExpression(FormatterSymbols.Comma)) - assertEquals("eeee−123.456", "pee pee poo poo -123.456".clearAndFilterExpression(FormatterSymbols.Comma)) + assertEquals("eeee−123", "pee pee poo poo -123".clearAndFilterExpression(formatterSymbols)) + assertEquals("eeee−123.456", "pee pee poo poo -123.456".clearAndFilterExpression(formatterSymbols)) } } diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/ExpressionTransformerTest.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/ExpressionTransformerTest.kt index cc86d390..6cb5bc56 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/ExpressionTransformerTest.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/ExpressionTransformerTest.kt @@ -18,14 +18,15 @@ package com.sadellie.unitto.core.ui +import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.ExpressionTransformer -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import org.junit.Assert.assertEquals import org.junit.Test class ExpressionTransformerTest { - private val expr = ExpressionTransformer(FormatterSymbols.Comma) + private val expr = ExpressionTransformer(FormatterSymbols(Token.COMMA, Token.PERIOD)) // Use "|" for cursor private fun origToTrans(orig: String, trans: String) { diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt index 6179d129..038e33fa 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt @@ -18,7 +18,8 @@ package com.sadellie.unitto.core.ui -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.formatExpression import org.junit.Assert.assertEquals import org.junit.Test @@ -40,7 +41,7 @@ class FormatterExpressionTest { @Test fun setSeparatorSpaces() { - fun String.format(): String = formatExpression(FormatterSymbols.Spaces) + fun String.format(): String = formatExpression(FormatterSymbols(Token.SPACE, Token.PERIOD)) assertEquals("123E+21", ENG_VALUE.format()) assertEquals("123.3E+21", ENG_VALUE_FRACTIONAL.format()) assertEquals("123E+21+(123 456.789)", ENG_VALUE_EXPRESSION.format()) @@ -57,7 +58,7 @@ class FormatterExpressionTest { @Test fun setSeparatorComma() { - fun String.format(): String = formatExpression(FormatterSymbols.Comma) + fun String.format(): String = formatExpression(FormatterSymbols(Token.COMMA, Token.PERIOD)) assertEquals("123E+21", ENG_VALUE.format()) assertEquals("123.3E+21", ENG_VALUE_FRACTIONAL.format()) assertEquals("123E+21+(123,456.789)", ENG_VALUE_EXPRESSION.format()) @@ -74,7 +75,7 @@ class FormatterExpressionTest { @Test fun setSeparatorPeriod() { - fun String.format(): String = formatExpression(FormatterSymbols.Period) + fun String.format(): String = formatExpression(FormatterSymbols(Token.PERIOD, Token.COMMA)) assertEquals("123E+21", ENG_VALUE.format()) assertEquals("123,3E+21", ENG_VALUE_FRACTIONAL.format()) assertEquals("123E+21+(123.456,789)", ENG_VALUE_EXPRESSION.format()) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt index a88a5dbd..d1304343 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt @@ -51,7 +51,7 @@ interface UserPreferencesRepository { suspend fun updateDigitsPrecision(precision: Int) - suspend fun updateSeparator(separator: Int) + suspend fun updateFormatterSymbols(grouping: String, fractional: String) suspend fun updateOutputFormat(outputFormat: Int) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt index 4a86b10f..25684b2a 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt @@ -18,6 +18,8 @@ package com.sadellie.unitto.data.model.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols + interface AddSubtractPreferences{ - val separator: Int + val formatterSymbols: FormatterSymbols } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt index 8a389033..b841cdf3 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt @@ -18,6 +18,8 @@ package com.sadellie.unitto.data.model.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols + interface BodyMassPreferences{ - val separator: Int + val formatterSymbols: FormatterSymbols } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt index c4aa4611..44f063ae 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt @@ -18,9 +18,11 @@ package com.sadellie.unitto.data.model.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols + interface CalculatorPreferences { val radianMode: Boolean - val separator: Int + val formatterSymbols: FormatterSymbols val middleZero: Boolean val acButton: Boolean val partialHistoryView: Boolean diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/ConverterPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/ConverterPreferences.kt index b4526f6d..bde5dbd1 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/ConverterPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/ConverterPreferences.kt @@ -18,11 +18,12 @@ package com.sadellie.unitto.data.model.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting interface ConverterPreferences { - val separator: Int + val formatterSymbols: FormatterSymbols val middleZero: Boolean val acButton: Boolean val precision: Int diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt index b39dce0f..dcbbb3d8 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt @@ -18,8 +18,10 @@ package com.sadellie.unitto.data.model.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols + interface FormattingPreferences{ val digitsPrecision: Int - val separator: Int + val formatterSymbols: FormatterSymbols val outputFormat: Int } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index 7e222bb3..15e54fbd 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -19,8 +19,9 @@ package com.sadellie.unitto.data.userprefs import androidx.datastore.preferences.core.Preferences +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat -import com.sadellie.unitto.core.base.Separator +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.base.TopLevelDestinations import com.sadellie.unitto.data.converter.UnitID import com.sadellie.unitto.data.model.UnitGroup @@ -76,8 +77,21 @@ internal fun Preferences.getRadianMode(): Boolean { return this[PrefsKeys.RADIAN_MODE] ?: true } -internal fun Preferences.getSeparator(): Int { - return this[PrefsKeys.SEPARATOR] ?: Separator.SPACE +internal fun Preferences.getFormatterSymbols(): FormatterSymbols { + val grouping = this[PrefsKeys.FORMATTER_GROUPING] + val fractional = this[PrefsKeys.FORMATTER_FRACTIONAL] + + // Updating from older version or fresh install + // TODO Remove in the future + if ((grouping == null) or (fractional == null)) { + return when(this[PrefsKeys.SEPARATOR] ?: 0) { + 0 -> FormatterSymbols(Token.SPACE, Token.PERIOD) + 1 -> FormatterSymbols(Token.PERIOD, Token.COMMA) + else -> FormatterSymbols(Token.COMMA, Token.PERIOD) + } + } + + return FormatterSymbols(grouping ?: Token.SPACE, fractional ?: Token.PERIOD) } internal fun Preferences.getMiddleZero(): Boolean { diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt index 6b152cde..53bfaa16 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt @@ -18,6 +18,7 @@ package com.sadellie.unitto.data.userprefs +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.userprefs.AboutPreferences @@ -53,7 +54,7 @@ data class GeneralPreferencesImpl( data class CalculatorPreferencesImpl( override val radianMode: Boolean, - override val separator: Int, + override val formatterSymbols: FormatterSymbols, override val middleZero: Boolean, override val acButton: Boolean, override val partialHistoryView: Boolean, @@ -62,7 +63,7 @@ data class CalculatorPreferencesImpl( ) : CalculatorPreferences data class ConverterPreferencesImpl( - override val separator: Int, + override val formatterSymbols: FormatterSymbols, override val middleZero: Boolean, override val acButton: Boolean, override val precision: Int, @@ -84,7 +85,7 @@ data class DisplayPreferencesImpl( data class FormattingPreferencesImpl( override val digitsPrecision: Int, - override val separator: Int, + override val formatterSymbols: FormatterSymbols, override val outputFormat: Int, ) : FormattingPreferences @@ -93,11 +94,11 @@ data class UnitGroupsPreferencesImpl( ) : UnitGroupsPreferences data class AddSubtractPreferencesImpl( - override val separator: Int, + override val formatterSymbols: FormatterSymbols, ) : AddSubtractPreferences data class BodyMassPreferencesImpl( - override val separator: Int, + override val formatterSymbols: FormatterSymbols, ) : BodyMassPreferences data class AboutPreferencesImpl( diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt index 0c65ccce..8d38aae7 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt @@ -42,6 +42,8 @@ object PrefsKeys { // FORMATTER val DIGITS_PRECISION = intPreferencesKey("DIGITS_PRECISION_PREF_KEY") val SEPARATOR = intPreferencesKey("SEPARATOR_PREF_KEY") + val FORMATTER_GROUPING = stringPreferencesKey("FORMATTER_GROUPING_PREF_KEY") + val FORMATTER_FRACTIONAL = stringPreferencesKey("FORMATTER_FRACTIONAL_PREF_KEY") val OUTPUT_FORMAT = intPreferencesKey("OUTPUT_FORMAT_PREF_KEY") // CALCULATOR diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt similarity index 94% rename from data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt rename to data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt index 6d8a97f3..0619eb07 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt @@ -78,7 +78,7 @@ class UserPreferencesRepositoryImpl @Inject constructor( .map { preferences -> CalculatorPreferencesImpl( radianMode = preferences.getRadianMode(), - separator = preferences.getSeparator(), + formatterSymbols = preferences.getFormatterSymbols(), middleZero = preferences.getMiddleZero(), partialHistoryView = preferences.getPartialHistoryView(), precision = preferences.getDigitsPrecision(), @@ -90,7 +90,7 @@ class UserPreferencesRepositoryImpl @Inject constructor( override val converterPrefs: Flow = data .map { preferences -> ConverterPreferencesImpl( - separator = preferences.getSeparator(), + formatterSymbols = preferences.getFormatterSymbols(), middleZero = preferences.getMiddleZero(), precision = preferences.getDigitsPrecision(), outputFormat = preferences.getOutputFormat(), @@ -118,7 +118,7 @@ class UserPreferencesRepositoryImpl @Inject constructor( .map { preferences -> FormattingPreferencesImpl( digitsPrecision = preferences.getDigitsPrecision(), - separator = preferences.getSeparator(), + formatterSymbols = preferences.getFormatterSymbols(), outputFormat = preferences.getOutputFormat(), ) } @@ -133,14 +133,14 @@ class UserPreferencesRepositoryImpl @Inject constructor( override val addSubtractPrefs: Flow = data .map { preferences -> AddSubtractPreferencesImpl( - separator = preferences.getSeparator(), + formatterSymbols = preferences.getFormatterSymbols(), ) } override val bodyMassPrefs: Flow = data .map { preferences -> BodyMassPreferencesImpl( - separator = preferences.getSeparator(), + formatterSymbols = preferences.getFormatterSymbols(), ) } @@ -164,9 +164,13 @@ class UserPreferencesRepositoryImpl @Inject constructor( } } - override suspend fun updateSeparator(separator: Int) { + override suspend fun updateFormatterSymbols(grouping: String, fractional: String) { + // Grouping and fractional symbols are always different + if (grouping == fractional) return + dataStore.edit { preferences -> - preferences[PrefsKeys.SEPARATOR] = separator + preferences[PrefsKeys.FORMATTER_GROUPING] = grouping + preferences[PrefsKeys.FORMATTER_FRACTIONAL] = fractional } } 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 87cc77cc..05af04ee 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 @@ -49,14 +49,15 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.core.ui.common.SegmentedButton import com.sadellie.unitto.core.ui.common.SegmentedButtonsRow import com.sadellie.unitto.core.ui.common.textfield.ExpressionTransformer -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.data.common.isEqualTo import com.sadellie.unitto.feature.bodymass.components.BodyMassResult @@ -223,7 +224,7 @@ fun PreviewBodyMassScreen() { weight = TextFieldValue(), normalWeightRange = BigDecimal(30) to BigDecimal(50), result = BigDecimal(18.5), - formatterSymbols = FormatterSymbols.Spaces + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD) ), updateHeight1 = {}, updateHeight2 = {}, diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt index a0a9e93d..811176f6 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt @@ -24,7 +24,6 @@ import android.os.Build import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.data.common.combine import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.repository.UserPreferencesRepository @@ -64,7 +63,7 @@ internal class BodyMassViewModel @Inject constructor( weight = weight, result = result, normalWeightRange = normalWeightRange, - formatterSymbols = AllFormatterSymbols.getById(userPrefs.separator) + formatterSymbols = userPrefs.formatterSymbols ) } .mapLatest { ui -> diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/UIState.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/UIState.kt index 997c9339..68c6e880 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/UIState.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/UIState.kt @@ -19,7 +19,7 @@ package com.sadellie.unitto.feature.bodymass import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols import java.math.BigDecimal internal sealed class UIState { diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt index fbdba599..78d2c28c 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt @@ -37,9 +37,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.common.format import java.math.BigDecimal @@ -171,6 +172,6 @@ fun PreviewBodyMassResult() { value = BigDecimal(18.5), range = BigDecimal(50) to BigDecimal(80), rangeSuffix = "kg", - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), ) } diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index f1be2ea8..2c942273 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -26,9 +26,10 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipeDown import androidx.compose.ui.text.input.TextFieldValue +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.Token import org.junit.Rule import org.junit.Test @@ -67,7 +68,7 @@ class CalculatorScreenTest { radianMode = false, precision = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), history = emptyList(), middleZero = false, acButton = true, @@ -100,7 +101,7 @@ class CalculatorScreenTest { radianMode = false, precision = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), history = emptyList(), middleZero = false, acButton = true, diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index a298bf95..bcf5a105 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -62,14 +62,15 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R +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.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.data.model.HistoryItem import com.sadellie.unitto.feature.calculator.components.CalculatorKeyboard import com.sadellie.unitto.feature.calculator.components.HistoryItemHeight @@ -355,7 +356,7 @@ private fun PreviewCalculatorScreen() { radianMode = false, precision = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), history = historyItems, middleZero = false, acButton = true, diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt index baa5b4c6..670221b5 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt @@ -20,8 +20,8 @@ package com.sadellie.unitto.feature.calculator import androidx.annotation.StringRes import androidx.compose.ui.text.input.TextFieldValue +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.data.model.HistoryItem internal sealed class CalculatorUIState { 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 1a70fbcc..c3672bab 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 @@ -24,7 +24,6 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sadellie.unitto.core.base.Token -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.addBracket import com.sadellie.unitto.core.ui.common.textfield.addTokens import com.sadellie.unitto.core.ui.common.textfield.deleteTokens @@ -79,7 +78,7 @@ internal class CalculatorViewModel @Inject constructor( radianMode = prefs.radianMode, precision = prefs.precision, outputFormat = prefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator), + formatterSymbols = prefs.formatterSymbols, history = history, middleZero = prefs.middleZero, acButton = prefs.acButton, 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 be3ca4d7..4882c3c2 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 @@ -110,7 +110,6 @@ import com.sadellie.unitto.core.ui.common.icons.iconpack.RightBracket import com.sadellie.unitto.core.ui.common.icons.iconpack.Root import com.sadellie.unitto.core.ui.common.icons.iconpack.Sin import com.sadellie.unitto.core.ui.common.icons.iconpack.Tan -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols @Composable internal fun CalculatorKeyboard( @@ -182,8 +181,8 @@ private fun PortraitKeyboard( val angleIcon = remember(radianMode) { if (radianMode) IconPack.Rad else IconPack.Deg } val angleIconDescription = remember(radianMode) { if (radianMode) R.string.keyboard_radian else R.string.keyboard_degree } - val fractionalIcon = remember(fractional) { if (fractional == Token.Digit.dot) IconPack.Dot else IconPack.Comma } - val fractionalIconDescription = remember(fractional) { if (fractional == Token.Digit.dot) R.string.keyboard_dot else R.string.comma } + val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } + val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } var showAdditional: Boolean by remember { mutableStateOf(false) } val expandRotation: Float by animateFloatAsState( @@ -414,8 +413,8 @@ private fun LandscapeKeyboard( val angleIcon = remember(radianMode) { if (radianMode) IconPack.Rad else IconPack.Deg } val angleIconDescription = remember(radianMode) { if (radianMode) R.string.keyboard_radian else R.string.keyboard_degree } - val fractionalIcon = remember(fractional) { if (fractional == Token.Digit.dot) IconPack.Dot else IconPack.Comma } - val fractionalIconDescription = remember(fractional) { if (fractional == Token.Digit.dot) R.string.keyboard_dot else R.string.comma } + val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } + val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } Crossfade( targetState = invMode, @@ -544,7 +543,7 @@ private fun PreviewPortraitKeyboard() { PortraitKeyboard( modifier = Modifier.fillMaxHeight(), radianMode = true, - fractional = FormatterSymbols.Comma.fractional, + fractional = Token.PERIOD, addSymbol = {}, clearSymbols = {}, deleteSymbol = {}, @@ -564,7 +563,7 @@ private fun PreviewLandscapeKeyboard() { LandscapeKeyboard( modifier = Modifier.fillMaxHeight(), radianMode = true, - fractional = FormatterSymbols.Comma.fractional, + fractional = Token.PERIOD, addSymbol = {}, clearSymbols = {}, deleteSymbol = {}, diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt index 7ba3c09b..39ced770 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -47,9 +47,10 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.FixedExpressionInputTextField -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.data.model.HistoryItem import java.text.SimpleDateFormat import java.util.Locale @@ -225,7 +226,7 @@ private fun PreviewHistoryList() { .background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f)) .fillMaxSize(), historyItems = historyItems, - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), addTokens = {}, onDelete = {}, showDeleteButtons = true, diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt index e1daaf1a..20f630bf 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt @@ -39,10 +39,10 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowHeightSizeClass import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.SimpleTextField import com.sadellie.unitto.feature.calculator.CalculationResult diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index b57f6660..cbe8a40e 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -70,6 +70,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.Token @@ -80,7 +81,6 @@ import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.PortraitLandscape import com.sadellie.unitto.core.ui.common.ScaffoldWithTopBar import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.NumberBaseTextField import com.sadellie.unitto.core.ui.common.textfield.SimpleTextField import com.sadellie.unitto.core.ui.datetime.formatDateWeekDayMonthYear @@ -425,7 +425,7 @@ private fun ConverterResultTextField( result: ConverterResult, scale: Int = 0, outputFormat: Int = OutputFormat.PLAIN, - formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces, + formatterSymbols: FormatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), onErrorClick: () -> Unit = {}, ) { val mContext = LocalContext.current 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 47fc4eb4..40e64429 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 @@ -20,9 +20,9 @@ package com.sadellie.unitto.feature.converter import android.content.Context import androidx.compose.ui.text.input.TextFieldValue +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.Token -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.common.format import com.sadellie.unitto.data.common.isEqualTo 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 f5ea3f4e..c3c9a804 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 @@ -23,7 +23,6 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sadellie.unitto.core.base.Token -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.addBracket import com.sadellie.unitto.core.ui.common.textfield.addTokens import com.sadellie.unitto.core.ui.common.textfield.deleteTokens @@ -94,7 +93,7 @@ internal class ConverterViewModel @Inject constructor( unitFrom = unitFrom as DefaultUnit, unitTo = unitTo as DefaultUnit, middleZero = prefs.middleZero, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator), + formatterSymbols = prefs.formatterSymbols, scale = prefs.precision, outputFormat = prefs.outputFormat, formatTime = prefs.unitConverterFormatTime, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt index 03d6bcec..5bb17a78 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt @@ -19,7 +19,7 @@ package com.sadellie.unitto.feature.converter import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.unit.AbstractUnit diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt index e35672ac..55833ef5 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.repository.UnitsRepository @@ -112,7 +111,7 @@ internal class UnitSelectorViewModel @Inject constructor( sorting = prefs.unitConverterSorting, scale = prefs.precision, outputFormat = prefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator), + formatterSymbols = prefs.formatterSymbols, ) } .mapLatest { ui -> diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt index ae918bf6..b423e98b 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt @@ -28,11 +28,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.SearchBar -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.common.format import com.sadellie.unitto.data.converter.UnitID @@ -189,7 +190,7 @@ private fun UnitToSelectorPreview() { input = "100", scale = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), ), onQueryChange = {}, toggleFavoritesOnly = {}, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt index f1b0f51d..e54714e7 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt @@ -66,7 +66,6 @@ import com.sadellie.unitto.core.ui.common.icons.iconpack.Plus import com.sadellie.unitto.core.ui.common.icons.iconpack.Power import com.sadellie.unitto.core.ui.common.icons.iconpack.RightBracket import com.sadellie.unitto.core.ui.common.icons.iconpack.Root -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols @Composable internal fun DefaultKeyboard( @@ -79,8 +78,8 @@ internal fun DefaultKeyboard( acButton: Boolean, addBracket: () -> Unit, ) { - val fractionalIcon = remember(fractional) { if (fractional == Token.Digit.dot) IconPack.Dot else IconPack.Comma } - val fractionalIconDescription = remember(fractional) { if (fractional == Token.Digit.dot) R.string.keyboard_dot else R.string.comma } + val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } + val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } val contentHeight: Float = if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) KeyboardButtonContentHeightShort else KeyboardButtonContentHeightTall KeypadFlow( @@ -178,7 +177,7 @@ private fun PreviewConverterKeyboard() { addDigit = {}, clearInput = {}, deleteDigit = {}, - fractional = FormatterSymbols.Spaces.fractional, + fractional = Token.PERIOD, middleZero = false, acButton = true, addBracket = {} diff --git a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt index b1632226..d87d15ef 100644 --- a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt +++ b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterUIStateKtTest.kt @@ -19,7 +19,8 @@ package com.sadellie.unitto.feature.converter import android.content.Context -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.Token import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -32,7 +33,7 @@ class ConverterUIStateKtTest { @Test fun format() { - val formatterSymbols = FormatterSymbols.Spaces + val formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD) var basicValue = BigDecimal("1") val mContext: Context = RuntimeEnvironment.getApplication().applicationContext diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt index dfa33347..4dd24005 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt @@ -19,7 +19,8 @@ package com.sadellie.unitto.feature.datecalculator.addsubtract import androidx.compose.ui.text.input.TextFieldValue -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.feature.datecalculator.ZonedDateTimeUtils import java.time.ZonedDateTime @@ -32,6 +33,6 @@ internal data class AddSubtractState( val hours: TextFieldValue = TextFieldValue(), val minutes: TextFieldValue = TextFieldValue(), val addition: Boolean = true, - val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces, + val formatterSymbols: FormatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), val allowVibration: Boolean = false, ) diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt index 2e2d8703..478c238e 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -46,7 +45,7 @@ internal class AddSubtractViewModel @Inject constructor( val uiState: StateFlow = _uiState .combine(userPreferencesRepository.addSubtractPrefs) { uiState, userPrefs -> return@combine uiState.copy( - formatterSymbols = AllFormatterSymbols.getById(userPrefs.separator), + formatterSymbols = userPrefs.formatterSymbols, ) } .onEach { updateResult() } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt index 0d89011d..61c85ce6 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt @@ -40,9 +40,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.common.format import com.sadellie.unitto.feature.datecalculator.ZonedDateTimeUtils @@ -185,7 +186,7 @@ fun DateDifferenceViewPreview() { ), precision = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD) ), setStartDate = {}, setEndDate = {}, diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt index f0ef5e91..35e50f74 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt @@ -20,7 +20,6 @@ package com.sadellie.unitto.feature.datecalculator.difference import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import com.sadellie.unitto.feature.datecalculator.ZonedDateTimeUtils @@ -55,7 +54,7 @@ internal class DateDifferenceViewModel @Inject constructor( result = result, precision = prefs.digitsPrecision, outputFormat = prefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(prefs.separator) + formatterSymbols = prefs.formatterSymbols ) } .mapLatest { ui -> diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DifferenceUIState.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DifferenceUIState.kt index ef43dbab..673a0de6 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DifferenceUIState.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DifferenceUIState.kt @@ -18,7 +18,7 @@ package com.sadellie.unitto.feature.datecalculator.difference -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols import java.time.ZonedDateTime internal sealed class DifferenceUIState { diff --git a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt index a73df471..bdc214b2 100644 --- a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt +++ b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt @@ -54,9 +54,8 @@ import androidx.glance.text.Text import androidx.glance.text.TextAlign import androidx.glance.text.TextStyle import androidx.glance.unit.ColorProvider +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.Token -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import com.sadellie.unitto.data.model.userprefs.CalculatorPreferences @@ -139,7 +138,7 @@ private fun ReadyUI( val input = glancePrefs[CalculatorWidget.inputPrefKey] ?: "" val output = glancePrefs[CalculatorWidget.outputPrefKey] ?: "" val equalClicked = glancePrefs[CalculatorWidget.equalClickedPrefKey] ?: false - val formatterSymbols = AllFormatterSymbols.getById(appPrefs.separator) + val formatterSymbols = appPrefs.formatterSymbols fun runCalculateAction( input: String, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt index 480edaaa..0a684734 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt @@ -28,9 +28,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.base.Separator +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.NavigateUpButton @@ -83,7 +84,7 @@ private fun PreviewCalculatorSettingsScreenStandard() { CalculatorSettingsScreen( prefs = CalculatorPreferencesImpl( radianMode = true, - separator = Separator.SPACE, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), middleZero = false, acButton = false, partialHistoryView = false, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt index 7d462f30..553325b3 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt @@ -34,9 +34,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.base.Separator +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.NavigateUpButton @@ -133,7 +134,7 @@ private fun ConverterSettingsScreen( private fun PreviewConverterSettingsScreen() { ConverterSettingsScreen( prefs = ConverterPreferencesImpl( - separator = Separator.SPACE, + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), middleZero = false, precision = 3, outputFormat = OutputFormat.PLAIN, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt index 724d728a..c84e6912 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt @@ -18,13 +18,18 @@ package com.sadellie.unitto.feature.settings.formatting +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons @@ -38,6 +43,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -48,10 +54,11 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.base.FormatterSymbols import com.sadellie.unitto.core.base.MAX_PRECISION import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.base.Separator +import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.NavigateUpButton @@ -60,7 +67,6 @@ import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.common.SegmentedButton import com.sadellie.unitto.core.ui.common.SegmentedButtonsRow import com.sadellie.unitto.core.ui.common.Slider -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols import com.sadellie.unitto.core.ui.common.textfield.formatExpression import com.sadellie.unitto.core.ui.theme.LocalNumberTypography import com.sadellie.unitto.data.common.format @@ -79,7 +85,7 @@ fun FormattingRoute( navigateUpAction = navigateUpAction, uiState = uiState, onPrecisionChange = viewModel::updatePrecision, - onSeparatorChange = viewModel::updateSeparator, + updateFormatterSymbols = viewModel::updateFormatterSymbols, onOutputFormatChange = viewModel::updateOutputFormat, ) } @@ -91,7 +97,7 @@ fun FormattingScreen( navigateUpAction: () -> Unit, uiState: FormattingUIState, onPrecisionChange: (Int) -> Unit, - onSeparatorChange: (Int) -> Unit, + updateFormatterSymbols: (grouping: String, fractional: String) -> Unit, onOutputFormatChange: (Int) -> Unit, precisions: ClosedFloatingPointRange = 0f..16f, // 16th is a MAX_PRECISION (1000) ) { @@ -114,143 +120,162 @@ fun FormattingScreen( title = stringResource(R.string.settings_formatting), navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { paddingValues -> - LazyColumn( + Column( modifier = Modifier .padding(paddingValues) ) { - item("preview") { - PagedIsland( + PagedIsland( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + pagerState = rememberPagerState { 2 }, + ) { currentPage -> + val preview = when (currentPage) { + 0 -> "123456.${"789123456".repeat(ceil(uiState.precision.toDouble() / 9.0).toInt())}" + 1 -> "0.${"1".padStart(uiState.precision, '0')}" + else -> "" + } + .toBigDecimalOrNull() + ?.format(uiState.precision, uiState.outputFormat) + ?.formatExpression(uiState.formatterSymbols) + ?: "" + + Text( + text = preview, + style = LocalNumberTypography.current.displayMedium, + maxLines = 1, modifier = Modifier .fillMaxWidth() - .padding(16.dp), - pagerState = rememberPagerState { 2 }, - ) { currentPage -> - val preview = when (currentPage) { - 0 -> "123456.${"789123456".repeat(ceil(uiState.precision.toDouble() / 9.0).toInt())}" - 1 -> "0.${"1".padStart(uiState.precision, '0')}" - else -> "" - } - .toBigDecimalOrNull() - ?.format(uiState.precision, uiState.outputFormat) - ?.formatExpression(uiState.formatterSymbols) - ?: "" + .horizontalScroll(rememberScrollState()), + textAlign = TextAlign.End, + color = MaterialTheme.colorScheme.onSecondaryContainer + ) + } - Text( - text = preview, - style = LocalNumberTypography.current.displayMedium, - maxLines = 1, - modifier = Modifier - .fillMaxWidth() - .horizontalScroll(rememberScrollState()), - textAlign = TextAlign.End, - color = MaterialTheme.colorScheme.onSecondaryContainer + ListItem( + leadingContent = { + Icon( + Icons.Default.Architecture, + stringResource(R.string.settings_precision) + ) + }, + headlineContent = { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.settings_precision)) + Text(precisionText) + } + }, + supportingContent = { + Text(stringResource(R.string.settings_precision_support)) + } + ) + + Slider( + modifier = Modifier.padding(start = 56.dp, end = 16.dp), + value = uiState.precision.toFloat(), + valueRange = precisions, + onValueChange = { onPrecisionChange(it.roundToInt()) }, + ) + + ListItem( + leadingContent = { + Icon(Icons.Default._123, stringResource(R.string.settings_thousands_separator)) + }, + headlineContent = { Text(stringResource(R.string.settings_thousands_separator)) }, + ) + + Row( + Modifier + .horizontalScroll(rememberScrollState()) + .wrapContentWidth() + .padding(start = 56.dp) + ) { + SegmentedButtonsRow { + SegmentedButton( + label = stringResource(R.string.settings_space), + onClick = { updateFormatterSymbols(Token.SPACE, uiState.formatterSymbols.fractional) }, + selected = uiState.formatterSymbols.grouping == Token.SPACE + ) + SegmentedButton( + label = stringResource(R.string.settings_period), + onClick = { updateFormatterSymbols(Token.PERIOD, Token.COMMA) }, + selected = uiState.formatterSymbols.grouping == Token.PERIOD, + ) + SegmentedButton( + label = stringResource(R.string.comma), + onClick = { updateFormatterSymbols(Token.COMMA, Token.PERIOD) }, + selected = uiState.formatterSymbols.grouping == Token.COMMA, ) } } - item("precision_label") { - ListItem( - leadingContent = { - Icon( - Icons.Default.Architecture, - stringResource(R.string.settings_precision) - ) - }, - headlineContent = { - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - Text(stringResource(R.string.settings_precision)) - Text(precisionText) - } - }, - supportingContent = { - Text(stringResource(R.string.settings_precision_support)) - } - ) - } - - item("precision_slider") { - Slider( - modifier = Modifier.padding(start = 56.dp, end = 16.dp), - value = uiState.precision.toFloat(), - valueRange = precisions, - onValueChange = { onPrecisionChange(it.roundToInt()) }, - ) - } - - item("separator_label") { - ListItem( - leadingContent = { - Icon(Icons.Default._123, stringResource(R.string.settings_separator)) - }, - headlineContent = { Text(stringResource(R.string.settings_separator)) }, - supportingContent = { Text(stringResource(R.string.settings_separator_support)) }, - ) - } - - item("separator") { - Row( - Modifier - .horizontalScroll(rememberScrollState()) - .wrapContentWidth() - .padding(start = 56.dp) + AnimatedVisibility( + visible = uiState.formatterSymbols.grouping == Token.SPACE, + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + Column( + modifier = Modifier.padding(start = 40.dp) ) { - SegmentedButtonsRow { - SegmentedButton( - label = stringResource(R.string.settings_space), - onClick = { onSeparatorChange(Separator.SPACE) }, - selected = Separator.SPACE == uiState.separator - ) - SegmentedButton( - label = stringResource(R.string.settings_period), - onClick = { onSeparatorChange(Separator.PERIOD) }, - selected = Separator.PERIOD == uiState.separator - ) - SegmentedButton( - label = stringResource(R.string.comma), - onClick = { onSeparatorChange(Separator.COMMA) }, - selected = Separator.COMMA == uiState.separator - ) + ListItem( + modifier = Modifier, + headlineContent = { Text(stringResource(R.string.settings_decimal_separator)) }, + ) + Row( + Modifier + .horizontalScroll(rememberScrollState()) + .wrapContentWidth() + .padding(start = 16.dp) + ) { + SegmentedButtonsRow { + SegmentedButton( + label = stringResource(R.string.settings_period), + onClick = { updateFormatterSymbols(Token.SPACE, Token.PERIOD) }, + selected = uiState.formatterSymbols.fractional == Token.PERIOD, + ) + SegmentedButton( + label = stringResource(R.string.comma), + onClick = { updateFormatterSymbols(Token.SPACE, Token.COMMA) }, + selected = uiState.formatterSymbols.fractional == Token.COMMA, + ) + } } } } - item("output_format_label") { - ListItem( - leadingContent = { - Icon(Icons.Default.EMobiledata, stringResource(R.string.settings_precision)) - }, - headlineContent = { Text(stringResource(R.string.settings_exponential_notation)) }, - supportingContent = { Text(stringResource(R.string.settings_exponential_notation_support)) } - ) - } + ListItem( + leadingContent = { + Icon(Icons.Default.EMobiledata, stringResource(R.string.settings_precision)) + }, + headlineContent = { Text(stringResource(R.string.settings_exponential_notation)) }, + supportingContent = { Text(stringResource(R.string.settings_exponential_notation_support)) } + ) - item("output_format") { - Row( - Modifier - .horizontalScroll(rememberScrollState()) - .wrapContentWidth() - .padding(start = 56.dp) - ) { - SegmentedButtonsRow { - SegmentedButton( - label = stringResource(R.string.settings_auto), - onClick = { onOutputFormatChange(OutputFormat.ALLOW_ENGINEERING) }, - selected = OutputFormat.ALLOW_ENGINEERING == uiState.outputFormat - ) - SegmentedButton( - label = stringResource(R.string.enabled_label), - onClick = { onOutputFormatChange(OutputFormat.FORCE_ENGINEERING) }, - selected = OutputFormat.FORCE_ENGINEERING == uiState.outputFormat - ) - SegmentedButton( - label = stringResource(R.string.disabled_label), - onClick = { onOutputFormatChange(OutputFormat.PLAIN) }, - selected = OutputFormat.PLAIN == uiState.outputFormat - ) - } + Row( + Modifier + .horizontalScroll(rememberScrollState()) + .wrapContentWidth() + .padding(start = 56.dp) + ) { + SegmentedButtonsRow { + SegmentedButton( + label = stringResource(R.string.settings_auto), + onClick = { onOutputFormatChange(OutputFormat.ALLOW_ENGINEERING) }, + selected = OutputFormat.ALLOW_ENGINEERING == uiState.outputFormat + ) + SegmentedButton( + label = stringResource(R.string.enabled_label), + onClick = { onOutputFormatChange(OutputFormat.FORCE_ENGINEERING) }, + selected = OutputFormat.FORCE_ENGINEERING == uiState.outputFormat + ) + SegmentedButton( + label = stringResource(R.string.disabled_label), + onClick = { onOutputFormatChange(OutputFormat.PLAIN) }, + selected = OutputFormat.PLAIN == uiState.outputFormat + ) } } } @@ -261,18 +286,19 @@ fun FormattingScreen( @Composable private fun PreviewFormattingScreen() { var currentPrecision by remember { mutableIntStateOf(6) } - var currentSeparator by remember { mutableIntStateOf(Separator.COMMA) } + var currentFormatterSymbols by remember { mutableStateOf(FormatterSymbols(Token.SPACE, Token.PERIOD)) } var currentOutputFormat by remember { mutableIntStateOf(OutputFormat.PLAIN) } FormattingScreen( uiState = FormattingUIState( precision = 16, - separator = Separator.SPACE, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols.Spaces + formatterSymbols = currentFormatterSymbols ), onPrecisionChange = { currentPrecision = it }, - onSeparatorChange = { currentSeparator = it }, + updateFormatterSymbols = updateFormatterSymbols@{ grouping, fractional -> + currentFormatterSymbols = FormatterSymbols(grouping, fractional) + }, onOutputFormatChange = { currentOutputFormat = it }, navigateUpAction = {}, ) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingUIState.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingUIState.kt index 65d1f826..89a41b3b 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingUIState.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingUIState.kt @@ -18,11 +18,10 @@ package com.sadellie.unitto.feature.settings.formatting -import com.sadellie.unitto.core.ui.common.textfield.FormatterSymbols +import com.sadellie.unitto.core.base.FormatterSymbols data class FormattingUIState( val precision: Int, - val separator: Int, val outputFormat: Int, val formatterSymbols: FormatterSymbols, ) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt index 64741259..44062399 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt @@ -21,7 +21,6 @@ package com.sadellie.unitto.feature.settings.formatting import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sadellie.unitto.core.base.MAX_PRECISION -import com.sadellie.unitto.core.ui.common.textfield.AllFormatterSymbols import com.sadellie.unitto.data.common.stateIn import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -38,9 +37,8 @@ class FormattingViewModel @Inject constructor( val uiState = _prefs.map { mainPrefs -> FormattingUIState( precision = mainPrefs.digitsPrecision, - separator = mainPrefs.separator, outputFormat = mainPrefs.outputFormat, - formatterSymbols = AllFormatterSymbols.getById(mainPrefs.separator) + formatterSymbols = mainPrefs.formatterSymbols ) } .stateIn(viewModelScope, null) @@ -55,10 +53,10 @@ class FormattingViewModel @Inject constructor( } /** - * @see UserPreferencesRepository.updateSeparator + * @see UserPreferencesRepository.updateFormatterSymbols */ - fun updateSeparator(separator: Int) = viewModelScope.launch { - userPreferencesRepository.updateSeparator(separator) + fun updateFormatterSymbols(grouping: String, fractional: String) = viewModelScope.launch { + userPreferencesRepository.updateFormatterSymbols(grouping, fractional) } /** From e5696173f459a09b3666a89a9e3fc0efd2018732 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 12 Feb 2024 22:12:40 +0300 Subject: [PATCH 19/46] Rotate PagedIsland --- .../java/com/sadellie/unitto/core/ui/common/PagedIsland.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt index 210253f4..9b076f68 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt @@ -74,10 +74,13 @@ fun PagedIsland( .clip(RoundedCornerShape(32.dp)) .clickable { onClick() - if (pagerState.currentPage == (pagerState.pageCount - 1)) return@clickable + val targetPage = pagerState.currentPage + 1 corScope.launch { - pagerState.animateScrollToPage(pagerState.currentPage + 1) + pagerState.animateScrollToPage( + // Animate to first page if target page is out of bounds + if (targetPage >= pagerState.pageCount) 0 else targetPage + ) } } .background(backgroundColor) From 51700687a29771a6995b1948193838c5c2fef945 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 21:58:11 +0300 Subject: [PATCH 20/46] Call Mr. Clean to clean up Calculator module --- .../textfield/TextFieldValueExtensions.kt | 2 + .../calculator/CalculatorScreenTest.kt | 65 +-- .../feature/calculator/CalculatorScreen.kt | 118 ++---- .../feature/calculator/CalculatorUIState.kt | 12 +- .../feature/calculator/CalculatorViewModel.kt | 60 +-- .../components/CalculatorKeyboard.kt | 388 +++++++++--------- .../feature/calculator/components/TextBox.kt | 41 +- 7 files changed, 299 insertions(+), 387 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt index ae5248e6..0427cb8d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt @@ -126,6 +126,8 @@ fun TextFieldValue.deleteTokens(): TextFieldValue { ) } +fun TextFieldValue.placeCursorAtTheEnd(): TextFieldValue = copy(selection = TextRange(text.length)) + /** * Tries to get a [TextFieldValue]. Places cursor at the end. * diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index 2c942273..a0e1dd50 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -38,30 +38,9 @@ class CalculatorScreenTest { val composeTestRule = createAndroidComposeRule() @Test - fun loading_showLoadingKeyboard(): Unit = with(composeTestRule) { + fun ready(): Unit = with(composeTestRule) { setContent { - CalculatorScreen( - uiState = CalculatorUIState.Loading, - openDrawer = {}, - addTokens = {}, - addBracket = {}, - clearInput = {}, - deleteTokens = {}, - onValueChange = {}, - toggleCalculatorMode = {}, - equal = {}, - clearHistory = {}, - onDelete = {}, - ) - } - - onNodeWithTag("loading").assertExists() - } - - @Test - fun ready_showRealKeyboard(): Unit = with(composeTestRule) { - setContent { - CalculatorScreen( + Ready( uiState = CalculatorUIState.Ready( input = TextFieldValue(), output = CalculationResult.Empty, @@ -75,16 +54,15 @@ class CalculatorScreenTest { partialHistoryView = true ), openDrawer = {}, - addTokens = {}, - addBracket = {}, - clearInput = {}, - deleteTokens = {}, - onValueChange = {}, - toggleCalculatorMode = {}, - equal = {}, - clearHistory = {}, - onDelete = {}, - ) + onInputChange = {}, + onAddTokenClick = {}, + onBracketsClick = {}, + onDeleteClick = {}, + onClearClick = {}, + onEqualClick = {}, + onAngleClick = {}, + onClearHistoryClick = {}, + ) {} } onNodeWithTag("loading").assertDoesNotExist() @@ -94,7 +72,7 @@ class CalculatorScreenTest { @Test fun ready_swipeForHistory(): Unit = with(composeTestRule) { setContent { - CalculatorScreen( + Ready( uiState = CalculatorUIState.Ready( input = TextFieldValue(), output = CalculationResult.Empty, @@ -108,16 +86,15 @@ class CalculatorScreenTest { partialHistoryView = true ), openDrawer = {}, - addTokens = {}, - addBracket = {}, - clearInput = {}, - deleteTokens = {}, - onValueChange = {}, - toggleCalculatorMode = {}, - equal = {}, - clearHistory = {}, - onDelete = {}, - ) + onInputChange = {}, + onAddTokenClick = {}, + onBracketsClick = {}, + onDeleteClick = {}, + onClearClick = {}, + onEqualClick = {}, + onAngleClick = {}, + onClearHistoryClick = {}, + ) {} } onNodeWithTag("inputBox") diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index bcf5a105..46efaa8c 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -86,68 +86,37 @@ internal fun CalculatorRoute( openDrawer: () -> Unit, viewModel: CalculatorViewModel = hiltViewModel(), ) { - val uiState = viewModel.uiState.collectAsStateWithLifecycle() - - CalculatorScreen( - uiState = uiState.value, - openDrawer = openDrawer, - addTokens = viewModel::addTokens, - addBracket = viewModel::addBracket, - clearInput = viewModel::clearInput, - deleteTokens = viewModel::deleteTokens, - onValueChange = viewModel::updateInput, - toggleCalculatorMode = viewModel::updateRadianMode, - equal = viewModel::equal, - clearHistory = viewModel::clearHistory, - onDelete = viewModel::deleteHistoryItem, - ) -} - -@Composable -internal fun CalculatorScreen( - uiState: CalculatorUIState, - openDrawer: () -> Unit, - addTokens: (String) -> Unit, - addBracket: () -> Unit, - clearInput: () -> Unit, - deleteTokens: () -> Unit, - onValueChange: (TextFieldValue) -> Unit, - toggleCalculatorMode: (Boolean) -> Unit, - equal: () -> Unit, - clearHistory: () -> Unit, - onDelete: (HistoryItem) -> Unit, -) { - when (uiState) { - is CalculatorUIState.Loading -> EmptyScreen() + when (val uiState = viewModel.uiState.collectAsStateWithLifecycle().value) { + CalculatorUIState.Loading -> EmptyScreen() is CalculatorUIState.Ready -> Ready( uiState = uiState, openDrawer = openDrawer, - addSymbol = addTokens, - addBracket = addBracket, - clearSymbols = clearInput, - deleteSymbol = deleteTokens, - onValueChange = onValueChange, - toggleAngleMode = { toggleCalculatorMode(!uiState.radianMode) }, - equal = equal, - clearHistory = clearHistory, - onDelete = onDelete, + onInputChange = viewModel::updateInput, + onAddTokenClick = viewModel::addTokens, + onBracketsClick = viewModel::addBracket, + onDeleteClick = viewModel::deleteTokens, + onClearClick = viewModel::clearInput, + onEqualClick = viewModel::equal, + onAngleClick = viewModel::updateRadianMode, + onClearHistoryClick = viewModel::clearHistory, + onDeleteHistoryItemClick = viewModel::deleteHistoryItem, ) } } @Composable -private fun Ready( +internal fun Ready( uiState: CalculatorUIState.Ready, openDrawer: () -> Unit, - addSymbol: (String) -> Unit, - addBracket: () -> Unit, - clearSymbols: () -> Unit, - deleteSymbol: () -> Unit, - onValueChange: (TextFieldValue) -> Unit, - toggleAngleMode: () -> Unit, - equal: () -> Unit, - clearHistory: () -> Unit, - onDelete: (HistoryItem) -> Unit, + onInputChange: (TextFieldValue) -> Unit, + onAddTokenClick: (String) -> Unit, + onBracketsClick: () -> Unit, + onDeleteClick: () -> Unit, + onClearClick: () -> Unit, + onEqualClick: () -> Unit, + onAngleClick: (Boolean) -> Unit, + onClearHistoryClick: () -> Unit, + onDeleteHistoryItemClick: (HistoryItem) -> Unit, ) { val focusManager = LocalFocusManager.current var showClearHistoryDialog by rememberSaveable { mutableStateOf(false) } @@ -240,8 +209,8 @@ private fun Ready( .height(historyListHeight), historyItems = uiState.history, formatterSymbols = uiState.formatterSymbols, - addTokens = addSymbol, - onDelete = onDelete, + addTokens = onAddTokenClick, + onDelete = onDeleteHistoryItemClick, showDeleteButtons = isOpen ) @@ -256,7 +225,7 @@ private fun Ready( ), formatterSymbols = uiState.formatterSymbols, input = uiState.input, - onValueChange = onValueChange, + onValueChange = onInputChange, output = uiState.output ) @@ -274,16 +243,16 @@ private fun Ready( .height(keyboardHeight) .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 4.dp), + onAddTokenClick = onAddTokenClick, + onBracketsClick = onBracketsClick, + onDeleteClick = onDeleteClick, + onClearClick = onClearClick, + onEqualClick = { focusManager.clearFocus(); onEqualClick() }, + onAngleClick = onAngleClick, radianMode = uiState.radianMode, - fractional = uiState.formatterSymbols.fractional, - addSymbol = addSymbol, - clearSymbols = clearSymbols, - deleteSymbol = deleteSymbol, - toggleAngleMode = toggleAngleMode, - equal = { focusManager.clearFocus(); equal() }, + showAcButton = uiState.acButton, middleZero = uiState.middleZero, - acButton = uiState.acButton, - addBracket = addBracket + fractional = uiState.formatterSymbols.fractional, ) } } @@ -302,7 +271,7 @@ private fun Ready( confirmButton = { TextButton( onClick = { - clearHistory() + onClearHistoryClick() showClearHistoryDialog = false } ) { @@ -349,7 +318,7 @@ private fun PreviewCalculatorScreen() { ) } - CalculatorScreen( + Ready( uiState = CalculatorUIState.Ready( input = TextFieldValue("1.2345"), output = CalculationResult.Default("1234"), @@ -363,14 +332,13 @@ private fun PreviewCalculatorScreen() { partialHistoryView = true ), openDrawer = {}, - addTokens = {}, - addBracket = {}, - clearInput = {}, - deleteTokens = {}, - onValueChange = {}, - toggleCalculatorMode = {}, - equal = {}, - clearHistory = {}, - onDelete = {}, - ) + onInputChange = {}, + onAddTokenClick = {}, + onBracketsClick = {}, + onDeleteClick = {}, + onClearClick = {}, + onEqualClick = {}, + onAngleClick = {}, + onClearHistoryClick = {}, + ) {} } \ No newline at end of file diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt index 670221b5..3a2b844a 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt @@ -18,10 +18,8 @@ package com.sadellie.unitto.feature.calculator -import androidx.annotation.StringRes import androidx.compose.ui.text.input.TextFieldValue import com.sadellie.unitto.core.base.FormatterSymbols -import com.sadellie.unitto.core.base.R import com.sadellie.unitto.data.model.HistoryItem internal sealed class CalculatorUIState { @@ -48,13 +46,7 @@ sealed class CalculationResult { data object Empty : CalculationResult() - data object DivideByZeroError : CalculationResult() { - @StringRes - val label: Int = R.string.calculator_divide_by_zero_error - } + data object DivideByZeroError : CalculationResult() - data object Error : CalculationResult() { - @StringRes - val label: Int = R.string.error_label - } + data object Error : CalculationResult() } 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 c3672bab..98b6714f 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 @@ -28,6 +28,7 @@ import com.sadellie.unitto.core.ui.common.textfield.addBracket 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.getTextField +import com.sadellie.unitto.core.ui.common.textfield.placeCursorAtTheEnd import com.sadellie.unitto.data.common.format import com.sadellie.unitto.data.common.isExpression import com.sadellie.unitto.data.common.stateIn @@ -114,62 +115,43 @@ internal class CalculatorViewModel @Inject constructor( } .stateIn(viewModelScope, CalculatorUIState.Loading) - fun addTokens(tokens: String) = _input.update { + fun addTokens(tokens: String) { val isClearInputNeeded = _equalClicked.value and Token.Digit.allWithDot.contains(tokens) - - var newValue = when { + val newValue = when { // Clean input after clicking "=" and any token that is a Digit isClearInputNeeded -> TextFieldValue() - _equalClicked.value -> it.copy(selection = TextRange(it.text.length)) - else -> it - } - newValue = newValue.addTokens(tokens) - - _equalClicked.update { false } - _fractionJob?.cancel() - savedStateHandle[_inputKey] = newValue.text - newValue + _equalClicked.value -> _input.value.placeCursorAtTheEnd() + else -> _input.value + }.addTokens(tokens) + updateInput(newValue) } - fun addBracket() = _input.update { - var newValue = if (_equalClicked.value) { + fun addBracket() { + val newValue = if (_equalClicked.value) { // Cursor is set to 0 when equal is clicked - it.copy(selection = TextRange(it.text.length)) + _input.value.placeCursorAtTheEnd() } else { - it - } - newValue = newValue.addBracket() - - _equalClicked.update { false } - _fractionJob?.cancel() - savedStateHandle[_inputKey] = newValue.text - newValue + _input.value + }.addBracket() + updateInput(newValue) } - fun deleteTokens() = _input.update { + fun deleteTokens() { val newValue = if (_equalClicked.value) { TextFieldValue() } else { - it.deleteTokens() + _input.value.deleteTokens() } - _equalClicked.update { false } - _fractionJob?.cancel() - savedStateHandle[_inputKey] = newValue.text - newValue + updateInput(newValue) } - fun clearInput() = _input.update { - _equalClicked.update { false } - _fractionJob?.cancel() - savedStateHandle[_inputKey] = "" - TextFieldValue() - } + fun clearInput() = updateInput(TextFieldValue()) - fun updateInput(value: TextFieldValue) = _input.update { - // Without this line: will place token (even in the middle of the input) and place cursor at - // the end. This line also removes fractional output once user touches input text field + fun updateInput(value: TextFieldValue) { + _fractionJob?.cancel() _equalClicked.update { false } - value + _input.update { value } + savedStateHandle[_inputKey] = value.text } fun updateRadianMode(newValue: Boolean) = viewModelScope.launch { 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 4882c3c2..9e04c96f 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 @@ -114,50 +114,50 @@ import com.sadellie.unitto.core.ui.common.icons.iconpack.Tan @Composable internal fun CalculatorKeyboard( modifier: Modifier, + onAddTokenClick: (String) -> Unit, + onBracketsClick: () -> Unit, + onDeleteClick: () -> Unit, + onClearClick: () -> Unit, + onEqualClick: () -> Unit, + onAngleClick: (Boolean) -> Unit, radianMode: Boolean, - fractional: String, + showAcButton: Boolean, middleZero: Boolean, - acButton: Boolean, - addSymbol: (String) -> Unit, - addBracket: () -> Unit, - clearSymbols: () -> Unit, - deleteSymbol: () -> Unit, - toggleAngleMode: () -> Unit, - equal: () -> Unit + fractional: String, ) { - var invMode: Boolean by remember { mutableStateOf(false) } + var showInvButtons: Boolean by remember { mutableStateOf(false) } if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) { LandscapeKeyboard( modifier = modifier, + onAddTokenClick = onAddTokenClick, + onBracketsClick = onBracketsClick, + onDeleteClick = onDeleteClick, + onClearClick = onClearClick, + onEqualClick = onEqualClick, + onInvClick = { showInvButtons = !showInvButtons }, + onAngleClick = onAngleClick, + showInvButtons = showInvButtons, radianMode = radianMode, - fractional = fractional, + showAcButton = showAcButton, middleZero = middleZero, - addSymbol = addSymbol, - toggleAngleMode = toggleAngleMode, - deleteSymbol = deleteSymbol, - clearSymbols = clearSymbols, - equal = equal, - acButton = acButton, - addBracket = addBracket, - invMode = invMode, - toggleInvMode = { invMode = !invMode }, + fractional = fractional, ) } else { PortraitKeyboard( modifier = modifier, + onAddTokenClick = onAddTokenClick, + onBracketsClick = onBracketsClick, + onDeleteClick = onDeleteClick, + onClearClick = onClearClick, + onEqualClick = onEqualClick, + onInvClick = { showInvButtons = !showInvButtons }, + onAngleClick = onAngleClick, + showInvButtons = showInvButtons, radianMode = radianMode, - fractional = fractional, + showAcButton = showAcButton, middleZero = middleZero, - addSymbol = addSymbol, - toggleAngleMode = toggleAngleMode, - deleteSymbol = deleteSymbol, - clearSymbols = clearSymbols, - equal = equal, - acButton = acButton, - addBracket = addBracket, - invMode = invMode, - toggleInvMode = { invMode = !invMode }, + fractional = fractional, ) } } @@ -165,18 +165,18 @@ internal fun CalculatorKeyboard( @Composable private fun PortraitKeyboard( modifier: Modifier, + onAddTokenClick: (String) -> Unit, + onBracketsClick: () -> Unit, + onDeleteClick: () -> Unit, + onClearClick: () -> Unit, + onEqualClick: () -> Unit, + onInvClick: () -> Unit, + onAngleClick: (Boolean) -> Unit, + showInvButtons: Boolean, radianMode: Boolean, - fractional: String, + showAcButton: Boolean, middleZero: Boolean, - addSymbol: (String) -> Unit, - toggleAngleMode: () -> Unit, - deleteSymbol: () -> Unit, - clearSymbols: () -> Unit, - equal: () -> Unit, - acButton: Boolean, - addBracket: () -> Unit, - invMode: Boolean, - toggleInvMode: () -> Unit, + fractional: String, ) { val angleIcon = remember(radianMode) { if (radianMode) IconPack.Rad else IconPack.Deg } val angleIconDescription = remember(radianMode) { if (radianMode) R.string.keyboard_radian else R.string.keyboard_degree } @@ -205,7 +205,7 @@ private fun PortraitKeyboard( horizontalArrangement = Arrangement.Start ) { Crossfade( - targetState = invMode, + targetState = showInvButtons, label = "Inverse switch", modifier = Modifier .fillMaxWidth() @@ -217,21 +217,21 @@ private fun PortraitKeyboard( showAdditional = showAdditional, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.modulo) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Const.pi) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.factorial) } + KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.modulo) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { toggleAngleMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.arsinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.arcosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.actanBracket) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arsinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arcosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.actanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { toggleInvMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.expBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.expBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } } ) } else { @@ -240,21 +240,21 @@ private fun PortraitKeyboard( showAdditional = showAdditional, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.sqrt) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Const.pi) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Operator.factorial) } + KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.sqrt) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { toggleAngleMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.sinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.cosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.tanBracket) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.sinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.cosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.tanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { toggleInvMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.lnBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { addSymbol(Token.Func.logBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.lnBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.logBracket) } } ) } @@ -286,40 +286,40 @@ private fun PortraitKeyboard( .fillMaxWidth(width) .fillMaxHeight(height) - if (acButton) { - KeyboardButtonTertiary(mainButtonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightTall) { clearSymbols() } - KeyboardButtonFilled(mainButtonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightTall) { addBracket() } + if (showAcButton) { + KeyboardButtonTertiary(mainButtonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightTall) { onClearClick() } + KeyboardButtonFilled(mainButtonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightTall) { onBracketsClick() } } else { - KeyboardButtonFilled(mainButtonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.leftBracket) } - KeyboardButtonFilled(mainButtonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.rightBracket) } + KeyboardButtonFilled(mainButtonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(mainButtonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonFilled(mainButtonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.percent) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.divide) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.percent) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._7) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._8) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._9) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.multiply) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._9) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.multiply) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._4) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._5) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._6) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.minus) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.minus) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._1) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._2) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._3) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightTall) { addSymbol(Token.Operator.plus) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.plus) } if (middleZero) { - KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { addSymbol(Token.Digit.dot) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._0) } + KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._0) } - KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { addSymbol(Token.Digit.dot) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightTall, clearSymbols) { deleteSymbol() } - KeyboardButtonFilled(mainButtonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightTall) { equal() } + KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightTall, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(mainButtonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightTall) { onEqualClick() } } Spacer(modifier = Modifier.height(spacerHeight)) @@ -397,18 +397,18 @@ private fun AdditionalPortrait( @Composable private fun LandscapeKeyboard( modifier: Modifier, + onAddTokenClick: (String) -> Unit, + onBracketsClick: () -> Unit, + onDeleteClick: () -> Unit, + onClearClick: () -> Unit, + onEqualClick: () -> Unit, + onInvClick: () -> Unit, + onAngleClick: (Boolean) -> Unit, + showInvButtons: Boolean, radianMode: Boolean, - fractional: String, + showAcButton: Boolean, middleZero: Boolean, - addSymbol: (String) -> Unit, - toggleAngleMode: () -> Unit, - deleteSymbol: () -> Unit, - clearSymbols: () -> Unit, - equal: () -> Unit, - acButton: Boolean, - addBracket: () -> Unit, - invMode: Boolean, - toggleInvMode: () -> Unit, + fractional: String, ) { val angleIcon = remember(radianMode) { if (radianMode) IconPack.Rad else IconPack.Deg } val angleIconDescription = remember(radianMode) { if (radianMode) R.string.keyboard_radian else R.string.keyboard_degree } @@ -417,7 +417,7 @@ private fun LandscapeKeyboard( val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } Crossfade( - targetState = invMode, + targetState = showInvButtons, label = "Inverse switch", modifier = modifier ) { inverse -> @@ -431,51 +431,51 @@ private fun LandscapeKeyboard( .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { toggleAngleMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.modulo) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Const.pi) } - KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._7) } - KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._8) } - KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._9) } - if (acButton) { - KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { clearSymbols() } - KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { addBracket() } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.modulo) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._9) } + if (showAcButton) { + KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { onClearClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { onBracketsClick() } } else { - KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.leftBracket) } - KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.rightBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { toggleInvMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.factorial) } - KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._4) } - KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._5) } - KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._6) } - KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.multiply) } - KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.divide) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.multiply) } + KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.arsinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.arcosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.actanBracket) } - KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._1) } - KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._2) } - KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._3) } - KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.minus) } - KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.percent) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.arsinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.arcosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.actanBracket) } + KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.minus) } + KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.percent) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.expBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.expBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } if (middleZero) { - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { addSymbol(Token.Digit.dot) } - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._0) } - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { addSymbol(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, clearSymbols) { deleteSymbol() } - KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.plus) } - KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { equal() } + KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.plus) } + KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { onEqualClick() } } } else { KeypadFlow( @@ -487,51 +487,51 @@ private fun LandscapeKeyboard( .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { toggleAngleMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.sqrt) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Const.pi) } - KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._7) } - KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._8) } - KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._9) } - if (acButton) { - KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { clearSymbols() } - KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { addBracket() } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.sqrt) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._9) } + if (showAcButton) { + KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { onClearClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { onBracketsClick() } } else { - KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.leftBracket) } - KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.rightBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { toggleInvMode() } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Operator.factorial) } - KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._4) } - KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._5) } - KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._6) } - KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.multiply) } - KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.divide) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.multiply) } + KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.sinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.cosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.tanBracket) } - KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._1) } - KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._2) } - KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._3) } - KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.minus) } - KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.percent) } + KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.sinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.cosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.tanBracket) } + KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.minus) } + KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.percent) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.lnBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightShortAdditional) { addSymbol(Token.Func.logBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.lnBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.logBracket) } if (middleZero) { - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { addSymbol(Token.Digit.dot) } - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { addSymbol(Token.Digit._0) } - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { addSymbol(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, clearSymbols) { deleteSymbol() } - KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { addSymbol(Token.Operator.plus) } - KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { equal() } + KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.plus) } + KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { onEqualClick() } } } } @@ -542,18 +542,18 @@ private fun LandscapeKeyboard( private fun PreviewPortraitKeyboard() { PortraitKeyboard( modifier = Modifier.fillMaxHeight(), + onAddTokenClick = {}, + onBracketsClick = {}, + onDeleteClick = {}, + onClearClick = {}, + onEqualClick = {}, + onInvClick = {}, + onAngleClick = {}, + showInvButtons = false, radianMode = true, - fractional = Token.PERIOD, - addSymbol = {}, - clearSymbols = {}, - deleteSymbol = {}, - toggleAngleMode = {}, - equal = {}, + showAcButton = true, middleZero = false, - acButton = true, - addBracket = {}, - invMode = false, - toggleInvMode = {} + fractional = Token.PERIOD, ) } @@ -562,17 +562,17 @@ private fun PreviewPortraitKeyboard() { private fun PreviewLandscapeKeyboard() { LandscapeKeyboard( modifier = Modifier.fillMaxHeight(), + onAddTokenClick = {}, + onBracketsClick = {}, + onDeleteClick = {}, + onClearClick = {}, + onEqualClick = {}, + onInvClick = {}, + onAngleClick = {}, + showInvButtons = false, radianMode = true, - fractional = Token.PERIOD, - addSymbol = {}, - clearSymbols = {}, - deleteSymbol = {}, - toggleAngleMode = {}, - equal = {}, + showAcButton = true, middleZero = false, - acButton = true, - addBracket = {}, - invMode = false, - toggleInvMode = {} + fractional = Token.PERIOD, ) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt index 20f630bf..542f09d9 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.base.FormatterSymbols +import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowHeightSizeClass import com.sadellie.unitto.core.ui.common.textfield.ExpressionTextField @@ -78,26 +79,23 @@ fun TextBox( formatterSymbols = formatterSymbols ) if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) { + val calculationResultModifier = Modifier + .weight(2f) + .fillMaxWidth() + .padding(horizontal = 8.dp) + when (output) { is CalculationResult.Empty -> { Spacer( - modifier = Modifier - .weight(2f) - .fillMaxWidth() - .padding(horizontal = 8.dp) + modifier = calculationResultModifier ) } is CalculationResult.Default -> { - var outputTF by remember(output) { - mutableStateOf(TextFieldValue(output.text)) - } + var outputTF by remember(output) { mutableStateOf(TextFieldValue(output.text)) } ExpressionTextField( - modifier = Modifier - .weight(2f) - .fillMaxWidth() - .padding(horizontal = 8.dp), + modifier = calculationResultModifier, value = outputTF, minRatio = 0.8f, onValueChange = { outputTF = it }, @@ -108,17 +106,13 @@ fun TextBox( } is CalculationResult.Fraction -> { - var outputTF by remember(output) { - mutableStateOf(TextFieldValue(output.text)) - } + var outputTF by remember(output) { mutableStateOf(TextFieldValue(output.text)) } + ExpressionTextField( - modifier = Modifier - .weight(2f) - .fillMaxWidth() - .padding(horizontal = 8.dp), + modifier = calculationResultModifier, value = outputTF, minRatio = 0.8f, - onValueChange = { outputTF = it }, + onValueChange = { outputTF = outputTF.copy(selection = it.selection) }, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.6f), formatterSymbols = formatterSymbols, readOnly = true, @@ -127,11 +121,8 @@ fun TextBox( is CalculationResult.DivideByZeroError -> { SimpleTextField( - modifier = Modifier - .weight(2f) - .fillMaxWidth() - .padding(horizontal = 8.dp), - value = TextFieldValue(stringResource(output.label)), + modifier = calculationResultModifier, + value = TextFieldValue(stringResource(R.string.calculator_divide_by_zero_error)), minRatio = 0.8f, onValueChange = {}, textColor = MaterialTheme.colorScheme.error, @@ -145,7 +136,7 @@ fun TextBox( .weight(2f) .fillMaxWidth() .padding(horizontal = 8.dp), - value = TextFieldValue(stringResource(output.label)), + value = TextFieldValue(stringResource(R.string.error_label)), minRatio = 0.8f, onValueChange = {}, textColor = MaterialTheme.colorScheme.error, From 2ddbc496d56fd9dfe0245efb9d991014f0ef2666 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 22:02:42 +0300 Subject: [PATCH 21/46] Code clean up --- .../com/sadellie/unitto/core/ui/Formatter.kt | 18 --- .../core/ui/common/icons/iconpack/Down.kt | 60 -------- .../core/ui/common/icons/iconpack/Enter.kt | 62 -------- .../core/ui/common/icons/iconpack/Pop.kt | 137 ------------------ .../core/ui/common/icons/iconpack/Swap.kt | 71 --------- .../core/ui/common/icons/iconpack/Unary.kt | 75 ---------- .../core/ui/common/icons/iconpack/Up.kt | 60 -------- .../calculator/components/HistoryList.kt | 3 +- .../feature/converter/components/ChipsRow.kt | 3 +- .../settings/bouncingemoji/BouncingEmoji.kt | 7 +- 10 files changed, 8 insertions(+), 488 deletions(-) delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Down.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Enter.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pop.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Swap.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Unary.kt delete mode 100644 core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Up.kt 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 deleted file mode 100644 index 7ea14dce..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Unitto is a calculator 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 . - */ - diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Down.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Down.kt deleted file mode 100644 index 11769bb2..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Down.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Down: ImageVector - get() { - if (_down != null) { - return _down!! - } - _down = Builder(name = "Down", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, - viewportWidth = 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF1C1B1F)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(11.5453f, 8.5322f) - verticalLineTo(14.0663f) - lineTo(8.9999f, 11.5208f) - lineTo(8.3635f, 12.1686f) - lineTo(11.9999f, 15.8049f) - lineTo(15.6363f, 12.1686f) - lineTo(14.9999f, 11.5208f) - lineTo(12.4544f, 14.0663f) - verticalLineTo(8.5322f) - horizontalLineTo(11.5453f) - close() - } - } - .build() - return _down!! - } - -private var _down: ImageVector? = null diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Enter.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Enter.kt deleted file mode 100644 index 5f39492f..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Enter.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Enter: ImageVector - get() { - if (_enter != null) { - return _enter!! - } - _enter = Builder(name = "Enter", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, - viewportWidth = 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF1C1B1F)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(15.2085f, 8.5322f) - lineTo(15.2085f, 13.6659f) - lineTo(10.4277f, 13.6659f) - lineTo(11.9679f, 15.1953f) - lineTo(11.3582f, 15.8049f) - lineTo(8.7914f, 13.2381f) - lineTo(11.3689f, 10.6605f) - lineTo(11.9679f, 11.2702f) - lineTo(10.4277f, 12.8103f) - lineTo(14.3529f, 12.8103f) - lineTo(14.3529f, 8.5322f) - lineTo(15.2085f, 8.5322f) - close() - } - } - .build() - return _enter!! - } - -private var _enter: ImageVector? = null diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pop.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pop.kt deleted file mode 100644 index 736139f7..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pop.kt +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Pop: ImageVector - get() { - if (_pop != null) { - return _pop!! - } - _pop = Builder(name = "Pop", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, viewportWidth - = 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(5.2202f, 12.2187f) - curveTo(5.4969f, 12.2187f, 5.7402f, 12.182f, 5.9502f, 12.1087f) - curveTo(6.1636f, 12.0354f, 6.3419f, 11.9337f, 6.4852f, 11.8037f) - curveTo(6.6319f, 11.6704f, 6.7419f, 11.512f, 6.8152f, 11.3287f) - curveTo(6.8886f, 11.1454f, 6.9252f, 10.9437f, 6.9252f, 10.7237f) - curveTo(6.9252f, 10.267f, 6.7836f, 9.9104f, 6.5002f, 9.6537f) - curveTo(6.2202f, 9.397f, 5.7936f, 9.2687f, 5.2202f, 9.2687f) - horizontalLineTo(4.0702f) - verticalLineTo(12.2187f) - horizontalLineTo(5.2202f) - close() - moveTo(5.2202f, 8.5037f) - curveTo(5.6736f, 8.5037f, 6.0669f, 8.557f, 6.4002f, 8.6637f) - curveTo(6.7369f, 8.767f, 7.0152f, 8.9154f, 7.2352f, 9.1087f) - curveTo(7.4552f, 9.302f, 7.6186f, 9.5354f, 7.7252f, 9.8087f) - curveTo(7.8352f, 10.082f, 7.8902f, 10.387f, 7.8902f, 10.7237f) - curveTo(7.8902f, 11.057f, 7.8319f, 11.362f, 7.7152f, 11.6387f) - curveTo(7.5986f, 11.9154f, 7.4269f, 12.1537f, 7.2002f, 12.3537f) - curveTo(6.9769f, 12.5537f, 6.6986f, 12.7104f, 6.3652f, 12.8237f) - curveTo(6.0352f, 12.9337f, 5.6536f, 12.9887f, 5.2202f, 12.9887f) - horizontalLineTo(4.0702f) - verticalLineTo(15.6687f) - horizontalLineTo(3.1052f) - verticalLineTo(8.5037f) - horizontalLineTo(5.2202f) - close() - moveTo(15.5311f, 12.0887f) - curveTo(15.5311f, 12.6254f, 15.4461f, 13.1187f, 15.2761f, 13.5687f) - curveTo(15.1061f, 14.0154f, 14.8661f, 14.4004f, 14.5561f, 14.7237f) - curveTo(14.2461f, 15.047f, 13.8728f, 15.2987f, 13.4361f, 15.4787f) - curveTo(13.0028f, 15.6554f, 12.5228f, 15.7437f, 11.9961f, 15.7437f) - curveTo(11.4694f, 15.7437f, 10.9894f, 15.6554f, 10.5561f, 15.4787f) - curveTo(10.1228f, 15.2987f, 9.7511f, 15.047f, 9.4411f, 14.7237f) - curveTo(9.1311f, 14.4004f, 8.8911f, 14.0154f, 8.7211f, 13.5687f) - curveTo(8.5511f, 13.1187f, 8.4661f, 12.6254f, 8.4661f, 12.0887f) - curveTo(8.4661f, 11.552f, 8.5511f, 11.0604f, 8.7211f, 10.6137f) - curveTo(8.8911f, 10.1637f, 9.1311f, 9.777f, 9.4411f, 9.4537f) - curveTo(9.7511f, 9.127f, 10.1228f, 8.8737f, 10.5561f, 8.6937f) - curveTo(10.9894f, 8.5137f, 11.4694f, 8.4237f, 11.9961f, 8.4237f) - curveTo(12.5228f, 8.4237f, 13.0028f, 8.5137f, 13.4361f, 8.6937f) - curveTo(13.8728f, 8.8737f, 14.2461f, 9.127f, 14.5561f, 9.4537f) - curveTo(14.8661f, 9.777f, 15.1061f, 10.1637f, 15.2761f, 10.6137f) - curveTo(15.4461f, 11.0604f, 15.5311f, 11.552f, 15.5311f, 12.0887f) - close() - moveTo(14.5361f, 12.0887f) - curveTo(14.5361f, 11.6487f, 14.4761f, 11.2537f, 14.3561f, 10.9037f) - curveTo(14.2361f, 10.5537f, 14.0661f, 10.2587f, 13.8461f, 10.0187f) - curveTo(13.6261f, 9.7754f, 13.3594f, 9.5887f, 13.0461f, 9.4587f) - curveTo(12.7328f, 9.3287f, 12.3828f, 9.2637f, 11.9961f, 9.2637f) - curveTo(11.6128f, 9.2637f, 11.2644f, 9.3287f, 10.9511f, 9.4587f) - curveTo(10.6378f, 9.5887f, 10.3694f, 9.7754f, 10.1461f, 10.0187f) - curveTo(9.9261f, 10.2587f, 9.7561f, 10.5537f, 9.6361f, 10.9037f) - curveTo(9.5161f, 11.2537f, 9.4561f, 11.6487f, 9.4561f, 12.0887f) - curveTo(9.4561f, 12.5287f, 9.5161f, 12.9237f, 9.6361f, 13.2737f) - curveTo(9.7561f, 13.6204f, 9.9261f, 13.9154f, 10.1461f, 14.1587f) - curveTo(10.3694f, 14.3987f, 10.6378f, 14.5837f, 10.9511f, 14.7137f) - curveTo(11.2644f, 14.8404f, 11.6128f, 14.9037f, 11.9961f, 14.9037f) - curveTo(12.3828f, 14.9037f, 12.7328f, 14.8404f, 13.0461f, 14.7137f) - curveTo(13.3594f, 14.5837f, 13.6261f, 14.3987f, 13.8461f, 14.1587f) - curveTo(14.0661f, 13.9154f, 14.2361f, 13.6204f, 14.3561f, 13.2737f) - curveTo(14.4761f, 12.9237f, 14.5361f, 12.5287f, 14.5361f, 12.0887f) - close() - moveTo(18.8339f, 12.2187f) - curveTo(19.1106f, 12.2187f, 19.3539f, 12.182f, 19.5639f, 12.1087f) - curveTo(19.7772f, 12.0354f, 19.9556f, 11.9337f, 20.0989f, 11.8037f) - curveTo(20.2456f, 11.6704f, 20.3556f, 11.512f, 20.4289f, 11.3287f) - curveTo(20.5022f, 11.1454f, 20.5389f, 10.9437f, 20.5389f, 10.7237f) - curveTo(20.5389f, 10.267f, 20.3972f, 9.9104f, 20.1139f, 9.6537f) - curveTo(19.8339f, 9.397f, 19.4072f, 9.2687f, 18.8339f, 9.2687f) - horizontalLineTo(17.6839f) - verticalLineTo(12.2187f) - horizontalLineTo(18.8339f) - close() - moveTo(18.8339f, 8.5037f) - curveTo(19.2872f, 8.5037f, 19.6806f, 8.557f, 20.0139f, 8.6637f) - curveTo(20.3506f, 8.767f, 20.6289f, 8.9154f, 20.8489f, 9.1087f) - curveTo(21.0689f, 9.302f, 21.2322f, 9.5354f, 21.3389f, 9.8087f) - curveTo(21.4489f, 10.082f, 21.5039f, 10.387f, 21.5039f, 10.7237f) - curveTo(21.5039f, 11.057f, 21.4456f, 11.362f, 21.3289f, 11.6387f) - curveTo(21.2122f, 11.9154f, 21.0406f, 12.1537f, 20.8139f, 12.3537f) - curveTo(20.5906f, 12.5537f, 20.3122f, 12.7104f, 19.9789f, 12.8237f) - curveTo(19.6489f, 12.9337f, 19.2672f, 12.9887f, 18.8339f, 12.9887f) - horizontalLineTo(17.6839f) - verticalLineTo(15.6687f) - horizontalLineTo(16.7189f) - verticalLineTo(8.5037f) - horizontalLineTo(18.8339f) - close() - } - } - .build() - return _pop!! - } - -private var _pop: ImageVector? = null diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Swap.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Swap.kt deleted file mode 100644 index ed6b9b9f..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Swap.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Swap: ImageVector - get() { - if (_swap != null) { - return _swap!! - } - _swap = Builder(name = "Swap", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, - viewportWidth = 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF1C1B1F)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(10.5454f, 12.5325f) - verticalLineTo(9.9234f) - lineTo(9.609f, 10.8597f) - lineTo(9.0908f, 10.3507f) - lineTo(10.909f, 8.5325f) - lineTo(12.7272f, 10.3507f) - lineTo(12.209f, 10.8597f) - lineTo(11.2726f, 9.9234f) - verticalLineTo(12.5325f) - horizontalLineTo(10.5454f) - close() - moveTo(13.0908f, 15.8052f) - lineTo(11.2726f, 13.987f) - lineTo(11.7908f, 13.4779f) - lineTo(12.7272f, 14.4143f) - verticalLineTo(11.8052f) - horizontalLineTo(13.4545f) - verticalLineTo(14.4143f) - lineTo(14.3908f, 13.4779f) - lineTo(14.909f, 13.987f) - lineTo(13.0908f, 15.8052f) - close() - } - } - .build() - return _swap!! - } - -private var _swap: ImageVector? = null diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Unary.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Unary.kt deleted file mode 100644 index 4a931c44..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Unary.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Unary: ImageVector - get() { - if (_unary != null) { - return _unary!! - } - _unary = Builder(name = "Unary", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, - viewportWidth = 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(9.0454f, 11.1177f) - horizontalLineTo(14.9545f) - verticalLineTo(11.8933f) - horizontalLineTo(9.0454f) - verticalLineTo(11.1177f) - close() - } - path(fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(12.4431f, 8.5325f) - lineTo(12.4431f, 14.4416f) - horizontalLineTo(11.6676f) - lineTo(11.6676f, 8.5325f) - lineTo(12.4431f, 8.5325f) - close() - } - path(fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(9.0454f, 15.1234f) - horizontalLineTo(14.9545f) - verticalLineTo(15.8052f) - horizontalLineTo(9.0454f) - verticalLineTo(15.1234f) - close() - } - } - .build() - return _unary!! - } - -private var _unary: ImageVector? = null diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Up.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Up.kt deleted file mode 100644 index e2197970..00000000 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Up.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Unitto is a calculator 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.icons.iconpack - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.icons.IconPack - -@Suppress("UnusedReceiverParameter") -val IconPack.Up: ImageVector - get() { - if (_up != null) { - return _up!! - } - _up = Builder(name = "Up", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, viewportWidth = - 24.0f, viewportHeight = 24.0f).apply { - path(fill = SolidColor(Color(0xFF1C1B1F)), stroke = null, strokeLineWidth = 0.0f, - strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, - pathFillType = NonZero) { - moveTo(11.5453f, 15.8052f) - verticalLineTo(10.2711f) - lineTo(8.9999f, 12.8166f) - lineTo(8.3635f, 12.1688f) - lineTo(11.9999f, 8.5325f) - lineTo(15.6363f, 12.1688f) - lineTo(14.9999f, 12.8166f) - lineTo(12.4544f, 10.2711f) - verticalLineTo(15.8052f) - horizontalLineTo(11.5453f) - close() - } - } - .build() - return _up!! - } - -private var _up: ImageVector? = null diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt index 39ced770..edfbcb37 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -65,7 +65,8 @@ internal fun HistoryList( showDeleteButtons: Boolean, ) { Crossfade( - targetState = historyItems.isEmpty() + targetState = historyItems.isEmpty(), + label = "History list", ) { emptyList -> if (emptyList) { HistoryListPlaceholder( diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt index 9b21b646..7f3e4251 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt @@ -74,7 +74,8 @@ internal fun ChipsRow( transitionSpec = { expandVertically(expandFrom = Alignment.Top) { it } + fadeIn() togetherWith shrinkVertically(shrinkTowards = Alignment.Top) { it } + fadeOut() - } + }, + label = "Expand chips row", ) { isExpanded -> FlexRow( modifier = modifier, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt index 4bbb2706..5e0d6817 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt @@ -110,8 +110,8 @@ private fun BouncingEmojiScreen( var x by rememberSaveable { mutableFloatStateOf((width - ballSizePx) * initialX) } var y by rememberSaveable { mutableFloatStateOf((height - ballSizePx) * initialY) } - val animatedX = animateFloatAsState(x) - val animatedY = animateFloatAsState(y) + val animatedX = animateFloatAsState(x, label = "X position") + val animatedY = animateFloatAsState(y, label = "Y position") var xSpeed by rememberSaveable { mutableFloatStateOf(10f) } var ySpeed by rememberSaveable { mutableFloatStateOf(10f) } @@ -204,7 +204,8 @@ private fun AnimatedText( transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith slideOutVertically { height -> -height } + fadeOut() - } + }, + label = "Text animation", ) { Text( text = it, From b0a04f47977b26cb04b1a9dc316e03ac4c1ff41a Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 22:04:08 +0300 Subject: [PATCH 22/46] Small bump (not the Ed Sheeran song, I mean dependencies bump) --- gradle/libs.versions.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7def97b7..ec338ac2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,20 +3,20 @@ versionCode = "37" versionName = "Red Salsa" androidxBrowserBrowser = "1.7.0" -androidGradlePlugin = "8.2.1" +androidGradlePlugin = "8.2.2" androidxActivityActivityCompose = "1.8.2" androidxAppCompatAppCompat = "1.6.1" -androidxCompose = "1.6.0-rc01" -androidxComposeCompiler = "1.5.8" -androidxComposeMaterial3 = "1.2.0-beta02" +androidxCompose = "1.6.1" +androidxComposeCompiler = "1.5.9" +androidxComposeMaterial3 = "1.2.0" androidxCoreCoreKts = "1.12.0" androidxGlanceGlance = "1.0.0" androidxDatastoreDatastorePreferences = "1.0.0" androidxEspresso = "3.5.1" androidxHiltHiltNavigationCompose = "1.1.0" -androidxMacroBenchmark = "1.2.2" +androidxMacroBenchmark = "1.2.3" androidxLifecycleLifecycleRuntimeCompose = "2.7.0" -androidxNavigationNavigationCompose = "2.7.6" +androidxNavigationNavigationCompose = "2.7.7" androidxProfileinstallerProfileinstaller = "1.3.1" androidxRoom = "2.6.1" androidxTest = "1.5.0" From 76685339d742ff5f5f0bfec2de98988eec4aef5c Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 22:42:13 +0300 Subject: [PATCH 23/46] Save calculator keyboard state closes #175 --- .../repository/UserPreferencesRepository.kt | 4 + .../model/userprefs/CalculatorPreferences.kt | 2 + .../unitto/data/userprefs/PreferenceExt.kt | 8 ++ .../unitto/data/userprefs/PreferenceModels.kt | 2 + .../unitto/data/userprefs/PrefsKeys.kt | 2 + .../UserPreferencesRepositoryImpl.kt | 14 +++ .../calculator/CalculatorScreenTest.kt | 18 +++- .../feature/calculator/CalculatorScreen.kt | 23 +++-- .../feature/calculator/CalculatorUIState.kt | 2 + .../feature/calculator/CalculatorViewModel.kt | 10 +++ .../components/CalculatorKeyboard.kt | 87 ++++++++++--------- .../calculator/CalculatorSettingsScreen.kt | 2 + 12 files changed, 124 insertions(+), 50 deletions(-) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt index d1304343..c66c76eb 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/repository/UserPreferencesRepository.kt @@ -96,4 +96,8 @@ interface UserPreferencesRepository { suspend fun updatePartialHistoryView(enabled: Boolean) suspend fun updateAcButton(enabled: Boolean) + + suspend fun updateAdditionalButtons(enabled: Boolean) + + suspend fun updateInverseMode(enabled: Boolean) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt index 44f063ae..b73e03d1 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/CalculatorPreferences.kt @@ -25,6 +25,8 @@ interface CalculatorPreferences { val formatterSymbols: FormatterSymbols val middleZero: Boolean val acButton: Boolean + val additionalButtons: Boolean + val inverseMode: Boolean val partialHistoryView: Boolean val precision: Int val outputFormat: Int diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index 15e54fbd..a92d7234 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -147,6 +147,14 @@ internal fun Preferences.getAcButton(): Boolean { return this[PrefsKeys.AC_BUTTON] ?: true } +internal fun Preferences.getAdditionalButtons(): Boolean { + return this[PrefsKeys.ADDITIONAL_BUTTONS] ?: false +} + +internal fun Preferences.getInverseMode(): Boolean { + return this[PrefsKeys.INVERSE_MODE] ?: false +} + internal fun List.packToString(): String = this.joinToString(",") private inline fun T.letTryOrNull(block: (T) -> R): R? = try { diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt index 53bfaa16..98913d3f 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceModels.kt @@ -57,6 +57,8 @@ data class CalculatorPreferencesImpl( override val formatterSymbols: FormatterSymbols, override val middleZero: Boolean, override val acButton: Boolean, + override val additionalButtons: Boolean, + override val inverseMode: Boolean, override val partialHistoryView: Boolean, override val precision: Int, override val outputFormat: Int, diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt index 8d38aae7..6a82a830 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PrefsKeys.kt @@ -49,6 +49,8 @@ object PrefsKeys { // CALCULATOR val RADIAN_MODE = booleanPreferencesKey("RADIAN_MODE_PREF_KEY") val PARTIAL_HISTORY_VIEW = booleanPreferencesKey("PARTIAL_HISTORY_VIEW_PREF_KEY") + val ADDITIONAL_BUTTONS = booleanPreferencesKey("ADDITIONAL_BUTTONS_PREF_KEY") + val INVERSE_MODE = booleanPreferencesKey("INVERSE_MODE_PREF_KEY") // UNIT CONVERTER val LATEST_LEFT_SIDE = stringPreferencesKey("LATEST_LEFT_SIDE_PREF_KEY") diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt index 0619eb07..5277ddb2 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt @@ -84,6 +84,8 @@ class UserPreferencesRepositoryImpl @Inject constructor( precision = preferences.getDigitsPrecision(), outputFormat = preferences.getOutputFormat(), acButton = preferences.getAcButton(), + additionalButtons = preferences.getAdditionalButtons(), + inverseMode = preferences.getInverseMode(), ) } @@ -312,4 +314,16 @@ class UserPreferencesRepositoryImpl @Inject constructor( preferences[PrefsKeys.AC_BUTTON] = enabled } } + + override suspend fun updateAdditionalButtons(enabled: Boolean) { + dataStore.edit { preferences -> + preferences[PrefsKeys.ADDITIONAL_BUTTONS] = enabled + } + } + + override suspend fun updateInverseMode(enabled: Boolean) { + dataStore.edit { preferences -> + preferences[PrefsKeys.INVERSE_MODE] = enabled + } + } } diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index a0e1dd50..85e1e21e 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -51,6 +51,8 @@ class CalculatorScreenTest { history = emptyList(), middleZero = false, acButton = true, + additionalButtons = false, + inverseMode = false, partialHistoryView = true ), openDrawer = {}, @@ -60,9 +62,12 @@ class CalculatorScreenTest { onDeleteClick = {}, onClearClick = {}, onEqualClick = {}, - onAngleClick = {}, + onRadianModeClick = {}, + onAdditionalButtonsClick = {}, + onInverseModeClick = {}, onClearHistoryClick = {}, - ) {} + onDeleteHistoryItemClick = {}, + ) } onNodeWithTag("loading").assertDoesNotExist() @@ -83,6 +88,8 @@ class CalculatorScreenTest { history = emptyList(), middleZero = false, acButton = true, + additionalButtons = false, + inverseMode = false, partialHistoryView = true ), openDrawer = {}, @@ -92,9 +99,12 @@ class CalculatorScreenTest { onDeleteClick = {}, onClearClick = {}, onEqualClick = {}, - onAngleClick = {}, + onRadianModeClick = {}, + onAdditionalButtonsClick = {}, + onInverseModeClick = {}, onClearHistoryClick = {}, - ) {} + onDeleteHistoryItemClick = {}, + ) } onNodeWithTag("inputBox") diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index 46efaa8c..37db5b22 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -97,7 +97,9 @@ internal fun CalculatorRoute( onDeleteClick = viewModel::deleteTokens, onClearClick = viewModel::clearInput, onEqualClick = viewModel::equal, - onAngleClick = viewModel::updateRadianMode, + onRadianModeClick = viewModel::updateRadianMode, + onAdditionalButtonsClick = viewModel::updateAdditionalButtons, + onInverseModeClick = viewModel::updateInverseMode, onClearHistoryClick = viewModel::clearHistory, onDeleteHistoryItemClick = viewModel::deleteHistoryItem, ) @@ -114,7 +116,9 @@ internal fun Ready( onDeleteClick: () -> Unit, onClearClick: () -> Unit, onEqualClick: () -> Unit, - onAngleClick: (Boolean) -> Unit, + onRadianModeClick: (Boolean) -> Unit, + onAdditionalButtonsClick: (Boolean) -> Unit, + onInverseModeClick: (Boolean) -> Unit, onClearHistoryClick: () -> Unit, onDeleteHistoryItemClick: (HistoryItem) -> Unit, ) { @@ -248,8 +252,12 @@ internal fun Ready( onDeleteClick = onDeleteClick, onClearClick = onClearClick, onEqualClick = { focusManager.clearFocus(); onEqualClick() }, - onAngleClick = onAngleClick, radianMode = uiState.radianMode, + onRadianModeClick = onRadianModeClick, + additionalButtons = uiState.additionalButtons, + onAdditionalButtonsClick = onAdditionalButtonsClick, + inverseMode = uiState.inverseMode, + onInverseModeClick = onInverseModeClick, showAcButton = uiState.acButton, middleZero = uiState.middleZero, fractional = uiState.formatterSymbols.fractional, @@ -329,6 +337,8 @@ private fun PreviewCalculatorScreen() { history = historyItems, middleZero = false, acButton = true, + additionalButtons = false, + inverseMode = false, partialHistoryView = true ), openDrawer = {}, @@ -338,7 +348,10 @@ private fun PreviewCalculatorScreen() { onDeleteClick = {}, onClearClick = {}, onEqualClick = {}, - onAngleClick = {}, + onRadianModeClick = {}, + onAdditionalButtonsClick = {}, + onInverseModeClick = {}, onClearHistoryClick = {}, - ) {} + onDeleteHistoryItemClick = {}, + ) } \ No newline at end of file diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt index 3a2b844a..80455628 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt @@ -35,6 +35,8 @@ internal sealed class CalculatorUIState { val history: List, val middleZero: Boolean, val acButton: Boolean, + val additionalButtons: Boolean, + val inverseMode: Boolean, val partialHistoryView: Boolean, ) : CalculatorUIState() } 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 98b6714f..6889e942 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 @@ -83,6 +83,8 @@ internal class CalculatorViewModel @Inject constructor( history = history, middleZero = prefs.middleZero, acButton = prefs.acButton, + additionalButtons = prefs.additionalButtons, + inverseMode = prefs.inverseMode, partialHistoryView = prefs.partialHistoryView, ) } @@ -158,6 +160,14 @@ internal class CalculatorViewModel @Inject constructor( userPrefsRepository.updateRadianMode(newValue) } + fun updateAdditionalButtons(newValue: Boolean) = viewModelScope.launch { + userPrefsRepository.updateAdditionalButtons(newValue) + } + + fun updateInverseMode(newValue: Boolean) = viewModelScope.launch { + userPrefsRepository.updateInverseMode(newValue) + } + fun clearHistory() = viewModelScope.launch(Dispatchers.IO) { calculatorHistoryRepository.clear() } 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 9e04c96f..d629b9ce 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 @@ -44,9 +44,7 @@ import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate @@ -119,14 +117,16 @@ internal fun CalculatorKeyboard( onDeleteClick: () -> Unit, onClearClick: () -> Unit, onEqualClick: () -> Unit, - onAngleClick: (Boolean) -> Unit, radianMode: Boolean, + onRadianModeClick: (Boolean) -> Unit, + additionalButtons: Boolean, + onAdditionalButtonsClick: (Boolean) -> Unit, + inverseMode: Boolean, + onInverseModeClick: (Boolean) -> Unit, showAcButton: Boolean, middleZero: Boolean, fractional: String, ) { - var showInvButtons: Boolean by remember { mutableStateOf(false) } - if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) { LandscapeKeyboard( modifier = modifier, @@ -135,10 +135,10 @@ internal fun CalculatorKeyboard( onDeleteClick = onDeleteClick, onClearClick = onClearClick, onEqualClick = onEqualClick, - onInvClick = { showInvButtons = !showInvButtons }, - onAngleClick = onAngleClick, - showInvButtons = showInvButtons, radianMode = radianMode, + onRadianModeClick = onRadianModeClick, + inverseMode = inverseMode, + onInverseModeClick = onInverseModeClick, showAcButton = showAcButton, middleZero = middleZero, fractional = fractional, @@ -151,10 +151,12 @@ internal fun CalculatorKeyboard( onDeleteClick = onDeleteClick, onClearClick = onClearClick, onEqualClick = onEqualClick, - onInvClick = { showInvButtons = !showInvButtons }, - onAngleClick = onAngleClick, - showInvButtons = showInvButtons, radianMode = radianMode, + onRadianModeClick = onRadianModeClick, + additionalButtons = additionalButtons, + onAdditionalButtonsClick = onAdditionalButtonsClick, + inverseMode = inverseMode, + onInverseModeClick = onInverseModeClick, showAcButton = showAcButton, middleZero = middleZero, fractional = fractional, @@ -170,10 +172,12 @@ private fun PortraitKeyboard( onDeleteClick: () -> Unit, onClearClick: () -> Unit, onEqualClick: () -> Unit, - onInvClick: () -> Unit, - onAngleClick: (Boolean) -> Unit, - showInvButtons: Boolean, radianMode: Boolean, + onRadianModeClick: (Boolean) -> Unit, + additionalButtons: Boolean, + onAdditionalButtonsClick: (Boolean) -> Unit, + inverseMode: Boolean, + onInverseModeClick: (Boolean) -> Unit, showAcButton: Boolean, middleZero: Boolean, fractional: String, @@ -184,9 +188,8 @@ private fun PortraitKeyboard( val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } - var showAdditional: Boolean by remember { mutableStateOf(false) } val expandRotation: Float by animateFloatAsState( - targetValue = if (showAdditional) 180f else 0f, + targetValue = if (additionalButtons) 180f else 0f, animationSpec = tween(easing = FastOutSlowInEasing), label = "Rotate on expand" ) @@ -205,7 +208,7 @@ private fun PortraitKeyboard( horizontalArrangement = Arrangement.Start ) { Crossfade( - targetState = showInvButtons, + targetState = inverseMode, label = "Inverse switch", modifier = Modifier .fillMaxWidth() @@ -214,7 +217,7 @@ private fun PortraitKeyboard( if (inverse) { AdditionalPortrait( modifier = Modifier.fillMaxWidth(), - showAdditional = showAdditional, + additionalButtons = additionalButtons, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.modulo) } @@ -223,12 +226,12 @@ private fun PortraitKeyboard( KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arsinBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arcosBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.actanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.expBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } @@ -237,7 +240,7 @@ private fun PortraitKeyboard( } else { AdditionalPortrait( modifier = Modifier.fillMaxWidth(), - showAdditional = showAdditional, + additionalButtons = additionalButtons, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.sqrt) } @@ -246,12 +249,12 @@ private fun PortraitKeyboard( KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.sinBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.cosBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.tanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.lnBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.logBracket) } @@ -265,7 +268,7 @@ private fun PortraitKeyboard( contentAlignment = Alignment.Center ) { IconButton( - onClick = { showAdditional = !showAdditional }, + onClick = { onAdditionalButtonsClick(!additionalButtons) }, colors = IconButtonDefaults.iconButtonColors(containerColor = MaterialTheme.colorScheme.inverseOnSurface) ) { Icon(Icons.Default.ExpandMore, null, Modifier.rotate(expandRotation)) @@ -333,7 +336,7 @@ private fun PortraitKeyboard( * * Height: 3 buttons * - * @param showAdditional When `true` reveals [content2] with animation. + * @param additionalButtons When `true` reveals [content2] with animation. * @param buttonHeight Button height in [Dp]. * @param content1 First row of buttons. * @param content2 Second and third rows of buttons. @@ -341,13 +344,13 @@ private fun PortraitKeyboard( @Composable private fun AdditionalPortrait( modifier: Modifier, - showAdditional: Boolean, + additionalButtons: Boolean, buttonHeight: Dp, content1: @Composable (buttonModifier: Modifier) -> Unit, content2: @Composable (buttonModifier: Modifier) -> Unit ) { AnimatedContent( - targetState = showAdditional, + targetState = additionalButtons, modifier = modifier, label = "Additional buttons reveal", transitionSpec = { @@ -402,10 +405,10 @@ private fun LandscapeKeyboard( onDeleteClick: () -> Unit, onClearClick: () -> Unit, onEqualClick: () -> Unit, - onInvClick: () -> Unit, - onAngleClick: (Boolean) -> Unit, - showInvButtons: Boolean, radianMode: Boolean, + onRadianModeClick: (Boolean) -> Unit, + inverseMode: Boolean, + onInverseModeClick: (Boolean) -> Unit, showAcButton: Boolean, middleZero: Boolean, fractional: String, @@ -417,7 +420,7 @@ private fun LandscapeKeyboard( val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } Crossfade( - targetState = showInvButtons, + targetState = inverseMode, label = "Inverse switch", modifier = modifier ) { inverse -> @@ -431,7 +434,7 @@ private fun LandscapeKeyboard( .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.modulo) } KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } @@ -445,7 +448,7 @@ private fun LandscapeKeyboard( KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } @@ -487,7 +490,7 @@ private fun LandscapeKeyboard( .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.sqrt) } KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } @@ -501,7 +504,7 @@ private fun LandscapeKeyboard( KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) } KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } @@ -547,10 +550,12 @@ private fun PreviewPortraitKeyboard() { onDeleteClick = {}, onClearClick = {}, onEqualClick = {}, - onInvClick = {}, - onAngleClick = {}, - showInvButtons = false, radianMode = true, + onRadianModeClick = {}, + additionalButtons = false, + onAdditionalButtonsClick = {}, + inverseMode = false, + onInverseModeClick = {}, showAcButton = true, middleZero = false, fractional = Token.PERIOD, @@ -567,10 +572,10 @@ private fun PreviewLandscapeKeyboard() { onDeleteClick = {}, onClearClick = {}, onEqualClick = {}, - onInvClick = {}, - onAngleClick = {}, - showInvButtons = false, radianMode = true, + onRadianModeClick = {}, + inverseMode = false, + onInverseModeClick = {}, showAcButton = true, middleZero = false, fractional = Token.PERIOD, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt index 0a684734..cee574b9 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt @@ -87,6 +87,8 @@ private fun PreviewCalculatorSettingsScreenStandard() { formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), middleZero = false, acButton = false, + additionalButtons = false, + inverseMode = false, partialHistoryView = false, precision = 3, outputFormat = OutputFormat.PLAIN From 4be17569ba966ebed4e6eed53c7f44e5256c9a62 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 22:53:51 +0300 Subject: [PATCH 24/46] Fix SettingsNavigation transitions --- .../unitto/feature/settings/navigation/SettingsNavigation.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt index b620ae10..3c6b1d85 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt @@ -23,6 +23,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.navDeepLink import com.sadellie.unitto.core.ui.model.DrawerItem +import com.sadellie.unitto.core.ui.unittoComposable import com.sadellie.unitto.core.ui.unittoNavigation import com.sadellie.unitto.core.ui.unittoStackedComposable import com.sadellie.unitto.feature.settings.SettingsRoute @@ -67,7 +68,7 @@ fun NavGraphBuilder.settingGraph( navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } ) ) { - unittoStackedComposable(start) { + unittoComposable(start) { SettingsRoute( openDrawer = openDrawer, navControllerAction = navController::navigate From 8b21721f485d33c8e1be4fcf4f82d404515992b6 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Wed, 14 Feb 2024 23:31:33 +0300 Subject: [PATCH 25/46] Endless PagedIsland --- .../unitto/core/ui/common/PagedIsland.kt | 19 ++++++++++--------- .../components/DateTimeResultBlock.kt | 3 +-- .../settings/formatting/FormattingScreen.kt | 3 +-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt index 9b076f68..84944998 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt @@ -49,7 +49,7 @@ import kotlinx.coroutines.launch * [HorizontalPager] with a background and a page indicator. * * @param modifier [Modifier] that will be applied to the surround [Column]. - * @param pagerState [PagerState] that will passed [HorizontalPager]. + * @param pageCount Page count for [PagerState] that will passed [HorizontalPager]. * @param backgroundColor [Color] for background. * @param pageIndicatorAlignment [Alignment.Horizontal] for page indicator. * @param onClick Called on all clicks, even if the page didn't change. @@ -58,7 +58,7 @@ import kotlinx.coroutines.launch @Composable fun PagedIsland( modifier: Modifier = Modifier, - pagerState: PagerState, + pageCount: Int, backgroundColor: Color = MaterialTheme.colorScheme.secondaryContainer, pageIndicatorAlignment: Alignment.Horizontal = Alignment.End, onClick: () -> Unit = {}, @@ -67,6 +67,8 @@ fun PagedIsland( val contentColor = MaterialTheme.colorScheme.contentColorFor(backgroundColor) val disabledContentColor = contentColor.copy(alpha = 0.5f) val corScope = rememberCoroutineScope() + // https://stackoverflow.com/a/75469260 + val pagerState = rememberPagerState { pageCount * 1_000 } ProvideColor(color = contentColor) { Column( @@ -92,8 +94,8 @@ fun PagedIsland( .padding(vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp, pageIndicatorAlignment), ) { - repeat(pagerState.pageCount) { - PageDot(if (it == pagerState.currentPage) contentColor else disabledContentColor) + repeat(pageCount) { + PageDot(if (it == pagerState.currentPage % pageCount) contentColor else disabledContentColor) } } @@ -102,10 +104,9 @@ fun PagedIsland( .animateContentSize() .fillMaxWidth(), verticalAlignment = Alignment.Top, - state = pagerState - ) { page -> - pageContent(page) - } + state = pagerState, + pageContent = { page -> pageContent(page % pageCount) } + ) } } } @@ -124,7 +125,7 @@ private fun PageDot( private fun PreviewPagedIsland() { PagedIsland( modifier = Modifier.size(400.dp, 250.dp), - pagerState = rememberPagerState { 5 } + pageCount = 5, ) { currentPage -> Column { Text("Current page: $currentPage") diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt index 5513126f..113c003a 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt @@ -21,7 +21,6 @@ package com.sadellie.unitto.feature.datecalculator.components import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -45,7 +44,7 @@ internal fun DateTimeResultBlock( PagedIsland( modifier = modifier, - pagerState = rememberPagerState { 6 }, + pageCount = 6, onClick = { focusManager.clearFocus() }, backgroundColor = MaterialTheme.colorScheme.tertiaryContainer ) { currentPage -> diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt index c84e6912..82e3fc51 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt @@ -30,7 +30,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Architecture @@ -128,7 +127,7 @@ fun FormattingScreen( modifier = Modifier .fillMaxWidth() .padding(16.dp), - pagerState = rememberPagerState { 2 }, + pageCount = 2, ) { currentPage -> val preview = when (currentPage) { 0 -> "123456.${"789123456".repeat(ceil(uiState.precision.toDouble() / 9.0).toInt())}" From eb00d8a76e8e320bff2aa9e86731705122db7062 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Thu, 15 Feb 2024 22:04:46 +0300 Subject: [PATCH 26/46] Spotless and ktlint --- .editorconfig | 7 + .run/spotlessApply.run.xml | 42 +++ .run/spotlessCheck.run.xml | 42 +++ app/src/main/java/com/sadellie/unitto/App.kt | 8 +- .../java/com/sadellie/unitto/MainActivity.kt | 2 +- .../com/sadellie/unitto/UnittoApplication.kt | 2 +- .../com/sadellie/unitto/UnittoTileService.kt | 4 +- .../benchmark/StartupBaselineProfile.kt | 2 +- .../unitto/benchmark/StartupBenchmark.kt | 4 +- .../sadellie/unitto/core/base/OutputFormat.kt | 2 + .../com/sadellie/unitto/core/base/Token.kt | 8 +- .../unitto/core/base/OutputFormatTest.kt | 2 +- .../sadellie/unitto/core/base/TokenTest.kt | 9 +- .../unitto/core/ui/ZonedDateTimeUtilsTest.kt | 2 +- .../unitto/core/ui/LocalWindowSize.kt | 16 +- .../core/ui/NavGraphBuilderExtensions.kt | 44 +-- .../sadellie/unitto/core/ui/ShortcutUtils.kt | 10 +- .../sadellie/unitto/core/ui/common/Button.kt | 8 +- .../sadellie/unitto/core/ui/common/Chip.kt | 14 +- .../unitto/core/ui/common/DrawerItem.kt | 4 +- .../sadellie/unitto/core/ui/common/Header.kt | 6 +- .../unitto/core/ui/common/KeyboardButton.kt | 58 ++-- .../unitto/core/ui/common/KeypadFlow.kt | 4 +- .../unitto/core/ui/common/ListItem.kt | 26 +- .../core/ui/common/ModifierExtensions.kt | 8 +- .../unitto/core/ui/common/NavigateUpButton.kt | 2 +- .../unitto/core/ui/common/NavigationDrawer.kt | 44 +-- .../unitto/core/ui/common/PagedIsland.kt | 6 +- .../core/ui/common/PortraitLandscape.kt | 7 +- .../core/ui/common/ScaffoldWithLargeTopBar.kt | 8 +- .../core/ui/common/ScaffoldWithTopBar.kt | 6 +- .../unitto/core/ui/common/SearchBar.kt | 37 ++- .../core/ui/common/SearchPlaceholder.kt | 10 +- .../unitto/core/ui/common/SegmentedButton.kt | 10 +- .../unitto/core/ui/common/SheetContent.kt | 12 +- .../sadellie/unitto/core/ui/common/Slider.kt | 24 +- .../sadellie/unitto/core/ui/common/Switch.kt | 20 +- .../unitto/core/ui/common/WithConstraints.kt | 8 +- .../common/autosize/AutoSizeTextStyleBox.kt | 61 +--- .../core/ui/common/autosize/DensityExt.kt | 7 +- .../common/datetimepicker/DatePickerDialog.kt | 32 ++- .../common/datetimepicker/TimePickerDialog.kt | 25 +- .../core/ui/common/icons/iconpack/ArCos.kt | 2 + .../core/ui/common/icons/iconpack/ArSin.kt | 2 + .../core/ui/common/icons/iconpack/ArTan.kt | 2 + .../ui/common/icons/iconpack/Backspace.kt | 2 + .../core/ui/common/icons/iconpack/Brackets.kt | 2 + .../core/ui/common/icons/iconpack/Clear.kt | 2 + .../core/ui/common/icons/iconpack/Comma.kt | 2 + .../core/ui/common/icons/iconpack/Cos.kt | 2 + .../core/ui/common/icons/iconpack/Deg.kt | 2 + .../core/ui/common/icons/iconpack/Divide.kt | 2 + .../core/ui/common/icons/iconpack/Dot.kt | 2 + .../core/ui/common/icons/iconpack/Equal.kt | 2 + .../core/ui/common/icons/iconpack/Euler.kt | 2 + .../core/ui/common/icons/iconpack/Ex.kt | 2 + .../ui/common/icons/iconpack/Factorial.kt | 2 + .../core/ui/common/icons/iconpack/Inv.kt | 2 + .../core/ui/common/icons/iconpack/Key0.kt | 2 + .../core/ui/common/icons/iconpack/Key1.kt | 2 + .../core/ui/common/icons/iconpack/Key2.kt | 2 + .../core/ui/common/icons/iconpack/Key3.kt | 2 + .../core/ui/common/icons/iconpack/Key4.kt | 2 + .../core/ui/common/icons/iconpack/Key5.kt | 2 + .../core/ui/common/icons/iconpack/Key6.kt | 2 + .../core/ui/common/icons/iconpack/Key7.kt | 2 + .../core/ui/common/icons/iconpack/Key8.kt | 2 + .../core/ui/common/icons/iconpack/Key9.kt | 2 + .../core/ui/common/icons/iconpack/KeyA.kt | 2 + .../core/ui/common/icons/iconpack/KeyB.kt | 2 + .../core/ui/common/icons/iconpack/KeyC.kt | 2 + .../core/ui/common/icons/iconpack/KeyD.kt | 2 + .../core/ui/common/icons/iconpack/KeyE.kt | 2 + .../core/ui/common/icons/iconpack/KeyF.kt | 2 + .../ui/common/icons/iconpack/LeftBracket.kt | 2 + .../core/ui/common/icons/iconpack/Ln.kt | 2 + .../core/ui/common/icons/iconpack/Log.kt | 2 + .../core/ui/common/icons/iconpack/Minus.kt | 2 + .../core/ui/common/icons/iconpack/Modulo.kt | 2 + .../core/ui/common/icons/iconpack/Multiply.kt | 2 + .../core/ui/common/icons/iconpack/Percent.kt | 2 + .../core/ui/common/icons/iconpack/Pi.kt | 2 + .../core/ui/common/icons/iconpack/Plus.kt | 2 + .../core/ui/common/icons/iconpack/Power.kt | 2 + .../core/ui/common/icons/iconpack/Power10.kt | 2 + .../core/ui/common/icons/iconpack/Rad.kt | 2 + .../ui/common/icons/iconpack/RightBracket.kt | 2 + .../core/ui/common/icons/iconpack/Root.kt | 2 + .../core/ui/common/icons/iconpack/Sin.kt | 2 + .../core/ui/common/icons/iconpack/Tan.kt | 2 + .../common/textfield/ClipboardManagerExt.kt | 10 +- .../core/ui/common/textfield/CursorFixer.kt | 21 +- .../common/textfield/ExpressionTransformer.kt | 4 +- .../common/textfield/FixedInputTextFIeld.kt | 14 +- .../common/textfield/FormatterExtensions.kt | 6 +- .../ui/common/textfield/InputTextField.kt | 16 +- .../textfield/OutlinedDecimalTextField.kt | 4 +- .../textfield/TextFieldValueExtensions.kt | 9 +- .../FloatingTextActionModeCallback.kt | 6 +- .../texttoolbar/UnittoActionModeCallback.kt | 2 +- .../UnittoPrimaryTextActionModeCallback.kt | 2 +- .../texttoolbar/UnittoTextToolbar.kt | 10 +- .../core/ui/datetime/ZonedDateTimeUtils.kt | 8 +- .../unitto/core/ui/model/DrawerItem.kt | 24 +- .../sadellie/unitto/core/ui/theme/Color.kt | 1 - .../com/sadellie/unitto/core/ui/theme/Type.kt | 8 +- .../core/ui/CleanAndFilterExpression.kt | 4 +- .../unitto/core/ui/FormatterExpressionTest.kt | 2 +- .../core/ui/TextFieldValueExtensionsTest.kt | 2 +- .../unitto/data/backup/BackupManagerTest.kt | 1 - .../CalculatorHistoryRepositoryImpl.kt | 10 +- .../unitto/data/common/BigDecimalUtils.kt | 6 +- .../sadellie/unitto/data/common/FlowUtils.kt | 42 +-- .../unitto/data/common/StringUtils.kt | 3 +- .../unitto/data/common/IsExpressionText.kt | 1 - .../unitto/data/common/LevenshteinTest.kt | 2 +- .../data/common/MinimumRequiredScaleTest.kt | 2 +- .../unitto/data/converter/DataStoreModule.kt | 4 +- .../sadellie/unitto/data/converter/UnitID.kt | 2 + .../data/converter/UnitsRepositoryImpl.kt | 80 +++--- .../converter/remote/CurrencyApiService.kt | 4 +- .../converter/remote/CurrencyUnitResponse.kt | 10 +- .../unitto/data/converter/AllUnitsTest.kt | 46 +-- .../data/database/CalculatorHistoryEntity.kt | 2 +- .../data/database/CurrencyRatesEntity.kt | 2 +- .../unitto/data/database/TimeZoneDao.kt | 2 +- .../unitto/data/database/UnittoDatabase.kt | 10 +- .../data/database/UnittoDatabaseModule.kt | 4 +- .../data/database/converters/Converters.kt | 1 - .../sadellie/evaluatto/BigDecimalMath.kt | 7 +- .../github/sadellie/evaluatto/Expression.kt | 9 +- .../io/github/sadellie/evaluatto/Tokenizer.kt | 16 +- .../sadellie/evaluatto/FixLexiconTest.kt | 65 +++-- .../io/github/sadellie/evaluatto/Helpers.kt | 4 +- .../unitto/data/licenses/ThirdParty.kt | 30 +- .../sadellie/unitto/data/model/HistoryItem.kt | 2 +- .../sadellie/unitto/data/model/UnitGroup.kt | 4 +- .../data/model/timezone/FavoriteZone.kt | 2 +- .../unitto/data/model/unit/BackwardUnit.kt | 22 +- .../unitto/data/model/unit/NormalUnit.kt | 22 +- .../unitto/data/model/unit/ReverseUnit.kt | 1 - .../unitto/data/model/unit/TemperatureUnit.kt | 4 +- .../data/model/userprefs/AboutPreferences.kt | 2 +- .../model/userprefs/AddSubtractPreferences.kt | 2 +- .../model/userprefs/BodyMassPreferences.kt | 2 +- .../model/userprefs/FormattingPreferences.kt | 2 +- .../userprefs/StartingScreenPreferences.kt | 2 +- .../model/userprefs/UnitGroupsPreferences.kt | 2 +- .../data/timezone/TimeZonesRepository.kt | 12 +- .../unitto/data/userprefs/DataStoreModule.kt | 2 +- .../unitto/data/userprefs/PreferenceExt.kt | 4 +- .../UserPreferencesRepositoryImpl.kt | 2 +- .../unitto/feature/bodymass/BodyMassScreen.kt | 28 +- .../unitto/feature/bodymass/BodyMassUtils.kt | 4 +- .../feature/bodymass/BodyMassViewModel.kt | 50 ++-- .../bodymass/components/BodyMassResult.kt | 24 +- .../bodymass/components/BodyMassTextField.kt | 4 +- .../feature/bodymass/navigation/Navigation.kt | 4 +- .../calculator/CalculatorScreenTest.kt | 4 +- .../feature/calculator/CalculatorScreen.kt | 33 ++- .../feature/calculator/CalculatorViewModel.kt | 84 +++--- .../feature/calculator/DecimalToFraction.kt | 4 +- .../components/CalculatorKeyboard.kt | 271 +++++++++--------- .../calculator/components/HistoryList.kt | 10 +- .../feature/calculator/components/TextBox.kt | 19 +- .../navigation/CalculatorNavigation.kt | 4 +- .../calculator/DecimalToFractionTest.kt | 2 +- .../{NetworkUtils.kt => ConnectionState.kt} | 8 +- .../feature/converter/ConverterScreen.kt | 74 ++--- .../feature/converter/ConverterUIState.kt | 56 ++-- .../feature/converter/ConverterViewModel.kt | 137 ++++----- .../converter/UnitFromSelectorScreen.kt | 14 +- .../feature/converter/UnitSelectorUIState.kt | 2 +- .../converter/UnitSelectorViewModel.kt | 56 ++-- .../feature/converter/UnitToSelectorScreen.kt | 10 +- .../converter/components/BasicUnitListItem.kt | 18 +- .../feature/converter/components/ChipsRow.kt | 20 +- .../converter/components/ConverterKeyboard.kt | 13 +- .../converter/components/FavoritesButton.kt | 6 +- .../converter/components/UnitGroupHeader.kt | 2 +- .../components/UnitSelectionButton.kt | 12 +- .../feature/converter/components/UnitsList.kt | 10 +- .../navigation/ConverterNavigation.kt | 48 ++-- .../datecalculator/DateCalculatorScreen.kt | 4 +- .../addsubtract/AddSubtractPage.kt | 31 +- .../addsubtract/AddSubtractUIState.kt | 2 +- .../addsubtract/AddSubtractViewModel.kt | 8 +- .../components/DateTimeDialogs.kt | 2 +- .../components/DateTimeResultBlock.kt | 26 +- .../components/DateTimeSelectorBlock.kt | 30 +- .../components/TimeUnitTextField.kt | 2 +- .../difference/DateDifferencePage.kt | 17 +- .../difference/DateDifferenceViewModel.kt | 43 +-- .../difference/ZonedDateTimeDifference.kt | 4 +- .../navigation/DateCalculatorNavigation.kt | 4 +- .../ZonedDateTimeDifferenceKtTest.kt | 36 +-- .../feature/glance/glance/CalculatorWidget.kt | 82 +++--- .../feature/glance/glance/IconButton.kt | 16 +- .../glance/glance/UpdateInputAction.kt | 24 +- .../feature/glance/glance/WidgetTheme.kt | 2 +- .../unitto/feature/settings/SettingsScreen.kt | 69 ++--- .../feature/settings/SettingsViewModel.kt | 18 +- .../feature/settings/about/AboutScreen.kt | 26 +- .../settings/bouncingemoji/BouncingEmoji.kt | 22 +- .../calculator/CalculatorSettingsScreen.kt | 6 +- .../components/AlertDialogWithList.kt | 12 +- .../settings/components/AnnoyingBox.kt | 10 +- .../settings/components/ColorSelector.kt | 10 +- .../settings/components/MonetModeSelector.kt | 36 +-- .../converter/ConverterSettingsScreen.kt | 14 +- .../feature/settings/display/DisplayScreen.kt | 38 +-- .../settings/display/DisplayViewModel.kt | 2 +- .../settings/formatting/FormattingScreen.kt | 37 +-- .../formatting/FormattingViewModel.kt | 8 +- .../settings/language/LanguageScreen.kt | 21 +- .../settings/navigation/SettingsNavigation.kt | 60 ++-- .../startingscreen/StartingScreenScreen.kt | 18 +- .../thirdparty/ThirdPartyLicensesScreen.kt | 20 +- .../settings/unitgroups/UnitGroupsScreen.kt | 26 +- .../settings/unitgroups/UnitGroupsUIState.kt | 6 +- .../unitgroups/UnitGroupsViewModel.kt | 2 +- .../components/FavoriteTimeZonesTest.kt | 9 +- .../feature/timezone/AddTimeZoneScreen.kt | 20 +- .../feature/timezone/AddTimeZoneUIState.kt | 4 +- .../feature/timezone/AddTimeZoneViewModel.kt | 18 +- .../unitto/feature/timezone/TimeZoneExt.kt | 1 - .../unitto/feature/timezone/TimeZoneScreen.kt | 34 +-- .../feature/timezone/TimeZoneViewModel.kt | 34 +-- .../components/FavoriteTimeZoneItem.kt | 52 ++-- .../timezone/components/UserTimeZone.kt | 20 +- .../timezone/navigation/TimeZoneNavigation.kt | 14 +- gradle/init.gradle.kts | 66 +++++ 232 files changed, 1852 insertions(+), 1601 deletions(-) create mode 100644 .editorconfig create mode 100644 .run/spotlessApply.run.xml create mode 100644 .run/spotlessCheck.run.xml rename feature/converter/src/main/java/com/sadellie/unitto/feature/converter/{NetworkUtils.kt => ConnectionState.kt} (91%) create mode 100644 gradle/init.gradle.kts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..7be3f878 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +# https://editorconfig.org/ +# This configuration is used by ktlint when spotless invokes it + +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma=true +ij_kotlin_allow_trailing_comma_on_call_site=true +ktlint_function_naming_ignore_when_annotated_with=Composable, Test diff --git a/.run/spotlessApply.run.xml b/.run/spotlessApply.run.xml new file mode 100644 index 00000000..6eecd0a8 --- /dev/null +++ b/.run/spotlessApply.run.xml @@ -0,0 +1,42 @@ + + + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/spotlessCheck.run.xml b/.run/spotlessCheck.run.xml new file mode 100644 index 00000000..9894de0a --- /dev/null +++ b/.run/spotlessCheck.run.xml @@ -0,0 +1,42 @@ + + + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/app/src/main/java/com/sadellie/unitto/App.kt b/app/src/main/java/com/sadellie/unitto/App.kt index a6df4a61..a8739ce5 100644 --- a/app/src/main/java/com/sadellie/unitto/App.kt +++ b/app/src/main/java/com/sadellie/unitto/App.kt @@ -76,14 +76,14 @@ internal fun ComponentActivity.App(prefs: AppPreferences?) { dynamicThemeEnabled = prefs.enableDynamicTheme, amoledThemeEnabled = prefs.enableAmoledTheme, customColor = prefs.customColor.toColor(), - monetMode = prefs.monetMode + monetMode = prefs.monetMode, ) } Themmo( themmoController = themmoController, typography = TypographySystem, - animationSpec = tween(250) + animationSpec = tween(250), ) { val backgroundColor = MaterialTheme.colorScheme.background val isDarkThemeEnabled = remember(backgroundColor) { backgroundColor.luminance() < 0.5f } @@ -113,9 +113,9 @@ internal fun ComponentActivity.App(prefs: AppPreferences?) { navController = navController, themmoController = it, startDestination = prefs.startingScreen, - openDrawer = { drawerScope.launch { drawerState.open() } } + openDrawer = { drawerScope.launch { drawerState.open() } }, ) - } + }, ) DisposableEffect(isDarkThemeEnabled) { diff --git a/app/src/main/java/com/sadellie/unitto/MainActivity.kt b/app/src/main/java/com/sadellie/unitto/MainActivity.kt index c810ef4a..79b960bb 100644 --- a/app/src/main/java/com/sadellie/unitto/MainActivity.kt +++ b/app/src/main/java/com/sadellie/unitto/MainActivity.kt @@ -68,7 +68,7 @@ internal class MainActivity : AppCompatActivity() { LocalLocale provides locale, LocalWindowSize provides calculateWindowSizeClass(this@MainActivity), LocalNumberTypography provides numbersTypography, - LocalHapticPreference provides (prefs?.enableVibrations ?: true) + LocalHapticPreference provides (prefs?.enableVibrations ?: true), ) { App(prefs) } diff --git a/app/src/main/java/com/sadellie/unitto/UnittoApplication.kt b/app/src/main/java/com/sadellie/unitto/UnittoApplication.kt index 39b84d16..fe8c19d2 100644 --- a/app/src/main/java/com/sadellie/unitto/UnittoApplication.kt +++ b/app/src/main/java/com/sadellie/unitto/UnittoApplication.kt @@ -22,4 +22,4 @@ import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp -internal class UnittoApplication: Application() +internal class UnittoApplication : Application() diff --git a/app/src/main/java/com/sadellie/unitto/UnittoTileService.kt b/app/src/main/java/com/sadellie/unitto/UnittoTileService.kt index 037b3678..72a140b0 100644 --- a/app/src/main/java/com/sadellie/unitto/UnittoTileService.kt +++ b/app/src/main/java/com/sadellie/unitto/UnittoTileService.kt @@ -18,6 +18,7 @@ package com.sadellie.unitto +import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Intent import android.os.Build @@ -26,6 +27,7 @@ import androidx.annotation.RequiresApi @RequiresApi(Build.VERSION_CODES.N) class UnittoTileService : TileService() { + @SuppressLint("StartActivityAndCollapseDeprecated") override fun onClick() { super.onClick() @@ -33,7 +35,7 @@ class UnittoTileService : TileService() { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - startActivityAndCollapse(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)) + startActivityAndCollapse(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)) } else { @Suppress("DEPRECATION") startActivityAndCollapse(intent) diff --git a/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBaselineProfile.kt b/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBaselineProfile.kt index 0fb5f900..af6d9bda 100644 --- a/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBaselineProfile.kt +++ b/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBaselineProfile.kt @@ -31,7 +31,7 @@ class StartupBaselineProfile { @Test fun generate() = baselineProfileRule.collect( packageName = "com.sadellie.unitto", - includeInStartupProfile = true + includeInStartupProfile = true, ) { startActivityAndWait() device.pressBack() diff --git a/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBenchmark.kt b/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBenchmark.kt index cfef733e..ab4e30e3 100644 --- a/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBenchmark.kt +++ b/benchmark/src/main/java/com/sadellie/unitto/benchmark/StartupBenchmark.kt @@ -61,7 +61,7 @@ class StartupBenchmark { fun startupFullyPrecompiled() = startup(CompilationMode.Full()) private fun startup( - compilationMode: CompilationMode + compilationMode: CompilationMode, ) = benchmarkRule.measureRepeated( packageName = "com.sadellie.unitto", metrics = listOf(StartupTimingMetric()), @@ -70,7 +70,7 @@ class StartupBenchmark { startupMode = StartupMode.COLD, setupBlock = { pressHome() - } + }, ) { startActivityAndWait() } diff --git a/core/base/src/main/java/com/sadellie/unitto/core/base/OutputFormat.kt b/core/base/src/main/java/com/sadellie/unitto/core/base/OutputFormat.kt index 120c4a33..f9753ba0 100644 --- a/core/base/src/main/java/com/sadellie/unitto/core/base/OutputFormat.kt +++ b/core/base/src/main/java/com/sadellie/unitto/core/base/OutputFormat.kt @@ -24,8 +24,10 @@ package com.sadellie.unitto.core.base object OutputFormat { // Never use engineering notation const val PLAIN = 0 + // Use format that a lower API returns const val ALLOW_ENGINEERING = 1 + // App will try it's best to use engineering notation const val FORCE_ENGINEERING = 2 } 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 index d7ed1d75..fce3c8b3 100644 --- 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 @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.base @Suppress("ObjectPropertyName") @@ -100,14 +102,14 @@ object Token { val all by lazy { listOf( - arsin, arcos, actan, sin, cos, tan, log, exp, ln + arsin, arcos, actan, sin, cos, tan, log, exp, ln, ).sortedByDescending { it.length } } val allWithOpeningBracket by lazy { listOf( arsinBracket, arcosBracket, actanBracket, sinBracket, cosBracket, tanBracket, - logBracket, expBracket, lnBracket + logBracket, expBracket, lnBracket, ) } } @@ -144,7 +146,7 @@ object Token { Operator.multiply to listOf("*", "•"), Func.arsin to listOf("arsin"), Func.arcos to listOf("arcos"), - Func.actan to listOf("actan") + Func.actan to listOf("actan"), ) } } diff --git a/core/base/src/test/java/com/sadellie/unitto/core/base/OutputFormatTest.kt b/core/base/src/test/java/com/sadellie/unitto/core/base/OutputFormatTest.kt index 8768ffe8..65908b8d 100644 --- a/core/base/src/test/java/com/sadellie/unitto/core/base/OutputFormatTest.kt +++ b/core/base/src/test/java/com/sadellie/unitto/core/base/OutputFormatTest.kt @@ -42,4 +42,4 @@ class OutputFormatTest { fun testOutputFormatForceEngineering() { Assert.assertEquals(2, OutputFormat.FORCE_ENGINEERING) } -} \ No newline at end of file +} diff --git a/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt b/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt index 63f7fa3d..c85a3100 100644 --- a/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt +++ b/core/base/src/test/java/com/sadellie/unitto/core/base/TokenTest.kt @@ -150,9 +150,14 @@ class TokenTest { @Test fun testSexyToUgly() { listOf( - "−", "÷", "×", "sin⁻¹", "cos⁻¹", "tan⁻¹" + "−", + "÷", + "×", + "sin⁻¹", + "cos⁻¹", + "tan⁻¹", ).forEach { assert(it in Token.sexyToUgly.keys) } } -} \ No newline at end of file +} diff --git a/core/ui/src/androidTest/java/com/sadellie/unitto/core/ui/ZonedDateTimeUtilsTest.kt b/core/ui/src/androidTest/java/com/sadellie/unitto/core/ui/ZonedDateTimeUtilsTest.kt index 2ee51684..de9de1fa 100644 --- a/core/ui/src/androidTest/java/com/sadellie/unitto/core/ui/ZonedDateTimeUtilsTest.kt +++ b/core/ui/src/androidTest/java/com/sadellie/unitto/core/ui/ZonedDateTimeUtilsTest.kt @@ -28,7 +28,7 @@ import java.time.ZonedDateTime class ZonedDateTimeUtilsTest { - @get: Rule + @get:Rule val composeTestRule = createAndroidComposeRule() @Test diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt index e7684c0f..0b85834f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/LocalWindowSize.kt @@ -83,7 +83,7 @@ fun calculateWindowSizeClass(activity: Activity): WindowSizeClass { @Immutable class WindowSizeClass( val widthSizeClass: WindowWidthSizeClass, - val heightSizeClass: WindowHeightSizeClass + val heightSizeClass: WindowHeightSizeClass, ) { companion object { /** @@ -118,7 +118,7 @@ class WindowSizeClass( supportedWidthSizeClasses: Set = WindowWidthSizeClass.DefaultSizeClasses, supportedHeightSizeClasses: Set = - WindowHeightSizeClass.DefaultSizeClasses + WindowHeightSizeClass.DefaultSizeClasses, ): WindowSizeClass { val windowWidthSizeClass = WindowWidthSizeClass.fromWidth(size.width, density, supportedWidthSizeClasses) @@ -225,7 +225,9 @@ value class WindowWidthSizeClass private constructor(private val value: Int) : /** Calculates the [WindowWidthSizeClass] for a given [width] */ internal fun fromWidth(width: Dp): WindowWidthSizeClass { return fromWidth( - with(defaultDensity) { width.toPx() }, defaultDensity, DefaultSizeClasses + with(defaultDensity) { width.toPx() }, + defaultDensity, + DefaultSizeClasses, ) } @@ -236,7 +238,7 @@ value class WindowWidthSizeClass private constructor(private val value: Int) : internal fun fromWidth( width: Float, density: Density, - supportedSizeClasses: Set + supportedSizeClasses: Set, ): WindowWidthSizeClass { require(width >= 0) { "Width must not be negative" } require(supportedSizeClasses.isNotEmpty()) { "Must support at least one size class" } @@ -323,7 +325,9 @@ value class WindowHeightSizeClass private constructor(private val value: Int) : /** Calculates the [WindowHeightSizeClass] for a given [height] */ internal fun fromHeight(height: Dp): WindowHeightSizeClass { return fromHeight( - with(defaultDensity) { height.toPx() }, defaultDensity, DefaultSizeClasses + with(defaultDensity) { height.toPx() }, + defaultDensity, + DefaultSizeClasses, ) } @@ -334,7 +338,7 @@ value class WindowHeightSizeClass private constructor(private val value: Int) : internal fun fromHeight( height: Float, density: Density, - supportedSizeClasses: Set + supportedSizeClasses: Set, ): WindowHeightSizeClass { require(height >= 0) { "Width must not be negative" } require(supportedSizeClasses.isNotEmpty()) { "Must support at least one size class" } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt index 93f79337..280d7365 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt @@ -44,16 +44,22 @@ fun NavGraphBuilder.unittoComposable( route: String, arguments: List = emptyList(), deepLinks: List = emptyList(), - enterTransition: (@JvmSuppressWildcards - AnimatedContentTransitionScope.() -> EnterTransition?)? = { unittoFadeIn() }, - exitTransition: (@JvmSuppressWildcards - AnimatedContentTransitionScope.() -> ExitTransition?)? = { unittoFadeOut() }, - popEnterTransition: (@JvmSuppressWildcards - AnimatedContentTransitionScope.() -> EnterTransition?)? = - enterTransition, - popExitTransition: (@JvmSuppressWildcards - AnimatedContentTransitionScope.() -> ExitTransition?)? = - exitTransition, + enterTransition: ( + @JvmSuppressWildcards + AnimatedContentTransitionScope.() -> EnterTransition? + )? = { unittoFadeIn() }, + exitTransition: ( + @JvmSuppressWildcards + AnimatedContentTransitionScope.() -> ExitTransition? + )? = { unittoFadeOut() }, + popEnterTransition: ( + @JvmSuppressWildcards + AnimatedContentTransitionScope.() -> EnterTransition? + )? = enterTransition, + popExitTransition: ( + @JvmSuppressWildcards + AnimatedContentTransitionScope.() -> ExitTransition? + )? = exitTransition, content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit, ): Unit = composable( route = route, @@ -79,22 +85,26 @@ fun NavGraphBuilder.unittoStackedComposable( enterTransition = { slideInHorizontally( animationSpec = unittoEnterTween(), - initialOffsetX = { (it * 0.2f).toInt() }) + unittoFadeIn() + initialOffsetX = { (it * 0.2f).toInt() }, + ) + unittoFadeIn() }, exitTransition = { slideOutHorizontally( animationSpec = unittoExitTween(), - targetOffsetX = { -(it * 0.2f).toInt() }) + unittoFadeOut() + targetOffsetX = { -(it * 0.2f).toInt() }, + ) + unittoFadeOut() }, popEnterTransition = { slideInHorizontally( animationSpec = unittoEnterTween(), - initialOffsetX = { -(it * 0.2f).toInt() }) + unittoFadeIn() + initialOffsetX = { -(it * 0.2f).toInt() }, + ) + unittoFadeIn() }, popExitTransition = { slideOutHorizontally( animationSpec = unittoExitTween(), - targetOffsetX = { (it * 0.2f).toInt() }) + unittoFadeOut() + targetOffsetX = { (it * 0.2f).toInt() }, + ) + unittoFadeOut() }, content = content, ) @@ -113,10 +123,10 @@ fun NavGraphBuilder.unittoNavigation( exitTransition: (AnimatedContentTransitionScope.() -> ExitTransition?)? = null, popEnterTransition: ( - AnimatedContentTransitionScope.() -> EnterTransition? + AnimatedContentTransitionScope.() -> EnterTransition? )? = enterTransition, popExitTransition: ( - AnimatedContentTransitionScope.() -> ExitTransition? + AnimatedContentTransitionScope.() -> ExitTransition? )? = exitTransition, builder: NavGraphBuilder.() -> Unit, ): Unit = navigation( @@ -128,7 +138,7 @@ fun NavGraphBuilder.unittoNavigation( exitTransition = exitTransition, popEnterTransition = popEnterTransition, popExitTransition = popExitTransition, - builder = builder + builder = builder, ) private const val ENTER_DURATION = 350 diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/ShortcutUtils.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/ShortcutUtils.kt index 27bfe720..3f0ef54f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/ShortcutUtils.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/ShortcutUtils.kt @@ -48,7 +48,7 @@ suspend fun Context.pushDynamicShortcut( val shortcutCompat = shortcutInfoCompat( context = context, route = drawerItem.graph, - shortcut = shortcut + shortcut = shortcut, ) kotlin.runCatching { @@ -71,7 +71,7 @@ fun Context.addShortcut( val shortcutCompat = shortcutInfoCompat( context = context, route = drawerItem.graph, - shortcut = shortcut + shortcut = shortcut, ) val shortCutIntent = ShortcutManagerCompat.createShortcutResultIntent(context, shortcutCompat) @@ -80,7 +80,7 @@ fun Context.addShortcut( ShortcutManagerCompat.requestPinShortcut( context, shortcutCompat, - PendingIntent.getBroadcast(context, 0, shortCutIntent, FLAG_IMMUTABLE).intentSender + PendingIntent.getBroadcast(context, 0, shortCutIntent, FLAG_IMMUTABLE).intentSender, ) } catch (e: Exception) { showToast(context, e.message ?: "Error") @@ -101,8 +101,8 @@ private fun Context.shortcutInfoCompat( Intent.ACTION_VIEW, Uri.parse("app://com.sadellie.unitto/$route"), context, - context.javaClass - ) + context.javaClass, + ), ) .build() } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Button.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Button.kt index 81a4f8ae..dba1c7dc 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Button.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Button.kt @@ -50,7 +50,7 @@ fun Button( border: BorderStroke? = null, contentPadding: PaddingValues = ButtonDefaults.ContentPadding, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { Surface( modifier = modifier.squashable( @@ -58,7 +58,7 @@ fun Button( onLongClick = onLongClick, interactionSource = interactionSource, cornerRadiusRange = 30..50, - enabled = enabled + enabled = enabled, ), color = containerColor, contentColor = contentColor, @@ -70,12 +70,12 @@ fun Button( Modifier .defaultMinSize( minWidth = ButtonDefaults.MinWidth, - minHeight = ButtonDefaults.MinHeight + minHeight = ButtonDefaults.MinHeight, ) .padding(contentPadding), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, - content = content + content = content, ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt index 21ce2c59..db83c819 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Chip.kt @@ -70,16 +70,16 @@ fun FilterChip( .border( width = 1.dp, color = borderColor.value, - shape = FilterChipDefaults.shape + shape = FilterChipDefaults.shape, ) .height(FilterChipDefaults.Height) .padding(horizontal = 16.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Text( text = label, style = MaterialTheme.typography.labelLarge, - color = if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurfaceVariant + color = if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -100,17 +100,17 @@ fun AssistChip( .border( width = 1.dp, color = MaterialTheme.colorScheme.outline, - shape = AssistChipDefaults.shape + shape = AssistChipDefaults.shape, ) .height(32.dp) .padding(horizontal = 8.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Icon( modifier = Modifier.height(AssistChipDefaults.IconSize), imageVector = imageVector, contentDescription = contentDescription, - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -121,7 +121,7 @@ fun PreviewAssistChip() { AssistChip( onClick = {}, imageVector = Icons.Default.Settings, - contentDescription = "" + contentDescription = "", ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerItem.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerItem.kt index da93b329..ba0a9ac7 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerItem.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/DrawerItem.kt @@ -33,13 +33,13 @@ internal fun DrawerItem( destination: DrawerItem, icon: ImageVector, selected: Boolean, - onClick: (DrawerItem) -> Unit + onClick: (DrawerItem) -> Unit, ) { NavigationDrawerItem( modifier = modifier, label = { Text(stringResource(destination.name)) }, icon = { Icon(icon, stringResource(destination.name)) }, selected = selected, - onClick = { onClick(destination) } + onClick = { onClick(destination) }, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Header.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Header.kt index 663cc7a5..39dc8ca9 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Header.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Header.kt @@ -43,8 +43,8 @@ fun Header( start = 56.dp, end = 16.dp, top = 24.dp, - bottom = 12.dp - ) + bottom = 12.dp, + ), ) { Text( modifier = modifier @@ -53,6 +53,6 @@ fun Header( .fillMaxWidth(), text = text, style = MaterialTheme.typography.titleSmall, - color = MaterialTheme.colorScheme.primary + color = MaterialTheme.colorScheme.primary, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeyboardButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeyboardButton.kt index e5a8bab5..ecf50874 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeyboardButton.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeyboardButton.kt @@ -64,15 +64,24 @@ fun BasicKeyboardButton( Box( modifier = modifier .squashable( - onClick = { onClick(); vibrate() }, - onLongClick = if (onLongClick != null) { { onLongClick(); vibrate() } } else null, + onClick = { + onClick() + vibrate() + }, + onLongClick = if (onLongClick != null) { + { + onLongClick() + vibrate() + } + } else { + null + }, interactionSource = remember { MutableInteractionSource() }, cornerRadiusRange = 30..50, - animationSpec = tween(200) + animationSpec = tween(200), ) - .background(containerColor) - , - contentAlignment = Alignment.Center + .background(containerColor), + contentAlignment = Alignment.Center, ) { Icon( imageVector = icon, @@ -84,7 +93,7 @@ fun BasicKeyboardButton( scaleX = contentHeight scaleY = contentHeight }, - tint = iconColor + tint = iconColor, ) } } @@ -173,22 +182,25 @@ fun KeyboardButtonTertiary( ) } -/** - * Mostly for main button in portrait mode. Changes icon size inside. - */ -const val KeyboardButtonContentHeightTall = 1.1f +object KeyboardButtonToken { -/** - * Mostly for additional button in portrait mode. Changes icon size inside. - */ -const val KeyboardButtonContentHeightTallAdditional = 1.6f + /** + * Mostly for main button in portrait mode. Changes icon size inside. + */ + const val CONTENT_HEIGHT_TALL = 1.1f -/** - * Mostly for main button in landscape mode. Changes icon size inside. - */ -const val KeyboardButtonContentHeightShort = 1.3f + /** + * Mostly for additional button in portrait mode. Changes icon size inside. + */ + const val CONTENT_HEIGHT_TALL_ADDITIONAL = 1.6f -/** - * Mostly for additional button in landscape mode. Changes icon size inside. - */ -const val KeyboardButtonContentHeightShortAdditional = 1.1f + /** + * Mostly for main button in landscape mode. Changes icon size inside. + */ + const val CONTENT_HEIGHT_SHORT = 1.3f + + /** + * Mostly for additional button in landscape mode. Changes icon size inside. + */ + const val CONTENT_HEIGHT_SHORT_ADDITIONAL = 1.1f +} diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeypadFlow.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeypadFlow.kt index f100ccf2..df885afd 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeypadFlow.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/KeypadFlow.kt @@ -49,7 +49,7 @@ fun KeypadFlow( columns: Int, @IntRange(0, 100) horizontalPadding: Int = 10, @IntRange(0, 100) verticalPadding: Int = 10, - content: @Composable FlowRowScope.(width: Float, height: Float) -> Unit + content: @Composable FlowRowScope.(width: Float, height: Float) -> Unit, ) { val height: Float = remember { (1f - verticalPadding / 100f) / rows } val width: Float = remember { (1f - horizontalPadding / 100f) / columns } @@ -58,7 +58,7 @@ fun KeypadFlow( modifier = modifier, maxItemsInEachRow = columns, horizontalArrangement = Arrangement.SpaceAround, - verticalArrangement = Arrangement.SpaceAround + verticalArrangement = Arrangement.SpaceAround, ) { content(width, height) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ListItem.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ListItem.kt index 5045fe61..5f50dd09 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ListItem.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ListItem.kt @@ -57,12 +57,12 @@ fun ListItem( .padding(start = 16.dp, end = 24.dp) .heightIn(min = if (supportingContent == null) 56.dp else 72.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { leadingContent?.let { ProvideColor( color = MaterialTheme.colorScheme.onSurfaceVariant, - content = it + content = it, ) } @@ -70,20 +70,20 @@ fun ListItem( ProvideStyle( color = MaterialTheme.colorScheme.onSurface, textStyle = MaterialTheme.typography.bodyLarge, - content = headlineContent + content = headlineContent, ) supportingContent?.let { ProvideStyle( color = MaterialTheme.colorScheme.onSurfaceVariant, textStyle = MaterialTheme.typography.bodyMedium, - content = it + content = it, ) } } trailingContent?.let { ProvideColor( color = MaterialTheme.colorScheme.onSurfaceVariant, - content = it + content = it, ) } } @@ -106,10 +106,10 @@ fun ListItem( imageVector = icon, contentDescription = iconDescription, modifier = Modifier.size(24.dp), - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) }, - trailingContent = trailing + trailingContent = trailing, ) @Composable @@ -120,14 +120,14 @@ fun ListItem( iconDescription: String = headlineText, supportingText: String? = null, switchState: Boolean, - onSwitchChange: (Boolean) -> Unit + onSwitchChange: (Boolean) -> Unit, ) = ListItem( modifier = modifier .clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(), onClick = { onSwitchChange(!switchState) }, - role = Role.Switch + role = Role.Switch, ), headlineText = headlineText, supportingText = supportingText, @@ -136,9 +136,9 @@ fun ListItem( trailing = { Switch( checked = switchState, - onCheckedChange = { onSwitchChange(it) } + onCheckedChange = { onSwitchChange(it) }, ) - } + }, ) @Preview @@ -152,7 +152,7 @@ fun PreviewListItem1() { leadingContent = { Icon( imageVector = Icons.Default.Home, - contentDescription = null + contentDescription = null, ) }, ) @@ -171,7 +171,7 @@ fun PreviewListItem1() { supportingText = "Support text support text support text support text", modifier = Modifier, trailing = {}, - iconDescription = "" + iconDescription = "", ) ListItem( diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ModifierExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ModifierExtensions.kt index 01bf1057..9a07420c 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ModifierExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ModifierExtensions.kt @@ -47,7 +47,7 @@ fun Modifier.squashable( val cornerRadius: Int by animateIntAsState( targetValue = if (isPressed) cornerRadiusRange.first else cornerRadiusRange.last, animationSpec = animationSpec, - label = "Squashed animation" + label = "Squashed animation", ) this @@ -58,7 +58,7 @@ fun Modifier.squashable( interactionSource = interactionSource, indication = rememberRipple(), role = role, - enabled = enabled + enabled = enabled, ) } @@ -75,7 +75,7 @@ fun Modifier.squashable( val cornerRadius: Dp by animateDpAsState( targetValue = if (isPressed) cornerRadiusRange.start else cornerRadiusRange.endInclusive, animationSpec = animationSpec, - label = "Squashed animation" + label = "Squashed animation", ) this @@ -86,6 +86,6 @@ fun Modifier.squashable( interactionSource = interactionSource, indication = rememberRipple(), role = role, - enabled = enabled + enabled = enabled, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigateUpButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigateUpButton.kt index fe95a293..db6ebd6d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigateUpButton.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigateUpButton.kt @@ -36,7 +36,7 @@ fun NavigateUpButton(onClick: () -> Unit) { IconButton(onClick = onClick) { Icon( Icons.AutoMirrored.Outlined.ArrowBack, - contentDescription = stringResource(R.string.navigate_up_description) + contentDescription = stringResource(R.string.navigate_up_description), ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt index 0e906d14..400748f0 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/NavigationDrawer.kt @@ -73,7 +73,7 @@ class DrawerState( initialValue = initialValue, positionalThreshold = { distance -> distance * 0.5f }, velocityThreshold = { with(requireNotNull(density)) { 400.dp.toPx() } }, - animationSpec = tween() + animationSpec = tween(), ) val isOpen: Boolean @@ -89,10 +89,10 @@ class DrawerState( suspend fun close() = anchoredDraggableState.animateTo(DrawerValue.Closed) companion object { - internal fun Saver() = + internal fun saver() = Saver( save = { it.currentValue }, - restore = { DrawerState(it) } + restore = { DrawerState(it) }, ) } } @@ -101,7 +101,7 @@ class DrawerState( fun rememberDrawerState( initialValue: DrawerValue = DrawerValue.Closed, ): DrawerState { - return rememberSaveable(saver = DrawerState.Saver()) { + return rememberSaveable(saver = DrawerState.saver()) { DrawerState(initialValue) } } @@ -124,17 +124,17 @@ fun NavigationDrawer( PermanentDrawerSheet( modifier = Modifier .fillMaxHeight() - .verticalScroll(rememberScrollState()) + .verticalScroll(rememberScrollState()), ) { SheetContent( mainTabs = mainTabs, additionalTabs = additionalTabs, currentDestination = currentDestination, - onItemClick = onItemClick + onItemClick = onItemClick, ) } }, - content = content + content = content, ) } else { UnittoModalNavigationDrawer( @@ -143,19 +143,19 @@ fun NavigationDrawer( ModalDrawerSheet( modifier = Modifier .fillMaxHeight() - .verticalScroll(rememberScrollState()) + .verticalScroll(rememberScrollState()), ) { SheetContent( mainTabs = mainTabs, additionalTabs = additionalTabs, currentDestination = currentDestination, - onItemClick = onItemClick + onItemClick = onItemClick, ) } }, gesturesEnabled = gesturesEnabled, state = state, - content = content + content = content, ) } } @@ -173,7 +173,7 @@ private fun UnittoModalNavigationDrawer( val drawerScope = rememberCoroutineScope() Box( - modifier = modifier.fillMaxSize() + modifier = modifier.fillMaxSize(), ) { val drawerWidth = 360.dp val drawerWidthPx = with(density) { drawerWidth.toPx() } @@ -186,7 +186,7 @@ private fun UnittoModalNavigationDrawer( DraggableAnchors { DrawerValue.Closed at minValue DrawerValue.Open at maxValue - } + }, ) } @@ -202,7 +202,7 @@ private fun UnittoModalNavigationDrawer( state = state.anchoredDraggableState, orientation = Orientation.Horizontal, enabled = gesturesEnabled or state.isOpen, - ) + ), ) Scrim( @@ -210,7 +210,9 @@ private fun UnittoModalNavigationDrawer( onClose = { if (gesturesEnabled) drawerScope.launch { state.close() } }, fraction = { fraction( - minValue, maxValue, state.anchoredDraggableState.requireOffset() + minValue, + maxValue, + state.anchoredDraggableState.requireOffset(), ) }, ) @@ -224,14 +226,14 @@ private fun UnittoModalNavigationDrawer( .anchoredDraggableState .requireOffset() .roundToInt(), - y = 0 + y = 0, ) } .anchoredDraggable( state = state.anchoredDraggableState, orientation = Orientation.Horizontal, enabled = gesturesEnabled or state.isOpen, - ) + ), ) { drawerContent() } @@ -254,7 +256,7 @@ private fun Scrim( Canvas( Modifier .fillMaxSize() - .then(dismissDrawer) + .then(dismissDrawer), ) { drawRect(color, alpha = fraction()) } @@ -266,12 +268,12 @@ private fun fraction(a: Float, b: Float, pos: Float) = @Preview( backgroundColor = 0xFFC8F7D4, showBackground = true, - device = "spec:width=320dp,height=500dp,dpi=320" + device = "spec:width=320dp,height=500dp,dpi=320", ) @Preview( backgroundColor = 0xFFC8F7D4, showBackground = true, - device = "spec:width=440dp,height=500dp,dpi=440" + device = "spec:width=440dp,height=500dp,dpi=440", ) @Composable private fun PreviewUnittoModalNavigationDrawerClose() { @@ -290,11 +292,11 @@ private fun PreviewUnittoModalNavigationDrawerClose() { Column { Text(text = "Content") Button( - onClick = { corScope.launch { drawerState.open() } } + onClick = { corScope.launch { drawerState.open() } }, ) { Text(text = "BUTTON") } } - } + }, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt index 84944998..51ae48e7 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PagedIsland.kt @@ -81,12 +81,12 @@ fun PagedIsland( corScope.launch { pagerState.animateScrollToPage( // Animate to first page if target page is out of bounds - if (targetPage >= pagerState.pageCount) 0 else targetPage + if (targetPage >= pagerState.pageCount) 0 else targetPage, ) } } .background(backgroundColor) - .padding(16.dp) + .padding(16.dp), ) { Row( modifier = Modifier @@ -105,7 +105,7 @@ fun PagedIsland( .fillMaxWidth(), verticalAlignment = Alignment.Top, state = pagerState, - pageContent = { page -> pageContent(page % pageCount) } + pageContent = { page -> pageContent(page % pageCount) }, ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PortraitLandscape.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PortraitLandscape.kt index 6faba5d6..3725c934 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PortraitLandscape.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/PortraitLandscape.kt @@ -52,8 +52,11 @@ fun PortraitLandscape( .weight(1f) .fillMaxSize() .padding( - it.maxWidth * 0.015f, 0.dp, - it.maxHeight * 0.03f, it.maxHeight * 0.03f) + it.maxWidth * 0.015f, + 0.dp, + it.maxHeight * 0.03f, + it.maxHeight * 0.03f, + ) content1(contentModifier) content2(contentModifier) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithLargeTopBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithLargeTopBar.kt index 773338f0..cce1198d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithLargeTopBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithLargeTopBar.kt @@ -41,10 +41,10 @@ fun ScaffoldWithLargeTopBar( title: String, navigationIcon: @Composable () -> Unit, actions: @Composable RowScope.() -> Unit = {}, - content: @Composable (PaddingValues) -> Unit + content: @Composable (PaddingValues) -> Unit, ) { val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( - rememberTopAppBarState() + rememberTopAppBarState(), ) Scaffold( modifier = Modifier @@ -56,9 +56,9 @@ fun ScaffoldWithLargeTopBar( }, navigationIcon = navigationIcon, scrollBehavior = scrollBehavior, - actions = actions + actions = actions, ) }, - content = content + content = content, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt index 02e719ec..2c3c3860 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/ScaffoldWithTopBar.kt @@ -59,7 +59,7 @@ fun ScaffoldWithTopBar( floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, scrollBehavior: TopAppBarScrollBehavior? = null, - content: @Composable (PaddingValues) -> Unit + content: @Composable (PaddingValues) -> Unit, ) { Scaffold( modifier = modifier, @@ -67,7 +67,7 @@ fun ScaffoldWithTopBar( AnimatedVisibility( visible = LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact, enter = slideInVertically() + fadeIn(), - exit = slideOutVertically() + fadeOut() + exit = slideOutVertically() + fadeOut(), ) { CenterAlignedTopAppBar( title = title, @@ -84,6 +84,6 @@ fun ScaffoldWithTopBar( }, floatingActionButton = floatingActionButton, floatingActionButtonPosition = floatingActionButtonPosition, - content = content + content = content, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchBar.kt index fda7a005..c104ac4b 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchBar.kt @@ -109,7 +109,7 @@ fun SearchBar( modifier = modifier .windowInsetsPadding(TopAppBarDefaults.windowInsets) .height(height), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Row( modifier = Modifier @@ -121,10 +121,9 @@ fun SearchBar( .fillMaxWidth() .padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) + horizontalArrangement = Arrangement.spacedBy(16.dp), ) { ProvideColor(MaterialTheme.colorScheme.onSurface) { - NavigateButton { if (notEmpty) clear() else navigateUp() } SearchTextField( @@ -135,7 +134,7 @@ fun SearchBar( value = query, placeholder = stringResource(R.string.search_text_field_placeholder), onValueChange = onQueryChange, - onSearch = onSearch + onSearch = onSearch, ) ClearButton(notEmpty, ::clear) @@ -152,7 +151,7 @@ private fun SearchTextField( value: TextFieldValue, placeholder: String, onValueChange: (TextFieldValue) -> Unit, - onSearch: KeyboardActionScope.() -> Unit + onSearch: KeyboardActionScope.() -> Unit, ) { BasicTextField( modifier = modifier, @@ -171,33 +170,33 @@ private fun SearchTextField( modifier = Modifier.alpha(0.7f), text = placeholder, style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) } - } + }, ) } @Composable private fun SearchButton( - onClick: () -> Unit + onClick: () -> Unit, ) { SearchBarIconButton(onClick) { Icon( imageVector = Icons.Default.Search, - contentDescription = stringResource(R.string.search_button_description) + contentDescription = stringResource(R.string.search_button_description), ) } } @Composable private fun NavigateButton( - onClick: () -> Unit + onClick: () -> Unit, ) { SearchBarIconButton(onClick) { Icon( imageVector = Icons.AutoMirrored.Outlined.ArrowBack, - contentDescription = stringResource(R.string.navigate_up_description) + contentDescription = stringResource(R.string.navigate_up_description), ) } } @@ -205,17 +204,17 @@ private fun NavigateButton( @Composable private fun ClearButton( visible: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { AnimatedVisibility( visible = visible, enter = fadeIn(), - exit = fadeOut() + exit = fadeOut(), ) { SearchBarIconButton(onClick) { Icon( imageVector = Icons.Outlined.Clear, - contentDescription = stringResource(R.string.clear_input_description) + contentDescription = stringResource(R.string.clear_input_description), ) } } @@ -224,7 +223,7 @@ private fun ClearButton( @Composable fun SearchBarIconButton( onClick: () -> Unit, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { Box( modifier = Modifier @@ -236,10 +235,10 @@ fun SearchBarIconButton( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple( bounded = false, - radius = 20.dp - ) + radius = 20.dp, + ), ), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { content() } @@ -259,6 +258,6 @@ fun UnittoSearchBarPreview() { query = TextFieldValue("test"), onQueryChange = {}, navigateUp = {}, - scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchPlaceholder.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchPlaceholder.kt index c7905dc5..b3e908cb 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchPlaceholder.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SearchPlaceholder.kt @@ -41,29 +41,29 @@ import com.sadellie.unitto.core.base.R fun SearchPlaceholder( onButtonClick: () -> Unit, supportText: String, - buttonLabel: String + buttonLabel: String, ) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp) + verticalArrangement = Arrangement.spacedBy(16.dp), ) { Icon( imageVector = Icons.Default.SearchOff, contentDescription = stringResource(R.string.no_results_description), - modifier = Modifier.size(48.dp) + modifier = Modifier.size(48.dp), ) Text( text = stringResource(R.string.no_results_label), textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyLarge + style = MaterialTheme.typography.bodyLarge, ) Text( text = supportText, textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodySmall + style = MaterialTheme.typography.bodySmall, ) ElevatedButton(onClick = onButtonClick) { Text(text = buttonLabel) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SegmentedButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SegmentedButton.kt index 6d5fce41..f4b8cd2d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SegmentedButton.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SegmentedButton.kt @@ -47,14 +47,14 @@ import androidx.compose.ui.unit.dp @Composable fun SegmentedButtonsRow( modifier: Modifier = Modifier, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { Row( modifier .width(IntrinsicSize.Max) .height(40.dp) .clip(CircleShape) - .border(1.dp, MaterialTheme.colorScheme.outline, CircleShape) + .border(1.dp, MaterialTheme.colorScheme.outline, CircleShape), ) { content() } @@ -66,7 +66,7 @@ fun RowScope.SegmentedButton( label: String, onClick: () -> Unit, selected: Boolean, - icon: ImageVector? = null + icon: ImageVector? = null, ) { val containerColor = if (selected) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.surface @@ -77,9 +77,9 @@ fun RowScope.SegmentedButton( shape = RectangleShape, colors = ButtonDefaults.outlinedButtonColors( containerColor = containerColor, - contentColor = contentColorFor(containerColor) + contentColor = contentColorFor(containerColor), ), - contentPadding = PaddingValues(horizontal = 12.dp) + contentPadding = PaddingValues(horizontal = 12.dp), ) { if (icon != null) { Crossfade(selected, label = "Selected state") { diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt index aeb6efba..75de6681 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/SheetContent.kt @@ -67,14 +67,14 @@ internal fun ColumnScope.SheetContent( modifier = Modifier.clickable( interactionSource = interactionSource, indication = null, - onClick = { showHello = true } - ) + onClick = { showHello = true }, + ), ) { hello -> Text( text = if (hello) stringResource(R.string.hello_label) else stringResource(R.string.app_name), modifier = Modifier.padding(horizontal = 28.dp, vertical = 24.dp), style = MaterialTheme.typography.titleLarge, - color = MaterialTheme.colorScheme.primary + color = MaterialTheme.colorScheme.primary, ) } @@ -85,7 +85,7 @@ internal fun ColumnScope.SheetContent( destination = drawerItem, icon = if (selected) drawerItem.selectedIcon else drawerItem.defaultIcon, selected = selected, - onClick = onItemClick + onClick = onItemClick, ) } @@ -98,7 +98,7 @@ internal fun ColumnScope.SheetContent( destination = drawerItem, icon = if (selected) drawerItem.selectedIcon else drawerItem.defaultIcon, selected = selected, - onClick = onItemClick + onClick = onItemClick, ) } } @@ -119,7 +119,7 @@ private fun PreviewDrawerSheet() { DrawerItem.Calculator, ), currentDestination = DrawerItem.Calculator.start, - onItemClick = {} + onItemClick = {}, ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Slider.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Slider.kt index f184d0e9..4f3719c9 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Slider.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Slider.kt @@ -56,12 +56,12 @@ fun Slider( value: Float, valueRange: ClosedFloatingPointRange, onValueChange: (Float) -> Unit, - onValueChangeFinished: (Float) -> Unit = {} + onValueChangeFinished: (Float) -> Unit = {}, ) { val animated = animateFloatAsState( targetValue = value.roundToInt().toFloat(), animationSpec = spring(), - label = "Thumb animation" + label = "Thumb animation", ) Slider( @@ -81,14 +81,14 @@ private fun SquigglyTrack( @FloatRange(0.0, 1.0) waveHeight: Float = 0.7f, strokeWidth: Float = 15f, filledColor: Color = MaterialTheme.colorScheme.primary, - unfilledColor: Color = MaterialTheme.colorScheme.surfaceVariant + unfilledColor: Color = MaterialTheme.colorScheme.surfaceVariant, ) { val coroutineScope = rememberCoroutineScope() - var direct by remember { mutableFloatStateOf(waveHeight * (100f - strokeWidth * 2f ) / 100f ) } + var direct by remember { mutableFloatStateOf(waveHeight * (100f - strokeWidth * 2f) / 100f) } val animatedDirect = animateFloatAsState( targetValue = direct, animationSpec = spring(stiffness = Spring.StiffnessLow), - label = "Track animation" + label = "Track animation", ) LaunchedEffect(sliderState.value) { @@ -101,7 +101,7 @@ private fun SquigglyTrack( Canvas( modifier = Modifier .fillMaxWidth() - .height(20.dp) + .height(20.dp), ) { val width = size.width val height = size.height @@ -114,7 +114,7 @@ private fun SquigglyTrack( val path = Path().apply { moveTo( x = initialOffset, - y = height.times(0.5f) + y = height.times(0.5f), ) val amount = ceil(width.div(eachWaveWidth)) @@ -125,7 +125,7 @@ private fun SquigglyTrack( dx1 = eachWaveWidth * 0.5f, dy1 = height.times(peek), dx2 = eachWaveWidth, - dy2 = 0f + dy2 = 0f, ) } } @@ -135,12 +135,12 @@ private fun SquigglyTrack( left = 0f, right = thumbPosition, bottom = height, - clipOp = ClipOp.Intersect + clipOp = ClipOp.Intersect, ) { drawPath( path = path, color = filledColor, - style = Stroke(strokeWidth, cap = StrokeCap.Round) + style = Stroke(strokeWidth, cap = StrokeCap.Round), ) } @@ -149,7 +149,7 @@ private fun SquigglyTrack( start = Offset(thumbPosition, height.times(0.5f)), end = Offset(width, height.times(0.5f)), strokeWidth = strokeWidth, - cap = StrokeCap.Round + cap = StrokeCap.Round, ) } } @@ -165,6 +165,6 @@ private fun PreviewNewSlider() { com.sadellie.unitto.core.ui.common.Slider( value = currentValue, valueRange = 0f..16f, - onValueChange = { currentValue = it } + onValueChange = { currentValue = it }, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Switch.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Switch.kt index 60a03247..6176032d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Switch.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/Switch.kt @@ -70,7 +70,7 @@ fun Switch( ) val thumbOffset = animateDpAsState( targetValue = if (checked) ThumbPaddingEnd else ThumbPaddingStart, - label = "Thumb offset" + label = "Thumb offset", ) Box( @@ -81,15 +81,15 @@ fun Switch( enabled = true, onClickLabel = null, role = Role.Switch, - onClick = { onCheckedChange(!checked) } + onClick = { onCheckedChange(!checked) }, ) .background(trackColor.value, CircleShape) .size(TrackWidth, TrackHeight) .border( TrackOutlineWidth, borderColor(enabled, checked, colors), - CircleShape - ) + CircleShape, + ), ) { Box( modifier = Modifier @@ -100,7 +100,7 @@ fun Switch( ) .align(Alignment.CenterStart) .background(thumbColor.value, CircleShape) - .size(thumbSize.value) + .size(thumbSize.value), ) } } @@ -109,7 +109,7 @@ fun Switch( private fun trackColor( enabled: Boolean, checked: Boolean, - colors: SwitchColors + colors: SwitchColors, ): Color = if (enabled) { if (checked) colors.checkedTrackColor else colors.uncheckedTrackColor @@ -121,7 +121,7 @@ private fun trackColor( private fun thumbColor( enabled: Boolean, checked: Boolean, - colors: SwitchColors + colors: SwitchColors, ): Color = if (enabled) { if (checked) colors.checkedThumbColor else colors.uncheckedThumbColor @@ -133,7 +133,7 @@ private fun thumbColor( private fun borderColor( enabled: Boolean, checked: Boolean, - colors: SwitchColors + colors: SwitchColors, ): Color = if (enabled) { if (checked) colors.checkedBorderColor else colors.uncheckedBorderColor @@ -147,7 +147,7 @@ val TrackOutlineWidth = 1.8.dp val SelectedHandleSize = 20.0.dp val UnselectedHandleSize = 20.0.dp -val ThumbPaddingStart = (TrackHeight - UnselectedHandleSize) / 2 +val ThumbPaddingStart = (TrackHeight - UnselectedHandleSize) / 2 val ThumbPaddingEnd = TrackWidth - SelectedHandleSize / 2 - TrackHeight / 2 @Preview @@ -156,6 +156,6 @@ fun PreviewPixelSwitch() { var checked by remember { mutableStateOf(false) } Switch( checked = checked, - onCheckedChange = { checked = !checked } + onCheckedChange = { checked = !checked }, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/WithConstraints.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/WithConstraints.kt index 37602a6f..06726e49 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/WithConstraints.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/WithConstraints.kt @@ -34,11 +34,11 @@ fun ColumnWithConstraints( modifier: Modifier = Modifier, verticalArrangement: Arrangement.Vertical = Arrangement.Top, horizontalAlignment: Alignment.Horizontal = Alignment.Start, - content: @Composable (ColumnScope.(BoxWithConstraintsScope)-> Unit) + content: @Composable (ColumnScope.(BoxWithConstraintsScope) -> Unit), ) = BoxWithConstraints(modifier) { Column( verticalArrangement = verticalArrangement, - horizontalAlignment = horizontalAlignment + horizontalAlignment = horizontalAlignment, ) { content(this@BoxWithConstraints) } } @@ -47,10 +47,10 @@ fun RowWithConstraints( modifier: Modifier = Modifier, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, verticalAlignment: Alignment.Vertical = Alignment.Top, - content: @Composable (RowScope.(BoxWithConstraintsScope)-> Unit) + content: @Composable (RowScope.(BoxWithConstraintsScope) -> Unit), ) = BoxWithConstraints(modifier) { Row( horizontalArrangement = horizontalArrangement, - verticalAlignment = verticalAlignment + verticalAlignment = verticalAlignment, ) { content(this@BoxWithConstraints) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/AutoSizeTextStyleBox.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/AutoSizeTextStyleBox.kt index 32fee842..c1016700 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/AutoSizeTextStyleBox.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/AutoSizeTextStyleBox.kt @@ -43,54 +43,6 @@ import androidx.compose.ui.unit.TextUnit import kotlin.math.min import kotlin.math.roundToInt -// HUGE performance drop. Don't use for buttons -///** -// * Composable function that automatically adjusts the text size to fit within given constraints using AnnotatedString, considering the ratio of line spacing to text size. -// * -// * Features: -// * Similar to AutoSizeText(String), with support for AnnotatedString. -// * -// * @param inlineContent a map storing composables that replaces certain ranges of the text, used to -// * insert composables into text layout. See [InlineTextContent]. -// * @see AutoSizeText -// */ -//@Composable -//internal fun AutoSizeText( -// text: AnnotatedString, -// modifier: Modifier = Modifier, -// minRatio: Float = 1f, -// maxTextSize: TextUnit = TextUnit.Unspecified, -// alignment: Alignment = Alignment.TopStart, -// overflow: TextOverflow = TextOverflow.Clip, -// softWrap: Boolean = true, -// maxLines: Int = Int.MAX_VALUE, -// minLines: Int = 1, -// inlineContent: Map = mapOf(), -// onTextLayout: (TextLayoutResult) -> Unit = {}, -// style: TextStyle = LocalTextStyle.current, -//) = AutoSizeTextStyleBox( -// modifier = modifier, -// text = text, -// maxTextSize = maxTextSize, -// maxLines = maxLines, -// minLines = minLines, -// softWrap = softWrap, -// style = style, -// minRatio = minRatio, -// alignment = alignment -//) { -// Text( -// text = text, -// overflow = overflow, -// softWrap = softWrap, -// maxLines = maxLines, -// minLines = minLines, -// inlineContent = inlineContent, -// onTextLayout = onTextLayout, -// style = LocalTextStyle.current, -// ) -//} - /** * [BoxWithConstraints] with [autoTextStyle] passed via [LocalTextStyle]. * @@ -122,11 +74,11 @@ internal fun AutoSizeTextStyleBox( style: TextStyle, minRatio: Float, alignment: Alignment, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val density = LocalDensity.current CompositionLocalProvider( - LocalDensity provides Density(density = density.density, fontScale = 1F) + LocalDensity provides Density(density = density.density, fontScale = 1F), ) { BoxWithConstraints( modifier = modifier, @@ -141,12 +93,12 @@ internal fun AutoSizeTextStyleBox( style = style, alignment = alignment, density = density, - minRatio = minRatio + minRatio = minRatio, ) CompositionLocalProvider( value = LocalTextStyle.provides(autoTextStyle), - content = content + content = content, ) } } @@ -290,10 +242,11 @@ private fun IntProgression.findElectedValue( var high = last while (low <= high) { val mid = low + (high - low) / 2 - if (shouldMoveBackward(transform(mid))) + if (shouldMoveBackward(transform(mid))) { high = mid - 1 - else + } else { low = mid + 1 + } } transform(high.coerceAtLeast(minimumValue = first)) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/DensityExt.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/DensityExt.kt index 4bf23835..a04a1289 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/DensityExt.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/autosize/DensityExt.kt @@ -27,5 +27,8 @@ import androidx.compose.ui.unit.isSpecified internal fun Density.roundToPx(sp: TextUnit): Int = sp.roundToPx() internal fun Density.toSp(px: Int): TextUnit = px.toSp() internal fun Density.toIntSize(dpSize: DpSize): IntSize = - if (dpSize.isSpecified) IntSize(dpSize.width.roundToPx(), dpSize.height.roundToPx()) - else IntSize.Zero + if (dpSize.isSpecified) { + IntSize(dpSize.width.roundToPx(), dpSize.height.roundToPx()) + } else { + IntSize.Zero + } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/DatePickerDialog.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/DatePickerDialog.kt index 4abee43e..b5f50430 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/DatePickerDialog.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/DatePickerDialog.kt @@ -67,7 +67,7 @@ fun DatePickerDialog( BasicAlertDialog( onDismissRequest = onDismiss, modifier = modifier.wrapContentHeight(), - properties = DialogProperties(usePlatformDefaultWidth = false) + properties = DialogProperties(usePlatformDefaultWidth = false), ) { Surface( modifier = modifier @@ -83,15 +83,14 @@ fun DatePickerDialog( Box( modifier = Modifier .align(Alignment.End) - .padding(_dialogButtonsPadding) + .padding(_dialogButtonsPadding), ) { - AlertDialogFlowRow( mainAxisSpacing = _dialogButtonsMainAxisSpacing, - crossAxisSpacing = _dialogButtonsCrossAxisSpacing + crossAxisSpacing = _dialogButtonsCrossAxisSpacing, ) { TextButton( - onClick = onDismiss + onClick = onDismiss, ) { Text(text = dismissLabel) } @@ -100,16 +99,17 @@ fun DatePickerDialog( val millis = pickerState.selectedDateMillis ?: return@TextButton val date = LocalDateTime.ofInstant( - Instant.ofEpochMilli(millis), ZoneId.systemDefault() + Instant.ofEpochMilli(millis), + ZoneId.systemDefault(), ) onConfirm( localDateTime .withYear(date.year) .withMonth(date.monthValue) - .withDayOfMonth(date.dayOfMonth) + .withDayOfMonth(date.dayOfMonth), ) - } + }, ) { Text(text = confirmLabel) } @@ -125,7 +125,7 @@ fun DatePickerDialog( private fun AlertDialogFlowRow( mainAxisSpacing: Dp, crossAxisSpacing: Dp, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { Layout(content) { measurables, constraints -> val sequences = mutableListOf>() @@ -142,7 +142,7 @@ private fun AlertDialogFlowRow( // Return whether the placeable can be added to the current sequence. fun canAddToCurrentSequence(placeable: Placeable) = currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.roundToPx() + - placeable.width <= constraints.maxWidth + placeable.width <= constraints.maxWidth // Store current sequence information and start a new sequence. fun startNewSequence() { @@ -187,20 +187,22 @@ private fun AlertDialogFlowRow( sequences.forEachIndexed { i, placeables -> val childrenMainAxisSizes = IntArray(placeables.size) { j -> placeables[j].width + - if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0 + if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0 } val arrangement = Arrangement.End val mainAxisPositions = IntArray(childrenMainAxisSizes.size) { 0 } with(arrangement) { arrange( - mainAxisLayoutSize, childrenMainAxisSizes, - layoutDirection, mainAxisPositions + mainAxisLayoutSize, + childrenMainAxisSizes, + layoutDirection, + mainAxisPositions, ) } placeables.forEachIndexed { j, placeable -> placeable.place( x = mainAxisPositions[j], - y = crossAxisPositions[i] + y = crossAxisPositions[i], ) } } @@ -210,4 +212,4 @@ private fun AlertDialogFlowRow( private val _dialogButtonsPadding by lazy { PaddingValues(bottom = 8.dp, end = 6.dp) } private val _dialogButtonsMainAxisSpacing by lazy { 8.dp } -private val _dialogButtonsCrossAxisSpacing by lazy { 12.dp } \ No newline at end of file +private val _dialogButtonsCrossAxisSpacing by lazy { 12.dp } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/TimePickerDialog.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/TimePickerDialog.kt index 0a5c89b2..13eecb6b 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/TimePickerDialog.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/datetimepicker/TimePickerDialog.kt @@ -73,7 +73,7 @@ fun TimePickerDialog( val pickerState = rememberTimePickerState( initialHour = hour, initialMinute = minute, - is24Hour = DateFormat.is24HourFormat(LocalContext.current) + is24Hour = DateFormat.is24HourFormat(LocalContext.current), ) val configuration = LocalConfiguration.current var showingPicker by rememberSaveable { mutableStateOf(true) } @@ -81,8 +81,8 @@ fun TimePickerDialog( BasicAlertDialog( onDismissRequest = onCancel, properties = DialogProperties( - usePlatformDefaultWidth = false - ) + usePlatformDefaultWidth = false, + ), ) { Surface( shape = MaterialTheme.shapes.extraLarge, @@ -92,7 +92,7 @@ fun TimePickerDialog( .height(IntrinsicSize.Min) .background( shape = MaterialTheme.shapes.extraLarge, - color = MaterialTheme.colorScheme.surface + color = MaterialTheme.colorScheme.surface, ), ) { if (configuration.screenHeightDp > 400) { @@ -103,7 +103,7 @@ fun TimePickerDialog( .fillMaxSize() .semantics { isTraversalGroup = true - } + }, ) { IconButton( modifier = Modifier @@ -114,7 +114,8 @@ fun TimePickerDialog( .size(64.dp, 72.dp) .align(Alignment.BottomStart) .zIndex(5f), - onClick = { showingPicker = !showingPicker }) { + onClick = { showingPicker = !showingPicker }, + ) { val icon = if (showingPicker) { Icons.Outlined.Keyboard } else { @@ -122,21 +123,21 @@ fun TimePickerDialog( } Icon( imageVector = icon, - contentDescription = stringResource(R.string.select_time_label) + contentDescription = stringResource(R.string.select_time_label), ) } } } Column( modifier = Modifier.padding(24.dp), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( modifier = Modifier .fillMaxWidth() .padding(bottom = 20.dp), text = stringResource(R.string.select_time_label), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) if (showingPicker && configuration.screenHeightDp > 400) { TimePicker(state = pickerState) @@ -146,14 +147,14 @@ fun TimePickerDialog( Row( modifier = Modifier .height(40.dp) - .fillMaxWidth() + .fillMaxWidth(), ) { Spacer(modifier = Modifier.weight(1f)) TextButton( - onClick = onCancel + onClick = onCancel, ) { Text(stringResource(R.string.cancel_label)) } TextButton( - onClick = { onConfirm(pickerState.hour, pickerState.minute) } + onClick = { onConfirm(pickerState.hour, pickerState.minute) }, ) { Text(confirmLabel) } } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArCos.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArCos.kt index 8939296f..7498b497 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArCos.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArCos.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArSin.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArSin.kt index e599f6da..7cd91693 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArSin.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArSin.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArTan.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArTan.kt index d34b78d9..209fc6c4 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArTan.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/ArTan.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Backspace.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Backspace.kt index 06316c39..18854dba 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Backspace.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Backspace.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Brackets.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Brackets.kt index 04fed675..7e941f47 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Brackets.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Brackets.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Clear.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Clear.kt index 0ed708d8..6d3496b4 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Clear.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Clear.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Comma.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Comma.kt index a233910e..c3702125 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Comma.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Comma.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Cos.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Cos.kt index 69bccf7c..3e6c1668 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Cos.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Cos.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Deg.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Deg.kt index dea1f07d..c3b3501d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Deg.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Deg.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Divide.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Divide.kt index 26862199..c31983f7 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Divide.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Divide.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Dot.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Dot.kt index f38bd6e7..277967ea 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Dot.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Dot.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Equal.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Equal.kt index fa0b216c..283cc9aa 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Equal.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Equal.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Euler.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Euler.kt index 8eacdd48..ee1b64ac 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Euler.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Euler.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ex.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ex.kt index 72a33a71..45cfe54c 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ex.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ex.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Factorial.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Factorial.kt index b7d708f0..bf410f13 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Factorial.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Factorial.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Inv.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Inv.kt index fa2029ed..92a6d71e 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Inv.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Inv.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key0.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key0.kt index 90af3061..5974903c 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key0.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key0.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key1.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key1.kt index 1fd52e39..58916266 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key1.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key1.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key2.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key2.kt index 6e915ede..dd02d2a4 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key2.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key2.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key3.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key3.kt index 5962764e..e4c911dc 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key3.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key3.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key4.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key4.kt index 1ff3ee8f..dfe5027f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key4.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key4.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key5.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key5.kt index 19fa45ff..72b185db 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key5.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key5.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key6.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key6.kt index 70eb77ed..a0f6f1b6 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key6.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key6.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key7.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key7.kt index 785801b9..c6a5c26e 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key7.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key7.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key8.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key8.kt index 7bef566b..cfad2206 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key8.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key8.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key9.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key9.kt index 39d7e717..ef08ce93 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key9.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Key9.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyA.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyA.kt index 97e03820..a6b979d6 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyA.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyA.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyB.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyB.kt index 4cccb0e3..2038d84d 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyB.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyB.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyC.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyC.kt index 6f1cd0e5..2905f176 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyC.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyC.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyD.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyD.kt index 3c40989f..212e022b 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyD.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyD.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyE.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyE.kt index 3b7bc1d6..539d904f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyE.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyE.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyF.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyF.kt index e7c16c90..cadbfd52 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyF.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/KeyF.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/LeftBracket.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/LeftBracket.kt index 10ee2d38..cb84e029 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/LeftBracket.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/LeftBracket.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ln.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ln.kt index 02e82940..37e79071 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ln.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Ln.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Log.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Log.kt index 25002cf2..818b4852 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Log.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Log.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Minus.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Minus.kt index 46902090..37ab284c 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Minus.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Minus.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Modulo.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Modulo.kt index 58609d95..4c56ff8f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Modulo.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Modulo.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Multiply.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Multiply.kt index b43aee08..1a417165 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Multiply.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Multiply.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Percent.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Percent.kt index 6be0bc7b..57b863ce 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Percent.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Percent.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pi.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pi.kt index 52c37011..b74cf3b2 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pi.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Pi.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Plus.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Plus.kt index af173873..56395cfb 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Plus.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Plus.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power.kt index 2200e939..cf4adaf2 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power10.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power10.kt index 987c0f27..f77f67ed 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power10.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Power10.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Rad.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Rad.kt index 93295d95..0c2e89ae 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Rad.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Rad.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/RightBracket.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/RightBracket.kt index 621da869..77b95f49 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/RightBracket.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/RightBracket.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Root.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Root.kt index ff91fb88..4774e8b9 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Root.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Root.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Sin.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Sin.kt index 702d8118..f559e945 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Sin.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Sin.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Tan.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Tan.kt index 9c19cd11..91594972 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Tan.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/icons/iconpack/Tan.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.core.ui.common.icons.iconpack import androidx.compose.ui.graphics.Color diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt index a11ef8e8..97b8614c 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ClipboardManagerExt.kt @@ -32,20 +32,20 @@ import com.sadellie.unitto.core.base.Token */ internal class ExpressionClipboardManager( private val formatterSymbols: FormatterSymbols, - private val clipboardManager: android.content.ClipboardManager -): ClipboardManager { + private val clipboardManager: android.content.ClipboardManager, +) : ClipboardManager { override fun setText(annotatedString: AnnotatedString) = clipboardManager.setPrimaryClip( ClipData.newPlainText( PLAIN_TEXT_LABEL, annotatedString .text - .replace(Token.Digit.dot, formatterSymbols.fractional) - ) + .replace(Token.Digit.dot, formatterSymbols.fractional), + ), ) override fun getText(): AnnotatedString? = clipboardManager.primaryClip?.let { primaryClip -> if (primaryClip.itemCount > 0) { - val clipText = primaryClip.getItemAt(0)?.text ?:return@let null + val clipText = primaryClip.getItemAt(0)?.text ?: return@let null clipText .toString() diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/CursorFixer.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/CursorFixer.kt index 5726deed..d9b2ecaf 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/CursorFixer.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/CursorFixer.kt @@ -22,7 +22,6 @@ import com.sadellie.unitto.core.base.Token import kotlin.math.abs fun String.fixCursor(pos: Int, grouping: String): Int { - if (isEmpty()) return pos // Best position if we move cursor left @@ -75,7 +74,7 @@ private fun Int.isAtToken(str: String, token: String): Boolean { return str .substring( startIndex = (this - checkBound).coerceAtLeast(0), - endIndex = (this + checkBound).coerceAtMost(str.length) + endIndex = (this + checkBound).coerceAtMost(str.length), ) .contains(token) } @@ -86,7 +85,6 @@ private fun Int.isAfterToken(str: String, token: String): Boolean { .contains(token) } - // This can also make [TextFieldValue.addTokens] better by checking tokens both ways. Needs more tests fun String.tokenAfter(pos: Int): String { Token.Func.allWithOpeningBracket.forEach { @@ -96,23 +94,6 @@ fun String.tokenAfter(pos: Int): String { return substring(pos, (pos + 1).coerceAtMost(this.length)) } -//private fun String.numberNearby(cursor: Int): String { -// val text = this -// -// var aheadCursor = cursor -// var afterCursor = cursor -// -// while (text.tokenAhead(aheadCursor) in Token.Digit.allWithDot) { -// aheadCursor-- -// } -// -// while (text.tokenAfter(afterCursor) in Token.Digit.allWithDot) { -// afterCursor++ -// } -// -// return text.substring(aheadCursor, afterCursor) -//} - private fun Int.isBeforeToken(str: String, token: String): Boolean { return str .substring(this, (this + token.length).coerceAtMost(str.length)) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt index 2c0812b9..87965e91 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/ExpressionTransformer.kt @@ -30,13 +30,13 @@ class ExpressionTransformer(private val formatterSymbols: FormatterSymbols) : Vi val formatted = text.text.formatExpression(formatterSymbols) return TransformedText( text = AnnotatedString(formatted), - offsetMapping = ExpressionMapping(text.text, formatted) + offsetMapping = ExpressionMapping(text.text, formatted), ) } inner class ExpressionMapping( private val original: String, - private val transformed: String + private val transformed: String, ) : OffsetMapping { // Called when entering text (on each text change) // Basically moves cursor to the right position diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt index 79a37aac..90c0e655 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FixedInputTextFIeld.kt @@ -49,15 +49,15 @@ fun FixedExpressionInputTextField( val clipboardManager = FormattedExpressionClipboardManager( formatterSymbols = formatterSymbols, clipboardManager = LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) - as android.content.ClipboardManager + as android.content.ClipboardManager, ) CompositionLocalProvider(LocalClipboardManager provides clipboardManager) { SelectionContainer( - modifier = Modifier + modifier = Modifier .horizontalScroll(rememberScrollState()) // Must be first .clickable(onClick = onClick) - .then(modifier) + .then(modifier), ) { Text( modifier = Modifier.fillMaxWidth(), @@ -71,8 +71,8 @@ fun FixedExpressionInputTextField( private class FormattedExpressionClipboardManager( private val formatterSymbols: FormatterSymbols, - private val clipboardManager: android.content.ClipboardManager -): ClipboardManager { + private val clipboardManager: android.content.ClipboardManager, +) : ClipboardManager { override fun getText(): AnnotatedString? = null override fun setText(annotatedString: AnnotatedString) { @@ -81,8 +81,8 @@ private class FormattedExpressionClipboardManager( PLAIN_TEXT_LABEL, annotatedString .text - .replace(formatterSymbols.grouping, "") - ) + .replace(formatterSymbols.grouping, ""), + ), ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt index cbf6a1ae..a3aff9aa 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/FormatterExtensions.kt @@ -51,7 +51,7 @@ internal fun String.clearAndFilterNumberBase(): String { } fun String.formatExpression( - formatterSymbols: FormatterSymbols + formatterSymbols: FormatterSymbols, ): String { var input = this @@ -84,7 +84,7 @@ fun String.formatExpression( } private fun String.formatNumber( - formatterSymbols: FormatterSymbols + formatterSymbols: FormatterSymbols, ): String { val input = this @@ -114,7 +114,7 @@ private fun String.leaveLegalTokensOnly(legalTokens: List): String { val subs = streamOfTokens .substring( cursor, - (cursor + token.length).coerceAtMost(streamOfTokens.length) + (cursor + token.length).coerceAtMost(streamOfTokens.length), ) if (subs == token) { // Got a digit, see if there are other digits coming after diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt index c8ce2e52..f21773d1 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/InputTextField.kt @@ -64,7 +64,7 @@ fun ExpressionTextField( ExpressionClipboardManager( formatterSymbols = formatterSymbols, clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) - as android.content.ClipboardManager + as android.content.ClipboardManager, ) } val expressionTransformer = remember(formatterSymbols) { @@ -72,7 +72,7 @@ fun ExpressionTextField( } CompositionLocalProvider( - LocalClipboardManager provides clipboardManager + LocalClipboardManager provides clipboardManager, ) { AutoSizeTextField( modifier = modifier, @@ -85,7 +85,7 @@ fun ExpressionTextField( textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), visualTransformation = expressionTransformer, cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), - minRatio = minRatio + minRatio = minRatio, ) } } @@ -110,7 +110,7 @@ fun NumberBaseTextField( readOnly = readOnly, textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), - minRatio = minRatio + minRatio = minRatio, ) } @@ -132,7 +132,7 @@ fun SimpleTextField( readOnly = readOnly, textStyle = LocalNumberTypography.current.displayLarge.copy(textColor), cursorBrush = SolidColor(MaterialTheme.colorScheme.onSurfaceVariant), - minRatio = minRatio + minRatio = minRatio, ) } @@ -174,7 +174,7 @@ private fun AutoSizeTextField( softWrap = false, style = textStyle, minRatio = minRatio, - alignment = alignment + alignment = alignment, ) { CompositionLocalProvider( LocalTextInputService provides null, @@ -204,8 +204,8 @@ private fun AutoSizeTextField( text = placeholder!!, style = style.copy( textAlign = TextAlign.End, - color = MaterialTheme.colorScheme.onSurface.copy(0.5f) - ) + color = MaterialTheme.colorScheme.onSurface.copy(0.5f), + ), ) } innerTextField() 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 index 30c7a4d5..8df2b87f 100644 --- 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 @@ -62,8 +62,8 @@ fun OutlinedDecimalTextField( visualTransformation = expressionFormatter, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Decimal, - imeAction = imeAction + imeAction = imeAction, ), - colors = colors + colors = colors, ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt index 0427cb8d..6bb2005b 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/TextFieldValueExtensions.kt @@ -30,7 +30,8 @@ fun TextFieldValue.addTokens(tokens: String): TextFieldValue { Token.Operator.plus, Token.Operator.multiply, Token.Operator.divide, - Token.Operator.power -> { + Token.Operator.power, + -> { if (ahead == Token.Operator.plus) return deleteAheadAndAdd(tokens) if (ahead == Token.Operator.minus) return deleteAheadAndAdd(tokens) if (ahead == Token.Operator.multiply) return deleteAheadAndAdd(tokens) @@ -50,7 +51,7 @@ fun TextFieldValue.addTokens(tokens: String): TextFieldValue { return this.copy( text = text.replaceRange(selection.start, selection.end, tokens), - selection = TextRange(selection.start + tokens.length) + selection = TextRange(selection.start + tokens.length), ) } @@ -93,7 +94,7 @@ fun TextFieldValue.addBracket(): TextFieldValue { Token.Operator.plus, Token.Operator.minus, Token.Operator.power, - Token.Operator.leftBracket + Token.Operator.leftBracket, ) if (text.tokenAhead(selection.start) in operators2) { return addTokens(Token.Operator.leftBracket) @@ -122,7 +123,7 @@ fun TextFieldValue.deleteTokens(): TextFieldValue { return this.copy( text = newText, - selection = TextRange((newText.length - distanceFromEnd).coerceAtLeast(0)) + selection = TextRange((newText.length - distanceFromEnd).coerceAtLeast(0)), ) } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/FloatingTextActionModeCallback.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/FloatingTextActionModeCallback.kt index 90a5f2e0..5dcaa535 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/FloatingTextActionModeCallback.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/FloatingTextActionModeCallback.kt @@ -27,7 +27,7 @@ import androidx.annotation.RequiresApi @RequiresApi(Build.VERSION_CODES.M) internal class FloatingTextActionModeCallback( - private val callback: UnittoActionModeCallback + private val callback: UnittoActionModeCallback, ) : ActionMode.Callback2() { override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { return callback.onActionItemClicked(mode, item) @@ -48,14 +48,14 @@ internal class FloatingTextActionModeCallback( override fun onGetContentRect( mode: ActionMode?, view: View?, - outRect: android.graphics.Rect? + outRect: android.graphics.Rect?, ) { val rect = callback.rect outRect?.set( rect.left.toInt(), rect.top.toInt(), rect.right.toInt(), - rect.bottom.toInt() + rect.bottom.toInt(), ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoActionModeCallback.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoActionModeCallback.kt index efa4681b..d8dc5af3 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoActionModeCallback.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoActionModeCallback.kt @@ -33,7 +33,7 @@ internal class UnittoActionModeCallback( var onCopyRequested: (() -> Unit)? = null, var onPasteRequested: (() -> Unit)? = null, var onCutRequested: (() -> Unit)? = null, - var onSelectAllRequested: (() -> Unit)? = null + var onSelectAllRequested: (() -> Unit)? = null, ) { fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { requireNotNull(menu) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoPrimaryTextActionModeCallback.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoPrimaryTextActionModeCallback.kt index 6bdd1c31..5462163f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoPrimaryTextActionModeCallback.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoPrimaryTextActionModeCallback.kt @@ -23,7 +23,7 @@ import android.view.Menu import android.view.MenuItem internal class UnittoPrimaryTextActionModeCallback( - private val callback: UnittoActionModeCallback + private val callback: UnittoActionModeCallback, ) : ActionMode.Callback { override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { return callback.onActionItemClicked(mode, item) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoTextToolbar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoTextToolbar.kt index d66fc7b1..1c3c30c0 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoTextToolbar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/textfield/texttoolbar/UnittoTextToolbar.kt @@ -29,7 +29,7 @@ class UnittoTextToolbar( private val view: View, private val copyCallback: () -> Unit, private val pasteCallback: (() -> Unit)? = null, - private val cutCallback: (() -> Unit)? = null + private val cutCallback: (() -> Unit)? = null, ) : TextToolbar { private var actionMode: ActionMode? = null @@ -42,7 +42,7 @@ class UnittoTextToolbar( onCopyRequested: (() -> Unit)?, onPasteRequested: (() -> Unit)?, onCutRequested: (() -> Unit)?, - onSelectAllRequested: (() -> Unit)? + onSelectAllRequested: (() -> Unit)?, ) { textActionModeCallback.rect = rect textActionModeCallback.onCopyRequested = copyCallback @@ -66,17 +66,17 @@ class UnittoTextToolbar( private fun startActionMode( view: View, - textActionModeCallback: UnittoActionModeCallback + textActionModeCallback: UnittoActionModeCallback, ): ActionMode { return if (Build.VERSION.SDK_INT >= 23) { view.startActionMode( FloatingTextActionModeCallback(textActionModeCallback), - ActionMode.TYPE_FLOATING + ActionMode.TYPE_FLOATING, ) } else { // Old devices use toolbar instead of a floating menu view.startActionMode( - UnittoPrimaryTextActionModeCallback(textActionModeCallback) + UnittoPrimaryTextActionModeCallback(textActionModeCallback), ) } } diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/datetime/ZonedDateTimeUtils.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/datetime/ZonedDateTimeUtils.kt index 9800dbc2..e9794708 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/datetime/ZonedDateTimeUtils.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/datetime/ZonedDateTimeUtils.kt @@ -83,10 +83,11 @@ fun ZonedDateTime.formatTimeHours( locale: Locale, is24Hour: Boolean, ): String = - if (is24Hour) + if (is24Hour) { format(UnittoDateTimeFormatter.time24Hours(locale)) - else + } else { format(UnittoDateTimeFormatter.time12Hours(locale)) + } /** * @see UnittoDateTimeFormatter.timeMinutes @@ -132,7 +133,7 @@ fun ZonedDateTime.formatDateDayMonthYear( * @see UnittoDateTimeFormatter.dateWeekDayMonthYear */ fun LocalDate.formatDateWeekDayMonthYear( - locale: Locale + locale: Locale, ): String = format(UnittoDateTimeFormatter.dateWeekDayMonthYear(locale)) @@ -155,7 +156,6 @@ fun LocalDate.formatDateWeekDayMonthYear( fun ZonedDateTime.formatOffset( currentTime: ZonedDateTime, ): String? { - val offsetFixed = ChronoUnit.SECONDS.between(currentTime, this) var resultBuffer = "" diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt index e4123d27..99e21f93 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/model/DrawerItem.kt @@ -43,7 +43,7 @@ sealed class DrawerItem( @StringRes val name: Int, val shortcut: Shortcut?, val selectedIcon: ImageVector, - val defaultIcon: ImageVector + val defaultIcon: ImageVector, ) { data object Calculator : DrawerItem( graph = TopLevelDestinations.CALCULATOR_GRAPH, @@ -52,10 +52,10 @@ sealed class DrawerItem( shortcut = Shortcut( R.string.calculator_title, R.string.calculator_title, - R.drawable.ic_shortcut_calculator + R.drawable.ic_shortcut_calculator, ), selectedIcon = Icons.Filled.Calculate, - defaultIcon = Icons.Outlined.Calculate + defaultIcon = Icons.Outlined.Calculate, ) data object Converter : DrawerItem( @@ -65,10 +65,10 @@ sealed class DrawerItem( shortcut = Shortcut( R.string.unit_converter_title, R.string.unit_converter_title, - R.drawable.ic_shortcut_unit_converter + R.drawable.ic_shortcut_unit_converter, ), selectedIcon = Icons.Filled.SwapHoriz, - defaultIcon = Icons.Outlined.SwapHoriz + defaultIcon = Icons.Outlined.SwapHoriz, ) data object DateCalculator : DrawerItem( @@ -78,10 +78,10 @@ sealed class DrawerItem( shortcut = Shortcut( R.string.date_calculator_title, R.string.date_calculator_title, - R.drawable.ic_shortcut_date_calculator + R.drawable.ic_shortcut_date_calculator, ), selectedIcon = Icons.Filled.Event, - defaultIcon = Icons.Outlined.Event + defaultIcon = Icons.Outlined.Event, ) data object TimeZones : DrawerItem( @@ -91,10 +91,10 @@ sealed class DrawerItem( shortcut = Shortcut( R.string.time_zone_title, R.string.time_zone_title, - R.drawable.ic_shortcut_time_zone + R.drawable.ic_shortcut_time_zone, ), selectedIcon = Icons.Filled.Schedule, - defaultIcon = Icons.Outlined.Schedule + defaultIcon = Icons.Outlined.Schedule, ) data object BodyMass : DrawerItem( @@ -104,10 +104,10 @@ sealed class DrawerItem( shortcut = Shortcut( R.string.body_mass_title, R.string.body_mass_title, - R.drawable.ic_shortcut_body_mass + R.drawable.ic_shortcut_body_mass, ), selectedIcon = Icons.Filled.AccessibilityNew, - defaultIcon = Icons.Outlined.AccessibilityNew + defaultIcon = Icons.Outlined.AccessibilityNew, ) data object Settings : DrawerItem( @@ -116,7 +116,7 @@ sealed class DrawerItem( name = R.string.settings_title, shortcut = null, selectedIcon = Icons.Filled.Settings, - defaultIcon = Icons.Outlined.Settings + defaultIcon = Icons.Outlined.Settings, ) companion object { diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Color.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Color.kt index c9a61016..40c23333 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Color.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Color.kt @@ -46,7 +46,6 @@ val md_theme_light_outline = Color(0xFF727970) val md_theme_light_inverseOnSurface = Color(0xFFf0f1eb) val md_theme_light_inverseSurface = Color(0xFF2f312e) - val md_theme_dark_primary = Color(0xFF87d991) val md_theme_dark_onPrimary = Color(0xFF003911) val md_theme_dark_primaryContainer = Color(0xFF00531d) diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt index 5b881321..bc7a9759 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt @@ -83,7 +83,7 @@ val TypographySystem by lazy { Typography() } private val FontFamily.Companion.lato: FontFamily get() = FontFamily( - Font(R.font.lato_regular, weight = FontWeight.Normal) + Font(R.font.lato_regular, weight = FontWeight.Normal), ) @Preview(widthDp = 480) @@ -113,7 +113,7 @@ private fun PreviewSystemTypography() { Text( text = "$label 123", style = style, - color = MaterialTheme.colorScheme.onBackground + color = MaterialTheme.colorScheme.onBackground, ) } } @@ -124,7 +124,7 @@ private fun PreviewSystemTypography() { @Composable private fun PreviewNumberTypography() { CompositionLocalProvider( - LocalNumberTypography provides NumberTypographyUnitto + LocalNumberTypography provides NumberTypographyUnitto, ) { val textStyles = mapOf( "displayLarge" to LocalNumberTypography.current.displayLarge, @@ -138,7 +138,7 @@ private fun PreviewNumberTypography() { Text( text = "$label 123 Error 7 1⁄2", style = style, - color = MaterialTheme.colorScheme.onBackground + color = MaterialTheme.colorScheme.onBackground, ) } } diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt index 0fc30be9..99d3882a 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/CleanAndFilterExpression.kt @@ -25,9 +25,9 @@ import org.junit.Assert.assertEquals import org.junit.Test class CleanAndFilterExpression { - + private val formatterSymbols = FormatterSymbols(Token.COMMA, Token.PERIOD) - + @Test fun noAdditionalSymbols() { assertEquals("123", "123".clearAndFilterExpression(formatterSymbols)) diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt index 038e33fa..be5dfa19 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/FormatterExpressionTest.kt @@ -89,4 +89,4 @@ class FormatterExpressionTest { assertEquals("((((((((", SOME_BRACKETS.format()) assertEquals("1.600 1234⁄56789", FRACTION_VALUE.format()) } -} \ No newline at end of file +} diff --git a/core/ui/src/test/java/com/sadellie/unitto/core/ui/TextFieldValueExtensionsTest.kt b/core/ui/src/test/java/com/sadellie/unitto/core/ui/TextFieldValueExtensionsTest.kt index 993195aa..7544b057 100644 --- a/core/ui/src/test/java/com/sadellie/unitto/core/ui/TextFieldValueExtensionsTest.kt +++ b/core/ui/src/test/java/com/sadellie/unitto/core/ui/TextFieldValueExtensionsTest.kt @@ -332,7 +332,7 @@ class TextFieldValueExtensionsTest { .replace("-", Token.Operator.minus) .replace("/", Token.Operator.divide) .replace("*", Token.Operator.multiply), - selection = TextRange(selectionStart, selectionEnd) + selection = TextRange(selectionStart, selectionEnd), ) } } diff --git a/data/backup/src/androidTest/java/com/sadellie/unitto/data/backup/BackupManagerTest.kt b/data/backup/src/androidTest/java/com/sadellie/unitto/data/backup/BackupManagerTest.kt index 6c83f574..97e64996 100644 --- a/data/backup/src/androidTest/java/com/sadellie/unitto/data/backup/BackupManagerTest.kt +++ b/data/backup/src/androidTest/java/com/sadellie/unitto/data/backup/BackupManagerTest.kt @@ -19,7 +19,6 @@ package com.sadellie.unitto.data.backup import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.Assert.* import org.junit.runner.RunWith /** diff --git a/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt index 7feb497a..ec24df7d 100644 --- a/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt +++ b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorHistoryRepositoryImpl.kt @@ -30,7 +30,7 @@ import java.util.Date import javax.inject.Inject class CalculatorHistoryRepositoryImpl @Inject constructor( - private val calculatorHistoryDao: CalculatorHistoryDao + private val calculatorHistoryDao: CalculatorHistoryDao, ) : CalculatorHistoryRepository { /** * Calculator history sorted by [CalculatorHistoryEntity.timestamp] from new to old (DESC). @@ -42,14 +42,14 @@ class CalculatorHistoryRepositoryImpl @Inject constructor( override suspend fun add( expression: String, - result: String + result: String, ) { calculatorHistoryDao.insert( CalculatorHistoryEntity( timestamp = System.currentTimeMillis(), expression = expression, - result = result - ) + result = result, + ), ) } @@ -67,7 +67,7 @@ class CalculatorHistoryRepositoryImpl @Inject constructor( id = it.entityId, date = Date(it.timestamp), expression = it.expression, - result = it.result + result = it.result, ) } } diff --git a/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt index 3b5c0acb..07057c81 100644 --- a/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt @@ -26,7 +26,7 @@ import kotlin.math.log10 fun BigDecimal.format( scale: Int, - outputFormat: Int + outputFormat: Int, ): String { return this .setMinimumRequiredScale(scale) @@ -85,9 +85,9 @@ internal fun BigDecimal.setMinimumRequiredScale(prefScale: Int): BigDecimal { -floor(log10(this.abs().remainder(BigDecimal.ONE).toDouble())).toInt() } else { 0 - } + }, ), - RoundingMode.HALF_EVEN + RoundingMode.HALF_EVEN, ) } diff --git a/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt index 087040dc..f0702c5d 100644 --- a/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/FlowUtils.kt @@ -103,7 +103,7 @@ fun combine( flow5, flow6, flow7, - flow8 + flow8, ) { args: Array<*> -> transform( args[0] as T1, @@ -129,44 +129,6 @@ fun combine( flow8: Flow, flow9: Flow, transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, -): Flow = - kotlinx.coroutines.flow.combine( - flow, - flow2, - flow3, - flow4, - flow5, - flow6, - flow7, - flow8, - flow9 - ) { args: Array<*> -> - transform( - args[0] as T1, - args[1] as T2, - args[2] as T3, - args[3] as T4, - args[4] as T5, - args[5] as T6, - args[6] as T7, - args[7] as T8, - args[8] as T9, - ) - } - -@Suppress("UNCHECKED_CAST", "UNUSED") -fun combine( - flow: Flow, - flow2: Flow, - flow3: Flow, - flow4: Flow, - flow5: Flow, - flow6: Flow, - flow7: Flow, - flow8: Flow, - flow9: Flow, - flow10: Flow, - transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, ): Flow = kotlinx.coroutines.flow.combine( flow, @@ -178,7 +140,6 @@ fun combine( flow7, flow8, flow9, - flow10 ) { args: Array<*> -> transform( args[0] as T1, @@ -190,7 +151,6 @@ fun combine( args[6] as T7, args[7] as T8, args[8] as T9, - args[9] as T10, ) } diff --git a/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt index 02f772f6..1b35a5d5 100644 --- a/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt @@ -50,7 +50,7 @@ fun String.lev(secondString: String): Int { // Insert cost[j] + 1, // Delete - newCost[j - 1] + 1 + newCost[j - 1] + 1, ) } @@ -62,7 +62,6 @@ fun String.lev(secondString: String): Int { } fun String.isExpression(): Boolean { - if (isEmpty()) return false // Positive numbers and zero diff --git a/data/common/src/test/java/com/sadellie/unitto/data/common/IsExpressionText.kt b/data/common/src/test/java/com/sadellie/unitto/data/common/IsExpressionText.kt index c62fc57b..a088d8c2 100644 --- a/data/common/src/test/java/com/sadellie/unitto/data/common/IsExpressionText.kt +++ b/data/common/src/test/java/com/sadellie/unitto/data/common/IsExpressionText.kt @@ -21,7 +21,6 @@ package com.sadellie.unitto.data.common import org.junit.Assert.assertEquals import org.junit.Test - class IsExpressionText { @Test fun `empty string`() = assertEquals(false, "".isExpression()) diff --git a/data/common/src/test/java/com/sadellie/unitto/data/common/LevenshteinTest.kt b/data/common/src/test/java/com/sadellie/unitto/data/common/LevenshteinTest.kt index cafb73ee..49f89fa5 100644 --- a/data/common/src/test/java/com/sadellie/unitto/data/common/LevenshteinTest.kt +++ b/data/common/src/test/java/com/sadellie/unitto/data/common/LevenshteinTest.kt @@ -62,4 +62,4 @@ class LevenshteinTest { fun levDifferentCases() { assertEquals(0, "red truck".lev("red TRUCK")) } -} \ No newline at end of file +} diff --git a/data/common/src/test/java/com/sadellie/unitto/data/common/MinimumRequiredScaleTest.kt b/data/common/src/test/java/com/sadellie/unitto/data/common/MinimumRequiredScaleTest.kt index 261c238b..c5d1a39a 100644 --- a/data/common/src/test/java/com/sadellie/unitto/data/common/MinimumRequiredScaleTest.kt +++ b/data/common/src/test/java/com/sadellie/unitto/data/common/MinimumRequiredScaleTest.kt @@ -44,4 +44,4 @@ class MinimumRequiredScaleTest { val bd = BigDecimal("0.000000123456").setMinimumRequiredScale(9) assertEquals("0.000000123", bd.toPlainString()) } -} \ No newline at end of file +} diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/DataStoreModule.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/DataStoreModule.kt index 177bb65b..2bd8d9cc 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/DataStoreModule.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/DataStoreModule.kt @@ -35,12 +35,12 @@ class DataStoreModule { fun provideUnitsRepository( unitsDao: UnitsDao, currencyRatesDao: CurrencyRatesDao, - @ApplicationContext appContext: Context + @ApplicationContext appContext: Context, ): UnitsRepository { return UnitsRepositoryImpl( unitsDao = unitsDao, currencyRatesDao = currencyRatesDao, - mContext = appContext + mContext = appContext, ) } } diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitID.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitID.kt index 2ba10d20..f78aa40d 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitID.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitID.kt @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +@file:Suppress("ktlint:standard:property-naming") + package com.sadellie.unitto.data.converter /** diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitsRepositoryImpl.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitsRepositoryImpl.kt index 39947fca..9b2a6930 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitsRepositoryImpl.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/UnitsRepositoryImpl.kt @@ -73,36 +73,36 @@ class UnitsRepositoryImpl @Inject constructor( private val currencyRatesDao: CurrencyRatesDao, @ApplicationContext private val mContext: Context, ) : UnitsRepository { - private val _inMemoryUnits = MutableStateFlow( + private val inMemoryUnits = MutableStateFlow( lengthCollection + - currencyCollection + - massCollection + - speedCollection + - temperatureCollection + - areaCollection + - timeCollection + - volumeCollection + - dataCollection + - pressureCollection + - accelerationCollection + - energyCollection + - powerCollection + - angleCollection + - dataTransferCollection + - fluxCollection + - numberBaseCollection + - electrostaticCapacitance + - prefixCollection + - forceCollection + - torqueCollection + - flowRateCollection + - luminanceCollection + - fuelConsumptionCollection + currencyCollection + + massCollection + + speedCollection + + temperatureCollection + + areaCollection + + timeCollection + + volumeCollection + + dataCollection + + pressureCollection + + accelerationCollection + + energyCollection + + powerCollection + + angleCollection + + dataTransferCollection + + fluxCollection + + numberBaseCollection + + electrostaticCapacitance + + prefixCollection + + forceCollection + + torqueCollection + + flowRateCollection + + luminanceCollection + + fuelConsumptionCollection, ) override val units: Flow> = combine( unitsDao.getAllFlow(), - _inMemoryUnits + inMemoryUnits, ) { basedList, inMemoryList -> return@combine inMemoryList.map { inMemoryUnit -> val inBaseUnit = basedList.find { it.unitId == inMemoryUnit.id } @@ -110,7 +110,7 @@ class UnitsRepositoryImpl @Inject constructor( inMemoryUnit.clone( isFavorite = inBaseUnit.isFavorite, counter = inBaseUnit.frequency, - pairId = inBaseUnit.pairedUnitId + pairId = inBaseUnit.pairedUnitId, ) } } @@ -131,8 +131,8 @@ class UnitsRepositoryImpl @Inject constructor( unitsDao.insertUnit( UnitsEntity( unitId = unit.id, - isFavorite = true - ) + isFavorite = true, + ), ) } else { unitsDao.insertUnit( @@ -140,8 +140,8 @@ class UnitsRepositoryImpl @Inject constructor( unitId = basedUnit.unitId, isFavorite = !basedUnit.isFavorite, pairedUnitId = basedUnit.pairedUnitId, - frequency = basedUnit.frequency - ) + frequency = basedUnit.frequency, + ), ) } } @@ -153,8 +153,8 @@ class UnitsRepositoryImpl @Inject constructor( unitsDao.insertUnit( UnitsEntity( unitId = unit.id, - frequency = 1 - ) + frequency = 1, + ), ) } else { unitsDao.insertUnit( @@ -162,8 +162,8 @@ class UnitsRepositoryImpl @Inject constructor( unitId = basedUnit.unitId, isFavorite = basedUnit.isFavorite, pairedUnitId = basedUnit.pairedUnitId, - frequency = basedUnit.frequency + 1 - ) + frequency = basedUnit.frequency + 1, + ), ) } } @@ -175,8 +175,8 @@ class UnitsRepositoryImpl @Inject constructor( unitsDao.insertUnit( UnitsEntity( unitId = unit.id, - pairedUnitId = pair.id - ) + pairedUnitId = pair.id, + ), ) } else { unitsDao.insertUnit( @@ -184,8 +184,8 @@ class UnitsRepositoryImpl @Inject constructor( unitId = basedUnit.unitId, isFavorite = basedUnit.isFavorite, pairedUnitId = pair.id, - frequency = basedUnit.frequency - ) + frequency = basedUnit.frequency, + ), ) } } @@ -203,7 +203,7 @@ class UnitsRepositoryImpl @Inject constructor( baseUnitId = unit.id, date = epochDay, pairUnitId = pairId, - pairUnitValue = BigDecimal.valueOf(pairValue) + pairUnitValue = BigDecimal.valueOf(pairValue), ) } currencyRatesDao.insertRates(rates) @@ -213,7 +213,7 @@ class UnitsRepositoryImpl @Inject constructor( Log.d("UnitsRepository", "Skipped update: $e") } } - _inMemoryUnits.update { units -> + inMemoryUnits.update { units -> units.map { localUnit -> if (localUnit.group != UnitGroup.CURRENCY) return@map localUnit if (localUnit !is ReverseUnit) return@map localUnit diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyApiService.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyApiService.kt index 79aaf93e..a1064042 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyApiService.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyApiService.kt @@ -44,8 +44,8 @@ interface CurrencyApiService { */ @GET("{baseCurrency}.json") suspend fun getCurrencyPairs( - @Path("baseCurrency") baseCurrency: String - ) : CurrencyUnitResponse + @Path("baseCurrency") baseCurrency: String, + ): CurrencyUnitResponse } object CurrencyApi { diff --git a/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyUnitResponse.kt b/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyUnitResponse.kt index dacfbf3a..48228a93 100644 --- a/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyUnitResponse.kt +++ b/data/converter/src/main/java/com/sadellie/unitto/data/converter/remote/CurrencyUnitResponse.kt @@ -29,7 +29,7 @@ import com.squareup.moshi.ToJson */ data class CurrencyUnitResponse( val date: String, - val currency: Map + val currency: Map, ) /** @@ -37,13 +37,15 @@ data class CurrencyUnitResponse( */ internal class CurrencyAdapter { @Suppress("UNUSED", "UNUSED_PARAMETER", "SameReturnValue") - @ToJson fun toJson(card: CurrencyUnitResponse): String? = null + @ToJson + fun toJson(card: CurrencyUnitResponse): String? = null @Suppress("UNUSED", "UNCHECKED_CAST") - @FromJson fun fromJson(response: Map): CurrencyUnitResponse { + @FromJson + fun fromJson(response: Map): CurrencyUnitResponse { return CurrencyUnitResponse( date = response["date"] as String, - currency = (response[response.keys.elementAt(1)]) as Map + currency = (response[response.keys.elementAt(1)]) as Map, ) } } diff --git a/data/converter/src/test/java/com/sadellie/unitto/data/converter/AllUnitsTest.kt b/data/converter/src/test/java/com/sadellie/unitto/data/converter/AllUnitsTest.kt index 572d99f0..1f571d0c 100644 --- a/data/converter/src/test/java/com/sadellie/unitto/data/converter/AllUnitsTest.kt +++ b/data/converter/src/test/java/com/sadellie/unitto/data/converter/AllUnitsTest.kt @@ -58,29 +58,29 @@ class AllUnitsTest { private var history: MutableMap> = mutableMapOf() private val allUnits = lengthCollection + - currencyCollection + - massCollection + - speedCollection + - temperatureCollection + - areaCollection + - timeCollection + - volumeCollection + - dataCollection + - pressureCollection + - accelerationCollection + - energyCollection + - powerCollection + - angleCollection + - dataTransferCollection + - fluxCollection + - numberBaseCollection + - electrostaticCapacitance + - prefixCollection + - forceCollection + - torqueCollection + - flowRateCollection + - luminanceCollection + - fuelConsumptionCollection + currencyCollection + + massCollection + + speedCollection + + temperatureCollection + + areaCollection + + timeCollection + + volumeCollection + + dataCollection + + pressureCollection + + accelerationCollection + + energyCollection + + powerCollection + + angleCollection + + dataTransferCollection + + fluxCollection + + numberBaseCollection + + electrostaticCapacitance + + prefixCollection + + forceCollection + + torqueCollection + + flowRateCollection + + luminanceCollection + + fuelConsumptionCollection @Test fun testAcceleration() = testWithUnits { diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt index f27503f3..f7b547c9 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt @@ -27,5 +27,5 @@ class CalculatorHistoryEntity( @PrimaryKey(autoGenerate = true) val entityId: Int = 0, @ColumnInfo(name = "timestamp") val timestamp: Long, @ColumnInfo(name = "expression") val expression: String, - @ColumnInfo(name = "result") val result: String + @ColumnInfo(name = "result") val result: String, ) diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt index e1594db0..65a03157 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CurrencyRatesEntity.kt @@ -29,5 +29,5 @@ class CurrencyRatesEntity( @ColumnInfo(name = "base_unit_id") val baseUnitId: String, @ColumnInfo(name = "timestamp") val date: Long, @ColumnInfo(name = "pair_unit_id") val pairUnitId: String, - @ColumnInfo(name = "pair_unit_value") val pairUnitValue: BigDecimal? + @ColumnInfo(name = "pair_unit_value") val pairUnitValue: BigDecimal?, ) diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/TimeZoneDao.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/TimeZoneDao.kt index 2153ba7c..4e2bf7a0 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/TimeZoneDao.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/TimeZoneDao.kt @@ -43,7 +43,7 @@ interface TimeZoneDao { TimeZoneEntity( id = id, position = getMaxPosition() + 1, - ) + ), ) } diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt index 42ccc300..cde0d686 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt @@ -34,11 +34,11 @@ import com.sadellie.unitto.data.database.converters.Converters CurrencyRatesEntity::class, ], autoMigrations = [ - AutoMigration (from = 1, to = 2), - AutoMigration (from = 2, to = 3), - AutoMigration (from = 3, to = 4), - AutoMigration (from = 4, to = 5), - ] + AutoMigration(from = 1, to = 2), + AutoMigration(from = 2, to = 3), + AutoMigration(from = 3, to = 4), + AutoMigration(from = 4, to = 5), + ], ) @TypeConverters(Converters::class) abstract class UnittoDatabase : RoomDatabase() { diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt index 420fecc8..ea0f9b9d 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt @@ -79,7 +79,7 @@ class UnittoDatabaseModule { return Room.databaseBuilder( appContext.applicationContext, UnittoDatabase::class.java, - DATABASE_NAME + DATABASE_NAME, ).build() } -} \ No newline at end of file +} diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt index 8fcacf2a..f419c05e 100644 --- a/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/converters/Converters.kt @@ -36,5 +36,4 @@ class Converters { } catch (e: Exception) { null } - } diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt index 6da0b407..ad35f5cb 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/BigDecimalMath.kt @@ -78,12 +78,13 @@ internal fun BigDecimal.pow(n: BigDecimal): BigDecimal { val n2IntPart = right.subtract(remainderOfRight) val intPow = pow(n2IntPart.intValueExact(), mathContext) val doublePow = BigDecimal( - toDouble().pow(remainderOfRight.toDouble()) + toDouble().pow(remainderOfRight.toDouble()), ) var result = intPow.multiply(doublePow, mathContext) - if (signOfRight == -1) result = - BigDecimal.ONE.divide(result, mathContext.precision, RoundingMode.HALF_UP) + if (signOfRight == -1) { + result = BigDecimal.ONE.divide(result, mathContext.precision, RoundingMode.HALF_UP) + } return result } diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt index 4b453c05..3935ad94 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Expression.kt @@ -23,7 +23,7 @@ import com.sadellie.unitto.core.base.Token import java.math.BigDecimal import java.math.RoundingMode -sealed class ExpressionException(override val message: String): Exception(message) { +sealed class ExpressionException(override val message: String) : Exception(message) { class DivideByZero : ExpressionException("Can't divide by zero") class FactorialCalculation : ExpressionException("Can calculate factorial of non-negative real numbers only") class BadExpression : ExpressionException("Invalid expression. Probably some operator lacks argument") @@ -33,7 +33,7 @@ sealed class ExpressionException(override val message: String): Exception(messag class Expression( input: String, private val radianMode: Boolean = true, - private val roundingMode: RoundingMode = RoundingMode.HALF_EVEN + private val roundingMode: RoundingMode = RoundingMode.HALF_EVEN, ) { private val tokens = input.tokenize() private var cursorPosition = 0 @@ -88,8 +88,9 @@ class Expression( while (peek() in listOf(Token.Operator.multiply, Token.Operator.divide)) { when { - moveIfMatched(Token.Operator.multiply) -> expression = - expression.multiply(parseFactor()) + moveIfMatched(Token.Operator.multiply) -> { + expression = expression.multiply(parseFactor()) + } moveIfMatched(Token.Operator.divide) -> { val divisor = parseFactor() diff --git a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt index 237f2355..fbcb4538 100644 --- a/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt +++ b/data/evaluatto/src/main/java/io/github/sadellie/evaluatto/Tokenizer.kt @@ -47,13 +47,13 @@ fun String.tokenize(): List { private fun peekTokenAfter( streamOfTokens: String, - cursor: Int + cursor: Int, ): String? { Token.expressionTokens.forEach { token -> val subs = streamOfTokens .substring( cursor, - (cursor + token.length).coerceAtMost(streamOfTokens.length) + (cursor + token.length).coerceAtMost(streamOfTokens.length), ) if (subs == token) { // Got a digit, see if there are other digits coming after @@ -125,8 +125,8 @@ private fun MutableList.missingMultiply(): MutableList { tokenAfter in Token.Func.all || tokenAfter in Token.Const.all || tokenAfter == Token.Operator.sqrt || - tokenAfter.isDigitToken()) { - + tokenAfter.isDigitToken() + ) { iterator.add(Token.Operator.multiply) } } @@ -194,7 +194,7 @@ private fun MutableList.unpackPercentAt(percentIndex: Int): MutableList< // Remove percentage mutList.removeAt(percentIndex) - //Add opening bracket before percentage + // Add opening bracket before percentage mutList.add(percentIndex - percentage.size, Token.Operator.leftBracket) // Add "/ 100" and closing bracket @@ -209,7 +209,7 @@ private fun MutableList.unpackPercentAt(percentIndex: Int): MutableList< // Remove percentage mutList.removeAt(percentIndex) - //Add opening bracket before percentage + // Add opening bracket before percentage mutList.add(percentIndex - percentage.size, Token.Operator.leftBracket) // Add "/ 100" and other stuff @@ -222,8 +222,8 @@ private fun MutableList.unpackPercentAt(percentIndex: Int): MutableList< Token.Operator.leftBracket, *base.toTypedArray(), Token.Operator.rightBracket, - Token.Operator.rightBracket - ) + Token.Operator.rightBracket, + ), ) return mutList diff --git a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/FixLexiconTest.kt b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/FixLexiconTest.kt index de4df510..365ac221 100644 --- a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/FixLexiconTest.kt +++ b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/FixLexiconTest.kt @@ -25,59 +25,71 @@ class FixLexiconTest { @Test fun `missing multiply`() { assertLex( - "2×(69−420)", "2(69−420)" + "2×(69−420)", + "2(69−420)", ) assertLex( - "0.×(69−420)", "0.(69−420)" + "0.×(69−420)", + "0.(69−420)", ) assertLex( - ".0×(69−420)", ".0(69−420)" + ".0×(69−420)", + ".0(69−420)", ) assertLex( - ".×(69−420)", ".(69−420)" + ".×(69−420)", + ".(69−420)", ) assertLex( "2×(69−420)×(23−4)×cos(9)×tan((sin⁻¹(.9)))", - "2(69−420)(23−4)cos(9)tan((sin⁻¹(.9)))" + "2(69−420)(23−4)cos(9)tan((sin⁻¹(.9)))", ) assertLex( - "e×e+π", "ee+π" + "e×e+π", + "ee+π", ) assertLex( - "(69)×420", "(69)420" + "(69)×420", + "(69)420", ) } @Test fun `balanced brackets`() { assertLex( - "123×(12+4)", "123(12+4" + "123×(12+4)", + "123(12+4", ) assertLex( - "12312+4", "12312+4" + "12312+4", + "12312+4", ) assertLex( - "123)))×12+4", "123)))12+4" + "123)))×12+4", + "123)))12+4", ) assertLex( - "sin(cos(tan(3)))", "sin(cos(tan(3" + "sin(cos(tan(3)))", + "sin(cos(tan(3", ) assertLex( - "sin(cos(tan(3)))", "sin(cos(tan(3)" + "sin(cos(tan(3)))", + "sin(cos(tan(3)", ) assertLex( - "sin(cos(tan(3)))", "sin(cos(tan(3))" + "sin(cos(tan(3)))", + "sin(cos(tan(3))", ) } @@ -85,43 +97,52 @@ class FixLexiconTest { fun `unpack percentage`() { // 132.5+14% −> 132.5+132.5*0.14 assertLex( - "132.5+(14÷100×(132.5))", "132.5+14%" + "132.5+(14÷100×(132.5))", + "132.5+14%", ) // 132.5+(14)% −> 132.5+(14)/100*132.5 assertLex( - "132.5+((14)÷100×(132.5))" , "132.5+(14)%" + "132.5+((14)÷100×(132.5))", + "132.5+(14)%", ) // 132.5+(15+4)% −> 132.5+(15+4)*132.5/100 assertLex( - "132.5+((15+4)÷100×(132.5))", "132.5+(15+4)%" + "132.5+((15+4)÷100×(132.5))", + "132.5+(15+4)%", ) // (132.5+12%)+(15+4)% −> (132.5+12/100*132.5)+(15+4)/100*(132.5+12/100*132.5) assertLex( - "(132.5+(12÷100×(132.5)))+((15+4)÷100×((132.5+(12÷100×(132.5)))))", "(132.5+12%)+(15+4)%" + "(132.5+(12÷100×(132.5)))+((15+4)÷100×((132.5+(12÷100×(132.5)))))", + "(132.5+12%)+(15+4)%", ) // 2% −> 2/100 assertLex( - "(2÷100)", "2%" + "(2÷100)", + "2%", ) assertLex( - "((2)÷100)", "(2)%" + "((2)÷100)", + "(2)%", ) assertLex( - "(132.5+5)+(90÷100×((132.5+5)))", "(132.5+5)+90%" + "(132.5+5)+(90÷100×((132.5+5)))", + "(132.5+5)+90%", ) assertLex( - "((90÷100)+(90÷100×((90÷100))))", "(90%+90%)" + "((90÷100)+(90÷100×((90÷100))))", + "(90%+90%)", ) assertLex( - "((90÷100)÷(90÷100))+((90÷100)−(90÷100×((90÷100))))", "(90%÷90%)+(90%−90%)" + "((90÷100)÷(90÷100))+((90÷100)−(90÷100×((90÷100))))", + "(90%÷90%)+(90%−90%)", ) assertLex("(80÷100)×(80÷100)", "80%80%") diff --git a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt index 2b1c9e31..aeb244df 100644 --- a/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt +++ b/data/evaluatto/src/test/java/io/github/sadellie/evaluatto/Helpers.kt @@ -26,13 +26,13 @@ import java.math.RoundingMode fun assertExpr(expr: String, result: String, radianMode: Boolean = true) = assertEquals( BigDecimal(result).setScale(10, RoundingMode.HALF_EVEN), - Expression(expr, radianMode).calculate().setScale(10, RoundingMode.HALF_EVEN) + Expression(expr, radianMode).calculate().setScale(10, RoundingMode.HALF_EVEN), ) fun assertExprFail( expectedThrowable: Class?, expr: String, - radianMode: Boolean = true + radianMode: Boolean = true, ) { assertThrows(expectedThrowable) { Expression(expr, radianMode = radianMode).calculate() diff --git a/data/licenses/src/main/java/com/sadellie/unitto/data/licenses/ThirdParty.kt b/data/licenses/src/main/java/com/sadellie/unitto/data/licenses/ThirdParty.kt index 4832d4f6..982501f3 100644 --- a/data/licenses/src/main/java/com/sadellie/unitto/data/licenses/ThirdParty.kt +++ b/data/licenses/src/main/java/com/sadellie/unitto/data/licenses/ThirdParty.kt @@ -23,7 +23,7 @@ data class ThirdParty( val dev: String?, val website: String?, val license: String?, - val description: String? + val description: String?, ) val ALL_THIRD_PARTY by lazy { @@ -33,91 +33,91 @@ val ALL_THIRD_PARTY by lazy { dev = "Fawaz Ahmed (fawazahmed0)", website = "https://github.com/fawazahmed0/currency-api", license = "The Unlicense", - description = "Free Currency Rates API" + description = "Free Currency Rates API", ), ThirdParty( name = "Lato", dev = "Łukasz Dziedzic", website = "https://fonts.google.com/specimen/Lato/about", license = "Open Font License", - description = "Lato is a sans serif typeface family started in the summer of 2010 by Warsaw-based designer Łukasz Dziedzic (“Lato” means “Summer” in Polish). In December 2010 the Lato family was published under the Open Font License by his foundry tyPoland, with support from Google." + description = "Lato is a sans serif typeface family started in the summer of 2010 by Warsaw-based designer Łukasz Dziedzic (“Lato” means “Summer” in Polish). In December 2010 the Lato family was published under the Open Font License by his foundry tyPoland, with support from Google.", ), ThirdParty( name = "Core Kotlin Extensions", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/core", license = "Apache-2.0", - description = "Kotlin extensions for 'core' artifact" + description = "Kotlin extensions for 'core' artifact", ), ThirdParty( name = "Material Components for Android", dev = "The Android Open Source Project", website = "https://github.com/material-components/material-components-android", license = "Apache-2.0", - description = "Material Components for Android is a static library that you can add to your Android application in order to use APIs that provide implementations of the Material Design specification. Compatible on devices running API 14 or later." + description = "Material Components for Android is a static library that you can add to your Android application in order to use APIs that provide implementations of the Material Design specification. Compatible on devices running API 14 or later.", ), ThirdParty( name = "Compose UI primitives", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/compose-ui", license = "Apache-2.0", - description = "Compose UI primitives. This library contains the primitives that form the Compose UI Toolkit, such as drawing, measurement and layout." + description = "Compose UI primitives. This library contains the primitives that form the Compose UI Toolkit, such as drawing, measurement and layout.", ), ThirdParty( name = "Compose Navigation", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/navigation", license = "Apache-2.0", - description = "Compose integration with Navigation" + description = "Compose integration with Navigation", ), ThirdParty( name = "Compose Material3 Components", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/compose-material3", license = "Apache-2.0", - description = "Compose Material You Design Components library" + description = "Compose Material You Design Components library", ), ThirdParty( name = "Navigation Compose Hilt Integration", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/hilt", license = "Apache-2.0", - description = "Navigation Compose Hilt Integration" + description = "Navigation Compose Hilt Integration", ), ThirdParty( name = "Hilt Android", dev = "The Android Open Source Project", website = "https://github.com/google/dagger", license = "Apache-2.0", - description = "A fast dependency injector for Android and Java." + description = "A fast dependency injector for Android and Java.", ), ThirdParty( name = "Compose Material Icons Extended", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/compose-material", license = "Apache-2.0", - description = "Compose Material Design extended icons. This module contains all Material icons. It is a very large dependency and should not be included directly." + description = "Compose Material Design extended icons. This module contains all Material icons. It is a very large dependency and should not be included directly.", ), ThirdParty( name = "Android Preferences DataStore", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/datastore", license = "Apache-2.0", - description = "Android Preferences DataStore" + description = "Android Preferences DataStore", ), ThirdParty( name = "Accompanist System UI Controller library", dev = "Google", website = "https://github.com/google/accompanist/", license = "Apache-2.0", - description = "Utilities for Jetpack Compose" + description = "Utilities for Jetpack Compose", ), ThirdParty( name = "Compose Tooling API", dev = "The Android Open Source Project", website = "https://developer.android.com/jetpack/androidx/releases/compose-ui", license = "Apache-2.0", - description = "Compose tooling library API. This library provides the API required to declare @Preview composables in user apps." - ) + description = "Compose tooling library API. This library provides the API required to declare @Preview composables in user apps.", + ), ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt index 6bbc18a6..dbc3272c 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt @@ -24,5 +24,5 @@ data class HistoryItem( val id: Int, val date: Date, val expression: String, - val result: String + val result: String, ) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt index d49f79d1..e279bc29 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt @@ -22,7 +22,7 @@ import androidx.annotation.StringRes import com.sadellie.unitto.core.base.R enum class UnitGroup( - @StringRes val res: Int + @StringRes val res: Int, ) { // NOTE: This order is used as default for new users LENGTH(res = R.string.unit_group_length), @@ -48,5 +48,5 @@ enum class UnitGroup( TORQUE(res = R.string.unit_group_torque), FLOW_RATE(res = R.string.unit_group_flow_rate), LUMINANCE(res = R.string.unit_group_luminance), - FUEL_CONSUMPTION(res = R.string.unit_group_fuel_consumption) + FUEL_CONSUMPTION(res = R.string.unit_group_fuel_consumption), } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/timezone/FavoriteZone.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/timezone/FavoriteZone.kt index 00d4d734..6425e390 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/timezone/FavoriteZone.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/timezone/FavoriteZone.kt @@ -26,5 +26,5 @@ import androidx.annotation.RequiresApi data class FavoriteZone( val timeZone: TimeZone, val position: Int, - val label: String + val label: String, ) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/BackwardUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/BackwardUnit.kt index 7630cb45..85e89e36 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/BackwardUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/BackwardUnit.kt @@ -39,17 +39,19 @@ data class BackwardUnit( if (unitTo.basicUnit.isEqualTo(BigDecimal.ZERO)) return BigDecimal.ZERO return when (unitTo) { - is NormalUnit -> this - .basicUnit - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .div(unitTo.basicUnit) - .div(value) + is NormalUnit -> + this + .basicUnit + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .div(unitTo.basicUnit) + .div(value) - is BackwardUnit -> unitTo - .basicUnit - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .multiply(value) - .div(this.basicUnit) + is BackwardUnit -> + unitTo + .basicUnit + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .multiply(value) + .div(this.basicUnit) else -> BigDecimal.ZERO } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt index a915cab6..a37ed501 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt @@ -39,17 +39,19 @@ data class NormalUnit( if (unitTo.basicUnit.isEqualTo(BigDecimal.ZERO)) return BigDecimal.ZERO return when (unitTo) { - is NormalUnit -> this - .basicUnit - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .multiply(value) - .div(unitTo.basicUnit) + is NormalUnit -> + this + .basicUnit + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .multiply(value) + .div(unitTo.basicUnit) - is BackwardUnit -> unitTo - .basicUnit - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .div(this.basicUnit) - .div(value) + is BackwardUnit -> + unitTo + .basicUnit + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .div(this.basicUnit) + .div(value) else -> BigDecimal.ZERO } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt index d4f56cfc..c9511f45 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt @@ -34,7 +34,6 @@ data class ReverseUnit( override val counter: Int = 0, ) : DefaultUnit { override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal { - return unitTo .basicUnit .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt index e52af2a6..f00d9e4f 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt @@ -30,8 +30,8 @@ data class TemperatureUnit( override val isFavorite: Boolean = false, override val pairId: String? = null, override val counter: Int = 0, - val customConvert: (unitTo: DefaultUnit, value: BigDecimal) -> BigDecimal -): DefaultUnit { + val customConvert: (unitTo: DefaultUnit, value: BigDecimal) -> BigDecimal, +) : DefaultUnit { override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal = customConvert(unitTo, value) override fun clone( diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AboutPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AboutPreferences.kt index 75741993..e389f7e4 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AboutPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AboutPreferences.kt @@ -18,6 +18,6 @@ package com.sadellie.unitto.data.model.userprefs -interface AboutPreferences{ +interface AboutPreferences { val enableToolsExperiment: Boolean } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt index 25684b2a..a887e02a 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/AddSubtractPreferences.kt @@ -20,6 +20,6 @@ package com.sadellie.unitto.data.model.userprefs import com.sadellie.unitto.core.base.FormatterSymbols -interface AddSubtractPreferences{ +interface AddSubtractPreferences { val formatterSymbols: FormatterSymbols } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt index b841cdf3..df029dee 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/BodyMassPreferences.kt @@ -20,6 +20,6 @@ package com.sadellie.unitto.data.model.userprefs import com.sadellie.unitto.core.base.FormatterSymbols -interface BodyMassPreferences{ +interface BodyMassPreferences { val formatterSymbols: FormatterSymbols } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt index dcbbb3d8..5e9093b3 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/FormattingPreferences.kt @@ -20,7 +20,7 @@ package com.sadellie.unitto.data.model.userprefs import com.sadellie.unitto.core.base.FormatterSymbols -interface FormattingPreferences{ +interface FormattingPreferences { val digitsPrecision: Int val formatterSymbols: FormatterSymbols val outputFormat: Int diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/StartingScreenPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/StartingScreenPreferences.kt index cff6385a..7852b097 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/StartingScreenPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/StartingScreenPreferences.kt @@ -18,6 +18,6 @@ package com.sadellie.unitto.data.model.userprefs -interface StartingScreenPreferences{ +interface StartingScreenPreferences { val startingScreen: String } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/UnitGroupsPreferences.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/UnitGroupsPreferences.kt index 175d2b8a..ba0c3555 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/UnitGroupsPreferences.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/userprefs/UnitGroupsPreferences.kt @@ -20,6 +20,6 @@ package com.sadellie.unitto.data.model.userprefs import com.sadellie.unitto.data.model.UnitGroup -interface UnitGroupsPreferences{ +interface UnitGroupsPreferences { val shownUnitGroups: List } diff --git a/data/timezone/src/main/java/com/sadellie/unitto/data/timezone/TimeZonesRepository.kt b/data/timezone/src/main/java/com/sadellie/unitto/data/timezone/TimeZonesRepository.kt index 30082f36..947d4cbe 100644 --- a/data/timezone/src/main/java/com/sadellie/unitto/data/timezone/TimeZonesRepository.kt +++ b/data/timezone/src/main/java/com/sadellie/unitto/data/timezone/TimeZonesRepository.kt @@ -59,8 +59,8 @@ class TimeZonesRepository @Inject constructor( FavoriteZone( timeZone = tz, position = entity.position, - label = entity.label - ) + label = entity.label, + ), ) } @@ -146,8 +146,8 @@ class TimeZonesRepository @Inject constructor( timeZone = it, name = displayName, region = regionName, - rank = nameMatch - ) + rank = nameMatch, + ), ) return@forEach } @@ -159,8 +159,8 @@ class TimeZonesRepository @Inject constructor( timeZone = it, name = displayName, region = regionName, - rank = regionMatch - ) + rank = regionMatch, + ), ) return@forEach } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/DataStoreModule.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/DataStoreModule.kt index bfa93e0a..8082e3ac 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/DataStoreModule.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/DataStoreModule.kt @@ -53,7 +53,7 @@ class DataStoreModule { fun provideUserPreferencesDataStore(@ApplicationContext appContext: Context): DataStore { return PreferenceDataStoreFactory.create( corruptionHandler = ReplaceFileCorruptionHandler { emptyPreferences() }, - produceFile = { appContext.preferencesDataStoreFile(USER_PREFERENCES) } + produceFile = { appContext.preferencesDataStoreFile(USER_PREFERENCES) }, ) } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt index a92d7234..3620950b 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/PreferenceExt.kt @@ -84,7 +84,7 @@ internal fun Preferences.getFormatterSymbols(): FormatterSymbols { // Updating from older version or fresh install // TODO Remove in the future if ((grouping == null) or (fractional == null)) { - return when(this[PrefsKeys.SEPARATOR] ?: 0) { + return when (this[PrefsKeys.SEPARATOR] ?: 0) { 0 -> FormatterSymbols(Token.SPACE, Token.PERIOD) 1 -> FormatterSymbols(Token.PERIOD, Token.COMMA) else -> FormatterSymbols(Token.COMMA, Token.PERIOD) @@ -161,4 +161,4 @@ private inline fun T.letTryOrNull(block: (T) -> R): R? = try { this?.let(block) } catch (e: Exception) { null -} \ No newline at end of file +} diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt index 5277ddb2..faa5d123 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferencesRepositoryImpl.kt @@ -149,7 +149,7 @@ class UserPreferencesRepositoryImpl @Inject constructor( override val aboutPrefs: Flow = data .map { preferences -> AboutPreferencesImpl( - enableToolsExperiment = preferences.getEnableToolsExperiment() + enableToolsExperiment = preferences.getEnableToolsExperiment(), ) } 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 05af04ee..178d47eb 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 @@ -97,7 +97,7 @@ private fun BodyMassScreen( } val weightShortLabel = remember(uiState.isMetric) { mContext.resources.getString( - if (uiState.isMetric) R.string.unit_kilogram_short else R.string.unit_pound_short + if (uiState.isMetric) R.string.unit_kilogram_short else R.string.unit_pound_short, ) } @@ -112,22 +112,22 @@ private fun BodyMassScreen( .padding(16.dp) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { SegmentedButtonsRow( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { SegmentedButton( label = stringResource(R.string.body_mass_metric), onClick = { updateIsMetric(true) }, selected = uiState.isMetric, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), ) SegmentedButton( label = stringResource(R.string.body_mass_imperial), onClick = { updateIsMetric(false) }, selected = !uiState.isMetric, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), ) } @@ -136,14 +136,14 @@ private fun BodyMassScreen( .fillMaxWidth() .background( MaterialTheme.colorScheme.secondaryContainer, - RoundedCornerShape(32.dp) + RoundedCornerShape(32.dp), ) .padding(16.dp, 24.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { Crossfade( targetState = uiState.isMetric, - label = "Measurement system change" + label = "Measurement system change", ) { isMetric -> if (isMetric) { BodyMassTextField( @@ -155,7 +155,7 @@ private fun BodyMassScreen( ) } else { Row( - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { BodyMassTextField( modifier = Modifier.weight(1f), @@ -180,7 +180,7 @@ private fun BodyMassScreen( onValueChange = updateWeight, label = "${stringResource(R.string.body_mass_weight)}, $weightShortLabel", expressionFormatter = expressionTransformer, - imeAction = ImeAction.Done + imeAction = ImeAction.Done, ) } @@ -190,7 +190,7 @@ private fun BodyMassScreen( transitionSpec = { (fadeIn() togetherWith fadeOut()) using SizeTransform(false) }, - label = "Body mass value visibility" + label = "Body mass value visibility", ) { targetState -> if (targetState.isEqualTo(BigDecimal.ZERO)) return@AnimatedContent @@ -198,14 +198,14 @@ private fun BodyMassScreen( value = targetState, range = uiState.normalWeightRange, rangeSuffix = weightShortLabel, - formatterSymbols = uiState.formatterSymbols + formatterSymbols = uiState.formatterSymbols, ) } ElevatedButton( onClick = { openLink(mContext, "https://sadellie.github.io/unitto/help#body-mass-index") - } + }, ) { Text(text = stringResource(R.string.time_zone_no_results_button)) // TODO Rename } @@ -224,7 +224,7 @@ fun PreviewBodyMassScreen() { weight = TextFieldValue(), normalWeightRange = BigDecimal(30) to BigDecimal(50), result = BigDecimal(18.5), - formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD) + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), ), updateHeight1 = {}, updateHeight2 = {}, diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassUtils.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassUtils.kt index 22429dab..dfe9e99e 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassUtils.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassUtils.kt @@ -51,7 +51,7 @@ internal fun calculateMetric( internal fun calculateImperial( heightFt: BigDecimal, heightIn: BigDecimal, - weightLbs: BigDecimal + weightLbs: BigDecimal, ): BigDecimal { val heightInches = heightFt .multiply(footToInchFactor) @@ -69,7 +69,7 @@ internal fun calculateImperial( * @return [Pair] of [BigDecimal]. First value is lowest weight. Second value is highest value. */ internal fun calculateNormalWeightMetric( - heightCm: BigDecimal + heightCm: BigDecimal, ): Pair { val heightMetres2 = heightCm .divide(cmToMFactor, MAX_PRECISION, RoundingMode.HALF_EVEN) diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt index 811176f6..d478f0a5 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/BodyMassViewModel.kt @@ -38,23 +38,23 @@ import javax.inject.Inject @HiltViewModel internal class BodyMassViewModel @Inject constructor( - userPreferencesRepository: UserPreferencesRepository -): ViewModel() { - private val _isMetric = MutableStateFlow(getInitialIsMetric()) - private val _height1 = MutableStateFlow(TextFieldValue()) - private val _height2 = MutableStateFlow(TextFieldValue()) - private val _weight = MutableStateFlow(TextFieldValue()) - private val _result = MutableStateFlow(BigDecimal.ZERO) - private val _normalWeightRange = MutableStateFlow>(BigDecimal.ZERO to BigDecimal.ZERO) + userPreferencesRepository: UserPreferencesRepository, +) : ViewModel() { + private val isMetric = MutableStateFlow(getInitialIsMetric()) + private val height1 = MutableStateFlow(TextFieldValue()) + private val height2 = MutableStateFlow(TextFieldValue()) + private val weight = MutableStateFlow(TextFieldValue()) + private val result = MutableStateFlow(BigDecimal.ZERO) + private val normalWeightRange = MutableStateFlow>(BigDecimal.ZERO to BigDecimal.ZERO) val uiState = combine( userPreferencesRepository.bodyMassPrefs, - _isMetric, - _height1, - _height2, - _weight, - _result, - _normalWeightRange + isMetric, + height1, + height2, + weight, + result, + normalWeightRange, ) { userPrefs, isMetric, height1, height2, weight, result, normalWeightRange -> UIState.Ready( isMetric = isMetric, @@ -63,7 +63,7 @@ internal class BodyMassViewModel @Inject constructor( weight = weight, result = result, normalWeightRange = normalWeightRange, - formatterSymbols = userPrefs.formatterSymbols + formatterSymbols = userPrefs.formatterSymbols, ) } .mapLatest { ui -> @@ -73,17 +73,17 @@ internal class BodyMassViewModel @Inject constructor( val weight = BigDecimal(ui.weight.text.ifEmpty { "0" }) if (ui.isMetric) { - _result.update { calculateMetric(height1, weight) } - _normalWeightRange.update { calculateNormalWeightMetric(height1) } + result.update { calculateMetric(height1, weight) } + normalWeightRange.update { calculateNormalWeightMetric(height1) } } else { val height2 = BigDecimal(ui.height2.text.ifEmpty { "0" }) - _result.update { calculateImperial(height1, height2, weight) } - _normalWeightRange.update { calculateNormalWeightImperial(height1, height2) } + result.update { calculateImperial(height1, height2, weight) } + normalWeightRange.update { calculateNormalWeightImperial(height1, height2) } } } catch (e: Exception) { - _result.update { BigDecimal.ZERO } - _normalWeightRange.update { BigDecimal.ZERO to BigDecimal.ZERO } + result.update { BigDecimal.ZERO } + normalWeightRange.update { BigDecimal.ZERO to BigDecimal.ZERO } } } @@ -91,10 +91,10 @@ internal class BodyMassViewModel @Inject constructor( } .stateIn(viewModelScope, UIState.Loading) - fun updateHeight1(textFieldValue: TextFieldValue) = _height1.update { textFieldValue } - fun updateHeight2(textFieldValue: TextFieldValue) = _height2.update { textFieldValue } - fun updateWeight(textFieldValue: TextFieldValue) = _weight.update { textFieldValue } - fun updateIsMetric(isMetric: Boolean) = _isMetric.update { isMetric } + fun updateHeight1(textFieldValue: TextFieldValue) = height1.update { textFieldValue } + fun updateHeight2(textFieldValue: TextFieldValue) = height2.update { textFieldValue } + fun updateWeight(textFieldValue: TextFieldValue) = weight.update { textFieldValue } + fun updateIsMetric(isMetric: Boolean) = this.isMetric.update { isMetric } private fun getInitialIsMetric(): Boolean { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return true diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt index 78d2c28c..539c7568 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/components/BodyMassResult.kt @@ -77,7 +77,7 @@ internal fun BodyMassResult( Column( modifier = modifier, - verticalArrangement = Arrangement.spacedBy(16.dp) + verticalArrangement = Arrangement.spacedBy(16.dp), ) { Column( modifier = Modifier @@ -89,12 +89,12 @@ internal fun BodyMassResult( Text( text = stringResource(classification.classification), style = MaterialTheme.typography.displaySmall, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer, ) Text( text = formattedValue, style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer, ) } @@ -108,12 +108,12 @@ internal fun BodyMassResult( Text( text = formattedRange, style = MaterialTheme.typography.displaySmall, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer, ) Text( text = stringResource(R.string.body_mass_normal_weight), style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer, ) } } @@ -123,7 +123,7 @@ internal fun BodyMassResult( private data class BodyMassData( val minValue: BigDecimal, val color: Color, - @StringRes val classification: Int + @StringRes val classification: Int, ) @Stable @@ -135,32 +135,32 @@ private val indexes by lazy { BodyMassData( minValue = BigDecimal("40"), color = Color(0x80FF2323), - classification = R.string.body_mass_obese_3 + classification = R.string.body_mass_obese_3, ), BodyMassData( minValue = BigDecimal("35"), color = Color(0x80F85F31), - classification = R.string.body_mass_obese_2 + classification = R.string.body_mass_obese_2, ), BodyMassData( minValue = BigDecimal("30"), color = Color(0x80FF9634), - classification = R.string.body_mass_obese_1 + classification = R.string.body_mass_obese_1, ), BodyMassData( minValue = BigDecimal("25"), color = Color(0x80DBEC18), - classification = R.string.body_mass_overweight + classification = R.string.body_mass_overweight, ), BodyMassData( minValue = BigDecimal("18.5"), color = Color(0x805BF724), - classification = R.string.body_mass_normal + classification = R.string.body_mass_normal, ), BodyMassData( minValue = BigDecimal("0"), color = Color(0x800EACDD), - classification = R.string.body_mass_underweight + classification = R.string.body_mass_underweight, ), ) } 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 fb660bd1..686faa09 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 @@ -37,7 +37,7 @@ internal fun BodyMassTextField( label: String, onValueChange: (TextFieldValue) -> Unit, expressionFormatter: VisualTransformation, - imeAction: ImeAction = ImeAction.Next + imeAction: ImeAction = ImeAction.Next, ) { OutlinedDecimalTextField( modifier = modifier, @@ -57,6 +57,6 @@ internal fun BodyMassTextField( unfocusedTextColor = MaterialTheme.colorScheme.onSecondaryContainer, ), expressionFormatter = expressionFormatter, - imeAction = imeAction + imeAction = imeAction, ) } diff --git a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt index 3327456b..6510dd84 100644 --- a/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt +++ b/feature/bodymass/src/main/java/com/sadellie/unitto/feature/bodymass/navigation/Navigation.kt @@ -35,8 +35,8 @@ fun NavGraphBuilder.bodyMassGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { BodyMassRoute( diff --git a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt index 85e1e21e..926778f6 100644 --- a/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt +++ b/feature/calculator/src/androidTest/java/com/sadellie/unitto/feature/calculator/CalculatorScreenTest.kt @@ -53,7 +53,7 @@ class CalculatorScreenTest { acButton = true, additionalButtons = false, inverseMode = false, - partialHistoryView = true + partialHistoryView = true, ), openDrawer = {}, onInputChange = {}, @@ -90,7 +90,7 @@ class CalculatorScreenTest { acButton = true, additionalButtons = false, inverseMode = false, - partialHistoryView = true + partialHistoryView = true, ), openDrawer = {}, onInputChange = {}, diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index 37db5b22..6872c12e 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -129,7 +129,7 @@ internal fun Ready( initialValue = DragState.CLOSED, positionalThreshold = { 0f }, velocityThreshold = { 0f }, - animationSpec = tween() + animationSpec = tween(), ) } val isOpen = dragState.currentValue == DragState.OPEN @@ -145,13 +145,13 @@ internal fun Ready( content = { Icon( Icons.Default.Delete, - stringResource(R.string.clear_history_label) + stringResource(R.string.clear_history_label), ) }, - modifier = Modifier.semantics { testTag = "historyButton" } + modifier = Modifier.semantics { testTag = "historyButton" }, ) } - } + }, ) { paddingValues -> BoxWithConstraints( modifier = Modifier.padding(paddingValues), @@ -215,7 +215,7 @@ internal fun Ready( formatterSymbols = uiState.formatterSymbols, addTokens = onAddTokenClick, onDelete = onDeleteHistoryItemClick, - showDeleteButtons = isOpen + showDeleteButtons = isOpen, ) TextBox( @@ -225,12 +225,12 @@ internal fun Ready( .fillMaxWidth() .anchoredDraggable( state = dragState, - orientation = Orientation.Vertical + orientation = Orientation.Vertical, ), formatterSymbols = uiState.formatterSymbols, input = uiState.input, onValueChange = onInputChange, - output = uiState.output + output = uiState.output, ) CalculatorKeyboard( @@ -241,7 +241,7 @@ internal fun Ready( x = 0, y = (historyListHeight + textBoxHeight) .toPx() - .roundToInt() + .roundToInt(), ) } .height(keyboardHeight) @@ -251,7 +251,10 @@ internal fun Ready( onBracketsClick = onBracketsClick, onDeleteClick = onDeleteClick, onClearClick = onClearClick, - onEqualClick = { focusManager.clearFocus(); onEqualClick() }, + onEqualClick = { + focusManager.clearFocus() + onEqualClick() + }, radianMode = uiState.radianMode, onRadianModeClick = onRadianModeClick, additionalButtons = uiState.additionalButtons, @@ -281,19 +284,19 @@ internal fun Ready( onClick = { onClearHistoryClick() showClearHistoryDialog = false - } + }, ) { Text(stringResource(R.string.clear_label)) } }, dismissButton = { TextButton( - onClick = { showClearHistoryDialog = false } + onClick = { showClearHistoryDialog = false }, ) { Text(stringResource(R.string.cancel_label)) } }, - onDismissRequest = { showClearHistoryDialog = false } + onDismissRequest = { showClearHistoryDialog = false }, ) } } @@ -322,7 +325,7 @@ private fun PreviewCalculatorScreen() { id = it.hashCode(), date = dtf.parse(it)!!, expression = "12345".repeat(10), - result = "1234" + result = "1234", ) } @@ -339,7 +342,7 @@ private fun PreviewCalculatorScreen() { acButton = true, additionalButtons = false, inverseMode = false, - partialHistoryView = true + partialHistoryView = true, ), openDrawer = {}, onInputChange = {}, @@ -354,4 +357,4 @@ private fun PreviewCalculatorScreen() { onClearHistoryClick = {}, onDeleteHistoryItemClick = {}, ) -} \ No newline at end of file +} 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 6889e942..fe69c1b2 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 @@ -57,18 +57,18 @@ internal class CalculatorViewModel @Inject constructor( private val calculatorHistoryRepository: CalculatorHistoryRepository, private val savedStateHandle: SavedStateHandle, ) : ViewModel() { - private val _inputKey = "CALCULATOR_INPUT" - private val _input = MutableStateFlow(savedStateHandle.getTextField(_inputKey)) - private val _result = MutableStateFlow(CalculationResult.Empty) - private val _equalClicked = MutableStateFlow(false) - private val _prefs = userPrefsRepository.calculatorPrefs + private val inputKey = "CALCULATOR_INPUT" + private val input = MutableStateFlow(savedStateHandle.getTextField(inputKey)) + private val result = MutableStateFlow(CalculationResult.Empty) + private val equalClicked = MutableStateFlow(false) + private val prefs = userPrefsRepository.calculatorPrefs .stateIn(viewModelScope, null) - private var _fractionJob: Job? = null + private var fractionJob: Job? = null val uiState: StateFlow = combine( - _input, - _result, - _prefs, + input, + result, + prefs, calculatorHistoryRepository.historyFlow, ) { input, result, prefs, history -> prefs ?: return@combine CalculatorUIState.Loading @@ -90,21 +90,21 @@ internal class CalculatorViewModel @Inject constructor( } .mapLatest { ui -> if (ui !is CalculatorUIState.Ready) return@mapLatest ui - if (_equalClicked.value) return@mapLatest ui + if (equalClicked.value) return@mapLatest ui if (!ui.input.text.isExpression()) { - _result.update { CalculationResult.Empty } + result.update { CalculationResult.Empty } return@mapLatest ui } - _result.update { + result.update { try { CalculationResult.Default( calculate( input = ui.input.text, radianMode = ui.radianMode, ) - .format(ui.precision, ui.outputFormat) + .format(ui.precision, ui.outputFormat), ) } catch (e: ExpressionException.DivideByZero) { CalculationResult.Empty @@ -118,31 +118,31 @@ internal class CalculatorViewModel @Inject constructor( .stateIn(viewModelScope, CalculatorUIState.Loading) fun addTokens(tokens: String) { - val isClearInputNeeded = _equalClicked.value and Token.Digit.allWithDot.contains(tokens) + val isClearInputNeeded = equalClicked.value and Token.Digit.allWithDot.contains(tokens) val newValue = when { // Clean input after clicking "=" and any token that is a Digit isClearInputNeeded -> TextFieldValue() - _equalClicked.value -> _input.value.placeCursorAtTheEnd() - else -> _input.value + equalClicked.value -> input.value.placeCursorAtTheEnd() + else -> input.value }.addTokens(tokens) updateInput(newValue) } fun addBracket() { - val newValue = if (_equalClicked.value) { + val newValue = if (equalClicked.value) { // Cursor is set to 0 when equal is clicked - _input.value.placeCursorAtTheEnd() + input.value.placeCursorAtTheEnd() } else { - _input.value + input.value }.addBracket() updateInput(newValue) } fun deleteTokens() { - val newValue = if (_equalClicked.value) { + val newValue = if (equalClicked.value) { TextFieldValue() } else { - _input.value.deleteTokens() + input.value.deleteTokens() } updateInput(newValue) } @@ -150,10 +150,10 @@ internal class CalculatorViewModel @Inject constructor( fun clearInput() = updateInput(TextFieldValue()) fun updateInput(value: TextFieldValue) { - _fractionJob?.cancel() - _equalClicked.update { false } - _input.update { value } - savedStateHandle[_inputKey] = value.text + fractionJob?.cancel() + equalClicked.update { false } + input.update { value } + savedStateHandle[inputKey] = value.text } fun updateRadianMode(newValue: Boolean) = viewModelScope.launch { @@ -177,27 +177,27 @@ internal class CalculatorViewModel @Inject constructor( } fun equal() = viewModelScope.launch { - val prefs = _prefs.value ?: return@launch - if (_equalClicked.value) return@launch - if (!_input.value.text.isExpression()) return@launch + val prefs = prefs.value ?: return@launch + if (equalClicked.value) return@launch + if (!input.value.text.isExpression()) return@launch val result = try { - calculate(_input.value.text, prefs.radianMode, RoundingMode.DOWN) + calculate(input.value.text, prefs.radianMode, RoundingMode.DOWN) } catch (e: ExpressionException.DivideByZero) { - _equalClicked.update { true } - _result.update { CalculationResult.DivideByZeroError } + equalClicked.update { true } + result.update { CalculationResult.DivideByZeroError } return@launch } catch (e: ExpressionException.FactorialCalculation) { - _equalClicked.update { true } - _result.update { CalculationResult.Error } + equalClicked.update { true } + result.update { CalculationResult.Error } return@launch } catch (e: Exception) { - _equalClicked.update { true } - _result.update { CalculationResult.Error } + equalClicked.update { true } + result.update { CalculationResult.Error } return@launch } - _equalClicked.update { true } + equalClicked.update { true } val resultFormatted = result .format(prefs.precision, prefs.outputFormat) @@ -205,17 +205,17 @@ internal class CalculatorViewModel @Inject constructor( withContext(Dispatchers.IO) { calculatorHistoryRepository.add( - expression = _input.value.text.replace("-", Token.Operator.minus), - result = resultFormatted + expression = input.value.text.replace("-", Token.Operator.minus), + result = resultFormatted, ) } - _fractionJob?.cancel() - _fractionJob = launch(Dispatchers.Default) { + fractionJob?.cancel() + fractionJob = launch(Dispatchers.Default) { val fraction = result.toFractionalString() - _input.update { TextFieldValue(resultFormatted, TextRange.Zero) } - _result.update { CalculationResult.Fraction(fraction) } + input.update { TextFieldValue(resultFormatted, TextRange.Zero) } + this@CalculatorViewModel.result.update { CalculationResult.Fraction(fraction) } } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/DecimalToFraction.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/DecimalToFraction.kt index e2c15501..fd65ccf3 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/DecimalToFraction.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/DecimalToFraction.kt @@ -73,7 +73,7 @@ private fun BigDecimal.notRepeatingFractional(): Pair { } private fun BigDecimal.repeatingFractional( - repeatingLength: Int + repeatingLength: Int, ): Pair { val multiplier = BigInteger.TEN.pow(repeatingLength) @@ -99,7 +99,7 @@ private fun BigDecimal.repeatingDecimals(): String? { repeat(inputString.length) { index -> val stringInFront = inputString.substring(index) - (1..stringInFront.length/2).forEach checkLoop@{ loop -> + (1..stringInFront.length / 2).forEach checkLoop@{ loop -> val pattern = stringInFront.take(loop) val checkRange = stringInFront.substring(0, stringInFront.length - stringInFront.length % pattern.length) val checkChunks = checkRange.chunked(pattern.length) 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 d629b9ce..194cb7aa 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 @@ -57,13 +57,10 @@ import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowHeightSizeClass import com.sadellie.unitto.core.ui.common.ColumnWithConstraints import com.sadellie.unitto.core.ui.common.KeyboardButtonAdditional -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightShort -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightShortAdditional -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightTall -import com.sadellie.unitto.core.ui.common.KeyboardButtonContentHeightTallAdditional import com.sadellie.unitto.core.ui.common.KeyboardButtonFilled import com.sadellie.unitto.core.ui.common.KeyboardButtonLight import com.sadellie.unitto.core.ui.common.KeyboardButtonTertiary +import com.sadellie.unitto.core.ui.common.KeyboardButtonToken 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.AcTan @@ -191,7 +188,7 @@ private fun PortraitKeyboard( val expandRotation: Float by animateFloatAsState( targetValue = if (additionalButtons) 180f else 0f, animationSpec = tween(easing = FastOutSlowInEasing), - label = "Rotate on expand" + label = "Rotate on expand", ) ColumnWithConstraints( @@ -205,14 +202,14 @@ private fun PortraitKeyboard( Row( modifier = Modifier .fillMaxWidth(), - horizontalArrangement = Arrangement.Start + horizontalArrangement = Arrangement.Start, ) { Crossfade( targetState = inverseMode, label = "Inverse switch", modifier = Modifier .fillMaxWidth() - .weight(1f) + .weight(1f), ) { inverse -> if (inverse) { AdditionalPortrait( @@ -220,22 +217,22 @@ private fun PortraitKeyboard( additionalButtons = additionalButtons, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.modulo) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.pi) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.modulo) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arsinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arcosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.actanBracket) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onRadianModeClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.arsinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.arcosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.actanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.expBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } - } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onInverseModeClick(!inverseMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.expBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } + }, ) } else { AdditionalPortrait( @@ -243,33 +240,33 @@ private fun PortraitKeyboard( additionalButtons = additionalButtons, buttonHeight = additionalButtonHeight, content1 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.sqrt) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.pi) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.sqrt) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Operator.factorial) } }, content2 = { buttonModifier -> - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.sinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.cosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.tanBracket) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onRadianModeClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.sinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.cosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.tanBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.lnBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.logBracket) } - } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onInverseModeClick(!inverseMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.lnBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonToken.CONTENT_HEIGHT_TALL_ADDITIONAL) { onAddTokenClick(Token.Func.logBracket) } + }, ) } } Box( modifier = Modifier.size(additionalButtonHeight), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { IconButton( onClick = { onAdditionalButtonsClick(!additionalButtons) }, - colors = IconButtonDefaults.iconButtonColors(containerColor = MaterialTheme.colorScheme.inverseOnSurface) + colors = IconButtonDefaults.iconButtonColors(containerColor = MaterialTheme.colorScheme.inverseOnSurface), ) { Icon(Icons.Default.ExpandMore, null, Modifier.rotate(expandRotation)) } @@ -290,39 +287,39 @@ private fun PortraitKeyboard( .fillMaxHeight(height) if (showAcButton) { - KeyboardButtonTertiary(mainButtonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightTall) { onClearClick() } - KeyboardButtonFilled(mainButtonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightTall) { onBracketsClick() } + KeyboardButtonTertiary(mainButtonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onClearClick() } + KeyboardButtonFilled(mainButtonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onBracketsClick() } } else { - KeyboardButtonFilled(mainButtonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.leftBracket) } - KeyboardButtonFilled(mainButtonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.rightBracket) } + KeyboardButtonFilled(mainButtonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(mainButtonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonFilled(mainButtonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.percent) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.divide) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.percent) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._7) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._8) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._9) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.multiply) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._9) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.multiply) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._4) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._5) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._6) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.minus) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.minus) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._1) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._2) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._3) } - KeyboardButtonFilled(mainButtonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Operator.plus) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(mainButtonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Operator.plus) } if (middleZero) { - KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit.dot) } - KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit._0) } - KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightTall) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightTall, onClearClick) { onDeleteClick() } - KeyboardButtonFilled(mainButtonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightTall) { onEqualClick() } + KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonToken.CONTENT_HEIGHT_TALL, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(mainButtonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onEqualClick() } } Spacer(modifier = Modifier.height(spacerHeight)) @@ -347,7 +344,7 @@ private fun AdditionalPortrait( additionalButtons: Boolean, buttonHeight: Dp, content1: @Composable (buttonModifier: Modifier) -> Unit, - content2: @Composable (buttonModifier: Modifier) -> Unit + content2: @Composable (buttonModifier: Modifier) -> Unit, ) { AnimatedContent( targetState = additionalButtons, @@ -355,8 +352,8 @@ private fun AdditionalPortrait( label = "Additional buttons reveal", transitionSpec = { expandVertically(expandFrom = Alignment.Top) togetherWith - shrinkVertically(shrinkTowards = Alignment.Top) using (SizeTransform()) - } + shrinkVertically(shrinkTowards = Alignment.Top) using (SizeTransform()) + }, ) { show -> if (show) { KeypadFlow( @@ -422,119 +419,119 @@ private fun LandscapeKeyboard( Crossfade( targetState = inverseMode, label = "Inverse switch", - modifier = modifier + modifier = modifier, ) { inverse -> if (inverse) { KeypadFlow( modifier = Modifier.fillMaxSize(), rows = 4, - columns = 8 + columns = 8, ) { width, height -> val buttonModifier = Modifier .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.modulo) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } - KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } - KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._8) } - KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._9) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onRadianModeClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.modulo) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._9) } if (showAcButton) { - KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { onClearClick() } - KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { onBracketsClick() } + KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onClearClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onBracketsClick() } } else { - KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.leftBracket) } - KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } - KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } - KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._5) } - KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._6) } - KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.multiply) } - KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.divide) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onInverseModeClick(!inverseMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.multiply) } + KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.arsinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.arcosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.actanBracket) } - KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._1) } - KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._2) } - KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._3) } - KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.minus) } - KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.percent) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.arsinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.arcosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.actanBracket) } + KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.minus) } + KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.percent) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.expBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.expBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } if (middleZero) { - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, onClearClick) { onDeleteClick() } - KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.plus) } - KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { onEqualClick() } + KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonToken.CONTENT_HEIGHT_SHORT, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.plus) } + KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onEqualClick() } } } else { KeypadFlow( modifier = Modifier.fillMaxSize(), rows = 4, - columns = 8 + columns = 8, ) { width, height -> val buttonModifier = Modifier .fillMaxWidth(width) .fillMaxHeight(height) - KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.sqrt) } - KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } - KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } - KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._8) } - KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._9) } + KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onRadianModeClick(!radianMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.sqrt) } + KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Const.pi) } + KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._7) } + KeyboardButtonLight(buttonModifier, IconPack.Key8, Token.Digit._8, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._8) } + KeyboardButtonLight(buttonModifier, IconPack.Key9, Token.Digit._9, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._9) } if (showAcButton) { - KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonContentHeightShort) { onClearClick() } - KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonContentHeightShort) { onBracketsClick() } + KeyboardButtonTertiary(buttonModifier, IconPack.Clear, stringResource(R.string.clear_label), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onClearClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Brackets, stringResource(R.string.keyboard_brackets), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onBracketsClick() } } else { - KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.leftBracket) } - KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.LeftBracket, stringResource(R.string.keyboard_left_bracket), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.leftBracket) } + KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.rightBracket) } } - KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) } - KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } - KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } - KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } - KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._5) } - KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._6) } - KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.multiply) } - KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.divide) } + KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onInverseModeClick(!inverseMode) } + KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.power) } + KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Operator.factorial) } + KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._4) } + KeyboardButtonLight(buttonModifier, IconPack.Key5, Token.Digit._5, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._5) } + KeyboardButtonLight(buttonModifier, IconPack.Key6, Token.Digit._6, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._6) } + KeyboardButtonFilled(buttonModifier, IconPack.Multiply, stringResource(R.string.keyboard_multiply), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.multiply) } + KeyboardButtonFilled(buttonModifier, IconPack.Divide, stringResource(R.string.keyboard_divide), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.divide) } - KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.sinBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.cosBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.tanBracket) } - KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._1) } - KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._2) } - KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._3) } - KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.minus) } - KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.percent) } + KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.sinBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.cosBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.tanBracket) } + KeyboardButtonLight(buttonModifier, IconPack.Key1, Token.Digit._1, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._1) } + KeyboardButtonLight(buttonModifier, IconPack.Key2, Token.Digit._2, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._2) } + KeyboardButtonLight(buttonModifier, IconPack.Key3, Token.Digit._3, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._3) } + KeyboardButtonFilled(buttonModifier, IconPack.Minus, stringResource(R.string.keyboard_minus), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.minus) } + KeyboardButtonFilled(buttonModifier, IconPack.Percent, stringResource(R.string.keyboard_percent), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.percent) } - KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.e) } - KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.lnBracket) } - KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Func.logBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Const.e) } + KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.lnBracket) } + KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonToken.CONTENT_HEIGHT_SHORT_ADDITIONAL) { onAddTokenClick(Token.Func.logBracket) } if (middleZero) { - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._0) } } else { - KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._0) } - KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit.dot) } + KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._0) } + KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit.dot) } } - KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonContentHeightShort, onClearClick) { onDeleteClick() } - KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.plus) } - KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonContentHeightShort) { onEqualClick() } + KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonToken.CONTENT_HEIGHT_SHORT, onClearClick) { onDeleteClick() } + KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.plus) } + KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onEqualClick() } } } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt index edfbcb37..45e7ad72 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -92,12 +92,12 @@ private fun HistoryListPlaceholder( Column( modifier = modifier.wrapContentHeight(unbounded = true), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Column( modifier = Modifier.height(HistoryItemHeight), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Icon(Icons.Default.History, stringResource(R.string.calculator_no_history)) Text(stringResource(R.string.calculator_no_history)) @@ -165,7 +165,7 @@ private fun HistoryListItem( modifier = Modifier, imageVector = Icons.Outlined.Close, contentDescription = stringResource(R.string.delete_label), - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -174,7 +174,7 @@ private fun HistoryListItem( .weight(1f) .fillMaxHeight(), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.End + horizontalAlignment = Alignment.End, ) { FixedExpressionInputTextField( modifier = Modifier @@ -218,7 +218,7 @@ private fun PreviewHistoryList() { id = it.hashCode(), date = dtf.parse(it)!!, expression = "12345".repeat(10), - result = "67890" + result = "67890", ) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt index 542f09d9..54420798 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/TextBox.kt @@ -61,9 +61,11 @@ fun TextBox( .background( MaterialTheme.colorScheme.surfaceVariant, RoundedCornerShape( - topStartPercent = 0, topEndPercent = 0, - bottomStartPercent = 20, bottomEndPercent = 20 - ) + topStartPercent = 0, + topEndPercent = 0, + bottomStartPercent = 20, + bottomEndPercent = 20, + ), ) .padding(top = 4.dp), horizontalAlignment = Alignment.CenterHorizontally, @@ -76,7 +78,7 @@ fun TextBox( value = input, minRatio = 0.5f, onValueChange = onValueChange, - formatterSymbols = formatterSymbols + formatterSymbols = formatterSymbols, ) if (LocalWindowSize.current.heightSizeClass > WindowHeightSizeClass.Compact) { val calculationResultModifier = Modifier @@ -87,7 +89,7 @@ fun TextBox( when (output) { is CalculationResult.Empty -> { Spacer( - modifier = calculationResultModifier + modifier = calculationResultModifier, ) } @@ -144,7 +146,6 @@ fun TextBox( ) } } - } // Handle Box( @@ -152,9 +153,9 @@ fun TextBox( .padding(8.dp) .background( MaterialTheme.colorScheme.onSurfaceVariant, - RoundedCornerShape(100) + RoundedCornerShape(100), ) - .sizeIn(24.dp, 4.dp) + .sizeIn(24.dp, 4.dp), ) } -} \ No newline at end of file +} diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt index 0cfeac6c..fec9e531 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt @@ -35,8 +35,8 @@ fun NavGraphBuilder.calculatorGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { CalculatorRoute( diff --git a/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/DecimalToFractionTest.kt b/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/DecimalToFractionTest.kt index da71d66a..0e6b2639 100644 --- a/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/DecimalToFractionTest.kt +++ b/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/DecimalToFractionTest.kt @@ -79,6 +79,6 @@ class DecimalToFractionTest { private fun assertFractional(expected: String, actual: String) = assertEquals( expected, - actual.replace("⁄", "/") + actual.replace("⁄", "/"), ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/NetworkUtils.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConnectionState.kt similarity index 91% rename from feature/converter/src/main/java/com/sadellie/unitto/feature/converter/NetworkUtils.kt rename to feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConnectionState.kt index ae47624b..5ea4e9e8 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/NetworkUtils.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConnectionState.kt @@ -41,8 +41,12 @@ private fun Context.observeConnectivityAsFlow() = callbackFlow { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val callback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { trySend(ConnectionState.Available) } - override fun onLost(network: Network) { trySend(ConnectionState.Unavailable) } + override fun onAvailable(network: Network) { + trySend(ConnectionState.Available) + } + override fun onLost(network: Network) { + trySend(ConnectionState.Unavailable) + } } val networkRequest = NetworkRequest.Builder() diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt index cbe8a40e..f18f63c6 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterScreen.kt @@ -114,7 +114,7 @@ internal fun ConverterRoute( onValueChange = viewModel::updateInput, onFocusOnInput2 = viewModel::updateFocused, onErrorClick = viewModel::updateCurrencyRates, - addBracket = viewModel::addBracket + addBracket = viewModel::addBracket, ) } @@ -149,7 +149,7 @@ private fun ConverterScreen( navigateToLeftScreen = navigateToLeftScreen, swapUnits = swapUnits, navigateToRightScreen = navigateToRightScreen, - clearInput = clearInput + clearInput = clearInput, ) } } @@ -180,13 +180,13 @@ private fun ConverterScreen( @Composable private fun UnitConverterTopBar( openDrawer: () -> Unit, - content: @Composable (PaddingValues) -> Unit + content: @Composable (PaddingValues) -> Unit, ) { ScaffoldWithTopBar( title = {}, navigationIcon = { DrawerButton { openDrawer() } }, colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = Color.Transparent), - content = { content(it) } + content = { content(it) }, ) } @@ -219,7 +219,7 @@ private fun NumberBase( ConverterResultTextField( modifier = textFieldModifier, - result = uiState.result + result = uiState.result, ) AnimatedUnitShortName(stringResource(uiState.unitTo.shortName)) @@ -230,7 +230,7 @@ private fun NumberBase( unitToLabel = stringResource(uiState.unitTo.displayName), swapUnits = swapUnits, navigateToLeftScreen = { navigateToLeftScreen(uiState) }, - navigateToRightScreen = { navigateToRightScreen(uiState) } + navigateToRightScreen = { navigateToRightScreen(uiState) }, ) } }, @@ -241,7 +241,7 @@ private fun NumberBase( deleteDigit = deleteDigit, clearInput = clearInput, ) - } + }, ) } @@ -263,7 +263,7 @@ private fun Default( val locale: Locale = LocalLocale.current var calculation by remember(uiState.calculation) { mutableStateOf( - TextFieldValue(uiState.calculation?.format(uiState.scale, uiState.outputFormat) ?: "") + TextFieldValue(uiState.calculation?.format(uiState.scale, uiState.outputFormat) ?: ""), ) } val connection by connectivityState() @@ -302,19 +302,19 @@ private fun Default( .fillMaxWidth(), text = lastUpdate.orEmpty(), color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } if (uiState.unitFrom.id == UnitID.foot) { Row( modifier = textFieldModifier, - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { Column( modifier = Modifier .fillMaxWidth() - .weight(1f) + .weight(1f), ) { ExpressionTextField( modifier = Modifier @@ -334,7 +334,7 @@ private fun Default( Column( modifier = Modifier .fillMaxWidth() - .weight(1f) + .weight(1f), ) { ExpressionTextField( modifier = Modifier @@ -363,7 +363,7 @@ private fun Default( visible = calculation.text.isNotEmpty(), modifier = Modifier.weight(1f), enter = expandVertically(clip = false), - exit = shrinkVertically(clip = false) + exit = shrinkVertically(clip = false), ) { ExpressionTextField( modifier = Modifier, @@ -372,7 +372,7 @@ private fun Default( onValueChange = { calculation = it }, textColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f), formatterSymbols = uiState.formatterSymbols, - readOnly = true + readOnly = true, ) } AnimatedUnitShortName(stringResource(uiState.unitFrom.shortName)) @@ -384,13 +384,16 @@ private fun Default( scale = uiState.scale, outputFormat = uiState.outputFormat, formatterSymbols = uiState.formatterSymbols, - onErrorClick = { refreshCurrencyRates(uiState.unitFrom) } + onErrorClick = { refreshCurrencyRates(uiState.unitFrom) }, ) AnimatedUnitShortName( stringResource( - if (uiState.result is ConverterResult.Error) R.string.click_to_try_again_label - else uiState.unitTo.shortName - ) + if (uiState.result is ConverterResult.Error) { + R.string.click_to_try_again_label + } else { + uiState.unitTo.shortName + }, + ), ) Spacer(modifier = Modifier.height(boxWithConstraintsScope.maxHeight * 0.03f)) @@ -400,7 +403,7 @@ private fun Default( unitToLabel = stringResource(uiState.unitTo.displayName), swapUnits = swapUnits, navigateToLeftScreen = { navigateToLeftScreen(uiState) }, - navigateToRightScreen = { navigateToRightScreen(uiState) } + navigateToRightScreen = { navigateToRightScreen(uiState) }, ) } }, @@ -413,9 +416,9 @@ private fun Default( fractional = uiState.formatterSymbols.fractional, middleZero = uiState.middleZero, acButton = uiState.acButton, - addBracket = addBracket + addBracket = addBracket, ) - } + }, ) } @@ -447,7 +450,7 @@ private fun ConverterResultTextField( value = TextFieldValue(stringResource(R.string.loading_label)), onValueChange = {}, minRatio = 0.7f, - readOnly = true + readOnly = true, ) } @@ -469,7 +472,7 @@ private fun ConverterResultTextField( minRatio = 0.7f, onValueChange = { resultTextField = it }, formatterSymbols = formatterSymbols, - readOnly = true + readOnly = true, ) } @@ -479,18 +482,19 @@ private fun ConverterResultTextField( value = resultTextField, onValueChange = { resultTextField = it }, minRatio = 0.7f, - readOnly = true + readOnly = true, ) } is ConverterResult.Time, - is ConverterResult.FootInch -> { + is ConverterResult.FootInch, + -> { SimpleTextField( modifier = modifier, value = resultTextField, onValueChange = { resultTextField = it }, minRatio = 0.7f, - readOnly = true + readOnly = true, ) } } @@ -505,14 +509,16 @@ private fun AnimatedUnitShortName( targetState = label, transitionSpec = { // Enter animation - (expandHorizontally(clip = false, expandFrom = Alignment.Start) + fadeIn() - togetherWith fadeOut()) using SizeTransform(clip = false) + ( + expandHorizontally(clip = false, expandFrom = Alignment.Start) + fadeIn() + togetherWith fadeOut() + ) using SizeTransform(clip = false) }, - label = "Animated short name from" + label = "Animated short name from", ) { value -> Text( text = value, - style = MaterialTheme.typography.bodyMedium.copy(textAlign = TextAlign.End) + style = MaterialTheme.typography.bodyMedium.copy(textAlign = TextAlign.End), ) } } @@ -529,7 +535,7 @@ private fun UnitSelectionButtons( val swapButtonRotation: Float by animateFloatAsState( targetValue = if (swapped) 0f else 180f, animationSpec = tween(easing = FastOutSlowInEasing), - label = "Swap button rotation" + label = "Swap button rotation", ) Row(verticalAlignment = Alignment.CenterVertically) { @@ -538,7 +544,7 @@ private fun UnitSelectionButtons( .fillMaxWidth() .weight(1f), label = unitFromLabel, - onClick = navigateToLeftScreen + onClick = navigateToLeftScreen, ) IconButton( onClick = { @@ -549,7 +555,7 @@ private fun UnitSelectionButtons( Icon( modifier = Modifier.rotate(swapButtonRotation), imageVector = Icons.Outlined.SwapHoriz, - contentDescription = stringResource(R.string.converter_swap_units_description) + contentDescription = stringResource(R.string.converter_swap_units_description), ) } UnitSelectionButton( @@ -557,7 +563,7 @@ private fun UnitSelectionButtons( .fillMaxWidth() .weight(1f), label = unitToLabel, - onClick = navigateToRightScreen + onClick = navigateToRightScreen, ) } } 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 40e64429..4d18b048 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 @@ -97,7 +97,7 @@ internal sealed class ConverterResult { internal fun ConverterResult.Time.format( mContext: Context, - formatterSymbols: FormatterSymbols + formatterSymbols: FormatterSymbols, ): String { val result = mutableListOf() @@ -140,7 +140,7 @@ internal fun ConverterResult.FootInch.format( mContext: Context, scale: Int, outputFormat: Int, - formatterSymbols: FormatterSymbols + formatterSymbols: FormatterSymbols, ): String { var result = "" result += foot.format(scale, outputFormat).formatExpression(formatterSymbols) @@ -161,29 +161,33 @@ internal fun formatTime( val negative = input < BigDecimal.ZERO val inputAbs = input.abs() - if (inputAbs.isLessThan(attosecondBasicUnit)) return ConverterResult.Time( - negative = negative, - day = BigDecimal.ZERO, - hour = BigDecimal.ZERO, - minute = BigDecimal.ZERO, - second = BigDecimal.ZERO, - millisecond = BigDecimal.ZERO, - microsecond = BigDecimal.ZERO, - nanosecond = BigDecimal.ZERO, - attosecond = inputAbs - ) + if (inputAbs.isLessThan(attosecondBasicUnit)) { + return ConverterResult.Time( + negative = negative, + day = BigDecimal.ZERO, + hour = BigDecimal.ZERO, + minute = BigDecimal.ZERO, + second = BigDecimal.ZERO, + millisecond = BigDecimal.ZERO, + microsecond = BigDecimal.ZERO, + nanosecond = BigDecimal.ZERO, + attosecond = inputAbs, + ) + } - if (inputAbs.isLessThan(nanosecondBasicUnit)) return ConverterResult.Time( - negative = negative, - day = BigDecimal.ZERO, - hour = BigDecimal.ZERO, - minute = BigDecimal.ZERO, - second = BigDecimal.ZERO, - millisecond = BigDecimal.ZERO, - microsecond = BigDecimal.ZERO, - nanosecond = BigDecimal.ZERO, - attosecond = inputAbs.trimZeros() - ) + if (inputAbs.isLessThan(nanosecondBasicUnit)) { + return ConverterResult.Time( + negative = negative, + day = BigDecimal.ZERO, + hour = BigDecimal.ZERO, + minute = BigDecimal.ZERO, + second = BigDecimal.ZERO, + millisecond = BigDecimal.ZERO, + microsecond = BigDecimal.ZERO, + nanosecond = BigDecimal.ZERO, + attosecond = inputAbs.trimZeros(), + ) + } // DAY var division = inputAbs.divideAndRemainder(dayBasicUnit) @@ -225,7 +229,7 @@ internal fun formatTime( millisecond = millisecond, microsecond = microsecond, nanosecond = nanosecond, - attosecond = attosecond + attosecond = attosecond, ) } @@ -242,7 +246,7 @@ internal fun formatTime( internal fun formatFootInch( input: BigDecimal, footUnit: DefaultUnit, - inchUnit: DefaultUnit + inchUnit: DefaultUnit, ): ConverterResult.FootInch { val (integral, fractional) = input.divideAndRemainder(BigDecimal.ONE) 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 c3c9a804..1bbb7cf3 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 @@ -57,31 +57,31 @@ import javax.inject.Inject internal class ConverterViewModel @Inject constructor( private val userPrefsRepository: UserPreferencesRepository, private val unitsRepo: UnitsRepository, - private val savedStateHandle: SavedStateHandle + private val savedStateHandle: SavedStateHandle, ) : ViewModel() { private val converterInputKey1 = "CONVERTER_INPUT_1" private val converterInputKey2 = "CONVERTER_INPUT_2" - private val _input1 = MutableStateFlow(savedStateHandle.getTextField(converterInputKey1)) - private val _input2 = MutableStateFlow(savedStateHandle.getTextField(converterInputKey2)) - private val _focusedOnInput2 = MutableStateFlow(false) - private val _calculation = MutableStateFlow(null) - private val _result = MutableStateFlow(ConverterResult.Loading) - private val _unitFrom = MutableStateFlow(null) - private val _unitTo = MutableStateFlow(null) + private val input1 = MutableStateFlow(savedStateHandle.getTextField(converterInputKey1)) + private val input2 = MutableStateFlow(savedStateHandle.getTextField(converterInputKey2)) + private val focusedOnInput2 = MutableStateFlow(false) + private val calculation = MutableStateFlow(null) + private val result = MutableStateFlow(ConverterResult.Loading) + private val unitFrom = MutableStateFlow(null) + private val unitTo = MutableStateFlow(null) - private val _currenciesState = MutableStateFlow(CurrencyRateUpdateState.Nothing) - private var _loadCurrenciesJob: Job? = null + private val currenciesState = MutableStateFlow(CurrencyRateUpdateState.Nothing) + private var loadCurrenciesJob: Job? = null val converterUiState: StateFlow = combine( - _input1, - _input2, - _calculation, - _result, - _unitFrom, - _unitTo, + input1, + input2, + calculation, + result, + unitFrom, + unitTo, userPrefsRepository.converterPrefs, - _currenciesState + currenciesState, ) { input1, input2, calculation, result, unitFrom, unitTo, prefs, currenciesState -> return@combine when { (unitFrom is DefaultUnit) and (unitTo is DefaultUnit) -> { @@ -113,13 +113,13 @@ internal class ConverterViewModel @Inject constructor( } } .mapLatest { ui -> - when (_currenciesState.value) { + when (currenciesState.value) { is CurrencyRateUpdateState.Loading -> { - _result.update { ConverterResult.Loading } + result.update { ConverterResult.Loading } return@mapLatest ui } is CurrencyRateUpdateState.Error -> { - _result.update { ConverterResult.Error } + result.update { ConverterResult.Error } return@mapLatest ui } is CurrencyRateUpdateState.Ready, is CurrencyRateUpdateState.Nothing -> {} @@ -132,14 +132,14 @@ internal class ConverterViewModel @Inject constructor( unitTo = ui.unitTo, input1 = ui.input1, input2 = ui.input2, - formatTime = ui.formatTime + formatTime = ui.formatTime, ) } is UnitConverterUIState.NumberBase -> { convertNumberBase( unitFrom = ui.unitFrom, unitTo = ui.unitTo, - input = ui.input + input = ui.input, ) } is UnitConverterUIState.Loading -> {} @@ -150,19 +150,19 @@ internal class ConverterViewModel @Inject constructor( .stateIn(viewModelScope, UnitConverterUIState.Loading) fun swapUnits() { - _unitFrom - .getAndUpdate { _unitTo.value } - .also { oldUnitFrom -> _unitTo.update { oldUnitFrom } } + unitFrom + .getAndUpdate { unitTo.value } + .also { oldUnitFrom -> unitTo.update { oldUnitFrom } } - _loadCurrenciesJob?.cancel() - _currenciesState.update { CurrencyRateUpdateState.Nothing } - _unitFrom.value?.let { + loadCurrenciesJob?.cancel() + currenciesState.update { CurrencyRateUpdateState.Nothing } + unitFrom.value?.let { if (it.group == UnitGroup.CURRENCY) updateCurrencyRates(it) } viewModelScope.launch { - val unitTo = _unitTo.value ?: return@launch - val unitFrom = _unitFrom.value ?: return@launch + val unitTo = unitTo.value ?: return@launch + val unitFrom = unitFrom.value ?: return@launch userPrefsRepository.updateLatestPairOfUnits(unitFrom = unitFrom, unitTo = unitTo) } @@ -173,17 +173,17 @@ internal class ConverterViewModel @Inject constructor( * * @param focusOnInput2 `true` if focus is on inches input. `false`if focus on feet input. */ - fun updateFocused(focusOnInput2: Boolean) = _focusedOnInput2.update { focusOnInput2 } + fun updateFocused(focusOnInput2: Boolean) = focusedOnInput2.update { focusOnInput2 } fun addTokens(tokens: String) { - if (_focusedOnInput2.value) { - _input2.update { + if (focusedOnInput2.value) { + input2.update { val newValue = it.addTokens(tokens) savedStateHandle[converterInputKey2] = newValue.text newValue } } else { - _input1.update { + input1.update { val newValue = it.addTokens(tokens) savedStateHandle[converterInputKey1] = newValue.text newValue @@ -192,14 +192,14 @@ internal class ConverterViewModel @Inject constructor( } fun addBracket() { - if (_focusedOnInput2.value) { - _input2.update { + if (focusedOnInput2.value) { + input2.update { val newValue = it.addBracket() savedStateHandle[converterInputKey2] = newValue.text newValue } } else { - _input1.update { + input1.update { val newValue = it.addBracket() savedStateHandle[converterInputKey1] = newValue.text newValue @@ -208,14 +208,14 @@ internal class ConverterViewModel @Inject constructor( } fun deleteTokens() { - if (_focusedOnInput2.value) { - _input2.update { + if (focusedOnInput2.value) { + input2.update { val newValue = it.deleteTokens() savedStateHandle[converterInputKey2] = newValue.text newValue } } else { - _input1.update { + input1.update { val newValue = it.deleteTokens() savedStateHandle[converterInputKey1] = newValue.text newValue @@ -224,30 +224,30 @@ internal class ConverterViewModel @Inject constructor( } fun clearInput() { - _input1.update { + input1.update { savedStateHandle[converterInputKey1] = "" TextFieldValue() } - _input2.update { + input2.update { savedStateHandle[converterInputKey2] = "" TextFieldValue() } } - fun updateInput(value: TextFieldValue) = _input1.update { value } + fun updateInput(value: TextFieldValue) = input1.update { value } fun updateCurrencyRates(unit: AbstractUnit) { - _loadCurrenciesJob = viewModelScope.launch(Dispatchers.IO) { + loadCurrenciesJob = viewModelScope.launch(Dispatchers.IO) { try { - _currenciesState.update { CurrencyRateUpdateState.Loading } + currenciesState.update { CurrencyRateUpdateState.Loading } val updateDate = unitsRepo.updateRates(unit) ?: throw Exception("Empty cache") // Set to fresh objects with updated basic unit values - _unitFrom.update { unitFrom -> unitFrom?.id?.let { unitsRepo.getById(it) } } - _unitTo.update { unitTo -> unitTo?.id?.let { unitsRepo.getById(it) } } - _currenciesState.update { CurrencyRateUpdateState.Ready(updateDate) } + unitFrom.update { unitFrom -> unitFrom?.id?.let { unitsRepo.getById(it) } } + unitTo.update { unitTo -> unitTo?.id?.let { unitsRepo.getById(it) } } + currenciesState.update { CurrencyRateUpdateState.Ready(updateDate) } } catch (e: Exception) { - _currenciesState.update { CurrencyRateUpdateState.Error } + currenciesState.update { CurrencyRateUpdateState.Error } } } } @@ -266,26 +266,27 @@ internal class ConverterViewModel @Inject constructor( userPrefsRepository.updateLatestPairOfUnits(unitFrom = unit, unitTo = pair) } - _loadCurrenciesJob?.cancel() - _currenciesState.update { CurrencyRateUpdateState.Nothing } + loadCurrenciesJob?.cancel() + currenciesState.update { CurrencyRateUpdateState.Nothing } if (unit.group == UnitGroup.CURRENCY) updateCurrencyRates(unit) - _unitFrom.update { + unitFrom.update { // We change from something to base converter or the other way around - if ((it?.group == UnitGroup.NUMBER_BASE) xor (unit.group == UnitGroup.NUMBER_BASE)) + if ((it?.group == UnitGroup.NUMBER_BASE) xor (unit.group == UnitGroup.NUMBER_BASE)) { clearInput() + } unit } - _unitTo.update { pair } + unitTo.update { pair } } fun updateUnitTo(unit: AbstractUnit) { - _unitTo.update { unit } + unitTo.update { unit } viewModelScope.launch { - val unitTo = _unitTo.value ?: return@launch - val unitFrom = _unitFrom.value ?: return@launch + val unitTo = unitTo.value ?: return@launch + val unitFrom = unitFrom.value ?: return@launch unitsRepo.incrementCounter(unitTo) @@ -303,20 +304,22 @@ internal class ConverterViewModel @Inject constructor( ) = viewModelScope.launch(Dispatchers.Default) { val footInchInput = unitFrom.id == UnitID.foot - if (footInchInput) { _calculation.update { null } } + if (footInchInput) { + calculation.update { null } + } // Calculate val calculated1 = try { Expression(input1.text.ifEmpty { Token.Digit._0 }).calculate() } catch (e: ExpressionException.DivideByZero) { - _calculation.update { null } + calculation.update { null } return@launch } catch (e: Exception) { return@launch } // Update calculation - _calculation.update { if (input1.text.isExpression()) calculated1 else null } + calculation.update { if (input1.text.isExpression()) calculated1 else null } // Convert val result: ConverterResult = try { @@ -327,7 +330,7 @@ internal class ConverterViewModel @Inject constructor( val calculated2 = try { Expression(input2.text.ifEmpty { Token.Digit._0 }).calculate() } catch (e: ExpressionException.DivideByZero) { - _calculation.update { null } + calculation.update { null } return@launch } catch (e: Exception) { return@launch @@ -344,7 +347,7 @@ internal class ConverterViewModel @Inject constructor( } // Update result - _result.update { result } + this@ConverterViewModel.result.update { result } } private fun convertNumberBase( @@ -358,7 +361,7 @@ internal class ConverterViewModel @Inject constructor( "" } - _result.update { ConverterResult.NumberBase(conversion) } + result.update { ConverterResult.NumberBase(conversion) } } init { @@ -368,15 +371,15 @@ internal class ConverterViewModel @Inject constructor( val unitFrom = unitsRepo.getById(userPrefs.latestLeftSideUnit) val unitTo = unitsRepo.getById(userPrefs.latestRightSideUnit) - _unitFrom.update { unitFrom } - _unitTo.update { unitTo } + this@ConverterViewModel.unitFrom.update { unitFrom } + this@ConverterViewModel.unitTo.update { unitTo } if (unitFrom.group == UnitGroup.CURRENCY) updateCurrencyRates(unitFrom) } catch (e: NoSuchElementException) { val unitFrom = unitsRepo.getById(UnitID.kilometer) val unitTo = unitsRepo.getById(UnitID.mile) - _unitFrom.update { unitFrom } - _unitTo.update { unitTo } + this@ConverterViewModel.unitFrom.update { unitFrom } + this@ConverterViewModel.unitTo.update { unitTo } } } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt index c9dd489f..899ca49a 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitFromSelectorScreen.kt @@ -100,7 +100,7 @@ private fun UnitFromSelectorScreen( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { Column( - Modifier.background(MaterialTheme.colorScheme.surface) + Modifier.background(MaterialTheme.colorScheme.surface), ) { SearchBar( query = uiState.query, @@ -111,7 +111,7 @@ private fun UnitFromSelectorScreen( toggleFavoritesOnly(!uiState.showFavoritesOnly) } }, - scrollBehavior = scrollBehavior + scrollBehavior = scrollBehavior, ) ChipsRow( @@ -121,10 +121,10 @@ private fun UnitFromSelectorScreen( chosenUnitGroup = uiState.selectedUnitGroup, items = uiState.shownUnitGroups, selectAction = updateUnitGroup, - navigateToSettingsAction = navigateToUnitGroups + navigateToSettingsAction = navigateToUnitGroups, ) } - } + }, ) { paddingValues -> val resources = LocalContext.current.resources UnitsList( @@ -138,7 +138,7 @@ private fun UnitFromSelectorScreen( updateUnitFrom(it) navigateUp() }, - favoriteUnit = { favoriteUnit(it) } + favoriteUnit = { favoriteUnit(it) }, ) } } @@ -155,7 +155,7 @@ private fun UnitFromSelectorScreenPreview() { NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), - ) + ), ) UnitFromSelectorScreen( @@ -174,6 +174,6 @@ private fun UnitFromSelectorScreenPreview() { updateUnitGroup = {}, favoriteUnit = {}, navigateUp = {}, - navigateToUnitGroups = {} + navigateToUnitGroups = {}, ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt index 5bb17a78..f1884d10 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorUIState.kt @@ -57,6 +57,6 @@ internal sealed class UnitSearchResult { data object Loading : UnitSearchResult() data class Success( - val units: Map> + val units: Map>, ) : UnitSearchResult() } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt index 55833ef5..331c2a3d 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitSelectorViewModel.kt @@ -27,10 +27,10 @@ import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.repository.UnitsRepository import com.sadellie.unitto.data.model.repository.UserPreferencesRepository import com.sadellie.unitto.data.model.unit.AbstractUnit -import com.sadellie.unitto.feature.converter.navigation.inputArg -import com.sadellie.unitto.feature.converter.navigation.unitFromIdArg -import com.sadellie.unitto.feature.converter.navigation.unitGroupArg -import com.sadellie.unitto.feature.converter.navigation.unitToIdArg +import com.sadellie.unitto.feature.converter.navigation.INPUT_ARG +import com.sadellie.unitto.feature.converter.navigation.UNIT_FROM_ID_ARG +import com.sadellie.unitto.feature.converter.navigation.UNIT_GROUP_ARG +import com.sadellie.unitto.feature.converter.navigation.UNIT_TO_ID_ARG import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -45,26 +45,26 @@ import javax.inject.Inject internal class UnitSelectorViewModel @Inject constructor( private val userPrefsRepository: UserPreferencesRepository, private val unitsRepo: UnitsRepository, - savedStateHandle: SavedStateHandle + savedStateHandle: SavedStateHandle, ) : ViewModel() { - private val _query = MutableStateFlow(TextFieldValue()) - private val _searchResults = MutableStateFlow(UnitSearchResult.Loading) - private val _selectedUnitGroup = MutableStateFlow(savedStateHandle.get(unitGroupArg)) - private val _unitFromId = savedStateHandle.get(unitFromIdArg) - private val _unitToId = savedStateHandle.get(unitToIdArg) - private val _input = savedStateHandle.get(inputArg) + private val query = MutableStateFlow(TextFieldValue()) + private val searchResults = MutableStateFlow(UnitSearchResult.Loading) + private val selectedUnitGroup = MutableStateFlow(savedStateHandle.get(UNIT_GROUP_ARG)) + private val unitFromId = savedStateHandle.get(UNIT_FROM_ID_ARG) + private val unitToId = savedStateHandle.get(UNIT_TO_ID_ARG) + private val input = savedStateHandle.get(INPUT_ARG) val unitFromUIState: StateFlow = combine( - _query, - _searchResults, - _selectedUnitGroup, + query, + searchResults, + selectedUnitGroup, userPrefsRepository.converterPrefs, ) { query, searchResults, selectedUnitGroup, prefs -> - if (_unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + if (unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading return@combine UnitSelectorUIState.UnitFrom( query = query, - unitFrom = unitsRepo.getById(_unitFromId), + unitFrom = unitsRepo.getById(unitFromId), shownUnitGroups = prefs.shownUnitGroups, showFavoritesOnly = prefs.unitConverterFavoritesOnly, units = searchResults, @@ -74,14 +74,14 @@ internal class UnitSelectorViewModel @Inject constructor( } .mapLatest { ui -> if (ui is UnitSelectorUIState.UnitFrom) { - _searchResults.update { + searchResults.update { val result = unitsRepo.filterUnits( query = ui.query.text, unitGroup = ui.selectedUnitGroup, favoritesOnly = ui.showFavoritesOnly, hideBrokenUnits = false, sorting = ui.sorting, - shownUnitGroups = ui.shownUnitGroups + shownUnitGroups = ui.shownUnitGroups, ) if (result.isEmpty()) UnitSearchResult.Empty else UnitSearchResult.Success(result) @@ -93,21 +93,21 @@ internal class UnitSelectorViewModel @Inject constructor( .stateIn(viewModelScope, UnitSelectorUIState.Loading) val unitToUIState: StateFlow = combine( - _query, - _searchResults, + query, + searchResults, userPrefsRepository.converterPrefs, unitsRepo.units, ) { query, searchResults, prefs, _ -> - if (_unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading - if (_unitToId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + if (unitFromId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading + if (unitToId.isNullOrEmpty()) return@combine UnitSelectorUIState.Loading UnitSelectorUIState.UnitTo( query = query, - unitFrom = unitsRepo.getById(_unitFromId), - unitTo = unitsRepo.getById(_unitToId), + unitFrom = unitsRepo.getById(unitFromId), + unitTo = unitsRepo.getById(unitToId), showFavoritesOnly = prefs.unitConverterFavoritesOnly, units = searchResults, - input = _input, + input = input, sorting = prefs.unitConverterSorting, scale = prefs.precision, outputFormat = prefs.outputFormat, @@ -116,7 +116,7 @@ internal class UnitSelectorViewModel @Inject constructor( } .mapLatest { ui -> if (ui is UnitSelectorUIState.UnitTo) { - _searchResults.update { + searchResults.update { if (ui.unitFrom.group == UnitGroup.CURRENCY) unitsRepo.updateRates(ui.unitFrom) val result = unitsRepo.filterUnits( @@ -134,13 +134,13 @@ internal class UnitSelectorViewModel @Inject constructor( } .stateIn(viewModelScope, UnitSelectorUIState.Loading) - fun updateSelectorQuery(value: TextFieldValue) = _query.update { value } + fun updateSelectorQuery(value: TextFieldValue) = query.update { value } fun updateShowFavoritesOnly(value: Boolean) = viewModelScope.launch { userPrefsRepository.updateUnitConverterFavoritesOnly(value) } - fun updateSelectedUnitGroup(value: UnitGroup?) = _selectedUnitGroup.update { value } + fun updateSelectedUnitGroup(value: UnitGroup?) = selectedUnitGroup.update { value } fun favoriteUnit(unit: AbstractUnit) = viewModelScope.launch(Dispatchers.IO) { unitsRepo.favorite(unit) diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt index b423e98b..17f6fbcc 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/UnitToSelectorScreen.kt @@ -94,9 +94,9 @@ private fun UnitToSelectorScreen( toggleFavoritesOnly(!uiState.showFavoritesOnly) } }, - scrollBehavior = scrollBehavior + scrollBehavior = scrollBehavior, ) - } + }, ) { paddingValues -> val resources = LocalContext.current.resources UnitsList( @@ -120,7 +120,7 @@ private fun UnitToSelectorScreen( updateUnitTo(it) navigateUp() }, - favoriteUnit = { favoriteUnit(it) } + favoriteUnit = { favoriteUnit(it) }, ) } } @@ -176,7 +176,7 @@ private fun UnitToSelectorPreview() { NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), - ) + ), ) UnitToSelectorScreen( @@ -197,6 +197,6 @@ private fun UnitToSelectorPreview() { updateUnitTo = {}, favoriteUnit = {}, navigateUp = {}, - navigateToUnitGroups = {} + navigateToUnitGroups = {}, ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/BasicUnitListItem.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/BasicUnitListItem.kt index 913cc0a7..16ddca93 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/BasicUnitListItem.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/BasicUnitListItem.kt @@ -69,23 +69,23 @@ internal fun BasicUnitListItem( .clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(), - onClick = onClick + onClick = onClick, ) - .padding(horizontal = 12.dp) + .padding(horizontal = 12.dp), ) { Row( modifier = Modifier .background( if (isSelected) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, - RoundedCornerShape(24.dp) + RoundedCornerShape(24.dp), ) .padding(paddingValues = PaddingValues(horizontal = 12.dp, vertical = 8.dp)) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) + horizontalArrangement = Arrangement.spacedBy(16.dp), ) { Column( - Modifier.weight(1f), // This makes additional composable to be seen + Modifier.weight(1f), ) { Text( modifier = Modifier @@ -102,7 +102,7 @@ internal fun BasicUnitListItem( style = MaterialTheme.typography.bodySmall, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = itemColor + color = itemColor, ) } AnimatedContent( @@ -110,18 +110,18 @@ internal fun BasicUnitListItem( .clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = favoriteUnit + onClick = favoriteUnit, ), targetState = isFavorite, transitionSpec = { (scaleIn() togetherWith scaleOut()).using(SizeTransform(clip = false)) }, - label = "Favorite unit" + label = "Favorite unit", ) { Icon( imageVector = if (it) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder, contentDescription = stringResource(R.string.converter_favorite_button_description), - tint = itemColor + tint = itemColor, ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt index 7f3e4251..a1773459 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ChipsRow.kt @@ -73,7 +73,7 @@ internal fun ChipsRow( targetState = expanded, transitionSpec = { expandVertically(expandFrom = Alignment.Top) { it } + fadeIn() togetherWith - shrinkVertically(shrinkTowards = Alignment.Top) { it } + fadeOut() + shrinkVertically(shrinkTowards = Alignment.Top) { it } + fadeOut() }, label = "Expand chips row", ) { isExpanded -> @@ -86,9 +86,9 @@ internal fun ChipsRow( FilterChip( modifier = chipModifier, isSelected = selected, - onClick = { + onClick = { selectAction(if (selected) null else item) - expanded = false + expanded = false }, label = stringResource(item.res), ) @@ -98,7 +98,7 @@ internal fun ChipsRow( modifier = chipModifier, onClick = navigateToSettingsAction, imageVector = Icons.Default.Settings, - contentDescription = stringResource(R.string.open_settings_label) + contentDescription = stringResource(R.string.open_settings_label), ) if (expanded) { @@ -106,7 +106,8 @@ internal fun ChipsRow( modifier = chipModifier, onClick = { expanded = false }, imageVector = Icons.Default.ExpandLess, - contentDescription = "" // TODO + // TODO + contentDescription = "", ) } }, @@ -115,7 +116,8 @@ internal fun ChipsRow( modifier = chipModifier, onClick = { expanded = true }, imageVector = Icons.Default.ExpandMore, - contentDescription = "" // TODO + // TODO + contentDescription = "", ) }, ) @@ -139,7 +141,7 @@ private fun FlexRow( expandContent: @Composable () -> Unit, ) { SubcomposeLayout( - modifier = modifier + modifier = modifier, ) { constraints -> val localConstraints = constraints.copy(minWidth = 0, minHeight = 0) val layoutWidth = localConstraints.maxWidth @@ -147,7 +149,7 @@ private fun FlexRow( val mainMeasurables = subcompose(FlexRowSlots.Main, mainContent) val expandMeasurables = subcompose( slotId = FlexRowSlots.Expand, - content = { expandContent() } + content = { expandContent() }, ).map { it.measure(localConstraints) } @@ -163,7 +165,7 @@ private fun FlexRow( val lastAvailableRow = placeables.size >= maxRows val notLastItem = index < mainMeasurables.lastIndex - // count expandContent width only for last row and not last main placeable + // count expandContent width only for last row and not last main placeable val measuredWidth = if (lastAvailableRow and notLastItem) { mainPlaceable.measuredWidth + expandContentWidth } else { diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt index e54714e7..6d59d877 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/ConverterKeyboard.kt @@ -30,11 +30,10 @@ import com.sadellie.unitto.core.base.R 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.KeyboardButtonContentHeightShort -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.KeyboardButtonTertiary +import com.sadellie.unitto.core.ui.common.KeyboardButtonToken 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 @@ -80,12 +79,12 @@ internal fun DefaultKeyboard( ) { val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } - val contentHeight: Float = if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) KeyboardButtonContentHeightShort else KeyboardButtonContentHeightTall + val contentHeight: Float = if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) KeyboardButtonToken.CONTENT_HEIGHT_SHORT else KeyboardButtonToken.CONTENT_HEIGHT_TALL KeypadFlow( modifier = modifier, rows = 5, - columns = 4 + columns = 4, ) { width, height -> val bModifier = Modifier.fillMaxWidth(width).fillMaxHeight(height) @@ -133,12 +132,12 @@ internal fun NumberBaseKeyboard( clearInput: () -> Unit, deleteDigit: () -> Unit, ) { - val contentHeight: Float = if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) KeyboardButtonContentHeightShort else KeyboardButtonContentHeightTall + val contentHeight: Float = if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) KeyboardButtonToken.CONTENT_HEIGHT_SHORT else KeyboardButtonToken.CONTENT_HEIGHT_TALL KeypadFlow( modifier = modifier, rows = 6, - columns = 3 + columns = 3, ) { width, height -> val bModifier = Modifier.fillMaxWidth(width).fillMaxHeight(height) val wideButtonModifier = Modifier.fillMaxHeight(height).fillMaxWidth(width * 2) @@ -180,7 +179,7 @@ private fun PreviewConverterKeyboard() { fractional = Token.PERIOD, middleZero = false, acButton = true, - addBracket = {} + addBracket = {}, ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/FavoritesButton.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/FavoritesButton.kt index bcd9745d..3af0222f 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/FavoritesButton.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/FavoritesButton.kt @@ -35,7 +35,7 @@ import com.sadellie.unitto.core.ui.common.SearchBarIconButton @Composable internal fun FavoritesButton( state: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { SearchBarIconButton(onClick = onClick) { AnimatedContent( @@ -43,11 +43,11 @@ internal fun FavoritesButton( transitionSpec = { (scaleIn() togetherWith scaleOut()).using(SizeTransform(clip = false)) }, - label = "Animated click" + label = "Animated click", ) { Icon( if (it) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder, - contentDescription = stringResource(R.string.converter_favorite_button_description) + contentDescription = stringResource(R.string.converter_favorite_button_description), ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitGroupHeader.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitGroupHeader.kt index dc0c5fb9..9b260aa0 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitGroupHeader.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitGroupHeader.kt @@ -31,6 +31,6 @@ internal fun UnitGroupHeader(modifier: Modifier, unitGroup: UnitGroup) { Header( text = stringResource(unitGroup.res), modifier = modifier, - paddingValues = PaddingValues(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 12.dp) + paddingValues = PaddingValues(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 12.dp), ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt index d163254f..b673baef 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt @@ -49,7 +49,7 @@ internal fun UnitSelectionButton( modifier: Modifier = Modifier, onClick: () -> Unit = {}, label: String, - enabled: Boolean = true + enabled: Boolean = true, ) { Button( modifier = modifier, @@ -63,21 +63,21 @@ internal fun UnitSelectionButton( transitionSpec = { if (targetState > initialState) { (slideInVertically { height -> height } + fadeIn()) togetherWith - slideOutVertically { height -> -height } + fadeOut() + slideOutVertically { height -> -height } + fadeOut() } else { (slideInVertically { height -> -height } + fadeIn()) togetherWith - slideOutVertically { height -> height } + fadeOut() + slideOutVertically { height -> height } + fadeOut() }.using( - SizeTransform(clip = false) + SizeTransform(clip = false), ) }, - label = "Unit change" + label = "Unit change", ) { Text( text = it, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = MaterialTheme.colorScheme.onPrimaryContainer + color = MaterialTheme.colorScheme.onPrimaryContainer, ) } } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt index 743c5316..3dcf5993 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitsList.kt @@ -49,11 +49,11 @@ internal fun UnitsList( Crossfade( modifier = modifier, targetState = searchResult, - label = "Units list" + label = "Units list", ) { result -> when (result) { is UnitSearchResult.Success -> LazyColumn( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize(), ) { result.units.forEach { (group, units) -> item(group.name) { @@ -77,7 +77,7 @@ internal fun UnitsList( UnitSearchResult.Empty -> SearchPlaceholder( onButtonClick = navigateToUnitGroups, supportText = stringResource(R.string.converter_no_results_support), - buttonLabel = stringResource(R.string.open_settings_label) + buttonLabel = stringResource(R.string.open_settings_label), ) UnitSearchResult.Loading -> Unit @@ -98,7 +98,7 @@ private fun PreviewUnitsList() { NormalUnit(UnitID.foot, BigDecimal("304800000000000000"), UnitGroup.LENGTH, R.string.unit_foot, R.string.unit_foot_short), NormalUnit(UnitID.yard, BigDecimal("914400000000000000"), UnitGroup.LENGTH, R.string.unit_yard, R.string.unit_yard_short), NormalUnit(UnitID.mile, BigDecimal("1609344000000000000000"), UnitGroup.LENGTH, R.string.unit_mile, R.string.unit_mile_short), - ) + ), ) UnitsList( @@ -108,6 +108,6 @@ private fun PreviewUnitsList() { currentUnitId = UnitID.mile, supportLabel = { resources.getString(it.shortName) }, onClick = {}, - favoriteUnit = {} + favoriteUnit = {}, ) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt index fe8a3c85..507f40d7 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt @@ -41,13 +41,13 @@ private val start = DrawerItem.Converter.start private const val UNIT_FROM = "unitFromSelector" private const val UNIT_TO = "unitToSelector" -internal const val unitGroupArg = "unitGroupArg" -internal const val unitFromIdArg = "unitFromId" -internal const val unitToIdArg = "unitToIdArg" -internal const val inputArg = "inputArg" +internal const val UNIT_GROUP_ARG = "unitGroupArg" +internal const val UNIT_FROM_ID_ARG = "unitFromIdArg" +internal const val UNIT_TO_ID_ARG = "unitToIdArg" +internal const val INPUT_ARG = "inputArg" -private const val UNIT_FROM_ROUTE = "$UNIT_FROM/{$unitFromIdArg}/{$unitGroupArg}" -private const val UNIT_TO_ROUTE = "$UNIT_TO/{$unitFromIdArg}/{$unitToIdArg}/{$inputArg}" +private const val UNIT_FROM_ROUTE = "$UNIT_FROM/{$UNIT_FROM_ID_ARG}/{$UNIT_GROUP_ARG}" +private const val UNIT_TO_ROUTE = "$UNIT_TO/{$UNIT_FROM_ID_ARG}/{$UNIT_TO_ID_ARG}/{$INPUT_ARG}" private fun NavHostController.navigateLeft( unitFromId: String, unitGroup: UnitGroup, @@ -68,8 +68,8 @@ fun NavGraphBuilder.converterGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { backStackEntry -> val parentEntry = remember(backStackEntry) { @@ -83,11 +83,13 @@ fun NavGraphBuilder.converterGraph( // Navigation logic is here, but should actually be in ConverterScreen navigateToLeftScreen = { uiState: UnitConverterUIState -> when (uiState) { - is UnitConverterUIState.Default -> navController - .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) + is UnitConverterUIState.Default -> + navController + .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) - is UnitConverterUIState.NumberBase -> navController - .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) + is UnitConverterUIState.NumberBase -> + navController + .navigateLeft(uiState.unitFrom.id, uiState.unitFrom.group) else -> Unit } @@ -110,7 +112,7 @@ fun NavGraphBuilder.converterGraph( navController.navigateRight( uiState.unitFrom.id, uiState.unitTo.id, - input + input, ) } @@ -119,7 +121,7 @@ fun NavGraphBuilder.converterGraph( navController.navigateRight( uiState.unitFrom.id, uiState.unitTo.id, - input + input, ) } @@ -133,13 +135,13 @@ fun NavGraphBuilder.converterGraph( unittoComposable( route = UNIT_FROM_ROUTE, arguments = listOf( - navArgument(unitFromIdArg) { + navArgument(UNIT_FROM_ID_ARG) { type = NavType.StringType }, - navArgument(unitGroupArg) { + navArgument(UNIT_GROUP_ARG) { type = NavType.EnumType(UnitGroup::class.java) }, - ) + ), ) { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry(graph) @@ -151,25 +153,25 @@ fun NavGraphBuilder.converterGraph( unitSelectorViewModel = hiltViewModel(), converterViewModel = parentViewModel, navigateUp = navController::navigateUp, - navigateToUnitGroups = navigateToUnitGroups + navigateToUnitGroups = navigateToUnitGroups, ) } unittoComposable( route = UNIT_TO_ROUTE, arguments = listOf( - navArgument(unitFromIdArg) { + navArgument(UNIT_FROM_ID_ARG) { type = NavType.StringType }, - navArgument(unitToIdArg) { + navArgument(UNIT_TO_ID_ARG) { type = NavType.StringType }, - navArgument(inputArg) { + navArgument(INPUT_ARG) { type = NavType.StringType nullable = true defaultValue = null }, - ) + ), ) { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry(graph) @@ -181,7 +183,7 @@ fun NavGraphBuilder.converterGraph( unitSelectorViewModel = hiltViewModel(), converterViewModel = parentViewModel, navigateUp = navController::navigateUp, - navigateToUnitGroups = navigateToUnitGroups + navigateToUnitGroups = navigateToUnitGroups, ) } } 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 0f089140..d0636a7b 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 @@ -81,14 +81,14 @@ internal fun DateCalculatorScreen( pagerState.animateScrollToPage(index) } }, - text = { Text(tab) } + text = { Text(tab) }, ) } } HorizontalPager( state = pagerState, - verticalAlignment = Alignment.Top + verticalAlignment = Alignment.Top, ) { page -> when (page) { 0 -> AddSubtractPage() 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 6c2ee122..7a7b6f90 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 @@ -98,7 +98,7 @@ internal fun AddSubtractPage( @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable private fun AddSubtractView( - uiState: AddSubtractState, + uiState: AddSubtractUIState, updateStart: (ZonedDateTime) -> Unit, updateYears: (TextFieldValue) -> Unit, updateMonths: (TextFieldValue) -> Unit, @@ -124,7 +124,7 @@ private fun AddSubtractView( FloatingActionButton( onClick = { mContext.createEvent(uiState.start, uiState.result) - } + }, ) { Icon( imageVector = Icons.Default.Event, @@ -132,7 +132,7 @@ private fun AddSubtractView( ) } }, - contentWindowInsets = WindowInsets(0, 0, 0, 0) + contentWindowInsets = WindowInsets(0, 0, 0, 0), ) { Column( modifier = Modifier @@ -140,17 +140,16 @@ private fun AddSubtractView( .padding(horizontal = 16.dp, vertical = 16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { - AnimatedContent( targetState = showResult, label = "Reveal result", transitionSpec = { fadeIn() togetherWith fadeOut() using SizeTransform() }, - modifier = Modifier.clip(RoundedCornerShape(32.dp)) + modifier = Modifier.clip(RoundedCornerShape(32.dp)), ) { show -> FlowRow( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { DateTimeSelectorBlock( modifier = Modifier @@ -184,7 +183,7 @@ private fun AddSubtractView( selected = uiState.addition, onClick = { updateAddition(true) }, shape = SegmentedButtonDefaults.itemShape(index = 0, count = 2), - icon = {} + icon = {}, ) { Icon(Icons.Outlined.Add, stringResource(R.string.date_calculator_add)) } @@ -192,11 +191,11 @@ private fun AddSubtractView( selected = !uiState.addition, onClick = { updateAddition(false) }, shape = SegmentedButtonDefaults.itemShape(index = 1, count = 2), - icon = {} + icon = {}, ) { Icon( Icons.Outlined.Remove, - stringResource(R.string.date_calculator_subtract) + stringResource(R.string.date_calculator_subtract), ) } } @@ -206,10 +205,10 @@ private fun AddSubtractView( .fillMaxWidth() .background( MaterialTheme.colorScheme.secondaryContainer, - RoundedCornerShape(32.dp) + RoundedCornerShape(32.dp), ) .padding(16.dp, 24.dp), - verticalArrangement = Arrangement.spacedBy(4.dp) + verticalArrangement = Arrangement.spacedBy(4.dp), ) { TimeUnitTextField( modifier = Modifier.fillMaxWidth(), @@ -221,7 +220,7 @@ private fun AddSubtractView( Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { TimeUnitTextField( modifier = Modifier.weight(1f), @@ -242,7 +241,7 @@ private fun AddSubtractView( Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { TimeUnitTextField( modifier = Modifier.weight(1f), @@ -258,7 +257,7 @@ private fun AddSubtractView( onValueChange = updateMinutes, label = stringResource(R.string.date_calculator_minutes), expressionFormatter = expressionTransformer, - imeAction = ImeAction.Done + imeAction = ImeAction.Done, ) } } @@ -296,10 +295,10 @@ private fun Context.createEvent(start: ZonedDateTime, end: ZonedDateTime) { @Composable fun AddSubtractViewPreview() { AddSubtractView( - uiState = AddSubtractState( + uiState = AddSubtractUIState( years = TextFieldValue("12"), start = ZonedDateTimeUtils.nowWithMinutes(), - result = ZonedDateTimeUtils.nowWithMinutes().plusSeconds(1) + result = ZonedDateTimeUtils.nowWithMinutes().plusSeconds(1), ), updateStart = {}, updateYears = {}, diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt index 4dd24005..8980a600 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractUIState.kt @@ -24,7 +24,7 @@ import com.sadellie.unitto.core.base.Token import com.sadellie.unitto.feature.datecalculator.ZonedDateTimeUtils import java.time.ZonedDateTime -internal data class AddSubtractState( +internal data class AddSubtractUIState( val start: ZonedDateTime = ZonedDateTimeUtils.nowWithMinutes(), val result: ZonedDateTime = ZonedDateTimeUtils.nowWithMinutes(), val years: TextFieldValue = TextFieldValue(), diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt index 478c238e..e5e312ef 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/addsubtract/AddSubtractViewModel.kt @@ -38,18 +38,18 @@ import javax.inject.Inject @HiltViewModel internal class AddSubtractViewModel @Inject constructor( - userPreferencesRepository: UserPreferencesRepository + userPreferencesRepository: UserPreferencesRepository, ) : ViewModel() { - private val _uiState = MutableStateFlow(AddSubtractState()) + private val _uiState = MutableStateFlow(AddSubtractUIState()) - val uiState: StateFlow = _uiState + val uiState: StateFlow = _uiState .combine(userPreferencesRepository.addSubtractPrefs) { uiState, userPrefs -> return@combine uiState.copy( formatterSymbols = userPrefs.formatterSymbols, ) } .onEach { updateResult() } - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), AddSubtractState()) + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), AddSubtractUIState()) fun updateStart(newValue: ZonedDateTime) = _uiState.update { it.copy(start = newValue) } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeDialogs.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeDialogs.kt index fe5f9990..a6e680c3 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeDialogs.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeDialogs.kt @@ -68,7 +68,7 @@ internal fun DateTimeDialogs( onConfirm = { updateDate(it) updateDialogState(DialogState.NONE) - } + }, ) } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt index 113c003a..a03a434e 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeResultBlock.kt @@ -38,7 +38,7 @@ import java.math.BigDecimal internal fun DateTimeResultBlock( modifier: Modifier = Modifier, diff: ZonedDateTimeDifference.Default, - format: (BigDecimal) -> String + format: (BigDecimal) -> String, ) { val focusManager = LocalFocusManager.current @@ -46,17 +46,17 @@ internal fun DateTimeResultBlock( modifier = modifier, pageCount = 6, onClick = { focusManager.clearFocus() }, - backgroundColor = MaterialTheme.colorScheme.tertiaryContainer + backgroundColor = MaterialTheme.colorScheme.tertiaryContainer, ) { currentPage -> - when(currentPage) { + when (currentPage) { 0 -> { Column( modifier = Modifier - .fillMaxWidth() + .fillMaxWidth(), ) { Text( text = stringResource(R.string.date_calculator_difference), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { Column { @@ -93,7 +93,7 @@ internal fun DateTimeResultBlock( Column { Text( text = stringResource(R.string.date_calculator_years), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { DateText(diff.sumYears, format) @@ -105,7 +105,7 @@ internal fun DateTimeResultBlock( Column { Text( text = stringResource(R.string.date_calculator_months), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { DateText(diff.sumMonths, format) @@ -117,7 +117,7 @@ internal fun DateTimeResultBlock( Column { Text( text = stringResource(R.string.date_calculator_days), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { DateText(diff.sumDays, format) @@ -129,7 +129,7 @@ internal fun DateTimeResultBlock( Column { Text( text = stringResource(R.string.date_calculator_hours), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { DateText(diff.sumHours, format) @@ -141,7 +141,7 @@ internal fun DateTimeResultBlock( Column { Text( text = stringResource(R.string.date_calculator_minutes), - style = MaterialTheme.typography.labelMedium + style = MaterialTheme.typography.labelMedium, ) SelectionContainer { DateText(diff.sumMinutes, format) @@ -159,7 +159,7 @@ private fun DateText( format: (BigDecimal) -> String, ) = Text( text = "${stringResource(id)}: ${format(value)}", - style = MaterialTheme.typography.displaySmall + style = MaterialTheme.typography.displaySmall, ) @Composable @@ -168,7 +168,7 @@ private fun DateText( format: (BigDecimal) -> String, ) = Text( text = format(value), - style = MaterialTheme.typography.displaySmall + style = MaterialTheme.typography.displaySmall, ) @Preview @@ -188,6 +188,6 @@ private fun DateTimeResultBlockPreview() { sumHours = BigDecimal.ZERO, sumMinutes = BigDecimal("46080"), ), - format = { it.toPlainString() } + format = { it.toPlainString() }, ) } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeSelectorBlock.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeSelectorBlock.kt index bede241c..0bef74ea 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeSelectorBlock.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/components/DateTimeSelectorBlock.kt @@ -68,7 +68,7 @@ internal fun DateTimeSelectorBlock( val is24Hour = DateFormat.is24HourFormat(LocalContext.current) ProvideColor( - MaterialTheme.colorScheme.contentColorFor(containerColor) + MaterialTheme.colorScheme.contentColorFor(containerColor), ) { Column( modifier = Modifier @@ -76,12 +76,12 @@ internal fun DateTimeSelectorBlock( onClick = onClick, onLongClick = onLongClick, interactionSource = remember { MutableInteractionSource() }, - cornerRadiusRange = 8.dp..32.dp + cornerRadiusRange = 8.dp..32.dp, ) .background(containerColor) .then(modifier) .padding(16.dp), - horizontalAlignment = Alignment.Start + horizontalAlignment = Alignment.Start, ) { Text( text = title, @@ -93,22 +93,22 @@ internal fun DateTimeSelectorBlock( modifier = Modifier.clickable( indication = rememberRipple(), interactionSource = remember { MutableInteractionSource() }, - onClick = onTimeClick - ) + onClick = onTimeClick, + ), ) { AnimatedContent( targetState = dateTime, transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith - slideOutVertically { height -> -height } + fadeOut() using - SizeTransform() + slideOutVertically { height -> -height } + fadeOut() using + SizeTransform() }, label = "Animated time", ) { time -> Text( text = time.formatTimeShort(locale, is24Hour), style = MaterialTheme.typography.displaySmall, - maxLines = 1 + maxLines = 1, ) } @@ -117,15 +117,15 @@ internal fun DateTimeSelectorBlock( targetState = dateTime, transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith - slideOutVertically { height -> -height } + fadeOut() using - SizeTransform() + slideOutVertically { height -> -height } + fadeOut() using + SizeTransform() }, label = "Animated am/pm", ) { time -> Text( text = time.formatTimeAmPm(locale), style = MaterialTheme.typography.bodyLarge, - maxLines = 1 + maxLines = 1, ) } } @@ -135,8 +135,8 @@ internal fun DateTimeSelectorBlock( targetState = dateTime, transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith - slideOutVertically { height -> -height } + fadeOut() using - SizeTransform() + slideOutVertically { height -> -height } + fadeOut() using + SizeTransform() }, label = "Animated date", ) { date -> @@ -144,11 +144,11 @@ internal fun DateTimeSelectorBlock( modifier = Modifier.clickable( indication = rememberRipple(), interactionSource = remember { MutableInteractionSource() }, - onClick = onDateClick + onClick = onDateClick, ), text = date.formatDateWeekDayMonthYear(locale), style = MaterialTheme.typography.bodySmall, - maxLines = 1 + maxLines = 1, ) } } 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 6d4f44ef..8426cb4c 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 @@ -51,6 +51,6 @@ internal fun TimeUnitTextField( unfocusedTextColor = MaterialTheme.colorScheme.onSecondaryContainer, ), expressionFormatter = expressionFormatter, - imeAction = imeAction + imeAction = imeAction, ) } diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt index 61c85ce6..b8a0b9a3 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferencePage.kt @@ -64,7 +64,7 @@ internal fun DateDifferencePage( is DifferenceUIState.Ready -> DateDifferenceView( uiState = uiState, setStartDate = viewModel::setStartDate, - setEndDate = viewModel::setEndDate + setEndDate = viewModel::setEndDate, ) } } @@ -81,7 +81,7 @@ private fun DateDifferenceView( modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()), - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { FlowRow( modifier = Modifier @@ -89,7 +89,7 @@ private fun DateDifferenceView( .fillMaxWidth(), maxItemsInEachRow = 2, verticalArrangement = Arrangement.spacedBy(8.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { DateTimeSelectorBlock( modifier = Modifier @@ -102,7 +102,7 @@ private fun DateDifferenceView( onLongClick = { setStartDate(ZonedDateTimeUtils.nowWithMinutes()) }, onTimeClick = { dialogState = DialogState.FROM_TIME }, onDateClick = { dialogState = DialogState.FROM_DATE }, - containerColor = MaterialTheme.colorScheme.secondaryContainer + containerColor = MaterialTheme.colorScheme.secondaryContainer, ) DateTimeSelectorBlock( @@ -116,14 +116,14 @@ private fun DateDifferenceView( onLongClick = { setEndDate(ZonedDateTimeUtils.nowWithMinutes()) }, onTimeClick = { dialogState = DialogState.TO_TIME }, onDateClick = { dialogState = DialogState.TO_DATE }, - containerColor = MaterialTheme.colorScheme.secondaryContainer + containerColor = MaterialTheme.colorScheme.secondaryContainer, ) } AnimatedContent( targetState = uiState.result, label = "Result reveal", - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { result -> when (result) { is ZonedDateTimeDifference.Default -> { @@ -135,7 +135,7 @@ private fun DateDifferenceView( format = { it.format(uiState.precision, uiState.outputFormat) .formatExpression(uiState.formatterSymbols) - } + }, ) } ZonedDateTimeDifference.Zero -> Unit @@ -164,7 +164,6 @@ private fun DateDifferenceView( ) } - @Preview @Composable fun DateDifferenceViewPreview() { @@ -186,7 +185,7 @@ fun DateDifferenceViewPreview() { ), precision = 3, outputFormat = OutputFormat.PLAIN, - formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD) + formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), ), setStartDate = {}, setEndDate = {}, diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt index 35e50f74..faa61c59 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/DateDifferenceViewModel.kt @@ -38,46 +38,47 @@ import javax.inject.Inject internal class DateDifferenceViewModel @Inject constructor( userPrefsRepository: UserPreferencesRepository, ) : ViewModel() { - private val _start = MutableStateFlow(ZonedDateTimeUtils.nowWithMinutes()) - private val _end = MutableStateFlow(ZonedDateTimeUtils.nowWithMinutes()) - private val _result = MutableStateFlow(ZonedDateTimeDifference.Zero) + private val start = MutableStateFlow(ZonedDateTimeUtils.nowWithMinutes()) + private val end = MutableStateFlow(ZonedDateTimeUtils.nowWithMinutes()) + private val result = MutableStateFlow(ZonedDateTimeDifference.Zero) val uiState: StateFlow = combine( userPrefsRepository.formattingPrefs, - _start, - _end, - _result + start, + end, + result, ) { prefs, start, end, result -> - return@combine DifferenceUIState.Ready( - start = start, - end = end, - result = result, - precision = prefs.digitsPrecision, - outputFormat = prefs.outputFormat, - formatterSymbols = prefs.formatterSymbols - ) - } + return@combine DifferenceUIState.Ready( + start = start, + end = end, + result = result, + precision = prefs.digitsPrecision, + outputFormat = prefs.outputFormat, + formatterSymbols = prefs.formatterSymbols, + ) + } .mapLatest { ui -> updateResult( start = ui.start, - end = ui.end + end = ui.end, ) ui } .stateIn( - viewModelScope, DifferenceUIState.Loading + viewModelScope, + DifferenceUIState.Loading, ) - fun setStartDate(newValue: ZonedDateTime) = _start.update { newValue } + fun setStartDate(newValue: ZonedDateTime) = start.update { newValue } - fun setEndDate(newValue: ZonedDateTime) = _end.update { newValue } + fun setEndDate(newValue: ZonedDateTime) = end.update { newValue } private fun updateResult( start: ZonedDateTime, - end: ZonedDateTime + end: ZonedDateTime, ) = viewModelScope.launch(Dispatchers.Default) { - _result.update { + result.update { try { start - end } catch (e: Exception) { diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifference.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifference.kt index bfd9ed61..c75ea522 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifference.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifference.kt @@ -49,7 +49,7 @@ internal sealed class ZonedDateTimeDifference { * @return [ZonedDateTimeDifference.Default] (_always positive_) or [ZonedDateTimeDifference.Zero] */ internal infix operator fun ZonedDateTime.minus( - zonedDateTime: ZonedDateTime + zonedDateTime: ZonedDateTime, ): ZonedDateTimeDifference = this.minus(zonedDateTime = zonedDateTime, scale = MAX_PRECISION) /** @@ -64,7 +64,7 @@ internal infix operator fun ZonedDateTime.minus( */ internal fun ZonedDateTime.minus( zonedDateTime: ZonedDateTime, - scale: Int + scale: Int, ): ZonedDateTimeDifference { // https://stackoverflow.com/a/25760725 diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt index f1bc0ab6..a6ad42bc 100644 --- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt +++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt @@ -35,8 +35,8 @@ fun NavGraphBuilder.dateCalculatorGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { DateCalculatorRoute( diff --git a/feature/datecalculator/src/test/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifferenceKtTest.kt b/feature/datecalculator/src/test/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifferenceKtTest.kt index d509842b..b092e84b 100644 --- a/feature/datecalculator/src/test/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifferenceKtTest.kt +++ b/feature/datecalculator/src/test/java/com/sadellie/unitto/feature/datecalculator/difference/ZonedDateTimeDifferenceKtTest.kt @@ -40,20 +40,20 @@ class ZonedDateTimeDifferenceKtTest { val date2: ZonedDateTime = ZonedDateTime.parse("2023-05-02T12:00+01:00[Europe/Paris]", formatter) assertEquals( - ZonedDateTimeDifference. - Default( - years = 0, - months = 0, - days = 1, - hours = 0, - minutes = 0, - sumYears = BigDecimal("0.003"), - sumMonths = BigDecimal("0.033"), - sumDays = BigDecimal("1.000"), - sumHours = BigDecimal("24.000"), - sumMinutes = BigDecimal("1440.000"), - ), - date1.minus(date2, 3) + ZonedDateTimeDifference + .Default( + years = 0, + months = 0, + days = 1, + hours = 0, + minutes = 0, + sumYears = BigDecimal("0.003"), + sumMonths = BigDecimal("0.033"), + sumDays = BigDecimal("1.000"), + sumHours = BigDecimal("24.000"), + sumMinutes = BigDecimal("1440.000"), + ), + date1.minus(date2, 3), ) } @@ -75,7 +75,7 @@ class ZonedDateTimeDifferenceKtTest { sumHours = BigDecimal("744.000"), sumMinutes = BigDecimal("44640.000"), ), - date1.minus(date2, 3) + date1.minus(date2, 3), ) } @@ -97,7 +97,7 @@ class ZonedDateTimeDifferenceKtTest { sumHours = BigDecimal("24.000"), sumMinutes = BigDecimal("1440.000"), ), - date1.minus(date2, 3) + date1.minus(date2, 3), ) } @@ -119,7 +119,7 @@ class ZonedDateTimeDifferenceKtTest { sumHours = BigDecimal("744.000"), sumMinutes = BigDecimal("44640.000"), ), - date1.minus(date2, 3) + date1.minus(date2, 3), ) } @@ -141,7 +141,7 @@ class ZonedDateTimeDifferenceKtTest { sumHours = BigDecimal("720.000"), sumMinutes = BigDecimal("43200.000"), ), - date1.minus(date2, 3) + date1.minus(date2, 3), ) } } diff --git a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt index bdc214b2..a478309e 100644 --- a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt +++ b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/CalculatorWidget.kt @@ -74,7 +74,7 @@ class CalculatorWidget : GlanceAppWidget() { } override val sizeMode = SizeMode.Responsive( - setOf(SMALL, BIG) + setOf(SMALL, BIG), ) override val stateDefinition: GlanceStateDefinition<*> = PreferencesGlanceStateDefinition @@ -119,7 +119,7 @@ private fun LoadingUI() { .appWidgetBackground() .background(GlanceTheme.colors.background) .fillMaxSize(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { IconButton( glanceModifier = GlanceModifier, @@ -142,19 +142,19 @@ private fun ReadyUI( fun runCalculateAction( input: String, - equalClicked: Boolean = false + equalClicked: Boolean = false, ): Action = updateInputAction( input = input, equalClicked = equalClicked, precision = appPrefs.precision, - outputFormat = appPrefs.outputFormat + outputFormat = appPrefs.outputFormat, ) Column( modifier = GlanceModifier .appWidgetBackground() .background(GlanceTheme.colors.background) - .fillMaxSize() + .fillMaxSize(), ) { val uiSectionModifier = GlanceModifier.fillMaxWidth() @@ -163,7 +163,7 @@ private fun ReadyUI( modifier = uiSectionModifier .background(GlanceTheme.colors.surfaceVariant), output = output, - formatterSymbols = formatterSymbols + formatterSymbols = formatterSymbols, ) } @@ -173,7 +173,7 @@ private fun ReadyUI( .defaultWeight(), input = input, formatterSymbols = formatterSymbols, - output = output + output = output, ) GlanceKeyboard( @@ -182,7 +182,7 @@ private fun ReadyUI( runCalculateAction( // Clear input if equal is clicked and new token is a Digit (if (equalClicked and Token.Digit.allWithDot.contains(it)) "" else input) - .addToken(it) + .addToken(it), ) }, clearInputAction = { @@ -200,7 +200,7 @@ private fun ReadyUI( runCalculateAction(output, true) }, useDot = formatterSymbols.fractional == Token.Digit.dot, - middleZero = appPrefs.middleZero + middleZero = appPrefs.middleZero, ) } } @@ -212,7 +212,7 @@ private fun ActionButtons( formatterSymbols: FormatterSymbols, ) { Row( - modifier = modifier + modifier = modifier, ) { val buttonModifier = GlanceModifier.fillMaxWidth().defaultWeight() @@ -222,14 +222,14 @@ private fun ActionButtons( iconRes = R.drawable.content_copy, onClick = copyAction( output = output, - fractional = formatterSymbols.fractional - ) + fractional = formatterSymbols.fractional, + ), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primary, iconRes = R.drawable.open_in_new, - onClick = launchAction(LocalContext.current) + onClick = launchAction(LocalContext.current), ) } } @@ -243,7 +243,7 @@ private fun TextFields( ) { Column( modifier = modifier, - verticalAlignment = Alignment.Bottom + verticalAlignment = Alignment.Bottom, ) { val textModifier = GlanceModifier.fillMaxWidth() @@ -254,8 +254,8 @@ private fun TextFields( style = TextStyle( fontSize = 36.sp, textAlign = TextAlign.End, - color = GlanceTheme.colors.onSurfaceVariant - ) + color = GlanceTheme.colors.onSurfaceVariant, + ), ) Text( text = output.formatExpression(formatterSymbols), @@ -264,8 +264,8 @@ private fun TextFields( style = TextStyle( fontSize = 36.sp, textAlign = TextAlign.End, - color = GlanceTheme.colors.onSurfaceVariant.withAlpha(alpha = 0.5f) - ) + color = GlanceTheme.colors.onSurfaceVariant.withAlpha(alpha = 0.5f), + ), ) } } @@ -290,25 +290,25 @@ private fun GlanceKeyboard( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.tertiaryContainer, iconRes = R.drawable.clear, - onClick = clearInputAction() + onClick = clearInputAction(), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.brackets, - onClick = addBracketAction() + onClick = addBracketAction(), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.percent, - onClick = addTokenAction(Token.Operator.percent) + onClick = addTokenAction(Token.Operator.percent), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.divide, - onClick = addTokenAction(Token.Operator.divide) + onClick = addTokenAction(Token.Operator.divide), ) } Row(rowModifier) { @@ -318,25 +318,25 @@ private fun GlanceKeyboard( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key7, - onClick = addTokenAction(Token.Digit._7) + onClick = addTokenAction(Token.Digit._7), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key8, - onClick = addTokenAction(Token.Digit._8) + onClick = addTokenAction(Token.Digit._8), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key9, - onClick = addTokenAction(Token.Digit._9) + onClick = addTokenAction(Token.Digit._9), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.multiply, - onClick = addTokenAction(Token.Operator.multiply) + onClick = addTokenAction(Token.Operator.multiply), ) } Row(rowModifier) { @@ -346,25 +346,25 @@ private fun GlanceKeyboard( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key4, - onClick = addTokenAction(Token.Digit._4) + onClick = addTokenAction(Token.Digit._4), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key5, - onClick = addTokenAction(Token.Digit._5) + onClick = addTokenAction(Token.Digit._5), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key6, - onClick = addTokenAction(Token.Digit._6) + onClick = addTokenAction(Token.Digit._6), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.minus, - onClick = addTokenAction(Token.Operator.minus) + onClick = addTokenAction(Token.Operator.minus), ) } Row(rowModifier) { @@ -374,25 +374,25 @@ private fun GlanceKeyboard( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key1, - onClick = addTokenAction(Token.Digit._1) + onClick = addTokenAction(Token.Digit._1), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key2, - onClick = addTokenAction(Token.Digit._2) + onClick = addTokenAction(Token.Digit._2), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key3, - onClick = addTokenAction(Token.Digit._3) + onClick = addTokenAction(Token.Digit._3), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.plus, - onClick = addTokenAction(Token.Operator.plus) + onClick = addTokenAction(Token.Operator.plus), ) } Row(rowModifier) { @@ -403,39 +403,39 @@ private fun GlanceKeyboard( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = if (useDot) R.drawable.dot else R.drawable.comma, - onClick = addTokenAction(Token.Digit.dot) + onClick = addTokenAction(Token.Digit.dot), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key0, - onClick = addTokenAction(Token.Digit._0) + onClick = addTokenAction(Token.Digit._0), ) } else { IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.key0, - onClick = addTokenAction(Token.Digit._0) + onClick = addTokenAction(Token.Digit._0), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = if (useDot) R.drawable.dot else R.drawable.comma, - onClick = addTokenAction(Token.Digit.dot) + onClick = addTokenAction(Token.Digit.dot), ) } IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.inverseOnSurface, iconRes = R.drawable.backspace, - onClick = deleteTokenAction() + onClick = deleteTokenAction(), ) IconButton( glanceModifier = buttonModifier, containerColor = GlanceTheme.colors.primaryContainer, iconRes = R.drawable.equal, - onClick = equalAction() + onClick = equalAction(), ) } } @@ -445,5 +445,5 @@ private fun ColorProvider.withAlpha(alpha: Float): ColorProvider = ColorProvider( this .getColor(LocalContext.current) - .copy(alpha = alpha) + .copy(alpha = alpha), ) diff --git a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/IconButton.kt b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/IconButton.kt index 128e8fc3..aad2ed19 100644 --- a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/IconButton.kt +++ b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/IconButton.kt @@ -57,7 +57,7 @@ internal fun IconButton( modifier = glanceModifier .height(48.dp) .padding(4.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Image( modifier = GlanceModifier @@ -66,12 +66,12 @@ internal fun IconButton( .cornerRadius( context = LocalContext.current, cornerRadius = 24.dp, - color = containerColor + color = containerColor, ) .padding(horizontal = 16.dp, vertical = 8.dp), provider = ImageProvider(iconRes), contentDescription = null, - colorFilter = ColorFilter.tint(contentColor) + colorFilter = ColorFilter.tint(contentColor), ) } } @@ -101,8 +101,8 @@ fun GlanceModifier.cornerRadius( // fucking .toIcon(context) // stupid - .setTint(color.getColor(context).toArgb()) - ) - ) - else -> this.background(color) - } + .setTint(color.getColor(context).toArgb()), + ), + ) + else -> this.background(color) +} diff --git a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/UpdateInputAction.kt b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/UpdateInputAction.kt index 5bd7c286..2e186c10 100644 --- a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/UpdateInputAction.kt +++ b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/UpdateInputAction.kt @@ -41,7 +41,7 @@ internal class UpdateInputAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, - parameters: ActionParameters + parameters: ActionParameters, ) = withContext(Dispatchers.Default) { // Get new input val input = parameters[CalculatorWidget.inputKey] ?: return@withContext @@ -89,7 +89,7 @@ internal class RestartWidget : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, - parameters: ActionParameters + parameters: ActionParameters, ) { CalculatorWidget().update(context, glanceId) } @@ -99,38 +99,38 @@ internal fun updateInputAction( input: String, equalClicked: Boolean, precision: Int, - outputFormat: Int + outputFormat: Int, ): Action = actionRunCallback( actionParametersOf( CalculatorWidget.inputKey to input, CalculatorWidget.equalClickedKey to equalClicked, CalculatorWidget.precisionKey to precision, - CalculatorWidget.outputFormatKey to outputFormat - ) + CalculatorWidget.outputFormatKey to outputFormat, + ), ) internal fun copyAction( output: String, - fractional: String + fractional: String, ): Action = actionRunCallback( actionParametersOf( - CalculatorWidget.outputKey to output.replace(Token.Digit.dot, fractional) - ) + CalculatorWidget.outputKey to output.replace(Token.Digit.dot, fractional), + ), ) internal fun launchAction( - mContext: Context + mContext: Context, ): Action = actionStartActivity( ComponentName( mContext, - "com.sadellie.unitto.MainActivity" - ) + "com.sadellie.unitto.MainActivity", + ), ) private fun calculate( input: String, precision: Int, - outputFormat: Int + outputFormat: Int, ): String { if (input.isEmpty()) throw Exception() if (!input.isExpression()) throw Exception() diff --git a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/WidgetTheme.kt b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/WidgetTheme.kt index 16d900d6..bdfad06b 100644 --- a/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/WidgetTheme.kt +++ b/feature/glance/src/main/java/com/sadellie/unitto/feature/glance/glance/WidgetTheme.kt @@ -33,7 +33,7 @@ internal fun WidgetTheme(content: @Composable () -> Unit) = } } else { GlanceTheme( - colors = ColorProviders(light = LightThemeColors, dark = DarkThemeColors) + colors = ColorProviders(light = LightThemeColors, dark = DarkThemeColors), ) { content() } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt index 2a000fd7..b4f02da3 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsScreen.kt @@ -77,20 +77,20 @@ import com.sadellie.unitto.core.base.BuildConfig import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.LocalWindowSize import com.sadellie.unitto.core.ui.WindowWidthSizeClass +import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.Header import com.sadellie.unitto.core.ui.common.ListItem -import com.sadellie.unitto.core.ui.common.DrawerButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.core.ui.showToast import com.sadellie.unitto.feature.settings.components.AnnoyingBox -import com.sadellie.unitto.feature.settings.navigation.aboutRoute -import com.sadellie.unitto.feature.settings.navigation.calculatorSettingsRoute -import com.sadellie.unitto.feature.settings.navigation.converterSettingsRoute -import com.sadellie.unitto.feature.settings.navigation.displayRoute -import com.sadellie.unitto.feature.settings.navigation.formattingRoute -import com.sadellie.unitto.feature.settings.navigation.startingScreenRoute +import com.sadellie.unitto.feature.settings.navigation.ABOUT_ROUTE +import com.sadellie.unitto.feature.settings.navigation.CALCULATOR_SETTINGS_ROUTE +import com.sadellie.unitto.feature.settings.navigation.CONVERTER_SETTINGS_ROUTE +import com.sadellie.unitto.feature.settings.navigation.DISPLAY_ROUTE +import com.sadellie.unitto.feature.settings.navigation.FORMATTING_ROUTE +import com.sadellie.unitto.feature.settings.navigation.STARTING_SCREEN_ROUTE import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.ZonedDateTime @@ -123,7 +123,7 @@ internal fun SettingsRoute( updateVibrations = viewModel::updateVibrations, clearCache = viewModel::clearCache, backup = viewModel::backup, - restore = viewModel::restore + restore = viewModel::restore, ) } } @@ -144,14 +144,14 @@ private fun SettingsScreen( // Pass picked file uri to BackupManager val restoreLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.OpenDocument() + ActivityResultContracts.OpenDocument(), ) { pickedUri -> if (pickedUri != null) restore(mContext, pickedUri) } // Pass picked file uri to BackupManager val backupLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.CreateDocument(backupMimeType) + ActivityResultContracts.CreateDocument(BACKUP_MIME_TYPE), ) { pickedUri -> if (pickedUri != null) backup(mContext, pickedUri) } @@ -164,38 +164,38 @@ private fun SettingsScreen( if (LocalWindowSize.current.widthSizeClass != WindowWidthSizeClass.Expanded) { DrawerButton(openDrawer) } - }, + }, actions = { IconButton( onClick = { showMenu = !showMenu }, - content = { Icon(Icons.Default.MoreVert, null) } + content = { Icon(Icons.Default.MoreVert, null) }, ) DropdownMenu( expanded = showMenu, - onDismissRequest = { showMenu = false } + onDismissRequest = { showMenu = false }, ) { DropdownMenuItem( onClick = { showMenu = false backupLauncher.launchSafely(backupFileName()) }, - text = { Text(stringResource(R.string.settings_back_up)) } + text = { Text(stringResource(R.string.settings_back_up)) }, ) DropdownMenuItem( onClick = { showMenu = false - restoreLauncher.launchSafely(arrayOf(backupMimeType)) + restoreLauncher.launchSafely(arrayOf(BACKUP_MIME_TYPE)) }, - text = { Text(stringResource(R.string.settings_restore)) } + text = { Text(stringResource(R.string.settings_restore)) }, ) } - } + }, ) { padding -> Column( modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(padding) + .padding(padding), ) { AnimatedVisibility( visible = uiState.showUpdateChangelog, @@ -221,35 +221,35 @@ private fun SettingsScreen( icon = Icons.Default.Palette, headlineText = stringResource(R.string.settings_display), supportingText = stringResource(R.string.settings_display_support), - modifier = Modifier.clickable { navControllerAction(displayRoute) } + modifier = Modifier.clickable { navControllerAction(DISPLAY_ROUTE) }, ) ListItem( icon = Icons.Default.Home, headlineText = stringResource(R.string.settings_starting_screen), supportingText = stringResource(R.string.settings_starting_screen_support), - modifier = Modifier.clickable { navControllerAction(startingScreenRoute) } + modifier = Modifier.clickable { navControllerAction(STARTING_SCREEN_ROUTE) }, ) ListItem( icon = Icons.Default._123, headlineText = stringResource(R.string.settings_formatting), supportingText = stringResource(R.string.settings_formatting_support), - modifier = Modifier.clickable { navControllerAction(formattingRoute) } + modifier = Modifier.clickable { navControllerAction(FORMATTING_ROUTE) }, ) ListItem( icon = Icons.Default.Calculate, headlineText = stringResource(R.string.calculator_title), supportingText = stringResource(R.string.settings_calculator_support), - modifier = Modifier.clickable { navControllerAction(calculatorSettingsRoute) } + modifier = Modifier.clickable { navControllerAction(CALCULATOR_SETTINGS_ROUTE) }, ) ListItem( icon = Icons.Default.SwapHoriz, headlineText = stringResource(R.string.unit_converter_title), supportingText = stringResource(R.string.settings_converter_support), - modifier = Modifier.clickable { navControllerAction(converterSettingsRoute) } + modifier = Modifier.clickable { navControllerAction(CONVERTER_SETTINGS_ROUTE) }, ) Header(stringResource(R.string.settings_additional)) @@ -258,9 +258,9 @@ private fun SettingsScreen( icon = Icons.Default.Vibration, headlineText = stringResource(R.string.settings_vibrations), supportingText = stringResource(R.string.settings_vibrations_support), - modifier = Modifier.clickable { navControllerAction(converterSettingsRoute) }, + modifier = Modifier.clickable { navControllerAction(CONVERTER_SETTINGS_ROUTE) }, switchState = uiState.enableVibrations, - onSwitchChange = updateVibrations + onSwitchChange = updateVibrations, ) AnimatedVisibility( @@ -271,7 +271,10 @@ private fun SettingsScreen( ListItem( headlineText = stringResource(R.string.settings_clear_cache), icon = Icons.Default.Cached, - modifier = Modifier.clickable { clearCache(); showToast(mContext, "👌") }, + modifier = Modifier.clickable { + clearCache() + showToast(mContext, "👌") + }, ) } @@ -279,7 +282,7 @@ private fun SettingsScreen( ListItem( icon = Icons.Default.RateReview, headlineText = stringResource(R.string.settings_rate_this_app), - modifier = Modifier.clickable { openLink(mContext, BuildConfig.STORE_LINK) } + modifier = Modifier.clickable { openLink(mContext, BuildConfig.STORE_LINK) }, ) } @@ -287,7 +290,7 @@ private fun SettingsScreen( icon = Icons.Default.Info, headlineText = stringResource(R.string.settings_about_unitto), supportingText = stringResource(R.string.settings_about_unitto_support), - modifier = Modifier.clickable { navControllerAction(aboutRoute) } + modifier = Modifier.clickable { navControllerAction(ABOUT_ROUTE) }, ) } } @@ -295,7 +298,7 @@ private fun SettingsScreen( AnimatedVisibility( visible = uiState.backupInProgress, enter = fadeIn(), - exit = fadeOut() + exit = fadeOut(), ) { Scaffold { padding -> Box( @@ -323,7 +326,7 @@ private fun backupFileName(): String { return "${ZonedDateTime.now().format(formatter)}.unitto" } -private const val backupMimeType = "application/octet-stream" +private const val BACKUP_MIME_TYPE = "application/octet-stream" @Preview @Composable @@ -335,8 +338,8 @@ private fun PreviewSettingsScreen() { enableVibrations = false, cacheSize = 2, backupInProgress = false, - showUpdateChangelog = true - ) + showUpdateChangelog = true, + ), ) } @@ -364,6 +367,6 @@ private fun PreviewSettingsScreen() { delay(2000) uiState = uiState.copy(backupInProgress = false) } - } + }, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt index 500c71f3..d1964955 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt @@ -44,24 +44,24 @@ import javax.inject.Inject internal class SettingsViewModel @Inject constructor( private val userPrefsRepository: UserPreferencesRepository, private val currencyRatesDao: CurrencyRatesDao, - private val database: UnittoDatabase + private val database: UnittoDatabase, ) : ViewModel() { private val _showErrorToast = MutableSharedFlow() val showErrorToast = _showErrorToast.asSharedFlow() - private val _backupInProgress = MutableStateFlow(false) + private val backupInProgress = MutableStateFlow(false) private var backupJob: Job? = null val uiState = combine( userPrefsRepository.generalPrefs, currencyRatesDao.size(), - _backupInProgress, + backupInProgress, ) { prefs, cacheSize, backupInProgress -> SettingsUIState.Ready( enableVibrations = prefs.enableVibrations, cacheSize = cacheSize, backupInProgress = backupInProgress, - showUpdateChangelog = prefs.lastReadChangelog != BuildConfig.VERSION_CODE + showUpdateChangelog = prefs.lastReadChangelog != BuildConfig.VERSION_CODE, ) } .stateIn(viewModelScope, SettingsUIState.Loading) @@ -72,14 +72,14 @@ internal class SettingsViewModel @Inject constructor( ) { backupJob?.cancel() backupJob = viewModelScope.launch(Dispatchers.IO) { - _backupInProgress.update { true } + backupInProgress.update { true } try { BackupManager().backup(context, uri, database) } catch (e: Exception) { _showErrorToast.emit(true) Log.e(TAG, "$e") } - _backupInProgress.update { false } + backupInProgress.update { false } } } @@ -89,14 +89,14 @@ internal class SettingsViewModel @Inject constructor( ) { backupJob?.cancel() backupJob = viewModelScope.launch(Dispatchers.IO) { - _backupInProgress.update { true } + backupInProgress.update { true } try { BackupManager().restore(context, uri, database) } catch (e: Exception) { _showErrorToast.emit(true) Log.e(TAG, "$e") } - _backupInProgress.update { false } + backupInProgress.update { false } } } @@ -119,4 +119,4 @@ internal class SettingsViewModel @Inject constructor( } } -private const val TAG = "SettingsViewModel" \ No newline at end of file +private const val TAG = "SettingsViewModel" diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt index 8b619074..91243f66 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/about/AboutScreen.kt @@ -57,7 +57,7 @@ internal fun AboutRoute( AboutScreen( navigateUpAction = navigateUpAction, navigateToThirdParty = navigateToThirdParty, - navigateToEasterEgg = navigateToEasterEgg + navigateToEasterEgg = navigateToEasterEgg, ) } @@ -73,7 +73,7 @@ private fun AboutScreen( ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_about_unitto), - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { padding -> LazyColumn(contentPadding = padding) { // CURRENCY RATE NOTE @@ -81,7 +81,7 @@ private fun AboutScreen( ListItem( icon = Icons.AutoMirrored.Filled.Help, headlineText = stringResource(R.string.settings_currency_rates_note_title), - modifier = Modifier.clickable { showDialog = true } + modifier = Modifier.clickable { showDialog = true }, ) } @@ -93,9 +93,9 @@ private fun AboutScreen( modifier = Modifier.clickable { openLink( mContext, - "https://sadellie.github.io/unitto/terms" + "https://sadellie.github.io/unitto/terms", ) - } + }, ) } @@ -107,9 +107,9 @@ private fun AboutScreen( modifier = Modifier.clickable { openLink( mContext, - "https://sadellie.github.io/unitto/privacy" + "https://sadellie.github.io/unitto/privacy", ) - } + }, ) } @@ -121,9 +121,9 @@ private fun AboutScreen( modifier = Modifier.clickable { openLink( mContext, - "https://github.com/sadellie/unitto" + "https://github.com/sadellie/unitto", ) - } + }, ) } @@ -132,7 +132,7 @@ private fun AboutScreen( ListItem( icon = Icons.Default.Copyright, headlineText = stringResource(R.string.settings_third_party_licenses), - modifier = Modifier.clickable { navigateToThirdParty() } + modifier = Modifier.clickable { navigateToThirdParty() }, ) } @@ -148,7 +148,7 @@ private fun AboutScreen( aboutItemClick = 0 navigateToEasterEgg() } - } + }, ) } } @@ -167,7 +167,7 @@ private fun AboutScreen( Text(stringResource(R.string.ok_label)) } }, - onDismissRequest = { showDialog = false } + onDismissRequest = { showDialog = false }, ) } } @@ -178,6 +178,6 @@ fun PreviewAboutScreen() { AboutScreen( navigateUpAction = {}, navigateToThirdParty = {}, - navigateToEasterEgg = {} + navigateToEasterEgg = {}, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt index 5e0d6817..36933ee5 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/bouncingemoji/BouncingEmoji.kt @@ -70,7 +70,7 @@ internal fun BouncingEmojiRoute( ) { ScaffoldWithTopBar( title = { AnimatedText("Bouncy boy") }, - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { paddingValues -> BouncingEmojiScreen( modifier = Modifier @@ -95,12 +95,12 @@ private fun BouncingEmojiScreen( var speed by remember { mutableFloatStateOf(1f) } CompositionLocalProvider( - value = LocalDensity provides Density(density.density, fontScale = 1f) + value = LocalDensity provides Density(density.density, fontScale = 1f), ) { BoxWithConstraints( modifier = modifier.clickable { speed = Random.nextFloat() - } + }, ) { val width = constraints.maxWidth val height = constraints.maxHeight @@ -125,16 +125,16 @@ private fun BouncingEmojiScreen( modifier = Modifier.offset { IntOffset( animatedX.value.roundToInt(), - animatedY.value.roundToInt() + animatedY.value.roundToInt(), ) }, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Box( modifier = Modifier .background(MaterialTheme.colorScheme.primaryContainer, CircleShape) .size(ballSize), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { AnimatedText(emoji, MaterialTheme.typography.displayMedium) } @@ -150,7 +150,7 @@ private fun BouncingEmojiScreen( LaunchedEffect( key1 = Unit, - key2 = speed + key2 = speed, ) { while (isActive) { x += xSpeed * speed @@ -173,7 +173,7 @@ private fun BouncingEmojiScreen( } // Count edge hit as 1 bounce - when(bouncedEdges) { + when (bouncedEdges) { 2 -> { edgeHits++ bounces++ @@ -197,20 +197,20 @@ private fun BouncingEmojiScreen( @Composable private fun AnimatedText( text: String, - style: TextStyle = LocalTextStyle.current + style: TextStyle = LocalTextStyle.current, ) { AnimatedContent( targetState = text, transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith - slideOutVertically { height -> -height } + fadeOut() + slideOutVertically { height -> -height } + fadeOut() }, label = "Text animation", ) { Text( text = it, style = style, - color = MaterialTheme.colorScheme.onBackground + color = MaterialTheme.colorScheme.onBackground, ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt index cee574b9..7c4e52cc 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/calculator/CalculatorSettingsScreen.kt @@ -64,7 +64,7 @@ private fun CalculatorSettingsScreen( ) { ScaffoldWithLargeTopBar( title = stringResource(R.string.calculator_title), - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { padding -> Column(Modifier.padding(padding)) { ListItem( @@ -72,7 +72,7 @@ private fun CalculatorSettingsScreen( icon = Icons.Default.Timer, supportingText = stringResource(R.string.settings_partial_history_view_support), switchState = prefs.partialHistoryView, - onSwitchChange = updatePartialHistoryView + onSwitchChange = updatePartialHistoryView, ) } } @@ -91,7 +91,7 @@ private fun PreviewCalculatorSettingsScreenStandard() { inverseMode = false, partialHistoryView = false, precision = 3, - outputFormat = OutputFormat.PLAIN + outputFormat = OutputFormat.PLAIN, ), navigateUpAction = {}, updatePartialHistoryView = {}, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AlertDialogWithList.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AlertDialogWithList.kt index 332e0224..9fe379a9 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AlertDialogWithList.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AlertDialogWithList.kt @@ -58,7 +58,7 @@ internal fun AlertDialogWithList( selectAction: (T) -> Unit, dismissAction: () -> Unit, supportText: String? = null, - dismissButtonLabel: String = stringResource(R.string.cancel_label) + dismissButtonLabel: String = stringResource(R.string.cancel_label), ) { AlertDialog( onDismissRequest = dismissAction, @@ -78,7 +78,7 @@ internal fun AlertDialogWithList( onClick = { selectAction(option) dismissAction() - } + }, ) } } @@ -88,7 +88,7 @@ internal fun AlertDialogWithList( TextButton(onClick = dismissAction) { Text(text = dismissButtonLabel, color = MaterialTheme.colorScheme.primary) } - } + }, ) } @@ -103,7 +103,7 @@ internal fun AlertDialogWithList( private fun CustomDialogContentListItem( label: String, selected: Boolean = false, - onClick: () -> Unit + onClick: () -> Unit, ) { Row( modifier = Modifier @@ -111,9 +111,9 @@ private fun CustomDialogContentListItem( .clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(), - onClick = onClick + onClick = onClick, ), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { RadioButton(selected, onClick) Text(label) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AnnoyingBox.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AnnoyingBox.kt index 7c2f9204..a4dcbb95 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AnnoyingBox.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/AnnoyingBox.kt @@ -54,23 +54,23 @@ internal fun AnnoyingBox( .squashable( onClick = onClick, interactionSource = remember { MutableInteractionSource() }, - cornerRadiusRange = 15..25 + cornerRadiusRange = 15..25, ) .background(MaterialTheme.colorScheme.secondaryContainer) .padding(16.dp, 8.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Icon( modifier = Modifier.size(24.dp), imageVector = imageVector, contentDescription = imageVectorContentDescription, - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) Column( modifier = Modifier .weight(1f) - .padding(vertical = 8.dp) + .padding(vertical = 8.dp), ) { Text( text = title, @@ -94,6 +94,6 @@ fun PreviewAnnoyingBox() { imageVector = Icons.Default.Accessibility, imageVectorContentDescription = "", title = "Title text", - support = "Lorem ipsum or something" + support = "Lorem ipsum or something", ) {} } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/ColorSelector.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/ColorSelector.kt index 76b04c07..d89765da 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/ColorSelector.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/ColorSelector.kt @@ -71,14 +71,14 @@ internal fun ColorSelector( LazyRow( modifier = modifier, state = listState, - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { // Default, Unitto colors item(defaultColor.value.toLong()) { ColorCheckbox( color = defaultColor, selected = Color.Unspecified == selected, - onClick = { onItemClick(Color.Unspecified) } + onClick = { onItemClick(Color.Unspecified) }, ) } @@ -87,7 +87,7 @@ internal fun ColorSelector( ColorCheckbox( color = it, selected = it == selected, - onClick = { onItemClick(it) } + onClick = { onItemClick(it) }, ) } } @@ -98,7 +98,7 @@ internal fun ColorSelector( private fun ColorCheckbox( color: Color, selected: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { Box( modifier = Modifier @@ -106,7 +106,7 @@ private fun ColorCheckbox( .clip(RoundedCornerShape(25)) .clickable(onClick = onClick) .background(MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Box( modifier = Modifier diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/MonetModeSelector.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/MonetModeSelector.kt index cb80296e..35b7d828 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/MonetModeSelector.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/components/MonetModeSelector.kt @@ -81,7 +81,7 @@ internal fun MonetModeSelector( LazyRow( modifier = modifier, state = listState, - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { items(monetModes) { monetMode -> Themmo( @@ -93,13 +93,13 @@ internal fun MonetModeSelector( dynamicThemeEnabled = false, amoledThemeEnabled = false, customColor = customColor, - monetMode = monetMode + monetMode = monetMode, ) - } + }, ) { MonetModeCheckbox( selected = monetMode == selected, - onClick = { onItemClick(monetMode) } + onClick = { onItemClick(monetMode) }, ) } } @@ -109,7 +109,7 @@ internal fun MonetModeSelector( @Composable private fun MonetModeCheckbox( selected: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { Box( modifier = Modifier @@ -117,7 +117,7 @@ private fun MonetModeCheckbox( .clip(RoundedCornerShape(25)) .clickable(onClick = onClick) .background(MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Box( modifier = Modifier @@ -127,17 +127,21 @@ private fun MonetModeCheckbox( .clip(CircleShape) .background(MaterialTheme.colorScheme.secondary) .border(1.dp, MaterialTheme.colorScheme.outline, CircleShape), - contentAlignment = Alignment.BottomStart + contentAlignment = Alignment.BottomStart, ) { // Is this bad? Yes. Does it work? Also yes. - Box(modifier = Modifier - .fillMaxHeight(0.5f) - .fillMaxWidth() - .background(MaterialTheme.colorScheme.primary)) - Box(modifier = Modifier - .fillMaxHeight(0.5f) - .fillMaxWidth(0.5f) - .background(MaterialTheme.colorScheme.secondaryContainer)) + Box( + modifier = Modifier + .fillMaxHeight(0.5f) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.primary), + ) + Box( + modifier = Modifier + .fillMaxHeight(0.5f) + .fillMaxWidth(0.5f) + .background(MaterialTheme.colorScheme.secondaryContainer), + ) } AnimatedVisibility( visible = selected, @@ -150,7 +154,7 @@ private fun MonetModeCheckbox( tint = MaterialTheme.colorScheme.inverseOnSurface, modifier = Modifier .background(MaterialTheme.colorScheme.inverseSurface, CircleShape) - .padding(4.dp) + .padding(4.dp), ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt index 553325b3..0fbb92cb 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/converter/ConverterSettingsScreen.kt @@ -62,7 +62,7 @@ internal fun ConverterSettingsRoute( navigateUpAction = navigateUpAction, navigateToUnitsGroup = navigateToUnitsGroup, updateUnitConverterFormatTime = viewModel::updateUnitConverterFormatTime, - updateUnitConverterSorting = viewModel::updateUnitConverterSorting + updateUnitConverterSorting = viewModel::updateUnitConverterSorting, ) } } @@ -80,7 +80,7 @@ private fun ConverterSettingsScreen( ScaffoldWithLargeTopBar( title = stringResource(R.string.unit_converter_title), - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { padding -> LazyColumn(contentPadding = padding) { item("unit group") { @@ -88,7 +88,7 @@ private fun ConverterSettingsScreen( icon = Icons.AutoMirrored.Filled.Rule, headlineText = stringResource(R.string.settings_unit_groups_title), supportingText = stringResource(R.string.settings_unit_groups_support), - modifier = Modifier.clickable { navigateToUnitsGroup() } + modifier = Modifier.clickable { navigateToUnitsGroup() }, ) } @@ -97,7 +97,7 @@ private fun ConverterSettingsScreen( icon = Icons.AutoMirrored.Filled.Sort, headlineText = stringResource(R.string.settings_units_sorting), supportingText = stringResource(R.string.settings_units_sorting_support), - modifier = Modifier.clickable { showDialog = true } + modifier = Modifier.clickable { showDialog = true }, ) } @@ -107,7 +107,7 @@ private fun ConverterSettingsScreen( headlineText = stringResource(R.string.settings_format_time), supportingText = stringResource(R.string.settings_format_time_support), switchState = prefs.unitConverterFormatTime, - onSwitchChange = updateUnitConverterFormatTime + onSwitchChange = updateUnitConverterFormatTime, ) } } @@ -124,7 +124,7 @@ private fun ConverterSettingsScreen( ), selectedItemIndex = prefs.unitConverterSorting, selectAction = updateUnitConverterSorting, - dismissAction = { showDialog = false } + dismissAction = { showDialog = false }, ) } } @@ -150,6 +150,6 @@ private fun PreviewConverterSettingsScreen() { navigateUpAction = {}, navigateToUnitsGroup = {}, updateUnitConverterFormatTime = {}, - updateUnitConverterSorting = {} + updateUnitConverterSorting = {}, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayScreen.kt index 56407e45..e3544d3a 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayScreen.kt @@ -56,13 +56,13 @@ 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.common.EmptyScreen import com.sadellie.unitto.core.ui.common.Header +import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.NavigateUpButton +import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.common.SegmentedButton import com.sadellie.unitto.core.ui.common.SegmentedButtonsRow -import com.sadellie.unitto.core.ui.common.EmptyScreen -import com.sadellie.unitto.core.ui.common.ListItem -import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.common.icons.IconPack import com.sadellie.unitto.core.ui.common.icons.iconpack.Clear import com.sadellie.unitto.feature.settings.components.ColorSelector @@ -122,7 +122,7 @@ internal fun DisplayRoute( updateAcButton = viewModel::updateAcButton, middleZero = prefs.middleZero, updateMiddleZero = viewModel::updateMiddleZero, - navigateToLanguages = navigateToLanguages + navigateToLanguages = navigateToLanguages, ) } } @@ -151,13 +151,13 @@ private fun DisplayScreen( ) { ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_display), - navigationIcon = { NavigateUpButton(navigateUp) } + navigationIcon = { NavigateUpButton(navigateUp) }, ) { paddingValues -> Column( modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(paddingValues) + .padding(paddingValues), ) { ListItem( leadingContent = { @@ -173,26 +173,26 @@ private fun DisplayScreen( Row( Modifier .horizontalScroll(rememberScrollState()) - .wrapContentWidth() + .wrapContentWidth(), ) { SegmentedButtonsRow(modifier = Modifier.padding(56.dp, 8.dp, 24.dp, 2.dp)) { SegmentedButton( label = stringResource(R.string.settings_auto), onClick = { onThemeChange(ThemingMode.AUTO) }, selected = ThemingMode.AUTO == currentThemingMode, - icon = Icons.Outlined.HdrAuto + icon = Icons.Outlined.HdrAuto, ) SegmentedButton( label = stringResource(R.string.settings_light_mode), onClick = { onThemeChange(ThemingMode.FORCE_LIGHT) }, selected = ThemingMode.FORCE_LIGHT == currentThemingMode, - icon = Icons.Outlined.LightMode + icon = Icons.Outlined.LightMode, ) SegmentedButton( label = stringResource(R.string.settings_dark_mode), onClick = { onThemeChange(ThemingMode.FORCE_DARK) }, selected = ThemingMode.FORCE_DARK == currentThemingMode, - icon = Icons.Outlined.DarkMode + icon = Icons.Outlined.DarkMode, ) } } @@ -207,7 +207,7 @@ private fun DisplayScreen( headlineText = stringResource(R.string.settings_amoled_dark), supportingText = stringResource(R.string.settings_amoled_dark_support), switchState = isAmoledThemeEnabled, - onSwitchChange = onAmoledThemeChange + onSwitchChange = onAmoledThemeChange, ) } @@ -217,7 +217,7 @@ private fun DisplayScreen( headlineText = stringResource(R.string.settings_dynamic_colors), supportingText = stringResource(R.string.settings_dynamic_colors_support), switchState = isDynamicThemeEnabled, - onSwitchChange = onDynamicThemeChange + onSwitchChange = onDynamicThemeChange, ) AnimatedVisibility( @@ -233,7 +233,7 @@ private fun DisplayScreen( selected = selectedColor, onItemClick = onColorChange, colors = colorSchemes, - defaultColor = Color(0xFF186c31) + defaultColor = Color(0xFF186c31), ) }, modifier = Modifier.padding(start = 40.dp), @@ -257,7 +257,7 @@ private fun DisplayScreen( themingMode = currentThemingMode, ) }, - modifier = Modifier.padding(start = 40.dp) + modifier = Modifier.padding(start = 40.dp), ) } } @@ -269,7 +269,7 @@ private fun DisplayScreen( headlineText = stringResource(R.string.settings_system_font), supportingText = stringResource(R.string.settings_system_font_support), switchState = systemFont, - onSwitchChange = updateSystemFont + onSwitchChange = updateSystemFont, ) ListItem( @@ -277,7 +277,7 @@ private fun DisplayScreen( headlineText = stringResource(R.string.settings_ac_button), supportingText = stringResource(R.string.settings_ac_button_support), switchState = acButton, - onSwitchChange = updateAcButton + onSwitchChange = updateAcButton, ) ListItem( @@ -285,14 +285,14 @@ private fun DisplayScreen( headlineText = stringResource(R.string.settings_middle_zero), supportingText = stringResource(R.string.settings_middle_zero_support), switchState = middleZero, - onSwitchChange = updateMiddleZero + onSwitchChange = updateMiddleZero, ) ListItem( icon = Icons.Default.Language, headlineText = stringResource(R.string.settings_language), supportingText = stringResource(R.string.settings_language_support), - modifier = Modifier.clickable { navigateToLanguages() } + modifier = Modifier.clickable { navigateToLanguages() }, ) } } @@ -321,7 +321,7 @@ private fun Preview() { updateAcButton = {}, middleZero = false, updateMiddleZero = {}, - navigateToLanguages = {} + navigateToLanguages = {}, ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayViewModel.kt index 102281db..e1eeef64 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/display/DisplayViewModel.kt @@ -31,7 +31,7 @@ import javax.inject.Inject @HiltViewModel class DisplayViewModel @Inject constructor( - private val userPrefsRepository: UserPreferencesRepository + private val userPrefsRepository: UserPreferencesRepository, ) : ViewModel() { val prefs = userPrefsRepository.displayPrefs diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt index 82e3fc51..79ff98ab 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingScreen.kt @@ -98,7 +98,8 @@ fun FormattingScreen( onPrecisionChange: (Int) -> Unit, updateFormatterSymbols: (grouping: String, fractional: String) -> Unit, onOutputFormatChange: (Int) -> Unit, - precisions: ClosedFloatingPointRange = 0f..16f, // 16th is a MAX_PRECISION (1000) + // 16th is a MAX_PRECISION (1000) + precisions: ClosedFloatingPointRange = 0f..16f, ) { val resources = LocalContext.current.resources @@ -107,7 +108,7 @@ fun FormattingScreen( return@derivedStateOf if (uiState.precision >= precisions.endInclusive) { resources.getString( R.string.settings_precision_max, - MAX_PRECISION.toString().formatExpression(uiState.formatterSymbols) + MAX_PRECISION.toString().formatExpression(uiState.formatterSymbols), ) } else { uiState.precision.toString() @@ -121,7 +122,7 @@ fun FormattingScreen( ) { paddingValues -> Column( modifier = Modifier - .padding(paddingValues) + .padding(paddingValues), ) { PagedIsland( modifier = Modifier @@ -147,7 +148,7 @@ fun FormattingScreen( .fillMaxWidth() .horizontalScroll(rememberScrollState()), textAlign = TextAlign.End, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer, ) } @@ -155,13 +156,13 @@ fun FormattingScreen( leadingContent = { Icon( Icons.Default.Architecture, - stringResource(R.string.settings_precision) + stringResource(R.string.settings_precision), ) }, headlineContent = { Row( horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { Text(stringResource(R.string.settings_precision)) Text(precisionText) @@ -169,7 +170,7 @@ fun FormattingScreen( }, supportingContent = { Text(stringResource(R.string.settings_precision_support)) - } + }, ) Slider( @@ -190,13 +191,13 @@ fun FormattingScreen( Modifier .horizontalScroll(rememberScrollState()) .wrapContentWidth() - .padding(start = 56.dp) + .padding(start = 56.dp), ) { SegmentedButtonsRow { SegmentedButton( label = stringResource(R.string.settings_space), onClick = { updateFormatterSymbols(Token.SPACE, uiState.formatterSymbols.fractional) }, - selected = uiState.formatterSymbols.grouping == Token.SPACE + selected = uiState.formatterSymbols.grouping == Token.SPACE, ) SegmentedButton( label = stringResource(R.string.settings_period), @@ -214,10 +215,10 @@ fun FormattingScreen( AnimatedVisibility( visible = uiState.formatterSymbols.grouping == Token.SPACE, enter = expandVertically() + fadeIn(), - exit = shrinkVertically() + fadeOut() + exit = shrinkVertically() + fadeOut(), ) { Column( - modifier = Modifier.padding(start = 40.dp) + modifier = Modifier.padding(start = 40.dp), ) { ListItem( modifier = Modifier, @@ -227,7 +228,7 @@ fun FormattingScreen( Modifier .horizontalScroll(rememberScrollState()) .wrapContentWidth() - .padding(start = 16.dp) + .padding(start = 16.dp), ) { SegmentedButtonsRow { SegmentedButton( @@ -250,30 +251,30 @@ fun FormattingScreen( Icon(Icons.Default.EMobiledata, stringResource(R.string.settings_precision)) }, headlineContent = { Text(stringResource(R.string.settings_exponential_notation)) }, - supportingContent = { Text(stringResource(R.string.settings_exponential_notation_support)) } + supportingContent = { Text(stringResource(R.string.settings_exponential_notation_support)) }, ) Row( Modifier .horizontalScroll(rememberScrollState()) .wrapContentWidth() - .padding(start = 56.dp) + .padding(start = 56.dp), ) { SegmentedButtonsRow { SegmentedButton( label = stringResource(R.string.settings_auto), onClick = { onOutputFormatChange(OutputFormat.ALLOW_ENGINEERING) }, - selected = OutputFormat.ALLOW_ENGINEERING == uiState.outputFormat + selected = OutputFormat.ALLOW_ENGINEERING == uiState.outputFormat, ) SegmentedButton( label = stringResource(R.string.enabled_label), onClick = { onOutputFormatChange(OutputFormat.FORCE_ENGINEERING) }, - selected = OutputFormat.FORCE_ENGINEERING == uiState.outputFormat + selected = OutputFormat.FORCE_ENGINEERING == uiState.outputFormat, ) SegmentedButton( label = stringResource(R.string.disabled_label), onClick = { onOutputFormatChange(OutputFormat.PLAIN) }, - selected = OutputFormat.PLAIN == uiState.outputFormat + selected = OutputFormat.PLAIN == uiState.outputFormat, ) } } @@ -292,7 +293,7 @@ private fun PreviewFormattingScreen() { uiState = FormattingUIState( precision = 16, outputFormat = OutputFormat.PLAIN, - formatterSymbols = currentFormatterSymbols + formatterSymbols = currentFormatterSymbols, ), onPrecisionChange = { currentPrecision = it }, updateFormatterSymbols = updateFormatterSymbols@{ grouping, fractional -> diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt index 44062399..97b165f7 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/formatting/FormattingViewModel.kt @@ -30,15 +30,15 @@ import javax.inject.Inject @HiltViewModel class FormattingViewModel @Inject constructor( - private val userPreferencesRepository: UserPreferencesRepository + private val userPreferencesRepository: UserPreferencesRepository, ) : ViewModel() { - private val _prefs = userPreferencesRepository.formattingPrefs + private val prefs = userPreferencesRepository.formattingPrefs - val uiState = _prefs.map { mainPrefs -> + val uiState = prefs.map { mainPrefs -> FormattingUIState( precision = mainPrefs.digitsPrecision, outputFormat = mainPrefs.outputFormat, - formatterSymbols = mainPrefs.formatterSymbols + formatterSymbols = mainPrefs.formatterSymbols, ) } .stateIn(viewModelScope, null) diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/language/LanguageScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/language/LanguageScreen.kt index 7119ffc6..454f7d12 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/language/LanguageScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/language/LanguageScreen.kt @@ -36,8 +36,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat import com.sadellie.unitto.core.base.R -import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ListItem +import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.feature.settings.components.AnnoyingBox @@ -47,7 +47,7 @@ internal fun LanguageRoute( navigateUp: () -> Unit, ) { LanguageScreen( - navigateUp = navigateUp + navigateUp = navigateUp, ) } @@ -61,8 +61,11 @@ private fun LanguageScreen( } fun changeLanguage(langKey: String) { - val selectedLocale = if (langKey == "") LocaleListCompat.getEmptyLocaleList() - else LocaleListCompat.forLanguageTags(langKey) + val selectedLocale = if (langKey == "") { + LocaleListCompat.getEmptyLocaleList() + } else { + LocaleListCompat.forLanguageTags(langKey) + } AppCompatDelegate.setApplicationLocales(selectedLocale) navigateUp() @@ -70,7 +73,7 @@ private fun LanguageScreen( ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_language), - navigationIcon = { NavigateUpButton(navigateUp) } + navigationIcon = { NavigateUpButton(navigateUp) }, ) { padding -> LazyColumn(contentPadding = padding) { item("translate") { @@ -79,7 +82,7 @@ private fun LanguageScreen( imageVector = Icons.Default.Translate, imageVectorContentDescription = stringResource(R.string.settings_translate_app), title = stringResource(R.string.settings_translate_app), - support = stringResource(R.string.settings_translate_app_support) + support = stringResource(R.string.settings_translate_app_support), ) { openLink(mContext, "https://poeditor.com/join/project/T4zjmoq8dx") } @@ -95,9 +98,9 @@ private fun LanguageScreen( leadingContent = { RadioButton( selected = currentLangKey == key, - onClick = { changeLanguage(key) } + onClick = { changeLanguage(key) }, ) - } + }, ) } } @@ -109,6 +112,6 @@ private fun LanguageScreen( @Composable fun LanguageScreenPreview() { LanguageScreen( - navigateUp = {} + navigateUp = {}, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt index 3c6b1d85..ef593731 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt @@ -41,19 +41,19 @@ import io.github.sadellie.themmo.ThemmoController private val graph = DrawerItem.Settings.graph private val start = DrawerItem.Settings.start -internal const val displayRoute = "display_route" -internal const val languageRoute = "language_route" -internal const val startingScreenRoute = "starting_screen_route" -internal const val unitsGroupRoute = "units_group_route" -internal const val thirdPartyRoute = "third_party_route" -internal const val aboutRoute = "about_route" -internal const val formattingRoute = "formatting_route" -internal const val calculatorSettingsRoute = "calculator_settings_route" -internal const val converterSettingsRoute = "converter_settings_route" -internal const val bouncingEmoji = "bouncing_emoji_route" +internal const val DISPLAY_ROUTE = "display_route" +internal const val LANGUAGE_ROUTE = "language_route" +internal const val STARTING_SCREEN_ROUTE = "starting_screen_route" +internal const val UNITS_GROUP_ROUTE = "units_group_route" +internal const val THIRD_PARTY_ROUTE = "third_party_route" +internal const val ABOUT_ROUTE = "about_route" +internal const val FORMATTING_ROUTE = "formatting_route" +internal const val CALCULATOR_SETTINGS_ROUTE = "calculator_settings_route" +internal const val CONVERTER_SETTINGS_ROUTE = "converter_settings_route" +internal const val BOUNCING_EMOJI_ROUTE = "bouncing_emoji_route" fun NavController.navigateToUnitGroups() { - navigate(unitsGroupRoute) + navigate(UNITS_GROUP_ROUTE) } fun NavGraphBuilder.settingGraph( @@ -65,78 +65,78 @@ fun NavGraphBuilder.settingGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { SettingsRoute( openDrawer = openDrawer, - navControllerAction = navController::navigate + navControllerAction = navController::navigate, ) } - unittoStackedComposable(displayRoute) { + unittoStackedComposable(DISPLAY_ROUTE) { DisplayRoute( navigateUp = navController::navigateUp, themmoController = themmoController, - navigateToLanguages = { navController.navigate(languageRoute) } + navigateToLanguages = { navController.navigate(LANGUAGE_ROUTE) }, ) } - unittoStackedComposable(languageRoute) { + unittoStackedComposable(LANGUAGE_ROUTE) { LanguageRoute( navigateUp = navController::navigateUp, ) } - unittoStackedComposable(startingScreenRoute) { + unittoStackedComposable(STARTING_SCREEN_ROUTE) { StartingScreenRoute( navigateUp = navController::navigateUp, ) } - unittoStackedComposable(formattingRoute) { + unittoStackedComposable(FORMATTING_ROUTE) { FormattingRoute( - navigateUpAction = navController::navigateUp + navigateUpAction = navController::navigateUp, ) } - unittoStackedComposable(calculatorSettingsRoute) { + unittoStackedComposable(CALCULATOR_SETTINGS_ROUTE) { CalculatorSettingsRoute( navigateUpAction = navController::navigateUp, ) } - unittoStackedComposable(converterSettingsRoute) { + unittoStackedComposable(CONVERTER_SETTINGS_ROUTE) { ConverterSettingsRoute( navigateUpAction = navController::navigateUp, - navigateToUnitsGroup = { navController.navigate(unitsGroupRoute) } + navigateToUnitsGroup = { navController.navigate(UNITS_GROUP_ROUTE) }, ) } - unittoStackedComposable(unitsGroupRoute) { + unittoStackedComposable(UNITS_GROUP_ROUTE) { UnitGroupsRoute( navigateUpAction = navController::navigateUp, ) } - unittoStackedComposable(aboutRoute) { + unittoStackedComposable(ABOUT_ROUTE) { AboutRoute( navigateUpAction = navController::navigateUp, - navigateToThirdParty = { navController.navigate(thirdPartyRoute) }, - navigateToEasterEgg = { navController.navigate(bouncingEmoji) }, + navigateToThirdParty = { navController.navigate(THIRD_PARTY_ROUTE) }, + navigateToEasterEgg = { navController.navigate(BOUNCING_EMOJI_ROUTE) }, ) } - unittoStackedComposable(thirdPartyRoute) { + unittoStackedComposable(THIRD_PARTY_ROUTE) { ThirdPartyLicensesScreen( navigateUpAction = navController::navigateUp, ) } - unittoStackedComposable(bouncingEmoji) { + unittoStackedComposable(BOUNCING_EMOJI_ROUTE) { BouncingEmojiRoute( - navigateUpAction = navController::navigateUp + navigateUpAction = navController::navigateUp, ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/startingscreen/StartingScreenScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/startingscreen/StartingScreenScreen.kt index e8afadd5..59682168 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/startingscreen/StartingScreenScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/startingscreen/StartingScreenScreen.kt @@ -37,16 +37,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.addShortcut -import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem +import com.sadellie.unitto.core.ui.common.NavigateUpButton import com.sadellie.unitto.core.ui.common.ScaffoldWithLargeTopBar import com.sadellie.unitto.core.ui.model.DrawerItem @Composable internal fun StartingScreenRoute( viewModel: StartingScreenViewModel = hiltViewModel(), - navigateUp: () -> Unit + navigateUp: () -> Unit, ) { when (val prefs = viewModel.prefs.collectAsStateWithLifecycle().value) { null -> EmptyScreen() @@ -54,7 +54,7 @@ internal fun StartingScreenRoute( StartingScreenScreen( startingScreen = prefs.startingScreen, updateStartingScreen = viewModel::updateStartingScreen, - navigateUp = navigateUp + navigateUp = navigateUp, ) } } @@ -64,13 +64,13 @@ internal fun StartingScreenRoute( private fun StartingScreenScreen( startingScreen: String, updateStartingScreen: (String) -> Unit, - navigateUp: () -> Unit + navigateUp: () -> Unit, ) { val mContext = LocalContext.current ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_starting_screen), - navigationIcon = { NavigateUpButton(navigateUp) } + navigationIcon = { NavigateUpButton(navigateUp) }, ) { padding -> LazyColumn(contentPadding = padding) { items(DrawerItem.main, { it.graph }) { destination -> @@ -82,18 +82,18 @@ private fun StartingScreenScreen( leadingContent = { RadioButton( selected = destination.graph == startingScreen, - onClick = { updateStartingScreen(destination.graph) } + onClick = { updateStartingScreen(destination.graph) }, ) }, trailingContent = trail@{ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return@trail IconButton( - onClick = { mContext.addShortcut(destination) } + onClick = { mContext.addShortcut(destination) }, ) { Icon(Icons.Default.AppShortcut, null) } - } + }, ) } } @@ -106,6 +106,6 @@ private fun StartingScreenPreview() { StartingScreenScreen( startingScreen = DrawerItem.Converter.graph, updateStartingScreen = {}, - navigateUp = {} + navigateUp = {}, ) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/thirdparty/ThirdPartyLicensesScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/thirdparty/ThirdPartyLicensesScreen.kt index 5336dd87..0d008c19 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/thirdparty/ThirdPartyLicensesScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/thirdparty/ThirdPartyLicensesScreen.kt @@ -50,13 +50,13 @@ import com.sadellie.unitto.data.licenses.ALL_THIRD_PARTY @Stable @Composable internal fun ThirdPartyLicensesScreen( - navigateUpAction: () -> Unit = {} + navigateUpAction: () -> Unit = {}, ) { val mContext = LocalContext.current ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_third_party_licenses), - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { padding -> LazyColumn( verticalArrangement = Arrangement.spacedBy(16.dp), @@ -64,35 +64,35 @@ internal fun ThirdPartyLicensesScreen( start = 16.dp, end = 16.dp, top = padding.calculateTopPadding(), - bottom = 24.dp - ) + bottom = 24.dp, + ), ) { items(ALL_THIRD_PARTY) { OutlinedCard( - Modifier.clickable { it.website?.let { url -> openLink(mContext, url) } } + Modifier.clickable { it.website?.let { url -> openLink(mContext, url) } }, ) { Column( modifier = Modifier .fillMaxWidth() - .padding(12.dp) + .padding(12.dp), ) { Text( text = it.name, - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge, ) Text( modifier = Modifier.padding(top = 4.dp, bottom = 12.dp), text = it.dev ?: "", - style = MaterialTheme.typography.bodyLarge + style = MaterialTheme.typography.bodyLarge, ) Text( text = it.description ?: "", - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) Text( modifier = Modifier.align(Alignment.End), text = it.license ?: "", - style = MaterialTheme.typography.labelLarge + style = MaterialTheme.typography.labelLarge, ) } } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt index 0cb62042..d87d00d2 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsScreen.kt @@ -90,7 +90,7 @@ private fun UnitGroupsScreen( ) { ScaffoldWithLargeTopBar( title = stringResource(R.string.settings_unit_groups_title), - navigationIcon = { NavigateUpButton(navigateUpAction) } + navigationIcon = { NavigateUpButton(navigateUpAction) }, ) { paddingValues -> val copiedShownList = rememberUpdatedState(uiState.shownUnitGroups) as MutableState val state = rememberReorderableLazyListState( @@ -109,19 +109,19 @@ private fun UnitGroupsScreen( onDragEnd = onDragEnd@{ from, to -> if (from == to) return@onDragEnd updateShownUnitGroups(copiedShownList.value) - } + }, ) LazyColumn( state = state.listState, modifier = Modifier .padding(paddingValues) - .reorderable(state) + .reorderable(state), ) { item(key = "enabled") { Header( text = stringResource(R.string.enabled_label), - paddingValues = PaddingValues(horizontal = 16.dp, vertical = 12.dp) + paddingValues = PaddingValues(horizontal = 16.dp, vertical = 12.dp), ) } @@ -161,8 +161,8 @@ private fun UnitGroupsScreen( modifier = Modifier.clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = { removeShownUnitGroup(item) } - ) + onClick = { removeShownUnitGroup(item) }, + ), ) }, trailingContent = { @@ -173,9 +173,9 @@ private fun UnitGroupsScreen( .clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = {} + onClick = {}, ) - .detectReorder(state) + .detectReorder(state), ) }, ) @@ -186,7 +186,7 @@ private fun UnitGroupsScreen( Header( text = stringResource(R.string.disabled_label), modifier = Modifier.animateItemPlacement(), - paddingValues = PaddingValues(horizontal = 16.dp, vertical = 12.dp) + paddingValues = PaddingValues(horizontal = 16.dp, vertical = 12.dp), ) } @@ -205,10 +205,10 @@ private fun UnitGroupsScreen( modifier = Modifier.clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(false), - onClick = { addShownUnitGroup(it) } - ) + onClick = { addShownUnitGroup(it) }, + ), ) - } + }, ) } } @@ -223,7 +223,7 @@ private fun PreviewUnitGroupsScreen() { UnitGroupsScreen( uiState = UnitGroupsUIState.Ready( shownUnitGroups = shownUnitGroups, - hiddenUnitGroups = UnitGroup.entries - shownUnitGroups.toSet() + hiddenUnitGroups = UnitGroup.entries - shownUnitGroups.toSet(), ), navigateUpAction = {}, updateShownUnitGroups = {}, diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt index 08d1a1b1..7a12173a 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsUIState.kt @@ -21,10 +21,10 @@ package com.sadellie.unitto.feature.settings.unitgroups import com.sadellie.unitto.data.model.UnitGroup internal sealed class UnitGroupsUIState { - data object Loading: UnitGroupsUIState() + data object Loading : UnitGroupsUIState() data class Ready( val shownUnitGroups: List, - val hiddenUnitGroups: List - ): UnitGroupsUIState() + val hiddenUnitGroups: List, + ) : UnitGroupsUIState() } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt index bd8e8285..2b94f734 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/unitgroups/UnitGroupsViewModel.kt @@ -37,7 +37,7 @@ internal class UnitGroupsViewModel @Inject constructor( .map { UnitGroupsUIState.Ready( shownUnitGroups = it.shownUnitGroups, - hiddenUnitGroups = UnitGroup.entries - it.shownUnitGroups.toSet() + hiddenUnitGroups = UnitGroup.entries - it.shownUnitGroups.toSet(), ) } .stateIn(viewModelScope, UnitGroupsUIState.Loading) diff --git a/feature/timezone/src/androidTest/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZonesTest.kt b/feature/timezone/src/androidTest/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZonesTest.kt index 54b9cec6..b16adf13 100644 --- a/feature/timezone/src/androidTest/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZonesTest.kt +++ b/feature/timezone/src/androidTest/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZonesTest.kt @@ -52,11 +52,11 @@ class FavoriteTimeZonesTest { item = FavoriteZone( timeZone = TimeZone.getTimeZone("Africa/Addis_Ababa"), position = -1, - label = "label text" + label = "label text", ), fromTime = ZonedDateTime.parse( "2023-05-01T14:00+03:00[Africa/Addis_Ababa]", - DateTimeFormatter.ISO_ZONED_DATE_TIME + DateTimeFormatter.ISO_ZONED_DATE_TIME, ), expanded = true, onClick = {}, @@ -65,11 +65,10 @@ class FavoriteTimeZonesTest { onLabelClick = {}, isDragging = false, timeZoneNames = timeZoneNames, - localeDisplayNames = localeDisplayNames + localeDisplayNames = localeDisplayNames, ) } onNodeWithText("11:00").assertExists() } - -} \ No newline at end of file +} diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneScreen.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneScreen.kt index 3579e923..11b3b393 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneScreen.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneScreen.kt @@ -47,10 +47,10 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.ui.LocalLocale -import com.sadellie.unitto.core.ui.common.SearchPlaceholder import com.sadellie.unitto.core.ui.common.EmptyScreen import com.sadellie.unitto.core.ui.common.ListItem import com.sadellie.unitto.core.ui.common.SearchBar +import com.sadellie.unitto.core.ui.common.SearchPlaceholder import com.sadellie.unitto.core.ui.datetime.formatTime import com.sadellie.unitto.core.ui.openLink import com.sadellie.unitto.data.common.displayName @@ -73,7 +73,7 @@ internal fun AddTimeZoneRoute( navigateUp = navigateUp, onQueryChange = viewModel::onQueryChange, addToFavorites = viewModel::addToFavorites, - userTime = userTime + userTime = userTime, ) } } @@ -106,7 +106,7 @@ fun AddTimeZoneScreen( Crossfade( modifier = Modifier.padding(paddingValues), targetState = uiState.list.isEmpty() and uiState.query.text.isNotEmpty(), - label = "Placeholder" + label = "Placeholder", ) { empty -> if (empty) { SearchPlaceholder( @@ -131,9 +131,9 @@ fun AddTimeZoneScreen( text = it.timeZone .offset(userTime) .formatTime(locale, is24Hour), - style = MaterialTheme.typography.headlineSmall + style = MaterialTheme.typography.headlineSmall, ) - } + }, ) } } @@ -156,23 +156,23 @@ fun PreviewAddTimeZoneScreen() { list = listOf( "UTC", "Africa/Addis_Ababa", - "ACT" + "ACT", ).map { val zone = TimeZone.getTimeZone(it) SearchResultZone( timeZone = zone, region = zone.regionName( timeZoneNames = timeZoneNames, - localeDisplayNames = localeDisplayNames + localeDisplayNames = localeDisplayNames, ), name = zone.displayName(locale), - rank = 0 + rank = 0, ) - } + }, ), navigateUp = {}, onQueryChange = {}, addToFavorites = {}, - userTime = ZonedDateTime.now() + userTime = ZonedDateTime.now(), ) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneUIState.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneUIState.kt index 819d81e1..05ae1607 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneUIState.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneUIState.kt @@ -22,10 +22,10 @@ import androidx.compose.ui.text.input.TextFieldValue import com.sadellie.unitto.data.model.timezone.SearchResultZone sealed class AddTimeZoneUIState { - data object Loading: AddTimeZoneUIState() + data object Loading : AddTimeZoneUIState() data class Ready( val query: TextFieldValue, val list: List, - ): AddTimeZoneUIState() + ) : AddTimeZoneUIState() } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneViewModel.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneViewModel.kt index 8119e570..e263893e 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneViewModel.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/AddTimeZoneViewModel.kt @@ -42,14 +42,14 @@ import javax.inject.Inject class AddTimeZoneViewModel @Inject constructor( private val timezonesRepository: TimeZonesRepository, ) : ViewModel() { - private val _query = MutableStateFlow(TextFieldValue()) - private val _result = MutableStateFlow(emptyList()) + private val query = MutableStateFlow(TextFieldValue()) + private val result = MutableStateFlow(emptyList()) val uiState = combine( - _query, - _result, + query, + result, timezonesRepository.favoriteTimeZones, - ) { query, result, _ -> + ) { query, result, _ -> return@combine AddTimeZoneUIState.Ready( query = query, list = result, @@ -57,12 +57,12 @@ class AddTimeZoneViewModel @Inject constructor( } .mapLatest { ui -> viewModelScope.launch { - _result.update { + result.update { timezonesRepository.filter( searchQuery = ui.query.text, locale = ULocale.forLanguageTag( - AppCompatDelegate.getApplicationLocales().toLanguageTags() - ) + AppCompatDelegate.getApplicationLocales().toLanguageTags(), + ), ) } } @@ -70,7 +70,7 @@ class AddTimeZoneViewModel @Inject constructor( } .stateIn(viewModelScope, AddTimeZoneUIState.Loading) - fun onQueryChange(textFieldValue: TextFieldValue) = _query.update { textFieldValue } + fun onQueryChange(textFieldValue: TextFieldValue) = query.update { textFieldValue } fun addToFavorites(timeZone: TimeZone) = viewModelScope.launch { timezonesRepository.addToFavorites(timeZone) diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneExt.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneExt.kt index 2e723714..8e1dec62 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneExt.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneExt.kt @@ -28,6 +28,5 @@ val TimeZone.offsetSeconds @RequiresApi(Build.VERSION_CODES.N) get() = this.rawOffset / 1000L - @RequiresApi(Build.VERSION_CODES.N) fun TimeZone.timeNow(): ZonedDateTime = ZonedDateTime.now(ZoneId.of(this.id, ZoneId.SHORT_IDS)) diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt index 32e3d496..2e5383d2 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneScreen.kt @@ -109,7 +109,7 @@ internal fun TimeZoneRoute( delete = viewModel::delete, updateLabel = viewModel::updateLabel, selectTimeZone = viewModel::selectTimeZone, - setDialogState = viewModel::setDialogState + setDialogState = viewModel::setDialogState, ) } } @@ -132,7 +132,7 @@ private fun TimeZoneScreen( val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) var currentUserTime by remember(uiState.customUserTime) { mutableStateOf( - uiState.customUserTime ?: uiState.userTimeZone.timeNow() + uiState.customUserTime ?: uiState.userTimeZone.timeNow(), ) } val focusRequester = remember { FocusRequester() } @@ -170,7 +170,7 @@ private fun TimeZoneScreen( val targetInOldTz = uiState.favorites.getOrNull(to - 1) ?: return@onDragEnd onDragEnd(tz, targetInOldTz.position) - } + }, ) ScaffoldWithTopBar( @@ -180,7 +180,7 @@ private fun TimeZoneScreen( LargeFloatingActionButton( onClick = { navigateToAddTimeZone(currentUserTime) - } + }, ) { Icon( imageVector = Icons.Filled.Add, @@ -199,7 +199,7 @@ private fun TimeZoneScreen( .padding(padding) .reorderable(state), contentPadding = PaddingValues(start = 8.dp, end = 8.dp, bottom = 124.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { item("user time") { UserTimeZone( @@ -209,7 +209,7 @@ private fun TimeZoneScreen( userTime = currentUserTime, onClick = { setDialogState(TimeZoneDialogState.UserTimePicker(currentUserTime)) }, onResetClick = setCurrentTime, - showReset = uiState.customUserTime != null + showReset = uiState.customUserTime != null, ) } @@ -269,11 +269,11 @@ private fun TimeZoneScreen( setSelectedTime( currentUserTime .withHour(hour) - .withMinute(minute) + .withMinute(minute), ) setDialogState(TimeZoneDialogState.Nothing) }, - onCancel = { setDialogState(TimeZoneDialogState.Nothing) } + onCancel = { setDialogState(TimeZoneDialogState.Nothing) }, ) } @@ -287,12 +287,12 @@ private fun TimeZoneScreen( .withHour(hour) .withMinute(minute) .minusSeconds(uiState.dialogState.timeZone.timeZone.offsetSeconds) - .plusSeconds(uiState.userTimeZone.offsetSeconds) + .plusSeconds(uiState.userTimeZone.offsetSeconds), ) setDialogState(TimeZoneDialogState.Nothing) }, - onCancel = { setDialogState(TimeZoneDialogState.Nothing) } + onCancel = { setDialogState(TimeZoneDialogState.Nothing) }, ) } @@ -301,8 +301,8 @@ private fun TimeZoneScreen( mutableStateOf( TextFieldValue( text = uiState.dialogState.timeZone.label, - selection = TextRange(uiState.dialogState.timeZone.label.length) - ) + selection = TextRange(uiState.dialogState.timeZone.label.length), + ), ) } AlertDialog( @@ -311,7 +311,7 @@ private fun TimeZoneScreen( OutlinedTextField( value = tfv, onValueChange = { tfv = it }, - modifier = Modifier.focusRequester(focusRequester) + modifier = Modifier.focusRequester(focusRequester), ) LaunchedEffect(Unit) { awaitFrame() @@ -324,13 +324,13 @@ private fun TimeZoneScreen( setDialogState(TimeZoneDialogState.Nothing) updateLabel(uiState.dialogState.timeZone, tfv.text) }, - content = { Text(text = stringResource(R.string.ok_label)) } + content = { Text(text = stringResource(R.string.ok_label)) }, ) }, dismissButton = { TextButton( onClick = { setDialogState(TimeZoneDialogState.Nothing) }, - content = { Text(text = stringResource(R.string.cancel_label)) } + content = { Text(text = stringResource(R.string.cancel_label)) }, ) }, onDismissRequest = { setDialogState(TimeZoneDialogState.Nothing) }, @@ -353,13 +353,13 @@ fun PreviewTimeZoneScreen() { FavoriteZone( timeZone = TimeZone.getTimeZone(tz), position = index, - label = if (tz == "ACT") "label text" else "" + label = if (tz == "ACT") "label text" else "", ) }, customUserTime = null, userTimeZone = TimeZone.getTimeZone("Africa/Addis_Ababa"), selectedTimeZone = null, - dialogState = TimeZoneDialogState.Nothing + dialogState = TimeZoneDialogState.Nothing, ), openDrawer = {}, navigateToAddTimeZone = {}, diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneViewModel.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneViewModel.kt index a692f57b..935ed8dd 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneViewModel.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/TimeZoneViewModel.kt @@ -37,18 +37,18 @@ import javax.inject.Inject @RequiresApi(Build.VERSION_CODES.N) @HiltViewModel internal class TimeZoneViewModel @Inject constructor( - private val timezonesRepository: TimeZonesRepository -): ViewModel() { - private val _userTimeZone = MutableStateFlow(TimeZone.getDefault()) - private val _customUserTime = MutableStateFlow(null) - private val _selectedTimeZone = MutableStateFlow(null) - private val _dialogState = MutableStateFlow(TimeZoneDialogState.Nothing) + private val timezonesRepository: TimeZonesRepository, +) : ViewModel() { + private val userTimeZone = MutableStateFlow(TimeZone.getDefault()) + private val customUserTime = MutableStateFlow(null) + private val selectedTimeZone = MutableStateFlow(null) + private val dialogState = MutableStateFlow(TimeZoneDialogState.Nothing) val uiState = combine( - _customUserTime, - _userTimeZone, - _selectedTimeZone, - _dialogState, + customUserTime, + userTimeZone, + selectedTimeZone, + dialogState, timezonesRepository.favoriteTimeZones, ) { customUserTime, userTimeZone, selectedTimeZone, dialogState, favoriteTimeZones -> return@combine TimeZoneUIState.Ready( @@ -56,20 +56,20 @@ internal class TimeZoneViewModel @Inject constructor( customUserTime = customUserTime, userTimeZone = userTimeZone, selectedTimeZone = selectedTimeZone, - dialogState = dialogState + dialogState = dialogState, ) } .stateIn(viewModelScope, TimeZoneUIState.Loading) - fun setCurrentTime() = _customUserTime.update { null } + fun setCurrentTime() = customUserTime.update { null } - fun setSelectedTime(time: ZonedDateTime) = _customUserTime.update { time } + fun setSelectedTime(time: ZonedDateTime) = customUserTime.update { time } - fun setDialogState(state: TimeZoneDialogState) = _dialogState.update { state } + fun setDialogState(state: TimeZoneDialogState) = dialogState.update { state } fun onDragEnd( tz: FavoriteZone, - targetPosition: Int + targetPosition: Int, ) = viewModelScope.launch { timezonesRepository.moveTimeZone(tz, targetPosition) } @@ -78,11 +78,11 @@ internal class TimeZoneViewModel @Inject constructor( timezonesRepository.removeFromFavorites(timeZone) } - fun selectTimeZone(timeZone: FavoriteZone?) = _selectedTimeZone.update { timeZone } + fun selectTimeZone(timeZone: FavoriteZone?) = selectedTimeZone.update { timeZone } fun updateLabel( timeZone: FavoriteZone, - label: String + label: String, ) = viewModelScope.launch { timezonesRepository.updateLabel(timeZone = timeZone, label = label) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZoneItem.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZoneItem.kt index 2508d968..b292102b 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZoneItem.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/FavoriteTimeZoneItem.kt @@ -99,7 +99,7 @@ internal fun FavoriteTimeZoneItem( val animatedAlpha by animateFloatAsState( label = "delete animation", targetValue = if (deleteAnimationRunning) 0f else 1f, - finishedListener = { if (it == 0f) onDelete() } + finishedListener = { if (it == 0f) onDelete() }, ) val regionName = remember(timeZoneNames, localeDisplayNames) { @@ -114,19 +114,19 @@ internal fun FavoriteTimeZoneItem( .graphicsLayer(alpha = animatedAlpha) .then(modifier) .clickable(enabled = !isDragging) { onClick() } - .padding(vertical = 16.dp, horizontal = 12.dp) + .padding(vertical = 16.dp, horizontal = 12.dp), ) { TimeZoneLabel( label = item.label, expanded = expanded, - onLabelClick = onLabelClick + onLabelClick = onLabelClick, ) Row( modifier = Modifier .padding() .heightIn(min = 56.dp), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp) + horizontalArrangement = Arrangement.spacedBy(4.dp), ) { Column( modifier = Modifier @@ -139,16 +139,16 @@ internal fun FavoriteTimeZoneItem( style = MaterialTheme.typography.bodyLarge, maxLines = 2, overflow = TextOverflow.Ellipsis, - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) AnimatedVisibility( visible = offsetTimeFormatted != null, - label = "Nullable offset" + label = "Nullable offset", ) { Text( text = offsetTimeFormatted ?: "", style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant + color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -157,12 +157,12 @@ internal fun FavoriteTimeZoneItem( label = "Time change", transitionSpec = { fadeIn() togetherWith fadeOut() using (SizeTransform(clip = false)) - } + }, ) { time -> Text( text = time, style = MaterialTheme.typography.headlineMedium, - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) } } @@ -173,13 +173,13 @@ internal fun FavoriteTimeZoneItem( title = stringResource(R.string.select_time_label), icon = Icons.Outlined.Schedule, contentDescription = stringResource(R.string.select_time_label), - onClick = { onPrimaryClick(offsetTime) } + onClick = { onPrimaryClick(offsetTime) }, ) TimeZoneOption( title = stringResource(R.string.delete_label), icon = Icons.Outlined.Delete, contentDescription = stringResource(R.string.delete_label), - onClick = { deleteAnimationRunning = true } + onClick = { deleteAnimationRunning = true }, ) } } @@ -192,7 +192,7 @@ private fun TimeZoneOption( icon: ImageVector, contentDescription: String, onClick: () -> Unit, -) = ProvideColor(MaterialTheme.colorScheme.onSurfaceVariant){ +) = ProvideColor(MaterialTheme.colorScheme.onSurfaceVariant) { Row( modifier = Modifier .clip(RoundedCornerShape(4.dp)) @@ -200,7 +200,7 @@ private fun TimeZoneOption( .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { Icon( imageVector = icon, @@ -219,7 +219,7 @@ private fun TimeZoneLabel( onLabelClick: () -> Unit, ) = ProvideStyle( color = MaterialTheme.colorScheme.onSurfaceVariant, - textStyle = MaterialTheme.typography.bodyMedium + textStyle = MaterialTheme.typography.bodyMedium, ) { AnimatedContent( label = "Expand animation", @@ -230,11 +230,12 @@ private fun TimeZoneLabel( AnimatedVisibility(expanded) { Row( modifier = Modifier.height(24.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Default.Edit, - contentDescription = null, // Not required because there is text next to it + // Not required because there is text next to it + contentDescription = null, modifier = Modifier.padding(end = 8.dp), ) Text( @@ -245,12 +246,13 @@ private fun TimeZoneLabel( } else { Row( modifier = Modifier.height(24.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { AnimatedVisibility(visible = expanded) { Icon( imageVector = Icons.Default.Edit, - contentDescription = null, // Not required because there is text next to it + // Not required because there is text next to it + contentDescription = null, modifier = Modifier.padding(end = 8.dp), ) } @@ -277,7 +279,7 @@ private class FavoriteTimeZoneItemParameterProvider : tz = FavoriteZone( timeZone = TimeZone.getDefault(), position = 1, - label = "" + label = "", ), ), FavoriteTimeZoneItemParameter( @@ -285,7 +287,7 @@ private class FavoriteTimeZoneItemParameterProvider : tz = FavoriteZone( timeZone = TimeZone.getDefault(), position = 1, - label = "Some text" + label = "Some text", ), ), FavoriteTimeZoneItemParameter( @@ -293,7 +295,7 @@ private class FavoriteTimeZoneItemParameterProvider : tz = FavoriteZone( timeZone = TimeZone.getDefault(), position = 1, - label = "" + label = "", ), ), FavoriteTimeZoneItemParameter( @@ -301,9 +303,9 @@ private class FavoriteTimeZoneItemParameterProvider : tz = FavoriteZone( timeZone = TimeZone.getDefault(), position = 1, - label = "Some text" + label = "Some text", ), - ) + ), ) } @@ -324,7 +326,7 @@ private fun PreviewFavoriteTimeZones( item = tz.tz, fromTime = ZonedDateTime.parse( "2023-05-01T14:00+03:00[Africa/Addis_Ababa]", - DateTimeFormatter.ISO_ZONED_DATE_TIME + DateTimeFormatter.ISO_ZONED_DATE_TIME, ), expanded = expanded, onClick = { expanded = !expanded }, @@ -333,6 +335,6 @@ private fun PreviewFavoriteTimeZones( onLabelClick = {}, isDragging = false, timeZoneNames = timeZoneNames, - localeDisplayNames = localeDisplayNames + localeDisplayNames = localeDisplayNames, ) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/UserTimeZone.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/UserTimeZone.kt index 6b9b7769..9cf36ecf 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/UserTimeZone.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/components/UserTimeZone.kt @@ -77,7 +77,7 @@ internal fun UserTimeZone( onClick = onClick, onLongClick = onResetClick, cornerRadiusRange = 8.dp..32.dp, - interactionSource = remember { MutableInteractionSource() } + interactionSource = remember { MutableInteractionSource() }, ) .background(MaterialTheme.colorScheme.tertiaryContainer) .padding(horizontal = 16.dp, vertical = 12.dp), @@ -86,11 +86,11 @@ internal fun UserTimeZone( Text( text = userTime.formatZone(locale), style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onTertiaryContainer + color = MaterialTheme.colorScheme.onTertiaryContainer, ) Row( - verticalAlignment = Alignment.Bottom + verticalAlignment = Alignment.Bottom, ) { SlidingText(userTime.formatTimeHours(locale, is24Hour)) TimeSeparator() @@ -104,7 +104,7 @@ internal fun UserTimeZone( Text( text = userTime.formatDateDayMonthYear(locale), style = MaterialTheme.typography.headlineMedium, - color = MaterialTheme.colorScheme.onTertiaryContainer + color = MaterialTheme.colorScheme.onTertiaryContainer, ) } AnimatedVisibility( @@ -132,16 +132,16 @@ private fun SlidingText( label = "user time change", transitionSpec = { slideInVertically { height -> height } + fadeIn() togetherWith - slideOutVertically { height -> -height } + fadeOut() using - SizeTransform() - } + slideOutVertically { height -> -height } + fadeOut() using + SizeTransform() + }, ) { target -> Text( text = target, style = MaterialTheme.typography.displayLarge, color = MaterialTheme.colorScheme.onTertiaryContainer, overflow = TextOverflow.Visible, - maxLines = 1 + maxLines = 1, ) } } @@ -153,7 +153,7 @@ private fun TimeSeparator() { style = MaterialTheme.typography.displayLarge, color = MaterialTheme.colorScheme.onTertiaryContainer, overflow = TextOverflow.Visible, - maxLines = 1 + maxLines = 1, ) } @@ -165,6 +165,6 @@ private fun PreviewUserTimeZone() { userTime = ZonedDateTime.now(), onClick = {}, onResetClick = {}, - showReset = true + showReset = true, ) } diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt index ff2a8dcf..bde0885d 100644 --- a/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt +++ b/feature/timezone/src/main/java/com/sadellie/unitto/feature/timezone/navigation/TimeZoneNavigation.kt @@ -40,7 +40,7 @@ private const val ADD_TIME_ZONE_ROUTE = "ADD_TIME_ZONE_ROUTE" private const val USER_TIME_ARG = "USER_TIME_ARG" private fun NavController.navigateToAddTimeZone( - userTime: ZonedDateTime + userTime: ZonedDateTime, ) { val formattedTime = userTime .format(DateTimeFormatter.ISO_ZONED_DATE_TIME) @@ -57,8 +57,8 @@ fun NavGraphBuilder.timeZoneGraph( startDestination = start, route = graph, deepLinks = listOf( - navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" } - ) + navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }, + ), ) { unittoComposable(start) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { @@ -68,7 +68,7 @@ fun NavGraphBuilder.timeZoneGraph( TimeZoneRoute( openDrawer = openDrawer, - navigateToAddTimeZone = navController::navigateToAddTimeZone + navigateToAddTimeZone = navController::navigateToAddTimeZone, ) } @@ -79,8 +79,8 @@ fun NavGraphBuilder.timeZoneGraph( defaultValue = null nullable = true type = NavType.StringType - } - ) + }, + ), ) { stackEntry -> if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { EmptyScreen() @@ -95,7 +95,7 @@ fun NavGraphBuilder.timeZoneGraph( AddTimeZoneRoute( navigateUp = navController::navigateUp, - userTime = userTime + userTime = userTime, ) } } diff --git a/gradle/init.gradle.kts b/gradle/init.gradle.kts new file mode 100644 index 00000000..f0ae9341 --- /dev/null +++ b/gradle/init.gradle.kts @@ -0,0 +1,66 @@ +/* + * Unitto is a calculator 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 . + */ + +val ktlintVersion = "1.0.1" + +initscript { + val spotlessVersion = "6.23.3" + + repositories { + mavenCentral() + } + + dependencies { + classpath("com.diffplug.spotless:spotless-plugin-gradle:$spotlessVersion") + } +} + +rootProject { + subprojects { + apply() + extensions.configure { + kotlin { + target("**/*.kt") + targetExclude( + "**/build/**/*.kt", + "**/com/sadellie/unitto/data/converter/collections/*.kt", + "**/com/sadellie/unitto/core/ui/common/icons/iconpack/*.kt", + ) + ktlint(ktlintVersion).editorConfigOverride( + mapOf( + "android" to "true", + ), + ) + toggleOffOn() + // TODO licenseHeaderFile(rootProject.file("spotless/copyright.kt")) + } + format("kts") { + target("**/*.kts") + targetExclude("**/build/**/*.kts") + // Look for the first line that doesn't have a block comment (assumed to be the license) + // TODO licenseHeaderFile(rootProject.file("spotless/copyright.kts"), "(^(?![\\/ ]\\*).*$)") + } + format("xml") { + target("**/*.xml") + targetExclude("**/build/**/*.xml") + // Look for the first XML tag that isn't a comment ( Read the article diff --git a/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt index 5c2e5648..084f5428 100644 --- a/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt +++ b/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt @@ -99,4 +99,6 @@ interface UserPreferencesRepository { suspend fun updateAdditionalButtons(enabled: Boolean) suspend fun updateInverseMode(enabled: Boolean) + + suspend fun updateHasSeenNewAppAnnouncement(value: Boolean) } diff --git a/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt b/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt index f5ec03e3..eedcb342 100644 --- a/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt +++ b/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt @@ -21,4 +21,5 @@ package app.myzel394.numberhub.data.model.userprefs interface GeneralPreferences { val lastReadChangelog: String val enableVibrations: Boolean + val hasSeenNewAppAnnouncement: Boolean } diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt index 08907c59..8fc3e046 100644 --- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt +++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt @@ -77,6 +77,10 @@ internal fun Preferences.getRadianMode(): Boolean { return this[PrefsKeys.RADIAN_MODE] ?: true } +internal fun Preferences.getHasSeenNewAppAnnouncement(): Boolean { + return this[PrefsKeys.HAS_SEEN_NEW_APP_ANNOUNCEMENT] ?: false +} + internal fun Preferences.getFormatterSymbols(): FormatterSymbols { val grouping = this[PrefsKeys.FORMATTER_GROUPING] val fractional = this[PrefsKeys.FORMATTER_FRACTIONAL] diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt index 3f64ed0f..0fafec83 100644 --- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt +++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt @@ -50,6 +50,7 @@ data class AppPreferencesImpl( data class GeneralPreferencesImpl( override val lastReadChangelog: String, override val enableVibrations: Boolean, + override val hasSeenNewAppAnnouncement: Boolean, ) : GeneralPreferences data class CalculatorPreferencesImpl( diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt index cb0f7f77..a97ef803 100644 --- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt +++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt @@ -37,6 +37,7 @@ object PrefsKeys { val ENABLE_VIBRATIONS = booleanPreferencesKey("ENABLE_VIBRATIONS_PREF_KEY") val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY") val AC_BUTTON = booleanPreferencesKey("AC_BUTTON_PREF_KEY") + val HAS_SEEN_NEW_APP_ANNOUNCEMENT = booleanPreferencesKey("HAS_SEEN_NEW_APP_ANNOUNCEMENT_PREF_KEY") // val RPN_MODE = booleanPreferencesKey("RPN_MODE_PREF_KEY") // FORMATTER diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt index 6a23659d..c047af42 100644 --- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt +++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt @@ -70,6 +70,7 @@ class UserPreferencesRepositoryImpl @Inject constructor( GeneralPreferencesImpl( lastReadChangelog = preferences.getLastReadChangelog(), enableVibrations = preferences.getEnableVibrations(), + hasSeenNewAppAnnouncement = preferences.getHasSeenNewAppAnnouncement(), ) } @@ -325,4 +326,10 @@ class UserPreferencesRepositoryImpl @Inject constructor( preferences[PrefsKeys.INVERSE_MODE] = enabled } } + + override suspend fun updateHasSeenNewAppAnnouncement(value: Boolean) { + dataStore.edit { preferences -> + preferences[PrefsKeys.HAS_SEEN_NEW_APP_ANNOUNCEMENT] = value + } + } } diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt index b13d328e..bdab1c79 100644 --- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt @@ -50,6 +50,7 @@ import androidx.compose.material.icons.filled.RateReview import androidx.compose.material.icons.filled.SwapHoriz import androidx.compose.material.icons.filled.Vibration import androidx.compose.material.icons.filled._123 +import androidx.compose.material.icons.outlined.CheckCircle import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu @@ -119,6 +120,7 @@ internal fun SettingsRoute( uiState = uiState, openDrawer = openDrawer, navControllerAction = navControllerAction, + onHasSeenNewAppAnnouncement = viewModel::updateHasSeenNewAppAnnouncement, updateLastReadChangelog = viewModel::updateLastReadChangelog, updateVibrations = viewModel::updateVibrations, clearCache = viewModel::clearCache, @@ -135,6 +137,7 @@ private fun SettingsScreen( navControllerAction: (String) -> Unit, updateLastReadChangelog: (String) -> Unit, updateVibrations: (Boolean) -> Unit, + onHasSeenNewAppAnnouncement: (Boolean) -> Unit, clearCache: () -> Unit, backup: (Context, Uri) -> Unit, restore: (Context, Uri) -> Unit, @@ -197,6 +200,25 @@ private fun SettingsScreen( .verticalScroll(rememberScrollState()) .padding(padding), ) { + AnimatedVisibility( + visible = !uiState.hasSeenNewAppAnnouncement, + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut(), + ) { + val title = stringResource(R.string.settings_numberhub_newApp) + AnnoyingBox( + modifier = Modifier + .padding(16.dp, 8.dp) + .fillMaxWidth(), + imageVector = Icons.Outlined.CheckCircle, + imageVectorContentDescription = title, + title = title, + support = stringResource(R.string.settings_numberhub_newApp_message), + ) { + //onHasSeenNewAppAnnouncement(true) + } + } + AnimatedVisibility( visible = uiState.showUpdateChangelog, enter = expandVertically() + fadeIn(), @@ -339,6 +361,7 @@ private fun PreviewSettingsScreen() { cacheSize = 2, backupInProgress = false, showUpdateChangelog = true, + hasSeenNewAppAnnouncement = false, ), ) } @@ -347,6 +370,9 @@ private fun PreviewSettingsScreen() { uiState = uiState, openDrawer = {}, navControllerAction = {}, + onHasSeenNewAppAnnouncement = { + uiState = uiState.copy(hasSeenNewAppAnnouncement = true) + }, updateLastReadChangelog = { uiState = uiState.copy(showUpdateChangelog = false) }, diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt index 06157187..1c0b2ccf 100644 --- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt +++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt @@ -26,5 +26,6 @@ internal sealed class SettingsUIState { val cacheSize: Int, val backupInProgress: Boolean, val showUpdateChangelog: Boolean, + val hasSeenNewAppAnnouncement: Boolean, ) : SettingsUIState() } diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt index 6ee7718e..3a30540a 100644 --- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt @@ -62,6 +62,7 @@ internal class SettingsViewModel @Inject constructor( cacheSize = cacheSize, backupInProgress = backupInProgress, showUpdateChangelog = prefs.lastReadChangelog != BuildConfig.VERSION_CODE, + hasSeenNewAppAnnouncement = prefs.hasSeenNewAppAnnouncement, ) } .stateIn(viewModelScope, SettingsUIState.Loading) @@ -100,6 +101,10 @@ internal class SettingsViewModel @Inject constructor( } } + fun updateHasSeenNewAppAnnouncement(value: Boolean) = viewModelScope.launch { + userPrefsRepository.updateHasSeenNewAppAnnouncement(value) + } + /** * @see UserPreferencesRepository.updateLastReadChangelog */ From a8a5e36047cc083eea94d2f47707ed1988912ef8 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:40:34 +0200 Subject: [PATCH 42/46] feat: Add announcement dialog --- core/base/src/main/res/values/strings.xml | 1 + .../feature/settings/SettingsScreen.kt | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index 645bde68..c462d343 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -324,6 +324,7 @@ Maybe this can be labeled better? Let me know. It should be something that can d Unitto is now NumberHub! Unitto has been discontinued. You\'re one of the first users to try NumberHub! Please spread the word and share the app with your friends. Thank you for your support! + NumberHub serves as a drop-in replacement for Unitto. It has the same features and more. NumberHub is still in beta and changes may occur. Please report any issues you find. Thanks for being one of the first to try it out! Read the article diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt index bdab1c79..81710470 100644 --- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt @@ -52,6 +52,7 @@ import androidx.compose.material.icons.filled.Vibration import androidx.compose.material.icons.filled._123 import androidx.compose.material.icons.outlined.CheckCircle import androidx.compose.material.icons.outlined.NewReleases +import androidx.compose.material3.AlertDialog import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem @@ -59,12 +60,14 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TextButton 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.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -200,6 +203,30 @@ private fun SettingsScreen( .verticalScroll(rememberScrollState()) .padding(padding), ) { + var showNewAppInfo by rememberSaveable { + mutableStateOf(false) + } + + if (showNewAppInfo) { + AlertDialog( + icon = { + Icon(Icons.Outlined.CheckCircle, null) + }, + title = { + Text(stringResource(R.string.settings_numberhub_newApp)) + }, + text = { + Text(stringResource(R.string.settings_numberhub_newApp_announcement)) + }, + confirmButton = { + TextButton(onClick = { showNewAppInfo = false }) { + Text(stringResource(R.string.ok_label)) + } + }, + onDismissRequest = { showNewAppInfo = false }, + ) + } + AnimatedVisibility( visible = !uiState.hasSeenNewAppAnnouncement, enter = expandVertically() + fadeIn(), @@ -215,6 +242,7 @@ private fun SettingsScreen( title = title, support = stringResource(R.string.settings_numberhub_newApp_message), ) { + showNewAppInfo = true //onHasSeenNewAppAnnouncement(true) } } From c292d4bc05c59be557df7f2a5b0ed52fcdbb0613 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:42:21 +0200 Subject: [PATCH 43/46] fix: Change app name to NumberHub --- core/base/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index c462d343..b6e9246b 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -21,7 +21,7 @@ Add - Unitto + NumberHub Height @@ -220,7 +220,7 @@ Used in this dialog window. Should be short --> https://s3.eu-west-1.amazonaws.com/po-pub/i/1oIHPj16krI0jyLmg4JaP2mk.png --> Selected item - About Unitto + About NumberHub Learn about the app From 39606d3e035031b7c6f881780e2ef7dc1f85390e Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:49:19 +0200 Subject: [PATCH 44/46] fix: Use new GitHub link --- core/base/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/base/build.gradle.kts b/core/base/build.gradle.kts index d5fa3202..73ad0b5b 100644 --- a/core/base/build.gradle.kts +++ b/core/base/build.gradle.kts @@ -39,7 +39,7 @@ android { getByName("fdroid") { stringConfigField( "STORE_LINK", - "https://github.com/sadellie/unitto" + "https://github.com/Myzel394/NumberHub" ) } } From 95262e6a42f1574d56abbde3b5bb4fcdc578d481 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:01:04 +0200 Subject: [PATCH 45/46] fix: Remove garbage test --- .../app/myzel394/numberhub/core/ui/CleanAndFilterExpression.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/ui/src/test/java/app/myzel394/numberhub/core/ui/CleanAndFilterExpression.kt b/core/ui/src/test/java/app/myzel394/numberhub/core/ui/CleanAndFilterExpression.kt index d2d07b53..5cffba44 100644 --- a/core/ui/src/test/java/app/myzel394/numberhub/core/ui/CleanAndFilterExpression.kt +++ b/core/ui/src/test/java/app/myzel394/numberhub/core/ui/CleanAndFilterExpression.kt @@ -52,10 +52,12 @@ class CleanAndFilterExpression { assertEquals("123456.789+1234÷56789", "123,456.789 1234⁄56789".clearAndFilterExpression(formatterSymbols)) } + /* @Test fun garbage() { // 'e' is a known symbol assertEquals("eeee−123", "pee pee poo poo -123".clearAndFilterExpression(formatterSymbols)) assertEquals("eeee−123.456", "pee pee poo poo -123.456".clearAndFilterExpression(formatterSymbols)) } + */ } From 5a53d5752a81352ad60135d3582e385461d2e588 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:01:15 +0200 Subject: [PATCH 46/46] feat(ci-cd): Run tests before building --- .github/workflows/build-testing.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-testing.yaml b/.github/workflows/build-testing.yaml index 66e053e0..4cc6657b 100644 --- a/.github/workflows/build-testing.yaml +++ b/.github/workflows/build-testing.yaml @@ -18,9 +18,11 @@ jobs: java-version: 21 cache: "gradle" + - name: Run tests + run: ./gradlew test + - name: Compile - run: | - ./gradlew assembleDebug + run: ./gradlew assembleDebug - name: Upload APK uses: actions/upload-artifact@v4