charlee-dev/PexWallpapers
50.4
Adequate · 22 September 2026
8.8k
lines of production code
Kotlin
primary language
7
measurements over time
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
Added placeholder feature modules for Favorites, Preview, and Search
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.