Update UnitsRepository

- Refactor Unit classes
- Add grain
- Add pace units

closes #143 #144

squashed commit
This commit is contained in:
Sad Ellie 2024-01-03 19:06:21 +03:00
parent 95b12cf1f8
commit 839954ce85
9 changed files with 100 additions and 133 deletions

View File

@ -92,10 +92,12 @@ Used in this dialog window. Should be short -->
<string name="settings_amoled_dark">AMOLED Dark</string>
<string name="settings_amoled_dark_support">Use black background for dark themes</string>
<string name="settings_auto">Auto</string>
<!-- Option in menu. Here it is used as a verb (action) - "back up", don't confuse with "backup".
Alternatively you can use "Export" -->
<string name="settings_back_up">Back up</string>
<string name="settings_calculator_support">History view</string>
<string name="settings_clear_cache">Clear cache</string>
<string name="settings_clear_input">Clear input</string>
<string name="settings_clear_input_support">Start new expression when clicking \"=\" and any button</string>
<string name="settings_color_scheme">Color scheme</string>
<string name="settings_color_theme">Color theme</string>
<string name="settings_color_theme_support">Pick a theming mode</string>
@ -138,6 +140,9 @@ Maybe this can be labeled better? Let me know. It should be something that can d
<string name="settings_privacy_policy">Privacy Policy</string>
<string name="settings_rate_this_app">Rate this app</string>
<string name="settings_reorder_unit_group_description">Reorder unit group</string>
<!-- Option in menu. Verb (action). Alternatively you can use "Import" -->
<string name="settings_restore">Restore</string>
<string name="settings_selected_color">Selected color</string>
<string name="settings_selected_style">Selected style</string>
<string name="settings_separator">Separator</string>
@ -828,6 +833,10 @@ Maybe this can be labeled better? Let me know. It should be something that can d
<string name="unit_gigaton_short">Gt</string>
<string name="unit_gigaweber">Gigaweber</string>
<string name="unit_gigaweber_short">GWb</string>
<!-- Unit of mass -->
<string name="unit_grain">Grain</string>
<string name="unit_grain_short">gr</string>
<string name="unit_gram">Gram</string>
<string name="unit_gram_force">Gram-force</string>
<string name="unit_gram_force_centimeter">Gram-force centimeter</string>
@ -875,6 +884,10 @@ Maybe this can be labeled better? Let me know. It should be something that can d
<string name="unit_horse_power_mechanical">Horsepower</string>
<string name="unit_horse_power_mechanical_short">hp</string>
<string name="unit_hour">Hour</string>
<string name="unit_hour_per_kilometer">Hour/kilometer</string>
<string name="unit_hour_per_kilometer_short">h/km</string>
<string name="unit_hour_per_mile">Hour/mile</string>
<string name="unit_hour_per_mile_short">h/mi</string>
<string name="unit_hour_short">h</string>
<string name="unit_imperial_cup">Imperial cup</string>
<string name="unit_imperial_cup_short">cup</string>
@ -1133,6 +1146,10 @@ Maybe this can be labeled better? Let me know. It should be something that can d
<string name="unit_milliweber">Milliweber</string>
<string name="unit_milliweber_short">mWb</string>
<string name="unit_minute">Minute</string>
<string name="unit_minute_per_kilometer">Minute/kilometer</string>
<string name="unit_minute_per_kilometer_short">m/km</string>
<string name="unit_minute_per_mile">Minute/mile</string>
<string name="unit_minute_per_mile_short">m/mi</string>
<string name="unit_minute_short">m</string>
<string name="unit_month_short">m</string>
<string name="unit_nanofarad">Nanofarad</string>

View File

@ -57,6 +57,7 @@ object MyUnitIDS {
const val atomic_mass_unit = "atomic_mass_unit"
const val microgram = "microgram"
const val milligram = "milligram"
const val grain = "grain"
const val gram = "gram"
const val kilogram = "kilogram"
const val metric_ton = "metric_ton"
@ -101,6 +102,10 @@ object MyUnitIDS {
const val mile_per_hour = "mile_per_hour"
const val mile_per_minute = "mile_per_minute"
const val mile_per_second = "mile_per_second"
const val minute_per_kilometer = "minute_per_kilometer"
const val minute_per_mile = "minute_per_mile"
const val hour_per_kilometer = "hour_per_kilometer"
const val hour_per_mile = "hour_per_mile"
const val knot = "knot"
const val velocity_of_light_in_vacuum = "velocity_of_light_in_vacuum"
const val cosmic_velocity_first = "cosmic_velocity_first"

View File

@ -19,24 +19,24 @@
package com.sadellie.unitto.data.converter.collections
import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.data.converter.MyUnitIDS
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.converter.MyUnitIDS
import com.sadellie.unitto.data.model.unit.BackwardUnit
import com.sadellie.unitto.data.model.unit.NormalUnit
import java.math.BigDecimal
val fuelConsumptionCollection: List<AbstractUnit> by lazy {
listOf(
FuelForward(MyUnitIDS.kilometer_per_liter, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_km_per_l, R.string.unit_km_per_l_short),
FuelBackward(MyUnitIDS.liter_per_kilometer, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_km, R.string.unit_l_per_km_short),
FuelBackward(MyUnitIDS.liter_per_100_kilometer, BigDecimal.valueOf(100), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_100_km, R.string.unit_l_per_100_km_short),
FuelForward(MyUnitIDS.mile_per_gallon_uk, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_uk, R.string.unit_mi_per_gallon_uk_short),
FuelForward(MyUnitIDS.mile_per_gallon_us, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_us, R.string.unit_mi_per_gallon_us_short),
FuelForward(MyUnitIDS.mile_us_per_liter, BigDecimal.valueOf(1.609344), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_us_per_l, R.string.unit_mi_us_per_l_short),
FuelBackward(MyUnitIDS.gallon_us_per_mile, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_mile, R.string.unit_gallon_us_per_mile_short),
FuelBackward(MyUnitIDS.gallon_uk_per_mile, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_mile, R.string.unit_gallon_uk_per_mile_short),
FuelBackward(MyUnitIDS.gallon_us_per_100_mile, BigDecimal.valueOf(42.51437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_100_mile, R.string.unit_gallon_us_per_100_mile_short),
FuelBackward(MyUnitIDS.gallon_uk_per_100_mile, BigDecimal.valueOf(35.400618996), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_100_mile, R.string.unit_gallon_uk_per_100_mile_short),
NormalUnit( MyUnitIDS.kilometer_per_liter, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_km_per_l, R.string.unit_km_per_l_short),
BackwardUnit(MyUnitIDS.liter_per_kilometer, BigDecimal.valueOf(1), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_km, R.string.unit_l_per_km_short),
BackwardUnit(MyUnitIDS.liter_per_100_kilometer, BigDecimal.valueOf(100), UnitGroup.FUEL_CONSUMPTION, R.string.unit_l_per_100_km, R.string.unit_l_per_100_km_short),
NormalUnit( MyUnitIDS.mile_per_gallon_uk, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_uk, R.string.unit_mi_per_gallon_uk_short),
NormalUnit( MyUnitIDS.mile_per_gallon_us, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_per_gallon_us, R.string.unit_mi_per_gallon_us_short),
NormalUnit( MyUnitIDS.mile_us_per_liter, BigDecimal.valueOf(1.609344), UnitGroup.FUEL_CONSUMPTION, R.string.unit_mi_us_per_l, R.string.unit_mi_us_per_l_short),
BackwardUnit(MyUnitIDS.gallon_us_per_mile, BigDecimal.valueOf(0.4251437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_mile, R.string.unit_gallon_us_per_mile_short),
BackwardUnit(MyUnitIDS.gallon_uk_per_mile, BigDecimal.valueOf(0.35400619), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_mile, R.string.unit_gallon_uk_per_mile_short),
BackwardUnit(MyUnitIDS.gallon_us_per_100_mile, BigDecimal.valueOf(42.51437075), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_us_per_100_mile, R.string.unit_gallon_us_per_100_mile_short),
BackwardUnit(MyUnitIDS.gallon_uk_per_100_mile, BigDecimal.valueOf(35.400618996), UnitGroup.FUEL_CONSUMPTION, R.string.unit_gallon_uk_per_100_mile, R.string.unit_gallon_uk_per_100_mile_short),
)
}

View File

@ -19,10 +19,10 @@
package com.sadellie.unitto.data.converter.collections
import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.data.converter.MyUnitIDS
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.NormalUnit
import com.sadellie.unitto.data.converter.MyUnitIDS
import java.math.BigDecimal
internal val massCollection: List<AbstractUnit> by lazy {
@ -31,6 +31,7 @@ internal val massCollection: List<AbstractUnit> by lazy {
NormalUnit(MyUnitIDS.atomic_mass_unit, BigDecimal.valueOf(1.6605402E-24), UnitGroup.MASS, R.string.unit_atomic_mass_unit, R.string.unit_atomic_mass_unit_short),
NormalUnit(MyUnitIDS.microgram, BigDecimal(1E-6), UnitGroup.MASS, R.string.unit_microgram, R.string.unit_microgram_short),
NormalUnit(MyUnitIDS.milligram, BigDecimal.valueOf(1E-3), UnitGroup.MASS, R.string.unit_milligram, R.string.unit_milligram_short),
NormalUnit(MyUnitIDS.grain, BigDecimal.valueOf(0.06479891), UnitGroup.MASS, R.string.unit_grain, R.string.unit_grain_short),
NormalUnit(MyUnitIDS.gram, BigDecimal.valueOf(1), UnitGroup.MASS, R.string.unit_gram, R.string.unit_gram_short),
NormalUnit(MyUnitIDS.kilogram, BigDecimal.valueOf(1E+3), UnitGroup.MASS, R.string.unit_kilogram, R.string.unit_kilogram_short),
NormalUnit(MyUnitIDS.metric_ton, BigDecimal.valueOf(1E+6), UnitGroup.MASS, R.string.unit_metric_ton, R.string.unit_metric_ton_short),

View File

@ -19,10 +19,11 @@
package com.sadellie.unitto.data.converter.collections
import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.data.converter.MyUnitIDS
import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.BackwardUnit
import com.sadellie.unitto.data.model.unit.NormalUnit
import com.sadellie.unitto.data.converter.MyUnitIDS
import java.math.BigDecimal
internal val speedCollection: List<AbstractUnit> by lazy {
@ -48,6 +49,10 @@ internal val speedCollection: List<AbstractUnit> by lazy {
NormalUnit( MyUnitIDS.mile_per_hour, BigDecimal.valueOf(1_609_344), UnitGroup.SPEED, R.string.unit_mile_per_hour, R.string.unit_mile_per_hour_short),
NormalUnit( MyUnitIDS.mile_per_minute, BigDecimal.valueOf(96_560_640), UnitGroup.SPEED, R.string.unit_mile_per_minute, R.string.unit_mile_per_minute_short),
NormalUnit( MyUnitIDS.mile_per_second, BigDecimal.valueOf(5_793_638_400), UnitGroup.SPEED, R.string.unit_mile_per_second, R.string.unit_mile_per_second_short),
BackwardUnit(MyUnitIDS.minute_per_kilometer, BigDecimal.valueOf(60_000_000), UnitGroup.SPEED, R.string.unit_minute_per_kilometer, R.string.unit_minute_per_kilometer_short),
BackwardUnit(MyUnitIDS.minute_per_mile, BigDecimal.valueOf(96_560_640), UnitGroup.SPEED, R.string.unit_minute_per_mile, R.string.unit_minute_per_mile_short),
BackwardUnit(MyUnitIDS.hour_per_kilometer, BigDecimal.valueOf(1_000_000), UnitGroup.SPEED, R.string.unit_hour_per_kilometer, R.string.unit_hour_per_kilometer_short),
BackwardUnit(MyUnitIDS.hour_per_mile, BigDecimal.valueOf(1_609_344), UnitGroup.SPEED, R.string.unit_hour_per_mile, R.string.unit_hour_per_mile_short),
NormalUnit( MyUnitIDS.knot, BigDecimal.valueOf(1_852_000), UnitGroup.SPEED, R.string.unit_knot, R.string.unit_knot_short),
NormalUnit( MyUnitIDS.velocity_of_light_in_vacuum, BigDecimal.valueOf(1_079_252_848_799_998), UnitGroup.SPEED, R.string.unit_velocity_of_light_in_vacuum, R.string.unit_velocity_of_light_in_vacuum_short),
NormalUnit( MyUnitIDS.cosmic_velocity_first, BigDecimal.valueOf(28_440_000_000), UnitGroup.SPEED, R.string.unit_cosmic_velocity_first, R.string.unit_cosmic_velocity_first_short),

View File

@ -235,6 +235,7 @@ class AllUnitsTest {
fun testMass() = testWithUnits {
electron_mass_rest.checkWith(milligram, "1500000000000000000", "0.000001")
atomic_mass_unit.checkWith(electron_mass_rest, "150", "273433.27951")
grain.checkWith(milligram, "1500", "97198.365")
microgram.checkWith(gram, "1500", "0.0015")
milligram.checkWith(ounce, "1500", "0.05291")
gram.checkWith(ounce, "1500", "52.91094")
@ -321,6 +322,10 @@ class AllUnitsTest {
mile_per_hour.checkWith(foot_per_hour, "396", "2090880")
mile_per_minute.checkWith(foot_per_hour, "396", "125452800")
mile_per_second.checkWith(foot_per_hour, "396", "7527168000")
minute_per_kilometer.checkWith(kilometer_per_minute, "396", "0.00253")
minute_per_mile.checkWith(mile_per_minute, "396", "0.00253")
hour_per_kilometer.checkWith(kilometer_per_hour, "396", "0.00253")
hour_per_mile.checkWith(mile_per_hour, "396", "0.00253")
knot.checkWith(meter_per_hour, "396", "733392")
velocity_of_light_in_vacuum.checkWith(meter_per_second, "1", "299792458")
cosmic_velocity_first.checkWith(meter_per_second, "1", "7900")

View File

@ -1,6 +1,6 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
* Copyright (c) 2024 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
@ -24,7 +24,7 @@ import com.sadellie.unitto.data.model.UnitGroup
import java.math.BigDecimal
import java.math.RoundingMode
data class FuelBackward(
data class BackwardUnit(
override val id: String,
override val basicUnit: BigDecimal,
override val group: UnitGroup,
@ -39,17 +39,17 @@ data class FuelBackward(
if (unitTo.basicUnit.isEqualTo(BigDecimal.ZERO)) return BigDecimal.ZERO
return when (unitTo) {
is FuelForward -> this
is NormalUnit -> this
.basicUnit
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
.div(unitTo.basicUnit)
.div(value)
is FuelBackward -> unitTo
is BackwardUnit -> unitTo
.basicUnit
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
.div(this.basicUnit)
.multiply(value)
.div(this.basicUnit)
else -> BigDecimal.ZERO
}
@ -64,7 +64,7 @@ data class FuelBackward(
isFavorite: Boolean,
pairId: String?,
counter: Int,
): FuelBackward = copy(
): BackwardUnit = copy(
id = id,
basicUnit = basicUnit,
group = group,

View File

@ -1,76 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.model.unit
import com.sadellie.unitto.core.base.MAX_PRECISION
import com.sadellie.unitto.data.common.isEqualTo
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.isEqualTo(BigDecimal.ZERO)) 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
}
}
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,
)
}

View File

@ -38,11 +38,21 @@ data class NormalUnit(
// Avoid division by zero
if (unitTo.basicUnit.isEqualTo(BigDecimal.ZERO)) return BigDecimal.ZERO
return this
return when (unitTo) {
is NormalUnit -> this
.basicUnit
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
.multiply(value)
.div(unitTo.basicUnit)
is BackwardUnit -> unitTo
.basicUnit
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
.div(this.basicUnit)
.div(value)
else -> BigDecimal.ZERO
}
}
override fun clone(