Skip to content
CAI
Software that uses CAICheck a score

princessdharmy/FootballFixturesApp

47.0

Weak · 22 September 2026

2.7k

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 system is an Android application for browsing sports competitions and fixtures, structured around a clean architecture with distinct core, domain, data, and feature modules. It leverages AndroidX Navigation for screen management and employs a local caching strategy using Room to store and retrieve competition, team, and player data. The app exposes business logic through domain use cases that fetch data from a repository, supporting offline access and background updates.

Features

Added core application infrastructure and dependency injection setup

The core module now includes the foundational application class (MainApplication) that initializes the Dagger-based dependency injection container (CoreComponent). This component wires up the application context, the Room-based database (FootballDatabase), and the CompetitionsRepository, enabling the rest of the app to access these dependencies through the DI framework. Additionally, standard Android build configuration files (.gitignore, proguard-rules) and unit/instrumented tests have been added to support the new structure.

core · medium confidence

Added use cases for fetching competition players, standings, and team details

New domain use cases have been introduced to retrieve competition-related data: GetPlayersUseCase, GetTableUseCase, and GetTeamUseCase. These components wrap calls to the CompetitionsRepository to fetch player lists, league standings, and team information respectively, exposing the data through a consistent NetworkStatus interface.

domain/src/main/java/com/example/domain/usecases/competitiondetails · medium confidence

Initial domain layer structure and repository interfaces

The domain module has been initialized with a new directory structure, including an AndroidManifest, ProGuard rules, and test scaffolding. The core addition is the CompetitionsRepository interface, which defines the domain's contract for fetching match, competition, standings, team, and player data, establishing the foundation for the application's business logic layer.

domain · high confidence

Initial navigation graph setup for bottom navigation and view pager

The navigation module now includes the foundational navigation graphs for the application's bottom navigation bar and a view pager. The bottom navigation graph defines the start destination as 'Today's Fixture' and includes a route to the 'Competitions' section, which can navigate to competition details. Additionally, a separate navigation graph is introduced for the view pager, allowing the 'ViewPagerFragment' to receive competition data as an argument. This establishes the structural routing for these UI components.

navigation · high confidence

Introduce domain entities, mappers, and presentation layer for competition details

The app now defines a set of domain entities for matches, competitions, teams, players, and standings, alongside corresponding data models in the presentation layer. A new bottom sheet UI displays a team's squad, while viewmodels and mappers bridge the domain and presentation layers. Utility functions for date formatting and network status have been updated to use the new models, and the codebase has been refactored to use coroutines and Flow for asynchronous data handling.

presentation · high confidence

Introduce domain use cases for fetching competition and fixture data

Added new domain use cases (GetCompetitionsUseCase and GetTodayFixturesUseCase) that retrieve competition and fixture data from the local database via the CompetitionsRepository, exposing the results as Kotlin Flows.

domain/src/main/java/com/example/domain/usecases/competition · medium confidence

Introduced modularized competition details feature with tabbed navigation

The competition details functionality has been restructured into a new \features/competitiondetails\ module, separating the UI, data binding, and dependency injection (Dagger) from the main application. Users can now view competition information through a tabbed interface (using ViewPager) that displays the standings table, upcoming fixtures, and team rosters. The implementation includes dedicated fragments for each tab, a bottom sheet for team details, and a view model module for dependency injection.

features/competitiondetails · high confidence

Introduced the Competitions feature module

Added a new Competitions feature module containing the UI for browsing competitions and viewing today's fixtures. This includes the CompetitionsFragment and TodayFixturesFragment, their respective adapters, and layout files. The module also includes Dagger 2 dependency injection components and view model bindings to support the feature's data flow.

features/competitions · high confidence

Shared UI and utility components moved to common module

The \common\ module now contains shared Android components, including base \Activity\ and \Fragment\ classes for consistent UI behavior, utility classes for network status and constants, and a set of drawable resources and string resources. This refactoring centralizes reusable UI logic and assets, allowing other modules to leverage these shared implementations.

common · high confidence

Behavioural changes

Centralized dependency and version management in buildSrc

The buildSrc module now includes a centralized Kotlin file (Dependencies.kt) that defines all third-party library coordinates and their corresponding version numbers. This includes dependencies for AndroidX components (AppCompat, Core KTX, Fragment, Navigation, Room), networking libraries (Retrofit, OkHttp, Moshi), and testing tools (Espresso, JUnit). By consolidating these values, the project ensures consistent versions across all modules and simplifies future updates.

buildSrc · high confidence

Gradle build tool upgraded to version 6.1.1

The Gradle wrapper has been updated from version 4.10.1 to 6.1.1. This upgrade brings the project's build system to a newer version of Gradle, which may introduce changes in build behavior, plugin compatibility, and task execution.

gradle · high confidence

Introduced local caching for competition data

The data layer now implements a local database cache for competition data using Room. The \CompetitionsRepositoryImpl\ utilizes a \networkBoundResource\ pattern that first queries the local database and then fetches fresh data from the remote API, saving the response to the local store. This allows the application to serve cached data while updating the database in the background, improving responsiveness and supporting offline access to competition information.

data · high confidence

Migrated HomeActivity to AndroidX Navigation Component

The app's main activity has been refactored to use the AndroidX Navigation Component for managing screen transitions. This replaces the previous manual FragmentTransaction-based navigation with a declarative approach using NavController, enabling features like automatic back-stack handling and deep linking. The old Dagger-based Activity and Fragment providers, along with the legacy Repository and ViewModel classes, have been removed as part of this architectural shift.

app/src · high confidence

Dependencies

Migrate Android project to multi-module architecture with centralized dependency management

The project has been refactored from a single-module structure into a multi-module architecture, introducing distinct modules for core, data, domain, presentation, and feature-specific components (competitions, competition details). Build configuration is now centralized in a shared 'commons.gradle' script, and all module dependencies are managed through a shared 'Libraries' and 'AndroidLibraries' catalog, replacing individual versioned dependency declarations in each module's build.gradle file. The app module now depends on these internal modules rather than directly declaring third-party libraries.

(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 41 → 47 (+5.8)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 100 (-0.1)
  • Architecture 100 → 95 (-5.3)
  • Maturity 42 → 40 (-1.8)
  • Readiness 24 → 36 (+11.7)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 38 → 45 (+6.3)

Resolved (6)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (11 lines × 2) (presentation/src/main/java/com/example/presentation/mappers/Mapper.kt)
  • No exposed public API
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (6)

  • 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 (13 lines × 2) (presentation/src/main/java/com/example/presentation/mappers/Mapper.kt)
  • No ADRs found
  • TodoComment (common/src/main/java/com/example/common/utils/glide/SvgDecoder.kt)

Architecture

  • Containers 0 added · 0 removed · contexts 2 added · 0 removed · edges 2 added · 0 removed

Added bounded contexts (2)

  • competitiondetails
  • domain

Added dependency edges (2)

  • competitiondetails → presentation (coupling)
  • presentation → domain (coupling)

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

Survey your own repository

princessdharmy/FootballFixturesApp 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 2e5e64a084af5e3d64ecd97087c176185287605a — 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.