Skip to content
CAI
Software that uses CAICheck a score

charlee-dev/PexWallpapers

50.4

Adequate · 22 September 2026

8.8k

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, searching, and managing wallpapers. It provides features for discovering curated content, searching with pagination, and saving favorites. The app allows users to set wallpapers on the home or lock screen and supports automated background changes via scheduled tasks. The architecture is modular, separating UI, data, and domain logic across distinct feature and shared modules.

How it got here

2021 — Modular architecture and feature implementation

23 changes.

The project underwent a significant structural transformation, migrating from a monolithic setup to a modular architecture with distinct feature, data, and domain layers. This period saw the implementation of core application features, including home, search, favorites, and automation capabilities, alongside the establishment of project governance and build configurations.

2022 — Compose UI and settings feature expansion

5 changes.

This period focused on expanding the application's user interface with a comprehensive suite of new Compose-based components and layout utilities. Concurrently, the codebase introduced a new Settings feature for managing wallpaper and display options, supported by core Kotlin utilities for state and resource management. The work also included updating test coverage for the home feature.

Features

Added Favorites feature with UI and ViewModel

Users can now view and manage their favorite wallpapers. This change introduces the Favorites feature, including a new FavoritesScreen that displays a list of favorite wallpapers, and a FavoritesViewModel to handle favorite status updates and reset operations. The feature includes a 'No favorites yet' state and allows users to toggle favorites and clear all favorites.

_feature\favorites/src · high confidence

Added Wallpaper domain model

The domain layer now includes a new Wallpaper data class that defines the structure for wallpaper items, including fields for image URLs, dimensions, photographer, and favorite status.

domain · high confidence

Added automated wallpaper changing feature

The feature\_automation module now includes the complete implementation for automatic wallpaper changes. This includes the core \AutomationManager\ and its \AutomationManagerImpl\ which schedules and manages background \WorkManager\ tasks for downloading, saving, and setting wallpapers. The feature is supported by dedicated \Worker\ classes (\AutoChangeWallpaperWork\, \BackupCurrentWallpaperWork\, \DownloadAndSaveWallpaperWork\) and \BroadcastReceivers\ (\ActionRestoreReceiver\, \OnDismissReceiver\) that handle user interactions like restoring previous wallpapers or dismissing notifications. Additionally, the module provides Hilt dependency injection via \AutomationModule\ and defines the necessary notification channels and UI strings.

_feature\automation · high confidence

Added build configuration files for the feature\_settings module

The feature\_settings module now includes standard build configuration files: a .gitignore to exclude build artifacts, and consumer-rules.pro and proguard-rules.pro files to configure code shrinking and obfuscation for the module.

_feature\settings · high confidence

Added core Kotlin utilities for data and event handling

New Kotlin source files were added to the core module, introducing a generic DataState sealed class for managing data, loading, and error states, an Event sealed class for UI notifications like error messages and snackbars, and a Resource sealed class for tracking loading progress and success/error conditions. Additionally, a networkBoundResource function was added to handle fetching, caching, and observing data from a network source while managing loading states.

core/src · high confidence

Added data layer with Room database, DAOs, and network service

Introduced the data module containing the core data layer for the application. This includes the Room database setup (WallpaperDatabase) with entities for wallpapers, curated content, and search results, along with their respective Data Access Objects (DailyDao, SearchDao, WallpapersDao). The module also provides the PexService for network requests and utility classes for constants and extensions. Additionally, comprehensive Android test coverage was added, including test runners, coroutine rules, and specific tests for the database operations.

data/src · high confidence

Added image management and wallpaper setting capabilities

The feature\_image module now includes the core logic for managing and setting wallpapers. This includes an ImageManager for saving, retrieving, and deleting local image backups, as well as a WallpaperSetter to apply images to the home and lock screens. The implementation uses Dagger Hilt for dependency injection and declares the necessary Android permissions in the manifest.

_feature\image · high confidence

Added new Compose UI components and layout utilities

The app now includes a suite of new Compose-based UI components, including PexAnimatedHeart, CategoryTitle, CoilImage, HalfButton, ImageActionButtons, LoadingErrorText, MenuListItem, Neumorphic shadow effects, PexButton, PexExpandableAppBar, PexExpandableCard, PexSurface, PexScaffold, PexSnackBar, and a StaggeredVerticalGrid layout. These additions provide new interactive elements, visual styles (such as neumorphic shadows and animated transitions), and structural layouts for the user interface.

components/src/main/kotlin · high confidence

The application structure has been updated to include new feature modules for Favorites, Preview, and Search. Each of these modules now includes standard Android build configuration files, specifically .gitignore, consumer-rules.pro, and proguard-rules.pro, establishing the foundational build and obfuscation settings for these new components.

_feature\_favorites, feature\_preview, feature\search · high confidence

Added preview screen with wallpaper animation and set-wallpaper controls

The feature\_preview module now includes a new PreviewScreen that displays a wallpaper card with interactive animations, including a preview mode that triggers flash and wipe transitions. The screen also provides a SetWallpaperButton component that allows users to set the wallpaper on the home or lock screen, with animated state changes and split-button interactions.

_feature\preview/src/main/kotlin · high confidence

Added project governance and licensing documents

The repository now includes a Code of Conduct, a Contributing guide, and an MIT License file, establishing the community standards, contribution process, and legal terms for the project.

(repo-wide) · high confidence

Added search feature with paging and UI components

Users can now search for wallpapers using a new search interface. This includes a search screen with a toolbar for entering queries, a view model to manage search state and results, and a repository layer that fetches paginated search results from the network and caches them in a local database. The implementation uses Android's Paging 3 library with a RemoteMediator to handle data loading and caching, and the UI displays search results in a scrollable list with support for favorites and pull-to-refresh.

_feature\search/src · high confidence

New Home screen with curated and daily wallpapers

The Home screen now displays curated and daily wallpapers, along with a horizontal panel of color categories. Users can browse curated collections, view daily recommendations, and filter by color. The screen supports pull-to-refresh, favorites management, and includes error and loading states for a smooth experience.

_feature\home/src/main · high confidence

New feature\_home module structure

A new 'feature\_home' module has been introduced to the codebase, establishing a dedicated location for the Home Screen functionality. This change includes the creation of the module directory with standard configuration files such as .gitignore, consumer-rules.pro, and proguard-rules.pro, which define build and optimization rules specific to this feature.

_feature\home · medium confidence

New settings feature with automated wallpaper and screen change options

The Settings feature has been introduced, allowing users to configure notification preferences, automate wallpaper changes on the home or lock screen, and manage data-saving and performance options like shadows and parallax effects. The implementation includes a new Room database to persist these settings, a Hilt module for dependency injection, and a Compose-based UI with reusable components such as a duration picker and toggle rows. Users can now enable or disable automated wallpaper changes, select specific screens for changes, and reset all settings to their defaults.

_feature\settings/src/main/kotlin · medium confidence

Architecture

Modularizes app into feature, data, and shared modules

The project has been restructured from a flat or monolithic setup into a modular architecture. The diff shows the creation of new Gradle build files for distinct modules: base, components, core, data, domain, test\_utils, and several feature modules (home, search, favorites, settings, preview, image, automation). The app module now depends on these new modules, and the settings.gradle.kts file has been updated to include all these new subprojects. This change improves code organization and separation of concerns.

(dependencies) · high confidence

Behavioural changes

Added component-level ProGuard and build configuration files

The components directory now includes a .gitignore file to exclude build artifacts, an empty consumer-rules.pro file, and a proguard-rules.pro file containing default ProGuard configuration comments. These additions support the modularization of the app by establishing standard build and obfuscation configurations for the components module.

components · high confidence

Centralized dependency management for Compose, Hilt, and testing

The build configuration has been refactored to centralize dependency declarations. The previous approach of referencing modules via a \Modules\ object and using \project()\ references has been replaced with a structured \Dependencies\ object. New helper functions now explicitly manage dependencies for core Android components, Jetpack Compose, Hilt, network libraries (Retrofit, OkHttp), persistence (Room), and various testing frameworks (JUnit 5, MockK, Turbine). This change simplifies the build script and ensures consistent dependency versions across the application.

buildSrc/src/main/kotlin/commons · high confidence

Migrate networking, persistence, and test dependencies

The project's build configuration has been updated to replace the Ktor and SQLDelight dependencies with Retrofit, Gson, OkHttp, and Room. Additionally, the test suite has been expanded to include JUnit 5, Mockito, and Hilt testing libraries, while Gradle and Kotlin versions have been adjusted.

buildSrc/src/main/kotlin/dependencies · medium confidence

Migrated CoroutinesTestRule to Kotlin and relocated to test\_utils

The CoroutinesTestRule utility has been renamed to CoroutineTestRule and migrated from Java to Kotlin, moving from the test-shared module to the test\_utils module. The class now implements TestCoroutineScope to simplify coroutine cleanup via the updated API.

_test\utils · medium confidence

New base infrastructure for view models and dispatchers

The base module now provides a shared abstract BaseViewModel that handles common UI states (snackbars, toasts, refresh status, scroll-to-top) and event dispatching via Kotlin Flows and Channels. A Dagger Hilt module registers an @IoDispatcher for coroutine execution, and extension functions are added to the base package to support ViewModel operations and list manipulation.

base/src · medium confidence

Rebuilt app shell with Compose navigation and automation controls

The app's main entry point and UI structure have been completely reworked. The legacy Java-based MainActivity and Material 3 theme files were replaced with a new Kotlin-based MainActivity that hosts a Compose-based PexApp. This new app shell integrates a bottom navigation bar, a navigation graph for Home, Search, Favorites, and Settings, and connects to a MainViewModel that manages wallpaper automation, sharing, and download workflows. Additionally, the AndroidManifest was updated to register the new Application class, FileProvider, and background receivers required for the new architecture.

app/src · high confidence

Restructured base module with new ProGuard rules and gitignore

The base module was reorganized: ProGuard configuration rules were added to the base module, and the .gitignore file was moved from the test-shared directory to the base directory.

base · medium confidence

Restructured build configuration and module definitions

The build system has been reorganized to improve modularity and configuration management. The minimum Android SDK has been raised from 23 to 26, and Java 1.8 has been explicitly configured as the target Java version. The project's module structure has been updated, with feature modules now following a 'feature\_' prefix convention (e.g., :feature\_home) and shared/test utilities reorganized. Additionally, the build script now centrally defines Gradle plugin versions and applies default Maven repository sources (Google, Maven Central, Gradle Plugin Portal, and JitPack).

buildSrc/src/main/kotlin · high confidence

Updated .gitignore and ProGuard configuration

The app's .gitignore file has been expanded to exclude additional IDE and build artifacts, and the ProGuard rules file now references the correct build.gradle.kts.kts.kts configuration path.

app · medium confidence

Updated data module configuration files

The data module now includes a .gitignore file to exclude build artifacts, along with new consumer-rules.pro and proguard-rules.pro files to configure code shrinking and obfuscation for the module.

data · medium confidence

Test coverage

Moved and updated unit tests for the home feature; Updated Android instrumented test for the home feature.

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

Lenses

  • Code Health 99 → 98 (-1.2)
  • Architecture 96 → 93 (-2.8)
  • Maturity 62 → 62 (+0.0)
  • Readiness 24 → 24 (+0.0)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 70 → 71 (+1.0)

Resolved (23)

  • Boundary-crossing change coupling: FavoritesScreen.kt ↔ PrivacyScreen.kt (feature_favorites/src/main/kotlin/com/adwi/feature_favorites/ui/FavoritesScreen.kt)
  • Boundary-crossing change coupling: HomeScreen.kt ↔ PrivacyScreen.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Boundary-crossing change coupling: Neumorphic.kt ↔ SettingsScreen.kt (components/src/main/kotlin/com/adwi/components/Neumorphic.kt)
  • Change coupling: AutoChangeWallpaperWork.kt ↔ DownloadAndSaveWallpaperWork.kt (feature_automation/src/main/kotlin/com/adwi/tool_automation/workers/AutoChangeWallpaperWork.kt)
  • Change coupling: Dependencies.kt ↔ Versions.kt (buildSrc/src/main/kotlin/dependencies/Dependencies.kt)
  • Change coupling: HomeScreen.kt ↔ CategoryListHorizontalPanel.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Change coupling: HomeScreen.kt ↔ DailyWallpaper.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Change coupling: NotificationUtil.kt ↔ AutoChangeWallpaperWork.kt (feature_automation/src/main/kotlin/com/adwi/tool_automation/util/NotificationUtil.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 × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (12 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableCard.kt)
  • Duplicated block (12 lines × 2) (feature_settings/src/main/kotlin/com/adwi/feature_settings/ui/components/DurationPicker.kt)
  • Duplicated block (14 lines × 2) (app/src/main/kotlin/com/adwi/pexwallpapers/ui/navigation/Navigation.kt)
  • Duplicated block (14 lines × 2) (components/src/main/kotlin/com/adwi/components/PexButton.kt)
  • Duplicated block (15 lines × 2) (components/src/main/kotlin/com/adwi/components/Neumorphic.kt)
  • Duplicated block (16 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (17 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (18 lines × 3) (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Duplicated block (19 lines × 2) (feature_preview/src/main/kotlin/com/adwi/feature_preview/ui/PreviewScreen.kt)
  • …and 3 more

New (26)

  • Boundary-crossing change coupling: FavoritesScreen.kt ↔ HomeScreen.kt (feature_favorites/src/main/kotlin/com/adwi/feature_favorites/ui/FavoritesScreen.kt)
  • Boundary-crossing change coupling: FavoritesScreen.kt ↔ SearchScreen.kt (feature_favorites/src/main/kotlin/com/adwi/feature_favorites/ui/FavoritesScreen.kt)
  • Boundary-crossing change coupling: FavoritesScreen.kt ↔ SettingsScreen.kt (feature_favorites/src/main/kotlin/com/adwi/feature_favorites/ui/FavoritesScreen.kt)
  • Boundary-crossing change coupling: HomeScreen.kt ↔ SearchScreen.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Boundary-crossing change coupling: HomeScreen.kt ↔ SettingsScreen.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Boundary-crossing change coupling: PreviewScreen.kt ↔ SettingsScreen.kt (feature_preview/src/main/kotlin/com/adwi/feature_preview/ui/PreviewScreen.kt)
  • Boundary-crossing change coupling: WallpaperListVerticalPanel.kt ↔ SearchScreen.kt (feature_home/src/main/kotlin/com/adwi/feature_home/ui/components/WallpaperListVerticalPanel.kt)
  • 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 (11 lines × 2) (feature_settings/src/main/kotlin/com/adwi/feature_settings/ui/components/DurationPicker.kt)
  • Duplicated block (13–15 lines × 2) (app/src/main/kotlin/com/adwi/pexwallpapers/ui/navigation/Navigation.kt)
  • Duplicated block (15 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableCard.kt)
  • Duplicated block (16 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (17 lines × 2) (components/src/main/kotlin/com/adwi/components/Neumorphic.kt)
  • Duplicated block (19 lines × 3) (feature_home/src/main/kotlin/com/adwi/feature_home/ui/HomeScreen.kt)
  • Duplicated block (27–28 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (31 lines × 2) (components/src/main/kotlin/com/adwi/components/PexExpandableAppBar.kt)
  • Duplicated block (35 lines × 2) (components/src/main/kotlin/com/adwi/components/PexButton.kt)
  • MethodTooLong: DailyWallpaperKt.DailyWallpaper (feature_home/src/main/kotlin/com/adwi/feature_home/ui/components/DailyWallpaper.kt)
  • …and 6 more

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

Survey your own repository

charlee-dev/PexWallpapers 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 82ac2bdff8b4a4e700e74efa443205b9cadbe9de — 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.