When this project was initially created, the main objective was to improve my knowledge of Firebase and Jetpack Compose, in addition to creating a chat app with several different Firebase tools. However, in the recreation, the goal was a little more distinct from the initial idea.
The project was recreated in order to improve my knowledge in modularization and clean architecture, with a project divided into layers separated by different modules.
- users/: All registered users.
- chat_messages/chatId/messages/: Messages from users, having as chatId an ID generated from the two userId of the conversation.
- latest_messages/userId/messages/chatId/: Latest messages from each user.
- User registration with email and password;
- One-to-one chat;
- List of all registered users;
- Dark and light theme with easy user change option;
- Quick profile view.
After cloning the repository, follow the steps of Firebase project setup and add your google-services.json file to the project.
Android module. It represents the layer popularly known as "presentation", which contains all the code and logic related to the user interface, which is made using Jetpack Compose.
- Dependency with other modules: common, domain and data. (Important note: The inclusion of the data module in the build.gradle.kts is for dependency injection only, as it is not possible to access the repository implementation classes without including the data layer. The data layer is not accessed directly by the presentation layer. For this, the use cases of the domain layer are used.)
Common Kotlin module, no dependencies with Android. Represents the app's business rules. Contains all the use cases responsible for CRUD and data validation, in addition to the repository interfaces.
- Dependency with other modules: commom.
Android module. Represents the app's data layer, used to get/save both remote and local data. Contains the domain layer repository implementations.
- Dependency with other modules: common and domain.
Common Kotlin module, no dependencies with Android. Contains some useful classes that will be used in all other layers, like preference constants and exceptions.
- It has no dependency with other modules.
The old version of this project has the function of push notifications when receiving new messages, but this functionality is not present in the current project.
The project has some unit tests of the validation use cases, which can be accessed in the domain module.
- Firebase:
- Hilt: Dependency injection.
- DataStore: Used for storing data such as user preferences.
- Accompanist:
- Navigation Animation: Used for navigation with animation with Navigation Compose;
- Pager and Pager-Indicators: Used for XML ViewPager-like component.
- Landscapist: Used for image loading.