diff --git a/app/src/main/java/com/dzeio/openhealth/Settings.kt b/app/src/main/java/com/dzeio/openhealth/Settings.kt index 4425338..8b4b0d8 100644 --- a/app/src/main/java/com/dzeio/openhealth/Settings.kt +++ b/app/src/main/java/com/dzeio/openhealth/Settings.kt @@ -22,4 +22,9 @@ object Settings { const val WEIGHT_GOAL = "com.dzeio.open-health.weight.goal" + /** + * format in which the weight the user want it to be displayed as + */ + const val MASS_UNIT = "com.dzeio.open-health.unit.mass" + } diff --git a/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt b/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt index 78e54a7..b4f2da7 100644 --- a/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt +++ b/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt @@ -6,11 +6,11 @@ import com.dzeio.openhealth.core.BaseAdapter import com.dzeio.openhealth.core.BaseViewHolder import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.databinding.LayoutItemListBinding -import com.dzeio.openhealth.units.WeightUnit +import com.dzeio.openhealth.units.Units class WeightAdapter : BaseAdapter() { - var unit: WeightUnit = WeightUnit.KG + var unit: Units.Mass = Units.Mass.KILOGRAM override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> LayoutItemListBinding get() = LayoutItemListBinding::inflate @@ -22,8 +22,11 @@ class WeightAdapter : BaseAdapter() { item: Weight, position: Int ) { - val weightTxt = String.format("%.1f", item.weight * unit.fromKG) - holder.binding.value.text = "$weightTxt${unit.unit}" + + + + holder.binding.value.text = + holder.itemView.context.getString(unit.unit, unit.formatToString(item.weight)) holder.binding.datetime.text = item.formatTimestamp() holder.binding.edit.setOnClickListener { onItemClick?.invoke(item) diff --git a/app/src/main/java/com/dzeio/openhealth/data/step/StepSource.kt b/app/src/main/java/com/dzeio/openhealth/data/step/StepSource.kt index f8a2d1e..5812741 100644 --- a/app/src/main/java/com/dzeio/openhealth/data/step/StepSource.kt +++ b/app/src/main/java/com/dzeio/openhealth/data/step/StepSource.kt @@ -76,6 +76,7 @@ class StepSource( timeSinceLastRecord = timeSinceLastBoot runBlocking { + // keep check because shit as already happened where it send an event even before it is set if (events != null) { events.send(diff) } @@ -87,4 +88,4 @@ class StepSource( override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { Log.d(TAG, "[Accuracy changed]: Sensor: $sensor, Accuracy: $accuracy") } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dzeio/openhealth/data/weight/Weight.kt b/app/src/main/java/com/dzeio/openhealth/data/weight/Weight.kt index 032eafb..ed4c280 100644 --- a/app/src/main/java/com/dzeio/openhealth/data/weight/Weight.kt +++ b/app/src/main/java/com/dzeio/openhealth/data/weight/Weight.kt @@ -10,10 +10,13 @@ import java.text.DateFormat.getDateInstance data class Weight( @PrimaryKey(autoGenerate = true) var id: Long = 0, + /** + * Store the weight in kilograms + */ var weight: Float = 0f, @ColumnInfo(index = true) var timestamp: Long = System.currentTimeMillis(), var source: String = "" ) { fun formatTimestamp(): String = getDateInstance().format(Date(timestamp)); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseFragment.kt index c62e087..ca334cc 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseFragment.kt @@ -90,5 +90,12 @@ class BrowseFragment : binding.stepsText.setText("$it of xxx steps") } + viewModel.weight.observe(viewLifecycleOwner) { + binding.weightText.setText(String.format( + resources.getString(R.string.weight_current), + it + )) + } + } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseViewModel.kt index 7fd10d0..9a3d215 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/browse/BrowseViewModel.kt @@ -5,21 +5,36 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.dzeio.openhealth.core.BaseViewModel import com.dzeio.openhealth.data.step.StepRepository +import com.dzeio.openhealth.data.weight.WeightRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class BrowseViewModel @Inject internal constructor( - stepRepository: StepRepository + stepRepository: StepRepository, + weightRepository: WeightRepository ) : BaseViewModel() { private val _steps = MutableLiveData(0) val steps: LiveData = _steps + private val _weight = MutableLiveData(0f) + val weight: LiveData = _weight + init { viewModelScope.launch { _steps.postValue(stepRepository.todaySteps()) } + + viewModelScope.launch { + weightRepository.lastWeight().collectLatest { + if (it == null) { + return@collectLatest + } + _weight.postValue(it.weight) + } + } } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt index 4fd89ca..d8fd44d 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt @@ -7,7 +7,6 @@ import android.graphics.Canvas import android.graphics.RectF import android.view.LayoutInflater import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager import com.dzeio.openhealth.core.BaseFragment @@ -15,13 +14,12 @@ import com.dzeio.openhealth.data.water.Water import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.databinding.FragmentHomeBinding import com.dzeio.openhealth.graphs.WeightChart -import com.dzeio.openhealth.ui.weight.AddWeightDialog +import com.dzeio.openhealth.ui.weight.WeightDialog import com.dzeio.openhealth.units.UnitFactory import com.dzeio.openhealth.utils.DrawUtils import com.dzeio.openhealth.utils.GraphUtils import com.google.android.material.color.MaterialColors import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collectLatest import kotlin.math.max import kotlin.math.min @@ -39,7 +37,11 @@ class HomeFragment : BaseFragment(HomeViewMo super.onStart() // Bindings binding.addWeight.setOnClickListener { - AddWeightDialog().show(requireActivity().supportFragmentManager, null) + findNavController().navigate( + HomeFragmentDirections.actionNavHomeToNavWeightDialog( + WeightDialog.DialogTypes.ADD_WEIGHT.ordinal + ) + ) } binding.fragmentHomeWaterAdd.setOnClickListener { @@ -94,13 +96,6 @@ class HomeFragment : BaseFragment(HomeViewMo ) ) - lifecycleScope.launchWhenStarted { - viewModel.fetchWeights().collectLatest { - updateGraph(it) - } - updateWater(0) - } - viewModel.water.observe(viewLifecycleOwner) { if (it != null) { updateWater(it.value) @@ -109,13 +104,18 @@ class HomeFragment : BaseFragment(HomeViewMo } } - viewModel.goalWeight.observe(viewLifecycleOwner) { - lifecycleScope.launchWhenStarted { - viewModel.fetchWeights().collectLatest { - updateGraph(it) - } + viewModel.weights.observe(viewLifecycleOwner) { + if (it != null) { + updateGraph(it) } + } + viewModel.goalWeight.observe(viewLifecycleOwner) { + if (viewModel.weights.value != null) updateGraph(viewModel.weights.value!!) + } + + viewModel.massUnit.observe(viewLifecycleOwner) { + if (viewModel.weights.value != null) updateGraph(viewModel.weights.value!!) } } @@ -124,7 +124,7 @@ class HomeFragment : BaseFragment(HomeViewMo binding.weightGraph, requireView(), list, - viewModel.weightUnit, + viewModel.massUnit.value!!, viewModel.goalWeight.value ) diff --git a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt index 3617ab4..eaa3b5e 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt @@ -1,11 +1,9 @@ package com.dzeio.openhealth.ui.home import android.content.SharedPreferences -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import com.dzeio.openhealth.Application.Companion.TAG import com.dzeio.openhealth.Settings import com.dzeio.openhealth.core.BaseViewModel import com.dzeio.openhealth.data.water.Water @@ -13,6 +11,7 @@ import com.dzeio.openhealth.data.water.WaterRepository import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.data.weight.WeightRepository import com.dzeio.openhealth.units.UnitFactory +import com.dzeio.openhealth.units.Units import com.dzeio.openhealth.utils.Configuration import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collectLatest @@ -30,13 +29,16 @@ class HomeViewModel @Inject internal constructor( private val _water = MutableLiveData(null) val water: LiveData = _water + private val _weights = MutableLiveData?>(null) + val weights: LiveData?> = _weights + var waterCupSize = settings.getInt("water_cup_size", 200) var waterUnit = UnitFactory.volume(settings.getString("water_unit", "milliliter") ?: "Milliliter") - var weightUnit = - UnitFactory.mass(settings.getString("weight_unit", "kilogram") ?: "kilogram") + private val _massUnit = MutableLiveData(Units.Mass.KILOGRAM) + val massUnit: LiveData = _massUnit val goalWeight = config.getFloat(Settings.WEIGHT_GOAL).toLiveData() @@ -47,16 +49,23 @@ class HomeViewModel @Inject internal constructor( init { viewModelScope.launch { waterRepository.todayWater().collectLatest { - _water.value = it + _water.postValue(it) } } - // don't listen for prefs changes - settings.registerOnSharedPreferenceChangeListener { _, key -> - Log.d(TAG, "Pref changed: $key") - when (key) { - "water_cup_size" -> { - waterCupSize = settings.getInt("water_cup_size", 200) - } + + viewModelScope.launch { + weightRepository.getWeights().collectLatest { + _weights.postValue(it) + } + } + + config.getString(Settings.MASS_UNIT).apply { + addObserver { + if (it == null) return@addObserver + _massUnit.postValue(Units.Mass.find(it)) + } + if (value != null) { + _massUnit.postValue(Units.Mass.find(value!!)) } } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt index ed6b593..856dfad 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt @@ -13,14 +13,21 @@ import com.dzeio.openhealth.Application import com.dzeio.openhealth.BuildConfig import com.dzeio.openhealth.R import com.dzeio.openhealth.Settings -import com.dzeio.openhealth.units.UnitFactory +import com.dzeio.openhealth.units.Units +import com.dzeio.openhealth.utils.Configuration import com.dzeio.openhealth.utils.LocaleUtils +import dagger.hilt.android.AndroidEntryPoint import java.util.Locale +import javax.inject.Inject +@AndroidEntryPoint class SettingsFragment : PreferenceFragmentCompat() { + @Inject + lateinit var config: Configuration + private companion object { - const val TAG = "${Application.TAG}/SettingsFragment" + const val TAG = "${Application.TAG}/Settings" } val settings: SharedPreferences by lazy { @@ -31,53 +38,42 @@ class SettingsFragment : PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.preferences, rootKey) // Force only numbers on Goal - val weightGoal = findPreference(Settings.WEIGHT_GOAL) + val weightGoal = findPreference("tmp_goal_weight") weightGoal?.apply { + setOnBindEditTextListener { - it.inputType = InputType.TYPE_CLASS_NUMBER + it.setSelectAllOnFocus(true) + it.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL } - val value = settings.getString(Settings.WEIGHT_GOAL, null) - val modifier = UnitFactory.mass(settings.getString("weight_unit", null) ?: "kilogram") - if (value != null && value.isNotEmpty()) { - text = (value.toFloat() * modifier.modifier).toString() + + val value = config.getFloat(Settings.WEIGHT_GOAL) + setOnPreferenceClickListener { + if (value.value != null) { + val unit = config.getString(Settings.MASS_UNIT).value + text = if (unit == null) { + value.value!!.toString() + } else { + val modifier = Units.Mass.find(unit).modifier + (value.value!! * modifier).toString() + } + } + return@setOnPreferenceClickListener true } + + setOnPreferenceChangeListener { _, newValue -> - val alue = ((newValue as String).toInt() / modifier.modifier).toInt().toString() - settings.edit() - .putString( - Settings.WEIGHT_GOAL, - alue - ) - .apply() - text = alue + val unit = config.getString(Settings.MASS_UNIT).value + var modifier = Units.Mass.KILOGRAM.modifier + if (unit != null) { + modifier = Units.Mass.find(unit).modifier + } + + value.value = ((newValue as String).toFloat() / modifier) + return@setOnPreferenceChangeListener false } } - // 251 kg - // 553 lb - - findPreference("weight_unit")?.apply { - setOnPreferenceChangeListener { _, newValue -> - val unit = settings.getString("weight_unit", "kilogram") - ?: return@setOnPreferenceChangeListener true - val goal = settings.getString(Settings.WEIGHT_GOAL, null) - ?: return@setOnPreferenceChangeListener true - val modifier = UnitFactory.mass(newValue as String) - val oldModifier = UnitFactory.mass(unit) - val value = - (goal.toFloat() / oldModifier.modifier * modifier.modifier).toInt().toString() - settings.edit() - .putString( - Settings.WEIGHT_GOAL, - value - ) - .apply() - weightGoal?.text = value - return@setOnPreferenceChangeListener true - } - } - val languagesPreference = findPreference(Settings.APP_LANGUAGE) Log.d(TAG, Locale.getDefault().language) languagesPreference?.apply { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/AddWeightDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/AddWeightDialog.kt deleted file mode 100644 index 7bf1e2b..0000000 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/AddWeightDialog.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.dzeio.openhealth.ui.weight - -import android.view.LayoutInflater -import androidx.core.content.ContextCompat -import androidx.lifecycle.lifecycleScope -import com.dzeio.openhealth.R -import com.dzeio.openhealth.core.BaseDialog -import com.dzeio.openhealth.data.weight.Weight -import com.dzeio.openhealth.databinding.DialogAddWeightBinding -import com.dzeio.openhealth.ui.home.HomeViewModel -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class AddWeightDialog : - BaseDialog(HomeViewModel::class.java) { - - override val bindingInflater: (LayoutInflater) -> DialogAddWeightBinding = DialogAddWeightBinding::inflate - - override fun onBuilderInit(builder: MaterialAlertDialogBuilder) { - super.onBuilderInit(builder) - - builder.apply { - setTitle("Add your weight (kg)") - setIcon(activity?.let { ContextCompat.getDrawable(it, R.drawable.ic_outline_timeline_24) }) - setPositiveButton("Validate") { _, _ -> - save() - } - setNegativeButton("Cancel") { dialog, _ -> - dialog.cancel() - } - } - } - - override fun onCreated() { - super.onCreated() - - lifecycleScope.launchWhenStarted { - viewModel.lastWeight().collect { - if (it != null) { - binding.kg.value = it.weight.toInt() - binding.gram.value = ((it.weight - it.weight.toInt()) * 10).toInt() - } - } - } - - binding.kg.maxValue = 636 - binding.kg.minValue = 0 - - binding.gram.maxValue = 9 - binding.gram.minValue = 0 - } - - private fun save() { - val weight = Weight().apply { - weight = binding.kg.value + (binding.gram.value.toFloat() / 10) - source = "OpenHealth" - } - lifecycleScope.launchWhenCreated { - viewModel.addWeight(weight) - } - // callback?.invoke() - dialog?.dismiss() - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightFragment.kt index 5fdeda6..aa0d021 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightFragment.kt @@ -7,7 +7,6 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager @@ -17,11 +16,9 @@ import com.dzeio.openhealth.core.BaseFragment import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.databinding.FragmentListWeightBinding import com.dzeio.openhealth.graphs.WeightChart -import com.dzeio.openhealth.units.WeightUnit import com.dzeio.openhealth.utils.GraphUtils import com.google.android.material.color.MaterialColors import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collectLatest @AndroidEntryPoint class ListWeightFragment : @@ -50,41 +47,33 @@ class ListWeightFragment : ) } - val recycler = binding.list - - val manager = LinearLayoutManager(requireContext()) - recycler.layoutManager = manager - - val adapter = WeightAdapter() - - val unit = settings.getString("weight_unit", "Kilogram") ?: "Kilogram" - - adapter.unit = WeightUnit.fromSettings(unit) - - adapter.onItemClick = { - findNavController().navigate( - ListWeightFragmentDirections.actionNavListWeightToNavEditWeight( - it.id + val adapter = WeightAdapter().apply { + onItemClick = { + findNavController().navigate( + ListWeightFragmentDirections.actionNavListWeightToNavEditWeight( + it.id + ) ) - ) - // EditWeightDialog().show(requireActivity().supportFragmentManager, "dialog") - } - recycler.adapter = adapter - - viewLifecycleOwner.lifecycleScope.launchWhenCreated { - viewModel.fetchWeights().collectLatest { - updateGraph(it) - val itt = it.toMutableList() - itt.sortWith { o1, o2 -> if (o1.timestamp > o2.timestamp) -1 else 1 } - adapter.set(itt) } } - viewModel.goalWeight.observe(viewLifecycleOwner) { - viewLifecycleOwner.lifecycleScope.launchWhenCreated { - viewModel.fetchWeights().collectLatest { - updateGraph(it) - } + val recycler = binding.list.apply { + val manager = LinearLayoutManager(requireContext()) + layoutManager = manager + this.adapter = adapter + } + + viewModel.massUnit.observe(viewLifecycleOwner) { + adapter.unit = it +// adapter.notifyDataSetChanged() + } + + viewModel.weights.observe(viewLifecycleOwner) { + if (it != null) { + val itt = it.toMutableList() + itt.sortWith { o1, o2 -> if (o1.timestamp > o2.timestamp) -1 else 1 } + adapter.set(itt) + updateGraph(it) } } @@ -106,18 +95,20 @@ class ListWeightFragment : binding.chart, requireView(), list, - viewModel.weightUnit, + viewModel.massUnit.value!!, viewModel.goalWeight.value, false ) } + @Deprecated("Deprecated in Java") override fun onPrepareOptionsMenu(menu: Menu) { menu.findItem(R.id.action_add).isVisible = true super.onPrepareOptionsMenu(menu) } + @Deprecated("Deprecated in Java") override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_add -> { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightViewModel.kt index 6a1ce64..49b2e16 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/weight/ListWeightViewModel.kt @@ -1,11 +1,17 @@ package com.dzeio.openhealth.ui.weight +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.dzeio.openhealth.Settings import com.dzeio.openhealth.core.BaseViewModel +import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.data.weight.WeightRepository -import com.dzeio.openhealth.units.UnitFactory +import com.dzeio.openhealth.units.Units import com.dzeio.openhealth.utils.Configuration import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -14,16 +20,32 @@ class ListWeightViewModel @Inject internal constructor( private val settings: Configuration ) : BaseViewModel() { + + private val _massUnit = MutableLiveData(Units.Mass.KILOGRAM) + val massUnit: LiveData = _massUnit + private val _goalWeight = settings.getFloat(Settings.WEIGHT_GOAL) - - var weightUnit = - UnitFactory.mass(settings.getString("weight_unit").value ?: "kilogram") - val goalWeight = _goalWeight.toLiveData() - fun fetchWeights() = weightRepository.getWeights() + private val _weights = MutableLiveData?>(null) + val weights: LiveData?> = _weights - fun setWeightGoal(value: Float) { - _goalWeight.value = value + + init { + viewModelScope.launch { + weightRepository.getWeights().collectLatest { + _weights.postValue(it) + } + } + + settings.getString(Settings.MASS_UNIT).apply { + addObserver { + if (it == null) return@addObserver + _massUnit.postValue(Units.Mass.find(it)) + } + if (value != null) { + _massUnit.postValue(Units.Mass.find(value!!)) + } + } } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialog.kt index 9a1d5d4..fc789f4 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialog.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialog.kt @@ -3,21 +3,22 @@ package com.dzeio.openhealth.ui.weight import android.graphics.drawable.Drawable import android.util.Log import android.view.LayoutInflater +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs import com.dzeio.openhealth.R import com.dzeio.openhealth.core.BaseDialog -import com.dzeio.openhealth.databinding.DialogAddWeightBinding +import com.dzeio.openhealth.databinding.DialogWeightBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class WeightDialog : - BaseDialog(WeightDialogViewModel::class.java) { + BaseDialog(WeightDialogViewModel::class.java) { private val args: WeightDialogArgs by navArgs() - override val bindingInflater: (LayoutInflater) -> DialogAddWeightBinding = - DialogAddWeightBinding::inflate + override val bindingInflater: (LayoutInflater) -> DialogWeightBinding = + DialogWeightBinding::inflate override fun onBuilderInit(builder: MaterialAlertDialogBuilder) { super.onBuilderInit(builder) @@ -48,11 +49,14 @@ class WeightDialog : super.onCreated() setValue(0f) - if (args.dialogType == DialogTypes.EDIT_GOAL.ordinal) { - Log.d("TAG", viewModel.toString()) - Log.d("TAG", viewModel.goalWeight.value.toString()) + if (args.dialogType == DialogTypes.ADD_WEIGHT.ordinal) { + viewModel.initWithWeight(null) + viewModel.weight.observe(this) { + if (it != null) setValue(it.weight * viewModel.format.modifier) + } + } else if (args.dialogType == DialogTypes.EDIT_GOAL.ordinal) { viewModel.goalWeight.observe(this) { - if (it != null) setValue(it) + if (it != null) setValue(it * viewModel.format.modifier) } } @@ -85,6 +89,14 @@ class WeightDialog : */ private fun runAction(click: Int) { when (DialogTypes.values()[args.dialogType]) { + DialogTypes.ADD_WEIGHT -> { + val value = getValue() + if (click == 0) { + lifecycleScope.launchWhenCreated { + viewModel.addWeight(value) + } + } + } DialogTypes.EDIT_GOAL -> { if (click == 1) { return @@ -106,6 +118,7 @@ class WeightDialog : val icon: Drawable? = null, val thirdText: Int? = null ) { + ADD_WEIGHT("Add Weight", null), EDIT_GOAL("Edit Goal", null, R.string.goal_remove) } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialogViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialogViewModel.kt index 36745c5..c96fcbc 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialogViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/weight/WeightDialogViewModel.kt @@ -1,11 +1,17 @@ package com.dzeio.openhealth.ui.weight +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.dzeio.openhealth.Settings import com.dzeio.openhealth.core.BaseViewModel +import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.data.weight.WeightRepository -import com.dzeio.openhealth.units.UnitFactory +import com.dzeio.openhealth.units.Units import com.dzeio.openhealth.utils.Configuration import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -16,12 +22,38 @@ class WeightDialogViewModel @Inject internal constructor( private val _goalWeight = settings.getFloat(Settings.WEIGHT_GOAL) - var weightUnit = - UnitFactory.mass(settings.getString("weight_unit").value ?: "kilogram") - val goalWeight = _goalWeight.toLiveData() + private val _weight = MutableLiveData(null) + val weight: LiveData = _weight + + val format = + Units.Mass.find(settings.getString(Settings.MASS_UNIT).value ?: Units.Mass.KILOGRAM.id) + + fun initWithWeight(id: Long?) { + viewModelScope.launch { + if (id != null) { + weightRepository.getWeight(id).collectLatest { + _weight.postValue(it) + } + } else { + weightRepository.lastWeight().collectLatest { + _weight.postValue(it) + } + + } + } + } + + suspend fun addWeight(weight: Float) { + weightRepository.addWeight(Weight(weight = weight / format.modifier)) + } + fun setWeightGoal(value: Float?) { - _goalWeight.value = value + if (value != null) { + _goalWeight.value = value / format.modifier + } else { + _goalWeight.value = null + } } } diff --git a/app/src/main/java/com/dzeio/openhealth/units/UnitFactory.kt b/app/src/main/java/com/dzeio/openhealth/units/UnitFactory.kt index fb3198b..07ee51a 100644 --- a/app/src/main/java/com/dzeio/openhealth/units/UnitFactory.kt +++ b/app/src/main/java/com/dzeio/openhealth/units/UnitFactory.kt @@ -1,6 +1,7 @@ package com.dzeio.openhealth.units object UnitFactory { + @Deprecated("Move to Units.Mass.find") fun mass(unit: String): Units.Mass { return when (unit.lowercase()) { "kilogram", "kilograms", "kg" -> Units.Mass.KILOGRAM @@ -9,6 +10,7 @@ object UnitFactory { } } + @Deprecated("Move to Units.Volume.find") fun volume(unit: String): Units.Volume { return when (unit.lowercase()) { "milliliter", "milliliters", "ml" -> Units.Volume.MILLILITER diff --git a/app/src/main/java/com/dzeio/openhealth/units/Units.kt b/app/src/main/java/com/dzeio/openhealth/units/Units.kt index 1342ee5..36ea583 100644 --- a/app/src/main/java/com/dzeio/openhealth/units/Units.kt +++ b/app/src/main/java/com/dzeio/openhealth/units/Units.kt @@ -4,6 +4,7 @@ import com.dzeio.openhealth.R object Units { enum class Mass( + val id: String, /** * Value based on the Kilogram */ @@ -13,22 +14,42 @@ object Units { val unit: Int ) { KILOGRAM( + "kg", 1f, R.string.unit_mass_kilogram_name_singular, R.string.unit_mass_kilogram_name_plural, R.string.unit_mass_kilogram_unit ), POUND( - 0.45359237f, + "lbs", + 2.204623f, R.string.unit_mass_pound_name_singular, R.string.unit_mass_pound_name_plural, R.string.unit_mass_pound_unit - ) + ); + + companion object { + fun find(value: String): Mass { + return Mass.values().find { + it.id == value + } ?: KILOGRAM + } + + } + + fun format(value: Float): Float { + return value * modifier + } + + fun formatToString(value: Float): String { + return String.format("%.1f", value * modifier) + } } enum class Volume( + val id: String, /** - * Value based on the Kilogram + * Value based on the Milliliter */ val modifier: Float, val singular: Int, @@ -36,22 +57,33 @@ object Units { val unit: Int ) { MILLILITER( + "ml", 1f, R.string.unit_volume_milliliter_name_singular, R.string.unit_volume_milliliter_name_plural, R.string.unit_volume_milliliter_unit ), IMPERIAL_OUNCE( + "ioz", 0.03519503f, R.string.unit_volume_imperial_ounce_name_singular, R.string.unit_volume_imperial_ounce_name_plural, R.string.unit_volume_ounce_unit ), US_OUNCE( + "uoz", 0.03381413f, R.string.unit_volume_us_ounce_name_singular, R.string.unit_volume_us_ounce_name_plural, R.string.unit_volume_ounce_unit - ) + ); + + companion object { + fun find(value: String): Volume { + return Volume.values().find { + it.id == value + } ?: MILLILITER + } + } } } diff --git a/app/src/main/java/com/dzeio/openhealth/units/WaterUnit.kt b/app/src/main/java/com/dzeio/openhealth/units/WaterUnit.kt index d8a9944..2d998eb 100644 --- a/app/src/main/java/com/dzeio/openhealth/units/WaterUnit.kt +++ b/app/src/main/java/com/dzeio/openhealth/units/WaterUnit.kt @@ -1,5 +1,6 @@ package com.dzeio.openhealth.units +@Deprecated("Move to Units.Volume") enum class WaterUnit( val unit: String, val fromML: Float diff --git a/app/src/main/java/com/dzeio/openhealth/units/WeightUnit.kt b/app/src/main/java/com/dzeio/openhealth/units/WeightUnit.kt deleted file mode 100644 index 190c39a..0000000 --- a/app/src/main/java/com/dzeio/openhealth/units/WeightUnit.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.dzeio.openhealth.units - -enum class WeightUnit( - val unit: String, - val fromKG: Float -) { - KG("kg", 1f), - LBS("lbs", 2.2046226218488f); - - companion object { - fun fromSettings(value: String): WeightUnit { - return when (value.lowercase()) { - "kilogram" -> KG - "pounds" -> LBS - else -> KG - } - } - } -} diff --git a/app/src/main/res/layout/dialog_add_weight.xml b/app/src/main/res/layout/dialog_add_weight.xml deleted file mode 100644 index d261b93..0000000 --- a/app/src/main/res/layout/dialog_add_weight.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_weight.xml b/app/src/main/res/layout/dialog_weight.xml index cb18277..e76e493 100644 --- a/app/src/main/res/layout/dialog_weight.xml +++ b/app/src/main/res/layout/dialog_weight.xml @@ -16,7 +16,6 @@ + android:layout_height="wrap_content" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_browse.xml b/app/src/main/res/layout/fragment_browse.xml index baea5c2..793c645 100644 --- a/app/src/main/res/layout/fragment_browse.xml +++ b/app/src/main/res/layout/fragment_browse.xml @@ -208,6 +208,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Weight" /> + + diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 1a41735..bd12878 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -24,6 +24,9 @@ + Modifier le but journalier Vous avez décliné une permission, vous ne pouvez pas utiliser cette extension suaf si vous réactivez la permission manuellement Pas + Poid actuel: %1$s%2$s Une Erreur est survenu lors de l\'utilisation de l\'application diff --git a/app/src/main/res/values/preferenceItems.xml b/app/src/main/res/values/preferenceItems.xml index fa9ad96..0601155 100644 --- a/app/src/main/res/values/preferenceItems.xml +++ b/app/src/main/res/values/preferenceItems.xml @@ -4,13 +4,4 @@ Male Female - - @string/unit_mass_kilogram_name_plural - @string/unit_mass_pound_name_singular - - - @string/unit_volume_milliliter_name_singular - @string/unit_volume_imperial_ounce_name_singular - @string/unit_volume_us_ounce_name_singular - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b2d8e5..089ad66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Pound Pounds - %1$slb + %1$slbs Milliliter Milliliters @@ -52,6 +52,7 @@ You declined a permission, you can\'t use this extension unless you enable it manually Modifiy daily goal Steps + Current weight: %1$s%2$s diff --git a/app/src/main/res/values/units.xml b/app/src/main/res/values/units.xml new file mode 100644 index 0000000..1a07ed2 --- /dev/null +++ b/app/src/main/res/values/units.xml @@ -0,0 +1,13 @@ + + + + + kg + lbs + + + ml + uoz + ioz + + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index c3b2472..a9fa6fe 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -22,18 +22,16 @@ android:title="Height" /> + android:defaultValue="kg" + android:entries="@array/mass_units" + android:entryValues="@array/mass_units" + android:key="com.dzeio.open-health.unit.mass" + android:title="Mass Unit" /> @@ -44,11 +42,11 @@ android:key="water_hourly_notification" android:title="Enable Hourly Notification" /> + android:title="Volume Unit" />