Skip to content
CAI
Software that uses CAICheck a score

grishko188/Points-of-interest

44.2

Weak · 21 September 2026

8.7k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is an Android application for managing Points of Interest (POI) and categories, built with a clean architecture separating domain, data, and UI layers. It enables users to create, edit, and delete POIs and categories, search for content, and manage their profile settings. The system supports local and remote data synchronization, background cleanup, and comprehensive automated testing across all layers.

How it got here

2022 — Feature implementation and architecture migration

30 changes.

The project underwent a significant architectural shift to a clean, modular structure, introducing domain, data, and UI layers for core features like Points of Interest, categories, and user profiles. This period focused on implementing full-featured UIs, state management, and local data persistence using Room and DataStore, while also upgrading the build system to Gradle Version Catalogs.

2023 — Feature implementation and test coverage

12 changes.

This period focused on implementing core user-facing features, specifically the Search, Profile, and Home screens, alongside their corresponding ViewModels. A significant portion of the work was dedicated to establishing comprehensive test coverage across the data and domain layers, introducing a new data-test module and adding extensive unit and UI tests for all major features.

Features

Added About screen to display app information

A new About screen has been added to the application, displaying the app's logo, name, description, and version details. The screen also includes a clickable link to the developer's GitHub profile, allowing users to view the author's information directly within the app.

app/src/main/java/com/grishko188/pointofinterest/features/about · high confidence

Added MainViewModel to manage main screen state and category synchronization

Introduced MainViewModel to handle the main screen's lifecycle and state management. The view model observes the user's settings and manages the synchronization state for categories, transitioning from a loading state to a success state once the sync use case completes.

app/src/main/java/com/grishko188/pointofinterest/features/main/vm · high confidence

Added categories data layer with local and remote data sources

Introduced a new data layer for categories, including a Room DAO, local and fake remote data sources, and a repository implementation. The repository synchronizes categories from a remote source to local storage on first load, and provides methods to get, add, update, and delete categories via the local data source.

data/src/main/java/com/grishko188/data/features/categories · high confidence

Added categories list and editing UI with swipe-to-delete and undo support

The categories feature now includes a new composable screen that renders a list of categories, each displaying a title, icon, and color. Users can swipe left on a category to delete it, with a confirmation dialog that offers an undo action. The UI also includes a color palette selector for editing categories. This change introduces the primary interaction patterns for managing categories within the app.

app/src/main/java/com/grishko188/pointofinterest/features/categories/ui/composable · high confidence

Added core data-layer utilities for HTTP and serialization

The data module now includes a set of core infrastructure classes to support the new data layer. This includes factory classes for creating configured instances of Gson, OkHttpClient, and Retrofit, along with Kotlin extension constants and custom dependency injection qualifiers (such as Remote, Local, and CacheFolder) to facilitate dependency injection and network configuration.

data/src/main/java/com/grishko188/data/core · medium confidence

Added database schema and type converters for POI and categories

The application now includes a new Room database configuration (PoiDatabase) that manages entities for Points of Interest (PoiEntity, PoiCommentEntity, PoiFtsEntity, PoiWithCategoriesCrossRef) and categories (CategoryEntity). This change introduces an InstantConverter to handle timestamp serialization and registers DAOs for categories and POI data, enabling local storage and retrieval of these entities.

data/src/main/java/com/grishko188/data/database · high confidence

Added domain models for POI features

Introduced new domain models to support the POI (Points of Interest) feature set. This includes data classes for POI entities (PoiModel, PoiComment, PoiCreationPayload), sorting options (PoiSortOption), and statistics tracking (PoiStatistics, PoiStatisticsSnapshot, and related sub-models). Additionally, a WizardSuggestion model was added to support wizard-based content creation workflows.

domain/src/main/java/com/grishko188/domain/features/poi/models · high confidence

Added domain-layer use cases and repository interface for POI features

The domain layer now includes a new \PoiRepository\ interface and a set of corresponding use cases (e.g., \AddCommentUseCase\, \CreatePoiUseCase\, \DeletePoiUseCase\, \GetPoiListUseCase\, \GetCommentsUseCase\, \GetDetailedPoiUseCase\, \GetPoiStatisticsUseCase\, \GetUsedCategoriesUseCase\, \GetWizardSuggestionUseCase\, \SearchPoiUseCase\, \DeleteCommentUseCase\, \DeleteGarbageUseCase\). These components provide the domain logic for managing points of interest, including creating, deleting, and retrieving POIs, comments, statistics, and suggestions.

domain/src/main/java/com/grishko188/domain/features/poi/interactor · high confidence

Added local profile data layer for user settings and profile storage

The app now stores and manages user profile information (token, name, email, image) and user settings (theme preferences, onboarding state, auto-GC) locally using DataStore. This new data layer provides the foundation for persisting user data and preferences on the device.

data/src/main/java/com/grishko188/data/features/profile · high confidence

Added new Point of Interest creation flow with wizard and form screens

The app introduces a new feature for creating Points of Interest (POI) through a two-step process. First, a 'Wizard' screen allows users to input a URL or text to fetch automated suggestions (title, body, image) via the GetWizardSuggestionUseCase. Users can then proceed to a 'Form' screen to edit these details, add local or remote images, and select categories before saving the new POI. This includes new UI components for displaying wizard suggestions, handling image states, and managing the overall creation state.

app/src/main/java/com/grishko188/pointofinterest/features/poi/create · high confidence

Added search screen and view model

Introduced the new SearchScreen composable and SearchVm view model, enabling users to search for points of interest. The search functionality debounces input by 500ms and displays results in a list, with specific handling for empty or no-result states.

app/src/main/java/com/grishko188/pointofinterest/features/search · high confidence

Added user profile and settings data models

Introduced new Protocol Buffer definitions for user data storage. The \user\_profile.proto\ file defines the \UserProfileProto\ message containing fields for authentication tokens, name, email, and profile image. The \user\_settings.proto\ file defines the \UserSettingsProto\ message, which includes boolean flags for custom and dark themes, auto-garbage collection, and onboarding status. These changes establish the data layer for user profile and settings features.

data/src/main/proto · high confidence

Adds UI components, utility classes, and instrumentation tests for the garbage collector feature

The app introduces a new garbage collector (GC) worker and its associated instrumentation tests (PoiTestRunner, GCWorkerTest) to verify background cleanup behavior. The UI layer gains a suite of reusable Compose components including ActionButton, CrossSlide, LinkifyText, OutlineButton, PulsingProgressBar, and TextField variants, alongside utility classes for date formatting, error handling, and material color palettes. Additionally, navigation graphs for categories and the main home screen's sort-by options are implemented, supporting the app's core content management and user interface interactions.

app/src · high confidence

Domain layer scaffolding and testing utilities

The domain module now includes core infrastructure for use cases, with abstract base classes for both suspend-based and Flow-based operations that accept a CoroutineDispatcher. A Dagger/Hilt module provides the IO dispatcher, and a custom @UseCaseDispatcher qualifier is introduced. Additionally, a Mockito helper utility is added to simplify test setup and argument matching.

domain · high confidence

Implemented full UI for category management and detailed editing

The categories feature now includes a complete user interface for browsing and editing categories. The main list screen (CategoriesScreen) has been replaced with a functional layout that displays categories in a scrollable list, supporting delete actions with an undo snackbar and navigation to a new detailed editing screen. A new CategoryDetailedScreen has been added, allowing users to edit a category's name and color, with state management handled by the CategoriesViewModel.

app/src/main/java/com/grishko188/pointofinterest/features/categories/ui · high confidence

Introduce CategoriesViewModel to manage category state and actions

A new CategoriesViewModel has been added to the app's categories feature, providing the UI layer for managing category data. It exposes flows for the detailed category state and a grouped list of categories, and exposes functions to fetch, create, update, and delete categories. The view model also supports an undo mechanism for deletions, allowing users to revert recently deleted items before they are permanently removed.

app/src/main/java/com/grishko188/pointofinterest/features/categories/vm · high confidence

Introduce Profile screen with settings and account management

The Profile screen now displays user account details (name, email, avatar) and provides toggles for automatic garbage collection, system theme, and dark mode. Users can sign in with Google or sign out, with the UI updating to reflect the current state of each setting.

app/src/main/java/com/grishko188/pointofinterest/features/profile/vm · high confidence

Introduce local data layer for POI feature

Added the data layer for the POI (Point of Interest) feature, including data sources for local storage, image handling, and remote wizard suggestions, along with the corresponding Room database access objects, data models, and repository implementation to support POI creation, deletion, search, and comment management.

data/src/main/java/com/grishko188/data/features/poi · high confidence

Introduce main app shell with navigation, theme, and action controls

The app now features a new main activity that manages the core user interface shell. This includes a navigation controller to handle deep links and screen transitions, a state holder (PoiAppState) that coordinates navigation, snackbars, and menu actions (search, sort, add), and a main screen layout with a top app bar, bottom navigation bar, and a floating action button for creating new points of interest. The UI also respects user settings for dark mode and system theme, and integrates with the splash screen during loading states.

app/src/main/java/com/grishko188/pointofinterest/features/main · high confidence

Introduce the Point of Interest (POI) detail view screen

Added the complete UI and view-model for the POI detail screen, including a list of display items (image, metadata, categories, title, body, content link, comments) and composables to render them. The ViewPoiViewModel handles fetching POI data and comments, and manages adding and deleting comments with undo support.

app/src/main/java/com/grishko188/pointofinterest/features/poi/view · high confidence

Introduced domain layer for user profile management

Added a new domain layer for managing user profile and settings. This includes a ProfileRepository interface defining operations to get, set, and delete user profiles and settings, along with corresponding use cases (GetProfileUseCase, SetUserProfileUseCase, etc.) that interact with the repository. New data models (Profile, UserProfile, UserSettings, ManualSettings) support these operations, enabling the application to handle user profile data and preferences.

domain/src/main/java/com/grishko188/domain/features/profile · high confidence

Introduced domain-layer use cases and repository interface for category management

Added a new domain-layer implementation for managing categories, including a CategoriesRepository interface and six use cases (AddCategoryUseCase, DeleteCategoryUseCase, GetCategoriesByIdsUseCase, GetCategoriesUseCase, GetCategoryUseCase, and UpdateCategoryUseCase) that handle creation, retrieval, synchronization, and deletion of categories. The change also introduces the Category data model, CreateCategoryPayload, and CategoryType enum to support these operations.

domain/src/main/java/com/grishko188/domain/features/categories · high confidence

Introduces data layer dependency injection for categories, POI, and profile features

The application now provides dependency injection for the data layer, enabling the categories, POI (Points of Interest), and profile features to access their respective repositories and data sources. This includes setting up the database, data stores for user settings and profile, and network clients for API communication.

data/src/main/java/com/grishko188/data/di · high confidence

New home screen UI components for displaying points of interest and categories

Added new Compose UI components for the home screen, including a reusable 'Add More' button, category display chips, category filter chips, and a POI card that displays an image, title, subtitle, and associated categories. These components form the visual foundation for the home screen's content display.

app/src/main/java/com/grishko188/pointofinterest/features/home/ui/composable · high confidence

Profile screen now supports Google Sign-In and interactive settings

The Profile screen has been updated to integrate Google Sign-In, allowing users to sign in or out directly from the interface. The screen now renders a dynamic list of profile sections, including account status, navigation links, and boolean settings that can be toggled by the user. This replaces the previous static placeholder with a fully functional UI that communicates with the ProfileViewModel to handle authentication states and user preferences.

app/src/main/java/com/grishko188/pointofinterest/features/profile/ui · medium confidence

Behavioural changes

1 commit (0 fixes) modifying app/debug

A change to existing behaviour in app/debug — 1 commit, 1 file.

app/debug · low confidence · unverified

Added ProGuard and build configuration files for the data module

The data module now includes a .gitignore file to exclude the /build directory, a consumer-rules.pro file to preserve fields in Google Protobuf classes, and a proguard-rules.pro file with default ProGuard configuration comments. These changes ensure proper code shrinking, obfuscation, and build artifact management for the data layer.

data · high confidence

Gradle wrapper updated to version 7.5

The Gradle wrapper has been upgraded from version 7.4 to 7.5, which will cause the project to use the newer Gradle release for builds.

gradle · high confidence

Introduce UI state and model classes for the categories feature

The application now includes the UI state and model classes required to display and manage categories. This includes \CategoriesUiState\ to handle loading and success states for the detailed view, \CategoryUiModel\ to represent category data with color and type information, and \CategoryAction\ to define available user actions like delete and edit. These classes bridge the domain layer to the UI, enabling the categories screen to render category lists and details.

app/src/main/java/com/grishko188/pointofinterest/features/categories/ui/models · medium confidence

Redesigned home screen with sorting, filtering, and state management

The home screen has been rebuilt to support category filtering, sorting by various options, and managing loading, empty, error, and success states. Users can now filter points of interest by category, apply sort options via a dialog, and navigate to detailed views. The UI includes a filter bar, a list of points of interest, and a sort dialog with radio buttons for selecting sort criteria.

app/src/main/java/com/grishko188/pointofinterest/features/home/ui · medium confidence

Refactored HomeViewModel to use real data sources and sort options

The HomeViewModel was refactored to replace the previous mock/stub data fetching with actual domain use cases (GetCategoriesByIdsUseCase, GetPoiListUseCase, GetUsedCategoriesUseCase). The view model now manages the state for categories and a list of Points of Interest (POI) with support for sorting options (e.g., by date). The UI state model was updated to reflect loading, empty, result, and error states for both categories and POIs, and the previous dummy data generation was removed.

app/src/main/java/com/grishko188/pointofinterest/features/home/vm · high confidence

Test coverage

Added UI and ViewModel tests for the Home feature; Added UI and unit tests for the Categories feature; Added UI test for the About screen; Added data-test module with Hilt test modules and repository doubles; Added test assets for data layer; Added test coverage for the data layer; Added unit and UI tests for Profile and Search features; Added unit and instrumented tests for the profile data layer; Added unit tests for POI creation and viewing viewmodels; Added unit tests for domain POI use cases.

Dependencies

Migrated dependency management to Gradle Version Catalogs

The project has been refactored to use Gradle Version Catalogs (libs.versions.toml) for centralized dependency and plugin version management. This change updates the Android Gradle Plugin to 7.4.0, Kotlin to 1.7.20, and Hilt to 2.44, while introducing new modules for domain, data, and data-testing layers. The app module now depends on these internal modules and uses the catalog to resolve all third-party libraries, replacing the previous direct version string or variable-based dependency declarations.

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

Lenses

  • Code Health 99 → 97 (-2.2)
  • Architecture 98 → 71 (-26.8)
  • Maturity 54 → 54 (+0.0)
  • Readiness 24 → 24 (+0.0)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 55 → 53 (-2.0)

Resolved (18)

  • Change coupling: HomeScreen.kt ↔ HomeScreenComposables.kt (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Change coupling: HomeScreen.kt ↔ NavigationGraph.kt (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Change coupling: HomeScreenComposables.kt ↔ Screens.kt (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/composable/HomeScreenComposables.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) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/FormImageContentStateCard.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/FormImageContentStateCard.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/WizardSuggestionStateCard.kt)
  • Duplicated block (14 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Duplicated block (15 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uikit/LinkifyText.kt)
  • Duplicated block (15 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uistates/EmptyView.kt)
  • Duplicated block (15 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uistates/EmptyView.kt)
  • Duplicated block (16 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/categories/ui/composable/CategoriesScreenComposables.kt)
  • Duplicated block (16 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uikit/TextField.kt)
  • No exposed public API
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (19)

  • 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)
  • Duplicated block (12 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Duplicated block (12–14 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/FormImageContentStateCard.kt)
  • Duplicated block (14 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uistates/EmptyView.kt)
  • Duplicated block (14 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uistates/EmptyView.kt)
  • Duplicated block (15 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/FormImageContentStateCard.kt)
  • Duplicated block (15–16 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uikit/LinkifyText.kt)
  • Duplicated block (16 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/WizardSuggestionStateCard.kt)
  • Duplicated block (18–19 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • Duplicated block (22–23 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/features/categories/ui/composable/CategoriesScreenComposables.kt)
  • Duplicated block (71 lines × 2) (app/src/main/java/com/grishko188/pointofinterest/ui/composables/uikit/TextField.kt)
  • MethodTooLong: CreatePoiScreenKt.CreatePoiFormScreen (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/CreatePoiScreen.kt)
  • MethodTooLong: HomeScreenKt.HomeScreenContent (app/src/main/java/com/grishko188/pointofinterest/features/home/ui/HomeScreen.kt)
  • MethodTooLong: ViewPoiScreenKt.ViewPoiScreen (app/src/main/java/com/grishko188/pointofinterest/features/poi/view/ui/ViewPoiScreen.kt)
  • MethodTooLong: WizardSuggestionStateCardKt.WizardSuggestionContentPreview (app/src/main/java/com/grishko188/pointofinterest/features/poi/create/ui/composable/WizardSuggestionStateCard.kt)
  • No ADRs found

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

Survey your own repository

grishko188/Points-of-interest 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 21 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 599037f8a2aee0696cd20609eaf734d75e9af1ba — 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-fa71c66cabd8.