diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml
index d8408acd..4b7955a9 100644
--- a/core/base/src/main/res/values/strings.xml
+++ b/core/base/src/main/res/values/strings.xml
@@ -1368,4 +1368,6 @@ Used in this dialog window. Should be short -->
Yesterday
Search…
Add time zone
+ Zero in the middle
+ Swap zero and decimal buttons
\ No newline at end of file
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 6f2b797e..f65b7fca 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
@@ -83,6 +83,7 @@ data class UserPreferences(
val unitConverterFavoritesOnly: Boolean = false,
val unitConverterFormatTime: Boolean = false,
val unitConverterSorting: UnitsListSorting = UnitsListSorting.USAGE,
+ val middleZero: Boolean = false,
)
data class UIPreferences(
@@ -107,6 +108,7 @@ data class MainPreferences(
val unitConverterFavoritesOnly: Boolean = false,
val unitConverterFormatTime: Boolean = false,
val unitConverterSorting: UnitsListSorting = UnitsListSorting.USAGE,
+ val middleZero: Boolean = false,
)
/**
@@ -135,6 +137,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
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")
+ val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY")
}
val uiPreferencesFlow: Flow = dataStore.data
@@ -199,6 +202,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
val unitConverterFavoritesOnly: Boolean = preferences[PrefsKeys.UNIT_CONVERTER_FAVORITES_ONLY] ?: false
val unitConverterFormatTime: Boolean = preferences[PrefsKeys.UNIT_CONVERTER_FORMAT_TIME] ?: false
val unitConverterSorting: UnitsListSorting = preferences[PrefsKeys.UNIT_CONVERTER_SORTING]?.let { UnitsListSorting.valueOf(it) } ?: UnitsListSorting.USAGE
+ val middleZero: Boolean = preferences[PrefsKeys.MIDDLE_ZERO] ?: false
MainPreferences(
digitsPrecision = digitsPrecision,
@@ -212,6 +216,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
unitConverterFavoritesOnly = unitConverterFavoritesOnly,
unitConverterFormatTime = unitConverterFormatTime,
unitConverterSorting = unitConverterSorting,
+ middleZero = middleZero,
)
}
@@ -237,6 +242,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
unitConverterFavoritesOnly = main.unitConverterFavoritesOnly,
unitConverterFormatTime = main.unitConverterFormatTime,
unitConverterSorting = main.unitConverterSorting,
+ middleZero = main.middleZero,
)
}
@@ -370,6 +376,17 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
}
}
+ /**
+ * Update preference on where zero should be.
+ *
+ * @param enabled True if user wants zero button to be in the middle.
+ */
+ suspend fun updateMiddleZero(enabled: Boolean) {
+ dataStore.edit { preferences ->
+ preferences[PrefsKeys.MIDDLE_ZERO] = enabled
+ }
+ }
+
/**
* Update preference on whether or not show tools screen.
*
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 4b9f986d..5930c9d6 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
@@ -278,7 +278,8 @@ private fun CalculatorScreen(
clearSymbols = clearSymbols,
deleteSymbol = deleteSymbol,
toggleAngleMode = toggleAngleMode,
- evaluate = evaluate
+ evaluate = evaluate,
+ middleZero = uiState.middleZero,
)
}
}
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 dfb500ca..e4f5d499 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
@@ -30,7 +30,8 @@ data class CalculatorUIState(
val radianMode: Boolean = true,
val history: List = emptyList(),
val allowVibration: Boolean = false,
- val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces
+ val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces,
+ val middleZero: Boolean = false,
)
sealed class CalculationResult(@StringRes val label: Int? = null) {
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 80bc810f..2517823a 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
@@ -75,7 +75,8 @@ internal class CalculatorViewModel @Inject constructor(
radianMode = userPrefs.radianMode,
history = history,
allowVibration = userPrefs.enableVibrations,
- formatterSymbols = AllFormatterSymbols.getById(userPrefs.separator)
+ formatterSymbols = AllFormatterSymbols.getById(userPrefs.separator),
+ middleZero = userPrefs.middleZero,
)
}.stateIn(
viewModelScope, SharingStarted.WhileSubscribed(5000L), CalculatorUIState()
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 f2df5c0b..4599660c 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
@@ -104,6 +104,7 @@ internal fun CalculatorKeyboard(
radianMode: Boolean,
fractional: String,
allowVibration: Boolean,
+ middleZero: Boolean,
addSymbol: (String) -> Unit,
clearSymbols: () -> Unit,
deleteSymbol: () -> Unit,
@@ -116,6 +117,7 @@ internal fun CalculatorKeyboard(
radianMode = radianMode,
fractional = fractional,
allowVibration = allowVibration,
+ middleZero = middleZero,
addSymbol = addSymbol,
toggleAngleMode = toggleAngleMode,
deleteSymbol = deleteSymbol,
@@ -128,6 +130,7 @@ internal fun CalculatorKeyboard(
radianMode = radianMode,
fractional = fractional,
allowVibration = allowVibration,
+ middleZero = middleZero,
addSymbol = addSymbol,
toggleAngleMode = toggleAngleMode,
deleteSymbol = deleteSymbol,
@@ -143,6 +146,7 @@ private fun PortraitKeyboard(
radianMode: Boolean,
fractional: String,
allowVibration: Boolean,
+ middleZero: Boolean,
addSymbol: (String) -> Unit,
toggleAngleMode: () -> Unit,
deleteSymbol: () -> Unit,
@@ -257,8 +261,13 @@ private fun PortraitKeyboard(
KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Plus, allowVibration) { addSymbol(Token.Operator.plus) }
}
Row(weightModifier) {
- KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
- KeyboardButtonLight(mainButtonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ if (middleZero) {
+ KeyboardButtonLight(mainButtonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
+ } else {
+ KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
+ KeyboardButtonLight(mainButtonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Backspace, allowVibration, clearSymbols) { deleteSymbol() }
KeyboardButtonFilled(mainButtonModifier, UnittoIcons.Equal, allowVibration) { evaluate() }
}
@@ -345,6 +354,7 @@ private fun LandscapeKeyboard(
radianMode: Boolean,
fractional: String,
allowVibration: Boolean,
+ middleZero: Boolean,
addSymbol: (String) -> Unit,
toggleAngleMode: () -> Unit,
deleteSymbol: () -> Unit,
@@ -390,13 +400,21 @@ private fun LandscapeKeyboard(
KeyboardButtonLight(buttonModifier, UnittoIcons.Key7, allowVibration) { addSymbol(Token.Digit._7) }
KeyboardButtonLight(buttonModifier, UnittoIcons.Key4, allowVibration) { addSymbol(Token.Digit._4) }
KeyboardButtonLight(buttonModifier, UnittoIcons.Key1, allowVibration) { addSymbol(Token.Digit._1) }
- KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
+ if (middleZero) {
+ KeyboardButtonLight(buttonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ } else {
+ KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
+ }
}
Column(Modifier.weight(1f)) {
KeyboardButtonLight(buttonModifier, UnittoIcons.Key8, allowVibration) { addSymbol(Token.Digit._8) }
KeyboardButtonLight(buttonModifier, UnittoIcons.Key5, allowVibration) { addSymbol(Token.Digit._5) }
KeyboardButtonLight(buttonModifier, UnittoIcons.Key2, allowVibration) { addSymbol(Token.Digit._2) }
- KeyboardButtonLight(buttonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ if (middleZero) {
+ KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration) { addSymbol(Token.Digit._0) }
+ } else {
+ KeyboardButtonLight(buttonModifier, fractionalIcon, allowVibration) { addSymbol(Token.Digit.dot) }
+ }
}
Column(Modifier.weight(1f)) {
KeyboardButtonLight(buttonModifier, UnittoIcons.Key9, allowVibration) { addSymbol(Token.Digit._9) }
@@ -496,6 +514,7 @@ private fun PreviewCalculatorKeyboard() {
deleteSymbol = {},
toggleAngleMode = {},
evaluate = {},
- allowVibration = false
+ allowVibration = false,
+ middleZero = false,
)
}
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 2f684d20..6cd28d27 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
@@ -121,6 +121,7 @@ private fun ConverterScreen(
converterMode = uiState.mode,
allowVibration = uiState.allowVibration,
fractional = uiState.formatterSymbols.fractional,
+ middleZero = uiState.middleZero
)
}
)
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 f225cd85..00458616 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
@@ -47,6 +47,7 @@ data class ConverterUIState(
val unitTo: AbstractUnit? = null,
val mode: ConverterMode = ConverterMode.DEFAULT,
val allowVibration: Boolean = false,
+ val middleZero: Boolean = false,
val formatterSymbols: FormatterSymbols = FormatterSymbols.Spaces,
)
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 016bfe31..93d0ceec 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
@@ -126,7 +126,8 @@ class ConverterViewModel @Inject constructor(
unitTo = unitToValue,
mode = if (_unitFrom.value is NumberBaseUnit) ConverterMode.BASE else ConverterMode.DEFAULT,
allowVibration = prefs.enableVibrations,
- formatterSymbols = AllFormatterSymbols.getById(prefs.separator)
+ formatterSymbols = AllFormatterSymbols.getById(prefs.separator),
+ middleZero = prefs.middleZero,
)
}.stateIn(
viewModelScope, SharingStarted.WhileSubscribed(5000), ConverterUIState()
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 74a05162..38d8e94e 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
@@ -78,10 +78,11 @@ internal fun ConverterKeyboard(
converterMode: ConverterMode,
allowVibration: Boolean,
fractional: String,
+ middleZero: Boolean,
) {
Crossfade(converterMode, modifier = modifier) {
when (it) {
- ConverterMode.DEFAULT -> DefaultKeyboard(addDigit, clearInput, deleteDigit, allowVibration, fractional)
+ ConverterMode.DEFAULT -> DefaultKeyboard(addDigit, clearInput, deleteDigit, allowVibration, fractional, middleZero)
ConverterMode.BASE -> BaseKeyboard(addDigit, clearInput, deleteDigit, allowVibration)
}
}
@@ -94,6 +95,7 @@ private fun DefaultKeyboard(
deleteDigit: () -> Unit,
allowVibration: Boolean,
fractional: String,
+ middleZero: Boolean,
) {
val fractionalIcon = remember { if (fractional == Token.Digit.dot) UnittoIcons.Dot else UnittoIcons.Comma }
ColumnWithConstraints {
@@ -129,8 +131,13 @@ private fun DefaultKeyboard(
KeyboardButtonFilled(bModifier, UnittoIcons.Minus, allowVibration) { addDigit(Token.Operator.minus) }
}
Row(cModifier, horizontalArrangement) {
- KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(Token.Digit._0) }
- KeyboardButtonLight(bModifier, fractionalIcon, allowVibration) { addDigit(Token.Digit.dot) }
+ if (middleZero) {
+ KeyboardButtonLight(bModifier, fractionalIcon, allowVibration) { addDigit(Token.Digit.dot) }
+ KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(Token.Digit._0) }
+ } else {
+ KeyboardButtonLight(bModifier, UnittoIcons.Key0, allowVibration) { addDigit(Token.Digit._0) }
+ KeyboardButtonLight(bModifier, fractionalIcon, allowVibration) { addDigit(Token.Digit.dot) }
+ }
KeyboardButtonLight(bModifier, UnittoIcons.Backspace, allowVibration, clearInput) { deleteDigit() }
KeyboardButtonFilled(bModifier, UnittoIcons.Plus, allowVibration) { addDigit(Token.Operator.plus) }
}
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 e0f97a18..67733db8 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
@@ -21,6 +21,7 @@ package com.sadellie.unitto.feature.settings
import androidx.compose.foundation.clickable
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ExposureZero
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Palette
@@ -173,6 +174,22 @@ internal fun SettingsScreen(
// ADDITIONAL GROUP
item { Header(stringResource(R.string.additional_settings_group)) }
+ // MIDDLE ZERO
+ item {
+ UnittoListItem(
+ label = stringResource(R.string.middle_zero_option),
+ leadingContent = {
+ Icon(
+ Icons.Default.ExposureZero,
+ stringResource(R.string.middle_zero_option)
+ )
+ },
+ supportContent = stringResource(R.string.middle_zero_option_support),
+ switchState = userPrefs.value.middleZero,
+ onSwitchChange = viewModel::updateMiddleZero
+ )
+ }
+
// VIBRATIONS
item {
UnittoListItem(
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 d2f891c6..a9e7720d 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
@@ -49,6 +49,15 @@ class SettingsViewModel @Inject constructor(
}
}
+ /**
+ * @see UserPreferencesRepository.updateMiddleZero
+ */
+ fun updateMiddleZero(enabled: Boolean) {
+ viewModelScope.launch {
+ userPrefsRepository.updateMiddleZero(enabled)
+ }
+ }
+
/**
* @see UserPreferencesRepository.updateStartingScreen
*/