A leanback-first Android TV app for browsing movies and TV series, powered by The Movie Database (TMDB) API.
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
| 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) |
| 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 |
| 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 |
| WebView (YouTube embed) + external YouTube intent fallback |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
ApplicationComponentinjects API + presenters into fragments - RxJava disposables cleaned up in
onDestroy()/BaseRxPresenter
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
Eight TMDB-powered rows with skeleton loading, pagination, and a dynamic background driven by the focused poster (Palette API).
| Row | Content |
|---|---|
| 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 |
Full-width DetailsOverviewRow with poster, metadata, Watch Trailer action, focusable Genres and Where to Watch chip rows, cast rail, and merged recommendations/similar titles.
Leanback search fragment with debounced TMDB queries, loading skeletons, and instant navigation to detail.
Leanback launcher entry with TV banner and landscape orientation.
- Android Studio Ladybug or newer π
- JDK 17
- Android SDK 36
- TMDB API key (get one here)
git clone https://github.com/halilozel1903/AndroidTVMovieParadise.git
cd AndroidTVMovieParadiseSet 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";./gradlew assembleDebugInstall 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| 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
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 β
TagListRowwith selector drawables (outline only, no zoom flicker) - State cards β Retry / empty / error with
card_focus_borderforeground
Helpers: TvRows, TvFocusHelper, BindableCardView
- TMDB
/videosβ YouTube key viaTrailerHelper PlayerActivityloads YouTube embed in hardware-accelerated WebView- On failure β Open in YouTube (TV or mobile app intent, no immediate
finish())
| App name | Paradise |
| Package | com.halil.ozel.movieparadise |
| Version | 1.5 (versionCode 5) |
| Min SDK | 24 (Android 7.0) |
| Target SDK | 36 |
- How to develop Android TV App? βοΈ
- Android TV Developer Guide πΊ
- Building an Android TV app (Marcus) ποΈ
- Leanback Library π
If this project helped you, consider buying me a coffee:
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.














