From 7474a8457535df06fbf6bf258e257740d0cb87d4 Mon Sep 17 00:00:00 2001 From: Diassdp <149257568+Diassdp@users.noreply.github.com> Date: Wed, 14 May 2025 23:03:53 +0700 Subject: [PATCH] Second Commit: Version 1.5 [Partialy Optimized Version] [UI Fixes And Improvment] Todo: Optimized the Code Add String Theolgy --- app/src/main/AndroidManifest.xml | 15 ++- .../main/java/com/healthjournal/ui/laporan.kt | 96 +++++++++++++++++++ .../ui/splashscreen/SplashscreenActivity.kt | 21 ---- ..._splashscreen.xml => activity_laporan.xml} | 8 +- app/src/main/res/layout/activity_main.xml | 16 +++- app/src/main/res/layout/activity_profile.xml | 2 +- .../res/layout/activity_recommendation.xml | 17 ++-- app/src/main/res/values/strings.xml | 42 ++++++++ gradle/libs.versions.toml | 4 + 9 files changed, 187 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/healthjournal/ui/laporan.kt delete mode 100644 app/src/main/java/com/healthjournal/ui/splashscreen/SplashscreenActivity.kt rename app/src/main/res/layout/{activity_splashscreen.xml => activity_laporan.xml} (58%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0bae317..980bf19 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools" > @@ -13,7 +13,14 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.HealthJournal" - tools:targetApi="31"> + tools:targetApi="31" > + + @@ -37,10 +44,10 @@ android:exported="false" /> + android:exported="false" /> + android:exported="true" > diff --git a/app/src/main/java/com/healthjournal/ui/laporan.kt b/app/src/main/java/com/healthjournal/ui/laporan.kt new file mode 100644 index 0000000..4ec7ff6 --- /dev/null +++ b/app/src/main/java/com/healthjournal/ui/laporan.kt @@ -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() + val bmiEntries = ArrayList() + val sugarEntries = ArrayList() + val pressureEntries = ArrayList() // 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() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/healthjournal/ui/splashscreen/SplashscreenActivity.kt b/app/src/main/java/com/healthjournal/ui/splashscreen/SplashscreenActivity.kt deleted file mode 100644 index 7e406ad..0000000 --- a/app/src/main/java/com/healthjournal/ui/splashscreen/SplashscreenActivity.kt +++ /dev/null @@ -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 - } - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splashscreen.xml b/app/src/main/res/layout/activity_laporan.xml similarity index 58% rename from app/src/main/res/layout/activity_splashscreen.xml rename to app/src/main/res/layout/activity_laporan.xml index 05da7f0..476b0bf 100644 --- a/app/src/main/res/layout/activity_splashscreen.xml +++ b/app/src/main/res/layout/activity_laporan.xml @@ -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"> + + + \ 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 b373227..c0c2140 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -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" /> + + - - + app:layout_constraintTop_toBottomOf="@+id/tv_title_recommendation"> + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e6577e5..077199f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,48 @@ Kolom ini tidak boleh kurang dari 8 karakter! Kolom ini tidak boleh kosong! This field is required! + + First Fragment + Second Fragment + Next + Previous + + + 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. + // Activity Login diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aba11ca..0563d02 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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" }