Merge pull request #327 from esensar/feature/unit-converter-remember-units

Store last selected units for each converter
This commit is contained in:
Tibor Kaputa
2023-09-19 12:27:05 +02:00
committed by GitHub
12 changed files with 210 additions and 83 deletions

View File

@ -71,6 +71,11 @@ class UnitConverterActivity : SimpleActivity() {
savedInstanceState.getBundle(CONVERTER_STATE)?.also { savedInstanceState.getBundle(CONVERTER_STATE)?.also {
binding.viewUnitConverter.viewConverter.root.restoreFromSavedState(it) binding.viewUnitConverter.viewConverter.root.restoreFromSavedState(it)
} }
} else {
val storedState = config.getLastConverterUnits(converter)
if (storedState != null) {
binding.viewUnitConverter.viewConverter.root.updateUnits(storedState.topUnit, storedState.bottomUnit)
}
} }
} }

View File

@ -2,6 +2,8 @@ package com.simplemobiletools.calculator.helpers
import android.content.Context import android.content.Context
import com.simplemobiletools.calculator.extensions.sharedPreferencesCallback import com.simplemobiletools.calculator.extensions.sharedPreferencesCallback
import com.simplemobiletools.calculator.helpers.converters.Converter
import com.simplemobiletools.calculator.models.ConverterUnitsState
import com.simplemobiletools.commons.helpers.BaseConfig import com.simplemobiletools.commons.helpers.BaseConfig
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.filterNotNull
@ -15,6 +17,26 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(USE_COMMA_AS_DECIMAL_MARK, getDecimalSeparator() == COMMA) get() = prefs.getBoolean(USE_COMMA_AS_DECIMAL_MARK, getDecimalSeparator() == COMMA)
set(useCommaAsDecimalMark) = prefs.edit().putBoolean(USE_COMMA_AS_DECIMAL_MARK, useCommaAsDecimalMark).apply() set(useCommaAsDecimalMark) = prefs.edit().putBoolean(USE_COMMA_AS_DECIMAL_MARK, useCommaAsDecimalMark).apply()
fun getLastConverterUnits(converter: Converter): ConverterUnitsState? {
val storedState = prefs.getString("$CONVERTER_UNITS_PREFIX.${converter.key}", null)
return if (!storedState.isNullOrEmpty()) {
val parts = storedState.split(",").map { part ->
converter.units.first { it.key == part }
}
if (parts.size == 2) {
ConverterUnitsState(parts[0], parts[1])
} else {
null
}
} else {
null
}
}
fun putLastConverterUnits(converter: Converter, topUnit: Converter.Unit, bottomUnit: Converter.Unit) {
prefs.edit().putString("$CONVERTER_UNITS_PREFIX.${converter.key}", "${topUnit.key},${bottomUnit.key}").apply()
}
val preventPhoneFromSleepingFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { preventPhoneFromSleeping } }.filterNotNull() val preventPhoneFromSleepingFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { preventPhoneFromSleeping } }.filterNotNull()
val vibrateOnButtonPressFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { vibrateOnButtonPress } }.filterNotNull() val vibrateOnButtonPressFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { vibrateOnButtonPress } }.filterNotNull()
val wasUseEnglishToggledFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { wasUseEnglishToggled } }.filterNotNull() val wasUseEnglishToggledFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { wasUseEnglishToggled } }.filterNotNull()

View File

@ -30,6 +30,7 @@ const val COMMA = ","
// shared prefs // shared prefs
const val USE_COMMA_AS_DECIMAL_MARK = "use_comma_as_decimal_mark" const val USE_COMMA_AS_DECIMAL_MARK = "use_comma_as_decimal_mark"
const val CONVERTER_UNITS_PREFIX = "converter_last_units"
// calculator state // calculator state
const val RES = "res" const val RES = "res"

View File

@ -5,66 +5,77 @@ import com.simplemobiletools.calculator.R
object AreaConverter : Converter { object AreaConverter : Converter {
override val nameResId: Int = R.string.unit_area override val nameResId: Int = R.string.unit_area
override val imageResId: Int = R.drawable.ic_box_vector override val imageResId: Int = R.drawable.ic_box_vector
override val key: String = "AreaConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
data object SquareKilometer : Unit( data object SquareKilometer : Unit(
nameResId = R.string.unit_area_square_kilometer, nameResId = R.string.unit_area_square_kilometer,
symbolResId = R.string.unit_area_square_kilometer_symbol, symbolResId = R.string.unit_area_square_kilometer_symbol,
factor = 1000000.0 factor = 1000000.0,
key = "SquareKilometer"
) )
data object SquareMeter : Unit( data object SquareMeter : Unit(
nameResId = R.string.unit_area_square_meter, nameResId = R.string.unit_area_square_meter,
symbolResId = R.string.unit_area_square_meter_symbol, symbolResId = R.string.unit_area_square_meter_symbol,
factor = 1.0 factor = 1.0,
key = "SquareMeter"
) )
data object SquareCentimeter : Unit( data object SquareCentimeter : Unit(
nameResId = R.string.unit_area_square_centimeter, nameResId = R.string.unit_area_square_centimeter,
symbolResId = R.string.unit_area_square_centimeter_symbol, symbolResId = R.string.unit_area_square_centimeter_symbol,
factor = 0.0001 factor = 0.0001,
key = "SquareCentimeter"
) )
data object SquareMillimeter : Unit( data object SquareMillimeter : Unit(
nameResId = R.string.unit_area_square_millimeter, nameResId = R.string.unit_area_square_millimeter,
symbolResId = R.string.unit_area_square_millimeter_symbol, symbolResId = R.string.unit_area_square_millimeter_symbol,
factor = 0.000001 factor = 0.000001,
key = "SquareMillimeter"
) )
data object SquareMile : Unit( data object SquareMile : Unit(
nameResId = R.string.unit_area_square_mile, nameResId = R.string.unit_area_square_mile,
symbolResId = R.string.unit_area_square_mile_symbol, symbolResId = R.string.unit_area_square_mile_symbol,
factor = 2_589_988.110336 factor = 2_589_988.110336,
key = "SquareMile"
) )
data object SquareYard : Unit( data object SquareYard : Unit(
nameResId = R.string.unit_area_square_yard, nameResId = R.string.unit_area_square_yard,
symbolResId = R.string.unit_area_square_yard_symbol, symbolResId = R.string.unit_area_square_yard_symbol,
factor = 0.83612736 factor = 0.83612736,
key = "SquareYard"
) )
data object SquareFoot : Unit( data object SquareFoot : Unit(
nameResId = R.string.unit_area_square_foot, nameResId = R.string.unit_area_square_foot,
symbolResId = R.string.unit_area_square_foot_symbol, symbolResId = R.string.unit_area_square_foot_symbol,
factor = 0.09290304 factor = 0.09290304,
key = "SquareFoot"
) )
data object SquareInch : Unit( data object SquareInch : Unit(
nameResId = R.string.unit_area_square_inch, nameResId = R.string.unit_area_square_inch,
symbolResId = R.string.unit_area_square_inch_symbol, symbolResId = R.string.unit_area_square_inch_symbol,
factor = 0.00064516 factor = 0.00064516,
key = "SquareInch"
) )
data object Acre : Unit( data object Acre : Unit(
nameResId = R.string.unit_area_acre, nameResId = R.string.unit_area_acre,
symbolResId = R.string.unit_area_acre_symbol, symbolResId = R.string.unit_area_acre_symbol,
factor = 4_046.8564224 factor = 4_046.8564224,
key = "Acre"
) )
data object Hectare : Unit( data object Hectare : Unit(
nameResId = R.string.unit_area_hectare, nameResId = R.string.unit_area_hectare,
symbolResId = R.string.unit_area_hectare_symbol, symbolResId = R.string.unit_area_hectare_symbol,
factor = 10_000.0 factor = 10_000.0,
key = "Hectare"
) )
} }

View File

@ -21,6 +21,8 @@ interface Converter {
val defaultTopUnit: Unit val defaultTopUnit: Unit
val defaultBottomUnit: Unit val defaultBottomUnit: Unit
val key: String
fun convert(from: ValueWithUnit<Unit>, to: Unit): ValueWithUnit<Unit> { fun convert(from: ValueWithUnit<Unit>, to: Unit): ValueWithUnit<Unit> {
return ValueWithUnit(to.fromBase(from.unit.toBase(from.value)), to) return ValueWithUnit(to.fromBase(from.unit.toBase(from.value)), to)
} }
@ -28,7 +30,8 @@ interface Converter {
open class Unit( open class Unit(
val nameResId: Int, val nameResId: Int,
val symbolResId: Int, val symbolResId: Int,
val factor: Double val factor: Double,
val key: String
) { ) {
open fun toBase(value: Double) = value * factor open fun toBase(value: Double) = value * factor

View File

@ -5,102 +5,119 @@ import com.simplemobiletools.calculator.R
object LengthConverter : Converter { object LengthConverter : Converter {
override val nameResId: Int = R.string.unit_length override val nameResId: Int = R.string.unit_length
override val imageResId: Int = R.drawable.ic_height_vector override val imageResId: Int = R.drawable.ic_height_vector
override val key: String = "LengthConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
data object Kilometer : Unit( data object Kilometer : Unit(
nameResId = R.string.unit_length_kilometer, nameResId = R.string.unit_length_kilometer,
symbolResId = R.string.unit_length_kilometer_symbol, symbolResId = R.string.unit_length_kilometer_symbol,
factor = 1000.0 factor = 1000.0,
key = "Kilometer"
) )
data object Meter : Unit( data object Meter : Unit(
nameResId = R.string.unit_length_meter, nameResId = R.string.unit_length_meter,
symbolResId = R.string.unit_length_meter_symbol, symbolResId = R.string.unit_length_meter_symbol,
factor = 1.0 factor = 1.0,
key = "Meter"
) )
data object Centimeter : Unit( data object Centimeter : Unit(
nameResId = R.string.unit_length_centimeter, nameResId = R.string.unit_length_centimeter,
symbolResId = R.string.unit_length_centimeter_symbol, symbolResId = R.string.unit_length_centimeter_symbol,
factor = 0.01 factor = 0.01,
key = "Centimeter"
) )
data object Millimeter : Unit( data object Millimeter : Unit(
nameResId = R.string.unit_length_millimeter, nameResId = R.string.unit_length_millimeter,
symbolResId = R.string.unit_length_millimeter_symbol, symbolResId = R.string.unit_length_millimeter_symbol,
factor = 0.001 factor = 0.001,
key = "Millimeter"
) )
data object Micrometer : Unit( data object Micrometer : Unit(
nameResId = R.string.unit_length_micrometer, nameResId = R.string.unit_length_micrometer,
symbolResId = R.string.unit_length_micrometer_symbol, symbolResId = R.string.unit_length_micrometer_symbol,
factor = 0.000001 factor = 0.000001,
key = "Micrometer"
) )
data object Nanometer : Unit( data object Nanometer : Unit(
nameResId = R.string.unit_length_nanometer, nameResId = R.string.unit_length_nanometer,
symbolResId = R.string.unit_length_nanometer_symbol, symbolResId = R.string.unit_length_nanometer_symbol,
factor = 0.000000001 factor = 0.000000001,
key = "Nanometer"
) )
data object Angstrom : Unit( data object Angstrom : Unit(
nameResId = R.string.unit_length_angstrom, nameResId = R.string.unit_length_angstrom,
symbolResId = R.string.unit_length_angstrom_symbol, symbolResId = R.string.unit_length_angstrom_symbol,
factor = 1e-10 factor = 1e-10,
key = "Angstrom"
) )
data object Mile : Unit( data object Mile : Unit(
nameResId = R.string.unit_length_mile, nameResId = R.string.unit_length_mile,
symbolResId = R.string.unit_length_mile_symbol, symbolResId = R.string.unit_length_mile_symbol,
factor = 1_609.344 factor = 1_609.344,
key = "Mile"
) )
data object Yard : Unit( data object Yard : Unit(
nameResId = R.string.unit_length_yard, nameResId = R.string.unit_length_yard,
symbolResId = R.string.unit_length_yard_symbol, symbolResId = R.string.unit_length_yard_symbol,
factor = 0.9144 factor = 0.9144,
key = "Yard"
) )
data object Foot : Unit( data object Foot : Unit(
nameResId = R.string.unit_length_foot, nameResId = R.string.unit_length_foot,
symbolResId = R.string.unit_length_foot_symbol, symbolResId = R.string.unit_length_foot_symbol,
factor = 0.3048 factor = 0.3048,
key = "Foot"
) )
data object Inch : Unit( data object Inch : Unit(
nameResId = R.string.unit_length_inch, nameResId = R.string.unit_length_inch,
symbolResId = R.string.unit_length_inch_symbol, symbolResId = R.string.unit_length_inch_symbol,
factor = 0.0254 factor = 0.0254,
key = "Inch"
) )
data object Fathom : Unit( data object Fathom : Unit(
nameResId = R.string.unit_length_fathom, nameResId = R.string.unit_length_fathom,
symbolResId = R.string.unit_length_fathom_symbol, symbolResId = R.string.unit_length_fathom_symbol,
factor = 1.852 factor = 1.852,
key = "Fathom"
) )
data object NauticalMile : Unit( data object NauticalMile : Unit(
nameResId = R.string.unit_length_nautical_mile, nameResId = R.string.unit_length_nautical_mile,
symbolResId = R.string.unit_length_nautical_mile_symbol, symbolResId = R.string.unit_length_nautical_mile_symbol,
factor = 1_852.0 factor = 1_852.0,
key = "NauticalMile"
) )
data object AstronomicalUnit : Unit( data object AstronomicalUnit : Unit(
nameResId = R.string.unit_length_astronomical_unit, nameResId = R.string.unit_length_astronomical_unit,
symbolResId = R.string.unit_length_astronomical_unit_symbol, symbolResId = R.string.unit_length_astronomical_unit_symbol,
factor = 1.495979e+11 factor = 1.495979e+11,
key = "AstronomicalUnit"
) )
data object Parsec : Unit( data object Parsec : Unit(
nameResId = R.string.unit_length_parsec, nameResId = R.string.unit_length_parsec,
symbolResId = R.string.unit_length_parsec_symbol, symbolResId = R.string.unit_length_parsec_symbol,
factor = 3.0857e+16 factor = 3.0857e+16,
key = "Parsec"
) )
data object LightYear : Unit( data object LightYear : Unit(
nameResId = R.string.unit_length_light_year, nameResId = R.string.unit_length_light_year,
symbolResId = R.string.unit_length_light_year_symbol, symbolResId = R.string.unit_length_light_year_symbol,
factor = 9.4607e+15 factor = 9.4607e+15,
key = "LightYear"
) )
} }

View File

@ -5,90 +5,105 @@ import com.simplemobiletools.calculator.R
object MassConverter : Converter { object MassConverter : Converter {
override val nameResId: Int = R.string.unit_mass override val nameResId: Int = R.string.unit_mass
override val imageResId: Int = R.drawable.ic_scale_vector override val imageResId: Int = R.drawable.ic_scale_vector
override val key: String = "MassConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
data object Gram : Unit( data object Gram : Unit(
nameResId = R.string.unit_mass_gram, nameResId = R.string.unit_mass_gram,
symbolResId = R.string.unit_mass_gram_symbol, symbolResId = R.string.unit_mass_gram_symbol,
factor = 0.001 factor = 0.001,
key = "Gram"
) )
data object Kilogram : Unit( data object Kilogram : Unit(
nameResId = R.string.unit_mass_kilogram, nameResId = R.string.unit_mass_kilogram,
symbolResId = R.string.unit_mass_kilogram_symbol, symbolResId = R.string.unit_mass_kilogram_symbol,
factor = 1.0 factor = 1.0,
key = "Kilogram"
) )
data object Milligram : Unit( data object Milligram : Unit(
nameResId = R.string.unit_mass_milligram, nameResId = R.string.unit_mass_milligram,
symbolResId = R.string.unit_mass_milligram_symbol, symbolResId = R.string.unit_mass_milligram_symbol,
factor = 0.000001 factor = 0.000001,
key = "Milligram"
) )
data object Microgram : Unit( data object Microgram : Unit(
nameResId = R.string.unit_mass_microgram, nameResId = R.string.unit_mass_microgram,
symbolResId = R.string.unit_mass_microgram_symbol, symbolResId = R.string.unit_mass_microgram_symbol,
factor = 0.000000001 factor = 0.000000001,
key = "Microgram"
) )
data object Tonne : Unit( data object Tonne : Unit(
nameResId = R.string.unit_mass_tonne, nameResId = R.string.unit_mass_tonne,
symbolResId = R.string.unit_mass_tonne_symbol, symbolResId = R.string.unit_mass_tonne_symbol,
factor = 1_000.0 factor = 1_000.0,
key = "Tonne"
) )
data object Pound : Unit( data object Pound : Unit(
nameResId = R.string.unit_mass_pound, nameResId = R.string.unit_mass_pound,
symbolResId = R.string.unit_mass_pound_symbol, symbolResId = R.string.unit_mass_pound_symbol,
factor = 0.45359237 factor = 0.45359237,
key = "Pound"
) )
data object Ounce : Unit( data object Ounce : Unit(
nameResId = R.string.unit_mass_ounce, nameResId = R.string.unit_mass_ounce,
symbolResId = R.string.unit_mass_ounce_symbol, symbolResId = R.string.unit_mass_ounce_symbol,
factor = 0.028349523125 factor = 0.028349523125,
key = "Ounce"
) )
data object Grain : Unit( data object Grain : Unit(
nameResId = R.string.unit_mass_grain, nameResId = R.string.unit_mass_grain,
symbolResId = R.string.unit_mass_grain_symbol, symbolResId = R.string.unit_mass_grain_symbol,
factor = 0.00006479891 factor = 0.00006479891,
key = "Grain"
) )
data object Dram : Unit( data object Dram : Unit(
nameResId = R.string.unit_mass_dram, nameResId = R.string.unit_mass_dram,
symbolResId = R.string.unit_mass_dram_symbol, symbolResId = R.string.unit_mass_dram_symbol,
factor = 0.0017718451953125 factor = 0.0017718451953125,
key = "Dram"
) )
data object Stone : Unit( data object Stone : Unit(
nameResId = R.string.unit_mass_stone, nameResId = R.string.unit_mass_stone,
symbolResId = R.string.unit_mass_stone_symbol, symbolResId = R.string.unit_mass_stone_symbol,
factor = 6.35029318 factor = 6.35029318,
key = "Stone"
) )
data object LongTon : Unit( data object LongTon : Unit(
nameResId = R.string.unit_mass_long_ton, nameResId = R.string.unit_mass_long_ton,
symbolResId = R.string.unit_mass_long_ton_symbol, symbolResId = R.string.unit_mass_long_ton_symbol,
factor = 1_016.0469088 factor = 1_016.0469088,
key = "LongTon"
) )
data object ShortTon : Unit( data object ShortTon : Unit(
nameResId = R.string.unit_mass_short_ton, nameResId = R.string.unit_mass_short_ton,
symbolResId = R.string.unit_mass_short_ton_symbol, symbolResId = R.string.unit_mass_short_ton_symbol,
factor = 907.18474 factor = 907.18474,
key = "ShortTon"
) )
data object Carat : Unit( data object Carat : Unit(
nameResId = R.string.unit_mass_carat, nameResId = R.string.unit_mass_carat,
symbolResId = R.string.unit_mass_carat_symbol, symbolResId = R.string.unit_mass_carat_symbol,
factor = 0.0002051965483 factor = 0.0002051965483,
key = "Carat"
) )
data object CaratMetric : Unit( data object CaratMetric : Unit(
nameResId = R.string.unit_mass_carat_metric, nameResId = R.string.unit_mass_carat_metric,
symbolResId = R.string.unit_mass_carat_metric_symbol, symbolResId = R.string.unit_mass_carat_metric_symbol,
factor = 0.0002 factor = 0.0002,
key = "CaratMetric"
) )
} }

View File

@ -5,13 +5,15 @@ import com.simplemobiletools.calculator.R
object TemperatureConverter : Converter { object TemperatureConverter : Converter {
override val nameResId: Int = R.string.unit_temperature override val nameResId: Int = R.string.unit_temperature
override val imageResId: Int = R.drawable.ic_thermostat_vector override val imageResId: Int = R.drawable.ic_thermostat_vector
override val key: String = "TemperatureConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
data object Celsius : Unit( data object Celsius : Unit(
nameResId = R.string.unit_temperature_celsius, nameResId = R.string.unit_temperature_celsius,
symbolResId = R.string.unit_temperature_celsius_symbol, symbolResId = R.string.unit_temperature_celsius_symbol,
factor = 1.0 factor = 1.0,
key = "Celsius"
) { ) {
const val KELVIN_OFFSET = 273.15 const val KELVIN_OFFSET = 273.15
@ -22,7 +24,8 @@ object TemperatureConverter : Converter {
data object Fahrenheit : Unit( data object Fahrenheit : Unit(
nameResId = R.string.unit_temperature_fahrenheit, nameResId = R.string.unit_temperature_fahrenheit,
symbolResId = R.string.unit_temperature_fahrenheit_symbol, symbolResId = R.string.unit_temperature_fahrenheit_symbol,
factor = 9.0 / 5 factor = 9.0 / 5,
key = "Fahrenheit"
) { ) {
private const val CELSIUS_OFFSET = 32 private const val CELSIUS_OFFSET = 32
@ -34,13 +37,15 @@ object TemperatureConverter : Converter {
data object Rankine : Unit( data object Rankine : Unit(
nameResId = R.string.unit_temperature_rankine, nameResId = R.string.unit_temperature_rankine,
symbolResId = R.string.unit_temperature_rankine_symbol, symbolResId = R.string.unit_temperature_rankine_symbol,
factor = 5.0 / 9 factor = 5.0 / 9,
key = "Rankine"
) )
data object Kelvin : Unit( data object Kelvin : Unit(
nameResId = R.string.unit_temperature_kelvin, nameResId = R.string.unit_temperature_kelvin,
symbolResId = R.string.unit_temperature_kelvin_symbol, symbolResId = R.string.unit_temperature_kelvin_symbol,
factor = 1.0 factor = 1.0,
key = "Kelvin"
) )
} }

View File

@ -5,8 +5,9 @@ import com.simplemobiletools.calculator.R
object TimeConverter : Converter { object TimeConverter : Converter {
override val nameResId: Int = R.string.unit_time override val nameResId: Int = R.string.unit_time
override val imageResId: Int = com.simplemobiletools.commons.R.drawable.ic_clock_vector override val imageResId: Int = com.simplemobiletools.commons.R.drawable.ic_clock_vector
override val key: String = "TimeConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
companion object { companion object {
private const val MINUTE = 60.0 private const val MINUTE = 60.0
private const val HOUR = 60.0 * MINUTE private const val HOUR = 60.0 * MINUTE
@ -17,43 +18,50 @@ object TimeConverter : Converter {
data object Hour : Unit( data object Hour : Unit(
nameResId = R.string.unit_time_hour, nameResId = R.string.unit_time_hour,
symbolResId = R.string.unit_time_hour_symbol, symbolResId = R.string.unit_time_hour_symbol,
factor = HOUR factor = HOUR,
key = "Hour"
) )
data object Minute : Unit( data object Minute : Unit(
nameResId = R.string.unit_time_minute, nameResId = R.string.unit_time_minute,
symbolResId = R.string.unit_time_minute_symbol, symbolResId = R.string.unit_time_minute_symbol,
factor = MINUTE factor = MINUTE,
key = "Minute"
) )
data object Second : Unit( data object Second : Unit(
nameResId = R.string.unit_time_second, nameResId = R.string.unit_time_second,
symbolResId = R.string.unit_time_second_symbol, symbolResId = R.string.unit_time_second_symbol,
factor = 1.0 factor = 1.0,
key = "Second"
) )
data object Millisecond : Unit( data object Millisecond : Unit(
nameResId = R.string.unit_time_millisecond, nameResId = R.string.unit_time_millisecond,
symbolResId = R.string.unit_time_millisecond_symbol, symbolResId = R.string.unit_time_millisecond_symbol,
factor = 0.001 factor = 0.001,
key = "Millisecond"
) )
data object Day : Unit( data object Day : Unit(
nameResId = R.string.unit_time_day, nameResId = R.string.unit_time_day,
symbolResId = R.string.unit_time_day_symbol, symbolResId = R.string.unit_time_day_symbol,
factor = DAY factor = DAY,
key = "Day"
) )
data object Week : Unit( data object Week : Unit(
nameResId = R.string.unit_time_week, nameResId = R.string.unit_time_week,
symbolResId = R.string.unit_time_week_symbol, symbolResId = R.string.unit_time_week_symbol,
factor = DAY * 7 factor = DAY * 7,
key = "Week"
) )
data object Year : Unit( data object Year : Unit(
nameResId = R.string.unit_time_year, nameResId = R.string.unit_time_year,
symbolResId = R.string.unit_time_year_symbol, symbolResId = R.string.unit_time_year_symbol,
factor = GREGORIAN_YEAR factor = GREGORIAN_YEAR,
key = "Year"
) )
} }

View File

@ -5,144 +5,168 @@ import com.simplemobiletools.calculator.R
object VolumeConverter : Converter { object VolumeConverter : Converter {
override val nameResId: Int = R.string.unit_volume override val nameResId: Int = R.string.unit_volume
override val imageResId: Int = R.drawable.ic_drop_vector override val imageResId: Int = R.drawable.ic_drop_vector
override val key: String = "VolumeConverter"
sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double) : Converter.Unit(nameResId, symbolResId, factor) { sealed class Unit(nameResId: Int, symbolResId: Int, factor: Double, key: String) : Converter.Unit(nameResId, symbolResId, factor, key) {
data object CubicMeter : Unit( data object CubicMeter : Unit(
nameResId = R.string.unit_volume_cubic_meter, nameResId = R.string.unit_volume_cubic_meter,
symbolResId = R.string.unit_volume_cubic_meter_symbol, symbolResId = R.string.unit_volume_cubic_meter_symbol,
factor = 1.0 factor = 1.0,
key = "CubicMeter"
) )
data object CubicDecimeter : Unit( data object CubicDecimeter : Unit(
nameResId = R.string.unit_volume_cubic_decimeter, nameResId = R.string.unit_volume_cubic_decimeter,
symbolResId = R.string.unit_volume_cubic_decimeter_symbol, symbolResId = R.string.unit_volume_cubic_decimeter_symbol,
factor = 0.001 factor = 0.001,
key = "CubicDecimeter"
) )
data object CubicCentimeter : Unit( data object CubicCentimeter : Unit(
nameResId = R.string.unit_volume_cubic_centimeter, nameResId = R.string.unit_volume_cubic_centimeter,
symbolResId = R.string.unit_volume_cubic_centimeter_symbol, symbolResId = R.string.unit_volume_cubic_centimeter_symbol,
factor = 0.000001 factor = 0.000001,
key = "CubicCentimeter"
) )
data object CubicMillimeter : Unit( data object CubicMillimeter : Unit(
nameResId = R.string.unit_volume_cubic_millimeter, nameResId = R.string.unit_volume_cubic_millimeter,
symbolResId = R.string.unit_volume_cubic_millimeter_symbol, symbolResId = R.string.unit_volume_cubic_millimeter_symbol,
factor = 0.000000001 factor = 0.000000001,
key = "CubicMillimeter"
) )
data object Liter : Unit( data object Liter : Unit(
nameResId = R.string.unit_volume_liter, nameResId = R.string.unit_volume_liter,
symbolResId = R.string.unit_volume_liter_symbol, symbolResId = R.string.unit_volume_liter_symbol,
factor = 0.001 factor = 0.001,
key = "Liter"
) )
data object Centiliter : Unit( data object Centiliter : Unit(
nameResId = R.string.unit_volume_centiliter, nameResId = R.string.unit_volume_centiliter,
symbolResId = R.string.unit_volume_centiliter_symbol, symbolResId = R.string.unit_volume_centiliter_symbol,
factor = 0.0001 factor = 0.0001,
key = "Centiliter"
) )
data object Deciliter : Unit( data object Deciliter : Unit(
nameResId = R.string.unit_volume_deciliter, nameResId = R.string.unit_volume_deciliter,
symbolResId = R.string.unit_volume_deciliter_symbol, symbolResId = R.string.unit_volume_deciliter_symbol,
factor = 0.00001 factor = 0.00001,
key = "Deciliter"
) )
data object Milliliter : Unit( data object Milliliter : Unit(
nameResId = R.string.unit_volume_milliliter, nameResId = R.string.unit_volume_milliliter,
symbolResId = R.string.unit_volume_milliliter_symbol, symbolResId = R.string.unit_volume_milliliter_symbol,
factor = 0.000001 factor = 0.000001,
key = "Milliliter"
) )
data object AcreFoot : Unit( data object AcreFoot : Unit(
nameResId = R.string.unit_volume_acre_foot, nameResId = R.string.unit_volume_acre_foot,
symbolResId = R.string.unit_volume_acre_foot_symbol, symbolResId = R.string.unit_volume_acre_foot_symbol,
factor = 1_233.48183754752 factor = 1_233.48183754752,
key = "AcreFoot"
) )
data object CubicFoot : Unit( data object CubicFoot : Unit(
nameResId = R.string.unit_volume_cubic_foot, nameResId = R.string.unit_volume_cubic_foot,
symbolResId = R.string.unit_volume_cubic_foot_symbol, symbolResId = R.string.unit_volume_cubic_foot_symbol,
factor = 0.028316846592 factor = 0.028316846592,
key = "CubicFoot"
) )
data object CubicInch : Unit( data object CubicInch : Unit(
nameResId = R.string.unit_volume_cubic_inch, nameResId = R.string.unit_volume_cubic_inch,
symbolResId = R.string.unit_volume_cubic_inch_symbol, symbolResId = R.string.unit_volume_cubic_inch_symbol,
factor = 0.000016387064 factor = 0.000016387064,
key = "CubicInch"
) )
data object BarrelUS : Unit( data object BarrelUS : Unit(
nameResId = R.string.unit_volume_barrel_us, nameResId = R.string.unit_volume_barrel_us,
symbolResId = R.string.unit_volume_barrel_us_symbol, symbolResId = R.string.unit_volume_barrel_us_symbol,
factor = 0.119240471196 factor = 0.119240471196,
key = "BarrelUS"
) )
data object GallonUS : Unit( data object GallonUS : Unit(
nameResId = R.string.unit_volume_gallon_us, nameResId = R.string.unit_volume_gallon_us,
symbolResId = R.string.unit_volume_gallon_us_symbol, symbolResId = R.string.unit_volume_gallon_us_symbol,
factor = 0.003785411784 factor = 0.003785411784,
key = "GallonUS"
) )
data object QuartUS : Unit( data object QuartUS : Unit(
nameResId = R.string.unit_volume_quart_us, nameResId = R.string.unit_volume_quart_us,
symbolResId = R.string.unit_volume_quart_us_symbol, symbolResId = R.string.unit_volume_quart_us_symbol,
factor = 0.000946352946 factor = 0.000946352946,
key = "QuartUS"
) )
data object PintUS : Unit( data object PintUS : Unit(
nameResId = R.string.unit_volume_pint_us, nameResId = R.string.unit_volume_pint_us,
symbolResId = R.string.unit_volume_pint_us_symbol, symbolResId = R.string.unit_volume_pint_us_symbol,
factor = 0.000473176473 factor = 0.000473176473,
key = "PintUS"
) )
data object GillUS : Unit( data object GillUS : Unit(
nameResId = R.string.unit_volume_gill_us, nameResId = R.string.unit_volume_gill_us,
symbolResId = R.string.unit_volume_gill_us_symbol, symbolResId = R.string.unit_volume_gill_us_symbol,
factor = 0.00011829411825 factor = 0.00011829411825,
key = "GillUS"
) )
data object FluidOunceUS : Unit( data object FluidOunceUS : Unit(
nameResId = R.string.unit_volume_fluid_ounce_us, nameResId = R.string.unit_volume_fluid_ounce_us,
symbolResId = R.string.unit_volume_fluid_ounce_us_symbol, symbolResId = R.string.unit_volume_fluid_ounce_us_symbol,
factor = 0.00003 factor = 0.00003,
key = "FluidOunceUS"
) )
data object BarrelImperial : Unit( data object BarrelImperial : Unit(
nameResId = R.string.unit_volume_barrel_imperial, nameResId = R.string.unit_volume_barrel_imperial,
symbolResId = R.string.unit_volume_barrel_imperial_symbol, symbolResId = R.string.unit_volume_barrel_imperial_symbol,
factor = 0.16365924 factor = 0.16365924,
key = "BarrelImperial"
) )
data object GallonImperial : Unit( data object GallonImperial : Unit(
nameResId = R.string.unit_volume_gallon_imperial, nameResId = R.string.unit_volume_gallon_imperial,
symbolResId = R.string.unit_volume_gallon_imperial_symbol, symbolResId = R.string.unit_volume_gallon_imperial_symbol,
factor = 0.00454609 factor = 0.00454609,
key = "GallonImperial"
) )
data object QuartImperial : Unit( data object QuartImperial : Unit(
nameResId = R.string.unit_volume_quart_imperial, nameResId = R.string.unit_volume_quart_imperial,
symbolResId = R.string.unit_volume_quart_imperial_symbol, symbolResId = R.string.unit_volume_quart_imperial_symbol,
factor = 0.0011365225 factor = 0.0011365225,
key = "QuartImperial"
) )
data object PintImperial : Unit( data object PintImperial : Unit(
nameResId = R.string.unit_volume_pint_imperial, nameResId = R.string.unit_volume_pint_imperial,
symbolResId = R.string.unit_volume_pint_imperial_symbol, symbolResId = R.string.unit_volume_pint_imperial_symbol,
factor = 0.00056826125 factor = 0.00056826125,
key = "PintImperial"
) )
data object GillImperial : Unit( data object GillImperial : Unit(
nameResId = R.string.unit_volume_gill_imperial, nameResId = R.string.unit_volume_gill_imperial,
symbolResId = R.string.unit_volume_gill_imperial_symbol, symbolResId = R.string.unit_volume_gill_imperial_symbol,
factor = 0.0001420653125 factor = 0.0001420653125,
key = "GillImperial"
) )
data object FluidOunceImperial : Unit( data object FluidOunceImperial : Unit(
nameResId = R.string.unit_volume_fluid_ounce_imperial, nameResId = R.string.unit_volume_fluid_ounce_imperial,
symbolResId = R.string.unit_volume_fluid_ounce_imperial_symbol, symbolResId = R.string.unit_volume_fluid_ounce_imperial_symbol,
factor = 0.0000284130625 factor = 0.0000284130625,
key = "FluidOunceImperial"
) )
} }

View File

@ -0,0 +1,8 @@
package com.simplemobiletools.calculator.models
import com.simplemobiletools.calculator.helpers.converters.Converter
data class ConverterUnitsState(
val topUnit: Converter.Unit,
val bottomUnit: Converter.Unit,
)

View File

@ -14,6 +14,7 @@ import androidx.core.content.res.ResourcesCompat
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.simplemobiletools.calculator.R import com.simplemobiletools.calculator.R
import com.simplemobiletools.calculator.databinding.ViewConverterBinding import com.simplemobiletools.calculator.databinding.ViewConverterBinding
import com.simplemobiletools.calculator.extensions.config
import com.simplemobiletools.calculator.helpers.* import com.simplemobiletools.calculator.helpers.*
import com.simplemobiletools.calculator.helpers.converters.Converter import com.simplemobiletools.calculator.helpers.converters.Converter
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
@ -243,6 +244,7 @@ class ConverterView @JvmOverloads constructor(
updateBottomValue() updateBottomValue()
} }
updateUnitLabelsAndSymbols() updateUnitLabelsAndSymbols()
context.config.putLastConverterUnits(converter!!, topUnit!!, bottomUnit!!)
} }
} }
} }
@ -254,9 +256,15 @@ class ConverterView @JvmOverloads constructor(
} }
fun restoreFromSavedState(state: Bundle) { fun restoreFromSavedState(state: Bundle) {
topUnit = converter!!.units[state.getInt(TOP_UNIT)]
bottomUnit = converter!!.units[state.getInt(BOTTOM_UNIT)]
binding.topUnitText.text = state.getString(CONVERTER_VALUE) binding.topUnitText.text = state.getString(CONVERTER_VALUE)
val storedTopUnit = converter!!.units[state.getInt(TOP_UNIT)]
val storedBottomUnit = converter!!.units[state.getInt(BOTTOM_UNIT)]
updateUnits(storedTopUnit, storedBottomUnit)
}
fun updateUnits(newTopUnit: Converter.Unit, newBottomUnit: Converter.Unit) {
topUnit = newTopUnit
bottomUnit = newBottomUnit
updateBottomValue() updateBottomValue()
updateUnitLabelsAndSymbols() updateUnitLabelsAndSymbols()