diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/AbstractUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/AbstractUnit.kt index c4358942..5a106148 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/AbstractUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/AbstractUnit.kt @@ -32,6 +32,17 @@ interface AbstractUnit { val isFavorite: Boolean val pairId: String? val counter: Int + + fun clone( + id: String = this.id, + basicUnit: BigDecimal = this.basicUnit, + group: UnitGroup = this.group, + displayName: Int = this.displayName, + shortName: Int = this.shortName, + isFavorite: Boolean = this.isFavorite, + pairId: String? = this.pairId, + counter: Int = this.counter, + ): AbstractUnit } fun Sequence.filterByLev(stringA: String, context: Context): Sequence { diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelBackward.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelBackward.kt index 90ffb3df..91c68396 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelBackward.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelBackward.kt @@ -53,4 +53,24 @@ data class FuelBackward( else -> BigDecimal.ZERO } } + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): FuelBackward = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelForward.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelForward.kt index f1a87117..457ecaa9 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelForward.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelForward.kt @@ -52,4 +52,24 @@ data class FuelForward( else -> BigDecimal.ZERO } } + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): FuelForward = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt index fb3506be..5c4fa0e0 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NormalUnit.kt @@ -43,4 +43,24 @@ data class NormalUnit( .multiply(value) .div(unitTo.basicUnit) } + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): NormalUnit = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NumberBaseUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NumberBaseUnit.kt index 2cc281eb..344f606f 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NumberBaseUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/NumberBaseUnit.kt @@ -34,4 +34,24 @@ data class NumberBaseUnit( fun convert(toBase: NumberBaseUnit, input: String): String { return input.toBigInteger(basicUnit.intValueExact()).toString(toBase.basicUnit.intValueExact()) } + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): NumberBaseUnit = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt index ffd2c693..74851bc6 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/ReverseUnit.kt @@ -41,4 +41,24 @@ data class ReverseUnit( .div(this.basicUnit) .multiply(value) } + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): ReverseUnit = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) } diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt new file mode 100644 index 00000000..b5944407 --- /dev/null +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/TemperatureUnit.kt @@ -0,0 +1,56 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.model.unit + +import com.sadellie.unitto.data.model.UnitGroup +import java.math.BigDecimal + +data class TemperatureUnit( + override val id: String, + override val basicUnit: BigDecimal, + override val group: UnitGroup, + override val displayName: Int, + override val shortName: Int, + override val isFavorite: Boolean = false, + override val pairId: String? = null, + override val counter: Int = 0, + val customConvert: (unitTo: DefaultUnit, value: BigDecimal) -> BigDecimal +): DefaultUnit { + override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal = customConvert(unitTo, value) + + override fun clone( + id: String, + basicUnit: BigDecimal, + group: UnitGroup, + displayName: Int, + shortName: Int, + isFavorite: Boolean, + pairId: String?, + counter: Int, + ): TemperatureUnit = copy( + id = id, + basicUnit = basicUnit, + group = group, + displayName = displayName, + shortName = shortName, + isFavorite = isFavorite, + pairId = pairId, + counter = counter, + ) +} diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt index b79063c3..642434c8 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/UnitsRepository.kt @@ -27,10 +27,6 @@ import com.sadellie.unitto.data.database.UnitsEntity import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.unit.AbstractUnit -import com.sadellie.unitto.data.model.unit.FuelBackward -import com.sadellie.unitto.data.model.unit.FuelForward -import com.sadellie.unitto.data.model.unit.NormalUnit -import com.sadellie.unitto.data.model.unit.NumberBaseUnit import com.sadellie.unitto.data.model.unit.ReverseUnit import com.sadellie.unitto.data.model.unit.filterByLev import com.sadellie.unitto.data.units.collections.accelerationCollection @@ -113,40 +109,13 @@ class UnitsRepository @Inject constructor( .mapLatest { basedList -> basedList.forEach { based -> // Have to use a copy so that composable can detect changes - val updatedUnit = when (val foundUnit = getById(based.unitId)) { - is NormalUnit -> foundUnit.copy( + val updatedUnit = getById(based.unitId) + .clone( isFavorite = based.isFavorite, counter = based.frequency, pairId = based.pairedUnitId ) - is NumberBaseUnit -> foundUnit.copy( - isFavorite = based.isFavorite, - counter = based.frequency, - pairId = based.pairedUnitId - ) - - is ReverseUnit -> foundUnit.copy( - isFavorite = based.isFavorite, - counter = based.frequency, - pairId = based.pairedUnitId - ) - - is FuelForward -> foundUnit.copy( - isFavorite = based.isFavorite, - counter = based.frequency, - pairId = based.pairedUnitId - ) - - is FuelBackward -> foundUnit.copy( - isFavorite = based.isFavorite, - counter = based.frequency, - pairId = based.pairedUnitId - ) - - else -> return@forEach - } - myUnits.update { units -> units.replace(updatedUnit) { it.id == updatedUnit.id } } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt index ae5ef8c2..99588e63 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt @@ -22,102 +22,88 @@ import com.sadellie.unitto.core.base.MAX_PRECISION import com.sadellie.unitto.core.base.R import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.unit.AbstractUnit -import com.sadellie.unitto.data.model.unit.DefaultUnit +import com.sadellie.unitto.data.model.unit.TemperatureUnit import com.sadellie.unitto.data.units.MyUnitIDS import java.math.BigDecimal import java.math.RoundingMode internal val temperatureCollection: List by lazy { - listOf(Celsius, Fahrenheit, Kelvin) -} - -private data object Celsius : DefaultUnit { - override val id: String = MyUnitIDS.celsius - override val basicUnit: BigDecimal = BigDecimal.ONE - override val group: UnitGroup = UnitGroup.TEMPERATURE - override val displayName: Int = R.string.celsius - override val shortName: Int = R.string.celsius_short - override val isFavorite: Boolean = false - override val pairId: String? = null - override val counter: Int = 0 - - override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal { - return when (unitTo.id) { - MyUnitIDS.fahrenheit -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .times(BigDecimal.valueOf(1.8)) - .plus(BigDecimal(32)) - } - - MyUnitIDS.kelvin -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .plus(BigDecimal.valueOf(273.15)) - } - - else -> value - } - } -} - -private data object Fahrenheit : DefaultUnit { - override val id: String = MyUnitIDS.fahrenheit - override val basicUnit: BigDecimal = BigDecimal.ONE - override val group: UnitGroup = UnitGroup.TEMPERATURE - override val displayName: Int = R.string.fahrenheit - override val shortName: Int = R.string.fahrenheit_short - override val isFavorite: Boolean = false - override val pairId: String? = null - override val counter: Int = 0 - - override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal { - return when (unitTo.id) { - MyUnitIDS.celsius -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(32)) - .times(BigDecimal(5)) - .div(BigDecimal(9)) - } - MyUnitIDS.kelvin -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(32)) - .times(BigDecimal(5)) - .div(BigDecimal(9)) - .add(BigDecimal.valueOf(273.15)) - } - else -> value - } - } -} - -private data object Kelvin : DefaultUnit { - override val id: String = MyUnitIDS.kelvin - override val basicUnit: BigDecimal = BigDecimal.ONE - override val group: UnitGroup = UnitGroup.TEMPERATURE - override val displayName: Int = R.string.kelvin - override val shortName: Int = R.string.kelvin_short - override val isFavorite: Boolean = false - override val pairId: String? = null - override val counter: Int = 0 - - override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal { - return when (unitTo.id) { - MyUnitIDS.celsius -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal(273.15)) - } - MyUnitIDS.fahrenheit -> { - value - .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) - .minus(BigDecimal.valueOf(273.15)) - .times(BigDecimal.valueOf(1.8)) - .plus(BigDecimal(32)) - } - else -> value - } - } + listOf( + TemperatureUnit( + id = MyUnitIDS.celsius, + basicUnit = BigDecimal.ONE, + group = UnitGroup.TEMPERATURE, + displayName = R.string.celsius, + shortName = R.string.celsius_short, + customConvert = { unitTo, value -> + when (unitTo.id) { + MyUnitIDS.fahrenheit -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .times(BigDecimal.valueOf(1.8)) + .plus(BigDecimal(32)) + } + + MyUnitIDS.kelvin -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .plus(BigDecimal.valueOf(273.15)) + } + + else -> value + } + } + ), + TemperatureUnit( + id = MyUnitIDS.fahrenheit, + basicUnit = BigDecimal.ONE, + group = UnitGroup.TEMPERATURE, + displayName = R.string.fahrenheit, + shortName = R.string.fahrenheit_short, + customConvert = { unitTo, value -> + when (unitTo.id) { + MyUnitIDS.celsius -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .minus(BigDecimal(32)) + .times(BigDecimal(5)) + .div(BigDecimal(9)) + } + MyUnitIDS.kelvin -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .minus(BigDecimal(32)) + .times(BigDecimal(5)) + .div(BigDecimal(9)) + .add(BigDecimal.valueOf(273.15)) + } + else -> value + } + } + ), + TemperatureUnit( + id = MyUnitIDS.kelvin, + basicUnit = BigDecimal.ONE, + group = UnitGroup.TEMPERATURE, + displayName = R.string.kelvin, + shortName = R.string.kelvin_short, + customConvert = { unitTo, value -> + when (unitTo.id) { + MyUnitIDS.celsius -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .minus(BigDecimal(273.15)) + } + MyUnitIDS.fahrenheit -> { + value + .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) + .minus(BigDecimal.valueOf(273.15)) + .times(BigDecimal.valueOf(1.8)) + .plus(BigDecimal(32)) + } + else -> value + } + } + ), + ) }