From b1f05c0d1c5b3620584cd1b4fe54fcf0315f2891 Mon Sep 17 00:00:00 2001 From: Diassdp <149257568+Diassdp@users.noreply.github.com> Date: Sun, 2 Feb 2025 00:12:52 +0700 Subject: [PATCH] Second Commit: Version 1.5 [Partialy Optimized Version] [UI Fixes And Improvment] Todo: Optimized the Code Add String Theolgy --- .idea/deploymentTargetSelector.xml | 8 + app/src/main/AndroidManifest.xml | 2 + .../com/healthjournal/algorithm/Algorithm.kt | 68 +++-- .../main/java/com/healthjournal/data/Data.kt | 4 +- .../notification/NotificationUtils.kt | 27 ++ .../notification/ReminderReceiver.kt | 39 +++ .../ui/dashboard/MainActivity.kt | 115 ++++++--- .../healthjournal/ui/dashboard/MainAdapter.kt | 20 +- .../journal/detail/DetailJournalActivity.kt | 83 +++--- .../ui/profile/ProfileActivity.kt | 22 +- .../res/drawable/baseline_add_circle_24.xml | 5 + app/src/main/res/drawable/bg_dashboard.xml | 11 + app/src/main/res/drawable/bg_input_box.xml | 12 + app/src/main/res/drawable/ic_add.png | Bin 9015 -> 0 bytes app/src/main/res/drawable/ic_home.png | Bin 3322 -> 0 bytes app/src/main/res/drawable/ic_home.xml | 9 + .../main/res/drawable/ic_notifications.xml | 5 + app/src/main/res/drawable/ic_profile.png | Bin 4083 -> 0 bytes app/src/main/res/drawable/ic_profile.xml | 9 + .../res/layout/activity_detail_journal.xml | 67 ++--- .../res/layout/activity_journal_input.xml | 237 ++++++++---------- app/src/main/res/layout/activity_main.xml | 201 +++++++++++---- app/src/main/res/layout/activity_profile.xml | 189 +++++++------- app/src/main/res/layout/activity_register.xml | 2 +- .../main/res/layout/activity_users_input.xml | 67 +++-- .../main/res/layout/item_health_history.xml | 23 +- app/src/main/res/menu/bottom_nav_menu.xml | 2 +- app/src/main/res/values/strings.xml | 12 + app/src/main/res/values/themes.xml | 34 ++- 29 files changed, 825 insertions(+), 448 deletions(-) create mode 100644 app/src/main/java/com/healthjournal/notification/NotificationUtils.kt create mode 100644 app/src/main/java/com/healthjournal/notification/ReminderReceiver.kt create mode 100644 app/src/main/res/drawable/baseline_add_circle_24.xml create mode 100644 app/src/main/res/drawable/bg_dashboard.xml create mode 100644 app/src/main/res/drawable/bg_input_box.xml delete mode 100644 app/src/main/res/drawable/ic_add.png delete mode 100644 app/src/main/res/drawable/ic_home.png create mode 100644 app/src/main/res/drawable/ic_home.xml create mode 100644 app/src/main/res/drawable/ic_notifications.xml delete mode 100644 app/src/main/res/drawable/ic_profile.png create mode 100644 app/src/main/res/drawable/ic_profile.xml 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 dbc2569120f0adc3609fcaa9d86e7107708d4d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9015 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 + + 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 d5b5249219f7eea230104417529717c347fb3568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4083 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 leI`O#W~Hzt6I8L);{TFm2k$qXai{ + + 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