[Compose] Content v4 - #170
Conversation
Introduces a Discover screen (genre/year/rating/keyword filters) for movies and TV, a region/country preference (onboarding + Account setting + OkHttp interceptor) so results and watch-provider listings reflect the user's selected country, a People tab for browsing popular cast/crew, and a Movies/Shows toolbar overflow menu exposing both. Also makes Movies/Shows paging reactive to region changes.
Enriches the movie/show details screen with Season/Episode browsing, user ratings (with TMDB sync), Awards/Box Office/Studios/Gallery/ Keywords/Franchise-collection sections, certifications, an offline error state with retry, haptic feedback on watched/watchlist/rating interactions, and a Links footer (official site, IMDb, socials). Also widens video results to non-English titles and sorts them so an actual trailer leads instead of a clip or blooper.
Adds create/view/delete custom TMDB lists and add/remove items from them, background sync of local watched/watchlist/rating state with the user's TMDB account, and fixes two logout bugs: the confirmation dialog now follows the app theme (previously a View-system dialog) with correct button roles, and local logout state is no longer gated behind the server-side session-revoke call succeeding.
Adds a "mark watched" tap target directly on Watchlist widget items (no need to open the app), and a new home-screen widget listing watched-but-unrated titles as a quick nudge to rate them. Both widgets now refresh together whenever local watch/watchlist state changes. Also shortens the Watchlist widget's title from "Filmy Watchlist" to just "Watchlist".
Long-pressing a poster in any grid (Movies, Shows, etc.) now flips it to reveal watchlist/watched toggle buttons reflecting current state, with haptic feedback and a close button - no need to open the details screen just to mark something. Also adds a small bounce animation on the details screen's watchlist button when toggled.
…imation Replaces the plain onboarding background with a continuously scrolling backdrop of trending posters (built on an infinite LazyColumn rather than a fragile duplicate-list marquee, so it never runs out of content or flickers), fading into a minimal bottom panel that shows the detected country - resolved via IP geolocation in the background - and opens the existing region picker dialog to confirm or change it. Also deletes the old View-system app-intro flow it replaces (AppIntro library dependency, its four intro fragments/activity, layouts, and drawables) and the dead pre-Compose MainActivity that launched it, plus the AppIntro license entry from the OSS licenses screen.
My Lists and the details screen's "Add to List" action require a TMDB login, but previously gave no indication why nothing happened when logged out. Both now show a login prompt whose CTA starts the OAuth flow directly on that same screen - once it completes, the original action (loading lists, opening the add-to-list sheet) picks up automatically, no need to navigate away and back. Also makes every screen's profile state reactive to the same local `profile` table, so a login or logout completed on one screen (e.g. Account) is reflected immediately on every other open screen too.
Three unrelated fixes bundled together: the full-screen photo gallery now pads correctly under edge-to-edge and no longer has pinch-zoom intercepting the swipe-to-dismiss gesture at 1x scale; the "My Lists" launcher shortcut no longer points at a dead activity, routing through FilmyApp's start-destination logic instead; and the Account screen's login progress bar no longer spins forever when the Custom Tab is closed without completing login, since login progress is now tracked centrally in LoginViewModel and cleared on every failure path (not just success) - the Custom Tab also now opens full screen instead of a peeked bottom sheet.
… to cast/crew details The person details screen previously showed movie and TV credits as separate lists and had no error state - a failed fetch just spun forever since there's no local cache to fall back on for person data. Now fetches combined movie+TV credits (deduped, sorted by popularity, each showing the person's character or job as a subtitle), adds an external links section (IMDb, socials, homepage), a proper error widget with retry, and a skeleton loader while loading. Tapping a credit now routes to movie or TV details based on that credit's own type, since a combined list can no longer assume one or the other.
Search previously failed silently on a network error (blank list, no indication anything went wrong), gave no "no results" feedback, and could crash with a duplicate-key exception since movie and TV ids share a numeric namespace. Person results were also broken: no avatar (the DTO only mapped poster_path, not profile_path) and tapping one opened it as a movie. Adds a proper error state with retry, a distinct no-results message, and a recent-searches list (persisted locally, tap to repeat, clear individually or all) shown when the query is empty. Person results now show a circular avatar and route to the cast/crew details screen. Also fixes the search field's cursor jumping to the start on recent- search taps (it was using a deprecated InputField overload decoupled from the backing TextFieldState), adds a clear button, and stops pressing the keyboard's search action from collapsing back to the Movies/Shows screen.
Adds a shared Throwable.toUserMessage() mapper (no internet, timeout, server error, generic fallback) and wires it into every screen that was previously showing a raw exception message on network failure (Discover, Movies, Shows, People, Search, and the shared paginated list's load-more error state). Also adds a poster-shaped placeholder for images that fail to load across poster tiles, search results, and the details screen header. Beyond that: fixes the movie/show details error and loading states having no way back (added a back arrow, matching the loaded state's position); fixes the search bar's field cursor/rotating-placeholder polish; adds a scroll-aware collapsing header to Movies/Shows so the branding row tucks away on scroll down and returns on scroll up while the search bar stays pinned; and mutes the error message text color so it reads as secondary next to the retry button.
There was a problem hiding this comment.
🟡 Changes recommended
There are confirmed build-/runtime-blocking issues in the changed code paths (invalid Kotlin string templating and legacy details activity fetch logic being commented out while still referenced), plus high-risk destructive Room migration configuration.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR advances the Filmy Android app toward a Jetpack Compose–first architecture by introducing a Compose-based main activity, new Compose navigation routes/components, and modernized paging/data flows (including region-aware content), while also updating widget infrastructure and refactoring parts of the local data model.
Changes:
- Migrates entrypoint/navigation to Compose (new
MainActivityCompose, newAppRoute/bottom-nav infrastructure, multiple new Compose screens/components). - Expands paging/data layer capabilities (new paging sources, preview mappers, new API/helper endpoints, new models for discover/people/keywords/ratings/providers, region preference plumbing).
- Updates widgets/resources/themes and refactors legacy screens and Room entities/DAOs to align with the new flows.
File summaries
| File | Description |
|---|---|
| settings.gradle | Adds foojay toolchain resolver plugin. |
| gradle.properties | Adjusts Gradle JVM args and Android/AGP feature flags. |
| build.gradle | Bumps Kotlin/Google services and adds Compose plugin classpath. |
| app/src/main/res/xml/filmy_widget_info.xml | Updates watchlist widget sizing/metadata. |
| app/src/main/res/xml/filmy_to_rate_widget_info.xml | Adds new “to rate” widget provider info. |
| app/src/main/res/xml-v25/shortcuts.xml | Points shortcut intent to MainActivityCompose. |
| app/src/main/res/values/themes.xml | Updates splash screen icon/theme handoff. |
| app/src/main/res/values/ids.xml | Adds preference_fragment_container id. |
| app/src/main/res/values-v31/themes.xml | Removes v31 splash override (consolidation). |
| app/src/main/res/values-v27/themes.xml | Removes v27 splash override (deleted). |
| app/src/main/res/values-night-v31/themes.xml | Removes night v31 splash override (deleted). |
| app/src/main/res/values-night-v27/themes.xml | Removes night v27 splash override (deleted). |
| app/src/main/res/layout/top_navigation_layout.xml | Updates custom view class reference. |
| app/src/main/res/layout/top_navigation_item_content.xml | Updates tools parentTag class reference. |
| app/src/main/res/layout/fragment_intro.xml | Removes legacy intro layout (deleted). |
| app/src/main/res/layout/fragment_intro_fragment_d.xml | Removes legacy intro layout (deleted). |
| app/src/main/res/layout/fragment_intro_fragment_c.xml | Removes legacy intro layout (deleted). |
| app/src/main/res/layout/fragment_intro_fragment_b.xml | Removes legacy intro layout (deleted). |
| app/src/main/res/drawable/title_skeleton.xml | Converts skeleton from shape to vector. |
| app/src/main/res/drawable/poster_error_placeholder.xml | Adds poster error placeholder vector. |
| app/src/main/res/drawable/movie_skeleton.xml | Converts skeleton from shape to vector. |
| app/src/main/res/drawable/icon_skeleton.xml | Converts skeleton from shape to vector. |
| app/src/main/java/tech/salroid/filmy/utility/PreferenceHelper.kt | Adds selected-country flow + recent searches + theme setter. |
| app/src/main/java/tech/salroid/filmy/utility/IpGeolocation.kt | Adds best-effort IP-based country lookup. |
| app/src/main/java/tech/salroid/filmy/utility/ImageConfig.kt | Centralizes TMDB image base URL. |
| app/src/main/java/tech/salroid/filmy/utility/Extensions.kt | Adds money formatting, HTML parsing, sharing, URL/trailer helpers, user-facing error mapping. |
| app/src/main/java/tech/salroid/filmy/utility/DateFormatterUtil.kt | Adds release-date formatting helper. |
| app/src/main/java/tech/salroid/filmy/ui/widget/WidgetRefresher.kt | Adds Glance widget refresh helper. |
| app/src/main/java/tech/salroid/filmy/ui/widget/WidgetActions.kt | Adds Glance action callback to mark watched. |
| app/src/main/java/tech/salroid/filmy/ui/theme/Type.kt | Adds Compose typography setup with custom fonts. |
| app/src/main/java/tech/salroid/filmy/ui/textvalidation/TextProcessingViewModel.kt | Adds (commented-out) sample VM code. |
| app/src/main/java/tech/salroid/filmy/ui/textvalidation/TextProcessingScreen.kt | Adds (commented-out) sample Compose screen. |
| app/src/main/java/tech/salroid/filmy/ui/shows/TvShowsPreviewMapper.kt | Maps TV show entities to Compose preview models. |
| app/src/main/java/tech/salroid/filmy/ui/shows/ShowsViewModel.kt | Adds Compose Shows VM with paging + region-reactive refresh + quick actions. |
| app/src/main/java/tech/salroid/filmy/ui/shows/ShowsScreenState.kt | Adds Shows screen UI state sealed class. |
| app/src/main/java/tech/salroid/filmy/ui/shows/ShowsRoute.kt | Adds Shows route wiring for Compose screen. |
| app/src/main/java/tech/salroid/filmy/ui/shows/components/ShowList.kt | Adds paginated list Composable for shows. |
| app/src/main/java/tech/salroid/filmy/ui/shows/components/ShowItem.kt | Adds show preview list item Composable. |
| app/src/main/java/tech/salroid/filmy/ui/settings/LicenseScreen.kt | Converts license UI to Compose. |
| app/src/main/java/tech/salroid/filmy/ui/settings/LicenseActivity.kt | Hosts LicenseScreen via setContent. |
| app/src/main/java/tech/salroid/filmy/ui/settings/AboutActivity.kt | Switches About activity to Compose screen host. |
| app/src/main/java/tech/salroid/filmy/ui/season/SeasonViewModel.kt | Adds VM to fetch season details. |
| app/src/main/java/tech/salroid/filmy/ui/search/SearchViewModelLegacy.kt | Introduces legacy search VM implementation for fragments. |
| app/src/main/java/tech/salroid/filmy/ui/search/SearchScreenState.kt | Adds Compose search UI state model. |
| app/src/main/java/tech/salroid/filmy/ui/search/SearchPreviewMapper.kt | Maps search results to Compose previews. |
| app/src/main/java/tech/salroid/filmy/ui/search/SearchFragment.kt | Wires fragment to SearchViewModelLegacy. |
| app/src/main/java/tech/salroid/filmy/ui/search/component/SearchList.kt | Adds Compose search results list. |
| app/src/main/java/tech/salroid/filmy/ui/reviews/ReviewsListScreen.kt | Adds Compose full reviews list screen. |
| app/src/main/java/tech/salroid/filmy/ui/people/PeopleViewModel.kt | Adds VM for people paging. |
| app/src/main/java/tech/salroid/filmy/ui/onboarding/OnboardingViewModel.kt | Adds onboarding poster backdrop + IP country detection. |
| app/src/main/java/tech/salroid/filmy/ui/onboarding/AnimatedPosterBackdrop.kt | Adds animated infinite poster backdrop Composable. |
| app/src/main/java/tech/salroid/filmy/ui/movies/MoviesViewModel.kt | Adds Compose Movies VM with paging + region-reactive refresh + quick actions. |
| app/src/main/java/tech/salroid/filmy/ui/movies/MoviesScreenState.kt | Adds Movies screen UI state sealed class. |
| app/src/main/java/tech/salroid/filmy/ui/movies/MoviesRoute.kt | Adds Movies route wiring for Compose screen. |
| app/src/main/java/tech/salroid/filmy/ui/movies/MoviePreviewMapper.kt | Maps movie entities to Compose preview models. |
| app/src/main/java/tech/salroid/filmy/ui/movies/Dummy.kt | Adds preview dummy models. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/TrailerSection.kt | Adds Compose trailers section UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/StudiosSection.kt | Adds Compose studios section UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/SeasonsSection.kt | Adds Compose seasons section UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/ReviewSection.kt | Adds Compose reviews section UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/RateMediaSheet.kt | Adds Compose rating bottom sheet UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/MediaSection.kt | Adds Compose similar/recommendations UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/KeywordsSection.kt | Adds Compose keywords chip grid. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/FullReadSheet.kt | Adds Compose full-read bottom sheet. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/CommonDetails.kt | Adds shared Compose details components/helpers. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/CollectionTeaserRow.kt | Adds “part of a collection” teaser UI. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/BoxOfficeSection.kt | Adds budget/revenue details section. |
| app/src/main/java/tech/salroid/filmy/ui/movies/details/components/AwardsSection.kt | Adds awards details section. |
| app/src/main/java/tech/salroid/filmy/ui/movies/components/MoviesList.kt | Adds paginated list Composable for movies. |
| app/src/main/java/tech/salroid/filmy/ui/movies/components/MovieItem.kt | Adds movie preview list item Composable. |
| app/src/main/java/tech/salroid/filmy/ui/lists/MyListsViewModel.kt | Adds VM for TMDB lists (create/delete/load). |
| app/src/main/java/tech/salroid/filmy/ui/lists/ListDetailsViewModel.kt | Adds VM for list details + optimistic removal. |
| app/src/main/java/tech/salroid/filmy/ui/intro/IntroFragmentD.kt | Removes legacy intro fragment (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/intro/IntroFragmentC.kt | Removes legacy intro fragment (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/intro/IntroFragmentB.kt | Removes legacy intro fragment (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/intro/IntroFragmentA.kt | Removes legacy intro fragment (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/intro/FilmyIntroActivity.kt | Removes legacy intro activity (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/home/TvFragment.kt | Updates fragment to use legacy search VM class. |
| app/src/main/java/tech/salroid/filmy/ui/home/MoviesFragment.kt | Updates fragment to use legacy search VM class. |
| app/src/main/java/tech/salroid/filmy/ui/home/MainActivityCompose.kt | Adds new Compose-based main activity entrypoint. |
| app/src/main/java/tech/salroid/filmy/ui/home/MainActivity.kt | Removes legacy view-binding main activity (deleted). |
| app/src/main/java/tech/salroid/filmy/ui/home/LoginLauncher.kt | Adds reusable Compose OAuth launcher for TMDB login. |
| app/src/main/java/tech/salroid/filmy/ui/gallery/GalleryViewModel.kt | Adds VM for gallery images loading. |
| app/src/main/java/tech/salroid/filmy/ui/franchise/FranchiseViewModel.kt | Adds VM for collection/franchise details. |
| app/src/main/java/tech/salroid/filmy/ui/discover/DiscoverViewModel.kt | Adds discover VM with filters/genres + paging flows. |
| app/src/main/java/tech/salroid/filmy/ui/discover/DiscoverRoute.kt | Adds discover route wiring for Compose screen. |
| app/src/main/java/tech/salroid/filmy/ui/details/TvDetailsActivity.kt | Updates watch-provider model access + watched naming. |
| app/src/main/java/tech/salroid/filmy/ui/details/MovieDetailsActivity.kt | Updates watched naming, watch provider model access, and disables some fetch calls (legacy). |
| app/src/main/java/tech/salroid/filmy/ui/component/FilmyTopNavigationBarItem.kt | Removes unused imports and adjusts commented styling hooks. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/WatchProvidersUiModel.kt | Adds watch providers UI models for Compose. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/StudioUiModel.kt | Adds studio UI model. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/SeasonUiModel.kt | Adds season UI model. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/ReviewUiModel.kt | Adds review UI models. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/RatingUiModel.kt | Adds ratings UI model + rating sources enum. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/PaletteColors.kt | Adds palette colors model for dynamic styling. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/MediaDetailsUiState.kt | Adds consolidated media-details UI state model. |
| app/src/main/java/tech/salroid/filmy/ui/common/model/DetailsActions.kt | Adds action callbacks container for details screens. |
| app/src/main/java/tech/salroid/filmy/ui/common/icons/MoreUp.kt | Adds vector icon as ImageVector. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/LoginRequiredDialog.kt | Adds Compose login-required dialog. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/LoadingWidget.kt | Adds Compose loading indicator widget. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/ErrorWidget.kt | Adds Compose error UI widget. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/CountryPicker.kt | Adds Compose country picker list + filtering. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/CategorySelector.kt | Adds Compose dropdown category selector. |
| app/src/main/java/tech/salroid/filmy/ui/common/components/AppBranding.kt | Adds Compose app branding header component. |
| app/src/main/java/tech/salroid/filmy/ui/collections/CollectionViewModel.kt | Adds placeholder file noting redundancy. |
| app/src/main/java/tech/salroid/filmy/ui/collections/CollectionTypeFragment.kt | Renames “favorites” collection type to watched and updates logic. |
| app/src/main/java/tech/salroid/filmy/ui/collections/CollectionsFragment.kt | Updates collections tab icon; retains legacy tab wiring. |
| app/src/main/java/tech/salroid/filmy/ui/cast_crew/PersonSkeletonLoader.kt | Adds Compose shimmer loader for person screen. |
| app/src/main/java/tech/salroid/filmy/ui/cast_crew/CastCrewViewModel.kt | Adds combined credits/external IDs + error state tracking. |
| app/src/main/java/tech/salroid/filmy/ui/adapters/CollectionsPagerAdapter.kt | Updates pager to show watched tab first. |
| app/src/main/java/tech/salroid/filmy/ui/adapters/CastCrewAdapter.kt | Minor formatting tweak. |
| app/src/main/java/tech/salroid/filmy/di/AppModule.kt | Adds region query interceptor and switches Room to destructive fallback; adds SharedPreferences provider. |
| app/src/main/java/tech/salroid/filmy/data/network/MoviesApiHelper.kt | Expands Movies API helper interface (discover/people/keywords/IDs/images/etc.). |
| app/src/main/java/tech/salroid/filmy/data/network/AccountApiHelper.kt | Expands Account API helper interface (favorites/watchlist/lists/ratings/rated). |
| app/src/main/java/tech/salroid/filmy/data/model/TvShowPreview.kt | Adds immutable TV preview model for Compose. |
| app/src/main/java/tech/salroid/filmy/data/model/SearchPreview.kt | Adds immutable search preview model for Compose. |
| app/src/main/java/tech/salroid/filmy/data/model/MoviePreview.kt | Adds immutable movie preview model for Compose. |
| app/src/main/java/tech/salroid/filmy/data/local/model/watch_providers/WatchProviderResults.kt | Removes static per-country watch-provider results model (deleted). |
| app/src/main/java/tech/salroid/filmy/data/local/model/watch_providers/WatchProviderResponse.kt | Changes watch providers to Map<String, WatchProviderCountry>. |
| app/src/main/java/tech/salroid/filmy/data/local/model/Videos.kt | Adds videos response models. |
| app/src/main/java/tech/salroid/filmy/data/local/model/TvShow.kt | Makes id non-nullable. |
| app/src/main/java/tech/salroid/filmy/data/local/model/TvKeywordsResponse.kt | Adds TV keywords response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/tv/TvDetails.kt | Adds trailers/videos fields to TV details. |
| app/src/main/java/tech/salroid/filmy/data/local/model/tv/SeasonDetailsResponse.kt | Adds season details response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/tv/Episode.kt | Adds episode model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/SearchResult.kt | Makes id non-nullable and adds multi-search fields. |
| app/src/main/java/tech/salroid/filmy/data/local/model/ReleaseDatesResponse.kt | Adds movie release dates/certification models. |
| app/src/main/java/tech/salroid/filmy/data/local/model/Person.kt | Adds people response and known-for models. |
| app/src/main/java/tech/salroid/filmy/data/local/model/MovieKeywordsResponse.kt | Adds movie keywords response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/Keyword.kt | Adds keyword model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/ImagesResponse.kt | Adds images response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/ExternalIdsResponse.kt | Adds external IDs model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/discover/GenreResponse.kt | Adds genres response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/discover/DiscoverSort.kt | Adds discover sorting enum. |
| app/src/main/java/tech/salroid/filmy/data/local/model/discover/DiscoverFilters.kt | Adds discover filters data class. |
| app/src/main/java/tech/salroid/filmy/data/local/model/ContentRatingsResponse.kt | Adds TV content ratings/certification models. |
| app/src/main/java/tech/salroid/filmy/data/local/model/CombinedCreditsResponse.kt | Adds combined credits models for person pages. |
| app/src/main/java/tech/salroid/filmy/data/local/model/collection/CollectionMovie.kt | Adds collection part movie model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/collection/CollectionDetailsResponse.kt | Adds collection details response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/WatchlistRequest.kt | Adds watchlist request body model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/TmdbStatusResponse.kt | Adds TMDB status response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/TmdbListsResponse.kt | Adds lists response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/TmdbListDetailsResponse.kt | Adds list details response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/TmdbList.kt | Adds list summary model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/RatingRequest.kt | Adds rating request model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/RatedResponse.kt | Adds rated-items response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/ListItemRequest.kt | Adds list item request model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/FavoriteRequest.kt | Adds favorite request body model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/CreateListResponse.kt | Adds create-list response model. |
| app/src/main/java/tech/salroid/filmy/data/local/model/account/CreateListRequest.kt | Adds create-list request model. |
| app/src/main/java/tech/salroid/filmy/data/local/db/FilmyDatabase.kt | Bumps Room DB version to 5. |
| app/src/main/java/tech/salroid/filmy/data/local/db/entity/MovieDetails.kt | Renames favorite→watched and adds videos/userRating fields. |
| app/src/main/java/tech/salroid/filmy/data/local/db/dao/MovieDetailsDao.kt | Switches list queries to Flow and adds watched/rated queries. |
| app/src/main/java/tech/salroid/filmy/data/local/db/dao/AccountDao.kt | Adds Flow-based profile query. |
| app/src/main/java/tech/salroid/filmy/data/local/db/Converters.kt | Adds Videos type converters. |
| app/src/main/java/tech/salroid/filmy/data/datasource/TvShowsPagingSource.kt | Fixes nextKey calculation using total pages. |
| app/src/main/java/tech/salroid/filmy/data/datasource/PeoplePagingSource.kt | Adds paging source for popular people. |
| app/src/main/java/tech/salroid/filmy/data/datasource/MoviesPagingSource.kt | Fixes nextKey calculation using total pages. |
| app/src/main/java/tech/salroid/filmy/data/datasource/DiscoverTvPagingSource.kt | Adds discover TV paging source. |
| app/src/main/java/tech/salroid/filmy/data/datasource/DiscoverMoviesPagingSource.kt | Adds discover movies paging source. |
| app/src/main/java/tech/salroid/filmy/core/navigation/TopLevelDestination.kt | Adds Compose bottom-tab destination definitions. |
| app/src/main/java/tech/salroid/filmy/core/navigation/AppRoute.kt | Adds Compose route model for screens/graphs. |
| app/src/main/java/tech/salroid/filmy/core/navigation/AppNavigationBar.kt | Adds Compose bottom navigation bar component. |
| app/src/main/AndroidManifest.xml | Switches launcher to MainActivityCompose, updates widgets/receivers, enables back callback. |
Review details
- Files reviewed: 218/239 changed files
- Comments generated: 10
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| value >= 1_000_000_000 -> String.format(Locale.getDefault(), "$%.1fB", value / 1_000_000_000) | ||
| value >= 1_000_000 -> String.format(Locale.getDefault(), "$%.1fM", value / 1_000_000) | ||
| value >= 1_000 -> String.format(Locale.getDefault(), "$%.1fK", value / 1_000) | ||
| else -> "$$value" |
| }.flowOn(Dispatchers.Main).collect { result -> | ||
| viewModelScope.launch(Dispatchers.Main) { | ||
| result.results | ||
| .let { | ||
| _uiStateSearchResult.emit(it) | ||
| } | ||
| } | ||
| } |
| // Get Reviews | ||
| viewModel.getReviews(movieId) | ||
| //viewModel.getReviews(movieId) | ||
|
|
||
| // Get Watch Providers | ||
| viewModel.getWatchProviders(movieId) | ||
| //viewModel.getWatchProviders(movieId) |
| val request = if (original.url.host == "api.themoviedb.org") { | ||
| val country = appPref.getString(PreferenceHelper.COUNTRY_KEY, null) ?: "US" | ||
| original.newBuilder() | ||
| .url(original.url.newBuilder().addQueryParameter("region", country).build()) |
| "filmy" | ||
| ).build() | ||
| ) | ||
| .fallbackToDestructiveMigration(true) |
| binding.breathingProgress.visibility = View.VISIBLE | ||
| } | ||
| viewModel.getMovieDetails(movieId, type) | ||
| // viewModel.getMovieDetails(movieId, type) |
| val watchProviderStream = watchProviderResponse.results["IN"]?.flatrate?.firstOrNull() | ||
| val watchProviderBuy = watchProviderResponse.results["IN"]?.buy?.firstOrNull() | ||
| val watchProviderRent = watchProviderResponse.results["IN"]?.rent?.firstOrNull() |
| val watchProviderStream = watchProviderResponse.results["IN"]?.flatrate?.firstOrNull() | ||
| val watchProviderBuy = watchProviderResponse.results["IN"]?.buy?.firstOrNull() | ||
| val watchProviderRent = watchProviderResponse.results["IN"]?.rent?.firstOrNull() |
| @@ -37,7 +37,7 @@ class CollectionsFragment : Fragment() { | |||
| 0 -> { | |||
| tab.text = getString(R.string.favorite) | |||
| import java.time.LocalDate | ||
| import java.time.format.DateTimeFormatter | ||
|
|
||
| fun formateReleaseDate(raw: String): String { |
This pull request introduces significant updates to the app's architecture, dependencies, and navigation, focusing on a migration to Jetpack Compose, improved paging support, and enhanced widget and navigation infrastructure. The main changes include switching to a Compose-based main activity, adding new navigation and paging source classes, updating dependencies, and revising the AndroidManifest for new widgets and Compose integration.
Migration to Jetpack Compose & Navigation Overhaul:
MainActivityComposeand added Compose-specific plugins and dependencies, enabling Compose features and UI components throughout the app (app/build.gradle,AndroidManifest.xml). [1] [2]AppRoute,AppNavigationBar, andTopLevelDestinationto organize and manage navigation graphs and bottom navigation tabs (AppRoute.kt,AppNavigationBar.kt,TopLevelDestination.kt). [1] [2] [3]Paging and Data Layer Improvements:
DiscoverMoviesPagingSource.kt,DiscoverTvPagingSource.kt,PeoplePagingSource.kt). [1] [2] [3]MoviesPagingSourceto properly handle total pages and next key calculation, preventing over-fetching (MoviesPagingSource.kt).Dependency and Build System Updates:
app/build.gradle). [1] [2]compileSdkandtargetSdkto 37 (app/build.gradle). [1] [2]Widget and Manifest Changes:
WatchlistWidgetReceiverand addedToRateWidgetReceiverfor improved widget support, updating their exported status and associated XML resources (AndroidManifest.xml). [1] [2]enableOnBackInvokedCallbackfor improved back navigation handling (AndroidManifest.xml). [1] [2]These changes collectively modernize the app's UI, navigation, and data handling, laying the groundwork for a fully Compose-based experience and improved maintainability.