Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

165 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Paradise πŸ“ΊπŸŽ¬

A leanback-first Android TV app for browsing movies and TV series, powered by The Movie Database (TMDB) API.

Paradise TV Banner

Platform Language Min SDK Target SDK License


Overview 🧭

Paradise is a remote-friendly entertainment catalog for Android TV, Google TV, and Android STB devices. It combines the AndroidX Leanback browse/details pattern with TMDB metadata, poster art, cast discovery, genre exploration, watch-provider hints, and inline trailer playback.

The app is built for the 10-foot UI: D-pad navigation, focus-driven scrolling, shared-element poster transitions, skeleton loading states, and retryable error rows.

πŸ“– Related article: How to develop an Android TV app


Features ✨

Area What you get
🏠 Home 8 paginated rows β€” 4 movie + 4 TV sections with infinite horizontal scroll
🎬 Movies Now Playing, Top Rated, Popular, Upcoming
πŸ“‘ TV Series On The Air, Airing Today, Popular TV, Top Rated TV
πŸ”Ž Search Live movie search via SearchSupportFragment
🏷️ Genres Focusable genre chips β†’ filtered movie grid
πŸ“œ Details Overview, rating, runtime, director, Watch Trailer, genres, watch providers, cast, recommendations
πŸ‘€ Cast Person detail with portrait/backdrop images, filmography (Movies & Series rows)
▢️ Trailers WebView embed + Open in YouTube fallback for Android TV
🎨 UX Skeleton loaders, empty states, retry cards, dynamic palette-based hero background
🎯 Focus Google TV–aligned Leanback focus (1.05Γ— zoom + glow), chip outline rows for tags

Tech Stack πŸ› οΈ

Layer Libraries
🧱 UI AndroidX Leanback, AppCompat, CardView, Palette, SplashScreen
🌐 Networking Retrofit 3, OkHttp 5, Gson
⚑ Async RxJava 3, RxAndroid
πŸ–ΌοΈ Images Glide 5
πŸ’‰ DI Dagger 2
▢️ Playback WebView (YouTube embed) + external YouTube intent fallback

Architecture πŸ—οΈ

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Activities                                                  β”‚
β”‚  MainActivity Β· SearchActivity Β· MediaDetailActivity        β”‚
β”‚  PersonDetailActivity Β· GenreMoviesActivity Β· PlayerActivity  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Fragments (Leanback)                                        β”‚
β”‚  MainFragment Β· SearchFragment Β· DetailFragment              β”‚
β”‚  TvDetailFragment Β· PersonDetailFragment Β· GenreMoviesFragmentβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                 β–Ό                 β–Ό
   Presenters        RowLoadingHelper    TheMovieDbAPI
   CardViews         UiStateItem         (Retrofit)
   TagListRow        RecommendationRowHelper
  • MVP on browse/search/genre flows (MainContract, SearchContract, GenreMoviesContract)
  • Presenter / ViewHolder pattern for Leanback rows and cards
  • Dagger ApplicationComponent injects API + presenters into fragments
  • RxJava disposables cleaned up in onDestroy() / BaseRxPresenter

Key packages πŸ“¦

com.halil.ozel.movieparadise
β”œβ”€β”€ data/           # TMDB API + models
β”œβ”€β”€ dagger/         # App-wide DI graph
β”œβ”€β”€ ui/
β”‚   β”œβ”€β”€ main/       # Browse home + pagination
β”‚   β”œβ”€β”€ search/     # Voice/text search
β”‚   β”œβ”€β”€ detail/     # Movie detail, cast, tags, trailers
β”‚   β”œβ”€β”€ tv/         # TV show detail
β”‚   β”œβ”€β”€ genre/      # Genre-filtered grid
β”‚   β”œβ”€β”€ person/     # Cast member detail
β”‚   β”œβ”€β”€ player/     # Trailer WebView
β”‚   β”œβ”€β”€ common/     # Loading/error/empty cards
β”‚   └── base/       # Focus helpers, Glide, palette utils

Screens πŸ“Έ

🏑 Home β€” Browse rows

Eight TMDB-powered rows with skeleton loading, pagination, and a dynamic background driven by the focused poster (Palette API).

Home Screen

Row Content
▢️ Now Playing Currently in theatres
πŸ” Top Rated Highest-rated movies
πŸ₯³ Popular Trending movies
πŸ”œ Upcoming Soon-to-release movies
πŸ“‘ On The Air TV shows airing now
πŸ“… Airing Today Episodes today
πŸ“Ί Popular TV Trending series
⭐ Top Rated TV Highest-rated series

Now Playing β€” Focus

Top Rated

Popular

Upcoming


πŸ“œ Detail β€” Movies & Series

Full-width DetailsOverviewRow with poster, metadata, Watch Trailer action, focusable Genres and Where to Watch chip rows, cast rail, and merged recommendations/similar titles.

Detail Overview

Detail Metadata

Recommendations

Cast Row


πŸ”Ž Search

Leanback search fragment with debounced TMDB queries, loading skeletons, and instant navigation to detail.

Search Input

Search Results

Search β†’ Detail


πŸ“Ί Android TV launcher

Leanback launcher entry with TV banner and landscape orientation.

Android TV


Getting Started πŸš€

Requirements

  • Android Studio Ladybug or newer 🐘
  • JDK 17
  • Android SDK 36
  • TMDB API key (get one here)

1. Clone

git clone https://github.com/halilozel1903/AndroidTVMovieParadise.git
cd AndroidTVMovieParadise

2. Configure API key πŸ”‘

Set your TMDB key in app/src/main/java/com/halil/ozel/movieparadise/Config.java:

public static final String API_KEY_URL = "YOUR_TMDB_API_KEY";

3. Build & run ▢️

./gradlew assembleDebug

Install on an Android TV emulator or device with LEANBACK_LAUNCHER support. All dependencies resolve from Maven Central β€” no extra repositories required.

adb install app/build/outputs/apk/debug/app-debug.apk

TMDB Integration 🌐

Endpoint Usage
/movie/* Home rows, detail, recommendations, videos, providers
/tv/* TV rows, show detail, credits, recommendations, videos
/search/movie Search screen
/discover/movie Genre filtering
/person/* Cast detail, images, filmography

Documentation: https://www.themoviedb.org/documentation/api


TV Focus System 🎯

Focus behavior follows Google TV focus guidelines:

  • Poster cards β€” Leanback FocusHighlight.ZOOM_FACTOR_SMALL (1.05Γ—) + white glow (lb_default_brand_color)
  • Genre / provider chips β€” TagListRow with selector drawables (outline only, no zoom flicker)
  • State cards β€” Retry / empty / error with card_focus_border foreground

Helpers: TvRows, TvFocusHelper, BindableCardView


Trailer Playback ▢️

  1. TMDB /videos β†’ YouTube key via TrailerHelper
  2. PlayerActivity loads YouTube embed in hardware-accelerated WebView
  3. On failure β†’ Open in YouTube (TV or mobile app intent, no immediate finish())

Project Info ℹ️

App name Paradise
Package com.halil.ozel.movieparadise
Version 1.5 (versionCode 5)
Min SDK 24 (Android 7.0)
Target SDK 36

Resources πŸ“š


Support β˜•

If this project helped you, consider buying me a coffee:

Buy Me A Coffee


License πŸ“„

MIT License

Copyright (c) 2023 Halil OZEL

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Releases

Sponsor this project

Packages

Contributors

Languages