The application has been built with offline support. It has been designed using Android Architecture components with Room for offline data caching. The application is built in such a way that whenvever there is a service call, the result will be stored in local database.
The whole application is built based on the MVVM architectural pattern.
Project features:
- 100% Kotlin
- Android Jetpack (ViewModel, LiveData, Lifecycle)
- Clean architecture
- Data Binding
- Reactive Programming (RxJava and RxAndroid)
- Dagger2 Dependency injection (service locator)
- JUnit4 and Mockito Test
- Android Studio 3.6.1
- Kotlin Version 1.3.71
- Gradle Build Version 3.6.1
- Android Version 10
- JVM 1.8
- Google + JetBrains (Pretty standard default stack nowadays)
- Kotlin
- [Idiomatic Kotlin] (https://kotlinlang.org/docs/reference/idioms.html)
- [Collection] (https://kotlinlang.org/docs/reference/collections-overview.html)
- RxJava
- RxAndroid
- Jetpack
- LiveData
- Lifecycle
- ViewModel
- Data Binding
- [Navigation Component] (https://developer.android.com/guide/navigation/navigation-getting-started)
- Kotlin
- Dependency injection (Dagger2 is easy to use library for managing dependencies, it is perfect for small/mid size projects_)
- Retrofit2 (Retrofit is a de-facto standard nowadays)
- Tests (I used Mockito kotlin by nhraaman. It's pretty Standard. I'm comfortable with Mockk too. Also found recently about Kakao, which provides a nice DSL over Espresso, which makes writing and reading UI tests more pleasant_)
- Gradle (Nice way to keep all library dependencies in one centralised place)
MVVM stands for “Model View ViewModel”. The main advatage of using MVVM, there is no two way dependency between ViewModel and Model unlike MVP/ MVC. Here the view can observe the datachanges in the viewmodel as we are using LiveData which is lifecycle aware. We're also using RxJava/ RxAndroid as demanded by question. The viewmodel to view communication is achieved through observer pattern (basically observing the state changes of the data in the viewmodel).
- Improve UI for good user interface, Keep the interface simple.
- Cover edge case in UI test
- Use RxAndroid in this project. Would like to move to LiveData completely. It looks more clean to me that way.
- Continuous integration (Setup basic integration, it runs static analysis tools, unit tests, and assembles builds. Was thinking to run UI tests as well, but the setup is a little bit tricky and due to time constraints, have to postpone the idea)
- Add more description fragment
Please note that some of the imageUrl doesn't work even though it's not nullOrEmpty.