From 8bb28dae7b4aaa450ce4c5d61a020253c9635105 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Tue, 28 Mar 2023 17:54:20 +0300 Subject: [PATCH] Added Flow rate (#29) --- core/base/src/main/res/values/strings.xml | 46 +++++++++++++++ .../unitto/data/model/FlowRateUnit.kt | 57 +++++++++++++++++++ .../sadellie/unitto/data/model/UnitGroup.kt | 1 + .../unitto/data/units/AllUnitsRepository.kt | 4 +- .../sadellie/unitto/data/units/MyUnitIDS.kt | 23 ++++++++ .../unitto/data/units/collections/FlowRate.kt | 52 +++++++++++++++++ .../unitto/data/units/AllUnitsTest.kt | 25 ++++++++ 7 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 data/model/src/main/java/com/sadellie/unitto/data/model/FlowRateUnit.kt create mode 100644 data/units/src/main/java/com/sadellie/unitto/data/units/collections/FlowRate.kt diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index 5f0d9e45..f459056f 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -1117,6 +1117,51 @@ Pound-force inch lbf*in + + Liter/hour + L/h + Liter/minute + L/m + Liter/second + L/s + Milliliter/hour + mL/h + Milliliter/minute + mL/m + Milliliter/second + mL/s + Cubic Meter/hour + m3/h + Cubic Meter/minute + m3/m + Cubic Meter/second + m3/s + Cubic Millimeter/hour + mm3/h + Cubic Millimeter/minute + mm3/m + Cubic Millimeter/second + mm3/s + Cubic Foot/hour + ft3/h + Cubic Foot/minute + ft3/m + Cubic Foot/second + ft3/s + Gallon/hour (U.S.) + gal/h + Gallon/minute (U.S.) + gal/m + Gallon/second (U.S.) + gal/s + Gallon/hour (Imperial) + gal/h + Gallon/minute (Imperial) + gal/m + Gallon/second (Imperial) + gal/s + + Length Time @@ -1139,6 +1184,7 @@ Prefix Force Torque + Flow Convert from diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/FlowRateUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/FlowRateUnit.kt new file mode 100644 index 00000000..8fae25ea --- /dev/null +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/FlowRateUnit.kt @@ -0,0 +1,57 @@ +/* + * 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 + +import androidx.annotation.StringRes +import com.sadellie.unitto.core.base.MAX_PRECISION +import com.sadellie.unitto.data.common.setMinimumRequiredScale +import com.sadellie.unitto.data.common.trimZeros +import java.math.BigDecimal + +/** + * Same as [MyUnit], but conversion formula is different. + * + * @see MyUnit + */ +class FlowRateUnit( + unitId: String, + basicUnit: BigDecimal, + group: UnitGroup, + @StringRes displayName: Int, + @StringRes shortName: Int, +) : AbstractUnit( + unitId = unitId, + displayName = displayName, + shortName = shortName, + basicUnit = basicUnit, + group = group, +) { + override fun convert( + unitTo: AbstractUnit, + value: BigDecimal, + scale: Int + ): BigDecimal { + return unitTo.basicUnit + .setScale(MAX_PRECISION) + .div(this.basicUnit) + .multiply(value) + .setMinimumRequiredScale(scale) + .trimZeros() + } +} diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt index ebc7000f..4fe452a9 100644 --- a/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt @@ -52,4 +52,5 @@ enum class UnitGroup( PREFIX(res = R.string.prefix), FORCE(res = R.string.force), TORQUE(res = R.string.torque), + FLOW_RATE(res = R.string.flow_rate), } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt index d1df129b..0af1420b 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt @@ -32,6 +32,7 @@ import com.sadellie.unitto.data.units.collections.dataCollection import com.sadellie.unitto.data.units.collections.dataTransferCollection import com.sadellie.unitto.data.units.collections.electrostaticCapacitance import com.sadellie.unitto.data.units.collections.energyCollection +import com.sadellie.unitto.data.units.collections.flowRateCollection import com.sadellie.unitto.data.units.collections.fluxCollection import com.sadellie.unitto.data.units.collections.forceCollection import com.sadellie.unitto.data.units.collections.lengthCollection @@ -86,7 +87,8 @@ class AllUnitsRepository @Inject constructor() { UnitGroup.ELECTROSTATIC_CAPACITANCE to electrostaticCapacitance, UnitGroup.PREFIX to prefixCollection, UnitGroup.FORCE to forceCollection, - UnitGroup.TORQUE to torqueCollection + UnitGroup.TORQUE to torqueCollection, + UnitGroup.FLOW_RATE to flowRateCollection, ) } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnitIDS.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnitIDS.kt index cd9e5ed4..0b3e5f39 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnitIDS.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnitIDS.kt @@ -593,4 +593,27 @@ object MyUnitIDS { const val ounce_force_inch = "ounce_force_inch" const val pound_force_foot = "pound_force_foot" const val pound_force_inch = "pound_force_inch" + + // FLOW RATE + const val liter_per_hour = "liter_per_hour" + const val liter_per_minute = "liter_per_minute" + const val liter_per_second = "liter_per_second" + const val milliliter_per_hour = "milliliter_per_hour" + const val milliliter_per_minute = "milliliter_per_minute" + const val milliliter_per_second = "milliliter_per_second" + const val cubic_meter_per_hour = "cubic_meter_per_hour" + const val cubic_meter_per_minute = "cubic_meter_per_minute" + const val cubic_meter_per_second = "cubic_meter_per_second" + const val cubic_millimeter_per_hour = "cubic_millimeter_per_hour" + const val cubic_millimeter_per_minute = "cubic_millimeter_per_minute" + const val cubic_millimeter_per_second = "cubic_millimeter_per_second" + const val cubic_foot_per_hour = "cubic_foot_per_hour" + const val cubic_foot_per_minute = "cubic_foot_per_minute" + const val cubic_foot_per_second = "cubic_foot_per_second" + const val gallons_per_hour_us = "gallons_per_hour_us" + const val gallons_per_minute_us = "gallons_per_minute_us" + const val gallons_per_second_us = "gallons_per_second_us" + const val gallons_per_hour_imperial = "gallons_per_hour_imperial" + const val gallons_per_minute_imperial = "gallons_per_minute_imperial" + const val gallons_per_second_imperial = "gallons_per_second_imperial" } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FlowRate.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FlowRate.kt new file mode 100644 index 00000000..e7e3951a --- /dev/null +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FlowRate.kt @@ -0,0 +1,52 @@ +/* + * 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.units.collections + +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.FlowRateUnit +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.units.MyUnitIDS +import com.sadellie.unitto.data.units.R +import java.math.BigDecimal + +val flowRateCollection: List by lazy { + listOf( + FlowRateUnit(MyUnitIDS.liter_per_hour, BigDecimal.valueOf(3600000), UnitGroup.FLOW_RATE, R.string.liter_per_hour, R.string.liter_per_hour_short), + FlowRateUnit(MyUnitIDS.liter_per_minute, BigDecimal.valueOf(60000), UnitGroup.FLOW_RATE, R.string.liter_per_minute, R.string.liter_per_minute_short), + FlowRateUnit(MyUnitIDS.liter_per_second, BigDecimal.valueOf(1000), UnitGroup.FLOW_RATE, R.string.liter_per_second, R.string.liter_per_second_short), + FlowRateUnit(MyUnitIDS.milliliter_per_hour, BigDecimal.valueOf(3600000000), UnitGroup.FLOW_RATE, R.string.milliliter_per_hour, R.string.milliliter_per_hour_short), + FlowRateUnit(MyUnitIDS.milliliter_per_minute, BigDecimal.valueOf(60000000), UnitGroup.FLOW_RATE, R.string.milliliter_per_minute, R.string.milliliter_per_minute_short), + FlowRateUnit(MyUnitIDS.milliliter_per_second, BigDecimal.valueOf(1000000), UnitGroup.FLOW_RATE, R.string.milliliter_per_second, R.string.milliliter_per_second_short), + FlowRateUnit(MyUnitIDS.cubic_meter_per_hour, BigDecimal.valueOf(3600), UnitGroup.FLOW_RATE, R.string.cubic_meter_per_hour, R.string.cubic_meter_per_hour_short), + FlowRateUnit(MyUnitIDS.cubic_meter_per_minute, BigDecimal.valueOf(60), UnitGroup.FLOW_RATE, R.string.cubic_meter_per_minute, R.string.cubic_meter_per_minute_short), + FlowRateUnit(MyUnitIDS.cubic_meter_per_second, BigDecimal.valueOf(1), UnitGroup.FLOW_RATE, R.string.cubic_meter_per_second, R.string.cubic_meter_per_second_short), + FlowRateUnit(MyUnitIDS.cubic_millimeter_per_hour, BigDecimal.valueOf(3600000000000), UnitGroup.FLOW_RATE, R.string.cubic_millimeter_per_hour, R.string.cubic_millimeter_per_hour_short), + FlowRateUnit(MyUnitIDS.cubic_millimeter_per_minute, BigDecimal.valueOf(60000000000), UnitGroup.FLOW_RATE, R.string.cubic_millimeter_per_minute, R.string.cubic_millimeter_per_minute_short), + FlowRateUnit(MyUnitIDS.cubic_millimeter_per_second, BigDecimal.valueOf(1000000000), UnitGroup.FLOW_RATE, R.string.cubic_millimeter_per_second, R.string.cubic_millimeter_per_second_short), + FlowRateUnit(MyUnitIDS.cubic_foot_per_hour, BigDecimal.valueOf(127132.80019736), UnitGroup.FLOW_RATE, R.string.cubic_foot_per_hour, R.string.cubic_foot_per_hour_short), + FlowRateUnit(MyUnitIDS.cubic_foot_per_minute, BigDecimal.valueOf(2118.8800032893), UnitGroup.FLOW_RATE, R.string.cubic_foot_per_minute, R.string.cubic_foot_per_minute_short), + FlowRateUnit(MyUnitIDS.cubic_foot_per_second, BigDecimal.valueOf(35.314666721489), UnitGroup.FLOW_RATE, R.string.cubic_foot_per_second, R.string.cubic_foot_per_second_short), + FlowRateUnit(MyUnitIDS.gallons_per_hour_us, BigDecimal.valueOf(951019.38848933), UnitGroup.FLOW_RATE, R.string.gallon_per_hour_us, R.string.gallon_per_hour_us_short), + FlowRateUnit(MyUnitIDS.gallons_per_minute_us, BigDecimal.valueOf(15850.323141489), UnitGroup.FLOW_RATE, R.string.gallon_per_minute_us, R.string.gallon_per_minute_us_short), + FlowRateUnit(MyUnitIDS.gallons_per_second_us, BigDecimal.valueOf(264.17205235815), UnitGroup.FLOW_RATE, R.string.gallon_per_second_us, R.string.gallon_per_second_us_short), + FlowRateUnit(MyUnitIDS.gallons_per_hour_imperial, BigDecimal.valueOf(791889.29387672), UnitGroup.FLOW_RATE, R.string.gallon_per_hour_imperial, R.string.gallon_per_hour_imperial_short), + FlowRateUnit(MyUnitIDS.gallons_per_minute_imperial, BigDecimal.valueOf(13198.154897945), UnitGroup.FLOW_RATE, R.string.gallon_per_minute_imperial, R.string.gallon_per_minute_imperial_short), + FlowRateUnit(MyUnitIDS.gallons_per_second_imperial, BigDecimal.valueOf(219.96924829909), UnitGroup.FLOW_RATE, R.string.gallon_per_second_imperial, R.string.gallon_per_second_imperial_short), + ) +} diff --git a/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt b/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt index 3bd3347e..f2f048a1 100644 --- a/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt +++ b/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt @@ -460,6 +460,31 @@ class AllUnitsTest { pound_force_inch.checkWith(ounce_force_foot, "2134", "2845.33337") } + @Test + fun testFlowRate() = testWithUnits { + liter_per_hour.checkWith(milliliter_per_minute, "312", "5200") + liter_per_minute.checkWith(cubic_foot_per_minute, "312", "11.01818") + liter_per_second.checkWith(cubic_meter_per_minute, "312", "18.72") + milliliter_per_hour.checkWith(liter_per_hour, "312", "0.312") + milliliter_per_minute.checkWith(liter_per_second, "312", "0.0052") + milliliter_per_second.checkWith(cubic_foot_per_minute, "312", "0.66109") + cubic_meter_per_hour.checkWith(cubic_foot_per_hour, "312", "11018.17602") + cubic_meter_per_minute.checkWith(liter_per_minute, "312", "312000") + cubic_meter_per_second.checkWith(milliliter_per_minute, "312", "18720000000") + cubic_millimeter_per_hour.checkWith(milliliter_per_minute, "312", "0.0052") + cubic_millimeter_per_minute.checkWith(liter_per_minute, "312", "0.00031") + cubic_millimeter_per_second.checkWith(cubic_millimeter_per_minute, "312", "18720") + cubic_foot_per_hour.checkWith(milliliter_per_hour, "312", "8834856.1367") + cubic_foot_per_minute.checkWith(cubic_meter_per_hour, "312", "530.09137") + cubic_foot_per_second.checkWith(cubic_meter_per_second, "312", "8.83486") + gallons_per_hour_us.checkWith(liter_per_hour, "312", "1181.04848") + gallons_per_minute_us.checkWith(gallons_per_hour_imperial, "312", "15587.66074") + gallons_per_second_us.checkWith(cubic_meter_per_minute, "312", "70.86291") + gallons_per_hour_imperial.checkWith(liter_per_second, "312", "0.39399") + gallons_per_minute_imperial.checkWith(cubic_foot_per_minute, "312", "50.08962") + gallons_per_second_imperial.checkWith(cubic_meter_per_minute, "312", "85.1028") + } + private fun String.checkWith(checkingId: String, value: String, expected: String) { val unitFrom = allUnitsRepository.getById(this) val unitTo = allUnitsRepository.getById(checkingId)