refactor: complete layered architecture migration

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)
This commit is contained in:
2026-08-23 17:32:29 +09:00
parent 6bba05efc8
commit 248053270b
13 changed files with 55 additions and 1984 deletions
@@ -13,7 +13,7 @@ import '../services/gps_service.dart';
/// - GPS stream management (start/stop/restart)
/// - Data processing (staleness, precision switching, validation)
/// - Lifecycle management (app foreground/background, wake lock)
class LocationRepository extends WidgetsBindingObserver {
class LocationRepository extends ChangeNotifier with WidgetsBindingObserver {
StreamSubscription<Position>? _gpsSubscription;
final StreamController<LocationData> _dataController =
StreamController<LocationData>.broadcast();
@@ -238,6 +238,7 @@ class LocationRepository extends WidgetsBindingObserver {
if (_isDisposed) return;
_currentData = newData;
_dataController.add(newData);
notifyListeners();
Logger.debug('Broadcasting data: ${newData.displaySpeed} ${newData.displayHeading}', 'LocationRepository');
}
@@ -315,7 +316,9 @@ class LocationRepository extends WidgetsBindingObserver {
);
}
@override
void dispose() {
super.dispose();
_isDisposed = true;
Logger.info('Disposing location repository...', 'LocationRepository');
WidgetsBinding.instance.removeObserver(this);