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