diff --git a/lib/models/suspected_location.dart b/lib/models/suspected_location.dart index fd7c05a..63346c3 100644 --- a/lib/models/suspected_location.dart +++ b/lib/models/suspected_location.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:flutter/foundation.dart'; import 'package:latlong2/latlong.dart'; /// A suspected surveillance location from the CSV data @@ -35,8 +36,8 @@ class SuspectedLocation { bounds = coordinates.bounds; } catch (e) { // If GeoJSON parsing fails, use default coordinates - print('[SuspectedLocation] Failed to parse GeoJSON for ticket $ticketNo: $e'); - print('[SuspectedLocation] Location string: $locationString'); + debugPrint('[SuspectedLocation] Failed to parse GeoJSON for ticket $ticketNo: $e'); + debugPrint('[SuspectedLocation] Location string: $locationString'); } } @@ -60,7 +61,7 @@ class SuspectedLocation { // The geoJson IS the geometry object (not wrapped in a 'geometry' property) final coordinates = geoJson['coordinates'] as List?; if (coordinates == null || coordinates.isEmpty) { - print('[SuspectedLocation] No coordinates found in GeoJSON'); + debugPrint('[SuspectedLocation] No coordinates found in GeoJSON'); return (centroid: const LatLng(0, 0), bounds: []); } @@ -109,7 +110,7 @@ class SuspectedLocation { } break; default: - print('Unsupported geometry type: $type'); + debugPrint('Unsupported geometry type: $type'); } if (points.isEmpty) { @@ -127,7 +128,7 @@ class SuspectedLocation { return (centroid: centroid, bounds: points); } catch (e) { - print('Error extracting coordinates from GeoJSON: $e'); + debugPrint('Error extracting coordinates from GeoJSON: $e'); return (centroid: const LatLng(0, 0), bounds: []); } } diff --git a/lib/services/auth_service.dart b/lib/services/auth_service.dart index 843d642..8aa94bb 100644 --- a/lib/services/auth_service.dart +++ b/lib/services/auth_service.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:developer'; +import 'package:flutter/foundation.dart'; import 'package:oauth2_client/oauth2_client.dart'; import 'package:oauth2_client/oauth2_helper.dart'; import 'package:http/http.dart' as http; @@ -98,7 +99,7 @@ class AuthService { _displayName = await _fetchUsername(token.accessToken!); return _displayName; } catch (e) { - print('AuthService: OAuth login failed: $e'); + debugPrint('AuthService: OAuth login failed: $e'); log('OAuth login failed: $e'); rethrow; } @@ -126,7 +127,7 @@ class AuthService { _displayName = await _fetchUsername(accessToken); return _displayName; } catch (e) { - print('AuthService: Error restoring login with stored token: $e'); + debugPrint('AuthService: Error restoring login with stored token: $e'); log('Error restoring login with stored token: $e'); // Token might be expired or invalid, clear it await logout(); @@ -192,7 +193,7 @@ class AuthService { final displayName = userData['user']?['display_name']; return displayName; } catch (e) { - print('AuthService: Error fetching username: $e'); + debugPrint('AuthService: Error fetching username: $e'); log('Error fetching username: $e'); return null; } diff --git a/lib/services/node_cache.dart b/lib/services/node_cache.dart index 2f72cfe..39a0207 100644 --- a/lib/services/node_cache.dart +++ b/lib/services/node_cache.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:latlong2/latlong.dart'; import '../models/osm_node.dart'; import 'package:flutter_map/flutter_map.dart' show LatLngBounds; @@ -85,7 +86,7 @@ class NodeCache { /// Remove a node by ID from the cache (used for successful deletions) void removeNodeById(int nodeId) { if (_nodes.remove(nodeId) != null) { - print('[NodeCache] Removed node $nodeId from cache (successful deletion)'); + debugPrint('[NodeCache] Removed node $nodeId from cache (successful deletion)'); } } @@ -111,19 +112,19 @@ class NodeCache { } if (nodesToRemove.isNotEmpty) { - print('[NodeCache] Removed ${nodesToRemove.length} temp nodes at coordinate ${coord.latitude}, ${coord.longitude}'); + debugPrint('[NodeCache] Removed ${nodesToRemove.length} temp nodes at coordinate ${coord.latitude}, ${coord.longitude}'); } } /// Remove a specific temporary node by its ID (for queue item-specific cleanup) void removeTempNodeById(int tempNodeId) { if (tempNodeId >= 0) { - print('[NodeCache] Warning: Attempted to remove non-temp node ID $tempNodeId'); + debugPrint('[NodeCache] Warning: Attempted to remove non-temp node ID $tempNodeId'); return; } if (_nodes.remove(tempNodeId) != null) { - print('[NodeCache] Removed specific temp node $tempNodeId from cache'); + debugPrint('[NodeCache] Removed specific temp node $tempNodeId from cache'); } } diff --git a/lib/state/auth_state.dart b/lib/state/auth_state.dart index 0b26be8..dcf163b 100644 --- a/lib/state/auth_state.dart +++ b/lib/state/auth_state.dart @@ -21,7 +21,7 @@ class AuthState extends ChangeNotifier { _username = await _auth.restoreLogin(); } } catch (e) { - print("AuthState: Error during auth initialization: $e"); + debugPrint("AuthState: Error during auth initialization: $e"); } } @@ -29,7 +29,7 @@ class AuthState extends ChangeNotifier { try { _username = await _auth.login(); } catch (e) { - print("AuthState: Login error: $e"); + debugPrint("AuthState: Login error: $e"); _username = null; } notifyListeners(); @@ -49,7 +49,7 @@ class AuthState extends ChangeNotifier { _username = null; } } catch (e) { - print("AuthState: Auth refresh error: $e"); + debugPrint("AuthState: Auth refresh error: $e"); _username = null; } notifyListeners(); @@ -59,7 +59,7 @@ class AuthState extends ChangeNotifier { try { _username = await _auth.forceLogin(); } catch (e) { - print("AuthState: Forced login error: $e"); + debugPrint("AuthState: Forced login error: $e"); _username = null; } notifyListeners(); @@ -69,7 +69,7 @@ class AuthState extends ChangeNotifier { try { return await _auth.isLoggedIn(); } catch (e) { - print("AuthState: Token validation error: $e"); + debugPrint("AuthState: Token validation error: $e"); return false; } } @@ -92,7 +92,7 @@ class AuthState extends ChangeNotifier { } } catch (e) { _username = null; - print("AuthState: Mode change user restoration error: $e"); + debugPrint("AuthState: Mode change user restoration error: $e"); } notifyListeners(); } diff --git a/lib/state/upload_queue_state.dart b/lib/state/upload_queue_state.dart index 1cafb1d..cabb8d4 100644 --- a/lib/state/upload_queue_state.dart +++ b/lib/state/upload_queue_state.dart @@ -29,23 +29,23 @@ class UploadQueueState extends ChangeNotifier { // Initialize by loading queue from storage and repopulate cache with pending nodes Future init() async { await _loadQueue(); - print('[UploadQueue] Loaded ${_queue.length} items from storage'); + debugPrint('[UploadQueue] Loaded ${_queue.length} items from storage'); _repopulateCacheFromQueue(); } // Repopulate the cache with pending nodes from the queue on startup void _repopulateCacheFromQueue() { - print('[UploadQueue] Repopulating cache from ${_queue.length} queue items'); + debugPrint('[UploadQueue] Repopulating cache from ${_queue.length} queue items'); final nodesToAdd = []; for (final upload in _queue) { // Skip completed uploads - they should already be in OSM and will be fetched normally if (upload.isComplete) { - print('[UploadQueue] Skipping completed upload at ${upload.coord}'); + debugPrint('[UploadQueue] Skipping completed upload at ${upload.coord}'); continue; } - print('[UploadQueue] Processing ${upload.operation} upload at ${upload.coord}'); + debugPrint('[UploadQueue] Processing ${upload.operation} upload at ${upload.coord}'); if (upload.isDeletion) { // For deletions: mark the original node as pending deletion if it exists in cache @@ -73,9 +73,7 @@ class UploadQueueState extends ChangeNotifier { tags['_temp_id'] = tempId.toString(); // Store temp ID for future cleanup if not already set - if (upload.tempNodeId == null) { - upload.tempNodeId = tempId; - } + upload.tempNodeId ??= tempId; if (upload.isEdit) { // For edits: also mark original with _pending_edit if it exists @@ -112,7 +110,7 @@ class UploadQueueState extends ChangeNotifier { if (nodesToAdd.isNotEmpty) { _nodeCache.addOrUpdate(nodesToAdd); - print('[UploadQueue] Repopulated cache with ${nodesToAdd.length} pending nodes from queue'); + debugPrint('[UploadQueue] Repopulated cache with ${nodesToAdd.length} pending nodes from queue'); // Save queue if we updated any temp IDs for backward compatibility _saveQueue(); @@ -587,7 +585,7 @@ class UploadQueueState extends ChangeNotifier { // Still have time, will retry after backoff delay final nextDelay = item.nextNodeSubmissionRetryDelay; final timeLeft = item.timeUntilAutoClose; - debugPrint('[UploadQueue] Will retry node submission in ${nextDelay}, ${timeLeft?.inMinutes}m remaining'); + debugPrint('[UploadQueue] Will retry node submission in $nextDelay, ${timeLeft?.inMinutes}m remaining'); // No state change needed - attempt count was already updated above } } @@ -646,7 +644,7 @@ class UploadQueueState extends ChangeNotifier { // Note: This will NEVER error out - will keep trying until 59-minute window expires final nextDelay = item.nextChangesetCloseRetryDelay; final timeLeft = item.timeUntilAutoClose; - debugPrint('[UploadQueue] Changeset close failed (attempt ${item.changesetCloseAttempts}), will retry in ${nextDelay}, ${timeLeft?.inMinutes}m remaining'); + debugPrint('[UploadQueue] Changeset close failed (attempt ${item.changesetCloseAttempts}), will retry in $nextDelay, ${timeLeft?.inMinutes}m remaining'); debugPrint('[UploadQueue] Error: ${result.errorMessage}'); // No additional state change needed - attempt count was already updated above }