From 0460b52df17da67e50235a75952989f1db2981cd Mon Sep 17 00:00:00 2001
From: Rustam Ibrahimov <@r.ibrahimov>
Date: Thu, 31 Oct 2024 17:47:00 +0400
Subject: [PATCH 1/5] Have implemented showing notification. Have added
conditions for checking 10 days
---
.idea/gradle.xml | 8 +---
.idea/modules.xml | 8 ----
.../.composeApp-appleMain.cinteropLibraries | 8 ++--
.../.composeApp-appleTest.cinteropLibraries | 8 ++--
.../.composeApp-iosMain.cinteropLibraries | 8 ++--
.../.composeApp-iosTest.cinteropLibraries | 8 ++--
.../.composeApp-nativeMain.cinteropLibraries | 8 ++--
.../.composeApp-nativeTest.cinteropLibraries | 8 ++--
...cinterop-androidXBundledSqlite-0MuvrA.klib | Bin 2269 -> 2269 bytes
...ite-framework-cinterop-sqlite3-GE3pgw.klib | Bin 24800 -> 24800 bytes
...ose.ui_ui-uikit-cinterop-utils-DC3XFw.klib | Bin 6169 -> 6169 bytes
...linx_atomicfu-cinterop-interop-yBS35w.klib | Bin 2433 -> 2433 bytes
composeApp/build.gradle.kts | 5 +-
composeApp/composeApp.podspec | 2 +-
.../src/androidMain/AndroidManifest.xml | 1 +
.../jethabit/app/MainActivity.kt | 3 ++
.../HabbitNotificationManager.android.kt | 41 ++++++++++++++++
.../daily/domain/GetHabitsForTodayUseCase.kt | 7 +--
.../daily/presentation/DailyViewModel.kt | 24 ++++++++--
.../daily/presentation/models/DailyHabit.kt | 3 +-
.../feature/daily/ui/views/HabitCardItem.kt | 8 +++-
.../screens/stats/StatisticsViewModel.kt | 44 ++++++++++++++++--
.../commonMain/kotlin/utils/Date + Utils.kt | 12 +++++
.../HabbitNotificationManager.kt | 9 ++++
gradle/libs.versions.toml | 2 +
25 files changed, 172 insertions(+), 53 deletions(-)
delete mode 100644 .idea/modules.xml
create mode 100644 composeApp/src/androidMain/kotlin/utils/notifications/HabbitNotificationManager.android.kt
create mode 100644 composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 1e66c54..cf1e00e 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,19 +4,15 @@
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 5f68ff0..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
index 26e11649f68dff20654a262f06ae1aa44ea2b260..fafb04b491f26d29e450a1e288ef8469c11042bb 100644
GIT binary patch
delta 203
zcmcaBcvoXiuRt*sI0ILr~B%I5^=etmVHzSh>!{h}_QjG8v_t<1L0+628J&zARYj_UN%<%
delta 203
zcmcaBcvoXiuRt*sI0ILr~B%CWC>bp>YHzSh>!{h}_QjG8v_t<1L0+628J&zARYke`8ewU
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
index e98780c9d419f7d7eb5292268f4d4cee0a566070..204a748a12f6cf7e9c968fb5ed133e9d34351354 100644
GIT binary patch
delta 268
zcmaEGknzDm#tGU?4n7lg&4J{`w7ra64nE(7m>B}RnOP>w#Y#~%iVrPRGJh?GJW^!7L
zJWzOYdyFfHs!x!c{3b>N#1xD5fr&K5T7Z~)Vv|9XVq7xVWdYudOd<@E->XVZUJ>UA
xl6f5mRuB-6qQKExYV!4XumY(Bu!8yocPWq)0=!w-7=VBm2pd=!7`$RYJOE36PPza9
delta 268
zcmaEGknzDm#tGU?0Z|im&4J{`w7ra60a4$Dm>B}RnOP>w#Y#~%iVrPRGJh?GJW^!7L
zJWzOYdyFfHs!x!c{3b>N#1xD5fr&K5T7Z~)Vv|9XVq7xVWdYudOd<@E->XVZUJ>UA
xl6f5mRuB-6qQKExYV!4XumY(Bu!8yocPWq)0=!w-7=VBm2pd=!7`$RYJOBqKQN{oO
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
index ad1bbf7b6d94b502cfe2b9cfbd656cbea9646fa8..fdf83c73ac2caffdf3729ae04dd62adfc7c7cb7d 100644
GIT binary patch
delta 263
zcmbPfFw?P4hhQO2yPAZiwCBZ!h^%LY=LyV%&cK=dSmBt|v|pYKA<43is#WG0IV$%9mx
z3%P=*Iw3a@bxg?P4hhQO2yPAZiwCBZ!h^%LY=LyV%&cK=dSmBu2J?sP96|43is#WG0IV$%9mx
z3%P=*Iw3a@bxg
+
= Build.VERSION_CODES.O) {
+ val channel = NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT)
+ notificationManager.createNotificationChannel(channel)
+ Notification.Builder(context, "channel_id")
+ } else {
+ Notification.Builder(context)
+ }
+
+ builder.setContentTitle(title)
+ .setContentText(content)
+ .setSmallIcon(android.R.drawable.ic_dialog_info)
+ .setAutoCancel(true)
+
+ notificationManager.notify(1, builder.build())
+ }
+
+ actual companion object {
+ private lateinit var appContext: Context
+
+ actual fun create(): HabbitNotificationManager {
+ return HabbitNotificationManager(appContext)
+ }
+
+ fun initialize(context: Context) {
+ appContext = context
+ }
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
index ee6eb2c..b712f00 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
@@ -11,8 +11,7 @@ class GetHabitsForTodayUseCase(
private val habitDao: HabitDao,
private val dailyDao: DailyDao
) {
-
- suspend fun execute(date: LocalDate): List {
+ suspend operator fun invoke(date: LocalDate): List {
val currentDay = date.dayOfWeek.ordinal
val dailyEntries = dailyDao.getAll()
@@ -21,6 +20,7 @@ class GetHabitsForTodayUseCase(
date.compareTo(timestamp) == 0 && it.isChecked
}
.map { it.habitId }
+
val habits = habitDao.getAll()
.filter {
val habitDays = json.decodeFromString>(it.daysToCheck)
@@ -30,7 +30,8 @@ class GetHabitsForTodayUseCase(
DailyHabit(
id = it.id,
title = it.title,
- isChecked = dailyEntries.contains(it.id)
+ isChecked = dailyEntries.contains(it.id),
+ startDate = it.startDate
)
}
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
index 6df6ce3..67174d6 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
@@ -14,6 +14,8 @@ import kotlinx.coroutines.withContext
import kotlinx.datetime.*
import screens.daily.views.mapToHabitCardItemModel
import utils.getTitle
+import utils.notifications.HabbitNotificationManager
+import utils.tenDaysPassed
class DailyViewModel : BaseViewModel(
initialState = DailyViewState()
@@ -37,7 +39,10 @@ class DailyViewModel : BaseViewModel(
DailyEvent.PreviousDayClicked -> performPreviousClick()
DailyEvent.ReloadScreen -> fetchHabitFor(currentDate.current())
DailyEvent.ComposeAction -> viewAction = DailyAction.OpenCompose
- is DailyEvent.HabitCheckClicked -> switchCheckForHabit(viewEvent.habitId, viewEvent.newValue)
+ is DailyEvent.HabitCheckClicked -> switchCheckForHabit(
+ viewEvent.habitId,
+ viewEvent.newValue
+ )
}
}
@@ -45,16 +50,26 @@ class DailyViewModel : BaseViewModel(
val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
val isToday = date.dayOfYear == today.dayOfYear && date.year == today.year
val title = date.getTitle()
-
+
viewState = viewState.copy(
currentDay = title,
hasNextDay = !isToday
)
viewModelScope.launch(Dispatchers.Default) {
- val habits = getHabitsForTodayUseCase.execute(date)
+ val habits = getHabitsForTodayUseCase(date)
.map { it.mapToHabitCardItemModel() }
+ val habit = habits.find { it.title == "Don't smoke" && !it.startDate.isNullOrEmpty() }
+ ?: return@launch
+
+ val startDate = LocalDate.parse(habit.startDate.orEmpty())
+ if (tenDaysPassed(startDate)) {
+ HabbitNotificationManager.create().sendNotification(
+ "Well done!",
+ "You have not smoked more than 10 days!!!")
+ }
+
withContext(Dispatchers.Main) {
viewState = viewState.copy(habits = habits)
}
@@ -83,4 +98,5 @@ class DailyViewModel : BaseViewModel(
}
}
-private fun Instant.current(): LocalDate = this.toLocalDateTime(TimeZone.currentSystemDefault()).date
\ No newline at end of file
+private fun Instant.current(): LocalDate =
+ this.toLocalDateTime(TimeZone.currentSystemDefault()).date
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
index 8d421fb..d1c9aca 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
@@ -3,5 +3,6 @@ package feature.daily.presentation.models
class DailyHabit(
val id: String,
val title: String,
- val isChecked: Boolean
+ val isChecked: Boolean,
+ val startDate: String
)
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
index 395bd88..e515535 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
@@ -16,16 +16,20 @@ import ui.themes.JetHabitTheme
data class HabitCardItemModel(
val habitId: String,
val title: String,
- val isChecked: Boolean
+ val isChecked: Boolean,
+ val startDate: String? = null
)
fun DailyHabit.mapToHabitCardItemModel(): HabitCardItemModel =
HabitCardItemModel(
habitId = id,
title = title,
- isChecked = isChecked
+ isChecked = isChecked,
+ startDate = startDate
)
+
+
@Composable
internal fun HabitCardItem(
model: HabitCardItemModel,
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 0f261ce..0c310b9 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -1,13 +1,23 @@
package screens.stats
+import androidx.compose.ui.input.key.Key.Companion.Period
import androidx.lifecycle.viewModelScope
import base.BaseViewModel
import data.features.daily.DailyRepository
import di.Inject
+import feature.daily.domain.GetHabitsForTodayUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import kotlinx.datetime.Clock
+import kotlinx.datetime.DateTimePeriod
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.daysUntil
+import kotlinx.datetime.toLocalDateTime
+import kotlinx.datetime.todayIn
+import screens.daily.views.mapToHabitCardItemModel
import screens.stats.models.StatsAction
import screens.stats.models.StatsEvent
import screens.stats.models.StatsViewState
@@ -18,6 +28,7 @@ class StatisticsViewModel : BaseViewModel()
init {
loadActivities()
@@ -31,14 +42,41 @@ class StatisticsViewModel : BaseViewModel {
+ val today = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
+ val habits = getHabitsForTodayUseCase(today)
+ .map { it.mapToHabitCardItemModel() }
+
+ val nonSmokingStats = mutableListOf()
+
+ val habit = habits.find { it.title == "Don't smoke" && it.startDate?.isNotEmpty() == true }
+ if (habit?.startDate != null) {
+ val startDate = LocalDate.parse(habit.startDate)
+ val daysSinceLast = startDate.daysUntil(today)
+
+ val statistic = StatisticCellModel(
+ title = "You have not smoked for -> $daysSinceLast days",
+ activeDayList = emptyList(),
+ duration = "$daysSinceLast days",
+ fact = daysSinceLast.toString(),
+ percentage = 1f,
+ isPeriodic = false
+ )
+
+ nonSmokingStats.add(statistic)
+ }
+ return nonSmokingStats
+ }
+
+
private suspend fun fetchActiveMedication(): List {
// val medicationList = medicationRepository.fetchCurrentMedications()
// val diary = dailyRepository.fetchDiary()
diff --git a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
index 9588b70..a83431c 100644
--- a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
+++ b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
@@ -1,12 +1,24 @@
package utils
+import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.daysUntil
import kotlinx.datetime.plus
+import kotlinx.datetime.todayIn
import kotlinx.datetime.until
+private const val TEN = 10
+
fun LocalDate.daysInMonth(): Int {
val start = LocalDate(year, month, 1)
val end = start.plus(1, DateTimeUnit.MONTH)
return start.until(end, DateTimeUnit.DAY)
+}
+
+fun tenDaysPassed(startDate: LocalDate) : Boolean {
+ val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
+ val daysBetween = startDate.daysUntil(today)
+ return daysBetween >= TEN
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt b/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt
new file mode 100644
index 0000000..ca1ce29
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt
@@ -0,0 +1,9 @@
+package utils.notifications
+
+expect class HabbitNotificationManager {
+ fun sendNotification(title: String, content: String)
+
+ companion object {
+ fun create(): HabbitNotificationManager
+ }
+}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5576bb3..dfa2ffe 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,5 +1,6 @@
[versions]
# Plugins
+kotlinxDatetime = "0.6.1"
plugin-android = "8.2.2" # https://developer.android.com/studio/releases/gradle-plugin
plugin-compose = "1.6.10" # https://github.com/JetBrains/compose-jb
@@ -22,6 +23,7 @@ androidx-activityCompose = "1.9.0"
mindsdk = "24"
[libraries]
+kotlinx-datetime-v061 = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" }
plugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
plugin-android = { module = "com.android.tools.build:gradle", version.ref = "plugin-android" }
plugin-compose = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "plugin-compose" }
From 9558220748e82ef120e6702c089bfe25c89374a2 Mon Sep 17 00:00:00 2001
From: Rustam Ibrahimov <@r.ibrahimov>
Date: Thu, 31 Oct 2024 17:54:16 +0400
Subject: [PATCH 2/5] Minor change
---
.../commonMain/kotlin/screens/stats/StatisticsViewModel.kt | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 0c310b9..176efe3 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -1,6 +1,5 @@
package screens.stats
-import androidx.compose.ui.input.key.Key.Companion.Period
import androidx.lifecycle.viewModelScope
import base.BaseViewModel
import data.features.daily.DailyRepository
@@ -11,12 +10,10 @@ import kotlinx.coroutines.IO
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
-import kotlinx.datetime.DateTimePeriod
import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone
import kotlinx.datetime.daysUntil
import kotlinx.datetime.toLocalDateTime
-import kotlinx.datetime.todayIn
import screens.daily.views.mapToHabitCardItemModel
import screens.stats.models.StatsAction
import screens.stats.models.StatsEvent
@@ -26,7 +23,7 @@ import screens.stats.views.StatisticCellModel
class StatisticsViewModel : BaseViewModel(
initialState = StatsViewState()
) {
-
+
private val dailyRepository: DailyRepository = Inject.instance()
private val getHabitsForTodayUseCase = Inject.instance()
From 7716f8e0a12708cfd7f946fe60f88d5a7b4249f4 Mon Sep 17 00:00:00 2001
From: Rustam Ibrahimov <@r.ibrahimov>
Date: Thu, 31 Oct 2024 19:29:49 +0400
Subject: [PATCH 3/5] Minor change
---
.../src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 176efe3..973dd8d 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -42,7 +42,6 @@ class StatisticsViewModel : BaseViewModel
Date: Thu, 7 Nov 2024 15:25:07 +0400
Subject: [PATCH 4/5] Improvements after the code review
---
.idea/vcs.xml | 1 -
composeApp/build.gradle.kts | 2 +-
.../HabbitNotificationManager.android.kt | 6 ++-
.../kotlin/data/features/daily/DailyEntity.kt | 1 +
.../daily/domain/GetHabitsForTodayUseCase.kt | 2 +-
.../daily/presentation/DailyViewModel.kt | 12 ++---
.../feature/daily/ui/views/HabitCardItem.kt | 9 ++++
.../screens/stats/StatisticsViewModel.kt | 52 +++----------------
.../commonMain/kotlin/utils/Date + Utils.kt | 7 +--
gradle/libs.versions.toml | 2 +-
10 files changed, 30 insertions(+), 64 deletions(-)
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index ba43f69..94a25f7 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,7 +1,6 @@
-
\ No newline at end of file
diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts
index 4412215..0d49c6c 100644
--- a/composeApp/build.gradle.kts
+++ b/composeApp/build.gradle.kts
@@ -91,7 +91,7 @@ kotlin {
implementation(libs.room.sqlite.bundled)
- implementation(libs.kotlinx.datetime.v061)
+ implementation(libs.kotlinx.datetime)
}
diff --git a/composeApp/src/androidMain/kotlin/utils/notifications/HabbitNotificationManager.android.kt b/composeApp/src/androidMain/kotlin/utils/notifications/HabbitNotificationManager.android.kt
index 005b678..6c73ea9 100644
--- a/composeApp/src/androidMain/kotlin/utils/notifications/HabbitNotificationManager.android.kt
+++ b/composeApp/src/androidMain/kotlin/utils/notifications/HabbitNotificationManager.android.kt
@@ -12,9 +12,9 @@ actual class HabbitNotificationManager private constructor(private val context:
as NotificationManager
val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- val channel = NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT)
+ val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
- Notification.Builder(context, "channel_id")
+ Notification.Builder(context, CHANNEL_ID)
} else {
Notification.Builder(context)
}
@@ -29,6 +29,8 @@ actual class HabbitNotificationManager private constructor(private val context:
actual companion object {
private lateinit var appContext: Context
+ private const val CHANNEL_ID = "Habit_tracker_notifications"
+ private const val CHANNEL_NAME = "Habit notifications"
actual fun create(): HabbitNotificationManager {
return HabbitNotificationManager(appContext)
diff --git a/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt b/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
index d4dc071..ac7bf02 100644
--- a/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
+++ b/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
@@ -8,5 +8,6 @@ data class DailyEntity(
companion object {
const val TABLE_DAILY_NAME = "Daily_Entity"
const val DAILY_HABIT_IDS = "Daily_Habit_Ids"
+ const val NOT_SMOKED_DAYS_MESSAGE = "You have not smoked for -> "
}
}
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
index b712f00..bf6a253 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
@@ -11,7 +11,7 @@ class GetHabitsForTodayUseCase(
private val habitDao: HabitDao,
private val dailyDao: DailyDao
) {
- suspend operator fun invoke(date: LocalDate): List {
+ suspend fun execute(date: LocalDate): List {
val currentDay = date.dayOfWeek.ordinal
val dailyEntries = dailyDao.getAll()
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
index 67174d6..42f1269 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
@@ -12,10 +12,10 @@ import feature.daily.ui.models.DailyEvent
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.datetime.*
+import screens.daily.views.daysSinceHabitStarted
import screens.daily.views.mapToHabitCardItemModel
import utils.getTitle
import utils.notifications.HabbitNotificationManager
-import utils.tenDaysPassed
class DailyViewModel : BaseViewModel(
initialState = DailyViewState()
@@ -57,17 +57,15 @@ class DailyViewModel : BaseViewModel(
)
viewModelScope.launch(Dispatchers.Default) {
- val habits = getHabitsForTodayUseCase(date)
+ val habits = getHabitsForTodayUseCase.execute(date)
.map { it.mapToHabitCardItemModel() }
- val habit = habits.find { it.title == "Don't smoke" && !it.startDate.isNullOrEmpty() }
- ?: return@launch
+ val daysSinceStarted = habits.daysSinceHabitStarted(today)
- val startDate = LocalDate.parse(habit.startDate.orEmpty())
- if (tenDaysPassed(startDate)) {
+ if (daysSinceStarted != null && daysSinceStarted >= 10) {
HabbitNotificationManager.create().sendNotification(
"Well done!",
- "You have not smoked more than 10 days!!!")
+ "You have not smoked for more than 10 days!!!")
}
withContext(Dispatchers.Main) {
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
index e515535..11c0a22 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
@@ -11,6 +11,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import feature.daily.presentation.models.DailyHabit
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.daysUntil
import ui.themes.JetHabitTheme
data class HabitCardItemModel(
@@ -28,7 +30,14 @@ fun DailyHabit.mapToHabitCardItemModel(): HabitCardItemModel =
startDate = startDate
)
+const val SMOKING_HABIT_TITLE = "Don't smoke"
+fun List.daysSinceHabitStarted(currentDate: LocalDate): Int? {
+ val habit = find { it.title == SMOKING_HABIT_TITLE && !it.startDate.isNullOrEmpty() }
+ return habit?.startDate?.let {
+ LocalDate.parse(it).daysUntil(currentDate)
+ }
+}
@Composable
internal fun HabitCardItem(
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 973dd8d..74a6122 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -2,7 +2,7 @@ package screens.stats
import androidx.lifecycle.viewModelScope
import base.BaseViewModel
-import data.features.daily.DailyRepository
+import data.features.daily.DailyEntity
import di.Inject
import feature.daily.domain.GetHabitsForTodayUseCase
import kotlinx.coroutines.Dispatchers
@@ -10,10 +10,9 @@ import kotlinx.coroutines.IO
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
-import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone
-import kotlinx.datetime.daysUntil
import kotlinx.datetime.toLocalDateTime
+import screens.daily.views.daysSinceHabitStarted
import screens.daily.views.mapToHabitCardItemModel
import screens.stats.models.StatsAction
import screens.stats.models.StatsEvent
@@ -23,8 +22,6 @@ import screens.stats.views.StatisticCellModel
class StatisticsViewModel : BaseViewModel(
initialState = StatsViewState()
) {
-
- private val dailyRepository: DailyRepository = Inject.instance()
private val getHabitsForTodayUseCase = Inject.instance()
init {
@@ -48,18 +45,15 @@ class StatisticsViewModel : BaseViewModel {
val today = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
- val habits = getHabitsForTodayUseCase(today)
+ val habits = getHabitsForTodayUseCase.execute(today)
.map { it.mapToHabitCardItemModel() }
val nonSmokingStats = mutableListOf()
+ val daysSinceLast = habits.daysSinceHabitStarted(today)
- val habit = habits.find { it.title == "Don't smoke" && it.startDate?.isNotEmpty() == true }
- if (habit?.startDate != null) {
- val startDate = LocalDate.parse(habit.startDate)
- val daysSinceLast = startDate.daysUntil(today)
-
+ if (daysSinceLast != null) {
val statistic = StatisticCellModel(
- title = "You have not smoked for -> $daysSinceLast days",
+ title = DailyEntity.NOT_SMOKED_DAYS_MESSAGE,
activeDayList = emptyList(),
duration = "$daysSinceLast days",
fact = daysSinceLast.toString(),
@@ -71,38 +65,4 @@ class StatisticsViewModel : BaseViewModel {
-// val medicationList = medicationRepository.fetchCurrentMedications()
-// val diary = dailyRepository.fetchDiary()
-//
-// return medicationList.map { medication ->
-// val filtered = diary.filter { entry ->
-// val startDate = getValueOrNull(medication.startDate) ?: return@filter false
-// val endDate = getValueOrNull(medication.endDate) ?: return@filter false
-// val entryDate = DateTime.fromString(entry.date)
-//
-// val startComparable = startDate.compareTo(entryDate)
-// val endComparable = endDate.compareTo(entryDate)
-//
-// startComparable == 0 && endComparable == 1
-// }
-//
-// val startDate = getValueOrNull(medication.startDate)
-// val endDate = getValueOrNull(medication.endDate)
-// val diff = startDate?.let { endDate?.minus(it)?.days } ?: 0.0
-//
-// StatisticCellModel(
-// title = medication.title,
-// activeDayList = listOf(true, true, true, false, false),
-// duration = diff.toInt().toString(),
-// fact = filtered.size.toString(),
-// percentage = filtered.size.toFloat() / diff.toFloat(),
-// isPeriodic = false
-// )
-// }
-
- return emptyList()
- }
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
index a83431c..ab26551 100644
--- a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
+++ b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
@@ -9,16 +9,13 @@ import kotlinx.datetime.plus
import kotlinx.datetime.todayIn
import kotlinx.datetime.until
-private const val TEN = 10
-
fun LocalDate.daysInMonth(): Int {
val start = LocalDate(year, month, 1)
val end = start.plus(1, DateTimeUnit.MONTH)
return start.until(end, DateTimeUnit.DAY)
}
-fun tenDaysPassed(startDate: LocalDate) : Boolean {
+fun LocalDate.tenDaysPassed(): Boolean {
val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
- val daysBetween = startDate.daysUntil(today)
- return daysBetween >= TEN
+ return this.daysUntil(today) >= 10
}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index dfa2ffe..e3942d4 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -44,7 +44,7 @@ kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serializa
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
-kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.6.0"
+kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.6.1"
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
From a1f10bfd798eb9e626558dac048bcd1059d8d572 Mon Sep 17 00:00:00 2001
From: Rustam Ibrahimov
Date: Fri, 15 Nov 2024 13:09:55 +0400
Subject: [PATCH 5/5] Improvements after the code review
---
.../composeResources/values/strings.xml | 4 ++++
.../kotlin/data/features/daily/DailyEntity.kt | 1 -
.../daily/presentation/DailyViewModel.kt | 23 +++++++++++++++----
.../feature/daily/ui/views/HabitCardItem.kt | 4 +---
.../screens/stats/StatisticsViewModel.kt | 6 +++--
5 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index adc1b15..7f9729f 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -85,4 +85,8 @@
Good habit
Bad habit
+
+ Well done!
+ You have not smoked for more than 10 days!!!
+
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt b/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
index ac7bf02..d4dc071 100644
--- a/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
+++ b/composeApp/src/commonMain/kotlin/data/features/daily/DailyEntity.kt
@@ -8,6 +8,5 @@ data class DailyEntity(
companion object {
const val TABLE_DAILY_NAME = "Daily_Entity"
const val DAILY_HABIT_IDS = "Daily_Habit_Ids"
- const val NOT_SMOKED_DAYS_MESSAGE = "You have not smoked for -> "
}
}
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
index 42f1269..9512a32 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
@@ -5,15 +5,27 @@ import base.BaseViewModel
import di.Inject
import feature.daily.domain.GetHabitsForTodayUseCase
import feature.daily.domain.SwitchHabitUseCase
-import feature.daily.ui.models.DailyViewState
-import kotlinx.coroutines.launch
import feature.daily.ui.models.DailyAction
import feature.daily.ui.models.DailyEvent
+import feature.daily.ui.models.DailyViewState
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import kotlinx.datetime.*
+import kotlinx.datetime.Clock
+import kotlinx.datetime.DateTimeUnit
+import kotlinx.datetime.Instant
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.minus
+import kotlinx.datetime.plus
+import kotlinx.datetime.toLocalDateTime
+import kotlinx.datetime.todayIn
+import org.jetbrains.compose.resources.getString
import screens.daily.views.daysSinceHabitStarted
import screens.daily.views.mapToHabitCardItemModel
+import tech.mobiledeveloper.jethabit.resources.Res
+import tech.mobiledeveloper.jethabit.resources.no_smoke_ten_days
+import tech.mobiledeveloper.jethabit.resources.well_done
import utils.getTitle
import utils.notifications.HabbitNotificationManager
@@ -64,8 +76,9 @@ class DailyViewModel : BaseViewModel(
if (daysSinceStarted != null && daysSinceStarted >= 10) {
HabbitNotificationManager.create().sendNotification(
- "Well done!",
- "You have not smoked for more than 10 days!!!")
+ title = getString(Res.string.well_done),
+ content = getString(Res.string.no_smoke_ten_days)
+ )
}
withContext(Dispatchers.Main) {
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
index 11c0a22..7439fcc 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
@@ -30,10 +30,8 @@ fun DailyHabit.mapToHabitCardItemModel(): HabitCardItemModel =
startDate = startDate
)
-const val SMOKING_HABIT_TITLE = "Don't smoke"
-
fun List.daysSinceHabitStarted(currentDate: LocalDate): Int? {
- val habit = find { it.title == SMOKING_HABIT_TITLE && !it.startDate.isNullOrEmpty() }
+ val habit = find { !it.startDate.isNullOrEmpty() }
return habit?.startDate?.let {
LocalDate.parse(it).daysUntil(currentDate)
}
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 74a6122..59e8365 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -2,7 +2,6 @@ package screens.stats
import androidx.lifecycle.viewModelScope
import base.BaseViewModel
-import data.features.daily.DailyEntity
import di.Inject
import feature.daily.domain.GetHabitsForTodayUseCase
import kotlinx.coroutines.Dispatchers
@@ -12,12 +11,15 @@ import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
+import org.jetbrains.compose.resources.getString
import screens.daily.views.daysSinceHabitStarted
import screens.daily.views.mapToHabitCardItemModel
import screens.stats.models.StatsAction
import screens.stats.models.StatsEvent
import screens.stats.models.StatsViewState
import screens.stats.views.StatisticCellModel
+import tech.mobiledeveloper.jethabit.resources.Res
+import tech.mobiledeveloper.jethabit.resources.no_smoke_ten_days
class StatisticsViewModel : BaseViewModel(
initialState = StatsViewState()
@@ -53,7 +55,7 @@ class StatisticsViewModel : BaseViewModel