Commit Graph

60 Commits

Author SHA1 Message Date
Mikkeli Matlock 6b8bba8686 feat(02-01): create OverlayProvider for overlay lifecycle and messaging
- Created lib/providers/overlay_provider.dart
- Extends ChangeNotifier for reactive overlay state management
- Centralizes ALL overlay operations: show, close, toggle, status monitoring, messaging
- updateDependencies() called by ProxyProvider when GPS or Settings change
- Subscribes to GpsDataManager.dataStream on first update (persist subscription)
- Skips overlay sends when inactive (if-check, not unsubscribe)
- _isDisposed guards on all async-accessible methods
- showOverlay() sends initial data with overlay size info
- _pushDataToOverlay() sends GPS data with current theme/unit
- _startListeningToOverlayMessages() handles overlay→main IPC
- _startOverlayStatusCheck() polls overlay status at 1s interval
- _handleOverlayClose() manages cleanup and optional bring-to-front
- pushCurrentData() public method for background heartbeat usage
- dispose() cancels 4 subscriptions/timers, calls super.dispose() last
2026-02-10 22:05:39 +09:00
Mikkeli Matlock 1961651151 feat(02-01): create SettingsProvider for theme and unit state
- Created lib/providers/settings_provider.dart
- Extends ChangeNotifier for reactive state management
- Constructor accepts pre-initialized SharedPreferences instance
- Loads theme index and speed unit synchronously from SharedPreferences
- cycleTheme() and cycleUnit() methods with haptic feedback
- Persists settings to SharedPreferences on every change
- Both cycle methods call notifyListeners() for reactive UI updates
- No notifyListeners() in constructor (runs before first build)
2026-02-10 22:04:00 +09:00
Mikkeli Matlock f458b62eea chore(02-01): add provider dependencies and refactor GpsDataManager
- Added provider ^6.1.2 and shared_preferences ^2.3.4 to pubspec.yaml
- Removed singleton pattern from GpsDataManager (deleted _instance and instance getter)
- Changed GpsDataManager._internal() to public GpsDataManager() constructor
- Extended ChangeNotifier to enable reactive state updates
- Added _isDisposed guard field to prevent disposed notifications
- Updated _updateData() to call notifyListeners() after stream emission
- Added _isDisposed guards to _onGpsError() and _handleStaleDataTimeout()
- Updated dispose() to set _isDisposed, call super.dispose() last, removed _isInitialized reset
2026-02-10 22:03:13 +09:00
Mikkeli Matlock ee73a1a48d docs(02): phase 2 planned, paused before execution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:31:42 +09:00
Mikkeli Matlock 755c4b7b06 fix(02): revise plans based on checker feedback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:17:01 +09:00
Mikkeli Matlock 630cf1c578 docs(02): create phase plan
Phase 02: Provider Migration
- 2 plan(s) in 2 wave(s)
- Wave 1: Create providers (GpsDataManager + SettingsProvider + OverlayProvider)
- Wave 2: Wire MultiProvider and migrate SpeedometerScreen
- Ready for execution
2026-02-10 11:13:29 +09:00
Mikkeli Matlock 8ff74b36e1 docs(02): research phase domain
Phase 02: Provider Migration
- Standard stack identified (provider v6.1.5+1)
- Architecture patterns documented (ChangeNotifier, Consumer, Selector)
- Pitfalls catalogued (7 common errors with solutions)
- Migration strategy validated against context decisions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:05:17 +09:00
Mikkeli Matlock 919b239c6e docs(02): capture phase context
Phase 02: Provider Migration
- Implementation decisions documented
- Phase boundary established
2026-02-10 10:58:15 +09:00
Mikkeli Matlock 5c9f3d225e wip: foundation complete, paused before phase 2
Phase 1 fully executed and verified (9/9 must-haves).
Ready to resume with Phase 2 (Provider Migration).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:58:56 +09:00
Mikkeli Matlock 8e3ad7f00c docs(01): complete foundation phase
Phase 1: Foundation - 2 plans executed in 19.6 minutes
- 01-01: Infrastructure, Logger, Constants, Models (12.8 min)
- 01-02: Screen extraction (6.8 min)
- Verification: 9/9 must-haves passed
- Requirements ORG-01 through ORG-08 marked Complete

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:55:01 +09:00
Mikkeli Matlock c3865b318a docs(01-02): complete screen extraction plan
Tasks completed: 2/2
- SpeedometerScreen extracted to screens/speedometer_screen.dart (802 lines)
- OverlaySpeedometer extracted to screens/overlay_screen.dart (303 lines)
- main.dart slimmed to 39 lines (entry points only)

Phase 1 Foundation: COMPLETE (2/2 plans, 19.6 min total)

SUMMARY: .planning/phases/01-foundation/01-02-SUMMARY.md
2026-02-09 21:48:38 +09:00
Mikkeli Matlock ad077d1f32 feat(01-02): extract OverlaySpeedometer to screens/overlay_screen.dart
- Created lib/screens/overlay_screen.dart with OverlaySpeedometer and _OverlaySpeedometerState
- All state, methods, gesture handling preserved exactly
- main.dart imports screens/overlay_screen.dart
- OverlaySpeedometer removed from main.dart
- main.dart slimmed to 39 lines (under 60 line target)
- main.dart now contains only: main(), overlayMain(), SpeedoApp class
- Zero analyzer errors (except intentional SCREAMING_SNAKE warnings)
2026-02-09 21:45:56 +09:00
Mikkeli Matlock bc36076134 feat(01-02): extract SpeedometerScreen to screens/speedometer_screen.dart
- Created lib/screens/speedometer_screen.dart with SpeedometerScreen and _SpeedometerScreenState
- All state, methods, layout builders preserved exactly
- main.dart imports screens/speedometer_screen.dart
- SpeedometerScreen removed from main.dart
- Zero analyzer errors (except intentional SCREAMING_SNAKE warnings)
2026-02-09 21:43:41 +09:00
Mikkeli Matlock 88293716a4 docs(01-01): complete plan execution with summary and state updates
- Create 01-01-SUMMARY.md: Comprehensive execution summary with 12.8 min duration
- Update STATE.md: Progress 50% (1/2 plans complete), velocity metrics, decisions table
- Document 5 key decisions made during execution
- Record zero deviations, one minor bug (missing import)
- Phase 1 ready to proceed with plan 01-02
2026-02-09 21:37:02 +09:00
Mikkeli Matlock a0d93d7f6d refactor(01-01): rewire all imports, replace logging, apply constants
- Update gps_data_manager.dart: import ProcessedGpsData from models/, use GpsConfig constants, replace all print() with Logger calls
- Update gps_service.dart: use GpsConfig.VALID_HEADING_MIN/MAX for heading validation
- Update main.dart: import from config/, models/, replace all customDebugPrint() and print() with Logger, use TimingConfig/OverlayConfig constants, convert overlay IPC to OverlayMessage typed class
- Delete customDebugPrint() function definition
- Delete lib/speed_units.dart and lib/color_themes.dart (moved to config/)
- Zero analyzer errors, zero bare print() calls remaining
2026-02-09 21:33:28 +09:00
Mikkeli Matlock 5122be4bc1 feat(01-01): extract models and move config files to new structure
- Move SpeedUnit enum to config/speed_unit.dart
- Move ColorTheme/ColorThemes classes to config/color_themes.dart
- Extract ProcessedGpsData model from gps_data_manager to models/
- Create OverlayMessage typed class for overlay IPC (replaces raw Maps)
- Create ThemeModel with palette rotation and state management
2026-02-09 21:23:49 +09:00
Mikkeli Matlock 2b2fc8fbd3 chore(01-01): create directory structure and infrastructure files
- Create lib/screens/, lib/widgets/, lib/providers/, lib/models/, lib/config/ directories
- Add Logger utility with error/warn/info/debug levels (kDebugMode guarded)
- Add GpsConfig constants (timeouts, heading validation)
- Add TimingConfig constants (heartbeat, overlay intervals)
- Add OverlayConfig constants (sizing, opacity ratios)
2026-02-09 21:22:19 +09:00
Mikkeli Matlock 7e9ed22e40 fix(01): revise plans based on checker feedback
- Clarified ThemeModel delegation rationale (Issue 1)
- Documented why Task 3 is one atomic task (Issue 2)
- Made customDebugPrint deletion step unambiguous (Issue 3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:13:09 +09:00
Mikkeli Matlock 7f8075b76d docs(01): create phase plan
Phase 01: Foundation
- 2 plan(s) in 2 wave(s)
- 2 autonomous, 0 checkpoint-only
- Ready for execution

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:08:34 +09:00
Mikkeli Matlock c3b38c25a2 docs(01): research phase domain
Phase 01: Foundation
- Standard stack identified
- Architecture patterns documented
- Pitfalls catalogued

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:02:20 +09:00
Mikkeli Matlock d41e29a1b9 docs(01): capture phase context
Phase 01: Foundation
- Implementation decisions documented
- Phase boundary established

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 20:54:59 +09:00
Mikkeli Matlock 92f3f83a9c docs: create roadmap (4 phases)
Phases:
1. Foundation: code organization, model extraction (ORG-01–08)
2. Provider migration: setState → ChangeNotifier/Consumer (STATE-01–07)
3. Overlay refactor: fix data staleness, error surfacing (OVRL-01–06)
4. GPS & power: adaptive precision, lifecycle management (GPS-01–04, PWR-01–06)

All v1 requirements mapped to phases.
2026-02-09 20:35:40 +09:00
Mikkeli Matlock f4a2caeb65 docs: define v1 requirements
30 requirements across 6 categories
4 requirements deferred to v2
2026-02-09 19:36:03 +09:00
Mikkeli Matlock 3c4231d307 docs: complete project research
Files:
- STACK.md (recommended Provider + existing packages, no new dependencies)
- FEATURES.md (restructure patterns, MVVM architecture requirements)
- ARCHITECTURE.md (layer separation, overlay communication, data flow)
- PITFALLS.md (async lifecycle issues, GPS leaks, battery drain)
- SUMMARY.md (synthesis with 4-phase roadmap recommendations)

Key findings:
- Stack: Provider 6.1.x + existing geolocator/overlay packages (no additions needed)
- Architecture: MVVM with layer-first structure, isolate-aware overlay messaging
- Critical pitfall: setState after dispose during Provider migration (audit async patterns first)

Overall confidence: HIGH
Estimated effort: 52-70 hours
Highest risk: Phase 2 (Provider migration) and Phase 3 (Overlay refactor)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 19:28:28 +09:00
Mikkeli Matlock 308b2c549f chore: add project config
Mode: yolo
Depth: quick
Parallelization: enabled
Workflow agents: research=on, plan_check=on, verifier=on
2026-02-09 19:16:23 +09:00
Mikkeli Matlock 64d210af5c docs: initialize project
Restructure GPS speedometer: modular architecture, Provider state management, overlay reliability fixes, speed-adaptive GPS precision, cooperative Android GPS access.
2026-02-09 19:14:32 +09:00
Mikkeli Matlock a686e6b0fb docs: map existing codebase
- STACK.md - Technologies and dependencies
- ARCHITECTURE.md - System design and patterns
- STRUCTURE.md - Directory layout
- CONVENTIONS.md - Code style and patterns
- TESTING.md - Test structure
- INTEGRATIONS.md - External services
- CONCERNS.md - Technical debt and issues
2026-02-09 18:51:11 +09:00
Mikkeli Matlock 316c730061 Procedural commit, I don't know what's been done 2025-10-02 21:43:29 +09:00
Mikkeli Matlock b185ce0999 feat: implement separate GPS timeouts and update project documentation
GPS Timeout Improvements:
- Add separate GPS timeouts: 20s for initial fix, 2s for ongoing updates
- Resolve indoor GPS timeout issues that caused stream termination
- Prevent GPS stream from stopping immediately due to aggressive timeouts
- Enhanced GPS manager initialization with initial position fetch

Documentation Updates:
- Update TODO.md with v2.3.0-dev architecture completion status
- Update CLAUDE.md with GPS manager architecture details
- Document clean data flow and separate timeout strategy
- Update branch strategy to reflect current development state

Technical Notes:
- GPS manager now handles initial cold start with long timeout
- Ongoing updates use shorter timeout for responsive behavior
- Architecture ready for intelligent caching logic implementation
- All overlay functionality preserved while improving GPS reliability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-31 14:53:29 +09:00
Mikkeli Matlock 6d1cf5fac3 feat: implement GpsDataManager architecture with modular design
- Add GpsDataManager singleton service for centralized GPS data processing
- Refactor main app to use processed GPS data streams instead of raw position data
- Add haptic feedback to all main UI tap interactions (theme, unit, navigation)
- Implement faster GPS update frequency (500ms timeLimit in LocationSettings)
- Clean up verbose debug logging while preserving essential error logs
- Remove unused debug variables and imports
- Preserve existing background survival mechanisms and overlay lifecycle
- Add temporary GPS simulation while resolving geolocator engine conflicts

Architecture improvements:
- Clean data flow: GPS Hardware → GpsDataManager → Main App → Overlay
- Single source of truth for processed GPS data in manager
- Separation of concerns: GPS logic isolated from UI components
- Foundation ready for intelligent caching logic implementation

Technical notes:
- GPS engine conflict detected, temporarily using simulation data
- All functionality tested and working with test data
- Real GPS integration pending engine conflict resolution

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-31 01:15:00 +09:00
Mikkeli Matlock 4050bac983 Unsuccessful fix on floating window interactions & new icons 2025-08-28 22:12:41 +09:00
Mikkeli Matlock 3c65860c53 Update TODO.md for v2.2.2 release documentation 2025-08-27 23:39:03 +09:00
Mikkeli Matlock 3c3519ace2 Update version to 2.2.2+1 in pubspec.yaml 2025-08-27 23:36:50 +09:00
Mikkeli Matlock f9037a6697 v2.2.2: Enhanced background persistence and overlay communication
Major improvements to floating window functionality:
- Implemented lazy overlay listener creation/destruction to eliminate ghost overlay
- Added 2Hz cached GPS data push for smooth overlay updates
- Enhanced background persistence with wake locks and heartbeat mechanisms
- Proper Android foreground functionality using bg_launcher package
- Fixed overlay state management race conditions
- Added comprehensive debug logging throughout communication system
- Improved Android manifest with background persistence permissions
- Eliminated overlay status polling interference with data flow

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
v2.2.2
2025-08-27 23:36:11 +09:00
Mikkeli Matlock bd594601f1 v2.2.0: Fix floating window sizing and state synchronization
- Fix overlay size calculation to use physical pixels instead of scaled logical pixels
- Add proper state synchronization between main app and overlay for close events
- Improve overlay close button functionality with bidirectional communication
- Add comprehensive debug output for screen size analysis
- Update overlay visual tweaks (close button sizing, speed display improvements)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
v2.2.0
2025-08-27 00:14:41 +09:00
Mikkeli Matlock 2910706e87 CRITICAL FIX: Resolve StackOverflow in debug function
Fixed infinite recursion in customDebugPrint function:
- Line 15 was calling customDebugPrint(message) instead of print(message)
- This caused stack overflow crash on any debug output
- Now correctly calls print(message) to avoid recursion

The app was completely broken due to this recursive function bug.
Debug output now works correctly without crashing.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-26 23:48:37 +09:00
Mikkeli Matlock d1d7521805 floating overlay size change 2025-08-26 23:41:12 +09:00
Mikkeli Matlock 3e79a448ec Make debug output production-ready with conditional printing
- Add kDebugMode conditional debug output using debugPrint() helper
- All debug messages (🚀🟢🔴📡📤📐🖱️) only appear in debug builds
- Release builds will be clean without console spam
- Maintains full debug visibility during development

This ensures production APKs have no debug console output while
preserving comprehensive debugging capabilities for development.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-26 23:40:30 +09:00
Mikkeli Matlock 7ae660156e Complete working floating window implementation
Major improvements to floating window overlay:

Architecture:
- Clean client-server model: main app as GPS backend, overlay as display client
- Single GPS stream eliminates resource conflicts and sync issues
- Real-time data push: speed, heading, theme, and unit changes sync instantly

Functionality:
- Proper system screen resolution detection and size synchronization
- Main app calculates overlay size, shares exact dimensions with overlay
- Navigation area tap toggles overlay (show/close), long-press always closes
- Comprehensive debug metrics for troubleshooting

Technical fixes:
- Eliminated duplicate GPS streams for better battery life
- Fixed size calculation mismatches between main app and overlay
- Proper overlay state tracking with _isOverlayActive boolean
- Reverted to withOpacity() per NOTES.txt (simpler than Color.fromARGB)

Debug metrics include:
- Creation/destruction signals with 🟢/🔴 indicators
- Real-time data updates with 📡/📤 send/receive tracking
- Window sizing info with 📐 dimensions and font calculations
- User interaction feedback with 🖱️ tap/long-press detection

This implementation provides reliable floating window functionality
with proper data synchronization and efficient resource usage.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
v2.1.1
2025-08-26 23:36:16 +09:00
Mikkeli Matlock 9cd497f4f5 Merge master branch improvements into dev/floating-window-wip
Resolved conflicts:
- CLAUDE.md: Updated documentation to match master branch structure
- main.dart: Hybrid overlay sizing - proportional with reasonable limits (280-400w, 140-300h)

This brings the layout improvements from master (better flex ratios and sizing)
into the advanced floating window development branch.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-26 19:33:56 +09:00
Mikkeli Matlock 057f33fc50 Improve floating window sizing and layout ratios
- Increase overlay window size from 180x100 to 320x280 for better visibility
- Adjust portrait layout flex ratios: speed area 65, compass area 32
- Better proportions for overlay and main app interface

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-26 19:31:33 +09:00
Mikkeli Matlock 550755fad9 Update project documentation for v2.1.0 and dev branch strategy
- Updated TODO.md and CLAUDE.md to reflect current branch structure
- Master branch (v2.1.0): stable release with basic floating window
- Dev branch: advanced floating window marked as seriously WIP
- Clear documentation of branch strategy and known issues

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-26 19:31:21 +09:00
Mikkeli Matlock 940aaee135 Complete floating window WIP documentation updates 2025-08-25 23:41:27 +09:00
Mikkeli Matlock 6c9bada84d Add floating window overlay implementation (seriously WIP)
DEVELOPMENT BRANCH - NOT READY FOR PRODUCTION

Floating window overlay functionality:
- Basic GPS data synchronization implemented but unreliable
- Theme/unit sync between main app and overlay works partially
- Proportional sizing and positioning needs major refinement
- Close button works but overlay behavior inconsistent
- Android SYSTEM_ALERT_WINDOW permissions configured

Known issues:
- Overlay reliability inconsistent across devices/Android versions
- GPS sync unreliable, performance impact possible
- Positioning and sizing calculations need major work

This is a work-in-progress development branch. Main functionality
works but is seriously buggy and not ready for release.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-25 23:40:58 +09:00
Mikkeli Matlock 63ee536ef1 minor formatting update v2.1.0 2025-08-25 23:06:46 +09:00
Mikkeli Matlock 2c2267e5ae v2.1.0: Add floating window overlay functionality
Major Features:
- Floating overlay window with system-level persistence
- Split decimal display (main speed prominent, decimal smaller/faded)
- Optimized content sizing for maximum readability
- Navigation icon trigger for overlay activation
- Multiple close options (overlay button + long-press navigation)

Technical Implementation:
- Added flutter_overlay_window dependency
- Android SYSTEM_ALERT_WINDOW permissions
- Overlay service configuration in AndroidManifest
- Enhanced flex ratios for better space utilization
- BoxFit.contain for improved content scaling

UX Improvements:
- Streamlined overlay launch (removed permission prompts)
- Cleaner visual hierarchy with split speed display
- Responsive design for both portrait and landscape
- Professional overlay styling matching app theme

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-25 23:03:31 +09:00
Mikkeli Matlock e6ffb00b2a Updated speed displays v2.0.1 2025-08-25 07:41:49 +09:00
Mikkeli Matlock b3e85983e7 Changed GPS force update timeout to 5s 2025-08-25 07:30:35 +09:00
Mikkeli Matlock 89ce53bb1b Improve GPS performance and heading display
- Reduce GPS distanceFilter to 0 for faster updates
- Add timeLimit to ensure regular position updates
- Implement cached heading to avoid showing N/A when GPS heading unavailable
- Add speed display logic: show "--" when stationary with no heading data
- Add rotating navigation icon that points in heading direction
- Fix degree symbol in heading format display

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-25 07:26:20 +09:00
Mikkeli Matlock 56327c00ec Added Yuuparo light palette 2025-08-25 07:09:08 +09:00