From 8b50c8349d50f31c9df579e8d0bba0f1c3c453ca Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 29 Jun 2026 19:13:30 +0200 Subject: [PATCH] add currency settings --- .../component/preferences/PreferenceScreen.kt | 170 ++++---- .../launcher2/ui/settings/SettingsActivity.kt | 5 + .../colorscheme/CorePaletteColorPreference.kt | 2 +- .../settings/locale/CurrencySettingsScreen.kt | 366 ++++++++++++++++++ .../settings/locale/LocaleSettingsScreen.kt | 24 ++ .../settings/locale/LocaleSettingsScreenVM.kt | 2 + .../launcher2/ui/settings/log/LogScreen.kt | 21 - .../SearchActionsSettingsScreen.kt | 6 +- .../UnitConverterSettingsScreen.kt | 8 + .../UnitConverterSettingsScreenVM.kt | 13 +- .../main/res/drawable/attach_money_24px.xml | 10 + .../main/res/drawable/currency_lira_24px.xml | 10 + .../main/res/drawable/currency_pound_24px.xml | 10 + .../main/res/drawable/currency_ruble_24px.xml | 10 + .../main/res/drawable/currency_rupee_24px.xml | 10 + .../main/res/drawable/currency_yen_24px.xml | 10 + .../main/res/drawable/currency_yuan_24px.xml | 10 + core/base/src/main/res/drawable/euro_24px.xml | 10 + core/base/src/main/res/drawable/toll_24px.xml | 10 + core/i18n/src/main/res/values-ar/strings.xml | 2 +- core/i18n/src/main/res/values-be/strings.xml | 2 +- core/i18n/src/main/res/values-ca/strings.xml | 2 +- core/i18n/src/main/res/values-cs/strings.xml | 2 +- core/i18n/src/main/res/values-da/strings.xml | 2 +- core/i18n/src/main/res/values-de/strings.xml | 2 +- core/i18n/src/main/res/values-es/strings.xml | 2 +- core/i18n/src/main/res/values-et/strings.xml | 2 +- core/i18n/src/main/res/values-eu/strings.xml | 2 +- core/i18n/src/main/res/values-fa/strings.xml | 2 +- core/i18n/src/main/res/values-fi/strings.xml | 2 +- core/i18n/src/main/res/values-fr/strings.xml | 2 +- core/i18n/src/main/res/values-hu/strings.xml | 2 +- core/i18n/src/main/res/values-ia/strings.xml | 2 +- core/i18n/src/main/res/values-it/strings.xml | 2 +- core/i18n/src/main/res/values-iw/strings.xml | 2 +- core/i18n/src/main/res/values-ja/strings.xml | 2 +- core/i18n/src/main/res/values-lt/strings.xml | 2 +- .../src/main/res/values-nb-rNO/strings.xml | 2 +- core/i18n/src/main/res/values-nl/strings.xml | 2 +- core/i18n/src/main/res/values-pl/strings.xml | 2 +- .../src/main/res/values-pt-rBR/strings.xml | 2 +- core/i18n/src/main/res/values-pt/strings.xml | 2 +- core/i18n/src/main/res/values-ru/strings.xml | 2 +- core/i18n/src/main/res/values-th/strings.xml | 2 +- core/i18n/src/main/res/values-tr/strings.xml | 2 +- core/i18n/src/main/res/values-vi/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 2 +- .../src/main/res/values-zh-rTW/strings.xml | 2 +- core/i18n/src/main/res/values/strings.xml | 5 +- .../preferences/LauncherSettingsData.kt | 7 + .../search/UnitConverterSettings.kt | 7 +- .../preferences/ui/LocaleSettings.kt | 9 + 52 files changed, 661 insertions(+), 132 deletions(-) create mode 100644 app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/CurrencySettingsScreen.kt create mode 100644 core/base/src/main/res/drawable/attach_money_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_lira_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_pound_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_ruble_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_rupee_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_yen_24px.xml create mode 100644 core/base/src/main/res/drawable/currency_yuan_24px.xml create mode 100644 core/base/src/main/res/drawable/euro_24px.xml create mode 100644 core/base/src/main/res/drawable/toll_24px.xml diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt index 12593f32b..c8c668408 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt @@ -3,9 +3,6 @@ package de.mm20.launcher2.ui.component.preferences import androidx.activity.compose.LocalActivity import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.scaleIn -import androidx.compose.animation.scaleOut import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope @@ -22,11 +19,8 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior 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.Modifier import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -37,13 +31,16 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.net.toUri import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.dragndrop.LazyDragAndDropColumn +import de.mm20.launcher2.ui.component.dragndrop.LazyDragAndDropListState +import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropListState import de.mm20.launcher2.ui.locals.LocalBackStack @Composable +@Deprecated("Use the overload with title as a composable function instead") fun PreferenceScreen( title: String, - floatingActionButton: @Composable () -> Unit = {}, topBarActions: @Composable RowScope.() -> Unit = {}, helpUrl: String? = null, lazyColumnState: LazyListState = rememberLazyListState(), @@ -59,7 +56,6 @@ fun PreferenceScreen( maxLines = 1 ) }, - floatingActionButton = floatingActionButton, topBarActions = topBarActions, helpUrl = helpUrl, lazyColumnState = lazyColumnState, @@ -71,75 +67,21 @@ fun PreferenceScreen( @Composable fun PreferenceScreen( title: @Composable () -> Unit = {}, - floatingActionButton: @Composable () -> Unit = {}, topBarActions: @Composable RowScope.() -> Unit = {}, helpUrl: String? = null, lazyColumnState: LazyListState = rememberLazyListState(), verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(12.dp), content: LazyListScope.() -> Unit, ) { - val backStack = LocalBackStack.current - - val context = LocalContext.current - - val colorScheme = MaterialTheme.colorScheme - - var fabVisible by remember { mutableStateOf(true) } val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() - val activity = LocalActivity.current Scaffold( - floatingActionButton = { - AnimatedVisibility( - fabVisible, - enter = scaleIn(), - exit = scaleOut(), - ) { - floatingActionButton() - } - }, topBar = { - CenterAlignedTopAppBar( + PreferenceScreenTopBar( title = title, - colors = TopAppBarDefaults.topAppBarColors( - containerColor = MaterialTheme.colorScheme.surfaceContainer, - scrolledContainerColor = MaterialTheme.colorScheme.surfaceContainerHigh, - ), - navigationIcon = { - IconButton(onClick = { - if (backStack.size <= 1) { - activity?.onBackPressed() - } else { - backStack.removeLastOrNull() - } - }) { - Icon( - painter = painterResource(R.drawable.arrow_back_24px), - contentDescription = "Back" - ) - } - }, - actions = { - if (helpUrl != null) { - IconButton(onClick = { - CustomTabsIntent.Builder() - .setDefaultColorSchemeParams( - CustomTabColorSchemeParams.Builder() - .setToolbarColor(colorScheme.primaryContainer.toArgb()) - .setSecondaryToolbarColor(colorScheme.secondaryContainer.toArgb()) - .build() - ) - .build().launchUrl(context, helpUrl.toUri()) - }) { - Icon( - painter = painterResource(R.drawable.help_24px), - contentDescription = stringResource(R.string.help) - ) - } - } - topBarActions() - }, + actions = topBarActions, + helpUrl = helpUrl, scrollBehavior = scrollBehavior, ) }, @@ -160,5 +102,101 @@ fun PreferenceScreen( ) ) } +} + +@Composable +fun DragAndDropPreferenceScreen( + title: @Composable () -> Unit = {}, + topBarActions: @Composable RowScope.() -> Unit = {}, + helpUrl: String? = null, + lazyColumnState: LazyDragAndDropListState, + verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(1.dp), + content: LazyListScope.() -> Unit, +) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + + Scaffold( + topBar = { + PreferenceScreenTopBar( + title = title, + actions = topBarActions, + helpUrl = helpUrl, + scrollBehavior = scrollBehavior, + ) + }, + containerColor = MaterialTheme.colorScheme.surfaceContainer + ) { + LazyDragAndDropColumn( + modifier = Modifier + .fillMaxSize() + .nestedScroll(scrollBehavior.nestedScrollConnection), + state = lazyColumnState, + content = content, + verticalArrangement = verticalArrangement, + contentPadding = PaddingValues( + top = it.calculateTopPadding() + 12.dp, + bottom = it.calculateBottomPadding() + 12.dp, + start = 12.dp, + end = 12.dp + ), + bidirectionalDrag = false, + ) + } +} + +@Composable +private fun PreferenceScreenTopBar( + title: @Composable () -> Unit = {}, + actions: @Composable RowScope.() -> Unit = {}, + helpUrl: String? = null, + scrollBehavior: TopAppBarScrollBehavior, +) { + val backStack = LocalBackStack.current + val context = LocalContext.current + val colorScheme = MaterialTheme.colorScheme + val activity = LocalActivity.current + + CenterAlignedTopAppBar( + title = title, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.surfaceContainer, + scrolledContainerColor = MaterialTheme.colorScheme.surfaceContainerHigh, + ), + navigationIcon = { + IconButton(onClick = { + if (backStack.size <= 1) { + activity?.onBackPressed() + } else { + backStack.removeLastOrNull() + } + }) { + Icon( + painter = painterResource(R.drawable.arrow_back_24px), + contentDescription = "Back" + ) + } + }, + actions = { + if (helpUrl != null) { + IconButton(onClick = { + CustomTabsIntent.Builder() + .setDefaultColorSchemeParams( + CustomTabColorSchemeParams.Builder() + .setToolbarColor(colorScheme.primaryContainer.toArgb()) + .setSecondaryToolbarColor(colorScheme.secondaryContainer.toArgb()) + .build() + ) + .build().launchUrl(context, helpUrl.toUri()) + }) { + Icon( + painter = painterResource(R.drawable.help_24px), + contentDescription = stringResource(R.string.help) + ) + } + } + actions() + }, + scrollBehavior = scrollBehavior, + ) } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt index 91d7244d9..ce96e221c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt @@ -100,6 +100,8 @@ import de.mm20.launcher2.ui.settings.license.LicenseRoute import de.mm20.launcher2.ui.settings.license.LicenseScreen import de.mm20.launcher2.ui.settings.locale.CalendarSettingsRoute import de.mm20.launcher2.ui.settings.locale.CalendarSettingsScreen +import de.mm20.launcher2.ui.settings.locale.CurrencySettingsRoute +import de.mm20.launcher2.ui.settings.locale.CurrencySettingsScreen import de.mm20.launcher2.ui.settings.locale.LocaleSettingsRoute import de.mm20.launcher2.ui.settings.locale.LocaleSettingsScreen import de.mm20.launcher2.ui.settings.locations.LocationsSettingsRoute @@ -304,6 +306,9 @@ class SettingsActivity : BaseActivity() { entry { CalendarSettingsScreen() } + entry { + CurrencySettingsScreen() + } entry { BackupSettingsScreen() } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CorePaletteColorPreference.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CorePaletteColorPreference.kt index 1b6736a1e..6e77c571a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CorePaletteColorPreference.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CorePaletteColorPreference.kt @@ -93,7 +93,7 @@ fun CorePaletteColorPreference( ) { SwitchPreference( icon = R.drawable.rule_settings_24px, - title = stringResource(R.string.theme_color_scheme_system_default), + title = stringResource(R.string.preference_use_system_default), value = currentValue == null, onValueChanged = { currentValue = if (it) null else defaultValue diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/CurrencySettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/CurrencySettingsScreen.kt new file mode 100644 index 000000000..68c1da7ad --- /dev/null +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/CurrencySettingsScreen.kt @@ -0,0 +1,366 @@ +package de.mm20.launcher2.ui.settings.locale + +import android.icu.util.Currency +import android.icu.util.ULocale +import androidx.compose.animation.core.animateDpAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenuGroup +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.DropdownMenuPopup +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuDefaults +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +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.clip +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.platform.LocalLocale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.preferences.ui.LocaleSettings +import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.DismissableBottomSheet +import de.mm20.launcher2.ui.component.dragndrop.DraggableItem +import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropListState +import de.mm20.launcher2.ui.component.preferences.DragAndDropPreferenceScreen +import de.mm20.launcher2.ui.component.preferences.Preference +import de.mm20.launcher2.ui.component.preferences.PreferenceCategory +import de.mm20.launcher2.ui.component.preferences.SwitchPreference +import de.mm20.launcher2.ui.ktx.animateShapeAsState +import kotlinx.serialization.Serializable +import org.koin.compose.koinInject +import java.util.Date + +@Serializable +data object CurrencySettingsRoute : NavKey + +@Composable +fun CurrencySettingsScreen() { + val localeSettings = koinInject() + val currencies by localeSettings.currencies.collectAsState(null) + + val dragAndDropListState = rememberLazyDragAndDropListState( + onDragStart = { + it.key.toString().startsWith("currency_") + }, + onItemMove = { from, to -> + val currencies = currencies?.toMutableList() ?: return@rememberLazyDragAndDropListState + + val fromIndex = from.index - 2 + val toIndex = to.index - 2 + + if (fromIndex > currencies.lastIndex || fromIndex < 0) return@rememberLazyDragAndDropListState + if (toIndex > currencies.lastIndex || toIndex < 0) return@rememberLazyDragAndDropListState + + val item = currencies.removeAt(fromIndex) + currencies.add(toIndex, item) + localeSettings.setCurrencies(currencies) + } + ) + + val locale = LocalLocale.current + val defaultCurrency = remember(locale) { + Currency.getInstance(locale.platformLocale) + } + + DragAndDropPreferenceScreen( + title = { + Text(stringResource(R.string.preference_currencies)) + }, + lazyColumnState = dragAndDropListState, + ) { + + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 10.dp) + ) { + PreferenceCategory { + SwitchPreference( + title = stringResource(R.string.preference_use_system_default), + value = currencies?.isEmpty() == true, + onValueChanged = { + if (it) { + localeSettings.setCurrencies(emptyList()) + } else { + localeSettings.setCurrencies(listOf(defaultCurrency.currencyCode)) + } + }, + ) + } + } + } + if (currencies != null) { + if (currencies!!.isEmpty()) { + item { + PreferenceCategory { + Preference( + title = defaultCurrency.displayName, + icon = R.drawable.euro_24px, + enabled = false + ) + } + } + } else { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + ) { + Icon( + painterResource(R.drawable.info_20px), null, + modifier = Modifier + .padding(end = 12.dp) + .size(16.dp), + tint = MaterialTheme.colorScheme.secondary + ) + Text( + modifier = Modifier, + text = stringResource(R.string.hint_drag_and_drop_reorder), + style = MaterialTheme.typography.titleSmall, + color = MaterialTheme.colorScheme.secondary + ) + } + } + + itemsIndexed( + items = currencies!!, + key = { _, it -> "currency_$it" } + ) { index, currency -> + DraggableItem( + state = dragAndDropListState, + key = "currency_$currency" + ) { + val shape = getShape(index, currencies!!.size) + val draggedShape = MaterialTheme.shapes.medium + + val elevation by animateDpAsState(if (it) 4.dp else 0.dp) + + val currencyName = try { + Currency.getInstance(currency).displayName + } catch (e: IllegalArgumentException) { + currency + } + + Surface( + shadowElevation = elevation, + tonalElevation = elevation, + modifier = Modifier + .zIndex(if (it) 1f else 0f), + shape = animateShapeAsState( + if (it) draggedShape else shape + ).value + ) { + Preference( + title = currencyName, + icon = getCurrencySymbol(currency), + iconPadding = true, + enabled = true, + controls = { + var showMenu by remember { mutableStateOf(false) } + IconButton( + onClick = { showMenu = true } + ) { + Icon( + painterResource(R.drawable.more_vert_24px), + stringResource(R.string.action_more_actions), + ) + } + DropdownMenuPopup( + expanded = showMenu, + onDismissRequest = { showMenu = false }, + ) { + DropdownMenuGroup( + shapes = MenuDefaults.groupShapes() + ) { + DropdownMenuItem( + text = { Text(stringResource(R.string.menu_remove)) }, + leadingIcon = { + Icon(painterResource(R.drawable.delete_24px), null) + }, + onClick = { + val newCurrencies = currencies!!.toMutableList() + newCurrencies.removeAt(index) + localeSettings.setCurrencies(newCurrencies) + showMenu = false + } + ) + } + } + } + ) + } + } + } + item { + var showModal by remember { mutableStateOf(false) } + FilledTonalButton( + modifier = Modifier + .padding(top = 10.dp) + .navigationBarsPadding(), + contentPadding = ButtonDefaults.ButtonWithIconContentPadding, + onClick = { + showModal = true + }) { + Icon( + painterResource(R.drawable.add_20px), + null, + modifier = Modifier + .padding(end = ButtonDefaults.IconSpacing) + .size(ButtonDefaults.IconSize) + ) + Text(stringResource(R.string.preference_add_currency)) + } + + CurrencyPickerSheet( + selectedCurrencies = currencies!!, + onCurrencySelected = { currency -> + val newCurrencies = currencies!!.toMutableList() + newCurrencies.add(currency) + localeSettings.setCurrencies(newCurrencies) + showModal = false + }, + expanded = showModal, + onDismissRequest = { showModal = false } + ) + } + } + } + } +} + +private fun getCurrencySymbol(currencyCode: String): Int? { + return when (currencyCode) { + "AUD", "BBD", "BMD", "BND", "BSD", "BZD", "CAD", "FJD", "GYD", "HKD", "JMD", "KID", "KYD", + "LRD", "NAD", "NZD", "SBD", "SGD", "SRD", "TTD", "TVD", "TWD", "USD", "XCD", "ARS", "CLP", + "COP", "CUP", "DOP", "MXN", "UYU" -> R.drawable.attach_money_24px + + "EUR" -> R.drawable.euro_24px + "EGP", "FKP", "GBP", "GIP", "SHP", "SDG", "SYP" -> R.drawable.currency_pound_24px + "JPY" -> R.drawable.currency_yen_24px + "CNY" -> R.drawable.currency_yuan_24px + "INR" -> R.drawable.currency_rupee_24px + "RUB" -> R.drawable.currency_ruble_24px + else -> R.drawable.toll_24px + } +} + +@Composable +private fun getShape(index: Int, total: Int): Shape { + if (total == 1) { + return MaterialTheme.shapes.medium + } + + if (total > 1 && index > 0 && index < total - 1) { + return MaterialTheme.shapes.extraSmall + } + + val xs = MaterialTheme.shapes.extraSmall + val md = MaterialTheme.shapes.medium + + if (index == 0) { + return xs.copy( + topStart = md.topStart, + topEnd = md.topEnd + ) + } else { + return xs.copy( + bottomStart = md.bottomStart, + bottomEnd = md.bottomEnd + ) + } +} + +@Composable +private fun CurrencyPickerSheet( + selectedCurrencies: List, + onCurrencySelected: (String) -> Unit, + expanded: Boolean, + onDismissRequest: () -> Unit, +) { + val availableCurrencies = remember { + val locales = ULocale.getAvailableLocales() + val currencyCodes = mutableSetOf() + + for (locale in locales) { + val currencies = Currency.getAvailableCurrencyCodes(locale, Date()) ?: continue + currencyCodes.addAll(currencies) + } + + val currencies = mutableListOf() + + for (currencyCode in currencyCodes) { + try { + currencies += Currency.getInstance(currencyCode) + + } catch (e: IllegalArgumentException) { + // Ignore invalid currency codes + } + } + + currencies.sortBy { it.displayName } + + currencies + } + + DismissableBottomSheet( + expanded = expanded, + onDismissRequest = onDismissRequest + ) { + LazyColumn( + contentPadding = PaddingValues( + top = 12.dp, + bottom = WindowInsets.navigationBars.asPaddingValues() + .calculateBottomPadding() + 12.dp, + start = 12.dp, + end = 12.dp + ), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + itemsIndexed(availableCurrencies) { i, currency -> + Box( + modifier = Modifier.clip( + shape = getShape(i, availableCurrencies.size) + ) + ) { + Preference( + title = currency.displayName, + onClick = { + onCurrencySelected(currency.currencyCode) + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt index 13e6f895a..f99c38972 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.settings.locale import android.content.Intent import android.icu.text.ListFormatter import android.icu.text.Transliterator +import android.icu.util.Currency import android.icu.util.ULocale import androidx.appcompat.app.AppCompatDelegate import androidx.compose.runtime.Composable @@ -43,6 +44,7 @@ fun LocaleSettingsScreen() { val measurementSystem by viewModel.measurementSystem.collectAsStateWithLifecycle(null) val transliterator by viewModel.transliterator.collectAsStateWithLifecycle(null) val calendars by viewModel.calendars.collectAsStateWithLifecycle(emptyList()) + val currencies by viewModel.currencies.collectAsStateWithLifecycle(null) // The language that has been selected by the user, or null to use the system language val selectedLocale = remember { @@ -234,6 +236,28 @@ fun LocaleSettingsScreen() { ) } ) + Preference( + title = stringResource(R.string.preference_currencies), + summary = currencies?.let { + if (it.isEmpty()) { + return@let stringResource(R.string.preference_value_system_default) + } + + val names = it.map { + try { + Currency.getInstance(it).displayName + } catch (e: IllegalArgumentException) { + it + } + } + + ListFormatter.getInstance().format(names) + }, + icon = R.drawable.toll_24px, + onClick = { + backstack += CurrencySettingsRoute + }, + ) } } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt index 93d56f55e..30c3eb7dc 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt @@ -30,4 +30,6 @@ class LocaleSettingsScreenVM : ViewModel(), KoinComponent { val calendars = combine(localeSettings.primaryCalendar, localeSettings.secondaryCalendar) { it.toImmutableList() } + + val currencies = localeSettings.currencies } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt index 82e067504..e5bb906f0 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt @@ -121,27 +121,6 @@ fun LogScreen() { } }, verticalArrangement = Arrangement.spacedBy(2.dp), - floatingActionButton = { - AnimatedVisibility( - listState.canScrollForward, - enter = scaleIn(), - exit = scaleOut(), - ) { - SmallFloatingActionButton( - containerColor = MaterialTheme.colorScheme.secondaryContainer, - contentColor = MaterialTheme.colorScheme.onSecondaryContainer, - onClick = { - scope.launch { - listState.animateScrollToItem(lines.lastIndex) - } - }) { - Icon( - painterResource(R.drawable.arrow_downward_24px), - null, - ) - } - } - }, lazyColumnState = listState, ) { itemsIndexed(lines) { i, it -> diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt index 4ed436899..28972d521 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt @@ -163,13 +163,15 @@ fun SearchActionsSettingsScreen() { ) { Row( modifier = Modifier - .padding(start = 28.dp, top = 16.dp, end = 16.dp, bottom = 16.dp), + .fillMaxWidth() + .padding(16.dp), verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, ) { Icon( painterResource(R.drawable.info_20px), null, modifier = Modifier - .padding(end = 24.dp) + .padding(end = 12.dp) .size(16.dp), tint = MaterialTheme.colorScheme.secondary ) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt index b0e57a00d..9b42a5f85 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt @@ -12,6 +12,7 @@ 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.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.locale.CurrencySettingsRoute import kotlinx.serialization.Serializable @Serializable @@ -58,6 +59,13 @@ fun UnitConverterSettingsScreen() { backStack.add(UnitConverterHelpSettingsRoute) } ) + Preference( + title = stringResource(R.string.preference_currency_settings), + icon = R.drawable.open_in_new_24px, + onClick = { + backStack.add(CurrencySettingsRoute) + } + ) } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreenVM.kt index 269321d2b..cd570bcb9 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreenVM.kt @@ -1,20 +1,13 @@ 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 kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -29,13 +22,13 @@ class UnitConverterSettingsScreenVM: ViewModel(), KoinComponent { settings.setEnabled(unitConverter) } - val currencyConverter = settings.currencies + val currencyConverter = settings.currenciesEnabled .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) fun setCurrencyConverter(currencyConverter: Boolean) { - settings.setCurrencies(currencyConverter) + settings.setCurrenciesEnabled(currencyConverter) } - val availableConverters = settings.currencies.map { + val availableConverters = settings.currenciesEnabled.map { repository.getAvailableConverters(includeCurrencies = it) }.shareIn(viewModelScope, SharingStarted.WhileSubscribed(100), 1) diff --git a/core/base/src/main/res/drawable/attach_money_24px.xml b/core/base/src/main/res/drawable/attach_money_24px.xml new file mode 100644 index 000000000..3bd4e2553 --- /dev/null +++ b/core/base/src/main/res/drawable/attach_money_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_lira_24px.xml b/core/base/src/main/res/drawable/currency_lira_24px.xml new file mode 100644 index 000000000..b8f02e26a --- /dev/null +++ b/core/base/src/main/res/drawable/currency_lira_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_pound_24px.xml b/core/base/src/main/res/drawable/currency_pound_24px.xml new file mode 100644 index 000000000..b30ddd984 --- /dev/null +++ b/core/base/src/main/res/drawable/currency_pound_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_ruble_24px.xml b/core/base/src/main/res/drawable/currency_ruble_24px.xml new file mode 100644 index 000000000..a662d7d0a --- /dev/null +++ b/core/base/src/main/res/drawable/currency_ruble_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_rupee_24px.xml b/core/base/src/main/res/drawable/currency_rupee_24px.xml new file mode 100644 index 000000000..92515175a --- /dev/null +++ b/core/base/src/main/res/drawable/currency_rupee_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_yen_24px.xml b/core/base/src/main/res/drawable/currency_yen_24px.xml new file mode 100644 index 000000000..9aa4a2fba --- /dev/null +++ b/core/base/src/main/res/drawable/currency_yen_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/currency_yuan_24px.xml b/core/base/src/main/res/drawable/currency_yuan_24px.xml new file mode 100644 index 000000000..9098cf9c1 --- /dev/null +++ b/core/base/src/main/res/drawable/currency_yuan_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/euro_24px.xml b/core/base/src/main/res/drawable/euro_24px.xml new file mode 100644 index 000000000..52e48bbb6 --- /dev/null +++ b/core/base/src/main/res/drawable/euro_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/base/src/main/res/drawable/toll_24px.xml b/core/base/src/main/res/drawable/toll_24px.xml new file mode 100644 index 000000000..bfd4bb0f3 --- /dev/null +++ b/core/base/src/main/res/drawable/toll_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/i18n/src/main/res/values-ar/strings.xml b/core/i18n/src/main/res/values-ar/strings.xml index b83fe122e..2cc4fa1d6 100644 --- a/core/i18n/src/main/res/values-ar/strings.xml +++ b/core/i18n/src/main/res/values-ar/strings.xml @@ -476,7 +476,7 @@ إلغاء الربط تعذر قراءة الملف المرتبط. تم استعادة نسخة منه من وحدة التخزين الداخلية للمشغل. إذا قمت بتعديل الملاحظة، فمن المحتمل أن يتم استبدال الملف المرتبط خطأ في حفظ الملاحظة - استخدام النظام الافتراضي + استخدام النظام الافتراضي مقدم خدمة الطقس تعيين كموفر للطقس بدون ساعة diff --git a/core/i18n/src/main/res/values-be/strings.xml b/core/i18n/src/main/res/values-be/strings.xml index c6d5c2ea4..dc20d7633 100644 --- a/core/i18n/src/main/res/values-be/strings.xml +++ b/core/i18n/src/main/res/values-be/strings.xml @@ -585,7 +585,7 @@ Заблакіраваны Памылка пры захаванні нататкі Вы сапраўды хочаце выдаліць колеравую схему %1$s? - Выкарыстоўваць прадвызначаныя колеры + Выкарыстоўваць прадвызначаныя колеры Уласны Прымяніць тэму Выбраны файл не можа быць прачытаны. Калі ласка, упэўніцеся, што вы выбралі правільны файл тэмы (*.kvtheme) і што ён не пашкоджаны. diff --git a/core/i18n/src/main/res/values-ca/strings.xml b/core/i18n/src/main/res/values-ca/strings.xml index 407e5bfb3..e70583c16 100644 --- a/core/i18n/src/main/res/values-ca/strings.xml +++ b/core/i18n/src/main/res/values-ca/strings.xml @@ -528,7 +528,7 @@ Personalitza l\'aparença de la barra de cerca Llança el resultat de la cerca o executa un acció ràpida prement \"go\" Mostra un botó per afegir, eliminar i reorganitzar ginys - Sistema predeterminat + Sistema predeterminat Colors primaris Paleta Personalitzat diff --git a/core/i18n/src/main/res/values-cs/strings.xml b/core/i18n/src/main/res/values-cs/strings.xml index 21372ecc6..89e16138d 100644 --- a/core/i18n/src/main/res/values-cs/strings.xml +++ b/core/i18n/src/main/res/values-cs/strings.xml @@ -529,7 +529,7 @@ Zachytit snímek paměti pro analyzování využití paměti. Aplikace bude nefunkční, dokud tento proces nebude dokončen. Zachytávání snímku… Barevná paleta - Podle systému + Podle systému Z primární barvy Paleta Vlastní diff --git a/core/i18n/src/main/res/values-da/strings.xml b/core/i18n/src/main/res/values-da/strings.xml index 40a1f4ccc..eda41a3f6 100644 --- a/core/i18n/src/main/res/values-da/strings.xml +++ b/core/i18n/src/main/res/values-da/strings.xml @@ -510,7 +510,7 @@ Nuværende filindhold: Fejl ved læsning af note Fejl med at gemme note - Brug systemstandard + Brug systemstandard Fra primær farve Palet Tilpasset diff --git a/core/i18n/src/main/res/values-de/strings.xml b/core/i18n/src/main/res/values-de/strings.xml index bf5220673..fe8c6a995 100644 --- a/core/i18n/src/main/res/values-de/strings.xml +++ b/core/i18n/src/main/res/values-de/strings.xml @@ -526,7 +526,7 @@ Abbild wird erstellt… Speicherabbild Palette - Systemstandard verwenden + Systemstandard verwenden Aus Primärfarbe Benutzerdefiniert Bearbeiten diff --git a/core/i18n/src/main/res/values-es/strings.xml b/core/i18n/src/main/res/values-es/strings.xml index 015ef2537..c5896e00c 100644 --- a/core/i18n/src/main/res/values-es/strings.xml +++ b/core/i18n/src/main/res/values-es/strings.xml @@ -526,7 +526,7 @@ No se ha podido escribir la nota al archivo vinculado. Se ha restaurado una copia desde el almacenamiento interno del lanzador Tema de %1$s Captura una instantánea para analizar el uso de memoria. La app se congelará hasta que el proceso se complete. - Usar el predeterminado del sistema + Usar el predeterminado del sistema Alineación Restaurar predeterminado Búsqueda web diff --git a/core/i18n/src/main/res/values-et/strings.xml b/core/i18n/src/main/res/values-et/strings.xml index e1896c958..7da5427e9 100644 --- a/core/i18n/src/main/res/values-et/strings.xml +++ b/core/i18n/src/main/res/values-et/strings.xml @@ -553,7 +553,7 @@ Suusatamine https://www.youtube.com/results?search_query=${1} Google Play - Kasuta süsteemi vaikeväärtust + Kasuta süsteemi vaikeväärtust Kalendri vidin ja otsingutulemused Teema on juba olemas ja seda uuendatakse diff --git a/core/i18n/src/main/res/values-eu/strings.xml b/core/i18n/src/main/res/values-eu/strings.xml index 073b478de..56f010714 100644 --- a/core/i18n/src/main/res/values-eu/strings.xml +++ b/core/i18n/src/main/res/values-eu/strings.xml @@ -485,7 +485,7 @@ Errorea oharra gordetzean Paleta Pertsonalizatua - Sistemaren lehenetsia erabili + Sistemaren lehenetsia erabili Benetan %1$s kolore-eskema ezabatu nahi duzu\? Editatu Lehenetsia berrezarri diff --git a/core/i18n/src/main/res/values-fa/strings.xml b/core/i18n/src/main/res/values-fa/strings.xml index e43463ae2..1a064e773 100644 --- a/core/i18n/src/main/res/values-fa/strings.xml +++ b/core/i18n/src/main/res/values-fa/strings.xml @@ -491,7 +491,7 @@ کشیدن به چپ کشیدن به راست آیا واقعاً می‌خواهید طرح رنگی %1$s را پاک کنید؟ - به‌کار بردن پیش‌گزیده سامانه + به‌کار بردن پیش‌گزیده سامانه بازکردن جستجو اجرای برنامه بازکردن بخش آگاه‌سازی diff --git a/core/i18n/src/main/res/values-fi/strings.xml b/core/i18n/src/main/res/values-fi/strings.xml index e15693de3..d086c2066 100644 --- a/core/i18n/src/main/res/values-fi/strings.xml +++ b/core/i18n/src/main/res/values-fi/strings.xml @@ -511,7 +511,7 @@ Haluatko varmasti poistaa värikaavion %1$s\? Mediaohjaimen integraatioiden asetukset Viimeisin tallennettu versio: - Käytä järjestelmän oletusta + Käytä järjestelmän oletusta Luo pääväristä Paletti Mukautettu diff --git a/core/i18n/src/main/res/values-fr/strings.xml b/core/i18n/src/main/res/values-fr/strings.xml index dc22f1752..51393ba8a 100644 --- a/core/i18n/src/main/res/values-fr/strings.xml +++ b/core/i18n/src/main/res/values-fr/strings.xml @@ -558,7 +558,7 @@ Capture de l\'instant… Animations Animer des bulles pendant que l\'appareil est en charge - Utiliser la valeur par défaut du système + Utiliser la valeur par défaut du système A partir de la couleur principale Couleur personnalisée Animation de chargement diff --git a/core/i18n/src/main/res/values-hu/strings.xml b/core/i18n/src/main/res/values-hu/strings.xml index ca95c3a21..0e0199fb6 100644 --- a/core/i18n/src/main/res/values-hu/strings.xml +++ b/core/i18n/src/main/res/values-hu/strings.xml @@ -441,7 +441,7 @@ Nem található naptár Médiavezérlő-integráció beállításai Hivatkozás a fájlra - Rendszer alapértelmezésének használata + Rendszer alapértelmezésének használata Az elsődleges színből Ez a parancsikon nem érhető el, mert a(z) %1$s nem az alapértelmezett indító Ez a biztonsági mentés a(z) %1$s egy másik verziójával készült. Előfordulhat, hogy egyes adatok nem lesznek helyesen visszaállítva. diff --git a/core/i18n/src/main/res/values-ia/strings.xml b/core/i18n/src/main/res/values-ia/strings.xml index ade4cfe3d..541881c5a 100644 --- a/core/i18n/src/main/res/values-ia/strings.xml +++ b/core/i18n/src/main/res/values-ia/strings.xml @@ -113,7 +113,7 @@ Modificar Location Depuration - Usar le predefinite del systema + Usar le predefinite del systema Avantiate Salveguardar Disactivar diff --git a/core/i18n/src/main/res/values-it/strings.xml b/core/i18n/src/main/res/values-it/strings.xml index 0c8383a80..23fdce18c 100644 --- a/core/i18n/src/main/res/values-it/strings.xml +++ b/core/i18n/src/main/res/values-it/strings.xml @@ -530,7 +530,7 @@ Catturando uno snapshot… Tavolozza colori Dal colore primario - Predefinita del sistema + Predefinita del sistema Tavolozza Personalizza Animazioni diff --git a/core/i18n/src/main/res/values-iw/strings.xml b/core/i18n/src/main/res/values-iw/strings.xml index e4155464d..76360d9f9 100644 --- a/core/i18n/src/main/res/values-iw/strings.xml +++ b/core/i18n/src/main/res/values-iw/strings.xml @@ -752,7 +752,7 @@ מהצבע הראשי (ללא כותרת) לוח צבעים (Palette) - שימוש בברירת המחדל של המערכת + שימוש בברירת המחדל של המערכת החלת ערכת נושא ערכת הנושא כבר קיימת ותעודכן לא ניתן היה לקרוא את הקובץ הנבחר. נא לוודא שבחרת קובץ ערכת נושא תקין ‪(*.kvtheme)‬, ושהקובץ לא פגום. diff --git a/core/i18n/src/main/res/values-ja/strings.xml b/core/i18n/src/main/res/values-ja/strings.xml index f29514ff1..eeeca5e25 100644 --- a/core/i18n/src/main/res/values-ja/strings.xml +++ b/core/i18n/src/main/res/values-ja/strings.xml @@ -198,7 +198,7 @@ 接続されたアカウントとサービスを管理 デフォルト 時計のスタイルとコンポーネントを設定 - システムのデフォルトを使用 + システムのデフォルトを使用 検索、タグ、非表示のアイテム プラグイン ホーム画面 diff --git a/core/i18n/src/main/res/values-lt/strings.xml b/core/i18n/src/main/res/values-lt/strings.xml index a94c83915..88418f62e 100644 --- a/core/i18n/src/main/res/values-lt/strings.xml +++ b/core/i18n/src/main/res/values-lt/strings.xml @@ -551,7 +551,7 @@ Nepavyko išsaugoti ūžrašo Ūžrašas buvo neįrašytas į nuorodos failą. Galimai perkeltas at ištrintas. Kopija yra išsaugota į paleidėjo atmintį. Ar tikrai norite ištrinti spalvų schema %1$s\? - Naudokite sistemos numatyta spalva + Naudokite sistemos numatyta spalva Nepasiekemas Nuoroda nepasiekiama ,nes %1$s nėra numatytoji namų programėlė Atidarytas diff --git a/core/i18n/src/main/res/values-nb-rNO/strings.xml b/core/i18n/src/main/res/values-nb-rNO/strings.xml index 0929a0900..2029545ed 100644 --- a/core/i18n/src/main/res/values-nb-rNO/strings.xml +++ b/core/i18n/src/main/res/values-nb-rNO/strings.xml @@ -621,7 +621,7 @@ Rangeringsfleksibilitet Innstillinger for værintegrasjon Seneste lagrede versjon: - Bruk systemstandard + Bruk systemstandard Innstillinger for mediakontroll-integrasjon Palett Bruk tema diff --git a/core/i18n/src/main/res/values-nl/strings.xml b/core/i18n/src/main/res/values-nl/strings.xml index c888159df..da6018ca6 100644 --- a/core/i18n/src/main/res/values-nl/strings.xml +++ b/core/i18n/src/main/res/values-nl/strings.xml @@ -526,7 +526,7 @@ Bezig met nemen van momentopname… Palet Aangepast - Systeemstandaard gebruiken + Systeemstandaard gebruiken Van primaire kleur Ben je zeker dat je kleurenschema %1$s wil verwijderen\? Animaties diff --git a/core/i18n/src/main/res/values-pl/strings.xml b/core/i18n/src/main/res/values-pl/strings.xml index f34cff24a..f67085b48 100644 --- a/core/i18n/src/main/res/values-pl/strings.xml +++ b/core/i18n/src/main/res/values-pl/strings.xml @@ -477,7 +477,7 @@ Zamknięte %1$s temat 7-segmentów - Użyj domyślnych ustawień systemowych + Użyj domyślnych ustawień systemowych System Źródło dynamicznych kolorów Tapeta diff --git a/core/i18n/src/main/res/values-pt-rBR/strings.xml b/core/i18n/src/main/res/values-pt-rBR/strings.xml index 8bd2d65b1..d058c1934 100644 --- a/core/i18n/src/main/res/values-pt-rBR/strings.xml +++ b/core/i18n/src/main/res/values-pt-rBR/strings.xml @@ -556,7 +556,7 @@ Avançado Personalizado Desconectar - Usar o padrão do sistema + Usar o padrão do sistema Palheta Importar Fecha às %1$s diff --git a/core/i18n/src/main/res/values-pt/strings.xml b/core/i18n/src/main/res/values-pt/strings.xml index f6a32d3e5..51087378b 100644 --- a/core/i18n/src/main/res/values-pt/strings.xml +++ b/core/i18n/src/main/res/values-pt/strings.xml @@ -410,7 +410,7 @@ Círculo arredondado Triângulo de Reuleaux Pedra - Predefinição do sistema + Predefinição do sistema Definir como serviço de meteorologia Inicie sessão para pesquisar no servidor Nextcloud Redimensionar diff --git a/core/i18n/src/main/res/values-ru/strings.xml b/core/i18n/src/main/res/values-ru/strings.xml index 2dbecbd1b..c0dc9156f 100644 --- a/core/i18n/src/main/res/values-ru/strings.xml +++ b/core/i18n/src/main/res/values-ru/strings.xml @@ -534,7 +534,7 @@ Указывать, каким плагином был создан результат поиска Расположить Веб-поиск - Системный цвет + Системный цвет Из первичного цвета Палитра Выбор diff --git a/core/i18n/src/main/res/values-th/strings.xml b/core/i18n/src/main/res/values-th/strings.xml index 43efbfbf7..fe0df3d75 100644 --- a/core/i18n/src/main/res/values-th/strings.xml +++ b/core/i18n/src/main/res/values-th/strings.xml @@ -313,7 +313,7 @@ เนื้อหาปัจจุบันของไฟล์: ไม่สามารถอ่านโน้ตได้ ไม่สามารถบันทึกโน้ตได้ - ใช้ค่าเริ่มต้นของระบบ + ใช้ค่าเริ่มต้นของระบบ ใช้สีหลัก จานสี กำหนดเอง diff --git a/core/i18n/src/main/res/values-tr/strings.xml b/core/i18n/src/main/res/values-tr/strings.xml index 80c4ded1d..2800112aa 100644 --- a/core/i18n/src/main/res/values-tr/strings.xml +++ b/core/i18n/src/main/res/values-tr/strings.xml @@ -820,7 +820,7 @@ %1$s tipografi şemasını gerçekten silmek istiyor musunuz? %1$s şeffaflık şemasını gerçekten silmek istiyor musunuz? (isimsiz) - Sistem varsayılanını kullan + Sistem varsayılanını kullan Ana renkten Palet Özel diff --git a/core/i18n/src/main/res/values-vi/strings.xml b/core/i18n/src/main/res/values-vi/strings.xml index de5e8a51b..5243ba7f2 100644 --- a/core/i18n/src/main/res/values-vi/strings.xml +++ b/core/i18n/src/main/res/values-vi/strings.xml @@ -582,7 +582,7 @@ Lỗi lưu ghi chú Không thể ghi ghi chú vào tệp được liên kết. Có thể nó đã bị di chuyển hoặc bị xóa. Một bản sao đã được lưu vào bộ nhớ trong của trình khởi chạy. Bạn có thực sự muốn xóa bảng màu %1$s? - Sử dụng mặc định của hệ thống + Sử dụng mặc định của hệ thống Từ màu cơ bản Bảng màu Tùy chỉnh diff --git a/core/i18n/src/main/res/values-zh-rCN/strings.xml b/core/i18n/src/main/res/values-zh-rCN/strings.xml index 461dd1e1e..a9d1483d9 100644 --- a/core/i18n/src/main/res/values-zh-rCN/strings.xml +++ b/core/i18n/src/main/res/values-zh-rCN/strings.xml @@ -543,7 +543,7 @@ 调色板 最后保存的版本: 当前文件内容: - 使用系统默认 + 使用系统默认 恢复默认 应用主题 隐藏未分类地点 diff --git a/core/i18n/src/main/res/values-zh-rTW/strings.xml b/core/i18n/src/main/res/values-zh-rTW/strings.xml index f7ca245a2..d39934187 100644 --- a/core/i18n/src/main/res/values-zh-rTW/strings.xml +++ b/core/i18n/src/main/res/values-zh-rTW/strings.xml @@ -527,7 +527,7 @@ 檔案 手機店 搜尋半徑 - 使用系統預設 + 使用系統預設 此項目已不存在 郵局 畫廊 diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index b15260146..19032f22b 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -648,6 +648,7 @@ Currency converter Periodically download exchange rates to convert currencies Supported units + Currency settings Wikipedia Search the free encyclopedia Websites @@ -864,7 +865,7 @@ Do you really want to delete the typography scheme %1$s? Do you really want to delete the transparency scheme %1$s? (untitled) - Use system default + Use system default From primary color Palette Custom @@ -1108,6 +1109,8 @@ Calendar system Primary calendar Secondary calendar + Currencies + Add currency Select tag New tag Edit tag diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt index 768236754..0956dfc36 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt @@ -217,6 +217,13 @@ data class LauncherSettingsData internal constructor( */ val localeSecondaryCalendar: String? = null, + /** + * Preferred currencies. These currencies are listed first in the currency converters. + * ISO 4217 codes, e.g. "USD" for US Dollar, "EUR" for Euro, etc. + * If empty, the default order is determined by the system locale. + */ + val localeCurrencies: List = emptyList(), + val feedProviderPackage: String? = null diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/UnitConverterSettings.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/UnitConverterSettings.kt index 521d91996..a321cdc32 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/UnitConverterSettings.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/UnitConverterSettings.kt @@ -25,10 +25,13 @@ class UnitConverterSettings internal constructor( dataStore.update { it.copy(unitConverterEnabled = enabled) } } - val currencies: Flow + val currenciesEnabled: Flow get() = dataStore.data.map { it.unitConverterCurrencies }.distinctUntilChanged() - fun setCurrencies(currencies: Boolean) { + fun setCurrenciesEnabled(currencies: Boolean) { dataStore.update { it.copy(unitConverterCurrencies = currencies) } } + + val preferredCurrencies: Flow> + get() = dataStore.data.map { it.localeCurrencies }.distinctUntilChanged() } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/LocaleSettings.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/LocaleSettings.kt index 9a7e85ebd..59b75f4d1 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/LocaleSettings.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/LocaleSettings.kt @@ -53,4 +53,13 @@ class LocaleSettings internal constructor( it.copy(localeSecondaryCalendar = secondaryCalendar) } } + + val currencies + get() = launcherDataStore.data.map { it.localeCurrencies.distinct() } + + fun setCurrencies(currencies: List) { + launcherDataStore.update { + it.copy(localeCurrencies = currencies.distinct()) + } + } } \ No newline at end of file