{"id":19159657,"url":"https://github.com/yusufceylan/mvi-clean-architecture","last_synced_at":"2025-05-07T08:44:18.949Z","repository":{"id":38133206,"uuid":"334417734","full_name":"yusufceylan/MVI-Clean-Architecture","owner":"yusufceylan","description":"MVI + Clean Architecture + Best Practices | Example of Clean Architecture of Android app using MVI design pattern with Jetpack and popular libraries","archived":false,"fork":false,"pushed_at":"2021-07-15T07:54:26.000Z","size":267,"stargazers_count":94,"open_issues_count":0,"forks_count":22,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-19T20:53:37.685Z","etag":null,"topics":["clean-architecture","coroutines","coroutines-android","dagger-hilt","kotlin","kotlin-flows","kotlinx-serialization","mockito","modular","modularization","mvi-android","mvi-architecture","mvi-clean-architecture","mvvm","mvvm-android","mvvm-architecture","navigation-component","room","testing"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yusufceylan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-01-30T13:21:54.000Z","updated_at":"2025-04-15T06:32:04.000Z","dependencies_parsed_at":"2022-09-20T16:52:00.562Z","dependency_job_id":null,"html_url":"https://github.com/yusufceylan/MVI-Clean-Architecture","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusufceylan%2FMVI-Clean-Architecture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusufceylan%2FMVI-Clean-Architecture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusufceylan%2FMVI-Clean-Architecture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusufceylan%2FMVI-Clean-Architecture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yusufceylan","download_url":"https://codeload.github.com/yusufceylan/MVI-Clean-Architecture/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252846105,"owners_count":21813378,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","coroutines","coroutines-android","dagger-hilt","kotlin","kotlin-flows","kotlinx-serialization","mockito","modular","modularization","mvi-android","mvi-architecture","mvi-clean-architecture","mvvm","mvvm-android","mvvm-architecture","navigation-component","room","testing"],"created_at":"2024-11-09T08:50:49.615Z","updated_at":"2025-05-07T08:44:18.922Z","avatar_url":"https://github.com/yusufceylan.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MVI-Clean-Architecture\nThis is a sample app \u0026 basic code that demonstrate how to build an Android application using the Uncle Bob's Clean Architecture approach.\n\nThe trick of the project is to demonstrate best practices, provide a set of guidelines, and present modern Android Application Architecture that is modular, scalable, maintainable and testable, suitable for bigger teams and long application lifecycle management.\n\n\u003cimg src=\"https://miro.medium.com/max/4800/1*D1EvAeK74Gry46JMZM4oOQ.png\" width=\"500\"\u003e\n\nBecause it is an architectural project, UI has been kept simple. Sample data has been provided from [JsonPlaceholder API](https://jsonplaceholder.typicode.com/) You can directly clone the repo and run the app.\n\n### Flow \nThis app uses [_**MVI (Model View Intent)**_](https://proandroiddev.com/mvi-architecture-with-kotlin-flows-and-channels-d36820b2028d) architecture.\n \n\u003cimg src=\"https://miro.medium.com/max/1400/1*3u5JnmqONR4UnwRE6tEV3Q.png\" width=\"500\"\u003e\n\n### Modules\nModules are the collection of source files and build settings that allow you to divide your project into discrete units of functionality.\n\n- **App Module**\n\n  `:app` module is an [com.android.application](https://developer.android.com/studio/projects/android-library), which is needed to create the app bundle. It contains dependency graph and UI related classes. It presents data to screen and handle user interactions.\n\n- **Base Module**\n\n  `:base` module contains only framework related base classes that is used in other modules\n\n- **Common Module**\n\n  `:common` module contains code and resources which are shared between other modules\n\n- **Data Module**\n\n  `:data` module contains implementation of repository and local - remote repository interface adapt\n  \n- **Domain Module**\n\n  `:domain` module contains use cases and repository interface adapt\n  \n- **Local Module**\n\n  `:local` module contains local data source related classes\n  \n - **Remote Module**\n \n\t`:remote` module contains remote data source related classes\n\t  \n - **Presentation Module**\n \n\t  `:presentation` module contains business logic\n\nEach module has its own test.\n\n### Tech Stack\n- [Kotlin](https://kotlinlang.org)\n- [Jetpack](https://developer.android.com/jetpack)\n\t* [Android KTX](https://developer.android.com/kotlin/ktx)\n    * [Lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle)\n    * [Data Binding](https://developer.android.com/topic/libraries/data-binding)\n    * [View Binding](https://developer.android.com/topic/libraries/view-binding)\n    *  [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel)\n    * [Navigation Component](https://developer.android.com/guide/navigation/navigation-getting-started)\n    * [Room](https://developer.android.com/training/data-storage/room)\n- [Coroutines - Flow](https://kotlinlang.org/docs/reference/coroutines/flow.html)\n  - [State Flow](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow)\n  -   [Shared Flow](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow)\n  -  [Channels](https://kotlinlang.org/docs/channels.html#channel-basics)\n- [Dagger Hilt](https://dagger.dev/hilt/)\n- [Retrofit](https://square.github.io/retrofit/)\n- [OkHttp](https://github.com/square/okhttp)\n- [KotlinX](https://github.com/Kotlin/kotlinx.serialization)\n- [KotlinX Serialization Converter](https://github.com/JakeWharton/retrofit2-kotlinx-serialization-converter)\n- [LeakCanary](https://square.github.io/leakcanary/)\n- [Testing](https://developer.android.com/training/testing/fundamentals)\n    *  [MockK](https://mockk.io/)\n    * [Junit4](https://junit.org/junit4/)\n    * [Truth](https://github.com/google/truth)\n    * [Turbine](https://github.com/cashapp/turbine)\n    * [Fragment Testing](https://developer.android.com/guide/fragments/test)\n    * [Navigation Testing](https://developer.android.com/guide/navigation/navigation-testing)\n    * [Coroutine Test](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test)\n    * [Barista](https://github.com/AdevintaSpain/Barista)\n    * [Dagger Hilt Testing](https://developer.android.com/training/dependency-injection/hilt-testing)\n\n### Contributions\n\nAll contributions are welcome! Please fork this repository and contribute back using [pull requests](https://github.com/yusufceylan/MVI-Clean-Architecture/pulls).\n\n### Contact\n- [Linkedin](https://www.linkedin.com/in/ysfcyln/)\n- [Medium](https://ysfcyln.medium.com/)\n\nDon't forget to star ⭐ the repo it motivates me to share more open source\n\n### License\n\n```\nMIT License\n\nCopyright (c) 2021 Yusuf Ceylan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusufceylan%2Fmvi-clean-architecture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyusufceylan%2Fmvi-clean-architecture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusufceylan%2Fmvi-clean-architecture/lists"}