Application that fetches a list of random users from a server and shows them in a list.
Tapping on a user navigates to the user details screen.
Debug APK for the application can be found here:
https://drive.google.com/file/d/1pQGneJQg7SK2fysIrcMYjjn2ZfZkucBY/view?usp=sharing
You can also download and install the app by scanning the QRCode below:
The project's architecture is MVVM with Clean Architecture.
On the presentation layer, View Models are used to handle data visualization. Activities and Fragments reactively interact with View Models, through the use of LiveData. The presentation layer communicates with the domain layer through UseCases, invoked by View Models.
This layer contains the "representation" of the business logic/features of the app. This representation exists through the use of UseCases. UseCases invoke the Data Layer (through repositories), map "data entities" to entities that are used in the rest of the app, and are kept as simple as possible. UseCases make use of mapper functions to properly map data objects to domain objects.
Data Layer contains repositories, data types that map to external API types, and other things related to the app external communication. All API calls are dispatched from this layer exclusively. This layer is never accessed directly from the presentation layer. Repositories are used by UseCases.
Hilt was chosen as the framework to facilitate dependency injection through the app.
View Binding for binding views.
View Model to store and manage UI-related data in a lifecycle conscious way.
Live Data for observing data holder classes.
Jetpack Navigation for navigating between screens.
Coroutines for asynchronous operations.
Room for the database storage.
DataStore for persisting key-value pairs.
Retrofit for making network calls.
Glide for image loading and caching.
Hilt for dependency injection.
JUnit and Mockito for unit tests.
Espresso for UI tests.
MockWebServer for mocking web server responses to local json files.