A clean architecture Android application showcasing workout videos with seamless playback experience. This implementation demonstrates modern Android development best practices and modular app architecture.
Note on functionality:
✅ My current technical capabilities
✅ Production-grade architecture decisions
✅ Best practices in Android development
- Language: Kotlin
- Architecture: Clean Architecture + MVI, Single Activity
- DI: Dagger Hilt
- Async: Kotlin Coroutines & Flow
- Views: XML, Fragments, Navigation Component
- Binding: ViewBinding, ViewBindingPropertyDelegate
- Lists: RecyclerView, AdapterDelegates, DiffUtil
- HTTP: REST API, Retrofit + OkHttp
- Serialization: Gson
- Video: Media 3 ExoPlayer
KOLSAtest/
├── app/ # Android Application Module
│ ├── src/main/
│ │ ├── java/com/vgve/kolsatest/
│ │ │ ├── App.kt # Application Class
│ │ │ └── MainActivity.kt
│ │ ├── res/ # Resources
│ │ │ ├── drawable/ # Vector Assets
│ │ │ ├── values/ # Colors, Strings, Styles
│ │ │ └── ...
│ │ └── AndroidManifest.xml
│ └── build.gradle.kts # Module Dependencies
├── core/ # Core Module
│ ├── src/main/
│ │ ├── java/com/vgve/core/
│ │ │ ├── di/ # Dependency Injection (Dagger Hilt)
│ │ │ │ ├── CoreModule.kt
│ │ │ │ └── NetworkModule.kt # Retrofit instance creation
│ │ │ └── utils/extensions/
│ │ │ └── NetworkExtensions.kt
│ │ └── AndroidManifest.xml
│ └── build.gradle.kts # Module Dependencies
├── player/ # Player Module
│ ├── src/main/
│ │ ├── java/com/vgve/player/
│ │ │ ├── di/ # Dependency Injection (Dagger Hilt)
│ │ │ │ └── VideoPlayerModule.kt
│ │ │ ├── data/
│ │ │ │ └── VideoPlayerServiceImpl.kt
│ │ │ ├── domain/
│ │ │ │ └── VideoPlayerService.kt
│ │ │ └── presentation/ui/
│ │ │ └── CustomPlayerView.kt
│ │ ├── res/ # Resources
│ │ └── AndroidManifest.xml
│ └── build.gradle.kts # Module Dependencies
├── workouts/ # Feaure Module
│ ├── src/main/
│ │ ├── java/com/vgve/workout/
│ │ │ ├── di/ # Dependency Injection (Dagger Hilt)
│ │ │ │ └── WorkoutsModule.kt
│ │ │ ├── data/
│ │ │ │ ├── models/
│ │ │ │ └── repository/
│ │ │ ├── domain/
│ │ │ │ ├── models/
│ │ │ │ └── repository/
│ │ │ └── presentation/
│ │ │ ├── workouts/ # Workouts Screen: Fragment, ViewModel, adapters
│ │ │ └── workoutcard/ # Workout Card Screen: Fragment, ViewModel
│ │ ├── res/ # Resources
│ │ └── AndroidManifest.xml
│ └── build.gradle.kts
├── build.gradle.kts # Project-level Config
├── settings.gradle.kts # Project Settings
├── gradle.properties # Gradle Properties
└── README.md # Project Documentation
The project follows Clean Architecture principles with three distinct modules:
The foundation module containing shared infrastructure:
- Network layer:
- OkHttp client configuration
- Retrofit instance creation
- Utilities: Shared extensions
Dedicated media handling module:
- ExoPlayer wrapper: Singleton implementation
- Centralized playback control
- Lifecycle-aware player management
The main feature module containing:
- Workout list screen:
- Fetching and displaying workout collection
- Smooth scrolling performance
- Workout detail screen:
- Comprehensive workout information
- Integrated video player (utilizing Player module)
- State preservation during configuration changes
