From f7cfd6563984c449a5ebc2811fc653db02a20706 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Mon, 27 Mar 2023 14:49:55 +0300 Subject: [PATCH] Save Angle mode --- .../unitto/data/userprefs/UserPreferences.kt | 20 +++++++++- .../unitto/feature/calculator/AngleMode.kt | 21 ----------- .../feature/calculator/CalculatorScreen.kt | 2 +- .../feature/calculator/CalculatorUIState.kt | 2 +- .../feature/calculator/CalculatorViewModel.kt | 24 +++++------- .../components/CalculatorKeyboard.kt | 37 +++++++++---------- 6 files changed, 47 insertions(+), 59 deletions(-) delete mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/AngleMode.kt 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 d8453d02..21ad7def 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 @@ -54,6 +54,7 @@ import javax.inject.Inject * @property shownUnitGroups [UnitGroup]s that user wants to see. Excludes other [UnitGroup]s, * @property enableVibrations When true will use haptic feedback in app. * @property enableToolsExperiment When true will enable experimental Tools screen. + * @property radianMode AngleMode in mxParser. When true - Radian, when False - Degree. */ data class UserPreferences( val themingMode: ThemingMode? = null, @@ -67,7 +68,8 @@ data class UserPreferences( val shownUnitGroups: List = ALL_UNIT_GROUPS, val enableVibrations: Boolean = true, val enableToolsExperiment: Boolean = false, - val startingScreen: String = TopLevelDestinations.Converter.route + val startingScreen: String = TopLevelDestinations.Converter.route, + val radianMode: Boolean = true ) /** @@ -90,6 +92,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS val ENABLE_VIBRATIONS = booleanPreferencesKey("ENABLE_VIBRATIONS_PREF_KEY") val ENABLE_TOOLS_EXPERIMENT = booleanPreferencesKey("ENABLE_TOOLS_EXPERIMENT_PREF_KEY") val STARTING_SCREEN = stringPreferencesKey("STARTING_SCREEN_PREF_KEY") + val RADIAN_MODE = booleanPreferencesKey("RADIAN_MODE_PREF_KEY") } val userPreferencesFlow: Flow = dataStore.data @@ -134,6 +137,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS val enableVibrations: Boolean = preferences[PrefsKeys.ENABLE_VIBRATIONS] ?: true val enableToolsExperiment: Boolean = preferences[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] ?: false val startingScreen: String = preferences[PrefsKeys.STARTING_SCREEN] ?: TopLevelDestinations.Converter.route + val radianMode: Boolean = preferences[PrefsKeys.RADIAN_MODE] ?: true UserPreferences( themingMode = themingMode, @@ -147,7 +151,8 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS shownUnitGroups = shownUnitGroups, enableVibrations = enableVibrations, enableToolsExperiment = enableToolsExperiment, - startingScreen = startingScreen + startingScreen = startingScreen, + radianMode = radianMode ) } @@ -269,4 +274,15 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS preferences[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] = enabled } } + + /** + * Update angle mode for calculator. + * + * @param radianMode When true - Radian, when False - Degree. + */ + suspend fun updateRadianMode(radianMode: Boolean) { + dataStore.edit { preferences -> + preferences[PrefsKeys.RADIAN_MODE] = radianMode + } + } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/AngleMode.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/AngleMode.kt deleted file mode 100644 index 67318a58..00000000 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/AngleMode.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Unitto is a unit converter for Android - * Copyright (c) 2023 Elshan Agaev - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sadellie.unitto.feature.calculator - -internal enum class AngleMode { DEG, RAD } 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 01b8b82f..d45f567a 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 @@ -269,7 +269,7 @@ private fun CalculatorScreen( numPad = { CalculatorKeyboard( modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), - angleMode = uiState.angleMode, + radianMode = uiState.radianMode, allowVibration = uiState.allowVibration, addSymbol = addSymbol, clearSymbols = clearSymbols, 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 0db225fc..36f46269 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 @@ -24,7 +24,7 @@ import com.sadellie.unitto.data.model.HistoryItem internal data class CalculatorUIState( val input: TextFieldValue = TextFieldValue(), val output: String = "", - val angleMode: AngleMode = AngleMode.RAD, + val radianMode: Boolean = true, val history: List = emptyList(), val allowVibration: Boolean = false ) 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 955f37e0..5bcc7214 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 @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -46,7 +45,7 @@ import org.mariuszgromada.math.mxparser.mXparser as MathParser @HiltViewModel internal class CalculatorViewModel @Inject constructor( - userPrefsRepository: UserPreferencesRepository, + private val userPrefsRepository: UserPreferencesRepository, private val calculatorHistoryRepository: CalculatorHistoryRepository, private val textFieldController: TextFieldController ) : ViewModel() { @@ -58,16 +57,15 @@ internal class CalculatorViewModel @Inject constructor( ) private val _output: MutableStateFlow = MutableStateFlow("") - private val _angleMode: MutableStateFlow = MutableStateFlow(AngleMode.RAD) private val _history = calculatorHistoryRepository.historyFlow val uiState = combine( - textFieldController.input, _output, _angleMode, _history, _userPrefs - ) { input, output, angleMode, history, userPrefs -> + textFieldController.input, _output, _history, _userPrefs + ) { input, output, history, userPrefs -> return@combine CalculatorUIState( input = input, output = output, - angleMode = angleMode, + radianMode = userPrefs.radianMode, history = history, allowVibration = userPrefs.enableVibrations ) @@ -82,14 +80,8 @@ internal class CalculatorViewModel @Inject constructor( fun clearSymbols() = textFieldController.clearInput() fun toggleCalculatorMode() { - _angleMode.update { - if (it == AngleMode.DEG) { - MathParser.setRadiansMode() - AngleMode.RAD - } else { - MathParser.setDegreesMode() - AngleMode.DEG - } + viewModelScope.launch { + userPrefsRepository.updateRadianMode(!_userPrefs.value.radianMode) } } @@ -185,7 +177,9 @@ internal class CalculatorViewModel @Inject constructor( // Observe and invoke calculation without UI lag. viewModelScope.launch(Dispatchers.Default) { - merge(_userPrefs, textFieldController.input, _angleMode).collectLatest { + combine(_userPrefs, textFieldController.input) { userPrefs, _ -> + if (userPrefs.radianMode) MathParser.setRadiansMode() else MathParser.setDegreesMode() + }.collectLatest { calculateInput() } } 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 37af7526..54357868 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 @@ -93,12 +93,11 @@ import com.sadellie.unitto.core.ui.common.key.unittoicons.RightBracket import com.sadellie.unitto.core.ui.common.key.unittoicons.Sin import com.sadellie.unitto.core.ui.common.key.unittoicons.SquareRootWide import com.sadellie.unitto.core.ui.common.key.unittoicons.Tan -import com.sadellie.unitto.feature.calculator.AngleMode @Composable internal fun CalculatorKeyboard( modifier: Modifier, - angleMode: AngleMode, + radianMode: Boolean, allowVibration: Boolean, addSymbol: (String) -> Unit, clearSymbols: () -> Unit, @@ -109,7 +108,7 @@ internal fun CalculatorKeyboard( if (LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT) { PortraitKeyboard( modifier = modifier, - angleMode = angleMode, + radianMode = radianMode, allowVibration = allowVibration, addSymbol = addSymbol, toggleAngleMode = toggleAngleMode, @@ -120,7 +119,7 @@ internal fun CalculatorKeyboard( } else { LandscapeKeyboard( modifier = modifier, - angleMode = angleMode, + radianMode = radianMode, allowVibration = allowVibration, addSymbol = addSymbol, toggleAngleMode = toggleAngleMode, @@ -134,7 +133,7 @@ internal fun CalculatorKeyboard( @Composable private fun PortraitKeyboard( modifier: Modifier, - angleMode: AngleMode, + radianMode: Boolean, allowVibration: Boolean, addSymbol: (String) -> Unit, toggleAngleMode: () -> Unit, @@ -175,7 +174,7 @@ private fun PortraitKeyboard( allowVibration = allowVibration, addSymbol = addSymbol, showAdditional = showAdditional, - angleMode = angleMode, + radianMode = radianMode, toggleAngleMode = toggleAngleMode, toggleInvMode = { invMode = !invMode } ) @@ -185,7 +184,7 @@ private fun PortraitKeyboard( allowVibration = allowVibration, addSymbol = addSymbol, showAdditional = showAdditional, - angleMode = angleMode, + radianMode = radianMode, toggleAngleMode = toggleAngleMode, toggleInvMode = { invMode = !invMode } ) @@ -241,7 +240,7 @@ private fun AdditionalButtonsPortrait( allowVibration: Boolean, addSymbol: (String) -> Unit, showAdditional: Boolean, - angleMode: AngleMode, + radianMode: Boolean, toggleAngleMode: () -> Unit, toggleInvMode: () -> Unit ) { @@ -255,7 +254,7 @@ private fun AdditionalButtonsPortrait( AnimatedVisibility(showAdditional) { Column { Row(horizontalArrangement = Arrangement.spacedBy(2.dp)) { - KeyboardButtonAdditional(modifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } + KeyboardButtonAdditional(modifier, if (radianMode) UnittoIcons.Rad else UnittoIcons.Deg, allowVibration) { toggleAngleMode() } KeyboardButtonAdditional(modifier, UnittoIcons.Sin, allowVibration) { addSymbol(Token.sin) } KeyboardButtonAdditional(modifier, UnittoIcons.Cos, allowVibration) { addSymbol(Token.cos) } KeyboardButtonAdditional(modifier, UnittoIcons.Tan, allowVibration) { addSymbol(Token.tan) } @@ -277,7 +276,7 @@ private fun AdditionalButtonsPortraitInverse( allowVibration: Boolean, addSymbol: (String) -> Unit, showAdditional: Boolean, - angleMode: AngleMode, + radianMode: Boolean, toggleAngleMode: () -> Unit, toggleInvMode: () -> Unit ) { @@ -291,7 +290,7 @@ private fun AdditionalButtonsPortraitInverse( AnimatedVisibility(showAdditional) { Column { Row(horizontalArrangement = Arrangement.spacedBy(2.dp)) { - KeyboardButtonAdditional(modifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } + KeyboardButtonAdditional(modifier, if (radianMode) UnittoIcons.Rad else UnittoIcons.Deg, allowVibration) { toggleAngleMode() } KeyboardButtonAdditional(modifier, UnittoIcons.ArSin, allowVibration) { addSymbol(Token.arSin) } KeyboardButtonAdditional(modifier, UnittoIcons.ArCos, allowVibration) { addSymbol(Token.arCos) } KeyboardButtonAdditional(modifier, UnittoIcons.AcTan, allowVibration) { addSymbol(Token.acTan) } @@ -310,7 +309,7 @@ private fun AdditionalButtonsPortraitInverse( @Composable private fun LandscapeKeyboard( modifier: Modifier, - angleMode: AngleMode, + radianMode: Boolean, allowVibration: Boolean, addSymbol: (String) -> Unit, toggleAngleMode: () -> Unit, @@ -334,7 +333,7 @@ private fun LandscapeKeyboard( modifier = Modifier.weight(1f), buttonModifier = buttonModifier, allowVibration = allowVibration, - angleMode = angleMode, + radianMode = radianMode, addSymbol = addSymbol, toggleAngleMode = toggleAngleMode, toggleInvMode = { invMode = !invMode } @@ -344,7 +343,7 @@ private fun LandscapeKeyboard( modifier = Modifier.weight(1f), buttonModifier = buttonModifier, allowVibration = allowVibration, - angleMode = angleMode, + radianMode = radianMode, addSymbol = addSymbol, toggleAngleMode = toggleAngleMode, toggleInvMode = { invMode = !invMode } @@ -392,13 +391,13 @@ private fun AdditionalButtonsLandscape( modifier: Modifier, buttonModifier: Modifier, allowVibration: Boolean, - angleMode: AngleMode, + radianMode: Boolean, addSymbol: (String) -> Unit, toggleAngleMode: () -> Unit, toggleInvMode: () -> Unit ) { Column(modifier) { - KeyboardButtonAdditional(buttonModifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } + KeyboardButtonAdditional(buttonModifier, if (radianMode) UnittoIcons.Rad else UnittoIcons.Deg, allowVibration) { toggleAngleMode() } KeyboardButtonAdditional(buttonModifier, UnittoIcons.Inv, allowVibration) { toggleInvMode() } KeyboardButtonAdditional(buttonModifier, UnittoIcons.Sin, allowVibration) { addSymbol(Token.sin) } KeyboardButtonAdditional(buttonModifier, UnittoIcons.E, allowVibration) { addSymbol(Token.e) } @@ -424,13 +423,13 @@ private fun AdditionalButtonsLandscapeInverse( modifier: Modifier, buttonModifier: Modifier, allowVibration: Boolean, - angleMode: AngleMode, + radianMode: Boolean, addSymbol: (String) -> Unit, toggleAngleMode: () -> Unit, toggleInvMode: () -> Unit ) { Column(modifier) { - KeyboardButtonAdditional(buttonModifier, if (angleMode == AngleMode.DEG) UnittoIcons.Deg else UnittoIcons.Rad, allowVibration) { toggleAngleMode() } + KeyboardButtonAdditional(buttonModifier, if (radianMode) UnittoIcons.Rad else UnittoIcons.Deg, allowVibration) { toggleAngleMode() } KeyboardButtonAdditional(buttonModifier, UnittoIcons.Inv, allowVibration) { toggleInvMode() } KeyboardButtonAdditional(buttonModifier, UnittoIcons.ArSin, allowVibration) { addSymbol(Token.arSin) } KeyboardButtonAdditional(buttonModifier, UnittoIcons.E, allowVibration) { addSymbol(Token.e) } @@ -456,7 +455,7 @@ private fun AdditionalButtonsLandscapeInverse( private fun PreviewCalculatorKeyboard() { CalculatorKeyboard( modifier = Modifier, - angleMode = AngleMode.DEG, + radianMode = true, addSymbol = {}, clearSymbols = {}, deleteSymbol = {},