From 545eb2514c8449c0356d73a6a1711227b2c2ef94 Mon Sep 17 00:00:00 2001 From: Anni Hillig Date: Thu, 2 Nov 2023 10:14:24 +0100 Subject: [PATCH] added correct number format and date format --- .../aurora_app/core/koin/servicesModule.kt | 9 +- .../aurora_app/core/koin/viewModelModule.kt | 8 +- .../aurora_app/model/user/RegionEnum.kt | 71 +++ .../services/navigation/NavGraphDirections.kt | 12 + .../services/navigation/NavigationService.kt | 5 + .../aurora_app/services/shared/UnitService.kt | 432 ++++++++++++++++++ .../ConsumptionSummaryBarChart.kt | 18 +- .../ConsumptionSummaryLabel.kt | 6 +- ...DashboardOverallConsumptionSummaryLabel.kt | 16 +- .../OverallConsumptionSummaryLabel.kt | 10 +- .../consumptions/ConsumptionListItem.kt | 36 +- .../forms/BeginEndPickerFormEntry.kt | 10 +- .../photovoltaics/InvestmentInputCard.kt | 6 - .../photovoltaics/InvestmentResultCard.kt | 7 +- .../photovoltaics/InvestmentResultLabel.kt | 9 +- .../components/reminder/ReminderSelector.kt | 6 +- .../reminder/ReminderTimeSelector.kt | 10 +- .../consumptions/AllConsumptionsListScreen.kt | 6 +- .../AllConsumptionsListViewModel.kt | 21 +- .../AddElectricityConsumption.kt | 11 +- .../addConsumption/AddHeatingConsumption.kt | 10 +- .../AddTransportationConsumption.kt | 25 +- .../ElectricityConsumptionDetails.kt | 23 +- .../HeatingConsumptionDetails.kt | 24 +- .../TransportationConsumptionDetails.kt | 19 +- ...ransportationRecurringConsumptionScreen.kt | 14 +- .../PhotovoltaicCalculatorScreen.kt | 13 +- .../ui/screens/settings/SettingsScreen.kt | 11 + .../ElectricityBillNotificationScreen.kt | 2 +- .../HeatingBillNotificationScreen.kt | 2 +- .../MobilityNotificationScreen.kt | 2 +- .../settings/profile/SelectRegionScreen.kt | 126 +++++ .../settings/profile/SelectRegionViewModel.kt | 22 + .../eu/inscico/aurora_app/utils/UnitUtils.kt | 144 ------ .../main/res/drawable/outline_public_24.xml | 5 + app/src/main/res/values/strings.xml | 10 +- 36 files changed, 876 insertions(+), 285 deletions(-) create mode 100644 app/src/main/java/eu/inscico/aurora_app/model/user/RegionEnum.kt create mode 100644 app/src/main/java/eu/inscico/aurora_app/services/shared/UnitService.kt create mode 100644 app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionScreen.kt create mode 100644 app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionViewModel.kt delete mode 100644 app/src/main/java/eu/inscico/aurora_app/utils/UnitUtils.kt create mode 100644 app/src/main/res/drawable/outline_public_24.xml diff --git a/app/src/main/java/eu/inscico/aurora_app/core/koin/servicesModule.kt b/app/src/main/java/eu/inscico/aurora_app/core/koin/servicesModule.kt index f2a4a51..36fd306 100644 --- a/app/src/main/java/eu/inscico/aurora_app/core/koin/servicesModule.kt +++ b/app/src/main/java/eu/inscico/aurora_app/core/koin/servicesModule.kt @@ -1,10 +1,10 @@ package eu.inscico.aurora_app.core.koin +import android.content.res.Configuration import com.google.firebase.FirebaseApp import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.functions.FirebaseFunctions -import com.google.firebase.ktx.Firebase import com.google.firebase.remoteconfig.FirebaseRemoteConfig import eu.inscico.aurora_app.services.auth.AuthService import eu.inscico.aurora_app.services.firebase.* @@ -15,6 +15,7 @@ import eu.inscico.aurora_app.services.notification.NotificationCreationService import eu.inscico.aurora_app.services.notification.NotificationService import eu.inscico.aurora_app.services.pvgis.PVGISAPIService import eu.inscico.aurora_app.services.shared.UserFeedbackService +import eu.inscico.aurora_app.services.shared.UnitService import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -112,4 +113,10 @@ val servicesModule = module { ) } + single { + UnitService( + context = androidContext() + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/eu/inscico/aurora_app/core/koin/viewModelModule.kt b/app/src/main/java/eu/inscico/aurora_app/core/koin/viewModelModule.kt index e4c664f..be9f8d3 100644 --- a/app/src/main/java/eu/inscico/aurora_app/core/koin/viewModelModule.kt +++ b/app/src/main/java/eu/inscico/aurora_app/core/koin/viewModelModule.kt @@ -16,6 +16,7 @@ import eu.inscico.aurora_app.ui.screens.photovoltaic.PhotovoltaicCalculatorViewM import eu.inscico.aurora_app.ui.screens.settings.profile.EditProfileViewModel import eu.inscico.aurora_app.ui.screens.settings.SettingsViewModel import eu.inscico.aurora_app.ui.screens.settings.notifications.SettingsReminderViewModel +import eu.inscico.aurora_app.ui.screens.settings.profile.SelectRegionViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module @@ -57,6 +58,10 @@ val viewModelModule = module { ) } + viewModel { + SelectRegionViewModel() + } + viewModel { SettingsReminderViewModel( _notificationService = get() @@ -78,7 +83,8 @@ val viewModelModule = module { viewModel { AllConsumptionsListViewModel( - _consumptionService = get() + _consumptionService = get(), + _unitService = get() ) } diff --git a/app/src/main/java/eu/inscico/aurora_app/model/user/RegionEnum.kt b/app/src/main/java/eu/inscico/aurora_app/model/user/RegionEnum.kt new file mode 100644 index 0000000..eabafe7 --- /dev/null +++ b/app/src/main/java/eu/inscico/aurora_app/model/user/RegionEnum.kt @@ -0,0 +1,71 @@ +package eu.inscico.aurora_app.model.user + +import android.content.Context +import eu.inscico.aurora_app.R +import eu.inscico.aurora_app.model.consumptions.ElectricitySource + +enum class RegionEnum { + SYSTEM, + GERMANY, + PORTUGAL, + SLOVENIA, + DENMARK, + UNITED_KINGDOM, + USA; + + companion object { + fun parseStringToRegion(regionString: String?): RegionEnum { + return when (regionString) { + "system" -> SYSTEM + "germany" -> GERMANY + "portugal" -> PORTUGAL + "slovenia" -> SLOVENIA + "denmark" -> DENMARK + "united_kingdom" -> UNITED_KINGDOM + "usa" -> USA + else -> SYSTEM + } + } + + fun parseRegionToString(region: RegionEnum): String { + return when (region) { + SYSTEM -> "system" + GERMANY -> "germany" + PORTUGAL -> "portugal" + SLOVENIA -> "slovenia" + DENMARK -> "denmark" + UNITED_KINGDOM -> "united_kingdom" + USA -> "usa" + } + } + + fun RegionEnum.getDisplayNameRes(): Int { + return when (this) { + SYSTEM -> R.string.settings_profile_select_region_system_title + GERMANY -> R.string.settings_profile_select_region_germany_title + PORTUGAL -> R.string.settings_profile_select_region_portugal_title + SLOVENIA -> R.string.settings_profile_select_region_slovenia_title + DENMARK -> R.string.settings_profile_select_region_denmark_title + UNITED_KINGDOM -> R.string.settings_profile_select_region_united_kingdom_title + USA -> R.string.settings_profile_select_region_usa_title + } + } + + fun RegionEnum.getDisplayName(context: Context): String { + return context.getString(this.getDisplayNameRes()) + } + + fun getRegionsList(): List { + return listOf( + SYSTEM, + GERMANY, + PORTUGAL, + SLOVENIA, + DENMARK, + UNITED_KINGDOM, + USA + ) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavGraphDirections.kt b/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavGraphDirections.kt index 8b8c33a..7009096 100644 --- a/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavGraphDirections.kt +++ b/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavGraphDirections.kt @@ -21,6 +21,7 @@ import eu.inscico.aurora_app.ui.screens.settings.featurePreview.FeaturePreviewSc import eu.inscico.aurora_app.ui.screens.settings.notifications.ElectricityBillNotificationScreen import eu.inscico.aurora_app.ui.screens.settings.notifications.HeatingBillNotificationScreen import eu.inscico.aurora_app.ui.screens.settings.notifications.MobilityNotificationScreen +import eu.inscico.aurora_app.ui.screens.settings.profile.SelectRegionScreen import eu.inscico.aurora_app.ui.screens.settings.profile.UpdateEmailScreen import eu.inscico.aurora_app.ui.screens.settings.profile.UpdatePasswordScreen @@ -247,6 +248,17 @@ sealed class NavGraphDirections( } } + object SelectRegion : NavGraphDirections( + route = "selectRegion", + content = { + SelectRegionScreen() + } + ) { + fun getNavRoute(): String { + return route + } + } + object UpdateUserPassword : NavGraphDirections( route = "updateUserPassword", content = { diff --git a/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavigationService.kt b/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavigationService.kt index ee22471..b97f639 100644 --- a/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavigationService.kt +++ b/app/src/main/java/eu/inscico/aurora_app/services/navigation/NavigationService.kt @@ -89,6 +89,11 @@ class NavigationService { navControllerTabSettings?.navigate(navDirection) } + fun toSelectRegion() { + val navDirection = NavGraphDirections.SelectRegion.getNavRoute() + navControllerTabSettings?.navigate(navDirection) + } + fun toUpdateUserPassword() { val navDirection = NavGraphDirections.UpdateUserPassword.getNavRoute() navControllerTabSettings?.navigate(navDirection) diff --git a/app/src/main/java/eu/inscico/aurora_app/services/shared/UnitService.kt b/app/src/main/java/eu/inscico/aurora_app/services/shared/UnitService.kt new file mode 100644 index 0000000..516687a --- /dev/null +++ b/app/src/main/java/eu/inscico/aurora_app/services/shared/UnitService.kt @@ -0,0 +1,432 @@ +package eu.inscico.aurora_app.services.shared + +import android.content.Context +import android.content.res.Configuration +import android.icu.util.LocaleData +import android.icu.util.ULocale +import android.os.Build +import eu.inscico.aurora_app.model.user.RegionEnum +import eu.inscico.aurora_app.utils.PrefsUtils +import java.util.* + +class UnitService( + private val context: Context +) { + + var appRegion: RegionEnum + get() { + val regionString = PrefsUtils.get( + context, + "auroraAppRegion", + RegionEnum.parseRegionToString(RegionEnum.SYSTEM) + ) + return RegionEnum.parseStringToRegion(regionString) + } + set(value) { + val regionString = RegionEnum.parseRegionToString(value) + PrefsUtils.save(context, "electricityReminderActive", regionString) + } + + + // region: Distance + // --------------------------------------------------------------------------------------------- + + fun getDistanceUnit(config: Configuration): String { + + return when (appRegion) { + RegionEnum.SYSTEM -> { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + + when (measurementSystem) { + LocaleData.MeasurementSystem.SI -> "km" + LocaleData.MeasurementSystem.UK -> "mi" + LocaleData.MeasurementSystem.US -> "mi" + else -> "km" + } + } else { + "km" + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> "km" + RegionEnum.UNITED_KINGDOM -> "mi" + RegionEnum.USA -> "mi" + } + } + + fun getConvertedDistance( + config: Configuration, + distanceInKm: Double?, + decimals: Int? = 0 + ): Double { + + if (distanceInKm == null || distanceInKm == 0.0) { + return 0.0 + } + + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + return when (measurementSystem) { + LocaleData.MeasurementSystem.UK, + LocaleData.MeasurementSystem.US -> { + val formattedDistance = if (decimals != null) { + String.format("%.${decimals}f", distanceInKm * 0.62137) + .replace(",", ".") + .toDouble() + } else { + distanceInKm * 0.62137 + } + formattedDistance + } + else -> { + val formattedDistance = if (decimals != null) { + String.format("%.${decimals}f", distanceInKm).replace(",", ".") + .toDouble() + } else { + distanceInKm + } + formattedDistance + } + } + } else { + val formattedDistance = if (decimals != null) { + String.format("%.${decimals}f", distanceInKm).replace(",", ".") + .toDouble() + } else { + distanceInKm + } + formattedDistance + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> { + val formattedDistance = if (decimals != null) { + String.format("%.${decimals}f", distanceInKm).replace(",", ".") + .toDouble() + } else { + distanceInKm + } + formattedDistance + } + RegionEnum.UNITED_KINGDOM, + RegionEnum.USA -> { + val formattedDistance = if (decimals != null) { + String.format("%.${decimals}f", distanceInKm * 0.62137) + .replace(",", ".") + .toDouble() + } else { + distanceInKm * 0.62137 + } + formattedDistance + } + } + } + + fun getValueInCorrectNumberFormat(config: Configuration, value: Double): String { + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + + when (measurementSystem) { + LocaleData.MeasurementSystem.UK, + LocaleData.MeasurementSystem.US -> value.toString().replace(",", ".") + else -> value.toString().replace(".", ",") + } + } else { + value.toString().replace(",", ".") + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> { + value.toString().replace(".", ",") + } + RegionEnum.UNITED_KINGDOM, + RegionEnum.USA -> { + value.toString().replace(",", ".") + } + } + } + + fun getConvertedDistanceWithUnit( + config: Configuration, + distanceInKm: Double?, + decimals: Int? = 0 + ): String { + val convertedDistance = getConvertedDistance(config, distanceInKm, decimals) + val convertedDistanceFormatted = getValueInCorrectNumberFormat(config, convertedDistance) + return "$convertedDistanceFormatted ${getDistanceUnit(config)}" + } + + fun getCalculatedDistanceValueForUnit(config: Configuration, distance: Double): Double { + + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + return when (measurementSystem) { + LocaleData.MeasurementSystem.UK, + LocaleData.MeasurementSystem.US -> { + distance * 1.609344 + } + else -> distance + } + } else { + distance + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> { + distance + } + RegionEnum.UNITED_KINGDOM, + RegionEnum.USA -> { + distance * 1.609344 + } + } + } + + // endregion + + + // region: Weight + // --------------------------------------------------------------------------------------------- + + + fun getWeightUnit(config: Configuration): String { + + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + return when (measurementSystem) { + LocaleData.MeasurementSystem.UK, + LocaleData.MeasurementSystem.US -> "lbs" + else -> "kg" + } + } else { + "kg" + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> { + "kg" + } + RegionEnum.UNITED_KINGDOM, + RegionEnum.USA -> "lbs" + } + } + + fun getConvertedWeight( + config: Configuration, + weightInKg: Double?, + decimals: Int? = null + ): Double { + + if (weightInKg == null || weightInKg == 0.0) { + return 0.0 + } + + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + return when (measurementSystem) { + LocaleData.MeasurementSystem.UK, + LocaleData.MeasurementSystem.US -> { + val formattedWeight = if (decimals != null) { + String.format("%.${decimals}f", weightInKg * 2.2046) + .replace(",", ".") + .toDouble() + } else { + weightInKg * 2.2046 + } + formattedWeight + } + else -> { + val formattedWeight = if (decimals != null) { + String.format("%.${decimals}f", weightInKg).replace(",", ".") + .toDouble() + } else { + weightInKg + } + formattedWeight + } + } + } else { + val formattedWeight = if (decimals != null) { + String.format("%.${decimals}f", weightInKg).replace(",", ".").toDouble() + } else { + weightInKg + } + formattedWeight + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> { + val formattedWeight = if (decimals != null) { + String.format("%.${decimals}f", weightInKg).replace(",", ".").toDouble() + } else { + weightInKg + } + formattedWeight + } + RegionEnum.UNITED_KINGDOM, + RegionEnum.USA -> { + val formattedWeight = if (decimals != null) { + String.format("%.${decimals}f", weightInKg * 2.2046) + .replace(",", ".") + .toDouble() + } else { + weightInKg * 2.2046 + } + formattedWeight + + } + } + } + + fun getConvertedWeightWithUnit( + config: Configuration, + weightInKg: Double?, + decimals: Int? = 0 + ): String { + val convertedWeight = getConvertedWeight(config, weightInKg, decimals) + val convertedWeightFormatted = getValueInCorrectNumberFormat(config, convertedWeight) + return "$convertedWeightFormatted ${getWeightUnit(config)}" + } + + // endregion + + +// region: Currency +// --------------------------------------------------------------------------------------------- + + fun getCurrencyUnit(config: Configuration): String { + + return when (appRegion) { + RegionEnum.SYSTEM -> { + val currentLocale = config.locales[0] + val currencySymbol = Currency.getInstance(currentLocale).symbol + currencySymbol + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA -> "€" + RegionEnum.DENMARK -> "DKK" + RegionEnum.UNITED_KINGDOM -> "£" + RegionEnum.USA -> "$" + + } + } + + fun getCurrencyUnitByLocale(locale: String): String { + val currency: Currency = Currency.getInstance(locale) + return currency.symbol + } + + // endregion + + // region: Currency + // --------------------------------------------------------------------------------------------- + + fun getDateFormat(config: Configuration, withTime: Boolean = false): String { + + val dateFormat = when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + + when (measurementSystem) { + LocaleData.MeasurementSystem.US -> "MM/dd/yyyy" + LocaleData.MeasurementSystem.UK -> "dd/MM/yyyy" + else -> "dd.MM.yyyy" + } + } else { + "dd.MM.yyyy" + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK -> "dd.MM.yyyy" + RegionEnum.UNITED_KINGDOM -> "dd/MM/yyyy" + RegionEnum.USA -> "MM/dd/yyyy" + } + + return if(withTime){ + when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + + when (measurementSystem) { + LocaleData.MeasurementSystem.US -> "$dateFormat h:mm a" + else -> "$dateFormat HH:mm" + } + } else { + "$dateFormat HH:mm" + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK, + RegionEnum.UNITED_KINGDOM -> "$dateFormat HH:mm" + RegionEnum.USA -> "$dateFormat h:mm a" + } + } else { + dateFormat + } + } + + fun getTimeFormat(config: Configuration): String { + return when (appRegion) { + RegionEnum.SYSTEM -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val measurementSystem = + LocaleData.getMeasurementSystem(ULocale.forLocale(config.locales[0])) + + when (measurementSystem) { + LocaleData.MeasurementSystem.US -> "h:mm a" + else -> "HH:mm" + } + } else { + "HH:mm" + } + } + RegionEnum.GERMANY, + RegionEnum.PORTUGAL, + RegionEnum.SLOVENIA, + RegionEnum.DENMARK, + RegionEnum.UNITED_KINGDOM -> "HH:mm" + RegionEnum.USA -> "h:mm a" + } + } + + // endregion + +} \ No newline at end of file diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryBarChart.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryBarChart.kt index b773941..99d845f 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryBarChart.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryBarChart.kt @@ -1,6 +1,5 @@ package eu.inscico.aurora_app.ui.components.consumptionSummery -import android.graphics.RectF import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -10,7 +9,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent @@ -18,26 +16,21 @@ import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis import com.patrykandpatrick.vico.compose.axis.vertical.endAxis import com.patrykandpatrick.vico.compose.chart.Chart import com.patrykandpatrick.vico.compose.chart.column.columnChart -import com.patrykandpatrick.vico.compose.style.currentChartStyle import com.patrykandpatrick.vico.core.axis.AxisPosition import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter import com.patrykandpatrick.vico.core.chart.column.ColumnChart -import com.patrykandpatrick.vico.core.chart.draw.ChartDrawContext import com.patrykandpatrick.vico.core.component.shape.LineComponent -import com.patrykandpatrick.vico.core.component.shape.Shapes import com.patrykandpatrick.vico.core.component.text.TextComponent -import com.patrykandpatrick.vico.core.context.MeasureContext import com.patrykandpatrick.vico.core.dimensions.MutableDimensions import com.patrykandpatrick.vico.core.entry.ChartEntryModel -import com.patrykandpatrick.vico.core.legend.Legend -import com.patrykandpatrick.vico.core.marker.Marker import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptionSummary.ConsumptionSummary import eu.inscico.aurora_app.ui.theme.electricityYellow import eu.inscico.aurora_app.ui.theme.heatingRed import eu.inscico.aurora_app.ui.theme.mobilityBlue import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get import java.util.* import kotlin.math.roundToInt @@ -45,7 +38,8 @@ import kotlin.math.roundToInt fun ConsumptionSummaryBarChart( summary: ConsumptionSummary, barChartData: ChartEntryModel, - isCarbonEmission: Boolean + isCarbonEmission: Boolean, + unitService: UnitService = get() ){ val context = LocalContext.current @@ -61,7 +55,7 @@ fun ConsumptionSummaryBarChart( val yAxisValueFormatter: AxisValueFormatter = AxisValueFormatter { value, _ -> val convertedValue = if(isCarbonEmission){ - UnitUtils.getConvertedWeight(weightInKg = value.toDouble(), locale = configuration.locales[0]).toFloat() + unitService.getConvertedWeight(configuration, weightInKg = value.toDouble()).toFloat() } else { value } @@ -83,7 +77,7 @@ fun ConsumptionSummaryBarChart( val yAxisName = if(isCarbonEmission){ context.getString( R.string.home_your_carbon_emissions_bar_chart_label_carbon_emission_title, - UnitUtils.getWeightUnit(locale = configuration.locales[0]), + unitService.getWeightUnit(configuration), ) } else { stringResource(id = R.string.home_your_carbon_emissions_bar_chart_label_energy_expended_title) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryLabel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryLabel.kt index 9fcdbef..64f2f66 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryLabel.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/ConsumptionSummaryLabel.kt @@ -24,7 +24,8 @@ import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel.Companion.getL import eu.inscico.aurora_app.model.consumptions.ConsumptionType import eu.inscico.aurora_app.model.consumptions.ConsumptionType.Companion.getDisplayNameRes import eu.inscico.aurora_app.model.consumptions.ConsumptionType.Companion.getIconRes -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable fun ConsumptionSummaryLabel( @@ -33,6 +34,7 @@ fun ConsumptionSummaryLabel( consumptionType: ConsumptionType, label: EnergyLabel?, isCarbonEmission: Boolean = true, + unitService: UnitService = get() ) { val context = LocalContext.current @@ -71,7 +73,7 @@ fun ConsumptionSummaryLabel( val valueText = if(isCarbonEmission){ context.getString( R.string.home_your_carbon_emissions_labels_value_produced_with_year_title, - UnitUtils.getConvertedWeightWithUnit(weightInKg = value, locale = configuration.locales[0], decimals = 1), + unitService.getConvertedWeightWithUnit(config = configuration, weightInKg = value, decimals = 1), year ) } else { diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/DashboardOverallConsumptionSummaryLabel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/DashboardOverallConsumptionSummaryLabel.kt index b474d63..db09641 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/DashboardOverallConsumptionSummaryLabel.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/DashboardOverallConsumptionSummaryLabel.kt @@ -4,8 +4,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -17,23 +15,22 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel.Companion.getLabelColor import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel.Companion.getLabelNameRes -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable fun DashboardConsumptionSummaryLabel( + unitService: UnitService = get(), carbonValue: Double, carbonLabel: EnergyLabel, energyValue: Double, energyLabel: EnergyLabel, - onLabelClicked: (isEnergyLabelClicked: Boolean) -> Unit + onLabelClicked: (isEnergyLabelClicked: Boolean) -> Unit, ) { val context = LocalContext.current val configuration = LocalConfiguration.current @@ -95,7 +92,7 @@ fun DashboardConsumptionSummaryLabel( Text( text = context.getString( R.string.home_your_carbon_emissions_labels_overall_produced_value_title, - UnitUtils.getConvertedWeightWithUnit(weightInKg = carbonValue, locale = configuration.locales[0], decimals = 1), + unitService.getConvertedWeightWithUnit(config = configuration, weightInKg = carbonValue, decimals = 1), ), style = MaterialTheme.typography.labelSmall, color = carbonTextColor @@ -128,10 +125,11 @@ fun DashboardConsumptionSummaryLabel( ) + val usedEnergyValueFormatted = String.format("%.1f", energyValue).replace(",", ".").toDouble() Text( text = context.getString( R.string.home_your_carbon_emissions_labels_overall_used_value_title, - String.format("%.1f", energyValue) + unitService.getValueInCorrectNumberFormat(configuration, usedEnergyValueFormatted) ), style = MaterialTheme.typography.labelSmall, color = energyTextColor, diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/OverallConsumptionSummaryLabel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/OverallConsumptionSummaryLabel.kt index 5a764d1..47737f8 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/OverallConsumptionSummaryLabel.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptionSummery/OverallConsumptionSummaryLabel.kt @@ -18,7 +18,8 @@ import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel.Companion.getLabelColor import eu.inscico.aurora_app.model.consumptionSummary.EnergyLabel.Companion.getLabelNameRes -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable @@ -26,7 +27,8 @@ fun OverallConsumptionSummaryLabel( value: Double?, label: EnergyLabel?, year: Int, - isCarbonEmissions: Boolean + isCarbonEmissions: Boolean, + unitService: UnitService = get() ) { val context = LocalContext.current val configuration = LocalConfiguration.current @@ -122,12 +124,12 @@ fun OverallConsumptionSummaryLabel( val valueText = if (isCarbonEmissions) { context.getString( R.string.home_your_carbon_emissions_labels_overall_produced_value_title, - UnitUtils.getConvertedWeightWithUnit(weightInKg = value, locale = configuration.locales[0], decimals = 1), + unitService.getConvertedWeightWithUnit(config = configuration, weightInKg = value, decimals = 1), ) } else { context.getString( R.string.home_your_carbon_emissions_labels_overall_used_value_title, - UnitUtils.getConvertedWeightWithUnit(weightInKg = value, locale = configuration.locales[0], decimals = 1), + unitService.getConvertedWeightWithUnit(config = configuration, weightInKg = value, decimals = 1), ) } diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptions/ConsumptionListItem.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptions/ConsumptionListItem.kt index 3696909..78e6631 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptions/ConsumptionListItem.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/consumptions/ConsumptionListItem.kt @@ -10,7 +10,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind @@ -20,26 +19,27 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptions.Consumption -import eu.inscico.aurora_app.model.consumptions.ConsumptionType import eu.inscico.aurora_app.model.consumptions.ConsumptionType.Companion.getDisplayName import eu.inscico.aurora_app.ui.theme.* import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @OptIn(ExperimentalMaterial3Api::class) @Composable fun ConsumptionListItem( + unitService: UnitService = get(), consumption: Consumption, - callback: (Consumption) -> Unit + callback: (Consumption) -> Unit, ) { val context = LocalContext.current + val config = LocalConfiguration.current val headlineText = when (consumption) { is Consumption.ElectricityConsumption -> consumption.category.getDisplayName(context) @@ -48,10 +48,10 @@ fun ConsumptionListItem( } val consumptionTime = when (consumption) { - is Consumption.ElectricityConsumption -> "${CalendarUtils.toDateString(consumption.electricity.startDate)} - ${CalendarUtils.toDateString(consumption.electricity.endDate)}" - is Consumption.HeatingConsumption -> "${CalendarUtils.toDateString(consumption.heating.startDate, "dd.MM.yy")} - ${CalendarUtils.toDateString(consumption.heating.endDate, "dd.MM.yy")}" + is Consumption.ElectricityConsumption -> "${CalendarUtils.toDateString(consumption.electricity.startDate, unitService.getDateFormat(config))} - ${CalendarUtils.toDateString(consumption.electricity.endDate, unitService.getDateFormat(config))}" + is Consumption.HeatingConsumption -> "${CalendarUtils.toDateString(consumption.heating.startDate, unitService.getDateFormat(config))} - ${CalendarUtils.toDateString(consumption.heating.endDate, unitService.getDateFormat(config))}" is Consumption.TransportationConsumption -> { - CalendarUtils.toDateString(consumption.transportation.dateOfTravel, "dd.MM.yyyy, HH:mm") + CalendarUtils.toDateString(consumption.transportation.dateOfTravel, unitService.getDateFormat(config, withTime = true)) } } @@ -62,15 +62,15 @@ fun ConsumptionListItem( } val carbonEmissionText = when (consumption) { - is Consumption.ElectricityConsumption -> UnitUtils.getConvertedWeightWithUnit(consumption.carbonEmissions, locale = LocalConfiguration.current.locales[0], decimals = 1) - is Consumption.HeatingConsumption -> UnitUtils.getConvertedWeightWithUnit(consumption.carbonEmissions, locale = LocalConfiguration.current.locales[0], decimals = 1) - is Consumption.TransportationConsumption -> UnitUtils.getConvertedWeightWithUnit(consumption.carbonEmissions, locale = LocalConfiguration.current.locales[0], decimals = 1) + is Consumption.ElectricityConsumption -> unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, decimals = 1) + is Consumption.HeatingConsumption -> unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, decimals = 1) + is Consumption.TransportationConsumption -> unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, decimals = 1) } val consumptionValue = when (consumption) { is Consumption.ElectricityConsumption -> "${String.format("%.0f", consumption.value)} kWh" is Consumption.HeatingConsumption -> "${String.format("%.0f", consumption.value)} kWh" - is Consumption.TransportationConsumption -> UnitUtils.getConvertedDistanceWithUnit(consumption.value, locale = LocalConfiguration.current.locales[0], decimals = 1) + is Consumption.TransportationConsumption -> unitService.getConvertedDistanceWithUnit(config, consumption.value, decimals = 1) } val red = heatingRed @@ -95,7 +95,9 @@ fun ConsumptionListItem( .size(30.dp) ){ Image( - modifier = Modifier.matchParentSize().padding(6.dp), + modifier = Modifier + .matchParentSize() + .padding(6.dp), painter = painterResource(id = R.drawable.outline_electric_bolt_24), contentDescription = "", colorFilter = ColorFilter.tint(color = yellow), @@ -114,7 +116,9 @@ fun ConsumptionListItem( .size(30.dp) ){ Image( - modifier = Modifier.matchParentSize().padding(6.dp), + modifier = Modifier + .matchParentSize() + .padding(6.dp), painter = painterResource(id = R.drawable.outline_local_fire_department_24), contentDescription = "", colorFilter = ColorFilter.tint(color = red), @@ -133,7 +137,9 @@ fun ConsumptionListItem( .size(30.dp) ){ Image( - modifier = Modifier.matchParentSize().padding(6.dp), + modifier = Modifier + .matchParentSize() + .padding(6.dp), painter = painterResource(id = R.drawable.outline_directions_car_24), contentDescription = "", colorFilter = ColorFilter.tint(color = blue), diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/forms/BeginEndPickerFormEntry.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/forms/BeginEndPickerFormEntry.kt index e1293e8..bbfcab3 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/forms/BeginEndPickerFormEntry.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/forms/BeginEndPickerFormEntry.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle @@ -23,12 +24,15 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.inscico.aurora_app.R +import eu.inscico.aurora_app.services.shared.UnitService import eu.inscico.aurora_app.ui.components.datePicker.MaterialDatePickerDialog import eu.inscico.aurora_app.utils.CalendarUtils +import org.koin.androidx.compose.get import java.util.* @Composable fun BeginEndPickerFormEntry( + unitService: UnitService = get(), initialBeginCalendarAsLong: Long = Calendar.getInstance().timeInMillis, initialEndCalendarAsLong: Long = Calendar.getInstance().timeInMillis + (86400000 * 2).toLong(), beginDateValidator: ((Calendar)-> Boolean)? = null, @@ -36,6 +40,8 @@ fun BeginEndPickerFormEntry( callback: (beginCalendarAsLong: Long?, endCalendarAsLong: Long?) -> Unit ){ + val config = LocalConfiguration.current + val openBeginDateTimePicker = remember { mutableStateOf(false) } @@ -76,7 +82,7 @@ fun BeginEndPickerFormEntry( beginCalendar.timeInMillis = beginCalendarAsLong.value Text( - text = CalendarUtils.toDateString(beginCalendar), + text = CalendarUtils.toDateString(beginCalendar, unitService.getDateFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -115,7 +121,7 @@ fun BeginEndPickerFormEntry( endCalendar.timeInMillis = endCalendarAsLong.value Text( - text = CalendarUtils.toDateString(endCalendar), + text = CalendarUtils.toDateString(endCalendar, unitService.getDateFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentInputCard.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentInputCard.kt index 27603af..406e81a 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentInputCard.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentInputCard.kt @@ -19,12 +19,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.inscico.aurora_app.R -import eu.inscico.aurora_app.model.City -import eu.inscico.aurora_app.model.photovoltaics.PhotovoltaicInvestmentResult -import eu.inscico.aurora_app.utils.UnitUtils -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultCard.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultCard.kt index 52ba3a8..e82ee3e 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultCard.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultCard.kt @@ -19,8 +19,8 @@ import eu.inscico.aurora_app.ui.components.FormEntry import eu.inscico.aurora_app.ui.components.FormEntryType import eu.inscico.aurora_app.ui.theme.investmentResultGreen import eu.inscico.aurora_app.ui.theme.investmentResultOrange -import eu.inscico.aurora_app.utils.ExternalUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -28,7 +28,8 @@ fun InvestmentResultCard( currency: String, investmentResult: PhotovoltaicInvestmentResult, resetCallback: () -> Unit, - learnMoreCallback: () -> Unit + learnMoreCallback: () -> Unit, + unitService: UnitService = get() ) { val context = LocalContext.current diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultLabel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultLabel.kt index 0939118..ac153e7 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultLabel.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/photovoltaics/InvestmentResultLabel.kt @@ -17,15 +17,16 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import eu.inscico.aurora_app.R -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable fun InvestmentResultLabel( value: Double, infoTextRes: Int, labelTextRes: Int, - buttonColor: Color + buttonColor: Color, + unitService: UnitService = get() ){ val context = LocalContext.current @@ -76,7 +77,7 @@ fun InvestmentResultLabel( ) { Text( - text = UnitUtils.getConvertedWeightWithUnit(weightInKg = value, locale = configuration.locales[0], decimals = 1), + text = unitService.getConvertedWeightWithUnit(config = configuration, weightInKg = value, decimals = 1), style = MaterialTheme.typography.headlineSmall, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold, diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderSelector.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderSelector.kt index c6c2305..2e8f47a 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderSelector.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderSelector.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -19,18 +20,21 @@ import eu.inscico.aurora_app.model.reminder.CalendarMonthItem import eu.inscico.aurora_app.model.reminder.CalendarWeekItem import eu.inscico.aurora_app.model.reminder.ReminderTime import eu.inscico.aurora_app.services.notification.NotificationService +import eu.inscico.aurora_app.services.shared.UnitService import eu.inscico.aurora_app.utils.CalendarUtils import org.koin.androidx.compose.get import java.util.* @Composable fun ReminderSelector( + unitService: UnitService = get(), reminderTime: ReminderTime?, notificationService: NotificationService = get(), callback: (ReminderTime) -> Unit ){ val context = LocalContext.current + val config = LocalConfiguration.current val currentCalendar = Calendar.getInstance() val addTimeSelector = remember { @@ -197,7 +201,7 @@ fun ReminderSelector( Text( text = context.getString( R.string.settings_notifications_next_reminder_send_info, - CalendarUtils.toDateString(notificationService.getNextNotificationTime(it), "dd.MM.yyyy, HH:mm")), + CalendarUtils.toDateString(notificationService.getNextNotificationTime(it), unitService.getDateFormat(config, true))), style = MaterialTheme.typography.labelSmall, textAlign = TextAlign.Start, color = MaterialTheme.colorScheme.onSecondary, diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderTimeSelector.kt b/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderTimeSelector.kt index dabd42f..d5d3d33 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderTimeSelector.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/components/reminder/ReminderTimeSelector.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role @@ -16,20 +17,25 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.inscico.aurora_app.R +import eu.inscico.aurora_app.services.shared.UnitService import eu.inscico.aurora_app.ui.components.timePicker.TimePickerDialog import eu.inscico.aurora_app.utils.CalendarUtils +import org.koin.androidx.compose.get import java.util.Calendar @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReminderTimeSelector( + unitService: UnitService = get(), initialValue: Calendar, callback: (Calendar) -> Unit ) { + val config = LocalConfiguration.current + val calendar = initialValue val selectedTime = remember { mutableStateOf(calendar) } - val selectedTimeString = remember { mutableStateOf(CalendarUtils.toDateString(calendar, "HH:mm")) } + val selectedTimeString = remember { mutableStateOf(CalendarUtils.toDateString(calendar, unitService.getTimeFormat(config))) } val openTimeDialog = remember { @@ -76,7 +82,7 @@ fun ReminderTimeSelector( time = selectedTime.value, onTimeChanged = { selectedTime.value = it - selectedTimeString.value = CalendarUtils.toDateString(it, "HH:mm") + selectedTimeString.value = CalendarUtils.toDateString(it, unitService.getTimeFormat(config)) callback.invoke(selectedTime.value) }, validator = { diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListScreen.kt index 49c9bd0..b07c939 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -39,6 +40,7 @@ fun AllConsumptionsListScreen( ) { val context = LocalContext.current + val config = LocalConfiguration.current val allConsumptions = viewModel.userConsumptions.observeAsState() val searchResults = viewModel.searchResults.observeAsState() @@ -47,7 +49,7 @@ fun AllConsumptionsListScreen( } val state = rememberLazyListState() - viewModel.searchForResults(allConsumptions.value, context, searchString.value) + viewModel.searchForResults(config, allConsumptions.value, context, searchString.value) Column( modifier = Modifier.fillMaxSize(), @@ -79,7 +81,7 @@ fun AllConsumptionsListScreen( AuroraSearchBar { searchString.value = it - viewModel.searchForResults(allConsumptions.value, context, searchString.value) + viewModel.searchForResults(config, allConsumptions.value, context, searchString.value) } Spacer(modifier = Modifier.height(8.dp)) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListViewModel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListViewModel.kt index ed23fcd..9915f6f 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListViewModel.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/AllConsumptionsListViewModel.kt @@ -1,16 +1,19 @@ package eu.inscico.aurora_app.ui.screens.home.consumptions import android.content.Context +import android.content.res.Configuration import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.map import eu.inscico.aurora_app.model.consumptions.Consumption import eu.inscico.aurora_app.model.consumptions.ConsumptionType.Companion.getDisplayName import eu.inscico.aurora_app.services.firebase.ConsumptionsService +import eu.inscico.aurora_app.services.shared.UnitService import eu.inscico.aurora_app.utils.CalendarUtils class AllConsumptionsListViewModel( - private val _consumptionService: ConsumptionsService + private val _consumptionService: ConsumptionsService, + private val _unitService: UnitService ): ViewModel() { val userConsumptions = _consumptionService.userConsumptionsLive.map { @@ -25,7 +28,7 @@ class AllConsumptionsListViewModel( val searchResults = MutableLiveData?>() - fun searchForResults(allConsumptions: List?, context: Context, query: String = ""){ + fun searchForResults(config: Configuration, allConsumptions: List?, context: Context, query: String = ""){ val searchQuery = query.toLowerCase() val results = mutableListOf() @@ -55,7 +58,7 @@ class AllConsumptionsListViewModel( results.add(consumption) continue } - if(getConsumptionTimeString(consumption).contains(searchQuery)){ + if(getConsumptionTimeString(config, consumption).contains(searchQuery)){ results.add(consumption) continue } @@ -78,7 +81,7 @@ class AllConsumptionsListViewModel( results.add(consumption) continue } - if(getConsumptionTimeString(consumption).contains(searchQuery)){ + if(getConsumptionTimeString(config, consumption).contains(searchQuery)){ results.add(consumption) continue } @@ -100,7 +103,7 @@ class AllConsumptionsListViewModel( results.add(consumption) continue } - if(getConsumptionTimeString(consumption).contains(searchQuery)){ + if(getConsumptionTimeString(config, consumption).contains(searchQuery)){ results.add(consumption) continue } @@ -118,12 +121,12 @@ class AllConsumptionsListViewModel( searchResults.postValue(sortedResults) } - private fun getConsumptionTimeString(consumption: Consumption): String { + private fun getConsumptionTimeString(config: Configuration, consumption: Consumption): String { return when (consumption) { - is Consumption.ElectricityConsumption -> "${CalendarUtils.toDateString(consumption.electricity.startDate)} - ${CalendarUtils.toDateString(consumption.electricity.endDate)}" - is Consumption.HeatingConsumption -> "${CalendarUtils.toDateString(consumption.heating.startDate, "dd.MM.yy")} - ${CalendarUtils.toDateString(consumption.heating.endDate, "dd.MM.yy")}" + is Consumption.ElectricityConsumption -> "${CalendarUtils.toDateString(consumption.electricity.startDate, _unitService.getDateFormat(config))} - ${CalendarUtils.toDateString(consumption.electricity.endDate, _unitService.getDateFormat(config))}" + is Consumption.HeatingConsumption -> "${CalendarUtils.toDateString(consumption.heating.startDate, _unitService.getDateFormat(config))} - ${CalendarUtils.toDateString(consumption.heating.endDate, _unitService.getDateFormat(config))}" is Consumption.TransportationConsumption -> { - CalendarUtils.toDateString(consumption.transportation.dateOfTravel, "dd.MM.yyyy, HH:mm") + CalendarUtils.toDateString(consumption.transportation.dateOfTravel, _unitService.getDateFormat(config, true)) } } } diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddElectricityConsumption.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddElectricityConsumption.kt index 474553a..fe8a8e0 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddElectricityConsumption.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddElectricityConsumption.kt @@ -21,7 +21,6 @@ import androidx.compose.ui.unit.dp import com.google.firebase.Timestamp import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptions.* -import eu.inscico.aurora_app.model.consumptions.DistrictHeatingSource.Companion.getDisplayName import eu.inscico.aurora_app.model.consumptions.ElectricitySource.Companion.getDisplayName import eu.inscico.aurora_app.services.navigation.NavigationService import eu.inscico.aurora_app.services.shared.UserFeedbackService @@ -30,7 +29,7 @@ import eu.inscico.aurora_app.ui.components.forms.BeginEndPickerFormEntry import eu.inscico.aurora_app.ui.components.forms.SpinnerFormEntry import eu.inscico.aurora_app.ui.components.forms.SpinnerItem import eu.inscico.aurora_app.utils.TypedResult -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -46,13 +45,15 @@ fun AddElectricityConsumption( isDuplicate: Boolean? = false, viewModel: AddConsumptionViewModel = koinViewModel(), navigationService: NavigationService = get(), - userFeedbackService: UserFeedbackService = get() + userFeedbackService: UserFeedbackService = get(), + unitService: UnitService = get() ) { val context = LocalContext.current + val config = LocalConfiguration.current val initialConsumption = if(initialValues?.value != null){ - String.format("%.1f",initialValues.value) + unitService.getValueInCorrectNumberFormat(config, String.format("%.1f",initialValues.value).replace(",",".").toDouble()) } else { "" } @@ -254,7 +255,7 @@ fun AddElectricityConsumption( }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Done), trailingIcon = { - Text(text = UnitUtils.getSystemCurrencyUnit(LocalConfiguration.current)) + Text(text = unitService.getCurrencyUnit(LocalConfiguration.current)) } ) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddHeatingConsumption.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddHeatingConsumption.kt index 6e9fe28..c63e91d 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddHeatingConsumption.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddHeatingConsumption.kt @@ -32,7 +32,7 @@ import eu.inscico.aurora_app.ui.components.forms.SpinnerFormEntry import eu.inscico.aurora_app.ui.components.forms.SpinnerItem import eu.inscico.aurora_app.utils.LocaleUtils import eu.inscico.aurora_app.utils.TypedResult -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -49,16 +49,18 @@ fun AddHeatingConsumption( isDuplicate: Boolean? = false, viewModel: AddConsumptionViewModel = koinViewModel(), navigationService: NavigationService = get(), - userFeedbackService: UserFeedbackService = get() + userFeedbackService: UserFeedbackService = get(), + unitService: UnitService = get() ){ val context = LocalContext.current + val config = LocalConfiguration.current // set language, only necessary for screenshot ui tests LocaleUtils.updateLocale(context, language) val initialConsumption = if(initialValue?.value != null){ - String.format("%.1f",initialValue.value) + unitService.getValueInCorrectNumberFormat(config, String.format("%.1f",initialValue.value).replace(",",".").toDouble()) } else { "" } @@ -283,7 +285,7 @@ fun AddHeatingConsumption( }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Done), trailingIcon = { - Text(text = UnitUtils.getSystemCurrencyUnit(LocalConfiguration.current)) + Text(text = unitService.getCurrencyUnit(LocalConfiguration.current)) } ) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddTransportationConsumption.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddTransportationConsumption.kt index 13f5fc3..4153788 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddTransportationConsumption.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/addConsumption/AddTransportationConsumption.kt @@ -1,6 +1,5 @@ package eu.inscico.aurora_app.ui.screens.home.consumptions.addConsumption -import android.app.LocaleConfig import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape @@ -17,7 +16,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle @@ -42,7 +40,7 @@ import eu.inscico.aurora_app.ui.components.forms.SpinnerItem import eu.inscico.aurora_app.ui.components.timePicker.TimePickerDialog import eu.inscico.aurora_app.utils.CalendarUtils import eu.inscico.aurora_app.utils.TypedResult -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -58,15 +56,16 @@ fun AddTransportationConsumption( isDuplicate: Boolean? = false, viewModel: AddConsumptionViewModel = koinViewModel(), navigationService: NavigationService = get(), - userFeedbackService: UserFeedbackService = get() + userFeedbackService: UserFeedbackService = get(), + unitService: UnitService = get() ) { val context = LocalContext.current - val configuration = LocalConfiguration.current - val keyboardController = LocalSoftwareKeyboardController.current + val config = LocalConfiguration.current + val convertedDistance = unitService.getConvertedDistance(config, distanceInKm = initialValues?.value, decimals = 1) val initialDistance = if (initialValues?.value != null) { - "${UnitUtils.getConvertedDistance(distanceInKm = initialValues.value, locale = configuration.locales[0], decimals = 1)}" + unitService.getValueInCorrectNumberFormat(config, convertedDistance) } else { "" } @@ -184,7 +183,7 @@ fun AddTransportationConsumption( calendar.timeInMillis = startOfTravelAsLong.value Text( - text = CalendarUtils.toDateString(calendar), + text = CalendarUtils.toDateString(calendar, unitService.getDateFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -219,7 +218,7 @@ fun AddTransportationConsumption( calendar.timeInMillis = startOfTravelAsLong.value Text( - text = CalendarUtils.toDateString(calendar, "HH:mm"), + text = CalendarUtils.toDateString(calendar, unitService.getTimeFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -268,7 +267,7 @@ fun AddTransportationConsumption( calendar.timeInMillis = endOfTravelAsLong.value Text( - text = CalendarUtils.toDateString(calendar), + text = CalendarUtils.toDateString(calendar, unitService.getDateFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -303,7 +302,7 @@ fun AddTransportationConsumption( calendar.timeInMillis = endOfTravelAsLong.value Text( - text = CalendarUtils.toDateString(calendar, "HH:mm"), + text = CalendarUtils.toDateString(calendar, unitService.getTimeFormat(config)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -546,7 +545,7 @@ fun AddTransportationConsumption( ), trailingIcon = { - Text(text = UnitUtils.getSystemDistanceUnit(LocalConfiguration.current)) + Text(text = unitService.getDistanceUnit(config)) } ) @@ -662,7 +661,7 @@ fun AddTransportationConsumption( } val distanceValue = distance.value.replace(",", ".").toDoubleOrNull() - val distanceValueKm = UnitUtils.getDistanceValueMetric(distanceValue ?: 0.0 , configuration.locales[0]) + val distanceValueKm = unitService.getCalculatedDistanceValueForUnit(config, distanceValue ?: 0.0) val consumptionResponse = ConsumptionResponse( category = ConsumptionType.parseConsumptionTypeToString(ConsumptionType.TRANSPORTATION), diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/ElectricityConsumptionDetails.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/ElectricityConsumptionDetails.kt index 5b546b0..64d9344 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/ElectricityConsumptionDetails.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/ElectricityConsumptionDetails.kt @@ -14,17 +14,19 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.consumptions.Consumption -import eu.inscico.aurora_app.model.consumptions.ElectricitySource import eu.inscico.aurora_app.model.consumptions.ElectricitySource.Companion.getDisplayName import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable fun ElectricityConsumptionDetails( - consumption: Consumption.ElectricityConsumption + consumption: Consumption.ElectricityConsumption, + unitService: UnitService = get() ) { val context = LocalContext.current + val config = LocalConfiguration.current Column( modifier = Modifier @@ -43,11 +45,12 @@ fun ElectricityConsumptionDetails( .clip(shape = RoundedCornerShape(16.dp)) ) { + val formattedConsumptionValue = unitService.getValueInCorrectNumberFormat(config, String.format("%.1f", consumption.value).replace(",",".").toDouble()) ListItem( headlineContent = { Text(text = stringResource(id = R.string.home_consumptions_type_electricity_title)) }, trailingContent = { Text( - text = "${String.format("%.1f", consumption.value)} kWh", + text = "$formattedConsumptionValue kWh", color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -57,7 +60,7 @@ fun ElectricityConsumptionDetails( Divider() val carbonEmissionText = if (consumption.carbonEmissions != null) { - "${String.format("%.1f", consumption.carbonEmissions)} kWh" + unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, 1) } else { null } @@ -87,7 +90,7 @@ fun ElectricityConsumptionDetails( val costsText = if (consumption.electricity.costs != null) { "${String.format("%.2f", consumption.electricity.costs)} ${ - UnitUtils.getSystemCurrencyUnit( + unitService.getCurrencyUnit( LocalConfiguration.current)}" } else { null @@ -112,7 +115,7 @@ fun ElectricityConsumptionDetails( headlineContent = { Text(text = stringResource(id = R.string.home_add_consumption_form_begin_title)) }, trailingContent = { Text( - text = CalendarUtils.toDateString(consumption.electricity.startDate), + text = CalendarUtils.toDateString(consumption.electricity.startDate, unitService.getDateFormat(config)), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -125,7 +128,7 @@ fun ElectricityConsumptionDetails( headlineContent = { Text(text = stringResource(id = R.string.home_add_consumption_form_end_title)) }, trailingContent = { Text( - text = CalendarUtils.toDateString(consumption.electricity.endDate), + text = CalendarUtils.toDateString(consumption.electricity.endDate, unitService.getDateFormat(config)), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -172,13 +175,13 @@ fun ElectricityConsumptionDetails( Spacer(modifier = Modifier.height(16.dp)) val createdText = if (consumption.createdAt != null) { - CalendarUtils.toDateString(consumption.createdAt) + CalendarUtils.toDateString(consumption.createdAt, unitService.getDateFormat(config)) } else { null } val updatedText = if (consumption.updatedAt != null) { - CalendarUtils.toDateString(consumption.updatedAt) + CalendarUtils.toDateString(consumption.updatedAt, unitService.getDateFormat(config)) } else { null } diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/HeatingConsumptionDetails.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/HeatingConsumptionDetails.kt index 580a111..ed86373 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/HeatingConsumptionDetails.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/HeatingConsumptionDetails.kt @@ -19,15 +19,19 @@ import eu.inscico.aurora_app.model.consumptions.Consumption import eu.inscico.aurora_app.model.consumptions.DistrictHeatingSource.Companion.getDisplayNameRes import eu.inscico.aurora_app.model.consumptions.HeatingFuelType.Companion.getDisplayNameRes import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get import kotlin.text.* @Composable fun HeatingConsumptionDetails( - consumption: Consumption.HeatingConsumption + consumption: Consumption.HeatingConsumption, + unitService: UnitService = get() ) { + val config = LocalConfiguration.current + Column( modifier = Modifier .fillMaxWidth() @@ -44,11 +48,13 @@ fun HeatingConsumptionDetails( .clip(shape = RoundedCornerShape(16.dp)) ) { + val formattedConsumptionValue = unitService.getValueInCorrectNumberFormat(config, String.format("%.1f", consumption.value).replace(",",".").toDouble()) + ListItem( headlineContent = { Text(text = stringResource(id = R.string.home_consumptions_type_heating_title)) }, trailingContent = { Text( - text = "${String.format("%.1f", consumption.value)} kWh", + text = "$formattedConsumptionValue kWh", color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -58,7 +64,7 @@ fun HeatingConsumptionDetails( Divider() val carbonEmissionText = if (consumption.carbonEmissions != null) { - "${String.format("%.2f", consumption.carbonEmissions)} kWh" + unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, 1) } else { null } @@ -90,7 +96,7 @@ fun HeatingConsumptionDetails( val costsText = if (consumption.heating.costs != null) { "${String.format("%.1f", consumption.heating.costs)} ${ - UnitUtils.getSystemCurrencyUnit( + unitService.getCurrencyUnit( LocalConfiguration.current)}" } else { null @@ -115,7 +121,7 @@ fun HeatingConsumptionDetails( headlineContent = { Text(text = stringResource(id = R.string.home_add_consumption_form_begin_title)) }, trailingContent = { Text( - text = CalendarUtils.toDateString(consumption.heating.startDate), + text = CalendarUtils.toDateString(consumption.heating.startDate, unitService.getDateFormat(config)), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -128,7 +134,7 @@ fun HeatingConsumptionDetails( headlineContent = { Text(text = stringResource(id = R.string.home_add_consumption_form_end_title)) }, trailingContent = { Text( - text = CalendarUtils.toDateString(consumption.heating.endDate), + text = CalendarUtils.toDateString(consumption.heating.endDate, unitService.getDateFormat(config)), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -191,13 +197,13 @@ fun HeatingConsumptionDetails( val createdText = if (consumption.createdAt != null) { - CalendarUtils.toDateString(consumption.createdAt) + CalendarUtils.toDateString(consumption.createdAt, unitService.getDateFormat(config)) } else { null } val updatedText = if (consumption.updatedAt != null) { - CalendarUtils.toDateString(consumption.updatedAt) + CalendarUtils.toDateString(consumption.updatedAt, unitService.getDateFormat(config)) } else { null } diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/TransportationConsumptionDetails.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/TransportationConsumptionDetails.kt index 3da6a1a..f3abdc0 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/TransportationConsumptionDetails.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/consumptions/consumptionDetails/TransportationConsumptionDetails.kt @@ -21,15 +21,18 @@ import eu.inscico.aurora_app.model.consumptions.Consumption import eu.inscico.aurora_app.model.consumptions.PublicVehicleOccupancy.Companion.getDisplayName import eu.inscico.aurora_app.model.consumptions.TransportationType.Companion.getDisplayNameRes import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get @Composable fun TransportationConsumptionDetails( - consumption: Consumption.TransportationConsumption + consumption: Consumption.TransportationConsumption, + unitService: UnitService = get() ) { val context = LocalContext.current + val config = LocalConfiguration.current Column( modifier = Modifier @@ -51,7 +54,7 @@ fun TransportationConsumptionDetails( headlineContent = { Text(text = stringResource(id = R.string.home_consumptions_type_transportation_title)) }, trailingContent = { Text( - text = UnitUtils.getConvertedDistanceWithUnit(consumption.value, locale = LocalConfiguration.current.locales[0], decimals = 1), + text = unitService.getConvertedDistanceWithUnit(config, consumption.value, decimals = 1), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) @@ -61,7 +64,7 @@ fun TransportationConsumptionDetails( Divider() val carbonEmissionText = if (consumption.carbonEmissions != null) { - "${String.format("%.1f", consumption.carbonEmissions)} kWh" + unitService.getConvertedWeightWithUnit(config, consumption.carbonEmissions, 1) } else { null } @@ -96,7 +99,7 @@ fun TransportationConsumptionDetails( Text( text = CalendarUtils.toDateString( consumption.transportation.dateOfTravel, - "dd.MM.yyyy, HH:mm" + unitService.getDateFormat(config, true) ), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium @@ -114,7 +117,7 @@ fun TransportationConsumptionDetails( Text( text = CalendarUtils.toDateString( consumption.transportation.dateOfTravelEnd, - "dd.MM.yyyy, HH:mm" + unitService.getDateFormat(config, true) ), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium @@ -184,13 +187,13 @@ fun TransportationConsumptionDetails( Spacer(modifier = Modifier.height(16.dp)) val createdText = if (consumption.createdAt != null) { - CalendarUtils.toDateString(consumption.createdAt) + CalendarUtils.toDateString(consumption.createdAt, unitService.getDateFormat(config)) } else { null } val updatedText = if (consumption.updatedAt != null) { - CalendarUtils.toDateString(consumption.updatedAt) + CalendarUtils.toDateString(consumption.updatedAt, unitService.getDateFormat(config)) } else { null } diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/recurringConsumptions/transportation/AddTransportationRecurringConsumptionScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/recurringConsumptions/transportation/AddTransportationRecurringConsumptionScreen.kt index 6b71118..4e18737 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/recurringConsumptions/transportation/AddTransportationRecurringConsumptionScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/home/recurringConsumptions/transportation/AddTransportationRecurringConsumptionScreen.kt @@ -38,16 +38,18 @@ import eu.inscico.aurora_app.ui.components.forms.SpinnerItem import eu.inscico.aurora_app.ui.components.timePicker.TimePickerDialog import eu.inscico.aurora_app.ui.screens.home.recurringConsumptions.AddOrUpdateRecurringConsumptionViewModel import eu.inscico.aurora_app.utils.CalendarUtils -import eu.inscico.aurora_app.utils.UnitUtils +import eu.inscico.aurora_app.services.shared.UnitService +import org.koin.androidx.compose.get import org.koin.androidx.compose.koinViewModel import java.util.* @OptIn(ExperimentalMaterial3Api::class) @Composable fun AddTransportationRecurringConsumptionScreen( + unitService: UnitService = get(), initialValues: RecurringConsumptionTransportationData? = null, viewModel: AddOrUpdateRecurringConsumptionViewModel = koinViewModel(), - callback: (RecurringConsumptionTransportationData?) -> Unit + callback: (RecurringConsumptionTransportationData?) -> Unit, ) { val context = LocalContext.current @@ -82,7 +84,7 @@ fun AddTransportationRecurringConsumptionScreen( } val initialDistance = if(initialValues?.distance != null){ - "${UnitUtils.getConvertedDistance(distanceInKm = initialValues.distance, locale = configuration.locales[0], decimals = 1)}" + "${unitService.getConvertedDistance(configuration, distanceInKm = initialValues.distance, decimals = 1)}" } else { "" } @@ -97,7 +99,7 @@ fun AddTransportationRecurringConsumptionScreen( timeOfTravel.timeInMillis = startOfTravelAsLong.value val distanceValue = distance.value.replace(",", ".").toDoubleOrNull() - val distanceValueKm = UnitUtils.getDistanceValueMetric(distanceValue ?: 0.0 , configuration.locales[0]) + val distanceValueKm = unitService.getCalculatedDistanceValueForUnit(configuration, distanceValue ?: 0.0 ) return when(transportationSection.value){ TransportationTypeSection.CARS_AND_MOTORCYCLES -> { @@ -179,7 +181,7 @@ fun AddTransportationRecurringConsumptionScreen( calendar.timeInMillis = startOfTravelAsLong.value Text( - text = CalendarUtils.toDateString(calendar, "HH:mm"), + text = CalendarUtils.toDateString(calendar, unitService.getTimeFormat(configuration)), style = TextStyle( color = MaterialTheme.colorScheme.onSecondary, fontSize = 15.sp, @@ -331,7 +333,7 @@ fun AddTransportationRecurringConsumptionScreen( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Done), trailingIcon = { - Text(modifier = Modifier.padding(end = 32.dp), text = UnitUtils.getDistanceUnit(configuration.locales[0])) + Text(modifier = Modifier.padding(end = 32.dp), text = unitService.getDistanceUnit(configuration)) } ) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/photovoltaic/PhotovoltaicCalculatorScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/photovoltaic/PhotovoltaicCalculatorScreen.kt index 69a55fa..05087af 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/photovoltaic/PhotovoltaicCalculatorScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/photovoltaic/PhotovoltaicCalculatorScreen.kt @@ -7,13 +7,10 @@ import androidx.compose.foundation.text.ClickableText import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource @@ -27,11 +24,9 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.google.common.io.Files.append import eu.inscico.aurora_app.R import eu.inscico.aurora_app.model.photovoltaics.PhotovoltaicInvestmentResult -import eu.inscico.aurora_app.services.firebase.CountriesService -import eu.inscico.aurora_app.services.pvgis.PVGISAPIService +import eu.inscico.aurora_app.services.shared.UnitService import eu.inscico.aurora_app.services.shared.UserFeedbackService import eu.inscico.aurora_app.ui.components.AppBar import eu.inscico.aurora_app.ui.components.container.ScrollableContent @@ -43,13 +38,13 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.koin.androidx.compose.get import org.koin.androidx.compose.koinViewModel -import java.util.* @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) @Composable fun PhotovoltaicCalculatorScreen( viewModel: PhotovoltaicCalculatorViewModel = koinViewModel(), - userFeedbackService: UserFeedbackService = get() + userFeedbackService: UserFeedbackService = get(), + unitService: UnitService = get() ) { val keyboardController = LocalSoftwareKeyboardController.current @@ -77,7 +72,7 @@ fun PhotovoltaicCalculatorScreen( ScrollableContent(background = MaterialTheme.colorScheme.background) { val countryCurrency = userCountry.value?.currencyCode ?: "EUR" - val currencySymbol = UnitUtils.getCurrencyUnitByLocale(countryCurrency) + val currencySymbol = unitService.getCurrencyUnitByLocale(countryCurrency) val result = investmentResultLive.value if (result != null) { diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/SettingsScreen.kt index f619431..4896657 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/SettingsScreen.kt @@ -133,6 +133,17 @@ fun SettingsScreen( Divider() + ActionEntry( + title = stringResource(id = R.string.settings_profile_select_region_title), + iconRes = R.drawable.outline_public_24, + isNavigation = true, + callback = { + navigationService.toSelectRegion() + } + ) + + Divider() + if (viewModel.userSignInType == UserSignInType.EMAIL) { ActionEntry( title = stringResource(id = R.string.settings_profile_change_email_title), diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/ElectricityBillNotificationScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/ElectricityBillNotificationScreen.kt index c9f2b22..5cfd2d6 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/ElectricityBillNotificationScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/ElectricityBillNotificationScreen.kt @@ -93,7 +93,7 @@ fun ElectricityBillNotificationScreen( val reminder = notificationService.electricityReminder - ReminderSelector(reminder) { + ReminderSelector(reminderTime = reminder) { //notificationReminder.value = it viewModel.updateElectricityReminder(it) viewModel.updateNotificationAlarm( diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/HeatingBillNotificationScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/HeatingBillNotificationScreen.kt index 0c37eff..22e153f 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/HeatingBillNotificationScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/HeatingBillNotificationScreen.kt @@ -97,7 +97,7 @@ fun HeatingBillNotificationScreen( if(enabledSwitch.value){ val reminder = notificationService.heatingReminder - ReminderSelector(reminder){ + ReminderSelector(reminderTime = reminder){ //notificationReminder.value = it viewModel.updateHeatingReminder(it) viewModel.updateNotificationAlarm(enabledSwitch.value, ConsumptionType.HEATING) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/MobilityNotificationScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/MobilityNotificationScreen.kt index 6a5c26c..b686b20 100644 --- a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/MobilityNotificationScreen.kt +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/notifications/MobilityNotificationScreen.kt @@ -97,7 +97,7 @@ fun MobilityNotificationScreen( if(enabledSwitch.value){ val reminder = notificationService.mobilityReminder - ReminderSelector(reminder){ + ReminderSelector(reminderTime = reminder){ //notificationReminder.value = it viewModel.updateMobilityReminder(it) viewModel.updateNotificationAlarm(enabledSwitch.value, ConsumptionType.TRANSPORTATION) diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionScreen.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionScreen.kt new file mode 100644 index 0000000..b9226c4 --- /dev/null +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionScreen.kt @@ -0,0 +1,126 @@ +package eu.inscico.aurora_app.ui.screens.settings.profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import eu.inscico.aurora_app.R +import eu.inscico.aurora_app.model.consumptions.ElectricitySource +import eu.inscico.aurora_app.model.consumptions.ElectricitySource.Companion.getDisplayName +import eu.inscico.aurora_app.model.user.RegionEnum +import eu.inscico.aurora_app.model.user.RegionEnum.Companion.getDisplayName +import eu.inscico.aurora_app.services.navigation.NavigationService +import eu.inscico.aurora_app.services.shared.UserFeedbackService +import eu.inscico.aurora_app.ui.components.AppBar +import eu.inscico.aurora_app.ui.components.forms.SpinnerFormEntry +import eu.inscico.aurora_app.ui.components.forms.SpinnerItem +import org.koin.androidx.compose.get +import org.koin.androidx.compose.koinViewModel + +@Composable +fun SelectRegionScreen( + viewModel: SelectRegionViewModel = koinViewModel(), + navigationService: NavigationService = get(), + userFeedbackService: UserFeedbackService = get() +) { + + val context = LocalContext.current + + val isSaveValid = remember { + mutableStateOf(false) + } + + val selectedRegion = remember { + mutableStateOf(viewModel.getSavedRegion(context)) + } + + val buttonColor = if (isSaveValid.value) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.onSurfaceVariant + } + + Column( + Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + ) { + + AppBar( + title = stringResource(id = R.string.settings_profile_select_region_title), + hasBackNavigation = true, + backNavigationCallback = { + navigationService.navControllerTabSettings?.popBackStack() + } + ) + + Column(Modifier.verticalScroll(rememberScrollState())) { + + Spacer(modifier = Modifier.height(8.dp)) + + Column( + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .clip(shape = RoundedCornerShape(16.dp)), + horizontalAlignment = Alignment.CenterHorizontally + ) { + + Spacer(Modifier.height(32.dp)) + + val allRegionSpinnerItems = viewModel.allSelectableRegions.map { + SpinnerItem.Entry(name = it.getDisplayName(context), data = it) + } + + val selectedEntry = SpinnerItem.Entry( + name = selectedRegion.value.getDisplayName(context), + data = selectedRegion.value + ) + + SpinnerFormEntry( + title = stringResource(id = R.string.settings_profile_select_region_title), + selectedEntry = selectedEntry, + allEntries = allRegionSpinnerItems, + callback = { item, _ -> + selectedRegion.value = item.data as RegionEnum + isSaveValid.value = selectedRegion.value != viewModel.getSavedRegion(context) + } + ) + + Spacer(Modifier.height(32.dp)) + + Button( + modifier = Modifier + .padding(horizontal = 32.dp) + .fillMaxWidth(), + enabled = isSaveValid.value, + shape = RoundedCornerShape(32.dp), + onClick = { + viewModel.saveRegion(context, selectedRegion.value) + navigationService.navControllerTabSettings?.popBackStack() + }, + colors = ButtonDefaults.buttonColors(containerColor = buttonColor) + ) { + Text( + text = stringResource(id = R.string.settings_edit_profile_submit_button_title), + style = MaterialTheme.typography.labelLarge, + color = Color.White + ) + } + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionViewModel.kt b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionViewModel.kt new file mode 100644 index 0000000..6a2277e --- /dev/null +++ b/app/src/main/java/eu/inscico/aurora_app/ui/screens/settings/profile/SelectRegionViewModel.kt @@ -0,0 +1,22 @@ +package eu.inscico.aurora_app.ui.screens.settings.profile + +import android.content.Context +import androidx.lifecycle.ViewModel +import eu.inscico.aurora_app.model.consumptions.HeatingFuelType +import eu.inscico.aurora_app.model.user.RegionEnum +import eu.inscico.aurora_app.utils.PrefsUtils + +class SelectRegionViewModel: ViewModel() { + + val allSelectableRegions = RegionEnum.getRegionsList() + + fun saveRegion(context: Context, region: RegionEnum){ + PrefsUtils.save(context, "auroraAppRegion", RegionEnum.parseRegionToString(region)) + } + + fun getSavedRegion(context: Context): RegionEnum { + val regionString = PrefsUtils.get(context, "auroraAppRegion", RegionEnum.parseRegionToString(RegionEnum.SYSTEM)) + return RegionEnum.parseStringToRegion(regionString) + } + +} \ No newline at end of file diff --git a/app/src/main/java/eu/inscico/aurora_app/utils/UnitUtils.kt b/app/src/main/java/eu/inscico/aurora_app/utils/UnitUtils.kt deleted file mode 100644 index 14916fc..0000000 --- a/app/src/main/java/eu/inscico/aurora_app/utils/UnitUtils.kt +++ /dev/null @@ -1,144 +0,0 @@ -package eu.inscico.aurora_app.utils - -import android.content.res.Configuration -import android.icu.util.LocaleData -import android.icu.util.ULocale -import java.util.* - -object UnitUtils { - - - // region: Distance - // --------------------------------------------------------------------------------------------- - - fun getSystemDistanceUnit(config: Configuration): String { - return getDistanceUnit(locale = config.locales[0]) - } - - fun getDistanceUnit(locale: Locale): String { - - val measurementSystem = LocaleData.getMeasurementSystem(ULocale.forLocale(locale)) - return when (measurementSystem) { - LocaleData.MeasurementSystem.SI -> "km" - LocaleData.MeasurementSystem.UK -> "mi" - LocaleData.MeasurementSystem.US -> "mi" - else -> "km" - } - } - - fun getConvertedDistance(distanceInKm: Double?, locale: Locale, decimals: Int? = 0): Double { - - if (distanceInKm == null || distanceInKm == 0.0) { - return 0.0 - } - - val measurementSystem = LocaleData.getMeasurementSystem(ULocale.forLocale(locale)) - return when (measurementSystem) { - LocaleData.MeasurementSystem.UK, - LocaleData.MeasurementSystem.US -> { - val formattedDistance = if(decimals != null){ - String.format("%.${decimals}f", distanceInKm * 0.62137).replace(",", ".").toDouble() - } else { - distanceInKm * 0.62137 - } - formattedDistance - } - else -> { - val formattedDistance = if(decimals != null){ - String.format("%.${decimals}f", distanceInKm).replace(",", ".").toDouble() - } else { - distanceInKm - } - formattedDistance - } - } - } - - fun getConvertedDistanceWithUnit(distanceInKm: Double?, locale: Locale, decimals: Int? = 0): String { - return "${getConvertedDistance(distanceInKm, locale, decimals)} ${getDistanceUnit(locale)}" - } - - fun getDistanceValueMetric(distance: Double, locale: Locale): Double { - val measurementSystem = LocaleData.getMeasurementSystem(ULocale.forLocale(locale)) - return when (measurementSystem) { - LocaleData.MeasurementSystem.UK, - LocaleData.MeasurementSystem.US -> { - distance * 1.609344 - } - else -> distance - } - } - - // endregion - - - // region: Weight - // --------------------------------------------------------------------------------------------- - - fun getSystemWeightUnit(config: Configuration): String { - return getWeightUnit(locale = config.locales[0]) - } - - fun getWeightUnit(locale: Locale): String { - - val measurementSystem = LocaleData.getMeasurementSystem(ULocale.forLocale(locale)) - return when (measurementSystem) { - LocaleData.MeasurementSystem.SI -> "kg" - LocaleData.MeasurementSystem.UK -> "lbs" - LocaleData.MeasurementSystem.US -> "lbs" - else -> "kg" - } - } - - fun getConvertedWeight(weightInKg: Double?, locale: Locale, decimals: Int? = null): Double { - - if (weightInKg == null || weightInKg == 0.0) { - return 0.0 - } - - val measurementSystem = LocaleData.getMeasurementSystem(ULocale.forLocale(locale)) - return when (measurementSystem) { - LocaleData.MeasurementSystem.UK, - LocaleData.MeasurementSystem.US -> { - val formattedWeight = if(decimals != null){ - String.format("%.${decimals}f", weightInKg * 2.2046).replace(",", ".").toDouble() - } else { - weightInKg * 2.2046 - } - formattedWeight - } - else -> { - val formattedWeight = if(decimals != null){ - String.format("%.${decimals}f", weightInKg).replace(",", ".").toDouble() - } else { - weightInKg - } - formattedWeight - } - } - } - - fun getConvertedWeightWithUnit(weightInKg: Double?, locale: Locale, decimals: Int? = 0): String { - return "${getConvertedWeight(weightInKg, locale, decimals)} ${getWeightUnit(locale)}" - } - - // endregion - - -// region: Currency -// --------------------------------------------------------------------------------------------- - - fun getSystemCurrencyUnit(config: Configuration): String { - val currentLocale = config.locales[0] - val currencySymbol = Currency.getInstance(currentLocale).symbol - return currencySymbol - } - - fun getCurrencyUnitByLocale(locale: String): String { - val currency: Currency = Currency.getInstance(locale) - return currency.symbol - } - -// endregion - -} \ No newline at end of file diff --git a/app/src/main/res/drawable/outline_public_24.xml b/app/src/main/res/drawable/outline_public_24.xml new file mode 100644 index 0000000..a6daa6e --- /dev/null +++ b/app/src/main/res/drawable/outline_public_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2c4a3f3..9422054 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -222,7 +222,15 @@ Settings Account - "Edit profile " + Edit profile + Select region + Germany + Portugal + Slovenia + Denmark + United Kingdom + USA + System Change password Change email Logout