grishko188/Points-of-interest
44.2
Weak · 21 September 2026
8.7k
lines of production code
Kotlin
primary language
4
measurements over time
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.