diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/AreaConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/AreaConverter.kt index a89fa023..c056b1eb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/AreaConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/AreaConverter.kt @@ -6,74 +6,88 @@ object AreaConverter : Converter { override val nameResId: Int = R.string.unit_area override val imageResId: Int = R.drawable.ic_box_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { data object SquareKilometer : Unit( nameResId = R.string.unit_area_square_kilometer, + formatResId = R.string.unit_area_square_kilometer_format, factor = 1000000.0 ) data object SquareMeter : Unit( nameResId = R.string.unit_area_square_meter, + formatResId = R.string.unit_area_square_meter_format, factor = 1.0 ) data object SquareCentimeter : Unit( nameResId = R.string.unit_area_square_centimeter, + formatResId = R.string.unit_area_square_centimeter_format, factor = 0.0001 ) data object SquareMillimeter : Unit( nameResId = R.string.unit_area_square_millimeter, + formatResId = R.string.unit_area_square_millimeter_format, factor = 0.000001 ) data object SquareMile : Unit( nameResId = R.string.unit_area_square_mile, + formatResId = R.string.unit_area_square_mile_format, factor = 2_589_988.110336 ) data object SquareYard : Unit( nameResId = R.string.unit_area_square_yard, + formatResId = R.string.unit_area_square_yard_format, factor = 0.83612736 ) data object SquareFoot : Unit( nameResId = R.string.unit_area_square_foot, + formatResId = R.string.unit_area_square_foot_format, factor = 0.09290304 ) data object SquareInch : Unit( nameResId = R.string.unit_area_square_inch, + formatResId = R.string.unit_area_square_inch_format, factor = 0.00064516 ) data object SquareMil : Unit( nameResId = R.string.unit_area_square_mil, + formatResId = R.string.unit_area_square_mil_format, factor = 0.00000000064516 ) data object SquareRod : Unit( nameResId = R.string.unit_area_square_rod, + formatResId = R.string.unit_area_square_rod_format, factor = 25.29285264 ) data object Acre : Unit( nameResId = R.string.unit_area_acre, + formatResId = R.string.unit_area_acre_format, factor = 4_046.8564224 ) data object Are : Unit( nameResId = R.string.unit_area_are, + formatResId = R.string.unit_area_are_format, factor = 100.0 ) data object Dunam : Unit( nameResId = R.string.unit_area_dunam, + formatResId = R.string.unit_area_dunam_format, factor = 1000.0 ) data object Hectare : Unit( nameResId = R.string.unit_area_hectare, + formatResId = R.string.unit_area_hectare_format, factor = 10_000.0 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Base.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Base.kt index 629d626a..c4842285 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Base.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Base.kt @@ -1,5 +1,8 @@ package com.simplemobiletools.calculator.helpers.converters +import android.content.Context +import com.simplemobiletools.calculator.R + interface Converter { companion object { val ALL = listOf( @@ -24,6 +27,7 @@ interface Converter { open class Unit( val nameResId: Int, + val formatResId: Int, val factor: Double ) { @@ -32,6 +36,14 @@ interface Converter { open fun fromBase(value: Double) = value / factor fun withValue(value: Double) = ValueWithUnit(value, this) + + fun format(context: Context, value: String) = context.getString(formatResId, value) + + fun getNameWithSymbol(context: Context) = context.getString( + R.string.unit_name_with_symbol_format, + context.getString(nameResId), + format(context, "").trim() + ) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Converters.kt deleted file mode 100644 index 29a26633..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/Converters.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.simplemobiletools.calculator.helpers.converters - -object Converters { - val ALL = listOf(LengthConverter) - - object Mass - - object Temperature - - object Speed - - object Time - - object Fuel - - object Energy - - object Pressure -} diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/LengthConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/LengthConverter.kt index a8e30c6b..bd672f5a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/LengthConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/LengthConverter.kt @@ -6,129 +6,154 @@ object LengthConverter : Converter { override val nameResId: Int = R.string.unit_length override val imageResId: Int = R.drawable.ic_height_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { data object Kilometer : Unit( nameResId = R.string.unit_length_kilometer, + formatResId = R.string.unit_length_kilometer_format, factor = 1000.0 ) data object Hectometer : Unit( nameResId = R.string.unit_length_hectometer, + formatResId = R.string.unit_length_hectometer_format, factor = 100.0 ) data object Decameter : Unit( nameResId = R.string.unit_length_decameter, + formatResId = R.string.unit_length_decameter_format, factor = 10.0 ) data object Meter : Unit( nameResId = R.string.unit_length_meter, + formatResId = R.string.unit_length_meter_format, factor = 1.0 ) data object Decimeter : Unit( nameResId = R.string.unit_length_decimeter, + formatResId = R.string.unit_length_decimeter_format, factor = 0.1 ) data object Centimeter : Unit( nameResId = R.string.unit_length_centimeter, + formatResId = R.string.unit_length_centimeter_format, factor = 0.01 ) data object Millimeter : Unit( nameResId = R.string.unit_length_millimeter, + formatResId = R.string.unit_length_millimeter_format, factor = 0.001 ) data object Micrometer : Unit( nameResId = R.string.unit_length_micrometer, + formatResId = R.string.unit_length_micrometer_format, factor = 0.000001 ) data object Nanometer : Unit( nameResId = R.string.unit_length_nanometer, + formatResId = R.string.unit_length_nanometer_format, factor = 0.000000001 ) data object Picometer : Unit( nameResId = R.string.unit_length_picometer, + formatResId = R.string.unit_length_picometer_format, factor = 0.000000000001 ) data object Angstrom : Unit( nameResId = R.string.unit_length_angstrom, + formatResId = R.string.unit_length_angstrom_format, factor = 1e-10 ) data object Mile : Unit( nameResId = R.string.unit_length_mile, + formatResId = R.string.unit_length_mile_format, factor = 1_609.344 ) data object Chain : Unit( nameResId = R.string.unit_length_chain, + formatResId = R.string.unit_length_chain_format, factor = 20.1168 ) data object Yard : Unit( nameResId = R.string.unit_length_yard, + formatResId = R.string.unit_length_yard_format, factor = 0.9144 ) data object Foot : Unit( nameResId = R.string.unit_length_foot, + formatResId = R.string.unit_length_foot_format, factor = 0.3048 ) data object Mil : Unit( nameResId = R.string.unit_length_mil, + formatResId = R.string.unit_length_mil_format, factor = 0.0000254 ) data object Inch : Unit( nameResId = R.string.unit_length_inch, + formatResId = R.string.unit_length_inch_format, factor = 0.0254 ) data object Fathom : Unit( nameResId = R.string.unit_length_fathom, + formatResId = R.string.unit_length_fathom_format, factor = 1.852 ) data object Cable : Unit( nameResId = R.string.unit_length_cable, + formatResId = R.string.unit_length_cable_format, factor = 185.2 ) data object NauticalMile : Unit( nameResId = R.string.unit_length_nautical_mile, + formatResId = R.string.unit_length_nautical_mile_format, factor = 1_852.0 ) data object Link : Unit( nameResId = R.string.unit_length_link, + formatResId = R.string.unit_length_link_format, factor = 0.201168 ) data object Rod : Unit( nameResId = R.string.unit_length_rod, + formatResId = R.string.unit_length_rod_format, factor = 5.0292 ) data object AstronomicalUnit : Unit( nameResId = R.string.unit_length_astronomical_unit, + formatResId = R.string.unit_length_astronomical_unit_format, factor = 1.495979e+11 ) data object Parsec : Unit( nameResId = R.string.unit_length_parsec, + formatResId = R.string.unit_length_parsec_format, factor = 3.0857e+16 ) data object LightYear : Unit( nameResId = R.string.unit_length_light_year, + formatResId = R.string.unit_length_light_year_format, factor = 9.4607e+15 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/MassConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/MassConverter.kt index 26db2863..643a7879 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/MassConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/MassConverter.kt @@ -6,74 +6,88 @@ object MassConverter : Converter { override val nameResId: Int = R.string.unit_mass override val imageResId: Int = R.drawable.ic_scale_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { data object Gram : Unit( nameResId = R.string.unit_mass_gram, + formatResId = R.string.unit_mass_gram_format, factor = 0.001 ) data object Kilogram : Unit( nameResId = R.string.unit_mass_kilogram, + formatResId = R.string.unit_mass_kilogram_format, factor = 1.0 ) data object Milligram : Unit( nameResId = R.string.unit_mass_milligram, + formatResId = R.string.unit_mass_milligram_format, factor = 0.000001 ) data object Microgram : Unit( nameResId = R.string.unit_mass_microgram, + formatResId = R.string.unit_mass_microgram_format, factor = 0.000000001 ) data object Tonne : Unit( nameResId = R.string.unit_mass_tonne, + formatResId = R.string.unit_mass_tonne_format, factor = 1_000.0 ) data object Pound : Unit( nameResId = R.string.unit_mass_pound, + formatResId = R.string.unit_mass_pound_format, factor = 0.45359237 ) data object Ounce : Unit( nameResId = R.string.unit_mass_ounce, + formatResId = R.string.unit_mass_ounce_format, factor = 0.028349523125 ) data object Grain : Unit( nameResId = R.string.unit_mass_grain, + formatResId = R.string.unit_mass_grain_format, factor = 0.00006479891 ) data object Dram : Unit( nameResId = R.string.unit_mass_dram, + formatResId = R.string.unit_mass_dram_format, factor = 0.0017718451953125 ) data object Stone : Unit( nameResId = R.string.unit_mass_stone, + formatResId = R.string.unit_mass_stone_format, factor = 6.35029318 ) data object LongTon : Unit( nameResId = R.string.unit_mass_long_ton, + formatResId = R.string.unit_mass_long_ton_format, factor = 1_016.0469088 ) data object ShortTon : Unit( nameResId = R.string.unit_mass_short_ton, + formatResId = R.string.unit_mass_short_ton_format, factor = 907.18474 ) data object Carat : Unit( nameResId = R.string.unit_mass_carat, + formatResId = R.string.unit_mass_carat_format, factor = 0.0002051965483 ) data object CaratMetric : Unit( nameResId = R.string.unit_mass_carat_metric, + formatResId = R.string.unit_mass_carat_metric_format, factor = 0.0002 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TemperatureConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TemperatureConverter.kt index 3c7cf4b7..34afea20 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TemperatureConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TemperatureConverter.kt @@ -6,10 +6,11 @@ object TemperatureConverter : Converter { override val nameResId: Int = R.string.unit_temperature override val imageResId: Int = R.drawable.ic_thermostat_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { data object Celsius : Unit( nameResId = R.string.unit_temperature_celsius, + formatResId = R.string.unit_temperature_celsius_format, factor = 1.0 ) { const val KELVIN_OFFSET = 273.15 @@ -20,6 +21,7 @@ object TemperatureConverter : Converter { data object Delisle : Unit( nameResId = R.string.unit_temperature_delisle, + formatResId = R.string.unit_temperature_delisle_format, factor = 2.0 / 3 ) { private const val KELVIN_OFFSET = 373.15 @@ -31,6 +33,7 @@ object TemperatureConverter : Converter { data object Fahrenheit : Unit( nameResId = R.string.unit_temperature_fahrenheit, + formatResId = R.string.unit_temperature_fahrenheit_format, factor = 9.0 / 5 ) { private const val CELSIUS_OFFSET = 32 @@ -42,6 +45,7 @@ object TemperatureConverter : Converter { data object Newton : Unit( nameResId = R.string.unit_temperature_newton, + formatResId = R.string.unit_temperature_newton_format, factor = 100.0 / 33 ) { private const val KELVIN_OFFSET = Celsius.KELVIN_OFFSET @@ -53,11 +57,13 @@ object TemperatureConverter : Converter { data object Rankine : Unit( nameResId = R.string.unit_temperature_rankine, + formatResId = R.string.unit_temperature_rankine_format, factor = 5.0 / 9 ) data object Reaumur : Unit( nameResId = R.string.unit_temperature_reaumur, + formatResId = R.string.unit_temperature_reaumur_format, factor = 5.0 / 4 ) { private const val KELVIN_OFFSET = Celsius.KELVIN_OFFSET @@ -69,6 +75,7 @@ object TemperatureConverter : Converter { data object Romer : Unit( nameResId = R.string.unit_temperature_romer, + formatResId = R.string.unit_temperature_romer_format, factor = 40.0 / 21 ) { private const val KELVIN_OFFSET = Celsius.KELVIN_OFFSET @@ -81,6 +88,7 @@ object TemperatureConverter : Converter { data object GasMark : Unit( nameResId = R.string.unit_temperature_gas_mark, + formatResId = R.string.unit_temperature_gas_mark_format, factor = 25.0 ) { private const val FAHRENHEIT_OFFSET = 250 @@ -92,6 +100,7 @@ object TemperatureConverter : Converter { data object Kelvin : Unit( nameResId = R.string.unit_temperature_kelvin, + formatResId = R.string.unit_temperature_kelvin_format, factor = 1.0 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TimeConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TimeConverter.kt index 54c3cdee..93eb87d1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TimeConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/TimeConverter.kt @@ -6,7 +6,7 @@ object TimeConverter : Converter { override val nameResId: Int = R.string.unit_time override val imageResId: Int = com.simplemobiletools.commons.R.drawable.ic_clock_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { companion object { private const val MINUTE = 60.0 private const val HOUR = 60.0 * MINUTE @@ -16,116 +16,139 @@ object TimeConverter : Converter { data object Hour : Unit( nameResId = R.string.unit_time_hour, + formatResId = R.string.unit_time_hour_format, factor = HOUR ) data object Minute : Unit( nameResId = R.string.unit_time_minute, + formatResId = R.string.unit_time_minute_format, factor = MINUTE ) data object Second : Unit( nameResId = R.string.unit_time_second, + formatResId = R.string.unit_time_second_format, factor = 1.0 ) data object Millisecond : Unit( nameResId = R.string.unit_time_millisecond, + formatResId = R.string.unit_time_millisecond_format, factor = 0.001 ) data object Microsecond : Unit( nameResId = R.string.unit_time_microsecond, + formatResId = R.string.unit_time_microsecond_format, factor = 0.000001 ) data object Nanosecond : Unit( nameResId = R.string.unit_time_nanosecond, + formatResId = R.string.unit_time_nanosecond_format, factor = 0.000000001 ) data object Picosecond : Unit( nameResId = R.string.unit_time_picosecond, + formatResId = R.string.unit_time_picosecond_format, factor = 0.000000000001 ) data object Day : Unit( nameResId = R.string.unit_time_day, + formatResId = R.string.unit_time_day_format, factor = DAY ) data object Week : Unit( nameResId = R.string.unit_time_week, + formatResId = R.string.unit_time_week_format, factor = DAY * 7 ) data object MonthFull : Unit( nameResId = R.string.unit_time_month_full, + formatResId = R.string.unit_time_month_full_format, factor = DAY * 30 ) data object MonthHollow : Unit( nameResId = R.string.unit_time_month_hollow, + formatResId = R.string.unit_time_month_hollow_format, factor = DAY * 29 ) data object MonthSynodic : Unit( nameResId = R.string.unit_time_month_synodic, + formatResId = R.string.unit_time_month_synodic_format, factor = DAY * 29.530589 ) data object MonthGregorianAverage : Unit( nameResId = R.string.unit_time_month_gregorian_average, + formatResId = R.string.unit_time_month_gregorian_average_format, factor = DAY * 30.346875 ) data object YearLeap : Unit( nameResId = R.string.unit_time_year_leap, + formatResId = R.string.unit_time_year_leap_format, factor = DAY * 366 ) data object YearGregorian : Unit( nameResId = R.string.unit_time_year_gregorian, + formatResId = R.string.unit_time_year_gregorian_format, factor = GREGORIAN_YEAR ) data object YearJulian : Unit( nameResId = R.string.unit_time_year_julian, + formatResId = R.string.unit_time_year_julian_format, factor = DAY * 365.25 ) data object Jiffy : Unit( nameResId = R.string.unit_time_jiffy, + formatResId = R.string.unit_time_jiffy_format, factor = 1 / 60.0 ) data object Moment : Unit( nameResId = R.string.unit_time_moment, + formatResId = R.string.unit_time_moment_format, factor = 90.0 ) data object Fortnight : Unit( nameResId = R.string.unit_time_fortnight, + formatResId = R.string.unit_time_fortnight_format, factor = DAY * 7 * 2 ) data object Decade : Unit( nameResId = R.string.unit_time_decade, + formatResId = R.string.unit_time_decade_format, factor = GREGORIAN_YEAR * 10 ) data object Century : Unit( nameResId = R.string.unit_time_century, + formatResId = R.string.unit_time_century_format, factor = GREGORIAN_YEAR * 100 ) data object Millennium : Unit( nameResId = R.string.unit_time_millennium, + formatResId = R.string.unit_time_millennium_format, factor = GREGORIAN_YEAR * 1000 ) data object AtomicUnit : Unit( nameResId = R.string.unit_time_atomic_unit, + formatResId = R.string.unit_time_atomic_unit_format, factor = 0.00000000000000002418884254 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/VolumeConverter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/VolumeConverter.kt index 585d0afb..d50f183a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/VolumeConverter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/converters/VolumeConverter.kt @@ -6,159 +6,190 @@ object VolumeConverter : Converter { override val nameResId: Int = R.string.unit_volume override val imageResId: Int = R.drawable.ic_drop_vector - sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) { + sealed class Unit(nameResId: Int, formatResId: Int, factor: Double) : Converter.Unit(nameResId, formatResId, factor) { data object CubicMeter : Unit( nameResId = R.string.unit_volume_cubic_meter, + formatResId = R.string.unit_volume_cubic_meter_format, factor = 1.0 ) data object CubicDecimeter : Unit( nameResId = R.string.unit_volume_cubic_decimeter, + formatResId = R.string.unit_volume_cubic_decimeter_format, factor = 0.001 ) data object CubicCentimeter : Unit( nameResId = R.string.unit_volume_cubic_centimeter, + formatResId = R.string.unit_volume_cubic_centimeter_format, factor = 0.000001 ) data object CubicMillimeter : Unit( nameResId = R.string.unit_volume_cubic_millimeter, + formatResId = R.string.unit_volume_cubic_millimeter_format, factor = 0.000000001 ) data object Liter : Unit( nameResId = R.string.unit_volume_liter, + formatResId = R.string.unit_volume_liter_format, factor = 0.001 ) data object Centiliter : Unit( nameResId = R.string.unit_volume_centiliter, + formatResId = R.string.unit_volume_centiliter_format, factor = 0.0001 ) data object Deciliter : Unit( nameResId = R.string.unit_volume_deciliter, + formatResId = R.string.unit_volume_deciliter_format, factor = 0.00001 ) data object Milliliter : Unit( nameResId = R.string.unit_volume_milliliter, + formatResId = R.string.unit_volume_milliliter_format, factor = 0.000001 ) data object AcreFoot : Unit( nameResId = R.string.unit_volume_acre_foot, + formatResId = R.string.unit_volume_acre_foot_format, factor = 1_233.48183754752 ) data object CubicYard : Unit( nameResId = R.string.unit_volume_cubic_yard, + formatResId = R.string.unit_volume_cubic_yard_format, factor = 0.764554857984 ) data object CubicFoot : Unit( nameResId = R.string.unit_volume_cubic_foot, + formatResId = R.string.unit_volume_cubic_foot_format, factor = 0.028316846592 ) data object CubicInch : Unit( nameResId = R.string.unit_volume_cubic_inch, + formatResId = R.string.unit_volume_cubic_inch_format, factor = 0.000016387064 ) data object BarrelUS : Unit( nameResId = R.string.unit_volume_barrel_us, + formatResId = R.string.unit_volume_barrel_us_format, factor = 0.119240471196 ) data object GallonUS : Unit( nameResId = R.string.unit_volume_gallon_us, + formatResId = R.string.unit_volume_gallon_us_format, factor = 0.003785411784 ) data object QuartUS : Unit( nameResId = R.string.unit_volume_quart_us, + formatResId = R.string.unit_volume_quart_us_format, factor = 0.000946352946 ) data object PintUS : Unit( nameResId = R.string.unit_volume_pint_us, + formatResId = R.string.unit_volume_pint_us_format, factor = 0.000473176473 ) data object GillUS : Unit( nameResId = R.string.unit_volume_gill_us, + formatResId = R.string.unit_volume_gill_us_format, factor = 0.00011829411825 ) data object FluidOunceUS : Unit( nameResId = R.string.unit_volume_fluid_ounce_us, + formatResId = R.string.unit_volume_fluid_ounce_us_format, factor = 0.00003 ) data object DropUS : Unit( nameResId = R.string.unit_volume_drop_us, + formatResId = R.string.unit_volume_drop_us_format, factor = 0.00000008214869322916 ) data object TeaspoonUS : Unit( nameResId = R.string.unit_volume_teaspoon_us, + formatResId = R.string.unit_volume_teaspoon_us_format, factor = 0.000005 ) data object TablespoonUS : Unit( nameResId = R.string.unit_volume_tablespoon_us, + formatResId = R.string.unit_volume_tablespoon_us_format, factor = 0.000015 ) data object CupUS : Unit( nameResId = R.string.unit_volume_cup_us, + formatResId = R.string.unit_volume_cup_us_format, factor = 0.00024 ) data object BarrelImperial : Unit( nameResId = R.string.unit_volume_barrel_imperial, + formatResId = R.string.unit_volume_barrel_imperial_format, factor = 0.16365924 ) data object GallonImperial : Unit( nameResId = R.string.unit_volume_gallon_imperial, + formatResId = R.string.unit_volume_gallon_imperial_format, factor = 0.00454609 ) data object QuartImperial : Unit( nameResId = R.string.unit_volume_quart_imperial, + formatResId = R.string.unit_volume_quart_imperial_format, factor = 0.0011365225 ) data object PintImperial : Unit( nameResId = R.string.unit_volume_pint_imperial, + formatResId = R.string.unit_volume_pint_imperial_format, factor = 0.00056826125 ) data object GillImperial : Unit( nameResId = R.string.unit_volume_gill_imperial, + formatResId = R.string.unit_volume_gill_imperial_format, factor = 0.0001420653125 ) data object FluidOunceImperial : Unit( nameResId = R.string.unit_volume_fluid_ounce_imperial, + formatResId = R.string.unit_volume_fluid_ounce_imperial_format, factor = 0.0000284130625 ) data object DropImperial : Unit( nameResId = R.string.unit_volume_drop_imperial, + formatResId = R.string.unit_volume_drop_imperial_format, factor = 0.0000000986564670138 ) data object TeaspoonImperial : Unit( nameResId = R.string.unit_volume_teaspoon_imperial, + formatResId = R.string.unit_volume_teaspoon_imperial_format, factor = 0.00000591938802083 ) data object TablespoonImperial : Unit( nameResId = R.string.unit_volume_tablespoon_imperial, + formatResId = R.string.unit_volume_tablespoon_imperial_format, factor = 0.0000177581640625 ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/views/ConverterView.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/views/ConverterView.kt index d8bc93b8..641878f2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/views/ConverterView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/views/ConverterView.kt @@ -6,6 +6,7 @@ import android.content.res.ColorStateList import android.util.AttributeSet import android.view.View import android.widget.LinearLayout +import android.widget.TextView import androidx.core.widget.TextViewCompat import com.simplemobiletools.calculator.R import com.simplemobiletools.calculator.databinding.ViewConverterBinding @@ -13,6 +14,7 @@ import com.simplemobiletools.calculator.helpers.COMMA import com.simplemobiletools.calculator.helpers.DOT import com.simplemobiletools.calculator.helpers.NumberFormatHelper import com.simplemobiletools.calculator.helpers.converters.Converter +import com.simplemobiletools.calculator.helpers.converters.ValueWithUnit import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.models.RadioItem @@ -55,7 +57,7 @@ class ConverterView @JvmOverloads constructor( topUnit = converter.defaultTopUnit bottomUnit = converter.defaultBottomUnit - binding.topUnitText.text = "0" + binding.topUnitText.setFormattedUnitText(topUnit!!.withValue(0.0)) updateBottomValue() updateUnitLabels() } @@ -79,8 +81,8 @@ class ConverterView @JvmOverloads constructor( } fun clear() { - binding.topUnitText.text = "0" - binding.bottomUnitText.text = "0" + binding.topUnitText.setFormattedUnitText(topUnit!!.withValue(0.0)) + binding.bottomUnitText.setFormattedUnitText(bottomUnit!!.withValue(0.0)) } fun numpadClicked(id: Int) { @@ -102,7 +104,7 @@ class ConverterView @JvmOverloads constructor( } private fun decimalClicked() { - var value = binding.topUnitText.text.toString() + var value = binding.topUnitText.text.removeUnit() if (!value.contains(decimalSeparator)) { when (value) { "0" -> value = "0$decimalSeparator" @@ -110,30 +112,31 @@ class ConverterView @JvmOverloads constructor( else -> value += decimalSeparator } - binding.topUnitText.text = value + binding.topUnitText.text = topUnit?.format(context, value) } } private fun zeroClicked() { - val value = binding.topUnitText.text + val value = binding.topUnitText.text.removeUnit() if (value != "0" || value.contains(decimalSeparator)) { addDigit(0) } } private fun addDigit(digit: Int) { - var value = binding.topUnitText.text.toString() + var value = binding.topUnitText.text.removeUnit() if (value == "0") { value = "" } value += digit value = formatter.addGroupingSeparators(value) - binding.topUnitText.text = value + binding.topUnitText.text = topUnit!!.format(context, value) } private fun switch() { ::topUnit.swapWith(::bottomUnit) + updateTopValue() updateBottomValue() updateUnitLabels() } @@ -143,10 +146,14 @@ class ConverterView @JvmOverloads constructor( binding.bottomUnitName.text = bottomUnit?.nameResId?.let { context.getString(it) } } + private fun updateTopValue() { + binding.topUnitText.setFormattedUnitText(topUnit!!.withValue(binding.topUnitText.getValue())) + } + private fun updateBottomValue() { converter?.apply { - val converted = convert(topUnit!!.withValue(formatter.removeGroupingSeparator(binding.topUnitText.text.toString()).toDouble()), bottomUnit!!).value - binding.bottomUnitText.text = formatter.doubleToString(converted) + val converted = convert(topUnit!!.withValue(binding.topUnitText.getValue()), bottomUnit!!).value + binding.bottomUnitText.setFormattedUnitText(bottomUnit!!.withValue(converted)) } } @@ -156,11 +163,21 @@ class ConverterView @JvmOverloads constructor( this.groupingSeparator = groupingSeparator formatter.decimalSeparator = decimalSeparator formatter.groupingSeparator = groupingSeparator - binding.topUnitText.text = "0" - binding.bottomUnitText.text = "0" + binding.topUnitText.setFormattedUnitText(topUnit!!.withValue(0.0)) + binding.bottomUnitText.setFormattedUnitText(bottomUnit!!.withValue(0.0)) } } + private fun TextView.setFormattedUnitText(value: ValueWithUnit<*>) { + text = value.unit.format(context, formatter.doubleToString(value.value)) + } + + private fun TextView.getValue(): Double { + return formatter.removeGroupingSeparator(text.removeUnit()).toDouble() + } + + private fun CharSequence.removeUnit() = filter { it.isDigit() || it == '.' || it == ',' }.toString() + private fun KMutableProperty0.swapWith(other: KMutableProperty0) { this.get().also { this.set(other.get()) @@ -171,7 +188,7 @@ class ConverterView @JvmOverloads constructor( private fun View.setClickListenerForUnitSelector(propertyToChange: KMutableProperty0, otherProperty: KMutableProperty0) { setOnClickListener { val items = ArrayList(converter!!.units.mapIndexed { index, unit -> - RadioItem(index, context.getString(unit.nameResId), unit) + RadioItem(index, unit.getNameWithSymbol(context), unit) }) RadioGroupDialog(context as Activity, items, converter!!.units.indexOf(propertyToChange.get())) { val unit = it as Converter.Unit @@ -179,6 +196,7 @@ class ConverterView @JvmOverloads constructor( switch() } else if (unit != propertyToChange.get()) { propertyToChange.set(unit) + updateTopValue() updateBottomValue() } updateUnitLabels() diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 4a86eb13..636e4d37 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -2,6 +2,124 @@ com.simplemobiletools.calculator + %s (%s) + %s km + %s hm + %s dam + %s m + %s dm + %s cm + %s mm + %s μm + %s nm + %s pm + %s Å + %s mi + %s ch + %s yd + %s ft + %s mil + %s in + %s fathom + %s cable + %s NM + %s lnk + %s rd + %s au + %s pc + %s ly + %s km² + %s m² + %s cm² + %s mm² + %s sq mi + %s sq yd + %s sq ft + %s sq mil + %s sq in + %s sq rd + %s ac + %s a + %s dunam + %s ha + %s m³ + %s dm³ + %s cm³ + %s mm³ + %s l + %s cl + %s dl + %s ml + %s ac ft + %s yd³ + %s ft³ + %s in³ + %s fl bl (US) + %s gal (US) + %s qt (US) + %s pt (US fl) + %s gi (US) + %s US fl oz + %s gtt + %s tsp + %s tbsp + %s c (US) + %s bl (imp) + %s gal (imp) + %s qt (imp) + %s pt (imp) + %s gi (imp) + %s fl oz (imp) + %s gtt + %s tsp + %s tbsp + %s g + %s kg + %s mg + %s μm + %s t + %s lb + %s oz + %s gr + %s dr + %s st + %s ton + %s sh tn + %s kt + %s ct + %s°C + %s°De + %s°F + %s°N + %s°R + %s°Ré + %s°Rø + %s GM + %s K + %s h + %s m + %s s + %s ms + %s µs + %s ns + %s ps + %s d + %s wk + %s mo + %s mo + %s mo + %s mo + %s y + %s y + %s y + %s j + %s moment + %s fn + %s dec + %s c + %s millennium + %s a.u. + Allow customizing the bottom navigation bar color Added a toggle for preventing the phone from sleeping, enabled by default