| /** |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * ``` |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * ``` |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.android.healthconnect.controller.dataentries.units |
| |
| import android.content.Context |
| import android.content.SharedPreferences |
| import androidx.preference.PreferenceManager |
| import com.android.healthconnect.controller.dataentries.units.DistanceUnit.KILOMETERS |
| import com.android.healthconnect.controller.dataentries.units.EnergyUnit.CALORIE |
| import com.android.healthconnect.controller.dataentries.units.EnergyUnit.valueOf |
| import com.android.healthconnect.controller.dataentries.units.HeightUnit.CENTIMETERS |
| import com.android.healthconnect.controller.dataentries.units.TemperatureUnit.FAHRENHEIT |
| import com.android.healthconnect.controller.dataentries.units.WeightUnit.POUND |
| import com.google.common.annotations.VisibleForTesting |
| import dagger.hilt.android.qualifiers.ApplicationContext |
| import javax.inject.Inject |
| import javax.inject.Singleton |
| |
| /** Preferences wrapper for health data units. */ |
| @Singleton |
| class UnitPreferences @Inject constructor(@ApplicationContext private val context: Context) { |
| |
| companion object { |
| const val DISTANCE_UNIT_PREF_KEY = "DISTANCE_UNIT_KEY" |
| const val HEIGHT_UNIT_PREF_KEY = "HEIGHT_UNIT_KEY" |
| const val WEIGHT_UNIT_PREF_KEY = "WEIGHT_UNIT_KEY" |
| const val ENERGY_UNIT_PREF_KEY = "ENERGY_UNIT_KEY" |
| const val TEMPERATURE_UNIT_PREF_KEY = "TEMPERATURE_UNIT_KEY" |
| |
| @VisibleForTesting val DEFAULT_DISTANCE_UNIT = KILOMETERS |
| @VisibleForTesting val DEFAULT_HEIGHT_UNIT = CENTIMETERS |
| @VisibleForTesting val DEFAULT_WEIGHT_UNIT = POUND |
| @VisibleForTesting val DEFAULT_ENERGY_UNIT = CALORIE |
| @VisibleForTesting val DEFAULT_TEMPERATURE_UNIT = FAHRENHEIT |
| } |
| |
| private val unitSharedPreference: SharedPreferences by lazy { |
| PreferenceManager.getDefaultSharedPreferences(context) |
| } |
| |
| fun getDistanceUnit(): DistanceUnit { |
| if (!unitSharedPreference.contains(DISTANCE_UNIT_PREF_KEY)) { |
| setDistanceUnit(DEFAULT_DISTANCE_UNIT) |
| return DEFAULT_DISTANCE_UNIT |
| } |
| val unitString = |
| unitSharedPreference.getString( |
| DISTANCE_UNIT_PREF_KEY, DEFAULT_DISTANCE_UNIT.toString())!! |
| return DistanceUnit.valueOf(unitString) |
| } |
| |
| fun setDistanceUnit(distanceUnit: DistanceUnit) { |
| with(unitSharedPreference.edit()) { |
| putString(DISTANCE_UNIT_PREF_KEY, distanceUnit.toString()) |
| apply() |
| } |
| } |
| |
| fun getHeightUnit(): HeightUnit { |
| if (!unitSharedPreference.contains(HEIGHT_UNIT_PREF_KEY)) { |
| setHeightUnit(DEFAULT_HEIGHT_UNIT) |
| return DEFAULT_HEIGHT_UNIT |
| } |
| val unitString = |
| unitSharedPreference.getString(HEIGHT_UNIT_PREF_KEY, DEFAULT_HEIGHT_UNIT.toString())!! |
| return HeightUnit.valueOf(unitString) |
| } |
| |
| fun setHeightUnit(heightUnit: HeightUnit) { |
| with(unitSharedPreference.edit()) { |
| putString(HEIGHT_UNIT_PREF_KEY, heightUnit.toString()) |
| apply() |
| } |
| } |
| |
| fun getWeightUnit(): WeightUnit { |
| if (!unitSharedPreference.contains(WEIGHT_UNIT_PREF_KEY)) { |
| setWeightUnit(DEFAULT_WEIGHT_UNIT) |
| return DEFAULT_WEIGHT_UNIT |
| } |
| val unitString = |
| unitSharedPreference.getString(WEIGHT_UNIT_PREF_KEY, DEFAULT_WEIGHT_UNIT.toString())!! |
| return WeightUnit.valueOf(unitString) |
| } |
| |
| fun setWeightUnit(weightUnit: WeightUnit) { |
| with(unitSharedPreference.edit()) { |
| putString(WEIGHT_UNIT_PREF_KEY, weightUnit.toString()) |
| apply() |
| } |
| } |
| |
| fun getEnergyUnit(): EnergyUnit { |
| if (!unitSharedPreference.contains(ENERGY_UNIT_PREF_KEY)) { |
| setEnergyUnit(DEFAULT_ENERGY_UNIT) |
| return DEFAULT_ENERGY_UNIT |
| } |
| val unitString = |
| unitSharedPreference.getString(ENERGY_UNIT_PREF_KEY, DEFAULT_ENERGY_UNIT.toString())!! |
| return valueOf(unitString) |
| } |
| |
| fun setEnergyUnit(energyUnit: EnergyUnit) { |
| with(unitSharedPreference.edit()) { |
| putString(ENERGY_UNIT_PREF_KEY, energyUnit.toString()) |
| apply() |
| } |
| } |
| |
| fun getTemperatureUnit(): TemperatureUnit { |
| if (!unitSharedPreference.contains(TEMPERATURE_UNIT_PREF_KEY)) { |
| setTemperatureUnit(DEFAULT_TEMPERATURE_UNIT) |
| return DEFAULT_TEMPERATURE_UNIT |
| } |
| val unitString = |
| unitSharedPreference.getString( |
| TEMPERATURE_UNIT_PREF_KEY, DEFAULT_TEMPERATURE_UNIT.toString())!! |
| return TemperatureUnit.valueOf(unitString) |
| } |
| |
| fun setTemperatureUnit(temperatureUnit: TemperatureUnit) { |
| with(unitSharedPreference.edit()) { |
| putString(TEMPERATURE_UNIT_PREF_KEY, temperatureUnit.toString()) |
| apply() |
| } |
| } |
| } |
| |
| interface UnitPreference |
| |
| enum class DistanceUnit : UnitPreference { |
| KILOMETERS, |
| MILES |
| } |
| |
| enum class HeightUnit : UnitPreference { |
| CENTIMETERS, |
| FEET |
| } |
| |
| enum class WeightUnit : UnitPreference { |
| POUND, |
| KILOGRAM, |
| STONE |
| } |
| |
| enum class EnergyUnit : UnitPreference { |
| CALORIE, |
| KILOJOULE |
| } |
| |
| enum class TemperatureUnit : UnitPreference { |
| CELSIUS, |
| FAHRENHEIT, |
| KELVIN |
| } |