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