refactor: layered architecture (core/data/ui separation) #1

Merged
mikkeli merged 5 commits from refactor/flutter-architecture into master 2026-08-23 11:25:55 +00:00
Member

Summary

Restructure gps-speedo into a strict layered architecture following separation of concerns.

Architecture (new)

lib/
  core/constants/     -- gps, overlay, timing, speed_unit
  core/theme/         -- color_themes
  data/
    models/           -- LocationData (immutable domain model)
    services/         -- GpsService (stateless wrapper), OverlayService (IPC)
    repositories/     -- LocationRepository (business logic, ChangeNotifier)
  providers/          -- SettingsProvider (thin, unchanged)
  ui/
    features/
      speedometer/    -- SpeedometerViewModel + SpeedometerView
      overlay/        -- Stub ViewModel + View (deferred)
    shared/           -- SpeedDisplay widget
  services/           -- Logger
  main.dart           -- Provider DI wiring

What changed

  • Moved constants from lib/config/ -> lib/core/constants/
  • Moved color_themes.dart -> lib/core/theme/
  • Created LocationData immutable domain model
  • Split monolithic GpsDataManager -> GpsService (stateless) + LocationRepository (business logic + streams)
  • Created thin SpeedometerViewModel + SpeedometerView with extracted SpeedDisplay shared widget
  • Deferred Overlay floating window with stub placeholders (reserved for future integration)
  • Deleted old flat files (config/, screens/, providers/overlay_provider.dart, services/gps_data_manager.dart, etc.)
  • Rewired DI in main.dart (Provider pattern)

Verification

  • flutter analyze lib/ -> 0 errors, 0 warnings (30 pre-existing SCREAMING_SNAKE_CASE info-level lint only)
  • flutter build apk --debug -> succeeded
  • Branch: refactor/flutter-architecture (reset from 7a58483)
  • 5 atomic commits
## Summary Restructure gps-speedo into a strict layered architecture following separation of concerns. ## Architecture (new) lib/ core/constants/ -- gps, overlay, timing, speed_unit core/theme/ -- color_themes data/ models/ -- LocationData (immutable domain model) services/ -- GpsService (stateless wrapper), OverlayService (IPC) repositories/ -- LocationRepository (business logic, ChangeNotifier) providers/ -- SettingsProvider (thin, unchanged) ui/ features/ speedometer/ -- SpeedometerViewModel + SpeedometerView overlay/ -- Stub ViewModel + View (deferred) shared/ -- SpeedDisplay widget services/ -- Logger main.dart -- Provider DI wiring ## What changed - Moved constants from lib/config/ -> lib/core/constants/ - Moved color_themes.dart -> lib/core/theme/ - Created LocationData immutable domain model - Split monolithic GpsDataManager -> GpsService (stateless) + LocationRepository (business logic + streams) - Created thin SpeedometerViewModel + SpeedometerView with extracted SpeedDisplay shared widget - Deferred Overlay floating window with stub placeholders (reserved for future integration) - Deleted old flat files (config/, screens/, providers/overlay_provider.dart, services/gps_data_manager.dart, etc.) - Rewired DI in main.dart (Provider pattern) ## Verification - flutter analyze lib/ -> 0 errors, 0 warnings (30 pre-existing SCREAMING_SNAKE_CASE info-level lint only) - flutter build apk --debug -> succeeded - Branch: refactor/flutter-architecture (reset from 7a58483) - 5 atomic commits
irene added 5 commits 2026-08-23 11:24:39 +00:00
- Move constants from lib/config/ to lib/core/constants/
- Move color themes to lib/core/theme/
- Create LocationData domain model in data/models/
- Create lightweight GpsService in data/services/
- Create LocationRepository in data/repositories/ consolidating
  GpsDataManager business logic (GPS stream, staleness, precision)
- Create shared SpeedDisplay widget in ui/shared/
- Defer overlay feature — stubs reserved in ui/features/overlay/
- Create SpeedometerViewModel in ui/features/speedometer/
- Create thin SpeedometerView in ui/features/speedometer/
- Extract shared SpeedDisplay widget in ui/shared/
- Extract _CompassWidget from old speedometer screen
- Remove all business logic from UI layer
- Stub OverlayViewModel reserves abstraction point
- Stub OverlayView shows 'Overlay deferred' placeholder
- Original OverlayProvider (274 lines) was too tangled:
  mixed IPC, GPS forwarding, timers, foreground mgmt
- Will be reimplemented properly when overlay issues are resolved
- OverlayService was the only overlay-related file that should stay
- It is a stateless platform wrapper — fits in data/services/
- Will be used by future OverlayProvider when overlay is reimplemented
Delete old flat files, wire new DI in main.dart:
- Removed: gps_service.dart, config/, models/, providers/overlay_provider.dart,
  screens/, services/gps_data_manager.dart, services/overlay_service.dart
- Kept: settings_provider.dart (thin, correct), logger.dart (shared util)
- main.dart now wires: LocationRepository → SpeedometerViewModel → SpeedometerView
- overlay_provider.dart deferred, stub in ui/features/overlay/
- flutter analyze: 30 info-level constant_identifier_names warnings (project convention),
  zero errors, zero warnings — builds clean

New structure:
  lib/
    core/constants/     — gps, overlay, timing, speed_unit
    core/theme/         — color_themes
    data/
      models/           — LocationData (immutable domain model)
      services/         — GpsService (stateless wrapper), OverlayService (IPC)
      repositories/     — LocationRepository (business logic, ChangeNotifier)
    providers/          — SettingsProvider (thin, unchanged)
    ui/
      features/
        speedometer/    — SpeedometerViewModel + SpeedometerView
        overlay/        — Stub ViewModel + View (deferred)
      shared/           — SpeedDisplay widget
    services/           — Logger (shared util)
mikkeli merged commit fff81719b1 into master 2026-08-23 11:25:55 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: android-stuff/gps-speedo#1