Skip to content
CAI
Software that uses CAICheck a score

daavsnts/my-movies-android

45.6

Weak · 21 September 2026

3.2k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is an Android application for browsing and managing movie information. It integrates with The Movie Database (TMDB) API to fetch trending, popular, and upcoming movies, while also supporting search functionality. The system allows users to save favorite movies to a local database and maintain a personalized user profile with custom images. The architecture employs Hilt for dependency injection, Room for local storage, and Jetpack Compose for the user interface.

Features

Add Favorite Movies screen and ViewModel

A new Favorite Movies screen and associated ViewModel have been added to the app. The FavoriteMoviesScreen composable displays a list of favorite movies, supporting both a full list view and a search-filtered view. The FavoriteMoviesViewModel manages the state for both the full list and the searched results, utilizing Hilt for dependency injection and coroutine exception handling for error states. The screen includes logic to show an empty list warning when no favorites are found.

app/src/main/java/com/daavsnts/mymovies/ui/screens/favoriteMovies · medium confidence

Add Movie Details screen with loading, error, and success states

Users can now view detailed information about a specific movie. This change introduces the MovieDetailsScreen and its corresponding ViewModel, which manage three distinct UI states: a loading state that displays a shimmering placeholder, an error state that shows a message, and a success state that presents the movie's data. The implementation uses Hilt for dependency injection and handles background operations via coroutines.

app/src/main/java/com/daavsnts/mymovies/ui/screens/movieDetails · high confidence

Add Movies screen and ViewModel for browsing and searching movies

Users can now view trending, popular, and upcoming movies in a grid or list, and search for specific titles. This change introduces the MoviesScreen composable and the associated MoviesViewModel, which manages the state for movie lists and search results using Hilt dependency injection and coroutine-based API calls.

app/src/main/java/com/daavsnts/mymovies/ui/screens/movies · medium confidence

Add user profile screen with profile picture, background, and username editing

A new UserProfileScreen and its corresponding ViewModel are introduced, enabling users to view and edit their profile picture, background image, and username. The screen displays user analytics such as the favorite movies quantity and provides UI states for loading, success, and error conditions. Users can select new profile and background images via the gallery, with the ViewModel managing state updates and preferences storage.

app/src/main/java/com/daavsnts/mymovies/ui/screens/userProfile · high confidence

Added network layer for fetching movie data

Users can now browse trending, popular, and upcoming movies, as well as search for titles, via a new network implementation. This change introduces an ApiKeyInterceptor to append the API key to requests and a MoviesApiService that defines endpoints for retrieving movie lists and details from The Movie Database (TMDB) using Retrofit.

app/src/main/java/com/daavsnts/mymovies/data/network · high confidence

Initial app structure and Hilt integration for the main activity

The app now includes the primary entry point, MainActivity, which sets up the Compose UI using the MyMoviesTheme and MyMoviesApp components. The activity is annotated with @AndroidEntryPoint, indicating that dependency injection via Hilt has been integrated into the app's core structure.

app/src/main/java/com/daavsnts/mymovies · high confidence

Initial project setup with Gradle wrapper and Android configuration

The repository now includes the Gradle wrapper scripts (gradlew, gradlew.bat) and a .gitignore file to exclude local build artifacts and IDE settings. A local.properties file has been added to store the Android SDK path and API key, with instructions in the README for developers to configure their local environment.

(repo-wide) · high confidence

Introduce custom color palette, typography, and theme configuration

The app's UI theme is now defined by a new set of custom colors (including MyWhite, MyGreen, MyRed, MyYellow, MyBlack, MyNight, MyDarkGrey, and MyLightGray) and a dedicated Google Sans font family. These are applied via a new MyMoviesTheme composable that configures Material3 color schemes for both light and dark modes, sets the status bar color to match the surface color, and applies the custom typography across headlines and body text.

app/src/main/java/com/daavsnts/mymovies/ui/theme · high confidence

Introduces local storage for favorite movies and internal file management

The app now persists favorite movies in a local Room database, exposing methods to retrieve all favorite movie IDs, count favorites, and check if a movie is marked as favorite. Additionally, a new InternalDirectoryManager is added to handle copying files to the app's internal directory, supporting the storage of user profile images and backgrounds.

app/src/main/java/com/daavsnts/mymovies/data/local · medium confidence

New UI components for movie display and error states

The app introduces a suite of new Composable components in the UI layer to handle movie listings, search, and loading states. This includes a reusable ErrorMessage component for displaying error states, a MissingPoster placeholder for failed image loads, and a CircularProgressBar for displaying vote averages. The existing MovieCard component has been updated to support Loading and Error states via new LoadingMovieCard and ErrorMovieCard composables. Additionally, a SearchBar composable has been added for user input, and the MoviesList and MoviesGrid components now support displaying lists and grids of movies with proper loading and error handling.

app/src/main/java/com/daavsnts/mymovies/ui/screens/composables · high confidence

Behavioural changes

Initial project scaffolding and build configuration

The app module now includes a .gitignore file to exclude build artifacts, a proguard-rules.pro file for code obfuscation configuration, and a gradle-wrapper.properties file that specifies Gradle 8.0 as the build tool version.

app, gradle · high confidence

Introduce Hilt-based dependency injection for core app services

The app now uses Hilt for dependency injection, replacing the previous manual approach. A new AppModule provides key services including the MoviesApiService (configured with an API key interceptor), the NetworkMoviesRepository, and the UserRepository (wrapping local room and DataStore preferences). The MyMoviesApplication class is annotated with @HiltAndroidApp to enable Hilt's code generation.

app/src/main/java/com/daavsnts/mymovies/di · high confidence

Introduce MyMoviesApp with animated navigation and bottom bar

The app now features a new root composable, MyMoviesApp, which integrates a bottom navigation bar and animated navigation graph. This change replaces the previous Surface-based layout with a Scaffold containing a Box for content, utilizing the Accompanist library for animated navigation transitions.

app/src/main/java/com/daavsnts/mymovies/ui · high confidence

Introduced new repository interfaces and data models for movies and user preferences

The application now defines explicit domain interfaces for fetching movie data (trending, popular, upcoming, details, and search) and managing user-specific state (favorite movies and app preferences). These new interfaces are implemented by local and network repository classes that handle data transformation, such as formatting release dates and constructing image URLs, providing a cleaner separation between the domain layer and data sources.

app/src/main/java/com/daavsnts/mymovies/data/repository, app/src/main/java/com/daavsnts/mymovies/domain · high confidence

Introduces ScreenUiState and UI utility functions

The app now uses a sealed interface \ScreenUiState\ to manage screen states, supporting \Success\, \Loading\, and \Error\ (with an optional message) outcomes. Additionally, a new \Utils.kt\ file provides helper functions for image loading and a Compose \shimmerEffect\ modifier for UI animations.

app/src/main/java/com/daavsnts/mymovies/ui/screens · medium confidence

Introduces nested navigation with animated transitions for Movies and Favorites sections

The app now supports nested navigation within the Movies and Favorites screens, allowing users to drill down into movie details and back up seamlessly. This change introduces slide-in and slide-out animation transitions for these nested routes, providing a smoother visual experience when navigating between lists and detail views.

app/src/main/java/com/daavsnts/mymovies/ui/navigation · medium confidence

Test coverage

Added comprehensive Android instrumented tests for core app components; Added unit tests for the MoviesApiService.

Dependencies

Initial project setup with Android, Compose, and Hilt dependencies

The project has been initialized with a new Gradle build configuration, establishing the foundation for an Android application using Kotlin and Jetpack Compose. The setup includes core AndroidX libraries, Jetpack Compose BOM, and specific dependencies for state management (Hilt, ViewModel), networking (Retrofit, Gson, Kotlinx Serialization), local storage (Room, DataStore), image loading (Coil), and UI enhancements (Accompanist, Material Icons). This establishes the technical baseline for the app's architecture.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 49 → 46 (-3.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 98 → 98 (-0.7)
  • Architecture 100 → 95 (-5.0)
  • Maturity 38 → 38 (+0.0)
  • Readiness 24 → 24 (+0.0)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 100 → 77 (-22.9)

Resolved (10)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (13 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/screens/movieDetails/MovieDetailsScreen.kt)
  • Duplicated block (15 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • Duplicated block (21 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • Duplicated block (7 lines × 2) (app/src/main/java/com/daavsnts/mymovies/data/repository/NetworkMoviesRepository.kt)
  • No exposed public API
  • Test reliability not included
  • The installation guide links only to an external codelab and does not show how to build/run locally. (README.md)
  • single-maintainer — knowledge-concentration (bus factor) risk

New (10)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (14 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • Duplicated block (14 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/screens/movieDetails/MovieDetailsScreen.kt)
  • Duplicated block (32 lines × 2) (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • Duplicated block (7 lines × 2) (app/src/main/java/com/daavsnts/mymovies/data/repository/NetworkMoviesRepository.kt)
  • MethodTooLong: NavGraphKt.FavoriteScreenGraph (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • MethodTooLong: NavGraphKt.MoviesScreenGraph (app/src/main/java/com/daavsnts/mymovies/ui/navigation/NavGraph.kt)
  • No ADRs found

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

daavsnts/my-movies-android was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit cc78b816061cf6a685511cd736c0694b0232345d — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.