From 0cca06cd7acb4866129d8e6f5b84d00982089917 Mon Sep 17 00:00:00 2001 From: Dmitri Chernysh Date: Sun, 18 Feb 2024 13:27:10 +0200 Subject: [PATCH 1/5] Update readme --- README.md | 55 +++++++++---------------------------------------------- 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 4c43f6c..502d528 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ -# Android Chat App entirely built with Jetpack Compose +# Zoomable Image with Jetpack Compose -![Run Unit Tests](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template/actions/workflows/run_tests.yml/badge.svg) -[![CodeFactor](https://www.codefactor.io/repository/github/mobiledevpro/jetpack-compose-chatapp-template/badge)](https://www.codefactor.io/repository/github/mobiledevpro/jetpack-compose-chatapp-template) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mobiledevpro_Jetpack-Compose-ChatApp-Template&metric=alert_status)](https://sonarcloud.io/dashboard?id=mobiledevpro_Jetpack-Compose-ChatApp-Template) +Based on [App Template](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template) + + +![Run Unit Tests](https://github.com/mobiledevpro/zoomable-image-jetpack-compose/actions/workflows/run_tests.yml/badge.svg) +[![CodeFactor](https://www.codefactor.io/repository/github/mobiledevpro/zoomable-image-jetpack-compose/badge)](https://www.codefactor.io/repository/github/mobiledevpro/jetpack-compose-chatapp-template) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mobiledevpro_zoomable-image-jetpack-compose&metric=alert_status)](https://sonarcloud.io/dashboard?id=mobiledevpro_Jetpack-Compose-ChatApp-Template) [![Kotlin Version](https://img.shields.io/badge/Kotlin-1.9.22-blue.svg?style=flat-square)](http://kotlinlang.org/) [![Compose Bom](https://img.shields.io/badge/Compose%20Bom-2024.01.00-blue.svg?style=flat-square)]([http://kotlinlang.org/](https://developer.android.com/jetpack/compose/bom/bom-mapping)) @@ -12,40 +15,9 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0) [![Android Studio](https://img.shields.io/badge/Android%20Studio%20Iguana-2023.2.1-orange.svg?style=flat-square)](https://developer.android.com/studio/preview) -![GitHub last commit](https://img.shields.io/github/last-commit/mobiledevpro/Jetpack-Compose-ChatApp-Template?color=red&style=flat-square) - -![closetalk_github_social_preview](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template/assets/5750211/343f1ab5-54e4-41c2-a554-af0526aee382) - -[![Youtube](https://img.shields.io/badge/-youtube-red?logo=youtube&message=Youtube&style=for-the-badge&label=Watch+on)](https://www.youtube.com/playlist?list=PL9IBbMupfHWrW419OtGlzc7cBEMNqyLa4) +![GitHub last commit](https://img.shields.io/github/last-commit/mobiledevpro/zoomable-image-jetpack-compose?color=red&style=flat-square) -## -### Tech. stack - -* [Kotlin](https://kotlinlang.org/docs/getting-started.html) -* [Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) -* [Jetpack Compose](https://developer.android.com/jetpack/compose) modern toolkit for building native UI -* [Jetpack libs: Navigation, Compose, etc.](https://developer.android.com/jetpack) -* [Material 3](https://m3.material.io/) -* [Koin](https://insert-koin.io/docs/reference/koin-android/compose) for dependency injection -* [Coil](https://coil-kt.github.io/coil/compose/) for image loading -* MVI + modularization with a clean architecture -* [Circle CI](https://circleci.com/) for continuous integration and delivery -* GitHub Actions [[Complete Guide](https://mobiledevpro.gumroad.com/l/zjbvsd)] - -## -## UI testing with [Maestro](https://maestro.mobile.dev/): - -* Install Maestro: run in terminal ```curl -Ls "https://get.maestro.mobile.dev" | bash``` -* Install the app on emulator (doesn't work with physical device) -* Run the flow: run in terminal ```maestro test -c maestro/people-profile-flow.yaml``` -* [Sample config](maestro/people-profile-flow.yaml) - -## -## Modularization - -![modularization](doc/modularization.png) - ## ## Author: @@ -62,7 +34,7 @@ ## License: -Copyright 2023 Dmitri Chernysh +Copyright 2024 Dmitri Chernysh Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -75,12 +47,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -## Thanks for the support -**Stargazers** - -[![Stargazers repo roster for @mobiledevpro/Jetpack-Compose-ChatApp-Template](http://reporoster.com/stars/dark/mobiledevpro/Jetpack-Compose-ChatApp-Template)](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template/stargazers) - -**Forkers** - -[![Forkers repo roster for @mobiledevpro/Jetpack-Compose-ChatApp-Template](http://reporoster.com/forks/dark/mobiledevpro/Jetpack-Compose-ChatApp-Template)](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template/network/members) From b06750c122e088f2ffee8ecb21c5d3d9079ba32a Mon Sep 17 00:00:00 2001 From: Dmitri Chernysh Date: Sun, 18 Feb 2024 14:25:03 +0200 Subject: [PATCH 2/5] Cleaned up the project --- .idea/migrations.xml | 10 + app/build.gradle.kts | 4 +- app/src/main/ic_launcher-playstore.png | Bin 47845 -> 39651 bytes .../kotlin/com/mobiledevpro/app/ui/MainApp.kt | 4 +- .../drawable-v24/ic_launcher_foreground.xml | 30 -- .../res/drawable/ic_launcher_background.xml | 232 +++++----------- .../res/drawable/ic_launcher_foreground.xml | 36 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 2204 -> 2668 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 3926 -> 4538 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 1646 -> 2146 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 2364 -> 3084 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 3188 -> 3944 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 5640 -> 6394 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 4524 -> 5322 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 8802 -> 9256 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 6242 -> 7376 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 12106 -> 12484 bytes app/src/main/res/values/strings.xml | 2 +- .../src/main/kotlin/feature-module.gradle.kts | 1 - core/domain/build.gradle.kts | 3 - core/domain/src/main/AndroidManifest.xml | 2 - .../com/mobiledevpro/domain/model/Chat.kt | 44 --- .../domain/model/PeopleProfile.kt | 122 --------- .../mobiledevpro/domain/model/UserProfile.kt | 34 --- core/navigation/build.gradle.kts | 7 +- .../navigation/HomeBottomNavigation.kt | 73 ----- .../com/mobiledevpro/navigation/Route.kt | 46 +--- .../navigation/ScreenNavigation.kt | 259 ------------------ .../navigation/graph/HomeNavGraph.kt | 63 +++-- .../navigation/graph/ImageViewerNavGraph.kt | 31 +-- .../navigation/graph/PeopleNavGraph.kt | 53 ---- .../HomeNavHost.kt} | 20 +- .../RootNavGraph.kt => host/RootNavHost.kt} | 12 +- feature/chat_list/.gitignore | 1 - feature/chat_list/consumer-rules.pro | 0 feature/chat_list/proguard-rules.pro | 21 -- .../chat_list/src/main/AndroidManifest.xml | 2 - .../domain/usecase/GetChatListUseCase.kt | 36 --- .../chatlist/view/ChatListScreen.kt | 154 ----------- .../chatlist/view/ChatListUIState.kt | 38 --- .../chatlist/view/ChatListViewModel.kt | 50 ---- .../chatlist/view/component/ChatCard.kt | 142 ---------- .../com/mobiledevpro/home/view/HomeScreen.kt | 4 +- .../image_viewer}/.gitignore | 0 .../build.gradle.kts | 0 .../image_viewer}/consumer-rules.pro | 0 .../image_viewer}/proguard-rules.pro | 0 .../image_viewer/src/main/AndroidManifest.xml | 4 + .../image/viewer/view/ImageViewerScreen.kt} | 25 +- feature/onboarding/.gitignore | 1 - feature/onboarding/build.gradle.kts | 3 - feature/onboarding/consumer-rules.pro | 0 feature/onboarding/proguard-rules.pro | 21 -- .../onboarding/src/main/AndroidManifest.xml | 2 - .../onboarding/view/OnBoardingFirstScreen.kt | 65 ----- .../onboarding/view/OnBoardingScreen.kt | 70 ----- .../onboarding/view/OnBoardingSecondScreen.kt | 66 ----- .../onboarding/view/OnBoardingThirdScreen.kt | 66 ----- feature/people/.gitignore | 1 - feature/people/build.gradle.kts | 8 - feature/people/consumer-rules.pro | 0 feature/people/proguard-rules.pro | 21 -- feature/people/src/main/AndroidManifest.xml | 2 - .../mobiledevpro/people/view/PeopleScreen.kt | 37 --- feature/people_list/.gitignore | 1 - feature/people_list/build.gradle.kts | 4 - feature/people_list/consumer-rules.pro | 0 feature/people_list/proguard-rules.pro | 21 -- .../people_list/src/main/AndroidManifest.xml | 2 - .../com/mobiledevpro/peoplelist/di/Module.kt | 39 --- .../domain/usecase/GetPeopleListUseCase.kt | 35 --- .../peoplelist/view/PeopleListScreen.kt | 157 ----------- .../peoplelist/view/PeopleListViewModel.kt | 50 ---- .../peoplelist/view/PeopleProfileUIState.kt | 38 --- .../peoplelist/view/component/ProfileCard.kt | 69 ----- .../peoplelist/PeopleListViewModelTest.kt | 69 ----- feature/people_profile/.gitignore | 1 - feature/people_profile/build.gradle.kts | 3 - feature/people_profile/consumer-rules.pro | 0 feature/people_profile/proguard-rules.pro | 21 -- .../src/main/AndroidManifest.xml | 2 - .../profile/view/PeopleProfileScreen.kt | 223 --------------- .../profile/view/PeopleProfileViewModel.kt | 46 ---- .../profile/view/args/PeopleProfileArgs.kt | 34 --- .../res/drawable/ic_instagram_white_48dp.xml | 15 - .../res/drawable/ic_linkedin_white_48dp.xml | 17 -- .../res/drawable/ic_twitter_white_48dp.xml | 9 - .../res/drawable/ic_youtube_white_48dp.xml | 12 - feature/subscription/.gitignore | 1 - feature/subscription/build.gradle.kts | 3 - feature/subscription/consumer-rules.pro | 0 feature/subscription/proguard-rules.pro | 21 -- .../subscription/src/main/AndroidManifest.xml | 2 - .../subscription/SubscriptionScreen.kt | 224 --------------- feature/user_profile/.gitignore | 1 - feature/user_profile/build.gradle.kts | 3 - feature/user_profile/consumer-rules.pro | 0 feature/user_profile/proguard-rules.pro | 21 -- .../user_profile/src/main/AndroidManifest.xml | 2 - .../mobiledevpro/user/profile/di/Module.kt | 39 --- .../domain/usecase/GetUserProfileUseCase.kt | 35 --- .../user/profile/view/ProfileScreen.kt | 217 --------------- .../user/profile/view/vm/ProfileViewModel.kt | 51 ---- settings.gradle.kts | 9 +- 106 files changed, 211 insertions(+), 3222 deletions(-) create mode 100644 .idea/migrations.xml delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 core/domain/build.gradle.kts delete mode 100644 core/domain/src/main/AndroidManifest.xml delete mode 100644 core/domain/src/main/kotlin/com/mobiledevpro/domain/model/Chat.kt delete mode 100644 core/domain/src/main/kotlin/com/mobiledevpro/domain/model/PeopleProfile.kt delete mode 100644 core/domain/src/main/kotlin/com/mobiledevpro/domain/model/UserProfile.kt delete mode 100644 core/navigation/src/main/kotlin/com/mobiledevpro/navigation/HomeBottomNavigation.kt delete mode 100644 core/navigation/src/main/kotlin/com/mobiledevpro/navigation/ScreenNavigation.kt rename feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/di/Module.kt => core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/ImageViewerNavGraph.kt (56%) delete mode 100644 core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/PeopleNavGraph.kt rename core/navigation/src/main/kotlin/com/mobiledevpro/navigation/{graph/OnBoardingNavGraph.kt => host/HomeNavHost.kt} (68%) rename core/navigation/src/main/kotlin/com/mobiledevpro/navigation/{graph/RootNavGraph.kt => host/RootNavHost.kt} (79%) delete mode 100644 feature/chat_list/.gitignore delete mode 100644 feature/chat_list/consumer-rules.pro delete mode 100644 feature/chat_list/proguard-rules.pro delete mode 100644 feature/chat_list/src/main/AndroidManifest.xml delete mode 100644 feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/domain/usecase/GetChatListUseCase.kt delete mode 100644 feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListScreen.kt delete mode 100644 feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListUIState.kt delete mode 100644 feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListViewModel.kt delete mode 100644 feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/component/ChatCard.kt rename {core/domain => feature/image_viewer}/.gitignore (100%) rename feature/{chat_list => image_viewer}/build.gradle.kts (100%) rename {core/domain => feature/image_viewer}/consumer-rules.pro (100%) rename {core/domain => feature/image_viewer}/proguard-rules.pro (100%) create mode 100644 feature/image_viewer/src/main/AndroidManifest.xml rename feature/{user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/state/UserProfileUIState.kt => image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt} (57%) delete mode 100644 feature/onboarding/.gitignore delete mode 100644 feature/onboarding/build.gradle.kts delete mode 100644 feature/onboarding/consumer-rules.pro delete mode 100644 feature/onboarding/proguard-rules.pro delete mode 100644 feature/onboarding/src/main/AndroidManifest.xml delete mode 100644 feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingFirstScreen.kt delete mode 100644 feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingScreen.kt delete mode 100644 feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingSecondScreen.kt delete mode 100644 feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingThirdScreen.kt delete mode 100644 feature/people/.gitignore delete mode 100644 feature/people/build.gradle.kts delete mode 100644 feature/people/consumer-rules.pro delete mode 100644 feature/people/proguard-rules.pro delete mode 100644 feature/people/src/main/AndroidManifest.xml delete mode 100644 feature/people/src/main/kotlin/com/mobiledevpro/people/view/PeopleScreen.kt delete mode 100644 feature/people_list/.gitignore delete mode 100644 feature/people_list/build.gradle.kts delete mode 100644 feature/people_list/consumer-rules.pro delete mode 100644 feature/people_list/proguard-rules.pro delete mode 100644 feature/people_list/src/main/AndroidManifest.xml delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/di/Module.kt delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/domain/usecase/GetPeopleListUseCase.kt delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListScreen.kt delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListViewModel.kt delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleProfileUIState.kt delete mode 100644 feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/component/ProfileCard.kt delete mode 100644 feature/people_list/src/test/kotlin/com/mobiledevpro/peoplelist/PeopleListViewModelTest.kt delete mode 100644 feature/people_profile/.gitignore delete mode 100644 feature/people_profile/build.gradle.kts delete mode 100644 feature/people_profile/consumer-rules.pro delete mode 100644 feature/people_profile/proguard-rules.pro delete mode 100644 feature/people_profile/src/main/AndroidManifest.xml delete mode 100644 feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileScreen.kt delete mode 100644 feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileViewModel.kt delete mode 100644 feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/args/PeopleProfileArgs.kt delete mode 100644 feature/people_profile/src/main/res/drawable/ic_instagram_white_48dp.xml delete mode 100644 feature/people_profile/src/main/res/drawable/ic_linkedin_white_48dp.xml delete mode 100644 feature/people_profile/src/main/res/drawable/ic_twitter_white_48dp.xml delete mode 100644 feature/people_profile/src/main/res/drawable/ic_youtube_white_48dp.xml delete mode 100644 feature/subscription/.gitignore delete mode 100644 feature/subscription/build.gradle.kts delete mode 100644 feature/subscription/consumer-rules.pro delete mode 100644 feature/subscription/proguard-rules.pro delete mode 100644 feature/subscription/src/main/AndroidManifest.xml delete mode 100644 feature/subscription/src/main/kotlin/com/mobiledevpro/subscription/SubscriptionScreen.kt delete mode 100644 feature/user_profile/.gitignore delete mode 100644 feature/user_profile/build.gradle.kts delete mode 100644 feature/user_profile/consumer-rules.pro delete mode 100644 feature/user_profile/proguard-rules.pro delete mode 100644 feature/user_profile/src/main/AndroidManifest.xml delete mode 100644 feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/di/Module.kt delete mode 100644 feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/domain/usecase/GetUserProfileUseCase.kt delete mode 100644 feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/ProfileScreen.kt delete mode 100644 feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/vm/ProfileViewModel.kt diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e1eddc7..85863c4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } android { - namespace = "com.mobiledevpro.apptemplate.compose" + namespace = "com.mobiledevpro.zoomable.image" compileSdk = libs.versions.sdk.compile.get().toInt() @@ -44,12 +44,10 @@ android { productFlavors { create("production") { dimension = "default" - applicationIdSuffix = ".closetalk" } create("dev") { dimension = "default" - applicationIdSuffix = ".apptemplate.compose" } } diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 148f7068a42f14f842fc9b206b7a4b5684240a97..4d96dbe7c63f110c3b0834e661f19475a5870862 100644 GIT binary patch literal 39651 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 literal 47845 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%0AH(q%~&%u~h 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

etzyw)CHnU;3ksP^z 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 - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 5cc10bf..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..80d4342 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 3f21f07..bbd3e02 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 3f21f07..bbd3e02 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index 9841941c46e551b59928ab4a20c0f975ba25da26..e8551d598e67044c4f9bc5445bb57c5f591724a8 100644 GIT binary patch literal 2668 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 Ye?f<@16M4V>xI@X=y2DHV+8dC06_WWr~m)} literal 3926 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 398faee9e7531263cdb4408f8b17f89a224e35f5..41024569e5eb6544aa5c64f9948a60899e5a06d6 100644 GIT binary patch literal 2146 zcmV-o2%Yy*Nk&Fm2mkB1uwIOZTE0@UQX&u#IG^&98!((3}2i_(KiI zOZZ4W=zjq8?cWb@k{M&y3%tP_1jxBVyS_`htlCfL-cH_GCC_ZvyL-K_D5DJ9fS;LB z#=Cy70k>L#xO@;pwnQ% zfAy)d)WcN7Nkwg$#?lZIy0UGnwv|5S+I9qY58X5BWw<*}Qa*#|J_&&cGE#TQ+}+*X z?aB3h&e>}Xy0LAmwxc=M1);~_$;S-7E6VBrG^7w%4FM>RW=4C7F+=pxGtvYA;eW{7`YQkEge?v&x1Q#`<<7Gt@b94m4UbrJ=f|{% z)LFXWBX_@FURqzKGi_D68U043yNv!XD&0i-ok|CKsB{<5|4TiZMw#M~+kaXXC|w@_ z&C9>PoZ8^ZbFld7?+JH74n5#9EN)1PCUZ_nvLaSYm zTC4q~8MyeQewvb{6N6ZSt9!0qpXX0epwuW6)McqmE@SN<2wKy^QZ`zd5h~s&R!kSU zainIm$~+VgQL#j@zR@uH(MMkNSUO2}{~@=&%E15c@BMt`bEC(5P$`E6MiN9@F;(3k zY6Q|!BLQQo1Q5tjNtmgpeHeAYkfGM$`!7t#K;?^*_=g|0gm3jOqA_Z~NCgp^d8*C` zAn43foq4J~1*huFO!%)MM%Qo=@T1ic|DbQRMmW`f&UHrEO(LlA;moPMI#?AP(wu(XrkU8sr}IRKZr44)y1rGQSEB9 z%M%hDO-|JD?Wu-mlq-OPu7BxETOV0@@(Z~b_7hcH+;Z1@ zuYBQfF5Y-gyZ1lqum5B}=gzyMIcT-=+Sd+%b`>d_Do)7(5CciyyhGP6!7C3&?V-`B z&$%>ekRoT$GS;~>;^n(={kBkynIuq+_;t_D4S5`OcA7J$j8~`n1SVW@{IRGgI0|df_ zYq5NWqJjHeJT|VT-PX^s`Vz39G87gG6x1}y4FKR^kQle2R22P%t8w;R)DrGLT3qjT zn?GpfHBcm!f#+(cS zCGQwPSPkkd6I|PhDpdg37XDZ-E@f1r2wm+0Pd*=8%lOoeS{%#hwE0cFdQY|gzym#h z0V=BBU!$+L@tn1g@nr_P-}_y^yi-{3{v`Fxsqx%>*m`={2Q6a0qDBC60Ahr5XI9k@ z)Q`;Sv&NY+ToU$>MK8UFjlFU0RH$CQFy1|Ec4c{2#zW~qCs=j;kF*H_K^KlvG^)Rr zS|ktj(kW_Ainm9L+9(=C1-qFYWrZA&1gSiCCaRPGaNz%c>VbISDZIU`oz=*7z(LpG zvuB`wBMKQ5D#DJi zf>_Mkq^;8?`oI9IElcNV$evQB*QYg~(z)1R9qbH`ve^p#+-4Cb_o)fI?U} zNVyqB6`=@hMXaUjqMenh%2))*@|^S$^wOXW0ZS;Pai7u%VJNC`79E|0qoOcwhBWTe z3Ly#7a8$h8>O&R>gP85=5Ot&OkpLK-Nt2H!yd-Q&Aq^|&$0MRJ5(OAe5PBRzjWR^R z1ZqqGqbElOknRAeSA)8j!N<`{p$&jgEK@oeJ4zv}1RNvouX@r#4 zNf7-|QejQX`hh#tAZEJ=Yda(W+9QqBW#Jm}j<6+U0EB@67zLOd-NaI%aLgxRr9ioLn z-N4vyW9@#cTkb!?HnqiqRFVgkRt!ZBfTRg*Hu9pcR%Vn8Mo3ga4%%7A!XaoCDM7GS zv~w);PkmMAdOw3#;5~PKs6grR;py)!@Cju1PmVSNppr|4T}!zIfcD`({r}+!XU$#r Yc=s#&u9wG59Ke1*5mN;kp!lB=08PjMYXATM literal 1646 zcmV-!29fzvNk&Fy1^@t8MM6+kP&iCl1^@srFTe{B^@f794Vcxx?L7$*F#+-bA1gQ8 zKUJzuP7g%RQQX}vbRsW+3V3!74Uo}+W@O#~xl_wNJIwqC&Hq^H?izV&*RqMO-?If= z*#d3_PPJ`YlYb{kwYZDOMcxu^2f#(2;O;JI8JoNQ-~W$FaT`gJB8~J09Ch!kwdc(< zOH2}~Cq6SXNswdPHf=rIwv8y>>z?!;Gccn1I`~b^+6>$_Qj{FuGX6oXwtt3XU6O5$ zZH33Sk=nLx8<}lqw%zOc*VHx41@HL@aMv!i7;(XlE!wx0)%0Dy(0{B_U1tF}6` zzV<5Hwy$2s8GCIF7)FxXHVq2S*@A!QKLfXISx|z@imCc7ZT+ihv%c<5xE#8z9Y@sP77jA-$H+@VzDS^WL|AgoOXE!&BHFp;q zTb{lVWu~714-AJPE+=)|B=h0_EjIw1)GNO3^A<&$ChNSSW> zB>EsGCKgt10e_!+HNa=X`dFo5sW;fuEDv4XsWkv{3*>`5k1{-7u|#p4jm2|XPkz>9B@?Jw{rkjZ)RD7Jd0CDk~{=r$Qku07(NCRf5UCZQ1-Yic-n;S zi1cQb;bXiy-iUmaYmbP+Gm;h9GLU$Hxlk&2`ck6aXOqRWsluLz{Qhq&KqGc zvhcA6$@rBdjhhZeny(QKN%)wc*k^(xFwu|*$^pOyA;X20x6%4={ef0ym=&nEFus27 zH8gkjajz!&SCZ0%64wN3I4Nc7WdUAHP~sI6NUlc-=IYC1W^LW;mt&Ep0HG<79F26B zU#FJVD%>&XNQOBOzC@*lL}|z=P$Mgfp3c47FDXDkIG~%mt-0};QNot2hLHHskR+KF z2P)LXdJcsJR%Wg>P=AP;rU@1i$u1EJN6%7@`Za7(x~|!aX9;k`#tKNAP#_P*S2gO|VN(vC)#!lPbss~GDf3ED5>gvaN#_~RD;Nzx zFOOf8Agl<{>iQkLaSfii2anv&L8I63z8h|5LM3j6_!SVRIT!;fb03mB>qx@_gE3}H zMu{($dqSC4mVQI)jc@4S-FWjyW%M}19SG(f87!>4%?Zr8jFS<>nu;n{UhTqB0kItR z|GV3qoG=Gkl8ii$LOhU+8#y_JlS8aJ_fPEn-N1q;tow@8A*K=|J75DR;r;D#l_5gC6 zcLhqQX~NU+8k)YR&KwL?=iQQlZayuYUW3S!FE8Dv04=Ps3b4}h4b?J$Ck$qa>ow^NjE6?t|F|v!U*fFBHXt!ytkqn;agq6vgN?% scNi3W*N;D%IPuZ2+)?t3LJE?&f+RI#*Gsxl$U)GX*7hhkV{dSw2t?Zn6aWAK diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp index e996ddd7b79d0eafe4055813fd9104497685fa0c..9c9b5f3f63f4c522b85666f7644faeddfb258d6e 100644 GIT binary patch literal 3084 zcmV+n4D<6+Nk&El3;+OEMM6+kP&iEY3jhEwFTe{B2{mmSupxDPNkso+kRH_|DL~Sz z?vHMvrfnoC)t00E_xK|`I856}k{m59T;%-@o|;Iunj?oQR_KWSRZt=T5&aK>*b5&v zAc*yuk9e#DJpCE1J=b|>AKOOL?Py0qVh6B4IX<+b^UnM9UJ}{4{(o`o=KKGTV42L! z>~3AT!p<)3&KPehKh-p>qBw^7h2bp6*o&hfMFATq3vY%%g62_&JC*fJs3*1bmpf zNa~zunxKL?m@hAp+j{2s9eXAUmAx-}rk5X~3FX(KiqWUiF(ZdAMsdfr=*;^&^?@)O zj3!2fEfqa0N!?!pq!y3~BGDu~*i+y7_Tn*@VDw0uc|IWJLCUY@YW2uNKdwA#n`p)#{TX13`l zm<7{^4P+s=9=`JUea!K;Dv$5@$TG_ySV1X9Uj!HkM6yUoBw?k5FOe(~j-)JET&qGF zE8SZBa+k>0pkb(c$wSrrKbp&Uq9zywz$XS*RuUku6>NuMDpB($Z%%{6tP zlAU~Zdg7Sf>FNFk7&PbpI9|(}%WiFyL;2h@ouh<-(yvRevblCuN^@I%yu#18s zkd>7vJhJO8E%@@9sa0yvMI;p{dnDc9OC)2m^ZWKOx4-!UlAktY6fKQ?-gCHc^)68eflT#K$aEZk`w?z8Az2HTDNQZ zUrOzd#;b}HCuOqtm$V@rQmUybHLnN!|IEr+r}NN}`<`+}q9w%_Ahx9HPmjnz>9mB9R@qhc{)glqC3jcqm>Mq|VrQfKRhb%09Z!F{)MXkn zt)htG*^Ql^y5V>0sE9}?ucP|7BfsxwIo42Hf*I{ucTAizg&+T>)#KORkT<2nFEeZEcyue8P z=mA;zAfZ+$QI}=^S5*1H^X{5ZE<4T?hf7HXC{pX%iWXu-49us>X`WHE-c`dh;Ur$< zT;&l{ci0-H$ogP2W3@Wv)E4Mb;Ry28ifXzFu_YQo0_JyS>m6uV4KpJ%15+;&2~`Dz zZg;XZ;|ysBn^7hEOsleL-++-3GSyL6V>0i+hIY!zbk(&poO+PdgX(w)H!-c2{U&!| zl!stvUQ2v zuQ$({EdT3#{IN#XUj%DdgX)GCt37zmq}f=cgzN^YG5$}r4xn`q9DMAKp*ts)i);UK zZ7O8;U|pCc_h@cgNRi)^lX4g(n^%Bo+fJJ;yQG-s{wDgJy1b0j=#?q*$HV-XW1?jT zD7`JdaO(9lID)a|p~6U)|CiLyS5LFL8n9<&H!!usmw-XSmaci`sst!qN#5eeVK#_V zfBD49W2nB=aXEqkY}0&_jV6+J3e6|3Nu7)StblfCXL`vo|F>XTnU%=Mo{Kc0pC

a zk#c%s#S}Qk3w{a{Y(dY3hCrydUFgAy=aD5i z%#=jRA`BqGONG)|vK87E>UYB~7d?5w{}U_LnZ)Q@QCPLG?6gXWE3I7UT&m6`wSsoy zWP_~&8V&?`*AWJ&M4=K;gdn7Uu~;yCo49cOFmQEfk}x%%$1277k`;$GyB09|R*+0Y zx5k>$!O?9NZ$C5kKl?cqnti;Xd{T?4&DW{G2Dgg`Vdc9(Gm+GnsF6?I)ZOh6g=V5_}A~Lf{ zYBQWBIf$-z@#U^}9jv@h-|o|;=X$Qki)R~AG-wYvWYgvI>NTU)NY~C=f*Ap0ONAa6 zar9%(5Vh8Vb6e4P$rikeFTb!f{6g>3w--bI%3`_Xdc1fx%o+6EZ!$hhY+czRqmqovl^0$RK##7cq7FZ3?{BoyV_i~g12T<*~IPBcO5!n^lRhnI~U2Y$a zX$?#SjuhxDln-ek2w=K$_`GmfnS@~!NtJ?ooS-hT)rW}i6rRwAHG z>G?xaEE~bXtP2*Ivzca7FPZ>GbO_}`nka=VdSTHcv@}tQ#tuf;Z7d(`xZ_@}{`CUp zyvF%&)>Ud(Ho%tsJnv2NgG1sU5 zH8mLDo+dxquftdS*_Z_E02urJssFwn%>U_|UieNKSAJx$<~OS}Ha0dkFJpWuznN?{ zN0O=;N$M%RMUSSj+iwR<1A61Ooa)xN_|xFfRxtWTN^D-|i8GhQA^Cso+_3#05bx(7 a#{RJLx>bL@#-F`MpM0^~>7!>7a|Qq%Hx8Tt literal 2364 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 7dff8c5bc43b616a89610634416d43f6ecd140bd..ccdc292d0a21b661f0b4969aee16605e4329c3b2 100644 GIT binary patch literal 3944 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 CC~PhO literal 3188 zcmV-)42$zpNk&F&3;+OEMM6+kP&iCr3;+NxU%(d-HQCw!-?Z&&zJS=a4%XajAA5Vp zwr$(CZQHhO+sWRs&AnGN=UnSQ##p;bHRG%@&KpR2RhfCR;`Fv{+bNA1mRvbe?R|Dw z*;c0+U*AfVZ)c2)gQ&f>Z`c|uM{nTTtURl0+rGE5ZQH(Wx>HCH0I-at?9=uW`v9J8 z+qP}nwtW}1Nt1e}P125TTse{?tF|+j&Sg074)jcDvu`a5SubRLQ_Regr6n-4A=%ot zW6M@wwr$(Su+ zy?}4T8JlrN(MyPtzQ4g^j3~A+;Yn=!V;4%=8@^c8&iJX4({0(MO1JUzl^5yhHtkgD zHt($RB7NPKomIMxpDOheY`(35Fr)lbKf!Km@!K7`&^V$vFJh&6g`!1mwq3wf@r>{GvV+Hp=)*RG?S|3q(jy*hywDn7tGZLfA`n_StW>lOm+cf(2|w ze~FQBdb;O}HQFSV$r1u@6ieIvHlEeCdDYtx=lCzHprKglY)6MVI)am5PjG;+XRj1A zRA0cE@iyu!(_Q<2?^47!!hOBV&MGwqkJN7#AxcJVY63?hlw{+F6)tn)%*hchjJY!5 z%2d)!-Sw_pyKv>q#rLdM2S%ja32vAb? zl9_p3nfORJ6~{D@dx3*cM;HkkrGiAlQ7|WmnO|!@Aw_CTDy|Wa3>pYhRCxAzyJ4ii zF7jH=8&bzkCE#Ksg!GhzK(f}?0Te3Sd#&9dQt*H|3c-zSoq}adDj6f%dq%4i!T@*T zuY9?1_L0R@QktA3SP1iBeyIx=sbWwG8qQfdtpcJP5tgr138+L}>{}LsSkC5`rb3*m z5^heev(bhaQgC0G%>(Q$Wnxs~n(TZa#uLpPdoQMv_tc;f5aKd#j%1iJsm9R9UuwuO zjoE5GVM5h7CM_H$6&||N&cXK_DN;ZVo*r}=A;<{3^pR6>GzE(Qj|xvbY!?tHR#vOo zm5Gy3GG~BY9=0gW&uUF4EmT|WH^ZnBQ@#3fY?I$27mS! zZen%h!j%blj~QcEs-Ly@Kk+Dt4Cq;qPFl4}<5lJa(3sLTHP}3BD64fXC~Mj%gmtLoECnTsk6z!l@25a!vpSv=(nBkD6``N$v@E$GFhIaql5LB2}FLe|}DRuJ! zKq@p`fCH-|^!|C$wgSk8K(GChEa=*QnzVeO*EO!`iUN0l9{o~lS37OqY4uSlaC`FX z688_aRxWfp`O>(pAdp9=(D?QNN0l>Iz{;sohsD?J1iJ||5v}!lA`73NiG>HyfkGJJ z0rXW(|4bIML6f>y(A^~PmSh|_3E5C8AGprROkr-h71`1#pNql^t+JUgQ?Gb zzRPx{>e3=h3c?KAWc(Gfe`*RiFG|?8D|6jJIjgdZ=PGs|E9^Ksk*C;wJ1F8}L1IJk zp#fvHtO*JmxgpalKV0Qx8Q>Igo2AnI>$XwV93PpA7Hxi{DA1nON&ca=_gn8f!)1+RMbHRBw1`Ps>jIa*ERgC@gu5)+$PJnkl#g-=M4h{Nsc*5 z5A5siWNovUY8=zRAz;~1LeL zQ+2R(>^=9{sL(sW_mbgM~Y@B{+Qm@Q}wc7eO}IaB`0 zCsi7J-u=kwwz$c10TdH`m2wzBH8FO((FCh`HSr3c zC6(!`uS~vt8U38osQzxwq;h#1J;Ca_7Gt*^J3G1><^Ed~5jqA?d~6LWI-3F17IX9e zu%GDHxUKhN#-I0nn$utWYkFw|`tyEGBP2i$BMke^*TvlYKl1;x!%hBN6vP`dfD#fe z|HzLs|6R!ds$~E*GJu+l?kbyXH{OqLETZ{b22d;mC^_EXYj#4(kAeh~ABFL&Uqwdt a6C1BPRz!Xrb!7g3M>M+sp8vVxfJ*|h2@y>I diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index ee5a145966b3b05bdb8c8caa34a3d52b881b7e5a..13743258681ba08dabd3f2e47e8923875efa8732 100644 GIT binary patch literal 6394 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 ICz%TX0E9CqasU7T literal 5640 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 literal 4524 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 AzyJUM diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index ccd8ddfef7234fcc6d8bac9600f36699be1732c0..c4bc86a2ed306be4ee653af0f9433316f3276719 100644 GIT binary patch literal 9256 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 z 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 CCG152 literal 6242 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 03ead73630edabcbb9f8006e73975a1eaa6fc474..de33353e92c026766e157228f80264cd6d53fad7 100644 GIT binary patch literal 12484 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 OPYsM{kknLu!wmptBu+vA literal 12106 zcmW++WmJ@17ky?JdcdKF9uR3srDI5uE&&zk?hZj1I;D|Lr5mJcC;@3ux|8@_ja z|L*y5_d0jod(T;C@2&Y-US66T0CeS~)pgW`lwbb0=I%su!&H!V3knI4xsK(^-BHQ4 z(m9r(@CP+O@v<@WFS(t0ss8 z?9MM7|CrUfLHHQ-2C-g%rMGjRe!FZC0y@rPP(1T(HQ3@wMJX3pLJkxlcCz%%W)h%8RSM!ZVc6!L(b+5Y`phJ8n+q70FFf?IQ_rntzo^ouMm*st?zTSpWMQ!MM&St77}^sqLCV#{}ac5d}hr zzgE63lng*I3r%QeN-NKm&xbSt$^kfuxk$ zNPm^iH6{kD@0WhX0~EG2CDZ@_hjCTV8pzdV%Pmusk%1j&KmdKbyNyfINy=}a9Wn8z z08DmA8Uo~CT7Qd|f5|?nfKeJXaLVf1C4O@(%EfJm=RBE951}^wtL5K{E&=IEp3&~W1YS=Z+4ox>uAIlD;C<>^T{Bi zzWRmD&G=c~ZW*Gyk84<_uHi9)>Gkww;;@()LilT{b*@pav3IuELfu%a5CyNN>wnR- zGrSHvqeO^9G=ULgv1j<(W1E;ddRj^9(9L;g?26q&wn_riPTTUzus9=cs5XcoQeH6_`b_@qL;;u> zk;JM%o}q1=1h>=)PP@NYYI0Z*Xb{&j^fA2Ln0al`FYvR$e&J1L-e`24NUi-R0h5Kn zsLgsh$+1uS?YR>TguO1dz6`YNW*<)!)hCv~9@XBA0$GVWvC~@NhWh zZ+T#3;Bb`U8aCG+y)c+nOoQe-wC+EbJQ4u>AF}ADD~4N! zZeR6UN}g9#kx5!#3p8Q5UH^RZ@dcRiD-5y<2LAhL5YwP8h-r0KZ#7l3@Q1qP58X~W z8yG)U9;Pn+k6sTnkS;KbC7Xifoo@a+{fpg)Pk-)ce4hhx(bG@ji-oS%*SaHYA+qWi zkVJ&~Z>0AZ~1Qal(l=b!~)v!he(cpnVZ~$P$xT$A?1Kr5~a${5omj?&xLBAlMb25lb zFzfn^{!{yzvE3QQvD)r<*XE!i0P_?hvl{d1@9XiDbhrz3V?hOnzQF-dvYNTFlF_83pac+r zP6eQVLP8A4>N9zzP*C|eIp1e9pnBwrzw@9I^RUM&3{OCB$(`!*`s0;ADu~B~35G!zesMPU4QrHrKfxUYId`Mi|uslp$=s7w8a(&XPp zi1tbW3uyI2fHfP#pJ&Mc@+Th9!Diav#Q54Ft0AQ4j1g0|uZnb+b^3Eym@ENb;F6Js z2WcP0OMplZG@Liy9RODyKj=M6{%`+0nKK5avqIpM;oS+>UYR*|Vmnj8@MmszNMg*7 z79s%aHJFUBfK9!{3ulV7ixJVJ&Hp(HlOG4BFVstHUW{3zT}TujR9Gc^FV~9BdqS)R z5>T-ZdMEDNmbfzn0IVppP)dDl07(D@0`sW?)B)>Z#Byxg>(Z&!q-aJ$Ol?+jK%JG4 zh#5nEhM@KMSxQw$D?W1JyY_yFY@^SrJn&Q-s?L^=d<<0-eTC9sGY=*9%LlZELR?Av zy1I>|z6O}!z(qpe7*ho}CyHF6J}bFzmhdcLDFJT#a=0@S1kegIl-Vy{dJ7FgcBAK- zP3uvIi1HfTd?(xV*GZt@&^Uqz{c>3d0|zMoK8nYn z7iPqvs+czBg{@ad%B64A9RsSdGQ;U-&joFZFkS=@5J7+kmlaGO5EBIEONx*A*N#I6 z=~CLh*Gp4T4|3tCRJX&zz=PI{=pn)1XAW&C07f*{-#Ey-83(<8I+TvE@wwpf1I5|M zTus7)E8JPq5?01_R1*?Q&n(~>O3r=X8o%A|en1QSgOQU7c%35+%OwCo(-|^{^Mk>5 zF%Ut3+rg;^PiQvKuIBkgi~Ee$U3mDecJYUA9HT;sPCR4#e3A|Y`HassBStV2Sh4pHx z-f3M@ZThG@yIDeJ0)ccP5(Ki#4`$3XP0qu3p@+GfJaUg`TCp%j87lD#d$l(TV^$mY znT}Ni&t65}r%v!R>wv|lCS@HE6VPms1^~rg>gYd_>r#|7Kc^;x8^~k0s_akWAb$7% z0-f1Fh+3X-4*Ob_FRKOmZ;iu>hnze0^~R(Y$WL=RPltwTHAtkizlbX=En^V2v*5;8883hBk|0zO7CqQ68?4kM*r?h45I z7@nR`I&C@Q77{~V;OriIuCXGK?NiJqfb2GO+6dh+s2CRz!b8#+=6||jNEalQuYv(Z z#8M*cZw&zqa*q73HHa6MEdNy<3|9@@ZBj7ki8v513Uz15BAiL z16pz6GBotJ_fwKSPw2_uMY-)88z}92{&J}h!u8%T#rYK&0zrjeomE>L+A^q_I`!G+ zv|)KOhoN(OgAcSvL~u8C>30OFi)|F9BCU9$+yX>dgo5nK;9T)z$T|mp=R?=d#|bqF z`~%(?%XTGD-l-sfrJ(*qE+`d<1b?sj9D!w5m0p;x5xLO~I>2Y^ssu(qH=+qKj1j+&obbORmXXF+DlIeDE2%c;GzF zz{MOGUlZZR-qQm@|+gsDECqr%UiVxgMK|G))exzmxv%T7#8~eBB@N8**?i@YfG(*9i_MyK(|BE{Moi;js(S%m}_&oWr zZI{Ck|Cl%NH}2teu}qV@AE`xBCAn-c7zUZVu?T0or#(%%T99jwF^?e9UEit|nc3_8 z{obH!?dS4Q@y2(Q`v6(;VznAM)lvmN+nFg$@>1hH4W&m6Sh1g^Q|y zqoZT(+|zfT**9~=w3d&d*Z0FpsXjg@CJsMES1@1$JR{|KV`EJ3-+WEC%=3&{I{FwQ z$>X@E#Af6o%<7V@p}i;)_Q!UGz&S*p=!x1^IALFN2L(EuAeW~S1_kl}ST}B}JiFkf zZyWa^p=hd;;YDd)7oGqIE6WKqN!2IC=S?h53Xt*MXkP$Jg9}SJ_1^ zR7>%(#Q9H+VaeJotGrFEFzL6cmB$4!6ae3i5K5#m)_`8HMS?v?D@T>F+B7fO?#4@fju2(& zKPE=mP|zgVj;&)YDwgCYyPYR1%;)g>V(G7x5gwrU6b2nepu$0gN1ukBINCtA@#?Gc z!#vN6Fp8h{7~zr4G}~V88{UJ%4>fd+MV}!edvt$#NSlCyi2*4bET~MT2F8yeGfNHQ zPb+lq*g{#SOhkS$2cbd~R=!xgGOW`ad$L7G5V>IsxV;4^xNuNiMo3N_=3?UakYdv; zweNIq2Fx`TSyapp2;U+-ISdR56Mepu2^@N{!sy#?IbJ2*wqlU-6G9;&AdK{v>orzOc+(K2Z#@w0=KW?VAOcy8`iOLT!JuKttQQ+EUXnEn~+`nQ2xx@3-V-(tyr zIQE}Jov%7$>$O59Ju{Qo7%rI!KY>XUC>-4BhgTg>3437EYxKTP5zGGDx-sgF9@tJW z;ID7;F-H9DasO;^+7Zc}gAfM^-{?2^4TKNb_xrr6bE{5J3K~P}f7-nb&TsqZpXdgM zV*)J1SipQi_=Lo~HnP00N2BO*U!XzV1i%t`I#Q97`&&#)!7S zdxOBKQar)mSdG3>dG{}2qUFQa%5)DT9tT;3_-Qw|Tr7zvLv$LY18zK%K&4L?J(yoZ zoiKaG=fh<{JeodN3$sa%HSE5(&oBJqb_{4U2-l`A#tlYz9?6NGB9Rhh{d2`f~{x5qQADaK<8QkxW zVfP;V-q0{to3T}-Ni{-dc%Au51&pO*pj0MyWFD?&dbeHclTxjY3R4LvAzC=4S$)4Z zKEtZ+r?KPB1DhUyROy7jjmdw8!UXUjFhB;CAFU$HO&`i(q@{g$cVjAiug|lb7h{bR zl4kaijuZ8se0#YvM96!JVizfm(?|o>iv*C;c_36E$N;VIf!g3b_AH#TO~0+fj$ZK{>-G4A(X#qhem!V>zp3MW<)i5i;aV>vmUEIsNx8 z!sSLUxHmf=9)fiV0c3c;MI_?&ABzOu5NZ1-zkCM#Fwc(bR`A0w4YUUUxwViy*GpavDw+e?-cj(qC!yYZ_2fqKpFyX1` zMk6S1^W2kodnd~8EVfQh-M&^Q#u#RA*I|b-*azBg5&8K^TDrPf>TT7RU0%p1ef?tw=Jc%ZN87+K&ZF{9;wAt|6P^+Vdmh~M$)5`EpH<7 zTbRuY3MAzc5wugA~X}rgdn}p>Ss$;gH2hzu?*UsNaC#_G?4` z_oK&Kg|mr zz|&I(d7emCp3xb+G3b`UkROuzuY?z?SlHId(2jMrV7++l(ruJ*kJh6c<$@Y1{3-Cy zN|JF-J_9<26`%Cdwt1>Nv47CHiQCH0gz{j>JQ94pKOz3%$X;tClxRX1DmGya&UY@8 zR{?kg01_;~46XNRCJ2PL{^Msh12M4nr|TdtVOYn3_L#X{^>U=BDvfTw!qC*Odhsbil|2*Q+M2x-s7I5}6++=lVyXynYFWJj*Q2_uSvk_Q4^A{hg z#&Ef%d2ViMi>bNRYgg!_+@)88%SPAnU*G>&rx5Q;5WRr-_a(vOgY)Ct){<{BtuD!p zyh5hU`X!5JxRt$as2WX#FqU_jNN3sVj|X2f1Ol)UQD=r|By^UhoLrwDI|GeAh~V^ZT*vBzZZ#Z*#f$Z03^I~*14^9R`NcJ0Y=Tv zN%XVa)KY^`Hs)Krxpq*DsYKmWyuFQSNlhGls~X?mtQwNH*TGB)i4{lHbemxl$m7ot zuMgU0^S^SIz^uNX&Se1v;LJ539{rp)x7$W^VR3rA8EkX*^F;JD?-R3)Xrr_N{txB- zZ1buve8IvkZdlZ4y|*Pt7ht={Y}vLrDfKzI5@5BpGX1rDn#le6po}~%ZR$`qhNmu35%%wY-_H$@h+hRjIzJo=KHp`NN@dz9@|s(hmY_$=vl6a+ z5}&cGC9RJxgbol;!lOT1mbp9K^|GWry_p*E6uDCKtl-zt3JkXb05~t9yykFp==>uU(`{B0Qk&;I8%3+L8N}BI^5kSPO17N`mo6;|~ z>XIqZ^KyF*4uJZ zn)LAu&K9Izf72(ZwjdHTca+)`{vy<)r^^4|1Azq12@mWZ!rn3slsU2?c9(XRt1w?y zgE^6Q%+9MnH$C27(yv{)AY>>;d*Dk+p_7Opz?kTZR$QxNDbga1knXNYX1*f_%&I&` z1gXJ#ilb5JtudFj;8iv&f)*)A=2*)B#mFBhMc3qZnOy`2^YHy8-CRCb^U2=X9IRs5 zJQ;m$O35VCKl=;}LgMfn5ev6jUNB%xvrs$;VbOojS#{=5|NhSGAKA0;a)W=6&Hsk= zFaPB_MZX(2G*qQ#N`Z8#c~=6(0>+_Jc7fjBpLntLGWG&FAiMza&lEiq&JsCu=qJc7 zPsD%xXpB_0MBcUlqN}FLV<3#%x0c4TA4Q#p{8bI$5Qmk7KC9aEuKM~HuqBo|>Ol;? zUgZATNKn5s6XGtU6g93Y-tI|s63^`(_xXzUIy(pZtjW<4l%ABAsewST;-|`Yv{@`e ztLb?4zaWCdGhEx)H+(?+bGTvQLbO2@)VHAA00Gbx zJjor7&n!DxER3=NjqCGA2*Y>r5dz5p{PuhoiC(%GlSkXf-Zj3T44uv9kF z<>EEco$rqK#Q#3A#*o;YIV&UmJ96+Asr#A{ILZT(n9NmQQXe#W)=tv@D(9cMIf`r-`50=KgnBNh?y&v3FX27aOAaV^Ea(|~ZzCyVs zzvxCfV;bongPApaIQkO$tFO{%_LH^>gxs3nTv!m&bu{0I++i#dkhU6mzNljAP`vNf z5bs)V6@FyjUJ)W+$^KXJw1aA)oRDryR17N>Nlw9^R)@jHF`<3Vr2OQ7^e;@t&S zi`tE8nPr*CkfBZ4>!k;CTe=rTD-U5?%q{QWf++|;@w!?yy;uL;#RZR>r2Jo_@gU!y zIQy-Z{-+LZ{^U)~d<8r(b{o!2{xLe@~oAmzIVmNJ)zV--m|owXojpm{auxfH@04a-MLc{j=Xx z+Y(&joQb!EYb!2tIj+K5`%DAF7809Cc><&}^Hx6N#HoWzcZ_ExnoJS80P+^JG?6R* zY3HHZ-clnqQIQFbl_8`7_w9f2WO|fl_-x1K6i~|-kWrRvj?_)>X<`>$Giw6z^`i-# zW7uwJ)H6bqa*)C9li_hu6b?Co%pzxRBoH~g-B(9_D>SzHvBo!@XC!O6)p2PSQ^^Yo zEB{H(0e9jDRpo9NWLtpl`a6C43vyA-&@dU@x1r$(f-f<0dcwV`g9%wbnPP=3i}Te0 z29kX1G08PDxSFA9a4?O0P%z#uF1Rgr?##$p zixo(x}C^f_j}c-mhNFE_vA3W#g&H3ZcfuF+Ee#iKP%lsoBYp2^#k-Yt$s4B{p+&4dk@i={%+fqCEzUr0 zB3`tJ8>)FvDd1a|hBG|&ZzPBD#4C069nuFOK~j3rq4Vc;?|W=)TX9R@m%evC{(E{d zIw3)_KjkBpguqLz-Vj0mVTaT_#hw(;d~Ly-U5z{#%YGdmYGL^bn>==TY=-3@31DLG zn1jdrc(qYFp*Ms27#oPAZW=`O9R25~;)itBuW=2wP0U}fGxf~Y$w(X7f1TIGN~khi zz!5sk!6+|-f}&WloXS&SlK4+Ctju^B8gqZ?BO{`0oS7-2sId7wy`n#JeUloc_z=l> zJ4XLWSYt(VCGxjDfab#J?Ym;x1=rIPFfu}&oxlQbWuIER*?Z&wp5FODgWWaDEEVZ}=VH@x>VKVWuUCS}r=+spAkGsg2sLpAvQa1vmd z%RIC6KlkmXB~MZpAwytr4AbCMkGK#$6}a!e|WvPs-yv_?sJK!CgotQ#4EG4$Z7h3)e7Bsosnp#nkjMe@n;2zdPO3W3!+as z0Bqz_U=>HLUW}QnzBQaBdGfJMc;fnN!~1U^@R%CgRVs<4%nwY+kZW-$`((vuWPDI& z?UrZX8(uZeI1hYahhLYC(rUR*MkTg*?YYlYErizoZ80;>JT3^Ps?O3x4QmU+P`2w0 z$i|%$3`dH)*Y>I+z*7nU7k6&auedpR+y8hl>YYW&_^(>GaEd1oyCNtqH6r2Ffp-GIoqGG*6lv&kk5*EPRsEY&JluPm*;yGv)IlZgqd|I@L4WZ23@eUx9V#Qcbmn3kq`fuN2i(O9N1cmL4Wf!H5)grtb95lAv zUe+ku@(~5*&DvFF{eseLSwf89%cPVln>K7vltZ0==wk^nO=f04}l2c1y?YC zX#s207mq_`mE}0cjaCzg0c78F4<|&>MiXRv4X`-~TN)YVn#8f?+eq7Oj(G`8G(oco zi2-~|Ody=8(cKq_gD-+i96wlF@W>Mq$#JHK%(dloL!ARK8L^Pj5V(~FtrH7F%X(0K z$!QZ2%-OCBi`gT}I3K8B6T!3l6|CC3H9T2h07dDA!9EoHGX;$ZcZO`2v7);L4k`rz}!|av+IhgLN!s zQQli9S67G7=O8`ar=nB(c4vQZ5a^rVYcfxSt>>zZs#OU|-o7x-(;P^D#Fu)y?Yv%V zh4qSf+Bgg196n#3Mba+#UO>hkRJsvFh;*H+8E6*Li*z3%OATjcH_baTw|}m{`f@Z> zixbAH95h)fOJcdbu^0@_T7ba0DmT9!d;A!J(EKh2NGOi4U=)w>u(E8 zMkr+(2Mn3O3j;{4Wn~8M1ThZ zzW1Sm3ENN73_juy6mfgkG<&hv67||3o7pp0O+vlXhG^uR^We$9x{V5d6udQxm=D&o z-m_a8$o&?I`Y{(R=Gu)Px7Cp^BC(Ly*cZIWiVc|U=5CndA&ft2g>yR^?rM@k*R_n$|G9No=x@^(mMo^-mzU9fAK%4g5ymQ|SnWKcLx zj4d#xq-<63ZzDRBY`}G9(0t}mu#QE#P@Oi zymrLeGw&~P)ugK~ee%0Vsb0Vry6uZG5n3ej@Vqzu_U{f-AaPMsyAda6)$4_{-67R>lXGd|0;Oooc%+p)~$72 z42gPW5Zf9nndxqy-}6S`x%yhjKL9`c<^6S}JD`w+)Cv4GS43eo8b$I_=fk%* z-!+~lz5^{?H>if2^ub^-p*Oq9^9!byt*=sU{fLPZ>cABe4huZpr1G<&3fq=wfnr^O z0SAukGp~=jKZlBvZRf~6{5{N;dxGkYL*!b2dkby8bz19vNnFM?DPl|uCKvy%OhBcn znWPiU#5EcmGyXQ#)xR^%plV)gXlPe!TVzfEmKk+(RlR18PohpCYHj5uJWM!zF>Lk48U5Hmb;Z- zIEPm^5DQHS^;7xm^KoY%wp0CS0nf*MY(Mm(HO4cgp2vGGg)DO#ZJieOZLk*@hsu9PXRt%HLjZZc z^gq#gWrGd-CQ~ibGS4^mUB;V*X8Izvx>#6J+CSi#ihI*Ne^tWGvU@JoGej!#0^VA` z&ze^sq+k765vnlYru+oA{=U{$o)=HnTjevP*tX{`wf$zbL%rO#P~U>4?*l0zqxj^m zee0a%?OadTd0d4XVj(mo=>`gGXS8j|+jy3X#C|P9kc&iuU`9TexSH6s?7yb17M3V6 z6}|5@mDnl?o>9GXC$H}>=SA!0pHbD>zE!t})JZuE9AvzwR*nf7TQUdA}YsBeY2NG87)l-bVo^8K9sGiOA>#~Rj>r#Rz7 wg1CooR2rG(Yi%vvmE%@Jn8KHJxIg_kPhjyzqA0QuwYTR%Qp`mJVoSjP03!T1TmS$7 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9d739c..ea51bd2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - Close Talk + Zoomable Image \ No newline at end of file diff --git a/build-logic/src/main/kotlin/feature-module.gradle.kts b/build-logic/src/main/kotlin/feature-module.gradle.kts index 75697df..814c8c2 100644 --- a/build-logic/src/main/kotlin/feature-module.gradle.kts +++ b/build-logic/src/main/kotlin/feature-module.gradle.kts @@ -13,7 +13,6 @@ android { dependencies { implementation(project(":core:ui")) implementation(project(":core:di")) - implementation(project(":core:domain")) implementation(project(":core:coroutines")) implementation(libs.bundle("lifecycle")) diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts deleted file mode 100644 index 29b9440..0000000 --- a/core/domain/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("core-module") -} \ No newline at end of file diff --git a/core/domain/src/main/AndroidManifest.xml b/core/domain/src/main/AndroidManifest.xml deleted file mode 100644 index 1d26c87..0000000 --- a/core/domain/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/Chat.kt b/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/Chat.kt deleted file mode 100644 index e26a429..0000000 --- a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/Chat.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.mobiledevpro.domain.model - -import android.net.Uri - -/** - * Chat - * - * Created on May 06, 2023. - * - */ -data class Chat( - val user: UserProfile, - val peopleList: List, - val unreadMsgCount : Int = 0 -) - -val fakeUser = UserProfile( - name = "Joe Black", - nickname = "@nickname", - status = true, - photo = Uri.parse("https://media.istockphoto.com/id/1090878494/photo/close-up-portrait-of-young-smiling-handsome-man-in-blue-polo-shirt-isolated-on-gray-background.jpg?b=1&s=170667a&w=0&k=20&c=c3TaqVe9-0EcHl7mjO-9YChSvGBDhvzUai6obs1Ibz4=") -) - -val fakeChatList = arrayListOf( - Chat( - user = fakeUser, - peopleList = fakePeopleProfileList.take(5).sortedByDescending { !it.status }, - unreadMsgCount = 100 - ), - Chat( - user = fakeUser, - peopleList = fakePeopleProfileList.takeLast(3).sortedByDescending { !it.status }, - unreadMsgCount = 0 - ), - - Chat( - user = fakeUser, - peopleList = listOf(fakePeopleProfileList[6]), - unreadMsgCount = 3 - ) -) - -fun Chat.name() : String = - this.peopleList.toChatName() diff --git a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/PeopleProfile.kt b/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/PeopleProfile.kt deleted file mode 100644 index 375400c..0000000 --- a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/PeopleProfile.kt +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.domain.model - -import android.net.Uri - -/** - * Profile - * - * Created on Feb 04, 2023. - * - */ - -data class PeopleProfile( - val id: Int, - val name: String, - val status: Boolean, - val photo: Uri? = null -) { - fun listKey(): String = "${id}_${name.replace("\\s+".toRegex(), "")}" -} - - -val fakePeopleProfileList = arrayListOf( - PeopleProfile( - id = 0, - name = "Michaela Runnings", - status = true, - Uri.parse("https://images.unsplash.com/photo-1485290334039-a3c69043e517?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80") - ), - PeopleProfile( - id = 1, - name = "John Pestridge", - status = false, - Uri.parse("https://images.unsplash.com/photo-1542178243-bc20204b769f?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MTB8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 2, - name = "Manilla Andrews", - status = true, - Uri.parse("https://images.unsplash.com/photo-1543123820-ac4a5f77da38?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NDh8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 3, - name = "Dan Spicer", - status = false, - Uri.parse("https://images.unsplash.com/photo-1595152772835-219674b2a8a6?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NDd8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 4, - name = "Keanu Dester", - status = false, - Uri.parse("https://images.unsplash.com/photo-1597528380214-aa94bde3fc32?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NTZ8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 5, - name = "Anichu Patel", - status = false, - Uri.parse("https://images.unsplash.com/photo-1598641795816-a84ac9eac40c?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NjJ8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 6, - name = "Kienla Onso", - status = true, - Uri.parse("https://images.unsplash.com/photo-1566895733044-d2bdda8b6234?ixid=MXwxMjA3fDB8MHxzZWFyY2h8ODh8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 7, - name = "Andra Matthews", - status = false, - Uri.parse("https://images.unsplash.com/photo-1530577197743-7adf14294584?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NTV8fHBvcnRyYWl0fGVufDB8MnwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 8, - name = "Georgia S.", status = false, - Uri.parse("https://images.unsplash.com/photo-1547212371-eb5e6a4b590c?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MTA3fHxwb3J0cmFpdHxlbnwwfDJ8MHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 8, - name = "Matt Dengo", - status = false, - Uri.parse("https://images.unsplash.com/photo-1578176603894-57973e38890f?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MTE0fHxwb3J0cmFpdHxlbnwwfDJ8MHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 9, - name = "Marsha T.", - status = true, - Uri.parse("https://images.unsplash.com/photo-1605087880595-8cc6db61f3c6?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MTI0fHxwb3J0cmFpdHxlbnwwfDJ8MHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ), - PeopleProfile( - id = 10, - name = "Invshu Patel", - status = true, - Uri.parse("https://images.unsplash.com/photo-1561820009-8bef03ebf8e5?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MTM3fHxwb3J0cmFpdHxlbnwwfDJ8MHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60") - ) -) - -fun List.toChatName(): String = - mapTo(ArrayList()) { profile -> profile.name }.let { names -> - val stringBuilder = StringBuilder() - names.onEachIndexed { index, s -> - if (index > 0) - stringBuilder.append(", ") - stringBuilder.append(s) - } - stringBuilder.toString() - } \ No newline at end of file diff --git a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/UserProfile.kt b/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/UserProfile.kt deleted file mode 100644 index 0116ae4..0000000 --- a/core/domain/src/main/kotlin/com/mobiledevpro/domain/model/UserProfile.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.domain.model - -import android.net.Uri - -/** - * App User Profile - * - * Created on Feb 04, 2023. - * - */ - -data class UserProfile( - val name : String, - val nickname: String, - val status: Boolean = false, - val photo : Uri = Uri.EMPTY -) diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 0068d5c..7ea1ac8 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -14,12 +14,7 @@ dependencies { api(projects.core.ui) api(projects.core.di) - implementation(projects.core.domain) implementation(projects.feature.home) - implementation(projects.feature.onboarding) - implementation(projects.feature.subscription) - implementation(projects.feature.chatList) - implementation(projects.feature.people) - implementation(projects.feature.userProfile) + implementation(projects.feature.imageViewer) } \ No newline at end of file diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/HomeBottomNavigation.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/HomeBottomNavigation.kt deleted file mode 100644 index dabeb35..0000000 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/HomeBottomNavigation.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.navigation - -import android.util.Log -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.slideInHorizontally -import androidx.compose.animation.slideOutHorizontally -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Warning -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hierarchy -import com.mobiledevpro.ui.component.AppBottomBar -import com.mobiledevpro.ui.component.AppBottomBarItem - - -@Composable -fun HomeBottomNavigation( - screens: List, - onNavigateTo: (Screen) -> Unit, - currentDestination: NavDestination? -) { - - Log.d("navigation", "HomeBottomNavigation") - - AnimatedVisibility( - visible = true, - enter = slideInHorizontally(initialOffsetX = { it }), - exit = slideOutHorizontally(targetOffsetX = { it }), - ) { - - - AppBottomBar { - - screens.forEach { screen -> - Log.d("navigation", "HomeBottomNavigation: hierarchy = $currentDestination") - - val selected: Boolean = - currentDestination?.hierarchy?.any { it.route == screen.route } ?: false - - AppBottomBarItem( - selected = selected, - onClick = { onNavigateTo(screen) }, - icon = { - Icon( - imageVector = screen.icon ?: Icons.Default.Warning, - contentDescription = null - ) - }, - label = { Text(text = screen.title ?: "") } - ) - } - } - } -} \ No newline at end of file diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/Route.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/Route.kt index 7af7c6b..447dd1b 100644 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/Route.kt +++ b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/Route.kt @@ -17,28 +17,11 @@ */ package com.mobiledevpro.navigation -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Home -import androidx.compose.material.icons.rounded.Person -import androidx.compose.material.icons.rounded.Settings import androidx.compose.ui.graphics.vector.ImageVector -import com.mobiledevpro.people.profile.view.args.PeopleProfileArgs -const val navigationRouteOnBoarding = "on_boarding" -const val navigationRouteOnBoardingFirst = "on_boarding_first" -const val navigationRouteOnBoardingSecond = "on_boarding_second" -const val navigationRouteOnBoardingThird = "on_boarding_third" const val navigationRouteHome = "home" -const val navigationRouteChatList = "chat_list" -const val navigationRouteProfile = "profile" - -const val navigationRoutePeople = "people" -const val navigationRoutePeopleList = "people_list" -const val navigationRoutePeopleProfile = - "people_profile/{${PeopleProfileArgs.PEOPLE_PROFILE_ID_ARG}}" - -const val navigationRouteSubscription = "subscription" +const val navigationRouteImageViewer = "image_viewer" sealed class Screen( val route: String, @@ -55,30 +38,9 @@ sealed class Screen( routePath = path } - object OnBoarding : Screen(navigationRouteOnBoarding) - object OnBoardingFirst : Screen(navigationRouteOnBoardingFirst) - object OnBoardingSecond : Screen(navigationRouteOnBoardingSecond) - object OnBoardingThird : Screen(navigationRouteOnBoardingThird) - - object Home : Screen(navigationRouteHome) - - // 3 tabs of Bottom navigation - object ChatList : - Screen(route = navigationRouteChatList, title = "Chats", icon = Icons.Rounded.Home) - - object People : Screen( - route = navigationRoutePeople, - restoreState = false, - title = "People", - icon = Icons.Rounded.Person, - ) - - object Profile : - Screen(route = navigationRouteProfile, title = "Profile", icon = Icons.Rounded.Settings) - - object Subscription : Screen(navigationRouteSubscription) + data object Home : Screen(navigationRouteHome) - object PeopleList : Screen(navigationRoutePeopleList) - object PeopleProfile : Screen(navigationRoutePeopleProfile) + data object ImageViewer : + Screen(route = navigationRouteImageViewer) } \ No newline at end of file diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/ScreenNavigation.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/ScreenNavigation.kt deleted file mode 100644 index 4214a75..0000000 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/ScreenNavigation.kt +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.navigation - -import android.util.Log -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavType -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import com.mobiledevpro.chatlist.di.featureChatListModule -import com.mobiledevpro.chatlist.view.ChatListScreen -import com.mobiledevpro.chatlist.view.ChatListViewModel -import com.mobiledevpro.di.rememberViewModel -import com.mobiledevpro.home.view.HomeScreen -import com.mobiledevpro.home.view.HomeViewModel -import com.mobiledevpro.navigation.ext.navigateTo -import com.mobiledevpro.navigation.graph.HomeNavGraph -import com.mobiledevpro.navigation.graph.OnBoardingNavGraph -import com.mobiledevpro.navigation.graph.PeopleNavGraph -import com.mobiledevpro.onboarding.view.OnBoardingFirstScreen -import com.mobiledevpro.onboarding.view.OnBoardingScreen -import com.mobiledevpro.onboarding.view.OnBoardingSecondScreen -import com.mobiledevpro.onboarding.view.OnBoardingThirdScreen -import com.mobiledevpro.people.profile.view.PeopleProfileScreen -import com.mobiledevpro.people.profile.view.PeopleProfileViewModel -import com.mobiledevpro.people.profile.view.args.PeopleProfileArgs -import com.mobiledevpro.people.view.PeopleScreen -import com.mobiledevpro.peoplelist.di.featurePeopleListModule -import com.mobiledevpro.peoplelist.view.PeopleListScreen -import com.mobiledevpro.peoplelist.view.PeopleListViewModel -import com.mobiledevpro.subscription.SubscriptionScreen -import com.mobiledevpro.user.profile.di.featureUserProfileModule -import com.mobiledevpro.user.profile.view.ProfileScreen -import com.mobiledevpro.user.profile.view.vm.ProfileViewModel - - -fun NavGraphBuilder.homeNavGraph(onNavigateToRoot: (Screen) -> Unit) { - composable( - route = Screen.Home.route - ) { - Log.d("navigation", "------homeNavGraph:START------------") - - //NavController for nested graph - //It will not work for root graph - val navController = rememberNavController() - val navBackStackEntry by navController.currentBackStackEntryAsState() - - val bottomBar: @Composable () -> Unit = { - Log.d("navigation", "homeNavGraph:bottomBar") - HomeBottomNavigation( - screens = listOf( - Screen.ChatList, - Screen.People, - Screen.Profile - ), onNavigateTo = navController::navigateTo, - currentDestination = navBackStackEntry?.destination - ) - } - - val nestedNavGraph: @Composable () -> Unit = { - Log.d("navigation", "homeNavGraph:nestedNavGraph") - HomeNavGraph( - navController = navController, - onNavigateToRoot = onNavigateToRoot - ) - } - - val viewModel: HomeViewModel = viewModel() - - HomeScreen( - bottomBar = bottomBar, - nestedNavGraph = nestedNavGraph - ) - - Log.d("navigation", "------homeNavGraph:END------------") - } - -} - -fun NavGraphBuilder.onBoardingNavGraph(onNavigateToRoot: (Screen) -> Unit) { - composable( - route = Screen.OnBoarding.route - ) { - - val navController = rememberNavController() - - val nestedNavGraph: @Composable () -> Unit = { - OnBoardingNavGraph( - navController = navController - ) - } - - OnBoardingScreen( - nestedNavGraph, - onNext = { - when (navController.currentDestination?.route) { - Screen.OnBoardingFirst.route -> navController.navigateTo(Screen.OnBoardingSecond) - Screen.OnBoardingSecond.route -> navController.navigateTo(Screen.OnBoardingThird) - Screen.OnBoardingThird.route -> Screen.Home.withClearBackStack() - .also(onNavigateToRoot) - - else -> {} - } - } - ) - } -} - -fun NavGraphBuilder.peopleNavGraph() { - composable( - route = Screen.People.route - ) { - val navController = rememberNavController() - - val nestedNavGraph: @Composable () -> Unit = { - PeopleNavGraph( - navController = navController - ) - } - - PeopleScreen(nestedNavGraph) - } -} - -fun NavGraphBuilder.onBoardingFirstScreen() { - composable( - route = Screen.OnBoardingFirst.route - ) { - OnBoardingFirstScreen() - } -} - -fun NavGraphBuilder.onBoardingSecondScreen() { - composable( - route = Screen.OnBoardingSecond.route - ) { - OnBoardingSecondScreen() - } -} - -fun NavGraphBuilder.onBoardingThirdScreen() { - composable( - route = Screen.OnBoardingThird.route - ) { - OnBoardingThirdScreen() - } -} - -fun NavGraphBuilder.subscriptionScreen(onNavigateBack: () -> Unit) { - composable( - route = Screen.Subscription.route - ) { - SubscriptionScreen(onNavigateBack) - } -} - -fun NavGraphBuilder.chatListScreen() { - composable( - route = Screen.ChatList.route - ) { - - val viewModel = rememberViewModel( - modules = { listOf(featureChatListModule) } - ) - - ChatListScreen( - state = viewModel.uiState, - onClick = { chat -> - //TODO: open chat screen - } - ) - } -} - -fun NavGraphBuilder.peopleListScreen(onNavigateTo: (Screen) -> Unit) { - composable( - route = Screen.PeopleList.route - ) { - - val viewModel = rememberViewModel( - modules = { listOf(featurePeopleListModule) } - ) - - PeopleListScreen( - viewModel.uiState, - onNavigateToProfile = { profileId: Int -> - Screen.PeopleProfile.routeWith(profileId.toString()) - .also(onNavigateTo) - } - ) - } -} - -fun NavGraphBuilder.peopleProfileScreen( - onNavigateBack: () -> Unit, - onNavigateTo: (Screen) -> Unit -) { - composable( - route = Screen.PeopleProfile.route, - arguments = listOf( - navArgument(PeopleProfileArgs.PEOPLE_PROFILE_ID_ARG) { type = NavType.IntType } - ) - ) { - - val viewModel: PeopleProfileViewModel = viewModel() - val peopleProfile = remember { viewModel.getProfile() } - - peopleProfile ?: return@composable - - PeopleProfileScreen( - peopleProfile, - onBackPressed = onNavigateBack, - onOpenChatWith = {} - ) - } -} - - -fun NavGraphBuilder.profileScreen(onNavigateTo: (Screen) -> Unit) { - composable( - route = Screen.Profile.route - ) { - - val viewModel = rememberViewModel( - modules = { - listOf(featureUserProfileModule) - } - ) - - ProfileScreen( - state = viewModel.uiState, - onNavigateToSubscription = { - onNavigateTo(Screen.Subscription) - } - ) - } -} - diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/HomeNavGraph.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/HomeNavGraph.kt index bfa2da7..5c899cf 100644 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/HomeNavGraph.kt +++ b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/HomeNavGraph.kt @@ -17,36 +17,47 @@ */ package com.mobiledevpro.navigation.graph +import android.util.Log import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost +import androidx.compose.runtime.getValue +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.mobiledevpro.home.view.HomeScreen +import com.mobiledevpro.home.view.HomeViewModel import com.mobiledevpro.navigation.Screen -import com.mobiledevpro.navigation.chatListScreen -import com.mobiledevpro.navigation.peopleNavGraph -import com.mobiledevpro.navigation.profileScreen +import com.mobiledevpro.navigation.host.HomeNavHost -/** - * Nested navigation graph for Home screen - * - * Created on Jan 24, 2023. - * - */ -@Composable -fun HomeNavGraph( - modifier: Modifier = Modifier, - navController: NavHostController, - onNavigateToRoot: (Screen) -> Unit -) { - NavHost( - navController = navController, - startDestination = Screen.ChatList.route, - modifier = modifier, + +fun NavGraphBuilder.homeNavGraph(onNavigateToRoot: (Screen) -> Unit) { + composable( + route = Screen.Home.route ) { - chatListScreen() - peopleNavGraph() - profileScreen(onNavigateTo = onNavigateToRoot) + //NavController for nested graph + //It will not work for root graph + val navController = rememberNavController() + val navBackStackEntry by navController.currentBackStackEntryAsState() + + val nestedNavGraph: @Composable () -> Unit = { + Log.d("navigation", "homeNavGraph:nestedNavGraph") + HomeNavHost( + navController = navController, + onNavigateToRoot = onNavigateToRoot + ) + } + + val viewModel: HomeViewModel = viewModel() + + HomeScreen( + nestedNavGraph = nestedNavGraph + ) } -} \ No newline at end of file + +} + + + diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/di/Module.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/ImageViewerNavGraph.kt similarity index 56% rename from feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/di/Module.kt rename to core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/ImageViewerNavGraph.kt index ae76a72..3ac491c 100644 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/di/Module.kt +++ b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/ImageViewerNavGraph.kt @@ -15,25 +15,22 @@ * limitations under the License. * */ -package com.mobiledevpro.chatlist.di +package com.mobiledevpro.navigation.graph -import com.mobiledevpro.chatlist.domain.usecase.GetChatListUseCase -import com.mobiledevpro.chatlist.view.ChatListViewModel -import org.koin.androidx.viewmodel.dsl.viewModelOf -import org.koin.core.module.dsl.scopedOf -import org.koin.dsl.module +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.mobiledevpro.image.viewer.view.ImageViewerScreen +import com.mobiledevpro.navigation.Screen -/** - * User Profile screen module - * - * Created on Jul 22, 2023. - * - */ -val featureChatListModule = module { +fun NavGraphBuilder.imageViewerNavGraph() { + composable( + route = Screen.ImageViewer.route + ) { + val navController = rememberNavController() - scope { - viewModelOf(::ChatListViewModel) - scopedOf(::GetChatListUseCase) + ImageViewerScreen() } -} \ No newline at end of file +} + diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/PeopleNavGraph.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/PeopleNavGraph.kt deleted file mode 100644 index a37937f..0000000 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/PeopleNavGraph.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.navigation.graph - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import com.mobiledevpro.navigation.Screen -import com.mobiledevpro.navigation.ext.navigateTo -import com.mobiledevpro.navigation.peopleListScreen -import com.mobiledevpro.navigation.peopleProfileScreen - -/** - * Nested navigation graph for People screen - * - * Created on Feb 04, 2023. - * - */ - -@Composable -fun PeopleNavGraph( - modifier: Modifier = Modifier, - navController: NavHostController -) { - NavHost( - navController = navController, - startDestination = Screen.PeopleList.route, - modifier = modifier, - ) { - - peopleListScreen(onNavigateTo = navController::navigateTo) - peopleProfileScreen( - onNavigateTo = navController::navigateTo, - onNavigateBack = navController::navigateUp - ) - } -} \ No newline at end of file diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/OnBoardingNavGraph.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/HomeNavHost.kt similarity index 68% rename from core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/OnBoardingNavGraph.kt rename to core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/HomeNavHost.kt index 886168a..0c33eb7 100644 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/OnBoardingNavGraph.kt +++ b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/HomeNavHost.kt @@ -15,36 +15,34 @@ * limitations under the License. * */ -package com.mobiledevpro.navigation.graph +package com.mobiledevpro.navigation.host import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import com.mobiledevpro.navigation.Screen -import com.mobiledevpro.navigation.onBoardingFirstScreen -import com.mobiledevpro.navigation.onBoardingSecondScreen -import com.mobiledevpro.navigation.onBoardingThirdScreen +import com.mobiledevpro.navigation.graph.imageViewerNavGraph /** - * Nested navigation graph for OnBoarding screen + * Nested navigation graph for Home screen * * Created on Jan 24, 2023. * */ @Composable -fun OnBoardingNavGraph( +fun HomeNavHost( modifier: Modifier = Modifier, - navController: NavHostController + navController: NavHostController, + onNavigateToRoot: (Screen) -> Unit ) { NavHost( navController = navController, - startDestination = Screen.OnBoardingFirst.route, + startDestination = Screen.ImageViewer.route, modifier = modifier, ) { - onBoardingFirstScreen() - onBoardingSecondScreen() - onBoardingThirdScreen() + imageViewerNavGraph() + } } \ No newline at end of file diff --git a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/RootNavGraph.kt b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/RootNavHost.kt similarity index 79% rename from core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/RootNavGraph.kt rename to core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/RootNavHost.kt index d08b18a..2ffb098 100644 --- a/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/graph/RootNavGraph.kt +++ b/core/navigation/src/main/kotlin/com/mobiledevpro/navigation/host/RootNavHost.kt @@ -15,7 +15,7 @@ * limitations under the License. * */ -package com.mobiledevpro.navigation.graph +package com.mobiledevpro.navigation.host import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -23,9 +23,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import com.mobiledevpro.navigation.Screen import com.mobiledevpro.navigation.ext.navigateTo -import com.mobiledevpro.navigation.homeNavGraph -import com.mobiledevpro.navigation.onBoardingNavGraph -import com.mobiledevpro.navigation.subscriptionScreen +import com.mobiledevpro.navigation.graph.homeNavGraph /** * Top-level navigation host in the app @@ -35,7 +33,7 @@ import com.mobiledevpro.navigation.subscriptionScreen */ @Composable -fun RootNavGraph( +fun RootNavHost( navController: NavHostController, modifier: Modifier = Modifier, startDestination: Screen @@ -52,10 +50,6 @@ fun RootNavGraph( } //Nested Navigation Graphs - onBoardingNavGraph(onNavigateToRoot = navController::navigateTo) homeNavGraph(onNavigateToRoot = navController::navigateTo) - - //Root screens - subscriptionScreen(onNavigateBack = navigateBack) } } \ No newline at end of file diff --git a/feature/chat_list/.gitignore b/feature/chat_list/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/chat_list/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/chat_list/consumer-rules.pro b/feature/chat_list/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/chat_list/proguard-rules.pro b/feature/chat_list/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/chat_list/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/chat_list/src/main/AndroidManifest.xml b/feature/chat_list/src/main/AndroidManifest.xml deleted file mode 100644 index 1d26c87..0000000 --- a/feature/chat_list/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/domain/usecase/GetChatListUseCase.kt b/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/domain/usecase/GetChatListUseCase.kt deleted file mode 100644 index 72af1d6..0000000 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/domain/usecase/GetChatListUseCase.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.chatlist.domain.usecase - -import com.mobiledevpro.coroutines.BaseCoroutinesFLowUseCase -import com.mobiledevpro.coroutines.None -import com.mobiledevpro.domain.model.Chat -import com.mobiledevpro.domain.model.fakeChatList -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf - - -class GetChatListUseCase( - -) : BaseCoroutinesFLowUseCase, None>(Dispatchers.IO) { - - override fun buildUseCaseFlow(params: None?): Flow> = - flowOf(fakeChatList) - -} \ No newline at end of file diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListScreen.kt b/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListScreen.kt deleted file mode 100644 index 04f6af4..0000000 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListScreen.kt +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.chatlist.view - -import android.widget.Toast -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.mobiledevpro.chatlist.view.component.ChatCard -import com.mobiledevpro.domain.model.Chat -import com.mobiledevpro.domain.model.fakeChatList -import com.mobiledevpro.ui.component.ScreenBackground -import com.mobiledevpro.ui.ext.dp -import com.mobiledevpro.ui.ext.statusBarHeight -import com.mobiledevpro.ui.theme.AppTheme -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow - - -@Composable -fun ChatListScreen( - state: StateFlow, - onClick: (Chat) -> Unit -) { - - val uiState by state.collectAsStateWithLifecycle() - val context = LocalContext.current - - ScreenBackground( - modifier = Modifier - .fillMaxSize() - ) { - - when (uiState) { - is ChatListUIState.Loading -> Loading() - is ChatListUIState.Empty -> NoChatFound() - is ChatListUIState.Success -> - ChatList( - chatList = (uiState as ChatListUIState.Success).profileList, - onClick = onClick - ) - - is ChatListUIState.Fail -> { - NoChatFound() - LaunchedEffect(Unit) { - Toast.makeText( - context, - (uiState as ChatListUIState.Fail).throwable.localizedMessage, - Toast.LENGTH_LONG - ).show() - } - } - - } - - - } -} - -@Composable -private fun ChatList(chatList: List, onClick: (Chat) -> Unit) { - - //Cause content is drawn edge-to-edge, let's set the top-padding for the first element in the list - val statusBarHeight: Dp = WindowInsets.statusBarHeight().dp() - - LazyColumn { - itemsIndexed(chatList) { index, chat -> - ChatCard( - modifier = Modifier.then( - if (index == 0) - Modifier.padding(top = statusBarHeight) - else - Modifier - ), - chat = chat, - onClick = { onClick(chat) } - ) - } - } -} - -@Composable -private fun NoChatFound() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - Text( - text = "No chat found", - modifier = Modifier - .padding(16.dp) - .align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Composable -private fun Loading() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - Text( - text = "Loading...", modifier = Modifier - .padding(16.dp) - .align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Composable -@Preview -fun ChatListScreenPreview() { - AppTheme { - ChatListScreen( - state = MutableStateFlow(ChatListUIState.Success(fakeChatList)), - onClick = {} - ) - } -} \ No newline at end of file diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListUIState.kt b/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListUIState.kt deleted file mode 100644 index a94f7bd..0000000 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListUIState.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.chatlist.view - -import com.mobiledevpro.domain.model.Chat -import com.mobiledevpro.ui.state.UIState - -/** - * UI state for [com.mobiledevpro.chatlist.view.ChatListScreen] - * - * Created on Feb 04, 2023. - * - */ -sealed interface ChatListUIState : UIState { - - data object Empty : ChatListUIState - - data object Loading : ChatListUIState - - class Success(val profileList : List) : ChatListUIState - - class Fail(val throwable: Throwable) : ChatListUIState -} \ No newline at end of file diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListViewModel.kt b/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListViewModel.kt deleted file mode 100644 index a73c80c..0000000 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/ChatListViewModel.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.chatlist.view - -import android.util.Log -import androidx.lifecycle.viewModelScope -import com.mobiledevpro.chatlist.domain.usecase.GetChatListUseCase -import com.mobiledevpro.ui.vm.BaseViewModel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach - - -class ChatListViewModel( - private val getChatListUseCase: GetChatListUseCase -) : BaseViewModel() { - - override fun initUIState(): ChatListUIState = ChatListUIState.Empty - - init { - Log.d("UI", "ChatListViewModel init") - observeChatList() - } - - private fun observeChatList() { - getChatListUseCase.execute() - .onEach { result -> - result.onSuccess { list -> - ChatListUIState.Success(list) - .also { _uiState.value = it } - }.onFailure { - //TODO: show an error - } - }.launchIn(viewModelScope) - } -} \ No newline at end of file diff --git a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/component/ChatCard.kt b/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/component/ChatCard.kt deleted file mode 100644 index 0c50af9..0000000 --- a/feature/chat_list/src/main/kotlin/com/mobiledevpro/chatlist/view/component/ChatCard.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.chatlist.view.component - -import android.net.Uri -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Badge -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.mobiledevpro.domain.model.Chat -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.domain.model.fakePeopleProfileList -import com.mobiledevpro.domain.model.fakeUser -import com.mobiledevpro.domain.model.name -import com.mobiledevpro.ui.component.CardItem -import com.mobiledevpro.ui.component.ProfilePicture -import com.mobiledevpro.ui.component.ProfilePictureSize -import com.mobiledevpro.ui.theme.AppTheme - -/** - * Fo chat list screen - * - * Created on May 06, 2023. - * - */ -@OptIn(ExperimentalMaterial3Api::class) -@Composable -internal fun ChatCard( - modifier: Modifier = Modifier, - chat: Chat, - onClick: () -> Unit -) { - - CardItem( - modifier = modifier - .clickable { onClick.invoke() } - ) { - - Box { - Row( - modifier = Modifier - .padding(horizontal = 16.dp, vertical = 24.dp) - .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - - ChatPicture( - profileList = chat.peopleList - ) - - Text( - text = chat.name(), - style = MaterialTheme.typography.bodyMedium, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - modifier = Modifier - .padding(horizontal = 8.dp) - ) - - } - - if (chat.unreadMsgCount > 0) - Badge( - containerColor = MaterialTheme.colorScheme.tertiary, - modifier = Modifier - .align(Alignment.BottomEnd) - .padding(8.dp) - ) { - Text( - text = if (chat.unreadMsgCount > 99) "99+" else chat.unreadMsgCount.toString(), - style = MaterialTheme.typography.labelSmall - ) - } - } - - } -} - -@Composable -fun ChatPicture(profileList: List, modifier: Modifier = Modifier) { - - Row(verticalAlignment = Alignment.CenterVertically) { - Box(modifier = modifier) { - profileList.take(VISIBLE_PROFILES_COUNT).forEachIndexed { index, profile -> - - ProfilePicture( - profile.photo ?: Uri.EMPTY, - profile.status, - size = ProfilePictureSize.SMALL, - modifier = Modifier.padding(start = 16.dp * index) - ) - - } - } - if (profileList.size > VISIBLE_PROFILES_COUNT) - Text( - text = "+${profileList.size - 3}", - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding(4.dp) - ) - } -} - -@Composable -@Preview -fun ChatCardPreview() { - val peopleList = fakePeopleProfileList.take(2).sortedByDescending { !it.status } - val chat = Chat(fakeUser, peopleList) - AppTheme { - ChatCard( - chat = chat, - onClick = {}) - } -} - -const val VISIBLE_PROFILES_COUNT = 3 \ No newline at end of file diff --git a/feature/home/src/main/kotlin/com/mobiledevpro/home/view/HomeScreen.kt b/feature/home/src/main/kotlin/com/mobiledevpro/home/view/HomeScreen.kt index 022b94f..bfb7cb4 100644 --- a/feature/home/src/main/kotlin/com/mobiledevpro/home/view/HomeScreen.kt +++ b/feature/home/src/main/kotlin/com/mobiledevpro/home/view/HomeScreen.kt @@ -27,12 +27,10 @@ import com.mobiledevpro.ui.component.ScreenBackground @Composable fun HomeScreen( - nestedNavGraph: @Composable () -> Unit, - bottomBar: @Composable () -> Unit + nestedNavGraph: @Composable () -> Unit ) { Scaffold( - bottomBar = bottomBar, contentWindowInsets = WindowInsets(left = 0, top = 0, right = 0, bottom = 0) ) { paddingValues -> ScreenBackground( diff --git a/core/domain/.gitignore b/feature/image_viewer/.gitignore similarity index 100% rename from core/domain/.gitignore rename to feature/image_viewer/.gitignore diff --git a/feature/chat_list/build.gradle.kts b/feature/image_viewer/build.gradle.kts similarity index 100% rename from feature/chat_list/build.gradle.kts rename to feature/image_viewer/build.gradle.kts diff --git a/core/domain/consumer-rules.pro b/feature/image_viewer/consumer-rules.pro similarity index 100% rename from core/domain/consumer-rules.pro rename to feature/image_viewer/consumer-rules.pro diff --git a/core/domain/proguard-rules.pro b/feature/image_viewer/proguard-rules.pro similarity index 100% rename from core/domain/proguard-rules.pro rename to feature/image_viewer/proguard-rules.pro diff --git a/feature/image_viewer/src/main/AndroidManifest.xml b/feature/image_viewer/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5918e6 --- /dev/null +++ b/feature/image_viewer/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/state/UserProfileUIState.kt b/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt similarity index 57% rename from feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/state/UserProfileUIState.kt rename to feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt index 5b1a1b2..2c3a836 100644 --- a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/state/UserProfileUIState.kt +++ b/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt @@ -15,22 +15,27 @@ * limitations under the License. * */ -package com.mobiledevpro.user.profile.view.state +package com.mobiledevpro.image.viewer.view -import com.mobiledevpro.domain.model.UserProfile -import com.mobiledevpro.ui.state.UIState +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.w3c.dom.Text /** - * UI state for [com.mobiledevpro.user.profile.view.ProfileScreen] + * Demo screen for zoomable image * - * Created on May 09, 2023. + * Created on Feb 18, 2024. * */ -sealed interface UserProfileUIState : UIState { - object Empty : UserProfileUIState +@Composable +fun ImageViewerScreen() { - class Success(val userProfile: UserProfile) : UserProfileUIState + Box(modifier = Modifier.fillMaxSize()) { + Text(text = "Image Viewer") + } - class Fail(val throwable: Throwable) : UserProfileUIState -} \ No newline at end of file +} diff --git a/feature/onboarding/.gitignore b/feature/onboarding/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/onboarding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts deleted file mode 100644 index 988f39f..0000000 --- a/feature/onboarding/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("feature-module") -} diff --git a/feature/onboarding/consumer-rules.pro b/feature/onboarding/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/onboarding/proguard-rules.pro b/feature/onboarding/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/onboarding/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/onboarding/src/main/AndroidManifest.xml b/feature/onboarding/src/main/AndroidManifest.xml deleted file mode 100644 index 568741e..0000000 --- a/feature/onboarding/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingFirstScreen.kt b/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingFirstScreen.kt deleted file mode 100644 index a9d3313..0000000 --- a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingFirstScreen.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.onboarding.view - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.mobiledevpro.ui.theme.AppTheme - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun OnBoardingFirstScreen() { - Box( - modifier = Modifier - .fillMaxSize() - .background(color = Color(0x80FFCC99)) - ) { - Text( - text = "1st OnBoarding", - textAlign = TextAlign.Center, - modifier = Modifier - .padding(16.dp) - .align(Alignment.Center) - .fillMaxWidth(), - style = MaterialTheme.typography.bodyLarge - - ) - } -} - -@Preview -@Composable -fun OnBoardingFirstPreview() { - AppTheme { - OnBoardingFirstScreen() - } -} \ No newline at end of file diff --git a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingScreen.kt b/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingScreen.kt deleted file mode 100644 index eb9b5c2..0000000 --- a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingScreen.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.onboarding.view - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.mobiledevpro.ui.component.ScreenBackground - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun OnBoardingScreen( - nestedNavGraph: @Composable () -> Unit, - onNext: () -> Unit -) { - Scaffold { paddingValues -> - ScreenBackground( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - ) { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - - nestedNavGraph.invoke() - - Button( - onClick = onNext, - modifier = Modifier - .align(Alignment.BottomCenter) - .defaultMinSize(minWidth = 144.dp, minHeight = 48.dp) - - ) { - Text(text = "Next") - } - - } - } - } - - -} \ No newline at end of file diff --git a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingSecondScreen.kt b/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingSecondScreen.kt deleted file mode 100644 index ae8ac3f..0000000 --- a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingSecondScreen.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.onboarding.view - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.mobiledevpro.ui.theme.AppTheme - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun OnBoardingSecondScreen() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - .background(color = Color(0x80FFFF99)) - ) { - Text( - text = "2nd OnBoarding", - textAlign = TextAlign.Center, - modifier = Modifier - .padding(16.dp) - .align(Alignment.Center) - .fillMaxWidth(), - style = MaterialTheme.typography.bodyLarge - - ) - } -} - -@Preview -@Composable -fun OnBoardingSecondPreview() { - AppTheme { - OnBoardingSecondScreen() - } -} \ No newline at end of file diff --git a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingThirdScreen.kt b/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingThirdScreen.kt deleted file mode 100644 index 25bca61..0000000 --- a/feature/onboarding/src/main/kotlin/com/mobiledevpro/onboarding/view/OnBoardingThirdScreen.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.onboarding.view - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.mobiledevpro.ui.theme.AppTheme - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun OnBoardingThirdScreen() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - .background(color = Color(0x80FF9999)) - ) { - Text( - text = "3rd OnBoarding", - textAlign = TextAlign.Center, - modifier = Modifier - .padding(16.dp) - .align(Alignment.Center) - .fillMaxWidth(), - style = MaterialTheme.typography.bodyLarge - - ) - } -} - -@Preview -@Composable -fun OnBoardingThirdPreview() { - AppTheme { - OnBoardingThirdScreen() - } -} \ No newline at end of file diff --git a/feature/people/.gitignore b/feature/people/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/people/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/people/build.gradle.kts b/feature/people/build.gradle.kts deleted file mode 100644 index 276865a..0000000 --- a/feature/people/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - id("feature-module") -} - -dependencies { - api(projects.feature.peopleList.dependencyProject) - api(projects.feature.peopleProfile.dependencyProject) -} \ No newline at end of file diff --git a/feature/people/consumer-rules.pro b/feature/people/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/people/proguard-rules.pro b/feature/people/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/people/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/people/src/main/AndroidManifest.xml b/feature/people/src/main/AndroidManifest.xml deleted file mode 100644 index 1d26c87..0000000 --- a/feature/people/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/people/src/main/kotlin/com/mobiledevpro/people/view/PeopleScreen.kt b/feature/people/src/main/kotlin/com/mobiledevpro/people/view/PeopleScreen.kt deleted file mode 100644 index 109c7cd..0000000 --- a/feature/people/src/main/kotlin/com/mobiledevpro/people/view/PeopleScreen.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.people.view - -import android.util.Log -import androidx.compose.runtime.Composable - -/** - * Host for People list and People profile - * - * Created on Feb 04, 2023. - * - */ -@Composable -fun PeopleScreen( - nestedNavGraph: @Composable () -> Unit -) { - - Log.d("navigation", "PeopleScreen: ") - - nestedNavGraph.invoke() -} \ No newline at end of file diff --git a/feature/people_list/.gitignore b/feature/people_list/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/people_list/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/people_list/build.gradle.kts b/feature/people_list/build.gradle.kts deleted file mode 100644 index 8bc006b..0000000 --- a/feature/people_list/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -plugins { - id("feature-module") - id("testing-module") -} diff --git a/feature/people_list/consumer-rules.pro b/feature/people_list/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/people_list/proguard-rules.pro b/feature/people_list/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/people_list/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/people_list/src/main/AndroidManifest.xml b/feature/people_list/src/main/AndroidManifest.xml deleted file mode 100644 index 568741e..0000000 --- a/feature/people_list/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/di/Module.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/di/Module.kt deleted file mode 100644 index ce47a2c..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/di/Module.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.di - -import com.mobiledevpro.peoplelist.domain.usecase.GetPeopleListUseCase -import com.mobiledevpro.peoplelist.view.PeopleListViewModel -import org.koin.androidx.viewmodel.dsl.viewModelOf -import org.koin.core.module.dsl.scopedOf -import org.koin.dsl.module - -/** - * User Profile screen module - * - * Created on Jul 22, 2023. - * - */ - -val featurePeopleListModule = module { - - scope { - viewModelOf(::PeopleListViewModel) - scopedOf(::GetPeopleListUseCase) - } -} \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/domain/usecase/GetPeopleListUseCase.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/domain/usecase/GetPeopleListUseCase.kt deleted file mode 100644 index ef46f05..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/domain/usecase/GetPeopleListUseCase.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.domain.usecase - -import com.mobiledevpro.coroutines.BaseCoroutinesFLowUseCase -import com.mobiledevpro.coroutines.None -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.domain.model.fakePeopleProfileList -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf - - -class GetPeopleListUseCase( - -) : BaseCoroutinesFLowUseCase, None>(Dispatchers.IO) { - - override fun buildUseCaseFlow(params: None?): Flow> = - flowOf(fakePeopleProfileList) -} \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListScreen.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListScreen.kt deleted file mode 100644 index 5744d4e..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListScreen.kt +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.view - -import android.widget.Toast -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.peoplelist.view.component.ProfileCard -import com.mobiledevpro.ui.component.ScreenBackground -import com.mobiledevpro.ui.ext.dp -import com.mobiledevpro.ui.ext.statusBarHeight -import com.mobiledevpro.ui.theme.AppTheme -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow - - -@Composable -fun PeopleListScreen( - stateFlow: StateFlow, - onNavigateToProfile: (profileId: Int) -> Unit -) { - - val uiState by stateFlow.collectAsStateWithLifecycle() - val context = LocalContext.current - - ScreenBackground( - modifier = Modifier - .fillMaxSize() - ) { - - when (uiState) { - is PeopleProfileUIState.Loading -> Loading() - is PeopleProfileUIState.Empty -> NoPeopleFound() - is PeopleProfileUIState.Success -> - PeopleList( - list = (uiState as PeopleProfileUIState.Success).profileList, - onProfileClick = onNavigateToProfile - ) - - is PeopleProfileUIState.Fail -> { - NoPeopleFound() - LaunchedEffect(Unit) { - Toast.makeText( - context, - (uiState as PeopleProfileUIState.Fail).throwable.localizedMessage, - Toast.LENGTH_LONG - ).show() - } - } - - } - - } -} - -@Composable -private fun NoPeopleFound() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - Text( - text = "No people found", - modifier = Modifier - .padding(16.dp) - .align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Composable -private fun Loading() { - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - Text( - text = "Loading...", modifier = Modifier - .padding(16.dp) - .align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Composable -private fun PeopleList(list: List, onProfileClick: (profileId: Int) -> Unit) { - - //Cause content is drawn edge-to-edge, let's set the top-padding for the first element in the list - val statusBarHeight: Dp = WindowInsets.statusBarHeight().dp() - - LazyColumn { - itemsIndexed( - items = list, - key = { _, item -> item.listKey() } - ) { index, profile -> - ProfileCard( - modifier = Modifier.then( - if (index == 0) - Modifier.padding(top = statusBarHeight) - else - Modifier - ), - - - item = profile, - onClick = { onProfileClick(profile.id) }) - } - } -} - - -@Preview -@Composable -fun PeopleListPreview() { - AppTheme { - PeopleListScreen( - stateFlow = MutableStateFlow(PeopleProfileUIState.Empty), - onNavigateToProfile = { } - ) - } -} \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListViewModel.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListViewModel.kt deleted file mode 100644 index 448c33a..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleListViewModel.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.view - -import androidx.lifecycle.viewModelScope -import com.mobiledevpro.peoplelist.domain.usecase.GetPeopleListUseCase -import com.mobiledevpro.ui.vm.BaseViewModel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach - - -class PeopleListViewModel( - private val getPeopleListUseCase: GetPeopleListUseCase -) : BaseViewModel() { - - override fun initUIState(): PeopleProfileUIState = PeopleProfileUIState.Loading - - init { - observePeopleList() - } - - private fun observePeopleList() { - - getPeopleListUseCase.execute() - .onEach { result -> - result.onSuccess { list -> - PeopleProfileUIState.Success(list) - .also { _uiState.value = it } - }.onFailure { - //TODO: show error - } - }.launchIn(viewModelScope) - } - -} \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleProfileUIState.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleProfileUIState.kt deleted file mode 100644 index 3011ebb..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/PeopleProfileUIState.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.view - -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.ui.state.UIState - -/** - * UI state for [com.mobiledevpro.peoplelist.view.PeopleListScreen] - * - * Created on Feb 04, 2023. - * - */ -sealed interface PeopleProfileUIState : UIState { - - object Empty : PeopleProfileUIState - - object Loading : PeopleProfileUIState - - class Success(val profileList : List) : PeopleProfileUIState - - class Fail(val throwable: Throwable) : PeopleProfileUIState -} \ No newline at end of file diff --git a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/component/ProfileCard.kt b/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/component/ProfileCard.kt deleted file mode 100644 index a7cdfb3..0000000 --- a/feature/people_list/src/main/kotlin/com/mobiledevpro/peoplelist/view/component/ProfileCard.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist.view.component - -import android.net.Uri -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.ui.component.CardItem -import com.mobiledevpro.ui.component.ProfileContent -import com.mobiledevpro.ui.component.ProfilePicture -import com.mobiledevpro.ui.component.ProfilePictureSize - -/** - * For People list - * - * Created on Feb 05, 2023. - * - */ -@Composable -internal fun ProfileCard(modifier: Modifier = Modifier, item: PeopleProfile, onClick: () -> Unit) { - CardItem( - modifier = modifier - .clickable { onClick.invoke() } - ) { - - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Start - ) { - ProfilePicture( - item.photo ?: Uri.EMPTY, - item.status, - size = ProfilePictureSize.MEDIUM, - modifier = Modifier.padding(16.dp) - ) - ProfileContent( - userName = item.name, - subName = null, - isOnline = item.status, - alignment = Alignment.Start, - modifier = Modifier.padding(8.dp) - ) - } - } -} \ No newline at end of file diff --git a/feature/people_list/src/test/kotlin/com/mobiledevpro/peoplelist/PeopleListViewModelTest.kt b/feature/people_list/src/test/kotlin/com/mobiledevpro/peoplelist/PeopleListViewModelTest.kt deleted file mode 100644 index 4a48f2d..0000000 --- a/feature/people_list/src/test/kotlin/com/mobiledevpro/peoplelist/PeopleListViewModelTest.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.peoplelist - -import app.cash.turbine.test -import com.mobiledevpro.peoplelist.domain.usecase.GetPeopleListUseCase -import com.mobiledevpro.peoplelist.view.PeopleListViewModel -import com.mobiledevpro.peoplelist.view.PeopleProfileUIState -import com.mobiledevpro.ui.state.UIState -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain -import org.junit.After -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test - - -class PeopleListViewModelTest { - - private lateinit var vm: PeopleListViewModel - - @OptIn(ExperimentalCoroutinesApi::class) - @Before - fun setUp() { - Dispatchers.setMain(StandardTestDispatcher()) - - val useCase = GetPeopleListUseCase() - vm = PeopleListViewModel(getPeopleListUseCase = useCase) - assertTrue( - "Initial state is incorrect: ${vm.uiState.value}", - (vm.uiState.value as UIState) == PeopleProfileUIState.Loading - ) - } - - @Test - fun stateTest() = runTest { - - vm.uiState.test { - // assertEquals("State is not Loading", PeopleProfileUIState.Loading, awaitItem()) - - assertTrue( - "People list is empty", - (awaitItem() as PeopleProfileUIState.Success).profileList.isNotEmpty() - ) - } - } - - @After - fun finish() = Dispatchers.resetMain() -} \ No newline at end of file diff --git a/feature/people_profile/.gitignore b/feature/people_profile/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/people_profile/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/people_profile/build.gradle.kts b/feature/people_profile/build.gradle.kts deleted file mode 100644 index d5d59fc..0000000 --- a/feature/people_profile/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("feature-module") -} \ No newline at end of file diff --git a/feature/people_profile/consumer-rules.pro b/feature/people_profile/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/people_profile/proguard-rules.pro b/feature/people_profile/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/people_profile/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/people_profile/src/main/AndroidManifest.xml b/feature/people_profile/src/main/AndroidManifest.xml deleted file mode 100644 index 568741e..0000000 --- a/feature/people_profile/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileScreen.kt b/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileScreen.kt deleted file mode 100644 index e977860..0000000 --- a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileScreen.kt +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.people.profile.view - -import android.net.Uri -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.surfaceColorAtElevation -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.boundsInParent -import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.IntOffset -import androidx.compose.ui.unit.dp -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.domain.model.fakePeopleProfileList -import com.mobiledevpro.people.profile.R -import com.mobiledevpro.ui.component.ProfileContent -import com.mobiledevpro.ui.component.ProfilePicture -import com.mobiledevpro.ui.component.ProfilePictureSize -import com.mobiledevpro.ui.component.ScreenBackground -import com.mobiledevpro.ui.theme.AppTheme -import com.mobiledevpro.ui.R as RApp - -/** - * Profile screen for selected person from People list - * - * Created on Feb 03, 2023. - * - */ - -@Composable -fun PeopleProfileScreen( - profile: PeopleProfile, - onBackPressed: () -> Unit, - onOpenChatWith: (profile: PeopleProfile) -> Unit -) { - - val backgroundBoxTopOffset = remember { mutableIntStateOf(0) } - - ScreenBackground( - modifier = Modifier - .fillMaxSize() - .statusBarsPadding() - ) { - - //Background with rounded top-corners - Box( - modifier = Modifier - .offset { IntOffset(0, backgroundBoxTopOffset.value) } - .clip(RoundedCornerShape(topStart = 48.dp, topEnd = 48.dp)) - .background(color = MaterialTheme.colorScheme.surfaceColorAtElevation(4.dp)) - ) - - Column( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Top - ) { - IconButton( - onClick = { onBackPressed() }, - modifier = Modifier.padding(16.dp) - ) { - Icon( - painter = painterResource(id = RApp.drawable.ic_arrow_back_white_24dp), - contentDescription = "" - ) - } - - ProfilePicture( - photoUri = profile.photo ?: Uri.EMPTY, - onlineStatus = profile.status, - size = ProfilePictureSize.LARGE, - modifier = Modifier - .padding(paddingValues = PaddingValues(16.dp, 16.dp, 16.dp, 16.dp)) - .align(Alignment.CenterHorizontally) - .onGloballyPositioned { - val rect = it.boundsInParent() - backgroundBoxTopOffset.value = - rect.topCenter.y.toInt() + (rect.bottomCenter.y - rect.topCenter.y).toInt() / 2 - } - ) - - ProfileContent( - userName = profile.name, - isOnline = profile.status, - alignment = Alignment.CenterHorizontally, - modifier = Modifier - .padding(8.dp) - .align(Alignment.CenterHorizontally) - ) - - ProfileSocialIcons(modifier = Modifier.align(Alignment.CenterHorizontally)) - - Row( - modifier = Modifier - .fillMaxHeight() - .align(Alignment.CenterHorizontally), - verticalAlignment = Alignment.Bottom - ) { - Button( - onClick = { - profile.also(onOpenChatWith) - }, - modifier = Modifier - .padding(bottom = 48.dp, top = 16.dp, start = 16.dp, end = 16.dp) - .defaultMinSize(minHeight = 48.dp, minWidth = 144.dp), - colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.tertiary), - ) { - Text(text = "Say Hi \uD83D\uDC4B") - } - } - } - - } -} - -@Composable -fun ProfileSocialIcons(modifier: Modifier) { - Row( - modifier = modifier - ) { - IconButton( - onClick = { - - } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_instagram_white_48dp), - contentDescription = "", - modifier = Modifier.padding(4.dp), - ) - } - - IconButton( - onClick = { - - } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_linkedin_white_48dp), - contentDescription = "", - modifier = Modifier.padding(4.dp) - ) - } - - IconButton( - onClick = { - - } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_youtube_white_48dp), - contentDescription = "", - modifier = Modifier.padding(4.dp) - ) - } - - IconButton( - onClick = { - - } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_twitter_white_48dp), - contentDescription = "", - modifier = Modifier.padding(4.dp) - ) - } - } -} - - -@Preview -@Composable -fun PeopleProfilePreview() { - AppTheme(darkTheme = true) { - fakePeopleProfileList.find { it.id == 2 }?.let { - PeopleProfileScreen( - it, - onBackPressed = {}, - onOpenChatWith = {} - ) - } - } -} \ No newline at end of file diff --git a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileViewModel.kt b/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileViewModel.kt deleted file mode 100644 index dbbcf06..0000000 --- a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/PeopleProfileViewModel.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.people.profile.view - -import android.util.Log -import androidx.lifecycle.SavedStateHandle -import androidx.lifecycle.ViewModel -import com.mobiledevpro.domain.model.PeopleProfile -import com.mobiledevpro.domain.model.fakePeopleProfileList -import com.mobiledevpro.people.profile.view.args.PeopleProfileArgs - -/** - * Profile screen for selected person from People list - * - * Created on Feb 04, 2023. - * - */ -class PeopleProfileViewModel( - savedStateHandle: SavedStateHandle -) : ViewModel() { - - private val profileId : Int = PeopleProfileArgs(savedStateHandle).peopleProfileId - - - - init { - Log.d("navigation", "PeopleProfileViewModel: args = $profileId") - } - - fun getProfile() : PeopleProfile? = fakePeopleProfileList.find { it.id == profileId } -} \ No newline at end of file diff --git a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/args/PeopleProfileArgs.kt b/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/args/PeopleProfileArgs.kt deleted file mode 100644 index 74068b8..0000000 --- a/feature/people_profile/src/main/kotlin/com/mobiledevpro/people/profile/view/args/PeopleProfileArgs.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.people.profile.view.args - -import androidx.lifecycle.SavedStateHandle - -/** - * - * Created on Feb 04, 2023. - * - */ -class PeopleProfileArgs(val peopleProfileId: Int) { - constructor(savedStateHandle: SavedStateHandle) : - this(checkNotNull(savedStateHandle[PEOPLE_PROFILE_ID_ARG]) as Int) - - companion object { - const val PEOPLE_PROFILE_ID_ARG = "peopleProfileId" - } -} \ No newline at end of file diff --git a/feature/people_profile/src/main/res/drawable/ic_instagram_white_48dp.xml b/feature/people_profile/src/main/res/drawable/ic_instagram_white_48dp.xml deleted file mode 100644 index 9c6addd..0000000 --- a/feature/people_profile/src/main/res/drawable/ic_instagram_white_48dp.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/feature/people_profile/src/main/res/drawable/ic_linkedin_white_48dp.xml b/feature/people_profile/src/main/res/drawable/ic_linkedin_white_48dp.xml deleted file mode 100644 index c3c09cf..0000000 --- a/feature/people_profile/src/main/res/drawable/ic_linkedin_white_48dp.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/feature/people_profile/src/main/res/drawable/ic_twitter_white_48dp.xml b/feature/people_profile/src/main/res/drawable/ic_twitter_white_48dp.xml deleted file mode 100644 index 80fd439..0000000 --- a/feature/people_profile/src/main/res/drawable/ic_twitter_white_48dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/feature/people_profile/src/main/res/drawable/ic_youtube_white_48dp.xml b/feature/people_profile/src/main/res/drawable/ic_youtube_white_48dp.xml deleted file mode 100644 index b4e7a9c..0000000 --- a/feature/people_profile/src/main/res/drawable/ic_youtube_white_48dp.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/feature/subscription/.gitignore b/feature/subscription/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/subscription/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/subscription/build.gradle.kts b/feature/subscription/build.gradle.kts deleted file mode 100644 index d5d59fc..0000000 --- a/feature/subscription/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("feature-module") -} \ No newline at end of file diff --git a/feature/subscription/consumer-rules.pro b/feature/subscription/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/subscription/proguard-rules.pro b/feature/subscription/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/subscription/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/subscription/src/main/AndroidManifest.xml b/feature/subscription/src/main/AndroidManifest.xml deleted file mode 100644 index 568741e..0000000 --- a/feature/subscription/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/subscription/src/main/kotlin/com/mobiledevpro/subscription/SubscriptionScreen.kt b/feature/subscription/src/main/kotlin/com/mobiledevpro/subscription/SubscriptionScreen.kt deleted file mode 100644 index 1838323..0000000 --- a/feature/subscription/src/main/kotlin/com/mobiledevpro/subscription/SubscriptionScreen.kt +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.subscription - -import android.widget.Toast -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.material3.Button -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.mobiledevpro.ui.component.ScreenBackground -import com.mobiledevpro.ui.theme.AppTheme - -@Composable -fun SubscriptionScreen(onNavigateBack: () -> Unit) { - val context = LocalContext.current - - val showToast: (message: String) -> Unit = { message -> - Toast.makeText(context, message, Toast.LENGTH_SHORT).show() - } - - Scaffold( - contentWindowInsets = WindowInsets.systemBars - ) { paddingValues -> - ScreenBackground( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - ) { - - Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { - - Text( - text = "Be like a Pro", - style = MaterialTheme.typography.titleLarge, - modifier = Modifier - .align(Alignment.TopCenter) - .padding(16.dp) - ) - - Column( - modifier = Modifier - .fillMaxWidth() - .align(Alignment.Center), - verticalArrangement = Arrangement.Center - ) { - Text( - text = "Subscribe on", - textAlign = TextAlign.Center, - modifier = Modifier - .padding(16.dp) - .align(Alignment.CenterHorizontally) - .fillMaxWidth(), - style = MaterialTheme.typography.bodyLarge - - ) - - SubsButton( - text = "1 Month - 0.9\$", - modifier = Modifier.align(Alignment.CenterHorizontally) - ) { - showToast("Subscribing to 1 month...") - onNavigateBack() - } - - SubsButton( - text = "6 Months - 3.99\$", - modifier = Modifier.align(Alignment.CenterHorizontally) - ) { - showToast("Subscribing to 6 months...") - onNavigateBack() - } - - SubsButton( - text = "1 Year - 6.99\$", - modifier = Modifier.align(Alignment.CenterHorizontally) - ) { - showToast("Subscribing to 1 year...") - onNavigateBack() - } - - } - } - - /* - - Column( - modifier = Modifier - .padding(16.dp) - .verticalScroll(rememberScrollState()) - .height(IntrinsicSize.Max) - ) { - - Header() - - //If you remove Items, Footer will be centered at the screen as you could see on attached screenshots - Item(text = "Item 1") - Item(text = "Item 2") - Item(text = "Item 3") - - Box( - modifier = Modifier - .fillMaxSize() - //.background(color = Color.Blue) - ) { - Footer(modifier = Modifier.align(Alignment.Center)) - } - } - - */ - - } - } - - -} -/* -@Composable -fun Header() { - Box( - modifier = Modifier - .fillMaxWidth() - .height(100.dp) - .background(color = Color.Yellow) - ) -} - -@Composable -fun Item(text: String) { - Box( - modifier = Modifier - .padding(vertical = 8.dp) - .fillMaxWidth() - .height(50.dp) - .background(color = Color.White) - - ) { - Text( - text = text, - modifier = Modifier.align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Composable -fun Footer(modifier: Modifier) { - Box( - modifier = modifier - .padding(vertical = 8.dp) - .fillMaxWidth() - .height(100.dp) - .background(color = Color.Gray) - - ) { - Text( - text = "Optional block", - modifier = Modifier.align(Alignment.Center), - style = MaterialTheme.typography.bodyLarge - ) - } -} - - */ - -@Composable -fun SubsButton( - text: String, - modifier: Modifier, - onClick: () -> Unit -) { - Button( - onClick = onClick, - modifier = modifier - .padding(8.dp) - .defaultMinSize(minWidth = 192.dp, minHeight = 48.dp) - - - ) { - Text(text = text) - } -} - -@Preview -@Composable -fun SubscriptionScreenPreview() { - AppTheme { - SubscriptionScreen {} - } -} \ No newline at end of file diff --git a/feature/user_profile/.gitignore b/feature/user_profile/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/feature/user_profile/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/user_profile/build.gradle.kts b/feature/user_profile/build.gradle.kts deleted file mode 100644 index d5d59fc..0000000 --- a/feature/user_profile/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("feature-module") -} \ No newline at end of file diff --git a/feature/user_profile/consumer-rules.pro b/feature/user_profile/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/feature/user_profile/proguard-rules.pro b/feature/user_profile/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/feature/user_profile/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/user_profile/src/main/AndroidManifest.xml b/feature/user_profile/src/main/AndroidManifest.xml deleted file mode 100644 index 568741e..0000000 --- a/feature/user_profile/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/di/Module.kt b/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/di/Module.kt deleted file mode 100644 index bd3b149..0000000 --- a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/di/Module.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.user.profile.di - -import com.mobiledevpro.user.profile.domain.usecase.GetUserProfileUseCase -import com.mobiledevpro.user.profile.view.vm.ProfileViewModel -import org.koin.androidx.viewmodel.dsl.viewModelOf -import org.koin.core.module.dsl.scopedOf -import org.koin.dsl.module - -/** - * User Profile screen module - * - * Created on Jul 22, 2023. - * - */ - -val featureUserProfileModule = module { - - scope { - viewModelOf(::ProfileViewModel) - scopedOf(::GetUserProfileUseCase) - } -} \ No newline at end of file diff --git a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/domain/usecase/GetUserProfileUseCase.kt b/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/domain/usecase/GetUserProfileUseCase.kt deleted file mode 100644 index d920a4d..0000000 --- a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/domain/usecase/GetUserProfileUseCase.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2023 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.user.profile.domain.usecase - -import com.mobiledevpro.coroutines.BaseCoroutinesFLowUseCase -import com.mobiledevpro.coroutines.None -import com.mobiledevpro.domain.model.UserProfile -import com.mobiledevpro.domain.model.fakeUser -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf - - -class GetUserProfileUseCase( - -) : BaseCoroutinesFLowUseCase(Dispatchers.IO) { - - override fun buildUseCaseFlow(params: None?): Flow = - flowOf(fakeUser) -} \ No newline at end of file diff --git a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/ProfileScreen.kt b/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/ProfileScreen.kt deleted file mode 100644 index d0ab13d..0000000 --- a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/ProfileScreen.kt +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.user.profile.view - -import android.net.Uri -import android.util.Log -import android.widget.Toast -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.ExitToApp -import androidx.compose.material3.Divider -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.surfaceColorAtElevation -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.boundsInParent -import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.IntOffset -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.airbnb.lottie.compose.LottieAnimation -import com.airbnb.lottie.compose.LottieCompositionSpec -import com.airbnb.lottie.compose.rememberLottieComposition -import com.mobiledevpro.domain.model.UserProfile -import com.mobiledevpro.domain.model.fakeUser -import com.mobiledevpro.ui.component.LabeledDarkModeSwitch -import com.mobiledevpro.ui.component.ProfileContent -import com.mobiledevpro.ui.component.ProfilePicture -import com.mobiledevpro.ui.component.ProfilePictureSize -import com.mobiledevpro.ui.component.ScreenBackground -import com.mobiledevpro.ui.component.SettingsButton -import com.mobiledevpro.ui.theme.AppTheme -import com.mobiledevpro.ui.theme._darkModeState -import com.mobiledevpro.ui.theme.darkModeState -import com.mobiledevpro.user.profile.view.state.UserProfileUIState -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.update -import com.mobiledevpro.ui.R as RUi - -@Composable -fun ProfileScreen( - state: StateFlow, - onNavigateToSubscription: () -> Unit -) { - Log.d("navigation", "ProfileScreen:") - - val uiState by state.collectAsStateWithLifecycle() - val context = LocalContext.current - - val backgroundBoxTopOffset = remember { mutableStateOf(0) } - val darkModeOn = remember { mutableStateOf(darkModeState.value) } - - val user : UserProfile = when(uiState) { - is UserProfileUIState.Success -> (uiState as UserProfileUIState.Success).userProfile - is UserProfileUIState.Fail -> { - LaunchedEffect(Unit) { - Toast.makeText( - context, - (uiState as UserProfileUIState.Fail).throwable.localizedMessage, - Toast.LENGTH_LONG - ).show() - } - - UserProfile("", "", false, Uri.EMPTY) - } - - else -> UserProfile("", "", false, Uri.EMPTY) - } - - ScreenBackground( - modifier = Modifier - .fillMaxSize() - .statusBarsPadding() - ) { - - - //Background with rounded top-corners - Box( - modifier = Modifier - .offset { IntOffset(0, backgroundBoxTopOffset.value) } - .clip(RoundedCornerShape(topStart = 48.dp, topEnd = 48.dp)) - .background(color = MaterialTheme.colorScheme.surfaceColorAtElevation(4.dp)) - ) - - Box(modifier = Modifier.fillMaxSize()) { - - BeLikeAProButton(modifier = Modifier - .align(Alignment.TopEnd) - .padding(8.dp) - .size(56.dp) - .clickable { onNavigateToSubscription() }) - - Column( - modifier = Modifier - .fillMaxSize() - .padding(start = 16.dp, end = 16.dp, bottom = 32.dp), - verticalArrangement = Arrangement.Top - ) { - - ProfilePicture( - photoUri = user.photo, - onlineStatus = true, - size = ProfilePictureSize.LARGE, - modifier = Modifier - .padding(paddingValues = PaddingValues(16.dp, 16.dp, 16.dp, 16.dp)) - .align(Alignment.CenterHorizontally) - .onGloballyPositioned { - val rect = it.boundsInParent() - backgroundBoxTopOffset.value = - rect.topCenter.y.toInt() + (rect.bottomCenter.y - rect.topCenter.y).toInt() / 2 - } - ) - - ProfileContent( - userName = user.name, - subName = user.nickname, - isOnline = user.status, - alignment = Alignment.CenterHorizontally, - modifier = Modifier - .padding(8.dp) - .align(Alignment.CenterHorizontally) - ) - - - - - - Column( - modifier = Modifier - .fillMaxHeight() - .align(Alignment.CenterHorizontally), - verticalArrangement = Arrangement.Bottom - ) { - - LabeledDarkModeSwitch( - label = "Dark mode", - checked = darkModeOn.value, - onCheckedChanged = { isDark -> - Log.d("main", "ProfileScreen: dark $isDark") - darkModeOn.value = isDark - _darkModeState.update { - isDark - } - }) - - Divider() - - SettingsButton( - label = "Log Out", - icon = Icons.Rounded.ExitToApp, - onClick = { - - } - ) - } - } - - - } - } -} - -@Composable -fun BeLikeAProButton(modifier: Modifier) { - //Here is how to use Lottie animation with Compose https://github.com/airbnb/lottie/blob/master/android-compose.md - - val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(RUi.raw.ic_crowd)) - - LottieAnimation(composition = composition, modifier = modifier) -} - -@Preview -@Composable -fun ProfileScreenPreview() { - AppTheme(darkTheme = true) { - ProfileScreen( - state = MutableStateFlow(UserProfileUIState.Success(fakeUser)), - onNavigateToSubscription = {} - ) - } -} \ No newline at end of file diff --git a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/vm/ProfileViewModel.kt b/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/vm/ProfileViewModel.kt deleted file mode 100644 index 09fbf1b..0000000 --- a/feature/user_profile/src/main/kotlin/com/mobiledevpro/user/profile/view/vm/ProfileViewModel.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2022 | Dmitri Chernysh | https://mobile-dev.pro - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.mobiledevpro.user.profile.view.vm - -import android.util.Log -import androidx.lifecycle.viewModelScope -import com.mobiledevpro.ui.vm.BaseViewModel -import com.mobiledevpro.user.profile.domain.usecase.GetUserProfileUseCase -import com.mobiledevpro.user.profile.view.state.UserProfileUIState -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach - -class ProfileViewModel( - private val getUserProfileUseCase: GetUserProfileUseCase -) : BaseViewModel() { - - override fun initUIState(): UserProfileUIState = UserProfileUIState.Empty - - init { - Log.d("UI", "ProfileViewModel init") - observeUserProfile() - } - - private fun observeUserProfile() { - getUserProfileUseCase.execute() - .onEach { result -> - result.onSuccess { profile -> - UserProfileUIState.Success(profile) - .also { _uiState.value = it } - }.onFailure { - //TODO: show the error - } - - }.launchIn(viewModelScope) - } -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index a00fe69..31be507 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,16 +19,9 @@ rootProject.name = "App-Template-Compose" include(":app") include(":core:ui") include(":core:navigation") -include(":core:domain") include(":core:coroutines") include(":feature:home") -include(":feature:onboarding") -include(":feature:subscription") -include(":feature:chat_list") -include(":feature:people_list") -include(":feature:user_profile") -include(":feature:people_profile") -include(":feature:people") include(":core:di") include(":core:util") +include(":feature:image_viewer") From c618d6ca2e0b3c4075127e823fda40f2942c0650 Mon Sep 17 00:00:00 2001 From: Dmitri Chernysh Date: Sun, 18 Feb 2024 15:17:36 +0200 Subject: [PATCH 3/5] Zoomable images --- .../image/viewer/view/ImageViewerScreen.kt | 163 +++++++++++++++++- 1 file changed, 160 insertions(+), 3 deletions(-) diff --git a/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt b/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt index 2c3a836..a53658c 100644 --- a/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt +++ b/feature/image_viewer/src/main/java/com/mobiledevpro/image/viewer/view/ImageViewerScreen.kt @@ -17,12 +17,43 @@ */ package com.mobiledevpro.image.viewer.view +import android.icu.text.CaseMap.Upper +import android.net.Uri +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.gestures.rememberTransformableState +import androidx.compose.foundation.gestures.transformable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import org.w3c.dom.Text +import androidx.compose.ui.draw.scale +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import coil.compose.AsyncImage +import coil.request.CachePolicy +import coil.request.ImageRequest +import coil.size.Size /** * Demo screen for zoomable image @@ -34,8 +65,134 @@ import org.w3c.dom.Text @Composable fun ImageViewerScreen() { - Box(modifier = Modifier.fillMaxSize()) { - Text(text = "Image Viewer") + Scaffold( + contentWindowInsets = WindowInsets.systemBars + ) { paddings -> + + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddings) + ) { + + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.SpaceEvenly + ) { + + Box( + modifier = Modifier + .fillMaxSize() + .weight(1f) + ) { + UpperImage() + } + Box( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + LowerImage() + } + } + + } + + } + + +} + +@Composable +fun BoxScope.UpperImage() { + var imageScale by remember { mutableFloatStateOf(1f) } + var imageOffset by remember { mutableStateOf(Offset.Zero) } + + val transformState = rememberTransformableState { zoomChange, panChange, rotationChange -> + imageScale = (imageScale * zoomChange).coerceIn(1f, 5f) + imageOffset += panChange + } + + val model = ImageRequest.Builder(LocalContext.current) + .data("https://c4.wallpaperflare.com/wallpaper/83/500/871/waterfall-high-resolution-desktop-wallpaper-preview.jpg") + .size(Size.ORIGINAL) // Set the target size to load the image at. + .crossfade(true) + .memoryCachePolicy(CachePolicy.DISABLED) + .diskCachePolicy(CachePolicy.DISABLED) + .build() + + AsyncImage( + model = model, + contentDescription = "", + contentScale = ContentScale.FillHeight, + onState = { state -> + Log.d("UI", "AsyncImage.state: $state") + }, + modifier = Modifier + .align(Alignment.Center) + .fillMaxWidth() + .scale(imageScale) + .graphicsLayer { + Log.d("UI", "ImageViewerScreen: graphicsLayer: scale $scaleX $scaleY") + scaleX = imageScale + scaleY = imageScale + translationX = imageOffset.x + translationY = imageOffset.y + } + .transformable(transformState) + .pointerInput(Unit) { + detectTapGestures(onDoubleTap = { + Log.d("UI", "ImageViewerScreen: on double tap") + imageScale = 1f + imageOffset = Offset.Zero + }) + } + ) +} + +@Composable +fun BoxScope.LowerImage() { + var imageScale by remember { mutableFloatStateOf(1f) } + var imageOffset by remember { mutableStateOf(Offset.Zero) } + + val transformState = rememberTransformableState { zoomChange, panChange, rotationChange -> + imageScale = (imageScale * zoomChange).coerceIn(1f, 5f) + imageOffset += panChange } + val model = ImageRequest.Builder(LocalContext.current) + .data("https://c4.wallpaperflare.com/wallpaper/352/684/15/underwater-high-resolution-desktop-backgrounds-wallpaper-preview.jpg") + .size(Size.ORIGINAL) // Set the target size to load the image at. + .crossfade(true) + .memoryCachePolicy(CachePolicy.DISABLED) + .diskCachePolicy(CachePolicy.DISABLED) + .build() + + AsyncImage( + model = model, + contentDescription = "", + contentScale = ContentScale.FillHeight, + onState = { state -> + Log.d("UI", "AsyncImage.state: $state") + }, + modifier = Modifier + .align(Alignment.Center) + .fillMaxWidth() + .scale(imageScale) + .graphicsLayer { + Log.d("UI", "ImageViewerScreen: graphicsLayer: scale $scaleX $scaleY") + scaleX = imageScale + scaleY = imageScale + translationX = imageOffset.x + translationY = imageOffset.y + } + .transformable(transformState) + .pointerInput(Unit) { + detectTapGestures(onDoubleTap = { + Log.d("UI", "ImageViewerScreen: on double tap") + imageScale = 1f + imageOffset = Offset.Zero + }) + } + ) } From e763b87dc81b13140a1d5b7b2600e13acefbe6e4 Mon Sep 17 00:00:00 2001 From: Dmitri Chernysh Date: Sun, 18 Feb 2024 15:34:57 +0200 Subject: [PATCH 4/5] Update README.md --- README.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 502d528..16149a8 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,11 @@ Based on [App Template](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp-Template) - -![Run Unit Tests](https://github.com/mobiledevpro/zoomable-image-jetpack-compose/actions/workflows/run_tests.yml/badge.svg) -[![CodeFactor](https://www.codefactor.io/repository/github/mobiledevpro/zoomable-image-jetpack-compose/badge)](https://www.codefactor.io/repository/github/mobiledevpro/jetpack-compose-chatapp-template) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mobiledevpro_zoomable-image-jetpack-compose&metric=alert_status)](https://sonarcloud.io/dashboard?id=mobiledevpro_Jetpack-Compose-ChatApp-Template) - -[![Kotlin Version](https://img.shields.io/badge/Kotlin-1.9.22-blue.svg?style=flat-square)](http://kotlinlang.org/) -[![Compose Bom](https://img.shields.io/badge/Compose%20Bom-2024.01.00-blue.svg?style=flat-square)]([http://kotlinlang.org/](https://developer.android.com/jetpack/compose/bom/bom-mapping)) -[![Gradle](https://img.shields.io/badge/Gradle-8.2.0-blue.svg?style=flat-square)](https://developer.android.com/build/releases/gradle-plugin) -[![API](https://img.shields.io/badge/Min%20SDK-24%20[Android%207.0]-blue.svg?style=flat-square)](https://github.com/AndroidSDKSources/android-sdk-sources-list) -[![Target SDK](https://img.shields.io/badge/Target%20SDK-34%20[Android%2014]-blue.svg?style=flat-square)](https://developer.android.com/about/versions/13) -[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0) -[![Android Studio](https://img.shields.io/badge/Android%20Studio%20Iguana-2023.2.1-orange.svg?style=flat-square)](https://developer.android.com/studio/preview) - ![GitHub last commit](https://img.shields.io/github/last-commit/mobiledevpro/zoomable-image-jetpack-compose?color=red&style=flat-square) +Demo - tap to watch: + +[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/mqjVI5_L9XA/0.jpg)](https://www.youtube.com/watch?v=mqjVI5_L9XA) ## ## Author: From e8a98d4b276c42f3281aecc7c879c7d30c844237 Mon Sep 17 00:00:00 2001 From: Dmitri Chernysh Date: Sun, 18 Feb 2024 15:38:46 +0200 Subject: [PATCH 5/5] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 16149a8..3aebe89 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Based on [App Template](https://github.com/mobiledevpro/Jetpack-Compose-ChatApp- ![GitHub last commit](https://img.shields.io/github/last-commit/mobiledevpro/zoomable-image-jetpack-compose?color=red&style=flat-square) -Demo - tap to watch: +Demo video - tap to watch: [![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/mqjVI5_L9XA/0.jpg)](https://www.youtube.com/watch?v=mqjVI5_L9XA)