Second Commit:

Version 1.5 [Partialy Optimized Version] [UI Fixes And Improvment]
Todo:
Optimized the Code
Add String Theolgy
This commit is contained in:
Diassdp
2025-05-14 23:03:53 +07:00
parent e2882ad0f6
commit 7474a84575
9 changed files with 187 additions and 34 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools" >
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
@ -13,7 +13,14 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HealthJournal"
tools:targetApi="31">
tools:targetApi="31" >
<activity
android:name=".ui.laporan"
android:exported="false" />
<activity
android:name=".laporan"
android:exported="false"
android:theme="@style/Theme.HealthJournal" />
<activity
android:name=".ui.journal.detail.DetailJournalActivity"
android:exported="false" />
@ -37,10 +44,10 @@
android:exported="false" />
<activity
android:name=".ui.login.LoginActivity"
android:exported="false"/>
android:exported="false" />
<activity
android:name=".ui.dashboard.MainActivity"
android:exported="true">
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -0,0 +1,96 @@
package com.healthjournal.ui
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.healthjournal.R
class laporan : AppCompatActivity() {
private lateinit var lineChart: LineChart
private val jsonString = """
{
"journal": {
"-OI9BcS6G4-Ftau4WJe0": {
"BMI": 22.7731876373291,
"bloodPressureDIA": "76",
"bloodPressureSYS": "113",
"bloodSugar": "80",
"date": "03/02/2025"
},
"-OIJnaHgm2dP_Mbzu2Ta": {
"BMI": 22.7731876373291,
"bloodPressureDIA": "72",
"bloodPressureSYS": "109",
"bloodSugar": "89",
"date": "05/02/2025"
}
}
}
"""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lineChart = findViewById(R.id.lineChart)
renderChart()
}
private fun renderChart() {
val labels = ArrayList<String>()
val bmiEntries = ArrayList<Entry>()
val sugarEntries = ArrayList<Entry>()
val pressureEntries = ArrayList<Entry>() // We'll use SYS for simplicity
val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
val chartData = JSONObject(jsonString).getJSONObject("journal")
val keys = chartData.keys().asSequence().sortedBy {
sdf.parse(chartData.getJSONObject(it).getString("date"))
}.toList()
keys.forEachIndexed { index, key ->
val entry = chartData.getJSONObject(key)
val date = entry.getString("date")
val bmi = entry.getDouble("BMI").toFloat()
val sugar = entry.getString("bloodSugar").toFloat()
val pressure = entry.getString("bloodPressureSYS").toFloat()
labels.add(date)
bmiEntries.add(Entry(index.toFloat(), bmi))
sugarEntries.add(Entry(index.toFloat(), sugar))
pressureEntries.add(Entry(index.toFloat(), pressure))
}
val bmiDataSet = LineDataSet(bmiEntries, "BMI").apply {
color = resources.getColor(android.R.color.holo_green_dark)
setCircleColor(color)
}
val sugarDataSet = LineDataSet(sugarEntries, "Blood Sugar").apply {
color = resources.getColor(android.R.color.holo_red_dark)
setCircleColor(color)
}
val pressureDataSet = LineDataSet(pressureEntries, "Blood Pressure (SYS)").apply {
color = resources.getColor(android.R.color.holo_blue_dark)
setCircleColor(color)
}
val lineData = LineData(bmiDataSet, sugarDataSet, pressureDataSet)
lineChart.data = lineData
val xAxis = lineChart.xAxis
xAxis.valueFormatter = IndexAxisValueFormatter(labels)
xAxis.position = XAxis.XAxisPosition.BOTTOM
xAxis.granularity = 1f
xAxis.labelRotationAngle = -45f
lineChart.axisRight.isEnabled = false
lineChart.description.text = "Health Metrics Over Time"
lineChart.invalidate()
}
}

View File

@ -1,21 +0,0 @@
package com.healthjournal.ui.splashscreen
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.healthjournal.R
class SplashscreenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_splashscreen)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}

View File

@ -5,6 +5,12 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.splashscreen.SplashscreenActivity">
tools:context=".ui.laporan">
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/lineChart"
android:layout_width="match_parent"
android:layout_height="400dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -454,7 +454,6 @@ z
android:textColor="@color/white"
android:textSize="14sp"
app:backgroundTint="@color/Accent_Light_Orange"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintStart_toStartOf="parent"
@ -479,6 +478,21 @@ z
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fl_daily_counter"
app:layout_constraintVertical_bias="1.0" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_report"
android:layout_width="240dp"
android:layout_height="40dp"
android:layout_marginTop="60dp"
android:background="@drawable/bg_button"
android:text="Lihat Laporan"
android:textAllCaps="true"
android:textColor="@color/white"
android:textSize="14sp"
app:backgroundTint="@color/Primary_Dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fl_daily_counter"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView

View File

@ -278,7 +278,7 @@
android:layout_height="39dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_button"
android:text="Input Data"
android:text="Update Profile"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="14sp"

View File

@ -146,7 +146,6 @@
tools:text="This is still considered an acceptable range, and is associated with good health." />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/tv_title_recommendation"
android:layout_width="wrap_content"
@ -162,14 +161,20 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_tasks"
<ScrollView
android:id="@+id/sv_tasks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:itemCount="4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:listitem="@layout/item_goals_recommendation"
app:layout_constraintTop_toBottomOf="@+id/tv_title_recommendation" />
app:layout_constraintTop_toBottomOf="@+id/tv_title_recommendation">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_tasks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:itemCount="4"
tools:listitem="@layout/item_goals_recommendation" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,6 +7,48 @@
<string name="password_length">Kolom ini tidak boleh kurang dari 8 karakter!</string>
<string name="empty_field">Kolom ini tidak boleh kosong!</string>
<string name="required_field">This field is required!</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="lorem_ipsum">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
// Activity Login

View File

@ -12,6 +12,8 @@ constraintlayout = "2.1.4"
googleGmsGoogleServices = "4.4.2"
firebaseDatabase = "21.0.0"
firebaseAuth = "23.1.0"
navigationFragmentKtx = "2.8.5"
navigationUiKtx = "2.8.5"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@ -24,6 +26,8 @@ androidx-activity = { group = "androidx.activity", name = "activity", version.re
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
firebase-database = { group = "com.google.firebase", name = "firebase-database", version.ref = "firebaseDatabase" }
firebase-auth = { group = "com.google.firebase", name = "firebase-auth", version.ref = "firebaseAuth" }
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }