diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef3..3626cfe 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7be2c74..0bae317 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
>()
// Task for Blood Sugar Control
- if (healthData.bloodSugar > 140) {
- tasks.add(mapOf("task" to "Cek kadar gula darah 2 kali sehari.", "completed" to false))
- tasks.add(mapOf("task" to "Kurangi konsumsi makanan tinggi gula.", "completed" to false))
- } else if (healthData.bloodSugar < 70) {
- tasks.add(mapOf("task" to "Sediakan camilan sehat seperti buah atau kacang.", "completed" to false))
+ when {
+ healthData.bloodSugar > 140 -> {
+ tasks.add(mapOf("task" to "Kurangi konsumsi makanan tinggi gula dan karbohidrat olahan.", "completed" to false))
+ tasks.add(mapOf("task" to "Perbanyak konsumsi makanan berserat seperti sayuran dan biji-bijian.", "completed" to false))
+ tasks.add(mapOf("task" to "Lakukan olahraga ringan setelah makan untuk membantu mengontrol gula darah.", "completed" to false))
+ }
+ healthData.bloodSugar < 70 -> {
+ tasks.add(mapOf("task" to "Sediakan camilan sehat seperti buah atau kacang.", "completed" to false))
+ tasks.add(mapOf("task" to "Jangan melewatkan makan, usahakan makan dalam porsi kecil tapi sering.", "completed" to false))
+ tasks.add(mapOf("task" to "Konsumsi sumber karbohidrat kompleks untuk menjaga kadar gula tetap stabil.", "completed" to false))
+ }
+ else -> {
+ tasks.add(mapOf("task" to "Pertahankan pola makan sehat dan seimbang untuk menjaga kadar gula darah stabil.", "completed" to false))
+ }
}
// Task for Blood Pressure Control
- if (healthData.systolicBP > 120 || healthData.diastolicBP > 80) {
- tasks.add(mapOf("task" to "Lakukan olahraga ringan seperti jalan kaki selama 30 menit.", "completed" to false))
- tasks.add(mapOf("task" to "Kurangi makanan asin dan berlemak.", "completed" to false))
- } else if (healthData.systolicBP < 90) {
- tasks.add(mapOf("task" to "Perbanyak minum air putih dan istirahat.", "completed" to false))
+ when {
+ healthData.systolicBP > 120 || healthData.diastolicBP > 80 -> {
+ tasks.add(mapOf("task" to "Lakukan olahraga ringan seperti jalan kaki selama 30 menit.", "completed" to false))
+ tasks.add(mapOf("task" to "Kurangi konsumsi garam dan makanan berlemak.", "completed" to false))
+ tasks.add(mapOf("task" to "Konsumsi lebih banyak makanan tinggi kalium seperti pisang dan bayam.", "completed" to false))
+ }
+ healthData.systolicBP < 90 -> {
+ tasks.add(mapOf("task" to "Perbanyak minum air putih dan istirahat cukup.", "completed" to false))
+ tasks.add(mapOf("task" to "Konsumsi makanan bergizi yang bisa membantu menaikkan tekanan darah.", "completed" to false))
+ }
+ else -> {
+ tasks.add(mapOf("task" to "Jaga pola hidup sehat agar tekanan darah tetap stabil.", "completed" to false))
+ }
}
// Task for BMI Control
- if (healthData.BMI > 25) {
- tasks.add(mapOf("task" to "Lakukan olahraga rutin minimal 3 kali seminggu.", "completed" to false))
- tasks.add(mapOf("task" to "Konsumsi lebih banyak sayuran dan serat.", "completed" to false))
- } else if (healthData.BMI < 18.5) {
- tasks.add(mapOf("task" to "Tambahkan makanan tinggi kalori seperti kacang dan susu.", "completed" to false))
+ when {
+ healthData.BMI > 25 -> {
+ tasks.add(mapOf("task" to "Lakukan olahraga rutin minimal 3 kali seminggu.", "completed" to false))
+ tasks.add(mapOf("task" to "Konsumsi lebih banyak sayuran dan serat.", "completed" to false))
+ tasks.add(mapOf("task" to "Kurangi makanan tinggi lemak dan gula.", "completed" to false))
+ }
+ healthData.BMI < 18.5 -> {
+ tasks.add(mapOf("task" to "Tambahkan makanan tinggi kalori seperti kacang dan susu.", "completed" to false))
+ tasks.add(mapOf("task" to "Pastikan asupan protein dan karbohidrat mencukupi.", "completed" to false))
+ }
+ else -> {
+ tasks.add(mapOf("task" to "Pertahankan berat badan ideal dengan pola makan dan olahraga seimbang.", "completed" to false))
+ }
}
// Age and Gender Specific Tasks
if (healthData.age > 50) {
tasks.add(mapOf("task" to "Lakukan pemeriksaan kesehatan rutin setiap bulan.", "completed" to false))
+ tasks.add(mapOf("task" to "Jaga kesehatan tulang dengan konsumsi kalsium dan vitamin D.", "completed" to false))
}
- if (healthData.gender == "Female" || healthData.gender == "Other") {
- tasks.add(mapOf("task" to "Perhatikan kebutuhan kalsium dan zat besi.", "completed" to false))
+
+ when (healthData.gender) {
+ "Female", "Other" -> {
+ tasks.add(mapOf("task" to "Perhatikan kebutuhan kalsium dan zat besi, terutama saat menstruasi atau menopause.", "completed" to false))
+ tasks.add(mapOf("task" to "Pastikan mendapatkan asupan vitamin D yang cukup.", "completed" to false))
+ }
+ "Male" -> {
+ tasks.add(mapOf("task" to "Perhatikan kesehatan prostat dengan pola makan sehat.", "completed" to false))
+ tasks.add(mapOf("task" to "Jaga kesehatan jantung dengan olahraga teratur.", "completed" to false))
+ }
}
return tasks
diff --git a/app/src/main/java/com/healthjournal/data/Data.kt b/app/src/main/java/com/healthjournal/data/Data.kt
index 5221a19..9ec5412 100644
--- a/app/src/main/java/com/healthjournal/data/Data.kt
+++ b/app/src/main/java/com/healthjournal/data/Data.kt
@@ -1,5 +1,6 @@
package com.healthjournal.data
+import com.google.android.gms.tasks.Task
import java.io.Serializable
@@ -18,6 +19,7 @@ data class ResultData(
val diastolicBP: Int,
val systolicBP: Int,
val BMI: Float,
- val date: String
+ val date: String,
+ val task: List>
) : Serializable
diff --git a/app/src/main/java/com/healthjournal/notification/NotificationUtils.kt b/app/src/main/java/com/healthjournal/notification/NotificationUtils.kt
new file mode 100644
index 0000000..e99d160
--- /dev/null
+++ b/app/src/main/java/com/healthjournal/notification/NotificationUtils.kt
@@ -0,0 +1,27 @@
+package com.healthjournal.utils
+
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.content.Context
+import android.os.Build
+
+object NotificationUtils {
+ private const val CHANNEL_ID = "health_reminder_channel"
+ private const val CHANNEL_NAME = "Health Reminders"
+
+ fun createNotificationChannel(context: Context) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ val channel = NotificationChannel(
+ CHANNEL_ID,
+ CHANNEL_NAME,
+ NotificationManager.IMPORTANCE_HIGH
+ ).apply {
+ description = "Reminders to check blood pressure and blood sugar"
+ }
+
+ val notificationManager: NotificationManager =
+ context.getSystemService(NotificationManager::class.java)
+ notificationManager.createNotificationChannel(channel)
+ }
+ }
+}
diff --git a/app/src/main/java/com/healthjournal/notification/ReminderReceiver.kt b/app/src/main/java/com/healthjournal/notification/ReminderReceiver.kt
new file mode 100644
index 0000000..d7a9b3e
--- /dev/null
+++ b/app/src/main/java/com/healthjournal/notification/ReminderReceiver.kt
@@ -0,0 +1,39 @@
+package com.healthjournal.receiver
+
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import androidx.core.app.NotificationCompat
+import com.healthjournal.R
+import com.healthjournal.ui.dashboard.MainActivity
+
+class ReminderReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ if (context != null) {
+ sendNotification(context)
+ }
+ }
+
+ private fun sendNotification(context: Context) {
+ val notificationManager =
+ context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+
+ val intent = Intent(context, MainActivity::class.java)
+ val pendingIntent = PendingIntent.getActivity(
+ context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
+ )
+
+ val notification = NotificationCompat.Builder(context, "health_reminder_channel")
+ .setSmallIcon(R.drawable.ic_notifications)
+ .setContentTitle("Health Check Reminder")
+ .setContentText("Don't forget to check your blood pressure and sugar today!")
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .build()
+
+ notificationManager.notify(1001, notification)
+ }
+}
diff --git a/app/src/main/java/com/healthjournal/ui/dashboard/MainActivity.kt b/app/src/main/java/com/healthjournal/ui/dashboard/MainActivity.kt
index 92f8c50..c373134 100644
--- a/app/src/main/java/com/healthjournal/ui/dashboard/MainActivity.kt
+++ b/app/src/main/java/com/healthjournal/ui/dashboard/MainActivity.kt
@@ -1,5 +1,8 @@
package com.healthjournal.ui.dashboard
+import android.app.AlarmManager
+import android.app.PendingIntent
+import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
@@ -7,6 +10,7 @@ import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
@@ -14,46 +18,98 @@ import com.google.firebase.database.database
import com.healthjournal.R
import com.healthjournal.data.ResultData
import com.healthjournal.databinding.ActivityMainBinding
+import com.healthjournal.receiver.ReminderReceiver
import com.healthjournal.ui.journal.input.JournalInputActivity
import com.healthjournal.ui.login.LoginActivity
import com.healthjournal.ui.profile.ProfileActivity
import com.healthjournal.ui.recommendation.RecommendationActivity
+import com.healthjournal.utils.NotificationUtils
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
-
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var user: FirebaseAuth
private lateinit var mainAdapter: MainAdapter
+ private lateinit var database: FirebaseDatabase
private val healthDataList: MutableList = mutableListOf()
- private val database = Firebase.database
private var dailyReport = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
+ // Create notification channel
+ NotificationUtils.createNotificationChannel(this)
+
+ // Schedule reminders
+ scheduleHealthReminders(this)
+
setContentView(binding.root)
user = FirebaseAuth.getInstance()
-
+ database = FirebaseDatabase.getInstance()
userCheck()
setupListener()
populateHistory()
navigationBottomBar()
}
- private fun navigationBottomBar(){
- binding.bottomNavigation.setOnItemSelectedListener {
- when(it.itemId){
- R.id.nav_add -> addJournal()
- R.id.nav_home -> home()
- R.id.nav_profile -> profile()
+ private fun scheduleHealthReminders(context: Context) {
+ val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
+
+ val daysOfWeek = listOf(Calendar.MONDAY, Calendar.WEDNESDAY, Calendar.FRIDAY)
+ for (day in daysOfWeek.shuffled().take(3)) {
+ val calendar = Calendar.getInstance().apply {
+ set(Calendar.DAY_OF_WEEK, day)
+ set(Calendar.HOUR_OF_DAY, 9) // Set reminder at 9 AM
+ set(Calendar.MINUTE, 0)
+ set(Calendar.SECOND, 0)
}
- true
+
+ val intent = Intent(context, ReminderReceiver::class.java)
+ val pendingIntent = PendingIntent.getBroadcast(
+ context, day, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
+ )
+
+ alarmManager.setRepeating(
+ AlarmManager.RTC_WAKEUP,
+ calendar.timeInMillis,
+ AlarmManager.INTERVAL_DAY * 7, // Repeat every week
+ pendingIntent
+ )
}
}
+
+ private fun navigationBottomBar() {
+ val bottomNav = findViewById(R.id.nav_view)
+
+ bottomNav.setOnItemSelectedListener { item ->
+ when (item.itemId) {
+ R.id.nav_home -> {
+ finish()
+ startActivity(intent)
+ overridePendingTransition(0, 0)
+ true
+ }
+ R.id.nav_profile -> {
+ startActivity(Intent(this, ProfileActivity::class.java))
+ true
+ }
+ else -> false
+ }
+ }
+
+ binding.ivAdd.setOnClickListener {
+ if (dailyReport) {
+ Toast.makeText(this, "Daily Report Already Created", Toast.LENGTH_SHORT).show()
+ } else {
+ startActivity(Intent(this, JournalInputActivity::class.java))
+ }
+ }
+ }
+
+
private fun getWeekCount() {
val today = Calendar.getInstance()
val userID = user.currentUser!!.uid
@@ -116,6 +172,7 @@ class MainActivity : AppCompatActivity() {
}
private fun dailycheck() {
+ getWeekCount()
val today = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(android.icu.util.Calendar.getInstance().time).toString()
val userID = user.currentUser!!.uid
database.getReference("users").child(userID).child("journal").get().addOnCompleteListener { task ->
@@ -124,7 +181,8 @@ class MainActivity : AppCompatActivity() {
if (it.child("date").value.toString() == today) {
dailyReport = true
switchLayout()
- populateTodayReport()
+ val referencePath = it.key ?: return@forEach
+ populateTodayReport(referencePath)
}
}
} else {
@@ -158,9 +216,12 @@ class MainActivity : AppCompatActivity() {
val user = FirebaseAuth.getInstance().currentUser
if (user == null) {
Toast.makeText(this, "Please Login to an account", Toast.LENGTH_SHORT).show()
+
+ // Redirect to LoginActivity
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
finish()
+
} else {
Toast.makeText(this, "Welcome back!", Toast.LENGTH_SHORT).show()
dailycheck()
@@ -183,14 +244,15 @@ class MainActivity : AppCompatActivity() {
if (task.isSuccessful) {
healthDataList.clear()
task.result.children.forEach { snapshot ->
- val journalID = snapshot.child("date").value.toString()
+ 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("task").value as? List> ?: emptyList()
- val resultData = ResultData(journalID, bloodSugar, diastolicBP, systolicBP, BMI, date)
+ val resultData = ResultData(journalID, bloodSugar, diastolicBP, systolicBP, BMI, date, task)
healthDataList.add(resultData)
}
mainAdapter.notifyDataSetChanged()
@@ -202,24 +264,19 @@ class MainActivity : AppCompatActivity() {
}
- private fun populateTodayReport(){
- val today = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(android.icu.util.Calendar.getInstance().time).toString()
+ private fun populateTodayReport(referencePath: String){
val userID = user.currentUser!!.uid
- database.getReference("users").child(userID).child("journal").get().addOnCompleteListener { task ->
- if (task.isSuccessful) {
- task.result.children.forEach {
- if (it.child("date").value.toString() == today) {
- binding.tvBloodsugarLevel.text = it.child("bloodSugar").value.toString()+" mg/dL"
- binding.tvBloodsugarDesc.text = it.child("recommendation").child("bloodSugarAnalysis").value.toString()
- binding.tvBloodpressureLevel.text = it.child("bloodPressureDIA").value.toString()+"/"+it.child("bloodPressureSYS").value.toString()+" mm Hg"
- binding.tvBloodpressureDesc.text = it.child("recommendation").child("bloodPressureAnalysis").value.toString()
- binding.tvBmiLevel.text = it.child("BMI").value.toString() +" BMI"
- binding.tvBmiDesc.text = it.child("recommendation").child("BMIAnalysis").value.toString()
- }
- }
+ database.getReference("users").child(userID).child("journal").child(referencePath).get().addOnCompleteListener {
+ if (it.isSuccessful) {
+ binding.tvBloodsugarLevel.text = it.result.child("bloodSugar").value.toString()+" mg/dL"
+ 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.tvBloodpressureDesc.text = it.result.child("recommendation").child("bloodPressureAnalysis").value.toString()
+ binding.tvBmiLevel.text = it.result.child("BMI").value.toString() +" BMI"
+ binding.tvBmiDesc.text = it.result.child("recommendation").child("BMIAnalysis").value.toString()
} else {
- Log.d("error", task.exception!!.message.toString())
- Toast.makeText(this, task.exception!!.message, Toast.LENGTH_SHORT).show()
+ Log.d("error", it.exception!!.message.toString())
+ Toast.makeText(this, it.exception!!.message, Toast.LENGTH_SHORT).show()
}
}
}
diff --git a/app/src/main/java/com/healthjournal/ui/dashboard/MainAdapter.kt b/app/src/main/java/com/healthjournal/ui/dashboard/MainAdapter.kt
index da81314..0f6e982 100644
--- a/app/src/main/java/com/healthjournal/ui/dashboard/MainAdapter.kt
+++ b/app/src/main/java/com/healthjournal/ui/dashboard/MainAdapter.kt
@@ -19,6 +19,7 @@ class MainAdapter(private val healthDataList: MutableList) : Recycle
val tvDate: TextView = view.findViewById(R.id.tv_date)
val tvBloodSugar: TextView = view.findViewById(R.id.tv_BS_Level)
val tvBloodPressure: TextView = view.findViewById(R.id.tv_BP_Level)
+ val tvGoals: TextView = view.findViewById(R.id.tv_goals_count)
}
// Function to update the list and notify the adapter
@@ -48,8 +49,19 @@ class MainAdapter(private val healthDataList: MutableList) : Recycle
}
}
- private fun countGoals (){
-
+ private fun countGoals (list: List>): String {
+ var completedGoals = 0
+ var goalsCount = 0
+ for (item in list) {
+ if (item["completed"] == true) {
+ completedGoals++
+ }
+ goalsCount++
+ }
+ if (completedGoals == 0) {
+ return "No goals completed"
+ }
+ return "$completedGoals/$goalsCount goals completed"
}
override fun onBindViewHolder(holder: HealthViewHolder, position: Int) {
@@ -59,11 +71,11 @@ class MainAdapter(private val healthDataList: MutableList) : Recycle
holder.tvDate.text = healthData.date
holder.tvBloodSugar.text = "${healthData.bloodSugar} mg/dL"
holder.tvBloodPressure.text = "${healthData.diastolicBP}/${healthData.systolicBP} mm Hg"
-
+ holder.tvGoals.text = countGoals(healthData.task)
holder.itemView.setOnClickListener {
val context = holder.itemView.context
val intent = Intent(context, DetailJournalActivity::class.java).apply {
- putExtra("HEALTH_DATA", healthData)
+ putExtra("JOURNAL_KEY", healthData.journalID)
}
context.startActivity(intent)
}
diff --git a/app/src/main/java/com/healthjournal/ui/journal/detail/DetailJournalActivity.kt b/app/src/main/java/com/healthjournal/ui/journal/detail/DetailJournalActivity.kt
index 33938d5..67bb855 100644
--- a/app/src/main/java/com/healthjournal/ui/journal/detail/DetailJournalActivity.kt
+++ b/app/src/main/java/com/healthjournal/ui/journal/detail/DetailJournalActivity.kt
@@ -23,47 +23,70 @@ class DetailJournalActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = ActivityDetailJournalBinding.inflate(layoutInflater)
setContentView(binding.root)
- val healthData = intent.getSerializableExtra("HEALTH_DATA") as? ResultData
-
+ user = FirebaseAuth.getInstance()
+ setupListener()
+ populateDetailJournal()
}
+ private fun countGoals(taskList: List>): String {
+ var completedGoals = 0
+ val totalGoals = taskList.size
+
+ for (task in taskList) {
+ val isCompleted = task["completed"] as? Boolean ?: false
+ if (isCompleted) {
+ completedGoals++
+ }
+ }
+
+ return when {
+ totalGoals == 0 -> "No goals available"
+ completedGoals == 0 -> "No goals completed"
+ else -> "$completedGoals/$totalGoals goals completed"
+ }
+ }
private fun populateDetailJournal() {
val userID = user.currentUser?.uid
- val journalDate = intent.getStringExtra("JOURNAL_DATE")
- if (userID != null && journalDate != null) {
- database.getReference("users").child(userID).child("journal").child(journalDate).get()
- .addOnCompleteListener(DetailJournalActivity()) {
- if (it.isSuccessful) {
- val data = it.result
- if (data != null) {
-/*
- binding.tvBloodsugarLevel2.text = data.bloodSugarLevel
- binding.tvBloodsugarDesc.text = data.bloodSugarDesc
- binding.tvBloodpressureLevel2.text = data.bloodPressureLevel
- binding.tvBloodpressureDesc.text = data.bloodPressureDesc
- binding.tvBMILevel2.text = data.bmiLevel
- binding.tvBMIDesc.text = data.bmiDesc
- binding.tvGoals2.text = countGoalsCompleted(data.goalsCompleted)
- binding.tvJournalNote.text = data.journalNote
-*/
+ val journalID = intent.getStringExtra("JOURNAL_KEY")
+
+ if (userID != null && journalID != null) {
+ database.getReference("users").child(userID).child("journal").child(journalID).get()
+ .addOnCompleteListener(this) { task ->
+ if (task.isSuccessful) {
+ val result = task.result
+ if (result.exists()) {
+ binding.tvBloodsugarLevel2.text = "${result.child("bloodSugar").value ?: "N/A"} mg/dL"
+ binding.tvBloodsugarDesc.text = result.child("recommendation").child("bloodSugarAnalysis").value?.toString() ?: "No data"
+ binding.tvBloodpressureLevel2.text = "${result.child("bloodPressureDIA").value ?: "N/A"}/${result.child("bloodPressureSYS").value ?: "N/A"} mm Hg"
+ binding.tvBloodpressureDesc.text = result.child("recommendation").child("bloodPressureAnalysis").value?.toString() ?: "No data"
+ binding.tvBMILevel2.text = "${result.child("BMI").value ?: "N/A"} BMI"
+ binding.tvBMIDesc.text = result.child("recommendation").child("BMIAnalysis").value?.toString() ?: "No data"
+ binding.tvJournalNote.text = result.child("note").value?.toString() ?: "No notes available"
+
+ val taskListSnapshot = result.child("recommendation").child("tasks")
+ Log.d("debug", taskListSnapshot.toString())
+ val taskList = mutableListOf>()
+ if (taskListSnapshot.exists()) {
+ for (taskSnapshot in taskListSnapshot.children) {
+ val taskMap = taskSnapshot.value as? Map
+ if (taskMap != null) {
+ taskList.add(taskMap)
+ }
+ }
+ }
+
+ binding.tvGoals2.text = countGoals(taskList)
+ } else {
+ Toast.makeText(this, "No journal entry found.", Toast.LENGTH_SHORT).show()
}
} else {
- Toast.makeText(this, it.exception!!.message, Toast.LENGTH_SHORT).show()
- Log.d("error", it.exception!!.message.toString())
+ Toast.makeText(this, task.exception?.message ?: "Error fetching data", Toast.LENGTH_SHORT).show()
+ Log.d("error", task.exception?.message.toString())
}
}
}
}
- private fun countGoalsCompleted(goalsCompleted: List): String {
- var count = 0
- for (completed in goalsCompleted) {
- if (completed) {
- count++
- }
- }
- return count.toString()
- }
private fun deleteHistory() {
val userID = user.currentUser?.uid
diff --git a/app/src/main/java/com/healthjournal/ui/profile/ProfileActivity.kt b/app/src/main/java/com/healthjournal/ui/profile/ProfileActivity.kt
index b9c924b..396c6f4 100644
--- a/app/src/main/java/com/healthjournal/ui/profile/ProfileActivity.kt
+++ b/app/src/main/java/com/healthjournal/ui/profile/ProfileActivity.kt
@@ -24,10 +24,14 @@ class ProfileActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = ActivityProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
+
+ user = FirebaseAuth.getInstance()
+
setupListener()
populateData()
}
+
private fun setupListener() {
binding.btnLogout.setOnClickListener {
logout()
@@ -47,13 +51,11 @@ class ProfileActivity : AppCompatActivity() {
private fun updateData(){
val userID = user.currentUser?.uid
val name = binding.edtName.text.toString()
- val email = binding.edtEmail.text.toString()
- val date = binding.edtDates.text.toString()
+ val date = binding.edtDate.text.toString()
val weight = binding.edtInputWeight.text.toString()
val height = binding.edtInputHeight.text.toString()
val userRef = database.getReference("users").child(userID!!)
userRef.child("name").setValue(name)
- userRef.child("email").setValue(email)
userRef.child("date").setValue(date)
userRef.child("weight").setValue(weight)
userRef.child("height").setValue(height)
@@ -61,13 +63,14 @@ class ProfileActivity : AppCompatActivity() {
populateData()
}
- private fun populateData(){
- val userID = user.currentUser?.uid
- val userRef = database.getReference("users").child(userID!!)
- userRef.get().addOnCompleteListener(ProfileActivity()){
- if (it.isSuccessful){
+ private fun populateData() {
+ val userID = user.currentUser?.uid ?: return
+ val userRef = database.getReference("users").child(userID)
+
+ userRef.get().addOnCompleteListener(this) {
+ if (it.isSuccessful) {
binding.edtName.setText(it.result.child("name").value.toString())
- binding.edtDates.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.edtInputWeight.setText(it.result.child("weight").value.toString())
} else {
@@ -78,4 +81,5 @@ class ProfileActivity : AppCompatActivity() {
}
+
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/baseline_add_circle_24.xml b/app/src/main/res/drawable/baseline_add_circle_24.xml
new file mode 100644
index 0000000..139c787
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_add_circle_24.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_dashboard.xml b/app/src/main/res/drawable/bg_dashboard.xml
new file mode 100644
index 0000000..f4b7464
--- /dev/null
+++ b/app/src/main/res/drawable/bg_dashboard.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_input_box.xml b/app/src/main/res/drawable/bg_input_box.xml
new file mode 100644
index 0000000..4efcf5f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_input_box.xml
@@ -0,0 +1,12 @@
+
+
+ -
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_add.png b/app/src/main/res/drawable/ic_add.png
deleted file mode 100644
index dbc2569..0000000
Binary files a/app/src/main/res/drawable/ic_add.png and /dev/null differ
diff --git a/app/src/main/res/drawable/ic_home.png b/app/src/main/res/drawable/ic_home.png
deleted file mode 100644
index df3df3a..0000000
Binary files a/app/src/main/res/drawable/ic_home.png and /dev/null differ
diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml
new file mode 100644
index 0000000..b78e2cb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml
new file mode 100644
index 0000000..fd1545f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_notifications.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_profile.png b/app/src/main/res/drawable/ic_profile.png
deleted file mode 100644
index d5b5249..0000000
Binary files a/app/src/main/res/drawable/ic_profile.png and /dev/null differ
diff --git a/app/src/main/res/drawable/ic_profile.xml b/app/src/main/res/drawable/ic_profile.xml
new file mode 100644
index 0000000..7856730
--- /dev/null
+++ b/app/src/main/res/drawable/ic_profile.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_detail_journal.xml b/app/src/main/res/layout/activity_detail_journal.xml
index 6fa8ebf..617a743 100644
--- a/app/src/main/res/layout/activity_detail_journal.xml
+++ b/app/src/main/res/layout/activity_detail_journal.xml
@@ -49,10 +49,11 @@
android:id="@+id/tv_bloodsugar_level2"
android:layout_width="80dp"
android:layout_height="wrap_content"
- android:textColor="@color/Accent_Light_Red"
- android:textStyle="bold"
android:layout_marginTop="10dp"
-
+ android:textColor="@color/Accent_Light_Red"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ app:layout_constraintBottom_toBottomOf="@+id/tv_bloodsugar_level1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.02"
app:layout_constraintStart_toEndOf="@id/tv_bloodsugar_level1"
@@ -64,7 +65,7 @@
android:id="@+id/tv_bloodsugar_desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:textSize="8sp"
+ android:textSize="10sp"
app:layout_constraintEnd_toEndOf="@+id/tv_bloodsugar_level2"
app:layout_constraintStart_toStartOf="@+id/tv_bloodsugar_level1"
app:layout_constraintTop_toBottomOf="@id/tv_bloodsugar_level1"
@@ -88,9 +89,11 @@
android:id="@+id/tv_bloodpressure_level2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/Accent_Light_Red"
- android:textStyle="bold"
android:layout_marginTop="10dp"
+ android:textColor="@color/Accent_Light_Red"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ app:layout_constraintBottom_toBottomOf="@+id/tv_bloodpressure_level1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.02"
app:layout_constraintStart_toEndOf="@id/tv_bloodpressure_level1"
@@ -102,7 +105,7 @@
android:id="@+id/tv_bloodpressure_desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:textSize="8sp"
+ android:textSize="10sp"
app:layout_constraintEnd_toEndOf="@+id/tv_bloodpressure_level2"
app:layout_constraintStart_toStartOf="@+id/tv_bloodpressure_level1"
app:layout_constraintTop_toBottomOf="@id/tv_bloodpressure_level1"
@@ -126,9 +129,12 @@
android:id="@+id/tv_BMI_level2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/Accent_Light_Red"
- android:textStyle="bold"
android:layout_marginTop="10dp"
+ android:textColor="@color/Accent_Light_Red"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ android:maxLength="9"
+ app:layout_constraintBottom_toBottomOf="@+id/tv_BMI_level1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.02"
app:layout_constraintStart_toEndOf="@id/tv_BMI_level1"
@@ -140,7 +146,7 @@
android:id="@+id/tv_BMI_desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:textSize="8sp"
+ android:textSize="10sp"
app:layout_constraintEnd_toEndOf="@+id/tv_BMI_level2"
app:layout_constraintStart_toStartOf="@+id/tv_BMI_level1"
app:layout_constraintTop_toBottomOf="@id/tv_BMI_level1"
@@ -150,14 +156,14 @@
android:id="@+id/tv_goals1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="Recommend Goals Completed :"
+ android:layout_marginTop="8dp"
+ android:text="Goals Completed :"
android:textColor="@color/Primary_Dark"
android:textSize="16sp"
android:textStyle="bold"
- android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.554"
- app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="@+id/tv_BMI_level1"
app:layout_constraintTop_toBottomOf="@id/tv_BMI_desc" />
@@ -178,7 +186,7 @@
android:id="@+id/tv_title_note"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
+ android:layout_marginTop="5dp"
android:text="JOURNAL NOTES"
android:textAlignment="center"
android:textColor="@color/Primary_Dark"
@@ -189,26 +197,19 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout" />
-
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vehicula quam et diam consequat, et vestibulum odio consequat. Curabitur sit amet ex auctor ex pharetra placerat a lacinia sapien. In semper nisl eu elit elementum ultrices. Ut hendrerit urna lacinia efficitur euismod. In hac habitasse platea dictumst. Phasellus id tellus sed justo scelerisque vestibulum sit amet commodo tellus. Proin commodo magna purus, non ullamcorper mi blandit sed. Curabitur scelerisque eros nisi, vitae bibendum quam malesuada et. Suspendisse potenti. Vestibulum eu dui a odio posuere laoreet sed ut lectus. Vivamus ultrices sem sit amet enim dictum rhoncus. Nullam pharetra, purus sed bibendum volutpat, diam nibh blandit nunc, ut gravida velit sem eget eros. Maecenas in arcu accumsan, maximus enim id, ullamcorper metus. Morbi blandit nisi non justo hendrerit, in semper velit feugiat. Vestibulum vestibulum nisl sit amet facilisis ullamcorper." />
-
-
+ app:layout_constraintTop_toBottomOf="@+id/tv_journal_note" />
diff --git a/app/src/main/res/layout/activity_journal_input.xml b/app/src/main/res/layout/activity_journal_input.xml
index d47095d..8028e78 100644
--- a/app/src/main/res/layout/activity_journal_input.xml
+++ b/app/src/main/res/layout/activity_journal_input.xml
@@ -5,7 +5,7 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/Secondary_Light"
+ android:background="@drawable/bg_login"
tools:context=".ui.journal.input.JournalInputActivity">
-
-
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="@+id/cl_input_note"
+ app:layout_constraintTop_toBottomOf="@+id/tv_title_journal"
+ app:layout_constraintVertical_bias="0.03">
-
+ app:layout_constraintEnd_toEndOf="@+id/tv_input_blood_pressure_SYS"
+ app:layout_constraintStart_toStartOf="@+id/tv_input_blood_pressure_SYS"
+ app:layout_constraintTop_toBottomOf="@id/tv_input_blood_pressure_SYS" />
-
-
-
+ app:layout_constraintTop_toTopOf="@+id/cl_input_blood_pressure_SYS">
-
+ app:layout_constraintEnd_toEndOf="@+id/tv_input_blood_pressure_DIA"
+ app:layout_constraintStart_toStartOf="@+id/tv_input_blood_pressure_DIA"
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_blood_pressure_DIA" />
-
-
-
-
-
-
-
-
+ app:layout_constraintEnd_toEndOf="@+id/tv_input_blood_sugar"
+ app:layout_constraintStart_toStartOf="@+id/tv_input_blood_sugar"
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_blood_sugar" />
+ app:layout_constraintVertical_bias="0.048">
-
+
+
+ app:layout_constraintStart_toStartOf="parent" />
-
-
-
+ android:id="@+id/edt_age"
+ android:layout_width="match_parent"
+ android:layout_height="20dp"
+ android:background="@color/white"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ android:id="@+id/edt_height"
+ android:layout_width="match_parent"
+ android:layout_height="20dp"
+ android:background="@color/white"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
-
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_note" />
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index fa4f3ca..744b5b2 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -12,7 +12,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
- android:background="@color/Accent_Dark_Gray"
+ android:background="@drawable/bg_dashboard"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
@@ -25,7 +25,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
-
+z
+
+
+
-
+
+
+
+
-
+
+
+
+
-
+
+
+
+
-
+
+
@@ -253,8 +350,8 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintVertical_bias="0.700" />
+ app:layout_constraintTop_toBottomOf="@id/cl_Daily_Report_1"
+ app:layout_constraintVertical_bias="0.0" />
+
+
+ app:menu="@menu/bottom_nav_menu" />
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml
index fd5165f..e10ae0a 100644
--- a/app/src/main/res/layout/activity_profile.xml
+++ b/app/src/main/res/layout/activity_profile.xml
@@ -85,7 +85,7 @@
android:layout_marginStart="32dp"
android:layout_marginTop="10dp"
android:fontFamily="@font/poppins_regular"
- android:text="Name"
+ android:text="Nama"
android:textColor="@color/Primary_Dark"
android:textSize="12sp"
android:textStyle="bold"
@@ -102,49 +102,50 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_name">
-
+
+ app:layout_constraintTop_toBottomOf="@+id/tl_name" />
+ app:layout_constraintTop_toBottomOf="@+id/tv_date">
+ android:layout_height="wrap_content"
+ android:inputType="none"
+ android:focusable="false"
+ android:clickable="true"
+ android:background="@drawable/bg_input_box"
+ android:textColor="@color/black" />
+ app:layout_constraintTop_toTopOf="@+id/cl_input_weight">
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_height" />
+ app:layout_constraintTop_toBottomOf="@+id/tl_date_of_birth"
+ app:layout_constraintVertical_bias="0.167">
-
-
-
-
-
+
+ app:layout_constraintTop_toBottomOf="@+id/cl_input_weight" />
-
-
+ android:layout_width="60dp"
+ android:layout_height="30dp"
+ android:background="@drawable/bg_input_box"
+ android:textColor="@color/black"
+ android:textAlignment="center"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_weight"
+ android:inputType="number"/>
-
@@ -152,7 +148,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/poppins_regular"
- android:text="Tinggi\nBadan"
+ android:text="Tinggi Badan\n(CM)"
android:textAlignment="center"
android:textColor="@color/Primary_Dark"
android:textSize="12sp"
@@ -161,24 +157,17 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
-
-
-
+ android:layout_width="60dp"
+ android:layout_height="30dp"
+ android:background="@drawable/bg_input_box"
+ android:textColor="@color/black"
+ android:textAlignment="center"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/tv_input_height"/>
+ app:layout_constraintTop_toBottomOf="@id/cl_input_height" />
+
+ android:padding="5dp"
+ android:layout_width="360dp"
+ android:layout_height="130dp">
+ app:layout_constraintVertical_bias="0.0" />
+ app:layout_constraintVertical_bias="0.647" />
@@ -82,7 +84,7 @@
android:text="Blood Pressure Level :"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.342"
+ app:layout_constraintHorizontal_bias="0.604"
app:layout_constraintStart_toEndOf="@+id/iv_user"
app:layout_constraintTop_toBottomOf="@+id/tv_sub_BSL"
app:layout_constraintVertical_bias="0.042" />
@@ -108,12 +110,13 @@
android:text="Recommended goals completed"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.387"
+ app:layout_constraintHorizontal_bias="0.666"
app:layout_constraintStart_toEndOf="@+id/iv_user"
app:layout_constraintTop_toBottomOf="@+id/tv_sub_BPL"
- app:layout_constraintVertical_bias="0.0" />
+ app:layout_constraintVertical_bias="0.038" />
- Kolom ini tidak boleh kurang dari 8 karakter!
Kolom ini tidak boleh kosong!
This field is required!
+
+ // Activity Login
+
+ // Activity Register
+
+ // Activity Detail Journal
+
+ // Activity Journal Input
+
+ // Activity Recommendation
+
+ // Activity S
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 18d9972..32469a9 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,9 +1,39 @@
-
+
+
+
+
+
\ No newline at end of file