Second Commit:

Version 1.5 [Partialy Optimized Version] [UI Fixes And Improvment]
Todo:
Optimized the Code
Add String Theolgy
This commit is contained in:
Diassdp
2025-03-05 20:46:02 +07:00
parent db9c19a17a
commit 649229579b
6 changed files with 72 additions and 51 deletions

View File

@ -21,14 +21,14 @@ class AlgoritmaKesehatan {
return when (healthData.gender) { return when (healthData.gender) {
"Female", "Other" -> when { "Female", "Other" -> when {
healthData.bloodSugar < 70 -> "Gula darah rendah, konsumsi makanan manis seperti buah atau madu." healthData.bloodSugar < 70 -> "Gula darah rendah, konsumsi makanan manis seperti buah atau madu."
healthData.bloodSugar in 70.0..140.0 -> "Gula darah normal, pertahankan pola makan sehat." healthData.bloodSugar in 70.0..130.0 -> "Gula darah normal, pertahankan pola makan sehat."
healthData.bloodSugar > 140 -> "Gula darah tinggi, kurangi makanan manis dan lakukan olahraga teratur." healthData.bloodSugar > 130 -> "Gula darah tinggi, kurangi makanan manis dan lakukan olahraga teratur."
else -> "Data gula darah tidak valid." else -> "Data gula darah tidak valid."
} }
"Male" -> when { "Male" -> when {
healthData.bloodSugar < 70 -> "Gula darah rendah, segera konsumsi makanan berkarbohidrat." healthData.bloodSugar < 70 -> "Gula darah rendah, segera konsumsi makanan berkarbohidrat."
healthData.bloodSugar in 70.0..130.0 -> "Gula darah normal, jaga pola makan seimbang." healthData.bloodSugar in 70.0..120.0 -> "Gula darah normal, jaga pola makan seimbang."
healthData.bloodSugar > 130 -> "Gula darah tinggi, batasi konsumsi gula dan periksa kesehatan secara berkala." healthData.bloodSugar > 120 -> "Gula darah tinggi, batasi konsumsi gula dan periksa kesehatan secara berkala."
else -> "Data gula darah tidak valid." else -> "Data gula darah tidak valid."
} }
else -> "Data gula darah tidak valid." else -> "Data gula darah tidak valid."

View File

@ -13,7 +13,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.firebase.Firebase import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.google.firebase.database.database import com.google.firebase.database.database
import com.healthjournal.R import com.healthjournal.R
import com.healthjournal.data.ResultData import com.healthjournal.data.ResultData
@ -23,6 +26,7 @@ import com.healthjournal.ui.journal.input.JournalInputActivity
import com.healthjournal.ui.login.LoginActivity import com.healthjournal.ui.login.LoginActivity
import com.healthjournal.ui.profile.ProfileActivity import com.healthjournal.ui.profile.ProfileActivity
import com.healthjournal.ui.recommendation.RecommendationActivity import com.healthjournal.ui.recommendation.RecommendationActivity
import com.healthjournal.ui.users.UsersInputActivity
import com.healthjournal.utils.NotificationUtils import com.healthjournal.utils.NotificationUtils
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
@ -115,22 +119,28 @@ class MainActivity : AppCompatActivity() {
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()) val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
// Set start of the week (Sunday)
today.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY) today.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
val startDate = dateFormat.format(today.time) val startDate = today.time
// Set end of the week (Saturday)
val endDate = today.clone() as Calendar val endDate = today.clone() as Calendar
endDate.add(Calendar.DAY_OF_WEEK, 6) endDate.add(Calendar.DAY_OF_WEEK, 6)
val endDateString = dateFormat.format(endDate.time) val endDateDate = endDate.time
database.getReference("users").child(userID).child("journal") database.getReference("users").child(userID).child("journal").get()
.get()
.addOnCompleteListener { task -> .addOnCompleteListener { task ->
if (task.isSuccessful) { if (task.isSuccessful) {
count = task.result.children.count { snapshot -> count = task.result.children.count { snapshot ->
val date = snapshot.child("date").value.toString() val dateString = snapshot.child("date").value.toString()
date >= startDate && date <= endDateString val entryDate = try {
dateFormat.parse(dateString)
} catch (e: Exception) {
null
}
entryDate?.let { it in startDate..endDateDate } ?: false
} }
Log.d("debug", "Entries found: $count for week: $startDate - $endDateString") Log.d("debug", "Entries found: $count for week: ${dateFormat.format(startDate)} - ${dateFormat.format(endDateDate)}")
binding.tvDailyCounter.text = "$count/7" binding.tvDailyCounter.text = "$count/7"
} else { } else {
Log.e("error", task.exception?.message.toString()) Log.e("error", task.exception?.message.toString())
@ -139,6 +149,7 @@ class MainActivity : AppCompatActivity() {
} }
} }
private fun setupListener(){ private fun setupListener(){
binding.btnRecomendation.setOnClickListener { binding.btnRecomendation.setOnClickListener {
startActivity(Intent(this, RecommendationActivity::class.java)) startActivity(Intent(this, RecommendationActivity::class.java))
@ -190,22 +201,29 @@ class MainActivity : AppCompatActivity() {
} }
private fun userCheck() { private fun userCheck() {
user = FirebaseAuth.getInstance() val firebaseUser = user.currentUser
if (firebaseUser != null) {
if (user.currentUser == null) { val userID = firebaseUser.uid
Toast.makeText(this, "Please Login to an account", Toast.LENGTH_SHORT).show() val userRef = database.getReference("users").child(userID)
val intent = Intent(this, LoginActivity::class.java) userRef.get().addOnCompleteListener { task ->
startActivity(intent) if (task.isSuccessful) {
finish() if (task.result.exists() && task.result.childrenCount > 0) {
} else { Toast.makeText(this, "Selamat Kembali!", Toast.LENGTH_SHORT).show()
Toast.makeText(this, "Welcome back!", Toast.LENGTH_SHORT).show() dailycheck()
dailycheck() getWeekCount()
getWeekCount() populateHistory()
populateHistory() } else {
Toast.makeText(this, "Tidak ada user data kesehatan. Tolong isi data kesehatan profile.", Toast.LENGTH_LONG).show()
startActivity(Intent(this@MainActivity, UsersInputActivity::class.java))
finish()
}
} else {
Toast.makeText(this, "Failed to retrieve user data.", Toast.LENGTH_SHORT).show()
}
}
} }
} }
private fun populateHistory() { private fun populateHistory() {
val userID = user.currentUser!!.uid val userID = user.currentUser!!.uid
mainAdapter = MainAdapter(healthDataList) mainAdapter = MainAdapter(healthDataList)
@ -215,32 +233,35 @@ class MainActivity : AppCompatActivity() {
layoutManager = LinearLayoutManager(this@MainActivity) layoutManager = LinearLayoutManager(this@MainActivity)
} }
database.getReference("users").child(userID).child("journal").get() val historyRef = database.getReference("users").child(userID).child("journal")
.addOnCompleteListener { task ->
if (task.isSuccessful) {
healthDataList.clear()
task.result.children.forEach { snapshot ->
val journalID = snapshot.key.toString()
val bloodSugar = snapshot.child("bloodSugar").value.toString().toFloatOrNull() ?: 0f
val diastolicBP = snapshot.child("bloodPressureDIA").value.toString().toIntOrNull() ?: 0
val systolicBP = snapshot.child("bloodPressureSYS").value.toString().toIntOrNull() ?: 0
val BMI = snapshot.child("bmi").value.toString().toFloatOrNull() ?: 0f
val date = snapshot.child("date").value.toString()
val task = snapshot.child("recommendation").child("tasks").value as? List<Map<String, Any>> ?: emptyList()
val resultData = ResultData(journalID, bloodSugar, diastolicBP, systolicBP, BMI, date, task) historyRef.addValueEventListener(object : ValueEventListener {
healthDataList.add(resultData) override fun onDataChange(snapshot: DataSnapshot) {
} healthDataList.clear()
snapshot.children.forEach { data ->
val journalID = data.key.toString()
val bloodSugar = data.child("bloodSugar").value.toString().toFloatOrNull() ?: 0f
val diastolicBP = data.child("bloodPressureDIA").value.toString().toIntOrNull() ?: 0
val systolicBP = data.child("bloodPressureSYS").value.toString().toIntOrNull() ?: 0
val BMI = data.child("bmi").value.toString().toFloatOrNull() ?: 0f
val date = data.child("date").value.toString()
val task = data.child("recommendation").child("tasks").value as? List<Map<String, Any>> ?: emptyList()
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()) val resultData = ResultData(journalID, bloodSugar, diastolicBP, systolicBP, BMI, date, task)
healthDataList.sortByDescending { it.date.let { date -> dateFormat.parse(date) } } healthDataList.add(resultData)
mainAdapter.notifyDataSetChanged()
} else {
Log.d("error", task.exception?.message.toString())
Toast.makeText(this, task.exception?.message, Toast.LENGTH_SHORT).show()
} }
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
healthDataList.sortByDescending { it.date.let { date -> dateFormat.parse(date) } }
mainAdapter.notifyDataSetChanged()
} }
override fun onCancelled(error: DatabaseError) {
Log.d("error", error.message)
Toast.makeText(this@MainActivity, error.message, Toast.LENGTH_SHORT).show()
}
})
} }
@ -257,7 +278,7 @@ class MainActivity : AppCompatActivity() {
val bmiValue = it.result.child("BMI").value.toString().toDoubleOrNull() ?: 0.0 val bmiValue = it.result.child("BMI").value.toString().toDoubleOrNull() ?: 0.0
binding.tvBloodsugarLevel.text = it.result.child("bloodSugar").value.toString() + " mg/dL" binding.tvBloodsugarLevel.text = it.result.child("bloodSugar").value.toString() + " mg/dL"
binding.tvBloodsugarDesc.text = it.result.child("recommendation").child("bloodSugarAnalysis").value.toString() binding.tvBloodsugarDesc.text = it.result.child("recommendation").child("bloodSugarAnalysis").value.toString()
binding.tvBloodpressureLevel.text = it.result.child("bloodPressureDIA").value.toString() + "/" + it.result.child("bloodPressureSYS").value.toString() + " mm Hg" binding.tvBloodpressureLevel.text = it.result.child("bloodPressureSYS").value.toString() + "/" + it.result.child("bloodPressureDIA").value.toString() + " mm Hg"
binding.tvBloodpressureDesc.text = it.result.child("recommendation").child("bloodPressureAnalysis").value.toString() binding.tvBloodpressureDesc.text = it.result.child("recommendation").child("bloodPressureAnalysis").value.toString()
binding.tvBmiLevel.text = String.format(Locale.getDefault(), "%.2f BMI", bmiValue) binding.tvBmiLevel.text = String.format(Locale.getDefault(), "%.2f BMI", bmiValue)
binding.tvBmiDesc.text = it.result.child("recommendation").child("BMIAnalysis").value.toString() binding.tvBmiDesc.text = it.result.child("recommendation").child("BMIAnalysis").value.toString()

View File

@ -97,7 +97,7 @@ class JournalInputActivity : AppCompatActivity() {
if (weight != null && bloodPressureSYS.isNotEmpty() && bloodPressureDIA.isNotEmpty() && bloodSugar.isNotEmpty()) { if (weight != null && bloodPressureSYS.isNotEmpty() && bloodPressureDIA.isNotEmpty() && bloodSugar.isNotEmpty()) {
database.getReference("users").child(userId).child("height").get().addOnSuccessListener { snapshot -> database.getReference("users").child(userId).child("height").get().addOnSuccessListener { snapshot ->
val BMI = calculateBMI(weight, height) val BMI = calculateBMI(weight, height)
val healthData = HealthData(bloodSugar.toFloat(), bloodPressureSYS.toInt(), bloodPressureDIA.toInt(), BMI,age,gender) val healthData = HealthData(bloodSugar.toFloat(),bloodPressureDIA.toInt(),bloodPressureSYS.toInt(), BMI,age,gender)
val recommendation = AlgoritmaKesehatan().recommendationOfTheDay(healthData) val recommendation = AlgoritmaKesehatan().recommendationOfTheDay(healthData)
val data = hashMapOf( val data = hashMapOf(

View File

@ -71,7 +71,7 @@ class ProfileActivity : AppCompatActivity() {
if (it.isSuccessful) { if (it.isSuccessful) {
binding.edtName.setText(it.result.child("name").value.toString()) binding.edtName.setText(it.result.child("name").value.toString())
binding.tvMyname.text = it.result.child("name").value.toString() binding.tvMyname.text = it.result.child("name").value.toString()
binding.tvMyemail.text = it.result.child("email").value.toString() binding.tvMyemail.text = user.currentUser?.email.toString()
binding.edtDate.setText(it.result.child("date").value.toString()) binding.edtDate.setText(it.result.child("date").value.toString())
binding.edtInputHeight.setText(it.result.child("height").value.toString()) binding.edtInputHeight.setText(it.result.child("height").value.toString())
binding.edtInputWeight.setText(it.result.child("weight").value.toString()) binding.edtInputWeight.setText(it.result.child("weight").value.toString())

View File

@ -43,9 +43,9 @@ class RecommendationActivity : AppCompatActivity() {
binding.tvBloodsugarLevel2.text = "${it.child("bloodSugar").value} mg/dL" binding.tvBloodsugarLevel2.text = "${it.child("bloodSugar").value} mg/dL"
binding.tvBloodsugarDesc.text = it.child("recommendation").child("bloodSugarAnalysis").value.toString() binding.tvBloodsugarDesc.text = it.child("recommendation").child("bloodSugarAnalysis").value.toString()
binding.tvBloodpressureLevel2.text = "${it.child("bloodPressureDIA").value}/${it.child("bloodPressureSYS").value} mm Hg" binding.tvBloodpressureLevel2.text = "${it.child("bloodPressureSYS").value}/${it.child("bloodPressureDIA").value} mm Hg"
binding.tvBloodpressureDesc.text = it.child("recommendation").child("bloodPressureAnalysis").value.toString() binding.tvBloodpressureDesc.text = it.child("recommendation").child("bloodPressureAnalysis").value.toString()
binding.tvBMILevel2.text = "${bmiValue} BMI" binding.tvBMILevel2.text = String.format(Locale.getDefault(), "%.2f BMI", bmiValue)
binding.tvBMIDesc.text = it.child("recommendation").child("BMIAnalysis").value.toString() binding.tvBMIDesc.text = it.child("recommendation").child("BMIAnalysis").value.toString()
val tasks = it.child("recommendation").child("tasks").value val tasks = it.child("recommendation").child("tasks").value

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB