diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml
index 3b948012..690b9ba7 100644
--- a/core/base/src/main/res/values/strings.xml
+++ b/core/base/src/main/res/values/strings.xml
@@ -1393,4 +1393,25 @@ Used in this dialog window. Should be short -->
Change the app language
System font
Use system font for texts in app
+ Fuel
+ Kilometer per liter
+ km/L
+ Liter per kilometer
+ L/km
+ Liter per 100 Kilometer
+ L/100 km
+ Mile per gallon (UK)
+ mpg (UK)
+ Mile per gallon (US)
+ mpg (US)
+ Mile (US) per liter
+ mi/L (US)
+ Gallon per mile (US)
+ gal/mi (US)
+ Gallon per mile (UK)
+ gal/mi (UK)
+ Gallon per 100 mile (US)
+ gal/100 mi (US)
+ Gallon per 100 mile (UK)
+ gal/100 mi (UK)
\ No newline at end of file
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 9d90d44c..aaea287e 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
@@ -55,4 +55,5 @@ enum class UnitGroup(
TORQUE(res = R.string.torque),
FLOW_RATE(res = R.string.flow_rate),
LUMINANCE(res = R.string.luminance),
+ FUEL_CONSUMPTION(res = R.string.fuel_consumption)
}
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
new file mode 100644
index 00000000..90ffb3df
--- /dev/null
+++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelBackward.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.core.base.MAX_PRECISION
+import com.sadellie.unitto.data.model.UnitGroup
+import java.math.BigDecimal
+import java.math.RoundingMode
+
+data class FuelBackward(
+ 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,
+) : DefaultUnit {
+ override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
+ // Avoid division by zero
+ if (unitTo.basicUnit.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO
+
+ return when (unitTo) {
+ is FuelForward -> this
+ .basicUnit
+ .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
+ .div(unitTo.basicUnit)
+ .div(value)
+
+ is FuelBackward -> unitTo
+ .basicUnit
+ .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
+ .div(this.basicUnit)
+ .multiply(value)
+
+ else -> BigDecimal.ZERO
+ }
+ }
+}
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
new file mode 100644
index 00000000..f1a87117
--- /dev/null
+++ b/data/model/src/main/java/com/sadellie/unitto/data/model/unit/FuelForward.kt
@@ -0,0 +1,55 @@
+/*
+ * 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.core.base.MAX_PRECISION
+import com.sadellie.unitto.data.model.UnitGroup
+import java.math.BigDecimal
+import java.math.RoundingMode
+
+data class FuelForward(
+ 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,
+) : DefaultUnit {
+ override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
+ // Avoid division by zero
+ if (unitTo.basicUnit.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO
+
+ return when (unitTo) {
+ is FuelForward -> this
+ .basicUnit
+ .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
+ .div(unitTo.basicUnit).multiply(value)
+
+ is FuelBackward -> unitTo
+ .basicUnit
+ .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
+ .div(this.basicUnit)
+ .div(value)
+
+ else -> BigDecimal.ZERO
+ }
+ }
+}
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 eaeafbc7..f2f3f428 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
@@ -642,4 +642,16 @@ object MyUnitIDS {
const val blondel = "blondel"
const val bril = "bril"
const val skot = "skot"
+
+ // FUEL
+ const val kilometer_per_liter = "kilometer_per_liter"
+ const val liter_per_kilometer = "liter_per_kilometer"
+ const val liter_per_100_kilometer = "liter_per_100_kilometer"
+ const val mile_per_gallon_uk = "mile_per_gallon_uk"
+ const val mile_per_gallon_us = "mile_per_gallon_us"
+ const val mile_us_per_liter = "mile_us_per_liter"
+ const val gallon_us_per_mile = "gallon_us_per_mile"
+ const val gallon_uk_per_mile = "gallon_uk_per_mile"
+ const val gallon_us_per_100_mile = "gallon_us_per_100_mile"
+ const val gallon_uk_per_100_mile = "gallon_uk_per_100_mile"
}
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 96118dd9..0d67ea77 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
@@ -24,6 +24,8 @@ 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
@@ -39,6 +41,7 @@ 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.fuelConsumptionCollection
import com.sadellie.unitto.data.units.collections.lengthCollection
import com.sadellie.unitto.data.units.collections.luminanceCollection
import com.sadellie.unitto.data.units.collections.massCollection
@@ -91,7 +94,8 @@ class UnitsRepository @Inject constructor(
forceCollection +
torqueCollection +
flowRateCollection +
- luminanceCollection
+ luminanceCollection +
+ fuelConsumptionCollection
)
@OptIn(ExperimentalCoroutinesApi::class)
@@ -120,6 +124,16 @@ class UnitsRepository @Inject constructor(
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
}
diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FuelConsumption.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FuelConsumption.kt
new file mode 100644
index 00000000..cfe6ceaa
--- /dev/null
+++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/FuelConsumption.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.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.FuelBackward
+import com.sadellie.unitto.data.model.unit.FuelForward
+import com.sadellie.unitto.data.units.MyUnitIDS
+import java.math.BigDecimal
+
+val fuelConsumptionCollection: List by lazy {
+ listOf(
+ FuelForward(MyUnitIDS.kilometer_per_liter, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.km_per_l, R.string.km_per_l_short),
+ FuelBackward(MyUnitIDS.liter_per_kilometer, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.l_per_km, R.string.l_per_km_short),
+ FuelBackward(MyUnitIDS.liter_per_100_kilometer, BigDecimal.valueOf(100), UnitGroup.FUEL_CONSUMPTION, R.string.l_per_100_km, R.string.l_per_100_km_short),
+ FuelForward(MyUnitIDS.mile_per_gallon_uk, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.mi_per_gallon_uk, R.string.mi_per_gallon_uk_short),
+ FuelForward(MyUnitIDS.mile_per_gallon_us, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.mi_per_gallon_us, R.string.mi_per_gallon_us_short),
+ FuelForward(MyUnitIDS.mile_us_per_liter, BigDecimal.valueOf(1.609344), UnitGroup.FUEL_CONSUMPTION, R.string.mi_us_per_l, R.string.mi_us_per_l_short),
+ FuelBackward(MyUnitIDS.gallon_us_per_mile, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.gallon_us_per_mile, R.string.gallon_us_per_mile_short),
+ FuelBackward(MyUnitIDS.gallon_uk_per_mile, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.gallon_uk_per_mile, R.string.gallon_uk_per_mile_short),
+ FuelBackward(MyUnitIDS.gallon_us_per_100_mile, BigDecimal.valueOf(42.51437075), UnitGroup.FUEL_CONSUMPTION, R.string.gallon_us_per_100_mile, R.string.gallon_us_per_100_mile_short),
+ FuelBackward(MyUnitIDS.gallon_uk_per_100_mile, BigDecimal.valueOf(35.400618996), UnitGroup.FUEL_CONSUMPTION, R.string.gallon_uk_per_100_mile, R.string.gallon_uk_per_100_mile_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 93f0bfea..fac9163b 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
@@ -524,6 +524,20 @@ class AllUnitsTest {
skot.checkWith(lumen_per_square_meter_per_steradian, "6723", "2.14")
}
+ @Test
+ fun testFuelConsumptionCollection() = testWithUnits {
+ kilometer_per_liter.checkWith(gallon_uk_per_mile, "47.45", "0.00746")
+ liter_per_kilometer.checkWith(kilometer_per_liter, "47.45", "0.02107")
+ liter_per_100_kilometer.checkWith(kilometer_per_liter, "47.45", "2.10748")
+ mile_per_gallon_uk.checkWith(mile_per_gallon_us, "47.45", "39.51039")
+ mile_per_gallon_us.checkWith(gallon_us_per_100_mile, "47.45", "2.10748")
+ mile_us_per_liter.checkWith(gallon_uk_per_100_mile, "47.45", "0.46358")
+ gallon_us_per_mile.checkWith(liter_per_100_kilometer, "47.45", "11160.93198")
+ gallon_uk_per_mile.checkWith(kilometer_per_liter, "47.45", "0.00746")
+ gallon_us_per_100_mile.checkWith(gallon_us_per_mile, "47.45", "0.4745")
+ gallon_uk_per_100_mile.checkWith(mile_per_gallon_us, "47.45", "1.75485")
+ }
+
private fun String.checkWith(checkingId: String, value: String, expected: String) {
val unitFrom = allUnitsRepository.getById(this)
val unitTo = allUnitsRepository.getById(checkingId)