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)