ChatApp is a fully-featured, real-time messaging application for Android, built with the latest technologies. It showcases a modern, clean, and animated user interface following Material 3 design principles. Connect with users in private chats, join the global conversation, or even chat with a Gemini-powered AI, all within a robust and scalable architecture.!
- 🔒 Authentication: Secure user sign-up and login using Firebase Authentication. Includes a "Forgot Password" flow.
- 👤 User Directory: Browse a list of all registered users to start new conversations.
- 💬 Private & Global Chat: Engage in one-on-one private messaging or join the public global chat room.
- 🤖 AI Chat & Smart Replies: Have a conversation with Google's Gemini API and get AI-powered reply suggestions in your private chats.
- ✍️ Full Message Control:
- Edit & Delete: Easily correct typos or remove messages you've sent.
- Reply to Message: Swipe on any message to reply directly, providing context to your conversations.
- Message Reactions: React to messages with emojis (❤️, 👍, 😂, 😢, 😠).
- 👀 Real-time Presence:
- Typing Indicators: See when the other user is typing in real-time.
- Read Receipts: Know when your messages have been seen with a double-check mark system (✔️✔️).
- 🎨 Modern UI: A beautiful and responsive UI built with Jetpack Compose and Material 3, supporting both light and dark themes.
- 🚀 Real-time Communication: Messages and reactions appear instantly thanks to Firebase Firestore's real-time listeners.
- ✨ Fluid Animations: Smooth and fluid animations for message appearance and UI transitions, enhancing the user experience.
Here's a glimpse of the beautiful new interface you'll experience in ChatApp.
| Users List | Private Chat | Global Chat |
|---|---|---|
![]() |
![]() |
![]() |
| AI Chat | Login Screen | Sign Up Screen |
![]() |
![]() |
![]() |
This project leverages a modern Android development stack:
- UI: Jetpack Compose for building the UI declaratively with Kotlin.
- Architecture: Model-View-Intent (MVI)* using a single state object (
UiState) and unidirectional data flow to ensure a predictable and maintainable state management. - State Management: Unidirectional Data Flow (UDF) within the ViewModels using Kotlin Flows and StateFlow.
- Dependency Injection: Koin for managing dependencies and injecting ViewModels.
- Backend: Firebase
- Firestore: For real-time database functionality (messages, users, reactions).
- Authentication: For handling user accounts.
- Asynchronous Programming: Kotlin Coroutines and Flows for managing background tasks and handling data streams.
- Navigation: Jetpack Navigation for Compose to handle screen transitions.
- Automation (CI/CD):
- GitHub Actions for automated testing and building.
- Firebase App Distribution for automated deployment to testers.
A full CI/CD pipeline is configured using GitHub Actions (.github/workflows/android_ci.yml). On every push to the develop branch, the workflow automatically:
- Checks out the latest code.
- Sets up the Java and Android SDK environment.
- Caches Gradle dependencies to speed up future builds.
- Runs lint checks and unit tests to ensure code quality.
- Builds a release-ready APK.
- Generates automatic release notes from the latest commit messages.
- Uploads and distributes the APK to testers via Firebase App Distribution.
To get this project running on your own machine, follow these steps:
-
Clone the repository:
git clone [https://github.com/mena-rizkalla/chatapp.git](https://github.com/mena-rizkalla/chatapp.git)
-
Connect to Firebase:
- Go to the Firebase Console.
- Create a new project.
- Add an Android app to your Firebase project with the package name
com.example.chatapp. - Download the
google-services.jsonfile and place it in theapp/directory of your project. - In the Firebase Console, enable Authentication (with the Email/Password provider) and Firestore Database.
-
Build and Run:
- Open the project in Android Studio.
- Let Gradle sync the dependencies.
- Build and run the app on an emulator or a physical device.
Contributions are welcome! If you have ideas for new features or find a bug, please feel free to open an issue or submit a pull request.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request





