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">
+ android:layout_margin="8dp" />
diff --git a/app/src/main/res/layout/fragment_list_weight.xml b/app/src/main/res/layout/fragment_list_weight.xml
index 4efd789..86f791a 100644
--- a/app/src/main/res/layout/fragment_list_weight.xml
+++ b/app/src/main/res/layout/fragment_list_weight.xml
@@ -19,44 +19,33 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
-
- android:paddingHorizontal="12dp"
- android:paddingVertical="16dp">
+ android:padding="16dp"
+ >
-
-
-
-
-
+ android:layout_marginHorizontal="16dp"
+ android:text="@string/bluetooth_scale" />
+ />
@@ -139,14 +128,14 @@
android:text="Generate random values" />
+ tools:context=".ui.weight.ListWeightFragment"
+ tools:listitem="@layout/item_list" />
diff --git a/app/src/main/res/layout/fragment_main_water_home.xml b/app/src/main/res/layout/fragment_main_water_home.xml
index 1f80e93..5578a2d 100644
--- a/app/src/main/res/layout/fragment_main_water_home.xml
+++ b/app/src/main/res/layout/fragment_main_water_home.xml
@@ -1,6 +1,5 @@
+ tools:listitem="@layout/item_list" />
diff --git a/app/src/main/res/layout/fragment_steps_home.xml b/app/src/main/res/layout/fragment_steps_home.xml
index 79dc7fd..e81b695 100644
--- a/app/src/main/res/layout/fragment_steps_home.xml
+++ b/app/src/main/res/layout/fragment_steps_home.xml
@@ -1,7 +1,6 @@
+ tools:listitem="@layout/item_list" />
diff --git a/app/src/main/res/layout/item_food.xml b/app/src/main/res/layout/item_food.xml
deleted file mode 100644
index 1acb548..0000000
--- a/app/src/main/res/layout/item_food.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml
index 09c4dc5..c226976 100644
--- a/app/src/main/res/layout/item_list.xml
+++ b/app/src/main/res/layout/item_list.xml
@@ -55,7 +55,7 @@
android:id="@+id/icon_right"
android:layout_width="24dp"
android:layout_height="24dp"
- android:src="@drawable/ic_baseline_edit_24" />
+ android:src="@drawable/ic_outline_edit_24" />
diff --git a/app/src/main/res/layout/layout_extension_item.xml b/app/src/main/res/layout/layout_extension_item.xml
deleted file mode 100644
index cbd65d3..0000000
--- a/app/src/main/res/layout/layout_extension_item.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_item_list.xml b/app/src/main/res/layout/layout_item_list.xml
deleted file mode 100644
index d6c6d87..0000000
--- a/app/src/main/res/layout/layout_item_list.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index f1fb90b..38632b5 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index 5625f22..8af11af 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -183,7 +183,7 @@