The ultimate movie app built with Kotlin

The ultimate movie app built with Kotlin

FilmRave 🍿🎬

App Screenshot

Welcome to filmRave, the ultimate movie app for film lovers! With filmRave, you can easily discover new movies, manage your watchlist, and get detailed information about your favorite films, all in one convenient place.

Using The Movie Database (TMDB) API, filmRave fetches up-to-date information about movies, including ratings, recommendations, movie trailers and much more. With a user-friendly dashboard, you can quickly access the most popular and trending movies, as well as new releases and upcoming films. You can also explore movies by genre or search for specific titles.

With the watchlist feature, you can keep track of the movies you want to see by adding in the watchlist section. FilmRave also offers similar movie recommendations based on your viewing history, so you can easily find new movies that match your interests.

Even if you’re without internet access, filmRave has got you covered with offline support. You can access your watchlist and recently viewed movies, even without an internet connection.

In addition to the clean and intuitive user interface, filmRave also provides detailed information about each movie, including trailers and clips, and other related content. The YouTube player integration allows you to watch trailers and other related content right within the app.

With filmRave, you’ll never miss a great movie again.

This project follows the MVVM structure with Clean Architecture.

Feature πŸ’ͺ🏻

  • Dashboard
  • Explore
  • WatchList
  • Similar Recommendations
  • Offline Support
  • No Internet Handling
  • Clean UI
  • Detailed Info
  • YouTube Player

Folder Structure πŸ—‚οΈ

β”œβ”€β”€ FilmRaveApp.kt
β”œβ”€β”€ core
β”‚   β”œβ”€β”€ adapter
β”‚   β”‚   β”œβ”€β”€ BannerAdapter.kt
β”‚   β”‚   β”œβ”€β”€ HomeAdapter.kt
β”‚   β”‚   β”œβ”€β”€ HorizontalAdapter.kt
β”‚   β”‚   β”œβ”€β”€ RecommendationsAdapter.kt
β”‚   β”‚   β”œβ”€β”€ TopSearchesAdapter.kt
β”‚   β”‚   └── WatchListAdapter.kt
β”‚   β”œβ”€β”€ di
β”‚   β”‚   β”œβ”€β”€ DatabaseModule.kt
β”‚   β”‚   └── NetworkModule.kt
β”‚   β”œβ”€β”€ network
β”‚   β”‚   └── ApiClient.kt
β”‚   └── utils
β”‚       β”œβ”€β”€ Constants.kt
β”‚       β”œβ”€β”€ DatastorePreferences.kt
β”‚       β”œβ”€β”€ DiffUtilCallback.kt
β”‚       β”œβ”€β”€ ExtensionUtil.kt
β”‚       β”œβ”€β”€ GsonParser.kt
β”‚       β”œβ”€β”€ JsonParser.kt
β”‚       β”œβ”€β”€ NetworkResult.kt
β”‚       └── ViewUtils.kt
β”œβ”€β”€ data
β”‚   β”œβ”€β”€ local
β”‚   β”‚   β”œβ”€β”€ LocalDataSource.kt
β”‚   β”‚   β”œβ”€β”€ MovieDataDao.kt
β”‚   β”‚   β”œβ”€β”€ MovieDataTypeConverter.kt
β”‚   β”‚   β”œβ”€β”€ MovieInfoDatabase.kt
β”‚   β”‚   └── entity
β”‚   β”‚       β”œβ”€β”€ MovieDataEntity.kt
β”‚   β”‚       └── WatchListEntity.kt
β”‚   β”œβ”€β”€ model
β”‚   β”‚   β”œβ”€β”€ HomeFeedResponse.kt
β”‚   β”‚   β”œβ”€β”€ MovieResponseList.kt
β”‚   β”‚   β”œβ”€β”€ MovieResponseResult.kt
β”‚   β”‚   β”œβ”€β”€ MovieResponseVideoList.kt
β”‚   β”‚   β”œβ”€β”€ MovieResponseVideoResult.kt
β”‚   β”‚   └── WatchProvidersResponse.kt
β”‚   β”œβ”€β”€ remote
β”‚   β”‚   └── RemoteDataSource.kt
β”‚   └── repository
β”‚       β”œβ”€β”€ MovieInfoRepositoryImpl.kt
β”‚       β”œβ”€β”€ SearchInfoRepositoryImpl.kt
β”‚       └── WatchListInfoRepositoryImpl.kt
β”œβ”€β”€ domain
β”‚   β”œβ”€β”€ model
β”‚   β”‚   β”œβ”€β”€ Genre.kt
β”‚   β”‚   β”œβ”€β”€ HomeFeed.kt
β”‚   β”‚   β”œβ”€β”€ MovieList.kt
β”‚   β”‚   β”œβ”€β”€ MovieResult.kt
β”‚   β”‚   β”œβ”€β”€ MovieVideoList.kt
β”‚   β”‚   β”œβ”€β”€ MovieVideoResult.kt
β”‚   β”‚   └── WatchProviders.kt
β”‚   β”œβ”€β”€ repository
β”‚   β”‚   β”œβ”€β”€ MovieInfoRepository.kt
β”‚   β”‚   β”œβ”€β”€ SearchInfoRepository.kt
β”‚   β”‚   └── WatchListInfoRepository.kt
β”‚   └── usecase
β”‚       β”œβ”€β”€ GetMovieInfo.kt
β”‚       β”œβ”€β”€ SearchListInfo.kt
β”‚       └── WatchListInfo.kt
└── presentation
    β”œβ”€β”€ MainActivity.kt
    β”œβ”€β”€ base
    β”‚   └── BaseFragment.kt
    β”œβ”€β”€ details
    β”‚   └── DetailsFragment.kt
    β”œβ”€β”€ home
    β”‚   β”œβ”€β”€ HomeFragment.kt
    β”‚   └── MovieInfoViewModel.kt
    β”œβ”€β”€ intro
    β”‚   └── IntroFragment.kt
    β”œβ”€β”€ search
    β”‚   β”œβ”€β”€ SearchFragment.kt
    β”‚   └── SearchViewModel.kt
    β”œβ”€β”€ splash
    β”‚   └── SplashFragment.kt
    └── watchlist
        β”œβ”€β”€ WatchListFragment.kt
        └── WatchListViewModel.kt

Developed Using πŸ‘¨πŸ»β€πŸ’»

  • Android Architecture Components -Collection of libraries that help you design robust, testable, and maintainable apps.
  • LiveData β€“ Data objects that notify views when the underlying database changes.
  • ViewModel β€“ Stores UI-related data that isn’t destroyed on UI changes.
  • Dagger-Hilt β€“ Standard library to incorporate Dagger dependency injection into an Android application.
  • Retrofit β€“ A type-safe HTTP client for Android and Java.
  • Kotlin Coroutines β€“ For asynchronous and more..
  • Flow β€“ A cold asynchronous data stream that sequentially emits values and completes normally or with an exception.
  • Jetpack DataStore β€“ Jetpack DataStore is a data storage solution that allows you to store key-value pairs. Basically it’s a replacement for SharedPreferences.

Note

Add your TMDB API key in gradle.properties under movieApiKey section..

GitHub

View Github

Leave a Reply

Your email address will not be published. Required fields are marked *