odaridavid/Clean-MVVM-ArchComponents
60.5
Adequate · 22 September 2026
3.1k
lines of production code
Kotlin
primary language
7
measurements over time
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.