Skip to content
CAI
Software that uses CAICheck a score

odaridavid/Clean-MVVM-ArchComponents

60.5

Adequate · 22 September 2026

3.1k

lines of production code

Kotlin

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is an Android application that allows users to search for and view detailed information about characters from the Star Wars universe. The system implements a clean architecture with separate domain, local data, and remote data modules to manage character data, search functionality, and a favorites list persisted via Room. It provides a complete user experience for browsing character details, managing a local favorites collection, and navigating through various app screens with robust testing coverage.

How it got here

2019 — Modularization and test infrastructure

9 changes.

The project underwent a significant architectural refactoring, splitting the codebase into domain and data modules while migrating the dependency injection framework from Dagger to Koin. Concurrently, the team established a robust testing infrastructure by replacing placeholder tests with comprehensive integration tests and helper utilities to ensure reliability.

2020 — Domain layer and feature expansion

18 changes.

This period focused on expanding the application's domain layer with new models, repositories, and use cases to support character details, search, and favorites. The work included implementing local storage for favorites, creating new activities and ViewModels for these features, and establishing a comprehensive unit test suite to verify the new functionality.

Features

Initial project scaffolding and CI configuration

The repository was initialized with essential project files, including a Travis CI configuration (.travis.yml) for Android builds, an Apache 2.0 LICENSE, and a comprehensive README.md documenting the app's clean architecture, libraries, and testing strategy. Additionally, a keystore.properties.sample file was added to guide developers on securing build artifacts, and the .gitignore was updated to exclude sensitive files like .jks and .tar archives.

(repo-wide) · high confidence

Introduces new ViewModels for character details, search, favorites, and base functionality

The app now includes dedicated ViewModels to manage UI state and business logic for specific features. A new BaseViewModel provides a shared coroutine launch helper and exception handling. CharacterDetailViewModel handles loading and displaying character information. DashboardSearchViewModel manages the character search functionality. FavoriteViewModel allows users to save, delete, and check the status of favorite characters. DashboardFavoritesViewModel manages the list of all saved favorites, including deletion of individual or all favorites.

app/src/main/kotlin/com/k0d4black/theforce/viewmodel · high confidence

Introduces new activities and UI components for character details, favorites, and settings

The app adds several new activities and supporting components to enhance the user experience. Users can now view detailed information about characters, including films, species, and planets, via the new CharacterDetailsActivity. A dedicated FavoriteDetailsActivity allows users to view and manage their saved characters. The DashboardActivity has been split to handle search and favorites states more cleanly. Additionally, an AboutActivity displays license information, and a SettingsActivity provides access to it. The introduction of ICharacterDetailsBinder and IFavoritesBinder interfaces standardizes how data is bound to the UI across these new screens.

app/src/main/kotlin/com/k0d4black/theforce/activities · high confidence

Local storage for favorites using Room database

The app now persists favorite characters and their associated films locally using a new Room-based data layer. This includes the database schema, data access objects (DAOs) for inserting, retrieving, and deleting favorites, and a repository that exposes these operations via Kotlin Flows. Mappers handle the conversion between domain models and database entities. The change also introduces a base test class and repository tests to verify the local storage behavior.

data-local · high confidence

New domain models for characters, films, planets, species, and results

The domain layer now includes new data classes to represent core entities: Character, Favorite, Film, Planet, Specie, and a Result enum for operation status. These models provide the structured data types required for the application's domain logic, enabling features like saving favorites and handling success/failure states.

domain/src/main/kotlin/com/k0d4black/theforce/domain/models · high confidence

New domain use cases for favorites and character data

The domain layer introduces a new \BaseUseCase\ interface and a suite of new use cases to support favorites and character data retrieval. Specifically, the app now includes \InsertFavoriteUseCase\, \GetAllFavoritesUseCase\, \GetFavoriteByNameUseCase\, \DeleteFavoriteByNameUseCase\, and \DeleteAllFavoritesUseCase\ to manage local favorite data. Additionally, new use cases \GetFilmsUseCase\, \GetPlanetUseCase\, and \GetSpeciesUseCase\ have been added to fetch character-related details, while \SearchCharactersUseCase\ enables character search functionality.

domain/src/main/kotlin/com/k0d4black/theforce/domain/usecases · high confidence

New remote data layer for character search and details

The app now fetches Star Wars character data from a remote API. This change introduces the remote data source, including API service interfaces, data models, repository implementations for searching and retrieving character details (films, species, planets), and the corresponding unit tests.

data-remote · high confidence

New repository interfaces for character details, search, and favorites

The domain layer now exposes three new repository interfaces: ICharacterDetailsRepository for retrieving character-specific data (planets, species, films), ICharacterSearchRepository for searching characters by name, and IFavoritesRepository for managing a local favorites list (insert, delete, and query operations). These interfaces define the contract for data access in the application's domain layer.

domain/src/main/kotlin/com/k0d4black/theforce/domain/repository · high confidence

New utility extensions for common app functionality

The app introduces a new set of internal utility extensions in the \com.k0d4black.theforce.commons\ package to standardize common behaviors. These include view visibility helpers (\show\, \hide\, \remove\), activity and context extensions for starting activities and displaying snackbars/toasts, network status observation, and data conversion utilities. This refactors shared logic into a centralized commons module, improving code reuse and consistency across the application.

app/src/main/kotlin/com/k0d4black/theforce/commons · high confidence

Architecture

Modularize Android app into domain, data-local, and data-remote modules

The project has been refactored from a single-module structure into a multi-module architecture consisting of ':domain', ':data-local', and ':data-remote' modules. This change introduces new build configuration files (build.gradle) for each module, a centralized 'dependencies.gradle' file to manage library versions and dependencies, and updates to the root build.gradle and settings.gradle to include the new modules. This modularization separates the application's business logic (domain), local data storage (data-local), and remote data fetching (data-remote) into distinct, reusable components.

(dependencies) · high confidence

Behavioural changes

Introduces new presentation models and view states for the favorites and character details features

The app now uses dedicated presentation models (CharacterPresentation, FavoritePresentation, FilmPresentation, PlanetPresentation, SpeciePresentation) and corresponding view states (CharacterDetailsViewState, DashboardFavoritesViewState, DashboardSearchViewState, FavoriteViewState) to manage UI state. This change supports the ability to save and delete favorites from the details screen, as well as splitting the favorite and character details features into distinct state models.

app/src/main/kotlin/com/k0d4black/theforce/models · medium confidence

Migrate dependency injection from Dagger to Koin

The application's dependency injection has been migrated from Dagger to Koin. This change updates the app's initialization process to use Koin's \startKoin\ function to wire up network, view model, local data source, remote data source, and use case modules, replacing the previous Dagger-based setup.

app/src/main/kotlin/com/k0d4black/theforce · high confidence

New adapter implementations using Kiel library

The app introduces new RecyclerView adapters for species, films, search results, and favorites, all implemented using the Kiel library's adapterOf builder. Each adapter defines item comparison logic and view binding, replacing previous manual adapter implementations with a more declarative approach.

app/src/main/kotlin/com/k0d4black/theforce/adapters · medium confidence

New domain-to-presentation and presentation-to-domain mappers for favorites

The app introduces new mapper classes (DomainToPresentation.kt and PresentationToDomain.kt) that handle the conversion between domain models and presentation models, specifically supporting the Favorite entity with its nested character, planet, and specie presentations. This enables the UI to display favorite items with all their associated details, fixing issues where favorites were not working correctly for characters without species.

app/src/main/kotlin/com/k0d4black/theforce/mappers · medium confidence

Restructured dependency injection modules to support separate favorites and search features

The app's dependency injection layer has been refactored into distinct modules for local data, remote data, use cases, and view models. This change introduces specific bindings for favorites management (insert, get, delete) and search operations, enabling the UI to interact with separate ViewModels for the dashboard, favorites list, and character details. Users will experience a more modular architecture that supports adding and removing favorites from the details screen.

app/src/main/kotlin/com/k0d4black/theforce/di · medium confidence

Standardized status bar styling and favorite management across activities

The base activity now enforces a white status bar on Android M and above, ensuring consistent header styling across the app. Additionally, a new base class for favorite-related screens provides built-in support for adding and removing favorites, displaying snackbar notifications, and updating the menu icon to reflect the current favorite state.

app/src/main/kotlin/com/k0d4black/theforce/base · medium confidence

Test suite gains Koin-based fake DI modules

The Android test suite now includes new Koin modules (FakeLocalDataSourceModule and FakeNetworkModule) that provide in-memory Room databases and mock network services for UI tests, replacing previous Dagger-based test dependencies.

app/src/androidTest/kotlin/com/k0d4black/theforce/di · medium confidence

Updated app configuration and ProGuard rules

The app's Google Services configuration was updated to include client details for both the release and debug build variants, enabling Firebase integration for each. Additionally, ProGuard rules were modified to preserve the R class and the main application package, ensuring that library auto-detection and resource references function correctly during minification.

app · high confidence

Test coverage

Add MockTestRunner to stabilize Android tests; Added fake use-case implementations for unit testing; Added integration tests for character details and dashboard screens; Added test helper utilities for Android instrumentation tests; Added test utilities and fixtures for unit testing; Added unit tests for app viewmodels; Added unit tests for utility classes and base test infrastructure; Removed default example test files.

Dependencies

Gradle wrapper updated to version 5.6.4

The Gradle wrapper has been upgraded from version 5.4.1 to 5.6.4. This update ensures that the project uses a newer, supported version of the Gradle build tool, which may include bug fixes, performance improvements, and compatibility updates for the build environment.

gradle · 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 68 → 60 (-7.2)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 99 (-0.6)
  • Architecture 98 → 93 (-5.7)
  • Maturity 66 → 66 (+0.0)
  • Readiness 52 → 47 (-5.3)
  • Security 90 → 78 (-12.2)
  • Domain Modelling 100 → 70 (-30.3)

Resolved (10)

  • Change coupling clique: GetFilmsUseCase.kt, GetPlanetUseCase.kt, GetSpeciesUseCase.kt (domain/src/main/kotlin/com/k0d4black/theforce/domain/usecases/GetFilmsUseCase.kt)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • No exposed public API
  • Rotate the exposed credentials — git history can't be un-committed
  • Secret: gcp-api-key (app/google-services.json)
  • Secret: gcp-api-key (app/google-services.json)
  • Test reliability not included
  • The body is clipped mid-Prerequisite; the outline promises Architecture, Testing, Libraries, Contributors, and Demo sections but none of them appear in the visible text. (README.md)
  • dormant codebase — no living knowledge left to concentrate

New (10)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Duplicated block (10 lines × 2) (app/src/main/kotlin/com/k0d4black/theforce/activities/CharacterDetailsActivity.kt)
  • No ADRs found
  • No SBOM
  • No build provenance
  • No dependency advisory monitoring
  • TodoComment (data-local/src/main/java/com/github/odaridavid/data/local/models/FilmEntity.kt)
  • TodoComment (data-local/src/test/java/com/github/odaridavid/data/local/FavoritesRepositoryTest.kt)
  • bus factor 1 — one contributor carries this repository

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

Survey your own repository

odaridavid/Clean-MVVM-ArchComponents 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 22 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 641213f53fc148b154465727d4c3246194a11542 — 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-90d5d2fe38ee.