akoufa/CoolWeather
65.6
Adequate · 22 September 2026
1.3k
lines of production code
Kotlin
primary language
7
measurements over time
What this system is
This is an Android application for tracking weather conditions in user-saved cities. It allows users to search for and save locations, view current weather data fetched from the OpenWeatherMap API, and customize temperature display units. The system is structured using Clean Architecture with a modular design, leveraging Hilt for dependency injection and Room for local data persistence.
How it got here
2017 — Project initialization and architecture migration
7 changes.
The project was initialized with a new Apache 2.0 license and a Clean Architecture structure using Hilt for dependency injection. Legacy MVP code and Java-based tests were removed in favor of modern Kotlin, AndroidX, and Coroutines-based testing infrastructure.
2018–2019 — Architecture modernization and feature expansion
17 changes.
This period focused on modernizing the app's architecture by introducing Hilt for dependency injection, implementing a clean architecture with domain and data layers, and adding new features such as temperature unit preferences and local place storage. The work also included centralizing dependency management and establishing robust error handling and state management patterns.
Features
Add Event wrapper for one-time LiveData events
Added a new \Event\ class in the core module to wrap data for one-time events, providing \consume()\ and \peek()\ methods to manage state and prevent duplicate handling.
app/src/main/java/com/akoufatzis/coolweather/core · high confidence
Add OpenWeatherMap API integration and data models
The app now integrates with the OpenWeatherMap API to fetch current weather data for a given city. This includes new Kotlin data classes (CityWeatherDto, MainDto, WeatherDto, WindDto) annotated for Moshi serialization, and a Retrofit API interface (OpenWeatherMapApi) to retrieve weather information by city name.
app/src/main/java/com/akoufatzis/coolweather/data/openweathermap · high confidence
Add main screen with city list and weather details
The app now features a main screen that displays a list of saved cities. Users can swipe horizontally to view weather details for each city, and an empty state screen is shown if no cities are saved.
app/src/main/java/com/akoufatzis/coolweather/presentation/main · high confidence
Add places search and selection UI
A new places feature has been added to the app, allowing users to search for and select locations. This includes a PlacesFragment for the UI, a PlacesAdapter for the list, and a PlacesViewModel to handle search logic and state. The implementation uses Hilt for dependency injection and observes search results to update the UI.
app/src/main/java/com/akoufatzis/coolweather/presentation/places · high confidence
Add settings data store for temperature unit preferences
A new SettingsDataStore implementation has been added to persist the user's temperature unit preference (Celsius or Fahrenheit) using Android's SharedPreferences. This provides the data layer support for the Settings feature, allowing the application to remember and retrieve the user's chosen temperature unit.
app/src/main/java/com/akoufatzis/coolweather/data/settings · high confidence
Add settings feature for temperature unit selection
Users can now change their preferred temperature unit (Celsius or Fahrenheit) via a new Settings feature. This includes domain models (Settings, TemperatureUnit), a repository interface (SettingsRepository), and use cases (GetSettingsUseCase, GetTemperatureUnitUnitUseCase, ChangeTemperatureUnitUseCase) to manage and update these preferences.
domain/src/main/java/com/akoufatzis/coolweather/domain/settings · high confidence
Add temperature unit settings
Users can now change the temperature unit between Celsius and Fahrenheit in the new Settings screen. This change introduces the SettingsFragment, SettingsViewModel, and related state classes to manage and persist the user's temperature unit preference.
app/src/main/java/com/akoufatzis/coolweather/presentation/settings · high confidence
Adds core presentation utilities and data-binding helpers
The app introduces several new utility classes in the presentation layer to support UI interactions and data binding. A new DataBindingAdapter abstract class and its associated ViewHolder simplify RecyclerView item binding, while a BindingAdapters object provides a standard setImageResource adapter. Additional core utilities include ViewUtils for managing text change events via Kotlin flows and hiding the soft keyboard, and Utis for loading JSON from assets and parsing it with Moshi.
app/src/main/java/com/akoufatzis/coolweather/presentation/core · high confidence
Introduce local place storage via new database schema
A new Room database layer has been added to persist user-saved places locally. This includes a new AppDatabase class, a PlaceDao for insert and load operations, and a PlaceEntity model that stores a place's name, externalId, and country, enabling the app to remember places between sessions.
app/src/main/java/com/akoufatzis/coolweather/data/database · high confidence
Introduce place management domain logic
Added domain-layer components to manage user-saved places: a new Place data class, a PlacesRepository interface for storing and observing places, and corresponding UseCases (GetPlaces, SearchPlaces, StorePlace) to interact with the repository.
domain/src/main/java/com/akoufatzis/coolweather/domain/place · high confidence
Introduce weather data layer with repository and mappers
The app now includes a new data layer for weather information, introducing a WeatherDataStore that fetches weather data from the OpenWeatherMap API and maps the response into domain models via a new WeatherDataMapper. This change establishes the foundation for retrieving and storing weather conditions, replacing previous ad-hoc data handling with a structured repository pattern.
app/src/main/java/com/akoufatzis/coolweather/data/weather · high confidence
Introduce weather display screen with temperature unit support
Added a new weather presentation layer including a Fragment, ViewModel, and state classes to display weather data. The implementation supports displaying temperature in either Celsius or Fahrenheit, with the UI updating based on the user's selected temperature unit.
app/src/main/java/com/akoufatzis/coolweather/presentation/weather · high confidence
Introduces a generic Result type for handling success and failure states
A new generic Result type has been added to the domain layer, providing a consistent way to handle success and failure states. This includes Success and Failure data classes, along with map functions to transform data within the Result wrapper, enabling more robust error handling in the application's domain logic.
domain/src/main/java/com/akoufatzis/coolweather/domain · high confidence
Project initialization and tooling setup
The project was initialized with a new Apache 2.0 license, a README documenting the Clean Architecture and Hilt-based structure, and an .editorconfig to enforce Kotlin code style. Development tooling was added, including a ktlint Gradle script for checking and formatting Kotlin code, and the Gradle wrapper scripts were updated to improve cross-platform compatibility and argument handling.
(repo-wide) · high confidence
Behavioural changes
Added default Detekt configuration and updated ProGuard rules
The app module now includes a default Detekt configuration file (default-detekt-config.yml) that defines static analysis rules for code complexity, formatting, and empty blocks. Additionally, the ProGuard rules file (proguard-rules.pro) was updated to remove legacy comments and align with the new proguardFiles setting in build.gradle.kts.
app · high confidence
Introduce Hilt-based dependency injection for core app modules
The app now uses Hilt for dependency injection, replacing the previous manual or Dagger-based setup. This change introduces new DI modules for application context, Room database, OpenWeatherMap API integration, place data storage, and user settings. Users benefit from a more robust and maintainable architecture that supports features like saving city preferences, fetching weather data, and storing user settings.
app/src/main/java/com/akoufatzis/coolweather/di · high confidence
Introduce domain models and repository for weather data
The domain layer now includes a new Weather model that structures temperature, pressure, humidity, and wind data, alongside a WeatherType enum for conditions. A WeatherRepository interface and WeatherUseCase have been added to fetch weather data by place name, returning a Result wrapper for error handling.
domain/src/main/java/com/akoufatzis/coolweather/domain/weather · high confidence
Local place search via embedded city data
The app now searches for places using a local JSON file (city-list.json) included in the app assets, rather than relying on an external SDK. The new PlacesDataStore loads this data to provide place search functionality, storing and retrieving place information via a local database.
app/src/main/java/com/akoufatzis/coolweather/data/places · high confidence
Removed MVP architecture and legacy code
The application's MVP (Model-View-Presenter) architecture has been removed. This includes the deletion of all MVP-related classes, such as the \MvpPresenter\ interface, \BasePresenter\ base class, \SearchContract\, and the \SearchPresenter\. Additionally, legacy components like the \MainApplication\ (Dagger setup), \MainActivity\ navigation, and various utility classes (e.g., \WeatherUtils\, \RxUtils\) have been removed from the codebase.
app/src/main/java/com/akoufatzis/weatherappclean · high confidence
Updated Gradle wrapper to version 6.2.2
The Gradle wrapper has been updated from version 3.3 to 6.2.2. This upgrade brings the project's build system to a newer version of Gradle, which may affect build performance, compatibility with newer Android Gradle Plugin versions, and the availability of new build features.
gradle · high confidence
Test coverage
Added unit tests for WeatherViewModel and test infrastructure; Updated Android instrumented test suite.
Dependencies
Centralized dependency and version management for Android build configuration
The buildSrc module now defines a centralized catalog of dependency versions and library coordinates in Kotlin, including Android Gradle Plugin 4.0.0, Kotlin 1.3.70, and various AndroidX, Hilt, and testing libraries. This change replaces ad-hoc version declarations with a structured, single-source-of-truth for dependency management across the project.
buildSrc · high confidence
Migrate Android build configuration to Kotlin DSL and modernize dependencies
The project's build system has been migrated from Groovy to Kotlin DSL (build.gradle.kts), introducing a more type-safe and concise build script. This change includes updating the Android Gradle Plugin to version 4.0, upgrading to AndroidX libraries, and integrating static analysis tools like Detekt and ktlint. Additionally, the project structure has been modularized into 'app' and 'domain' modules, and dependency injection has been updated to use Hilt instead of Dagger.
(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
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 71 → 66 (-5.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 99 (-1.4)
- Architecture 100 → 91 (-9.0)
- Maturity 64 → 64 (+0.0)
- Readiness 57 → 57 (+0.0)
- Security 100 → 92 (-8.0)
- Domain Modelling 100 → 70 (-30.3)
Resolved (5)
- 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
- Test reliability not included
- single-maintainer — knowledge-concentration (bus factor) risk
New (11)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no usage examples (README.md)
- High: security finding (details withheld)
- No ADRs found
- No dependency advisory monitoring
- TodoComment (app/src/main/java/com/akoufatzis/coolweather/data/places/PlacesDataStore.kt)
- TodoComment (app/src/main/java/com/akoufatzis/coolweather/presentation/places/PlacesFragment.kt)
- TodoComment (app/src/main/java/com/akoufatzis/coolweather/presentation/weather/WeatherFragment.kt)
- TodoComment (app/src/main/java/com/akoufatzis/coolweather/presentation/weather/WeatherFragment.kt)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
akoufa/CoolWeather 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 ad8d2568e0f6edf965353afae7d5019c31402cac — 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.