diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a058775..b89ea60 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -145,14 +145,14 @@ android { } } - // Compile using JAVA 8 + // Compile using JAVA 11 compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = "1.8" + jvmTarget = JavaVersion.VERSION_11.toString() } // Enable View Binding and Data Binding diff --git a/app/src/debug/res/drawable/baseline_chevron_left_24.xml b/app/src/debug/res/drawable/baseline_chevron_left_24.xml deleted file mode 100644 index 25a728b..0000000 --- a/app/src/debug/res/drawable/baseline_chevron_left_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/debug/res/drawable/baseline_chevron_right_24.xml b/app/src/debug/res/drawable/baseline_chevron_right_24.xml deleted file mode 100644 index e7cf886..0000000 --- a/app/src/debug/res/drawable/baseline_chevron_right_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml index 695aeaf..7e3d221 100644 --- a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/java/com/dzeio/openhealth/Settings.kt b/app/src/main/java/com/dzeio/openhealth/Settings.kt index 25aecbc..afde599 100644 --- a/app/src/main/java/com/dzeio/openhealth/Settings.kt +++ b/app/src/main/java/com/dzeio/openhealth/Settings.kt @@ -34,4 +34,7 @@ object Settings { * Goal number of steps each days */ const val STEPS_GOAL = "com.dzeio.open-health.steps.goal-daily" + + const val WATER_INTAKE_SIZE = "com.dzeio.open-health.water.size" + const val WATER_INTAKE_SIZE_DEFAULT = 250 } diff --git a/app/src/main/java/com/dzeio/openhealth/adapters/FoodAdapter.kt b/app/src/main/java/com/dzeio/openhealth/adapters/FoodAdapter.kt deleted file mode 100644 index f2689d2..0000000 --- a/app/src/main/java/com/dzeio/openhealth/adapters/FoodAdapter.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.dzeio.openhealth.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -import com.dzeio.openhealth.R -import com.dzeio.openhealth.core.BaseAdapter -import com.dzeio.openhealth.core.BaseViewHolder -import com.dzeio.openhealth.data.food.Food -import com.dzeio.openhealth.databinding.ItemFoodBinding -import com.dzeio.openhealth.utils.NetworkUtils -import kotlin.math.roundToInt - -class FoodAdapter : BaseAdapter() { - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> ItemFoodBinding - get() = ItemFoodBinding::inflate - - var onItemClick: ((weight: Food) -> Unit)? = null - - override fun onBindData( - holder: BaseViewHolder, - item: Food, - position: Int - ) { - // Download remote picture - if (item.image != null) { - NetworkUtils.getImageInBackground(holder.binding.productImage, item.image!!) - } - - // set the food name - holder.binding.foodName.text = item.name + " ${item.id}" - - // set the food description - holder.binding.foodDescription.text = holder.itemView.context.getString( - R.string.food_description, - item.quantity.roundToInt().toString() + item.serving.replace(Regex("\\d+"), ""), - (item.energy / 100 * item.quantity) - ) - - // set the callback - holder.binding.edit.setOnClickListener { - onItemClick?.invoke(item) - } - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/adapters/StepsAdapter.kt b/app/src/main/java/com/dzeio/openhealth/adapters/StepsAdapter.kt deleted file mode 100644 index 71625fc..0000000 --- a/app/src/main/java/com/dzeio/openhealth/adapters/StepsAdapter.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.dzeio.openhealth.adapters - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.dzeio.openhealth.R -import com.dzeio.openhealth.core.BaseAdapter -import com.dzeio.openhealth.core.BaseViewHolder -import com.dzeio.openhealth.data.step.Step -import com.dzeio.openhealth.databinding.LayoutItemListBinding - -class StepsAdapter() : BaseAdapter() { - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> LayoutItemListBinding - get() = LayoutItemListBinding::inflate - - var onItemClick: ((weight: Step) -> Unit)? = null - - var isDay = false - - override fun onBindData( - holder: BaseViewHolder, - item: Step, - position: Int - ) { - // set the number of steps taken - holder.binding.value.text = holder.itemView.context.getString( - R.string.steps_count, - item.value - ) - - // set the datetime - holder.binding.datetime.text = item.formatTimestamp(!isDay) - - if (isDay) { - holder.binding.iconRight.visibility = View.GONE - } else { - holder.binding.iconRight.setImageResource(R.drawable.ic_zoom_out_map) - } - - // set the callback - holder.binding.edit.setOnClickListener { - onItemClick?.invoke(item) - } - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/adapters/WaterAdapter.kt b/app/src/main/java/com/dzeio/openhealth/adapters/WaterAdapter.kt deleted file mode 100644 index ff869e1..0000000 --- a/app/src/main/java/com/dzeio/openhealth/adapters/WaterAdapter.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.dzeio.openhealth.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -import com.dzeio.openhealth.core.BaseAdapter -import com.dzeio.openhealth.core.BaseViewHolder -import com.dzeio.openhealth.data.water.Water -import com.dzeio.openhealth.databinding.LayoutItemListBinding -import com.dzeio.openhealth.units.Units - -class WaterAdapter : BaseAdapter() { - - /** - * The unit the adapter will be using - */ - var unit: Units.Volume = Units.Volume.MILLILITER - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> LayoutItemListBinding - get() = LayoutItemListBinding::inflate - - var onItemClick: ((weight: Water) -> Unit)? = null - - override fun onBindData( - holder: BaseViewHolder, - item: Water, - position: Int - ) { - // set the wate intake text - holder.binding.value.text = - holder.itemView.context.getString(unit.unit, unit.formatToString(item.value)) - - // set the datetime - holder.binding.datetime.text = item.formatTimestamp() - - // set the callback - holder.binding.edit.setOnClickListener { - onItemClick?.invoke(item) - } - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt b/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt deleted file mode 100644 index 49fefa7..0000000 --- a/app/src/main/java/com/dzeio/openhealth/adapters/WeightAdapter.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.dzeio.openhealth.adapters - -import android.view.LayoutInflater -import android.view.ViewGroup -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.Units - -class WeightAdapter : BaseAdapter() { - - /** - * The unit the adapter will be using - */ - var unit: Units.Mass = Units.Mass.KILOGRAM - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> LayoutItemListBinding - get() = LayoutItemListBinding::inflate - - var onItemClick: ((weight: Weight) -> Unit)? = null - - override fun onBindData( - holder: BaseViewHolder, - item: Weight, - position: Int - ) { - // set the weight text - holder.binding.value.text = - holder.itemView.context.getString(unit.unit, unit.formatToString(item.weight)) - - // set the datetime - holder.binding.datetime.text = item.formatTimestamp() - - // set the callback - holder.binding.edit.setOnClickListener { - onItemClick?.invoke(item) - } - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/data/food/Food.kt b/app/src/main/java/com/dzeio/openhealth/data/food/Food.kt index c91cba2..05da7d2 100644 --- a/app/src/main/java/com/dzeio/openhealth/data/food/Food.kt +++ b/app/src/main/java/com/dzeio/openhealth/data/food/Food.kt @@ -75,17 +75,21 @@ data class Food( } // try to know how much was eaten by the user if not said - var eaten = quantity ?: food.servingQuantity ?: food.productQuantity ?: 0f + var eaten = quantity ?: food.productQuantity ?: food.servingQuantity ?: 0f if (eaten == 0f) { - if (food.servingQuantity != null && food.servingQuantity != 0f) { - eaten = food.servingQuantity!! - } else if (food.productQuantity != null && food.productQuantity != 0f) { + if (food.productQuantity != null && food.productQuantity != 0f) { eaten = food.productQuantity!! + } else if (food.servingQuantity != null && food.servingQuantity != 0f) { + eaten = food.servingQuantity!! } else if (food.servingSize != null || food.quantity != null) { - eaten = (food.servingSize ?: food.quantity)!!.trim().replace( - Regex(" +\\w+$"), - "" - ).toInt().toFloat() + eaten = try { + (food.quantity ?: food.servingSize)!!.trim().replace( + Regex(" +\\w+"), + "" + ).toInt().toFloat() + } catch (e: NumberFormatException) { + 0f + } } } Log.d("Food", "$food") diff --git a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialog.kt index 4f33981..c5a6efd 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialog.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialog.kt @@ -10,6 +10,7 @@ import com.dzeio.openhealth.databinding.DialogFoodProductBinding import com.dzeio.openhealth.utils.NetworkUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.roundToInt /** * Dialog that display to the user a spcific product and it's consumption @@ -66,6 +67,7 @@ class FoodDialog : ) } binding.quantity.setText(it.quantity.toString()) + dialog?.setTitle(it.name) } binding.quantity.addTextChangedListener { @@ -77,17 +79,17 @@ class FoodDialog : quantity = newQuantity viewModel.items.value?.let { val transformer = newQuantity ?: it.quantity - val energy = it.energy / 100 * transformer - binding.energyTxt.text = "${energy.toInt()} / 2594kcal" + val energy = it.energy * transformer / 100 + binding.energyTxt.text = "${energy.roundToInt()} / 2594kcal" binding.energyBar.progress = (100 * energy / 2594).toInt() - val proteins = it.proteins / 100 * transformer - binding.proteinsTxt.text = "${proteins.toInt()} / 130g" + val proteins = it.proteins * transformer / 100 + binding.proteinsTxt.text = "${proteins.roundToInt()} / 130g" binding.proteinsBar.progress = (100 * proteins / 130).toInt() - val carbohydrates = it.carbohydrates / 100 * transformer - binding.carbsTxt.text = "${carbohydrates.toInt()} / 324g" + val carbohydrates = it.carbohydrates * transformer / 100 + binding.carbsTxt.text = "${carbohydrates.roundToInt()} / 324g" binding.carbsBar.progress = (100 * carbohydrates / 324).toInt() - val fat = it.fat / 100 * transformer - binding.fatTxt.text = "${fat.toInt()} / 87g" + val fat = it.fat * transformer / 100 + binding.fatTxt.text = "${fat.roundToInt()} / 87g" binding.fatBar.progress = (100 * fat / 87).toInt() } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialogViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialogViewModel.kt index 59b9f27..4a3c0d0 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialogViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodDialogViewModel.kt @@ -41,11 +41,6 @@ class FoodDialogViewModel @Inject internal constructor( return } - val transformer = quantity / it.quantity - it.energy = it.energy * transformer - it.proteins = it.proteins * transformer - it.carbohydrates = it.carbohydrates * transformer - it.fat = it.fat * transformer it.quantity = quantity viewModelScope.launch { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodHomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodHomeFragment.kt index 38110c1..fdc6bde 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/food/FoodHomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/food/FoodHomeFragment.kt @@ -1,5 +1,6 @@ package com.dzeio.openhealth.ui.food +import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -10,12 +11,15 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.dzeio.openhealth.Application import com.dzeio.openhealth.R -import com.dzeio.openhealth.adapters.FoodAdapter +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseFragment +import com.dzeio.openhealth.data.food.Food import com.dzeio.openhealth.databinding.FragmentFoodHomeBinding import com.dzeio.openhealth.ui.steps.FoodHomeViewModel +import com.google.android.material.color.MaterialColors import dagger.hilt.android.AndroidEntryPoint import java.util.Calendar +import kotlin.math.roundToInt @AndroidEntryPoint class FoodHomeFragment : @@ -41,11 +45,11 @@ class FoodHomeFragment : val manager = LinearLayoutManager(requireContext()) recycler.layoutManager = manager - val adapter = FoodAdapter() + val adapter = ItemAdapter() adapter.onItemClick = { findNavController().navigate( FoodHomeFragmentDirections.actionFoodHomeFragmentToNavDialogFoodProduct( - it.id, + it.value.id, false ) ) @@ -53,7 +57,24 @@ class FoodHomeFragment : recycler.adapter = adapter viewModel.items.observe(viewLifecycleOwner) { - adapter.set(it) + adapter.set( + it!!.map { food -> + ItemAdapter.Item( + food, + food.name, + getString( + R.string.food_description, + food.quantity.roundToInt().toString() + food.serving.replace( + Regex("\\d+"), + "" + ), + (food.energy / 100 * food.quantity) + ), + food.image, + R.drawable.ic_outline_edit_24 + ) + } + ) var energy = 0f var proteins = 0f @@ -65,14 +86,47 @@ class FoodHomeFragment : carbohydrates += food.carbohydrates / 100 * food.quantity fat += food.fat / 100 * food.quantity } + binding.energyTxt.text = "${energy.toInt()} / 2594kcal" binding.energyBar.progress = (100 * energy / 2594).toInt() + if (binding.energyBar.progress >= 100) { + binding.energyBar.progressTintList = ColorStateList.valueOf( + MaterialColors.getColor( + view, + com.google.android.material.R.attr.colorError + ) + ) + } binding.proteinsTxt.text = "${proteins.toInt()} / 130g" binding.proteinsBar.progress = (100 * proteins / 130).toInt() + if (binding.proteinsBar.progress >= 100) { + binding.proteinsBar.progressTintList = ColorStateList.valueOf( + MaterialColors.getColor( + view, + com.google.android.material.R.attr.colorError + ) + ) + } binding.carbsTxt.text = "${carbohydrates.toInt()} / 324g" binding.carbsBar.progress = (100 * carbohydrates / 324).toInt() + if (binding.carbsBar.progress >= 100) { + binding.carbsBar.progressTintList = ColorStateList.valueOf( + MaterialColors.getColor( + view, + com.google.android.material.R.attr.colorError + ) + ) + } binding.fatTxt.text = "${fat.toInt()} / 87g" binding.fatBar.progress = (100 * fat / 87).toInt() + if (binding.fatBar.progress >= 100) { + binding.fatBar.progressTintList = ColorStateList.valueOf( + MaterialColors.getColor( + view, + com.google.android.material.R.attr.colorError + ) + ) + } } binding.next.setOnClickListener { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/food/SearchFoodDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/food/SearchFoodDialog.kt index 0b6d0fe..d9d2ae7 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/food/SearchFoodDialog.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/food/SearchFoodDialog.kt @@ -7,22 +7,24 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.dzeio.openhealth.R -import com.dzeio.openhealth.adapters.FoodAdapter +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseDialog -import com.dzeio.openhealth.databinding.DialogFoodSearchProductBinding +import com.dzeio.openhealth.data.food.Food +import com.dzeio.openhealth.databinding.DialogSearchBinding import com.dzeio.openhealth.utils.NetworkResult import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch +import kotlin.math.roundToInt @AndroidEntryPoint class SearchFoodDialog : - BaseDialog( + BaseDialog( SearchFoodDialogViewModel::class.java ) { - override val bindingInflater: (LayoutInflater) -> DialogFoodSearchProductBinding = - DialogFoodSearchProductBinding::inflate + override val bindingInflater: (LayoutInflater) -> DialogSearchBinding = + DialogSearchBinding::inflate override fun onBuilderInit(builder: MaterialAlertDialogBuilder) { super.onBuilderInit(builder) @@ -43,7 +45,7 @@ class SearchFoodDialog : dialog.setOnShowListener { val btn = dialog.getButton(AlertDialog.BUTTON_NEUTRAL) btn.setOnClickListener { - viewModel.search(binding.input.text.toString()) + viewModel.search(binding.search.text.toString()) binding.loading.visibility = View.VISIBLE } } @@ -57,10 +59,10 @@ class SearchFoodDialog : val manager = LinearLayoutManager(requireContext()) recycler.layoutManager = manager - val adapter = FoodAdapter() + val adapter = ItemAdapter() adapter.onItemClick = { lifecycleScope.launch { - val id = viewModel.addProduct(it) + val id = viewModel.addProduct(it.value) findNavController().navigate( SearchFoodDialogDirections.actionNavDialogFoodSearchToNavDialogFoodProduct( id, @@ -72,7 +74,25 @@ class SearchFoodDialog : recycler.adapter = adapter viewModel.items.observe(this) { - adapter.set(it.data ?: arrayListOf()) + if (it.data != null) { + adapter.set( + it.data!!.map { food -> + ItemAdapter.Item( + food, + food.name, + getString( + R.string.food_description, + food.quantity.roundToInt().toString() + food.serving.replace( + Regex("\\d+"), + "" + ), + (food.energy / 100 * food.quantity) + ), + food.image + ) + } + ) + } if (it.status == NetworkResult.NetworkStatus.FINISHED) { binding.loading.visibility = View.GONE } else if (it.status == NetworkResult.NetworkStatus.ERRORED) { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/steps/StepsHomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/steps/StepsHomeFragment.kt index 05a7b77..181ac53 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/steps/StepsHomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/steps/StepsHomeFragment.kt @@ -12,7 +12,8 @@ import com.dzeio.charts.Entry import com.dzeio.charts.axis.Line import com.dzeio.charts.series.BarSerie import com.dzeio.openhealth.Application -import com.dzeio.openhealth.adapters.StepsAdapter +import com.dzeio.openhealth.R +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseFragment import com.dzeio.openhealth.data.step.Step import com.dzeio.openhealth.databinding.FragmentStepsHomeBinding @@ -50,16 +51,14 @@ class StepsHomeFragment : val manager = LinearLayoutManager(requireContext()) recycler.layoutManager = manager - val adapter = StepsAdapter().apply { - this.isDay = isDay - } + val adapter = ItemAdapter() if (!isDay) { adapter.onItemClick = { findNavController().navigate( StepsHomeFragmentDirections.actionNavStepsHomeSelf().apply { - day = it.timestamp - title = "Steps from " + it.formatTimestamp(true) + day = it.value.timestamp + title = "Steps from " + it.value.formatTimestamp(true) } ) } @@ -137,7 +136,18 @@ class StepsHomeFragment : } } if (isDay) { - adapter.set(filtered) + adapter.set( + filtered.map { + ItemAdapter.Item( + it, + getString( + R.string.steps_count, + it.value + ), + it.formatTimestamp(false) + ) + } + ) serie.entries = filtered.map { Entry( it.timestamp.toDouble(), @@ -172,6 +182,17 @@ class StepsHomeFragment : adapter.set( entries.map { Step(value = it.value.y.toInt(), timestamp = it.key) } .sortedByDescending { it.timestamp } + .map { + ItemAdapter.Item( + it, + getString( + R.string.steps_count, + it.value + ), + it.formatTimestamp(true), + icon = R.drawable.ic_zoom_out_map + ) + } ) serie.entries = ArrayList(entries.values) diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt index 9c74cc1..c22b002 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt @@ -8,9 +8,12 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.dzeio.charts.Entry import com.dzeio.charts.series.BarSerie -import com.dzeio.openhealth.adapters.WaterAdapter +import com.dzeio.openhealth.R +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseFragment +import com.dzeio.openhealth.data.water.Water import com.dzeio.openhealth.databinding.FragmentMainWaterHomeBinding +import com.dzeio.openhealth.units.Units import com.dzeio.openhealth.utils.ChartUtils import dagger.hilt.android.AndroidEntryPoint import java.text.SimpleDateFormat @@ -34,15 +37,16 @@ class WaterHomeFragment : val manager = LinearLayoutManager(requireContext()) recycler.layoutManager = manager - val adapter = WaterAdapter() - adapter.onItemClick = { - findNavController().navigate( - WaterHomeFragmentDirections.actionNavWaterHomeToNavWaterEdit( - it.id + val adapter = ItemAdapter().apply { + onItemClick = { + findNavController().navigate( + WaterHomeFragmentDirections.actionNavWaterHomeToNavWaterEdit( + it.value.id + ) ) - ) + } + recycler.adapter = this } - recycler.adapter = adapter val chart = binding.chart @@ -58,6 +62,7 @@ class WaterHomeFragment : xAxis.apply { dataWidth = 604800000.0 textPaint.textSize = 32f + scrollEnabled = true onValueFormat = onValueFormat@{ return@onValueFormat SimpleDateFormat( "yyyy-MM-dd", @@ -74,7 +79,20 @@ class WaterHomeFragment : } viewModel.items.observe(viewLifecycleOwner) { list -> - adapter.set(list) + val unit = Units.Volume.MILLILITER + adapter.set( + list.map { + ItemAdapter.Item( + it, + getString( + unit.unit, + unit.formatToString(it.value) + ), + it.formatTimestamp(), + icon = R.drawable.ic_outline_edit_24 + ) + } + ) if (list.isEmpty()) { return@observe @@ -88,7 +106,9 @@ class WaterHomeFragment : } serie.entries = dataset as ArrayList - chart.xAxis.x = dataset[0].x + chart.xAxis.x = chart.xAxis.getXMin() + chart.xAxis.x = + chart.xAxis.getXMax() - chart.xAxis.dataWidth!! + chart.xAxis.dataWidth!! / 7 chart.refresh() } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorDialog.kt index b49f762..ba13487 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorDialog.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorDialog.kt @@ -1,12 +1,12 @@ package com.dzeio.openhealth.ui.water import android.view.LayoutInflater +import android.view.View +import androidx.core.widget.doOnTextChanged import com.dzeio.openhealth.R +import com.dzeio.openhealth.Settings import com.dzeio.openhealth.core.BaseDialog import com.dzeio.openhealth.databinding.DialogWaterSizeSelectorBinding -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -30,50 +30,47 @@ class WaterSizeSelectorDialog : } viewModel.cupSize.observe(this) { + var real = it ?: Settings.WATER_INTAKE_SIZE_DEFAULT binding.customSize.text = String.format( getString(R.string.custom_amount), - "${it}ml" + "${real}ml" ) + if (binding.inputParent.visibility == View.GONE) { + binding.input.setText(real.toString()) + } } binding.size100ml.setOnClickListener { + setTextFieldStatus() viewModel.setCupSize(100) } binding.size250ml.setOnClickListener { + setTextFieldStatus() viewModel.setCupSize(250) } binding.size500ml.setOnClickListener { + setTextFieldStatus() viewModel.setCupSize(500) } binding.size1000ml.setOnClickListener { + setTextFieldStatus() viewModel.setCupSize(1000) } binding.customSize.setOnClickListener { - val editTextLayout = TextInputLayout(requireContext()) + setTextFieldStatus(true) + } - val editText = TextInputEditText(requireContext()) - editText.setText(viewModel.cupSize.value.toString()) - - editTextLayout.addView(editText) - - MaterialAlertDialogBuilder(requireContext()) - .setView(editTextLayout) - .setTitle("Custom Cup Size") - .setOnCancelListener { - it.dismiss() - } - .setNegativeButton(R.string.cancel) { dialog, _ -> - dialog.dismiss() - } - .setPositiveButton( - R.string.validate - ) { dialog, _ -> - viewModel.setCupSize(editText.text.toString().toInt()) - dismiss() - dialog.dismiss() - } - .show() + binding.input.doOnTextChanged { text, start, before, count -> + val newSize = text.toString().toIntOrNull() + if (newSize != null) { + viewModel.setCupSize(newSize) + } } } + + private fun setTextFieldStatus(displayed: Boolean = false) { + binding.inputParent.visibility = if (displayed) View.VISIBLE else View.GONE + binding.customSize.visibility = if (displayed) View.GONE else View.VISIBLE + } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorViewModel.kt index 6e3c9b0..bcd20aa 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterSizeSelectorViewModel.kt @@ -1,32 +1,19 @@ package com.dzeio.openhealth.ui.water -import android.content.SharedPreferences -import androidx.lifecycle.MutableLiveData +import com.dzeio.openhealth.Settings import com.dzeio.openhealth.core.BaseViewModel +import com.dzeio.openhealth.utils.Configuration import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class WaterSizeSelectorViewModel @Inject constructor( - private val settings: SharedPreferences + private val settings: Configuration ) : BaseViewModel() { - private val _cupSize = MutableLiveData(0) - - val cupSize = _cupSize - - init { - val cup = settings.getInt("water_cup_size", -1) - if (cup != -1) { - _cupSize.value = cup - } - } + val cupSize = settings.getInt(Settings.WATER_INTAKE_SIZE).toLiveData() fun setCupSize(value: Int) { - settings.edit() - .putInt("water_cup_size", value) - .apply() - - _cupSize.value = value + settings.getInt(Settings.WATER_INTAKE_SIZE).value = value } } 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 dbeeed9..5c6bf08 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 @@ -21,10 +21,11 @@ import com.dzeio.charts.axis.Line import com.dzeio.charts.series.LineSerie import com.dzeio.openhealth.BuildConfig import com.dzeio.openhealth.R -import com.dzeio.openhealth.adapters.WeightAdapter +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseFragment import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.databinding.FragmentListWeightBinding +import com.dzeio.openhealth.units.Units import com.dzeio.openhealth.utils.PermissionsManager import com.google.android.material.color.MaterialColors import dagger.hilt.android.AndroidEntryPoint @@ -113,11 +114,11 @@ class ListWeightFragment : ) } - val adapter = WeightAdapter().apply { + val adapter = ItemAdapter().apply { onItemClick = { findNavController().navigate( ListWeightFragmentDirections.actionNavListWeightToNavEditWeight( - it.id + it.value.id ) ) } @@ -129,16 +130,23 @@ class ListWeightFragment : this.adapter = adapter } - viewModel.massUnit.observe(viewLifecycleOwner) { - adapter.unit = it - } - - 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) + viewModel.weights.observe(viewLifecycleOwner) { list -> + if (list != null) { + val unit = viewModel.massUnit.value ?: Units.Mass.KILOGRAM + adapter.set( + list.map { + ItemAdapter.Item( + it, + getString( + unit.unit, + unit.formatToString(it.weight) + ), + it.formatTimestamp(), + icon = R.drawable.ic_outline_edit_24 + ) + }.reversed() + ) + updateGraph(list) } } diff --git a/app/src/main/java/com/dzeio/openhealth/utils/Configuration.kt b/app/src/main/java/com/dzeio/openhealth/utils/Configuration.kt index 1b2abce..29676d5 100644 --- a/app/src/main/java/com/dzeio/openhealth/utils/Configuration.kt +++ b/app/src/main/java/com/dzeio/openhealth/utils/Configuration.kt @@ -54,10 +54,10 @@ class Configuration( return cache[key] as BooleanField } - fun getInt(key: String): IntField { + fun getInt(key: String, defaultValue: Int? = null): IntField { if (cache[key] == null) { // Log.d(TAG, "$key is not cache, creating new instance") - cache[key] = IntField(key) + cache[key] = IntField(key, defaultValue) } else { // Log.d(TAG, "$key in cache") } @@ -141,10 +141,15 @@ class Configuration( inner class IntField( private val key: String, - private val defaultValue: Int = -1 + private val defaultValue: Int? = null ) : Field(defaultValue) { override fun exists(): Boolean = prefs.contains(key) - override fun internalGet(): Int = prefs.getInt(key, defaultValue) + override fun internalGet(): Int? { + if (exists()) { + return prefs.getInt(key, 0) + } + return defaultValue + } override fun internalSet(value: Int?) = prefs.edit { if (value == null) remove(key) else putInt(key, value) } } diff --git a/app/src/main/res/drawable/ic_baseline_edit_24.xml b/app/src/main/res/drawable/ic_baseline_edit_24.xml deleted file mode 100644 index 2844baf..0000000 --- a/app/src/main/res/drawable/ic_baseline_edit_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/vector_logo_background.xml b/app/src/main/res/drawable/logo_background.xml similarity index 100% rename from app/src/main/res/drawable/vector_logo_background.xml rename to app/src/main/res/drawable/logo_background.xml diff --git a/app/src/main/res/drawable/logo_shealth.png b/app/src/main/res/drawable/logo_shealth.png deleted file mode 100644 index 2d85c18..0000000 Binary files a/app/src/main/res/drawable/logo_shealth.png and /dev/null differ diff --git a/app/src/main/res/layout/dialog_edit_weight.xml b/app/src/main/res/layout/dialog_edit_weight.xml index 67c52b6..175febb 100644 --- a/app/src/main/res/layout/dialog_edit_weight.xml +++ b/app/src/main/res/layout/dialog_edit_weight.xml @@ -18,7 +18,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_food_product.xml b/app/src/main/res/layout/dialog_food_product.xml index d68b57c..744f8ce 100644 --- a/app/src/main/res/layout/dialog_food_product.xml +++ b/app/src/main/res/layout/dialog_food_product.xml @@ -10,6 +10,7 @@ diff --git a/app/src/main/res/layout/dialog_food_search_product.xml b/app/src/main/res/layout/dialog_food_search_product.xml deleted file mode 100644 index 4895165..0000000 --- a/app/src/main/res/layout/dialog_food_search_product.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_water_size_selector.xml b/app/src/main/res/layout/dialog_water_size_selector.xml index a2a38a1..81d1e76 100644 --- a/app/src/main/res/layout/dialog_water_size_selector.xml +++ b/app/src/main/res/layout/dialog_water_size_selector.xml @@ -87,11 +87,24 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" + android:visibility="visible" android:text="@string/custom_amount" style="@style/Widget.Material3.Button.TextButton" tools:text="Custom amount: 1234ml" /> + + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 709783f..d4173c3 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -5,6 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:padding="16dp" tools:context=".ui.home.HomeFragment">