Drjacky/MVVMTemplate
70.2
Strong · 22 September 2026
3.6k
lines of production code
Kotlin
primary language
7
measurements over time
What this system is
This is an Android application template that demonstrates a modern, modular architecture using Jetpack Compose, Hilt, and Kotlin Coroutines. It provides a complete implementation of a product listing and detail feature, supporting both RxJava and Coroutines data flows. The system includes a standardized build configuration, comprehensive testing utilities, and a UI layer built on Material 3 and Navigation 3.
How it got here
2020 — Modernization and cleanup
9 changes.
This period focused on modernizing the project's architecture and build system. The codebase was refactored to use Hilt for dependency injection, migrated to Kotlin DSL for Gradle configuration, and had all legacy RxJava, Android View, and domain layers removed. Additionally, governance files were added and the Gradle wrapper was significantly upgraded.
2026 — Modernization to Compose and Kotlin Coroutines
15 changes.
The project underwent a comprehensive modernization, migrating the UI to Jetpack Compose with Material 3 and updating the navigation layer to Navigation 3. The architecture was restructured to support both RxJava and Kotlin Coroutines, while the build system was standardized through convention plugins.
Features
Add UI components for loading and error states
The core UI module now includes new composable components for displaying loading and error states. A new \ChooseArrowView.kt\ file introduces an animated arrow component (\ChooseArrowAnimation\) that features a rotating circle with an internal arrow and moving dots. Additionally, \ScreenStates.kt\ provides reusable views for error handling (\ErrorListView\, \ErrorItemView\, \ErrorRowView\) and loading states (\LoadingItemView\), all enhanced with semantic properties for accessibility.
core/ui/src/main/kotlin/app/web/drjackycv/core/ui/view · high confidence
Add project governance and CI infrastructure
The repository now includes standard governance files (CODE\_OF\_CONDUCT.md, CONTRIBUTING.md, and a MIT LICENSE) to define community standards and legal terms. Additionally, a Compose compiler configuration file (compose\_compiler\_config.conf) has been added to manage stability rules, and the Gradle wrapper scripts (gradlew, gradlew.bat) have been updated to the latest version with improved path resolution and error handling.
(repo-wide) · high confidence
Implement dual-threading backends for product listing and single-product retrieval
The core/data module now provides two distinct implementations for fetching product data: a RxJava-based path (using RxPagingSource and RxJava Single/Flowable) and a Kotlin Coroutines-based path (using standard PagingSource and Flow). This allows the application to support both reactive and coroutine-based data flows for listing and fetching individual products, with the repository layer exposing both variants to accommodate different architectural preferences.
core/data · high confidence
Introduce domain layer for product management
The core/domain module now includes a complete domain layer for managing products. This introduces a Product entity, a ProductsListRepository interface supporting both RxJava Flowables and Kotlin Flows, and corresponding use cases for retrieving product lists and individual products. Additionally, the domain layer adds a generic Mapper interface, a Failure sealed class for error handling with retry actions, and StrictMode extension functions to manage thread policies.
core/domain · high confidence
Introduces common Result, DataStore, and error handling utilities
The core/common module now provides a shared Result wrapper for handling success, loading, and error states across the app, including specific handling for network issues like no internet or timeouts. A new DataStoreManager persists and retrieves the user's preferred night mode (light, dark, or system) using AppCompatDelegate constants. Additionally, the module introduces a ReactiveClickException for click handling, a Flow extension for lifecycle-aware collection, and string resources for error messages.
core/common · high confidence
New UI extension utilities for composable modifiers
Added Compose extension functions to simplify common UI patterns. The new \frostedGlass\ modifier applies a semi-transparent background and border that adapts to the current dark mode state, while \clickableOnce\ prevents double-tap issues by tracking click state. Additionally, \fade\ and \shimmer\ modifiers wrap the Accompanist placeholder library to show loading states, and basic utility functions for percentage calculations and Path operations were introduced.
core/ui/src/main/kotlin/app/web/drjackycv/core/ui/extension · medium confidence
New build-logic convention plugins for Android, Compose, and testing
The build system now includes new convention plugins that centralize configuration for Android projects. These include settings for Kotlin/Java 17 compilation, Android SDK and minimum SDK levels, Jetpack Compose setup with optional metrics and reports, JaCoCo code coverage instrumentation, Gradle managed device definitions for testing, and a helper to disable unnecessary Android tests. This refactors the build logic into reusable, modular components.
build-logic/convention/src/main/kotlin/config · high confidence
Removals
Removal of legacy Android View-based presentation layer
The presentation module's entire legacy Android View-based architecture has been removed. This includes the deletion of all base classes for Activities and Fragments, RecyclerView adapters and their associated cell/holder implementations, and the corresponding XML layout files. This change eliminates the old UI implementation, likely as part of a broader migration to a modern UI framework such as Jetpack Compose.
presentation · high confidence
Removed domain layer entities, use cases, and tests
The domain module has removed the entire products feature set, including the \Cluster\, \Clusters\, \Item\, \Product\, and \Products\ entity classes, as well as the \ProductsRepository\ interface and the \GetClusterListUseCase\ and \GetProductDetailUseCase\ use cases. Corresponding unit tests and test utilities have also been deleted, indicating a complete removal of this domain functionality.
domain · high confidence
Architecture
Restructured core module into network, data, and domain submodules
The core module has been reorganized into distinct submodules for network, data, and domain logic. This refactoring improves code organization and separation of concerns within the core layer, making it easier to maintain and extend each functional area independently.
core · high confidence
Behavioural changes
Migrate UI theme to Material 3
The app's visual style has been updated to use Material 3 components. This introduces a new color palette with light and dark modes, updated typography and shape definitions, and enables dynamic color theming on Android 12+ devices.
core/ui/src/main/kotlin/app/web/drjackycv/core/ui/theme · high confidence
Migrate app navigation to Jetpack Compose Navigation 3
The application's navigation layer has been refactored to use the new Navigation 3 API. This change updates the \AppNavigation\ component to utilize \NavDisplay\ and \rememberNavBackStack\ from the \androidx.navigation3\ libraries, replacing the previous implementation. This allows for more robust state management and ViewModel integration within the navigation graph.
app/src/main/kotlin/app/web/drjackycv/mvvmtemplate/navigation · high confidence
Migrate dependency injection from Dagger to Hilt
The project's dependency injection layer has been refactored to use Hilt. The manual \AppComponent\ and custom \ViewModelFactory\ have been removed in favor of Hilt's built-in components and scopes. Existing \@Module\ classes have been updated with \@InstallIn\ annotations to integrate with Hilt's lifecycle, and manual binding of ViewModels and repositories has been replaced with Hilt's \@Provides\ and \@ViewModelScoped\ annotations.
app/src/main/kotlin/app/web/drjackycv/mvvmtemplate/di · high confidence
Migrate network layer to Kotlinx Serialization and RxJava 3
The network module has been refactored to use Kotlinx Serialization instead of Gson for JSON processing, and the codebase has been upgraded from RxJava 2 to RxJava 3. This change introduces new types for handling network responses and errors, and updates the Retrofit configuration to use the new serialization library and RxJava 3 adapters.
core/network · high confidence
Migrate products feature to Material 3 and Navigation3
The products feature has been refactored to use Jetpack Compose with Material 3 components and the new Navigation3 library. This includes a new Choose screen for selecting between RxJava and Coroutines implementations, updated ProductList and ProductDetail screens with improved theming and accessibility, and a restructured navigation graph. The UI now uses Material 3 TopAppBar with frosted glass effects, and the codebase has been reorganized into feature modules with a consistent state management approach using StateFlow.
feature/products/src/main/kotlin/app/web/drjackycv/feature/products · medium confidence
Removed legacy RxJava-based data layer and associated tests
The data module's legacy implementation has been removed, including the \ProductsApi\ interface, \ProductsRemoteDataSource\, repository implementations, and all corresponding unit tests and test factories. This cleanup eliminates the old RxJava 2/3-based architecture, which previously handled product data retrieval and domain mapping, in preparation for a modernized data layer.
data · high confidence
Standardized Android build configuration via convention plugins
The project's build logic has been refactored into a set of convention plugins that standardize how Android application and library modules are configured. This includes automatic setup for Jetpack Compose, Hilt dependency injection, Kotlin serialization, and code coverage via JaCoCo. Additionally, static analysis and linting are now enforced through centralized Detekt and Android Lint convention plugins, ensuring consistent code quality and style across all modules.
build-logic/convention/src/main/kotlin · high confidence
Support for multiple night modes (system, light, dark) via a theme toggle
The main activity now manages a three-state theme selection (light, dark, and system default) using AppCompatDelegate constants, allowing users to explicitly choose their preferred dark mode state. A new theme toggle floating action button is provided in the main activity to cycle through these modes, updating the application's dark mode state accordingly.
app/src/main/kotlin/app/web/drjackycv/mvvmtemplate/main · high confidence
Upgraded StrictMode configuration for debugging
The application's startup now configures StrictMode to detect all thread and VM policy issues during debug builds, including leaked SQLite objects and closable resources, with all violations logged for easier debugging.
app/src/main/kotlin/app/web/drjackycv/mvvmtemplate/application · high confidence
Test coverage
Added core testing utilities for unit testing; Added unit tests for product feature navigation and view models; Updated ExampleUnitTest to use Truth assertions.
Dependencies
Migrate build system to Kotlin DSL and Gradle version catalogs
The project's build configuration has been modernized by replacing Groovy-based build scripts with Kotlin DSL (\.kts\) files and adopting Gradle version catalogs for dependency management. This change introduces a \build-logic\ convention plugin module to centralize plugin and dependency definitions, while the root \settings.gradle\ and \build.gradle\ files are removed in favor of the new structure. Additionally, \gradle.properties\ is updated to enable non-transitive R classes and parallel GC for faster builds.
(dependencies) · high confidence
Updated Gradle wrapper to version 9.5.0
The Gradle wrapper has been upgraded from version 5.6.4 to 9.5.0. This change updates the build tooling used to compile and run the project, which may require a compatible Java version and could affect build performance or compatibility with existing plugins.
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
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 67 → 70 (+3.4)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 99 → 98 (-0.8)
- Architecture 99 → 73 (-25.7)
- Maturity 62 → 63 (+1.9)
- Readiness 70 → 70 (+0.0)
- Security 61 → 92 (+31.6)
Resolved (18)
- Change coupling: ScreenStates.kt ↔ ProductRowView.kt (core/ui/src/main/kotlin/app/web/drjackycv/core/ui/view/ScreenStates.kt)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 3) (feature/products/src/main/kotlin/app/web/drjackycv/feature/products/productlist/ProductsListView.kt)
- Duplicated block (11 lines × 2) (feature/products/src/main/kotlin/app/web/drjackycv/feature/products/productlist/ProductsListView.kt)
- Duplicated block (12 lines × 2) (feature/products/src/main/kotlin/app/web/drjackycv/feature/products/productdetail/ProductDetailView.kt)
- Duplicated block (13 lines × 2) (core/ui/src/main/kotlin/app/web/drjackycv/core/ui/view/ScreenStates.kt)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- No exposed public API
- Off-boarding risk: anonymized user #1
- Test reliability not included
New (19)
- Change coupling: ProductsListRepositoryImpl.kt ↔ ProductsListView.kt (core/data/src/main/kotlin/app/web/drjackycv/core/data/products/repository/ProductsListRepositoryImpl.kt)
- Change coupling: ScreenStates.kt ↔ ProductDetailView.kt (core/ui/src/main/kotlin/app/web/drjackycv/core/ui/view/ScreenStates.kt)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (19 lines × 2) (core/ui/src/main/kotlin/app/web/drjackycv/core/ui/view/ScreenStates.kt)
- Duplicated block (23–24 lines × 2) (feature/products/src/main/kotlin/app/web/drjackycv/feature/products/productdetail/ProductDetailView.kt)
- Duplicated block (9 lines × 2) (core/data/src/main/kotlin/app/web/drjackycv/core/data/products/datasource/ProductsPagingSource.kt)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- MethodTooLong: ProductDetailViewKt.ProductDetailView (feature/products/src/main/kotlin/app/web/drjackycv/feature/products/productdetail/ProductDetailView.kt)
- Workflow token permissions not restricted
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
Drjacky/MVVMTemplate 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 e169f3782b32fd50b2711333d1c2b919bc1a2d1e — 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-821afab8930d.