Show additional info for unit and currency converter (#720)
* Now for conversion patterns such as "TO > FROM" and "TO - FROM" are accepted Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> * Added help URL for unit converter Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> * Localized supported units are now shown on a screen that can be invoked from unit converter settings Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> * Made localizable titles for dimensions and preferences Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> * Show currency units on list if enabled. Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> * Supported units are now listed inline instead of a separate screen. Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx> --------- Signed-off-by: Guillermo Villafuerte <gvillafu@comunidad.unam.mx>
This commit is contained in:
+3
@@ -3,11 +3,13 @@ package de.mm20.launcher2.ui.launcher.search.unitconverter
|
||||
import android.icu.text.DateFormat
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.*
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
@@ -15,6 +17,7 @@ import androidx.compose.ui.unit.dp
|
||||
import de.mm20.launcher2.search.data.CurrencyUnitConverter
|
||||
import de.mm20.launcher2.search.data.UnitConverter
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.unitconverter.Dimension
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
|
||||
+71
-1
@@ -1,19 +1,49 @@
|
||||
package de.mm20.launcher2.ui.settings.unitconverter
|
||||
|
||||
import android.icu.util.Currency
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.material3.LinearProgressIndicator
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.pluralStringResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.preferences.search.UnitConverterSettings
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||
import de.mm20.launcher2.ui.launcher.search.unitconverter.getDimensionIcon
|
||||
import de.mm20.launcher2.unitconverter.converters.CurrencyConverter
|
||||
import de.mm20.launcher2.unitconverter.converters.SimpleFactorConverter
|
||||
import de.mm20.launcher2.unitconverter.converters.TemperatureConverter
|
||||
import org.koin.androidx.compose.inject
|
||||
|
||||
@Composable
|
||||
fun UnitConverterSettingsScreen() {
|
||||
val settings: UnitConverterSettings by inject()
|
||||
val viewModel: UnitConverterSettingsScreenVM = viewModel()
|
||||
PreferenceScreen(title = stringResource(R.string.preference_search_unitconverter)) {
|
||||
val loading by viewModel.loading
|
||||
|
||||
val currenciesEnabled by settings.currencies.collectAsState(initial = false)
|
||||
|
||||
LaunchedEffect(currenciesEnabled) {
|
||||
viewModel.loadCurrencies()
|
||||
}
|
||||
|
||||
PreferenceScreen(title = stringResource(R.string.preference_search_unitconverter),
|
||||
helpUrl = "https://kvaesitso.mm20.de/docs/user-guide/search/unit-converter") {
|
||||
if (loading) {
|
||||
item {
|
||||
LinearProgressIndicator(
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
}
|
||||
}
|
||||
item {
|
||||
PreferenceCategory {
|
||||
val unitConverter by viewModel.unitConverter.collectAsState()
|
||||
@@ -36,6 +66,46 @@ fun UnitConverterSettingsScreen() {
|
||||
}
|
||||
)
|
||||
}
|
||||
PreferenceCategory(
|
||||
title = stringResource(R.string.preference_search_supportedunits)
|
||||
) {
|
||||
for (converter in viewModel.convertersList.value) {
|
||||
val units = buildString {
|
||||
when (converter) {
|
||||
is SimpleFactorConverter -> {
|
||||
converter.standardUnits.forEachIndexed { index, unit ->
|
||||
if (index > 0) append(", ")
|
||||
append(pluralStringResource(unit.nameResource, 1))
|
||||
append(" (${unit.symbol})")
|
||||
}
|
||||
}
|
||||
|
||||
is TemperatureConverter -> {
|
||||
converter.units.forEachIndexed { index, unit ->
|
||||
if (index > 0) append(", ")
|
||||
append(pluralStringResource(unit.nameResource, 1))
|
||||
append(" (${unit.symbol})")
|
||||
}
|
||||
|
||||
}
|
||||
is CurrencyConverter -> {
|
||||
viewModel.currenciesList.value.forEachIndexed { index, currency ->
|
||||
if (index > 0) append(", ")
|
||||
append(Currency.getInstance(currency)?.displayName ?: currency)
|
||||
append(" ($currency)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Preference(
|
||||
title = stringResource(converter.dimension.resource),
|
||||
icon = getDimensionIcon(converter.dimension),
|
||||
summary = units
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+26
@@ -1,9 +1,16 @@
|
||||
package de.mm20.launcher2.ui.settings.unitconverter
|
||||
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import de.mm20.launcher2.preferences.search.UnitConverterSettings
|
||||
import de.mm20.launcher2.unitconverter.UnitConverterRepository
|
||||
import de.mm20.launcher2.unitconverter.converters.Converter
|
||||
import de.mm20.launcher2.unitconverter.converters.CurrencyConverter
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -13,6 +20,11 @@ import org.koin.core.component.inject
|
||||
class UnitConverterSettingsScreenVM: ViewModel(), KoinComponent {
|
||||
|
||||
private val settings: UnitConverterSettings by inject()
|
||||
private val repository: UnitConverterRepository by inject()
|
||||
|
||||
val loading = mutableStateOf(false)
|
||||
val convertersList = mutableStateOf(emptyList<Converter>())
|
||||
val currenciesList = mutableStateOf(emptyList<String>())
|
||||
|
||||
val unitConverter = settings.enabled
|
||||
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
|
||||
@@ -25,4 +37,18 @@ class UnitConverterSettingsScreenVM: ViewModel(), KoinComponent {
|
||||
fun setCurrencyConverter(currencyConverter: Boolean) {
|
||||
settings.setCurrencies(currencyConverter)
|
||||
}
|
||||
fun loadCurrencies() {
|
||||
loading.value = true
|
||||
viewModelScope.launch(Dispatchers.Default) {
|
||||
convertersList.value = repository.availableConverters(
|
||||
settings.currencies.distinctUntilChanged().first()
|
||||
)
|
||||
|
||||
val currencyConverter = convertersList.value.find { it is CurrencyConverter }
|
||||
if (currencyConverter != null) {
|
||||
currenciesList.value = (currencyConverter as CurrencyConverter).getAbbreviations()
|
||||
}
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user