Skip to content

Commit b85a5b1

Browse files
committed
Enhance heartbeat functionality to include GPS coordinates for improved session management
1 parent cfa2599 commit b85a5b1

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

lib/providers/app_state_provider.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,14 @@ class AppStateProvider extends ChangeNotifier {
13181318
// Enable heartbeat if not in offline mode
13191319
// Heartbeat fires after 3 minutes of API inactivity to keep session alive
13201320
if (!_preferences.offlineMode) {
1321-
_apiService.enableHeartbeat();
1321+
_apiService.enableHeartbeat(
1322+
gpsProvider: () {
1323+
// Provide current GPS coordinates for heartbeat (matching wardrive.js)
1324+
final pos = _gpsService?.lastPosition;
1325+
if (pos == null) return null;
1326+
return (lat: pos.latitude, lon: pos.longitude);
1327+
},
1328+
);
13221329
}
13231330

13241331
// Start background service for continuous operation

lib/services/api_service.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class ApiService {
3838
Function? _onSessionExpiring;
3939
List<String> _channels = [];
4040

41+
/// Callback to get current GPS coordinates for heartbeat
42+
/// Returns (lat, lon) or null if GPS is not available
43+
({double lat, double lon})? Function()? _gpsProvider;
44+
4145
/// Regional channels from auth response (e.g., ['public', 'ottawa', 'testing'])
4246
List<String> get channels => List.unmodifiable(_channels);
4347

@@ -271,15 +275,18 @@ class ApiService {
271275

272276
/// Enable heartbeat mode (called when auto mode starts)
273277
/// Heartbeat fires after 3 minutes of API inactivity to keep session alive
274-
void enableHeartbeat() {
278+
/// @param gpsProvider Callback to get current GPS coordinates for heartbeat
279+
void enableHeartbeat({({double lat, double lon})? Function()? gpsProvider}) {
275280
_heartbeatEnabled = true;
281+
_gpsProvider = gpsProvider;
276282
_resetHeartbeatTimer();
277283
debugLog('[API] Heartbeat mode enabled (3 min idle timeout)');
278284
}
279285

280286
/// Disable heartbeat mode (called when auto mode stops)
281287
void disableHeartbeat() {
282288
_heartbeatEnabled = false;
289+
_gpsProvider = null;
283290
_heartbeatTimer?.cancel();
284291
_heartbeatTimer = null;
285292
debugLog('[API] Heartbeat mode disabled');
@@ -293,7 +300,11 @@ class ApiService {
293300
_heartbeatTimer?.cancel();
294301
_heartbeatTimer = Timer(heartbeatIdleTimeout, () async {
295302
debugLog('[API] Heartbeat timer fired (3 min idle), sending keepalive');
296-
final result = await sendHeartbeat();
303+
304+
// Get GPS coordinates from provider (matching wardrive.js behavior)
305+
final coords = _gpsProvider?.call();
306+
final result = await sendHeartbeat(lat: coords?.lat, lon: coords?.lon);
307+
297308
if (result?['success'] == true) {
298309
debugLog('[API] Heartbeat successful');
299310
_resetHeartbeatTimer(); // Schedule next heartbeat

0 commit comments

Comments
 (0)