Dive into a world of endless entertainment, where you can explore movies and TV shows from every category action, drama, comedy, romance, sci-fi, and more! π From discovering your favorite actors π₯ to exploring their full filmography π, weβve got you covered. Build your own collections, follow categories you love β€οΈ, and enjoy a personalized cinematic journey like never before! π
Key Features:
- π Search for any movie or series.
- π€ Actor Details β learn about your favorite stars.
- β Rate & Review β give feedback on movies/series.
- π― MCQ Game β get personalized recommendations.
- π Custom Collections β create and manage your own watchlists.
- π« Content Filter β blur inappropriate visuals.
- π Dark & Light Theme support.
- π Multi-language β English & Arabic.
This diagram illustrates a modern, multi-module architecture based on Clean Architecture principles. The arrows indicate the direction of dependency; for example, an arrow from :presentation to :domain means the :presentation module depends on the :domain module.
This setup ensures that core business logic is independent and that the UI and data layers can be modified or replaced without affecting the rest of the system. This separation of concerns makes the codebase modular, testable, and easy to maintain.
Here's a breakdown of each module's role:
-
:app- Description: The main application module that assembles the final app.
- Responsibilities: It integrates all other modules (
:presentation,:data,:domain, etc.), sets up the Firebase suite (Crashlytics, Analytics), and initializes the Hilt dependency graph for the application.
-
:presentation- Role: The UI layer, containing Jetpack Compose screens, ViewModels, and navigation. It orchestrates user interactions and displays data.
- Dependencies:
:domain(to access business logic/use cases).:design_system(to use shared UI components).:image_viewer(to display images with custom logic).
-
:data- Role: Implements the repository interfaces defined in the domain layer. It handles all data operations, fetching from remote sources (Retrofit), local caches (Room) and Jetpack DataStore for storing user preferences. It is also responsible for securely loading API keys via
buildConfig. - Dependencies:
:domain(to implement its interfaces).
- Role: Implements the repository interfaces defined in the domain layer. It handles all data operations, fetching from remote sources (Retrofit), local caches (Room) and Jetpack DataStore for storing user preferences. It is also responsible for securely loading API keys via
-
:domain- Role: The core of the application. It contains the essential business logic, use cases, and data models. It is pure Kotlin and has no knowledge of the Android framework.
- Dependencies: None. It is the most independent module in the project.
-
:design_system- Role: A shared library of reusable UI components, Provides a consistent look and feel across the app by centralizing themes, colors, typography, and common Composables like buttons and text fields. It includes specialized components This ensures UI consistency across the app.
- Dependencies: None.
-
:image_viewer- Role: A specialized utility module responsible for loading images (using Coil) and handling content safety by classifying and blurring images using TensorFlow Lite.
- Dependencies: None.
CineVerse is built with a modern tools, libraries, robust, and scalable tech stack, leveraging the best of the Android ecosystem.
Languages & Tools
- Kotlin
- Android Studio
- Gradle
- Jetpack Components (ViewModel, LiveData, Navigation, etc.)
| Category | Technologies & Libraries |
|---|---|
| Core & Architecture | Kotlin, Coroutines & Flow, Clean Architecture, MVVM, Repository Pattern |
| UI & Design | Jetpack Compose, Material 3, Coil 3 (for image loading) |
| Jetpack Suite | Paging 3, WorkManager, DataStore, Navigation Component |
| Dependency Injection | Hilt |
| Networking | Retrofit, OkHttp, Kotlinx.Serialization |
| Local Storage | Room (for database caching), DataStore (for key-value preferences) |
| Machine Learning | TensorFlow Lite (for on-device content classification) |
| Firebase Suite | Crashlytics, Performance Monitoring, Analytics |
| Testing | JUnit5, Mockk, Truth |
| APIs | The Movie Database (TMDb) API |
Follow these steps to clone and run CineVerse on your local machine:
git clone https://github.com/Moscow-Squad/CineVerse.gitOpen Android Studio.
Click File > Open.
These files are required to run Cineverse locally. Do not commit them.
| File | Where to place it | Purpose |
|---|---|---|
google-services.json |
<project-root>/app/ |
Firebase/Google services config for the app module |
service-account-key.json |
<project-root>/ |
CI / admin SDK tasks (e.g., Firebase App Distribution) |
keys.properties |
<project-root>/ |
API keys used by Gradle/BuildConfig |
Sync Gradle.
Run the app on your local device or emulator.
%%{init: {
"flowchart": { "nodeSpacing": 50, "rankSpacing": 65 },
"themeVariables": { "fontSize": "18px", "primaryColor": "#FDF6E3", "primaryTextColor": "#000", "primaryBorderColor": "#333", "lineColor": "#333" }
}}%%
flowchart TD
A[CineVerse]
%% app
A --> APP
subgraph APP[app]
subgraph APPK[com.moscow.cineverse]
APP1[main_activity/]
APP2[CineVerseApp.kt]
APP3[CineVerseRoot.kt]
end
end
%% data
A --> DATA
subgraph DATA[data]
subgraph DATAK[com.moscow.data_source]
D1[di]
D2[local]
D3[mapper]
D4[preference]
D5[remote]
D6[repository]
D7[utils]
end
end
%% design_system
A --> DS
subgraph DS[design_system]
subgraph DSK[com.moscow.design_system]
DS1[color]
DS2[component]
DS3[icon]
DS4[radius]
subgraph DST[theme]
DST1[typography]
DST2[utils]
end
end
end
%% domain
A --> DOMAIN
subgraph DOMAIN[domain]
subgraph DOMK[com.moscow.domain]
DOM1[exception]
DOM2[mapper]
DOM3[model]
DOM4[repository]
DOM5[usecase]
DOM6[utils]
end
end
%% image_viewer
A --> IV
subgraph IV[image_viewer]
subgraph IVK[com.moscow.cineverse.image_viewer]
IV1[classifier]
IV2[component]
end
end
%% presentation
A --> PRES
subgraph PRES[presentation]
subgraph PRESK[com.moscow.cineverse]
P1[base]
P2[common_ui_state]
P3[component]
P4[mapper]
P5[navigation]
P6[paging]
P7[screen]
P8[utils]
end
end

























































