An Application that is able to load data from a server and playback the associated audio content using compose and Hilt based on modern Android tech-stacks and MVVM architecture.


This app is based on the MVVM architecture and Clean Architecture principles, which follows the Google’s official architecture guidance The overall architecture of this application is composed of three layers; the UI layer domain layer and the data layer. Each layer has dedicated components and they have each different responsibilities. Each layer follows unidirectional event/data flow; the UI layer emits user events to the data layer, and the data layer exposes data as a stream to other layers. The data layer is designed to work independently from other layers and must be pure, which means it doesn’t have any dependencies on the other layers. With this loosely coupled architecture, you can increase the reusability of components and scalability of your app.

  • MVVM Architecture (Declarative View – ViewModel – Model)
  • View: Renders UI and delegates user actions to ViewModel
  • ViewModel: Can have simple UI logic but most of the time just gets the data from Repository
  • Repository Pattern: Single source of data. Responsible to get data from one or more data sources

This application adopted modularization strategies below:

  • Reusability: Modularizing reusable codes properly enable opportunities for code sharing and limits code accessibility in other modules at the same time.
  • Parallel Building: Each module can be run in parallel and it reduces the build time.
  • Strict visibility control: Modules restrict to expose dedicated components and access to other layers, so it prevents they’re being used outside the module
  • Decentralized focusing: Each developer team can assign their dedicated module and they can focus on their own modules.

Tech Stack

  • Minimum SDK level 23
  • 100% Kotlin based
  • Coroutines + Flow for asynchronous.
  • JetPack Compose : A modern toolkit for building native Android UI.
  • JetPack Lifecycle : Dispose observing data when lifecycle state changes.
  • JetPack ViewModel : UI related data holder, lifecycle aware.
  • JetPack App Startup : Provides a straightforward, performant way to initialize components at application startup.
  • JetPack Navigation Component: Consistent navigation between views
  • Coil Landscapist: Image loading and caching
  • JUNIT: Unit testing
  • Timber: A logger with a small, extensible API.
  • MockK: Mock objects for unit testing
  • Retrofit2 & OkHttp3 : construct the REST APIs and network data.
  • Hilt: Dependency injector

Task Board

  • Git Initialize
  • Readme Setup
  • Kotlin-DSL
  • Timber
  • Navigation Component
  • Dependency Injection Using Hilt
  • Coroutine and Flow
  • Retrofit Network Client
  • Domain Layer Setup
  • Data Layer Setup
  • Fetch the content of Manifest file
  • Show audio content on scrollable list
  • Reload list support
  • Non interactive rating element for each tile
  • Interactive element to set the song as a favorite for each tile
  • Open Detail Screen by clicking on tile
  • Displays the content of the selected element
  • Media Player functionalities Setup (Load/Play/Pause)
  • Current audio play time and duration
  • Handle Media player on Pause and On Destroy
  • Audio Slider
  • The interactive favorite element to set the song as a favorite
  • The interactive rating element displayed as stars
  • Unit Test
  • Instrumentation Test
  • UI Test
  • Dokka Documentation Tool
  • MAD Score
  • Leak Canary Test
  • Detekt Static Code Analyze
  • Release APK


View Github