diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip index af78702..02dec86 100644 Binary files a/ios/Runner.app.dSYM.zip and b/ios/Runner.app.dSYM.zip differ diff --git a/ios/Runner.ipa b/ios/Runner.ipa index 65f5cbe..bf9acd4 100644 Binary files a/ios/Runner.ipa and b/ios/Runner.ipa differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 24674c4..4cbc17d 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -489,7 +489,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -511,7 +511,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -530,7 +530,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -547,7 +547,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -679,7 +679,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -702,7 +702,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 47; + CURRENT_PROJECT_VERSION = 48; DEVELOPMENT_TEAM = JND55328G8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 1800a08..0a0d4cf 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -43,7 +43,7 @@ CFBundleSignature ???? CFBundleVersion - 47 + 48 LSRequiresIPhoneOS NSBluetoothAlwaysUsageDescription diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml index 5316700..2185de7 100644 --- a/ios/fastlane/report.xml +++ b/ios/fastlane/report.xml @@ -5,22 +5,22 @@ - + - + - + - + diff --git a/lib/screens/map_tab.dart b/lib/screens/map_tab.dart index eb5121b..cb6b8e8 100644 --- a/lib/screens/map_tab.dart +++ b/lib/screens/map_tab.dart @@ -1852,10 +1852,10 @@ class _MapTabState extends State with AutomaticKeepAliveClientMixin { points: contact.advertHistory .map((advert) => advert.location) .toList(), - color: color, - strokeWidth: 2.5, // Thinner than user trail - borderColor: Colors.white.withValues(alpha: 0.3), - borderStrokeWidth: 1.0, + color: color.withValues(alpha: 0.95), // More opaque for better visibility + strokeWidth: 4.5, // Thicker for better visibility on all map backgrounds + borderColor: Colors.white.withValues(alpha: 0.6), // Stronger border contrast + borderStrokeWidth: 2.0, // Wider border // DASHED pattern to distinguish from solid user trail pattern: StrokePattern.dashed(segments: [8, 4]), ); diff --git a/lib/services/trail_color_service.dart b/lib/services/trail_color_service.dart index e07ee70..0779dca 100644 --- a/lib/services/trail_color_service.dart +++ b/lib/services/trail_color_service.dart @@ -4,193 +4,183 @@ import '../models/contact.dart'; /// Service for assigning consistent colors to contact trails /// Uses emoji-based semantic mapping with deterministic hash fallback class TrailColorService { - // 64-color palette optimized for visibility on maps + // 64-color pastel palette optimized for visibility on all map types // Organized by hue families for better distribution + // Avoids red/orange/yellow spectrum to prevent confusion with fire markers // Avoids pure blue (#2196F3) which is reserved for user trail static final List _colorPalette = [ - // Reds (8) - const Color(0xFFE53935), - const Color(0xFFD32F2F), - const Color(0xFFC62828), - const Color(0xFFB71C1C), - const Color(0xFFFF5252), - const Color(0xFFFF1744), - const Color(0xFFD50000), - const Color(0xFFC51162), + // Pinks & Light Corals (8) + const Color(0xFFFFB6C1), // Light Pink + const Color(0xFFFF7F7F), // Coral + const Color(0xFFFFC0CB), // Pink + const Color(0xFFFFB3BA), // Pastel Pink + const Color(0xFFFF9AA2), // Light Coral + const Color(0xFFFFDAE9), // Pale Pink + const Color(0xFFFAA0B8), // Pastel Rose + const Color(0xFFFF8FA3), // Salmon Pink - // Pinks (4) - const Color(0xFFEC407A), - const Color(0xFFE91E63), - const Color(0xFFC2185B), - const Color(0xFFAD1457), + // Purples & Plums (8) + const Color(0xFFE6E6FA), // Lavender + const Color(0xFFDDA0DD), // Plum + const Color(0xFFD8BFD8), // Thistle + const Color(0xFFDDA5E9), // Pastel Purple + const Color(0xFFE0BBE4), // Mauve + const Color(0xFFC5A3E0), // Light Purple + const Color(0xFFB19CD9), // Medium Lavender + const Color(0xFFAF9FCD), // Wisteria - // Purples (8) - const Color(0xFF9C27B0), - const Color(0xFF8E24AA), - const Color(0xFF7B1FA2), - const Color(0xFF6A1B9A), - const Color(0xFFAB47BC), - const Color(0xFF9C27B0), - const Color(0xFF8E24AA), - const Color(0xFF7B1FA2), + // Blues & Sky (12) + const Color(0xFF87CEEB), // Sky Blue + const Color(0xFFB0E0E6), // Powder Blue + const Color(0xFFADD8E6), // Light Blue + const Color(0xFF87CEFA), // Light Sky Blue + const Color(0xFFB0C4DE), // Light Steel Blue + const Color(0xFF9BB8D3), // Pastel Blue + const Color(0xFF89CFF0), // Baby Blue + const Color(0xFFA2C8EC), // Columbia Blue + const Color(0xFF7FB3D5), // Pale Blue + const Color(0xFF6A9FB5), // Air Force Blue + const Color(0xFF8DB4D2), // Soft Blue + const Color(0xFF7BA5C9), // Light Denim - // Deep Purples (4) - const Color(0xFF673AB7), - const Color(0xFF5E35B1), - const Color(0xFF512DA8), - const Color(0xFF4527A0), + // Cyans & Teals (8) + const Color(0xFF5F9EA0), // Cadet Blue + const Color(0xFF7FFFD4), // Aquamarine + const Color(0xFF98D8C8), // Mint + const Color(0xFF82E0D5), // Pale Cyan + const Color(0xFF8FD8D8), // Light Teal + const Color(0xFF81C0BB), // Cadet Teal + const Color(0xFF72B0A8), // Medium Teal + const Color(0xFF6FA09E), // Soft Teal - // Indigos (4) - const Color(0xFF3F51B5), - const Color(0xFF3949AB), - const Color(0xFF303F9F), - const Color(0xFF283593), + // Greens & Mints (8) + const Color(0xFF90EE90), // Light Green + const Color(0xFF98D8B4), // Celadon + const Color(0xFFA8E4A0), // Granny Smith + const Color(0xFFB2E8B2), // Tea Green + const Color(0xFF9FD8AF), // Eton Blue + const Color(0xFF8FC49F), // Pastel Green + const Color(0xFF7EB693), // Cambridge Blue + const Color(0xFF73A685), // Russian Green - // Blues (4) - Dark blues only, avoid user trail blue - const Color(0xFF1E88E5), - const Color(0xFF1976D2), - const Color(0xFF1565C0), - const Color(0xFF0D47A1), + // Beiges & Tans (12) + const Color(0xFFD2B48C), // Tan + const Color(0xFFDEB887), // Burlywood + const Color(0xFFE0D8B0), // Beige + const Color(0xFFFFDAB9), // Peach + const Color(0xFFFFE4B5), // Moccasin + const Color(0xFFFFF8DC), // Cornsilk + const Color(0xFFE8D5C4), // Champagne + const Color(0xFFD4C5B9), // Dust + const Color(0xFFC9B8A9), // Khaki + const Color(0xFFBCAA99), // Cashmere + const Color(0xFFB09B87), // Taupe + const Color(0xFFA58F7A), // Mocha - // Cyans (4) - const Color(0xFF00ACC1), - const Color(0xFF0097A7), - const Color(0xFF00838F), - const Color(0xFF006064), - - // Teals (4) - const Color(0xFF00897B), - const Color(0xFF00796B), - const Color(0xFF00695C), - const Color(0xFF004D40), - - // Greens (8) - const Color(0xFF43A047), - const Color(0xFF388E3C), - const Color(0xFF2E7D32), - const Color(0xFF1B5E20), - const Color(0xFF66BB6A), - const Color(0xFF4CAF50), - const Color(0xFF388E3C), - const Color(0xFF2E7D32), - - // Limes (4) - const Color(0xFF9E9D24), - const Color(0xFF827717), - const Color(0xFFC0CA33), - const Color(0xFFAFB42B), - - // Ambers (4) - const Color(0xFFFFA726), - const Color(0xFFFF9800), - const Color(0xFFFB8C00), - const Color(0xFFF57C00), - - // Oranges (4) - const Color(0xFFFF7043), - const Color(0xFFFF5722), - const Color(0xFFF4511E), - const Color(0xFFE64A19), - - // Browns (4) - const Color(0xFF6D4C41), - const Color(0xFF5D4037), - const Color(0xFF4E342E), - const Color(0xFF3E2723), + // Grays & Silvers (8) + const Color(0xFFD3D3D3), // Light Gray + const Color(0xFFC0C0C0), // Silver + const Color(0xFFBCBCBC), // Bright Gray + const Color(0xFFB2B2B2), // Medium Gray + const Color(0xFFA9A9A9), // Dark Gray + const Color(0xFF9E9E9E), // Gray + const Color(0xFF8E8E8E), // Taupe Gray + const Color(0xFF7E7E7E), // Granite ]; // Emoji to color mapping for SAR roles - // Uses semantic colors that match emergency service conventions + // Uses pastel semantic colors for high visibility on maps + // Avoids red/orange/yellow to prevent confusion with fire markers static final Map _emojiColorMap = { // Emergency Services - Firefighters - '🚒': Color(0xFFD32F2F), // Fire engine → Red - '🧑‍🚒': Color(0xFFD32F2F), // Firefighter → Red - '👨‍🚒': Color(0xFFD32F2F), // Firefighter → Red - '👩‍🚒': Color(0xFFD32F2F), // Firefighter → Red - '🔥': Color(0xFFFF5722), // Fire → Orange-Red + '🚒': Color(0xFFFF7F7F), // Fire engine → Coral + '🧑‍🚒': Color(0xFFFF7F7F), // Firefighter → Coral + '👨‍🚒': Color(0xFFFF7F7F), // Firefighter → Coral + '👩‍🚒': Color(0xFFFF7F7F), // Firefighter → Coral + '🔥': Color(0xFFFFB6C1), // Fire → Light Pink // Emergency Services - Medical - '🚑': Color(0xFF43A047), // Ambulance → Green (medical cross) - '👨‍⚕️': Color(0xFF43A047), // Health worker → Green - '👩‍⚕️': Color(0xFF43A047), // Health worker → Green - '🧑‍⚕️': Color(0xFF43A047), // Health worker → Green - '⚕️': Color(0xFF43A047), // Medical symbol → Green + '🚑': Color(0xFF7FFFD4), // Ambulance → Mint (medical cross) + '👨‍⚕️': Color(0xFF7FFFD4), // Health worker → Mint + '👩‍⚕️': Color(0xFF7FFFD4), // Health worker → Mint + '🧑‍⚕️': Color(0xFF7FFFD4), // Health worker → Mint + '⚕️': Color(0xFF7FFFD4), // Medical symbol → Mint // Emergency Services - Police - '👮': Color(0xFF1976D2), // Police → Blue - '👮‍♂️': Color(0xFF1976D2), // Police → Blue - '👮‍♀️': Color(0xFF1976D2), // Police → Blue - '🚔': Color(0xFF1976D2), // Police car → Blue + '👮': Color(0xFF87CEEB), // Police → Light Blue + '👮‍♂️': Color(0xFF87CEEB), // Police → Light Blue + '👮‍♀️': Color(0xFF87CEEB), // Police → Light Blue + '🚔': Color(0xFF87CEEB), // Police car → Light Blue // Emergency Services - Aviation - '🧑‍✈️': Color(0xFF1565C0), // Pilot → Dark Blue - '👨‍✈️': Color(0xFF1565C0), // Pilot → Dark Blue - '👩‍✈️': Color(0xFF1565C0), // Pilot → Dark Blue - '🚁': Color(0xFF8E24AA), // Helicopter → Purple + '🧑‍✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue + '👨‍✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue + '👩‍✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue + '🚁': Color(0xFFE6E6FA), // Helicopter → Lavender // SAR Roles - Mountain/Alpine - '🏔️': Color(0xFF6D4C41), // Mountain → Brown - '⛰️': Color(0xFF6D4C41), // Mountain → Brown - '🧗': Color(0xFF6D4C41), // Climber → Brown - '🧗‍♂️': Color(0xFF6D4C41), // Climber → Brown - '🧗‍♀️': Color(0xFF6D4C41), // Climber → Brown - '🥾': Color(0xFF5D4037), // Hiking boot → Dark Brown + '🏔️': Color(0xFFD2B48C), // Mountain → Tan + '⛰️': Color(0xFFD2B48C), // Mountain → Tan + '🧗': Color(0xFFD2B48C), // Climber → Tan + '🧗‍♂️': Color(0xFFD2B48C), // Climber → Tan + '🧗‍♀️': Color(0xFFD2B48C), // Climber → Tan + '🥾': Color(0xFFDEB887), // Hiking boot → Burlywood // SAR Roles - K9 Unit - '🐕': Color(0xFFFFA726), // Dog → Orange - '🐶': Color(0xFFFFA726), // Dog → Orange - '🦮': Color(0xFFFFA726), // Service dog → Orange + '🐕': Color(0xFFFFDAB9), // Dog → Peach + '🐶': Color(0xFFFFDAB9), // Dog → Peach + '🦮': Color(0xFFFFDAB9), // Service dog → Peach // SAR Roles - Water Rescue - '🚤': Color(0xFF00ACC1), // Speedboat → Cyan - '⛵': Color(0xFF00ACC1), // Sailboat → Cyan - '🏊': Color(0xFF00897B), // Swimmer → Teal - '🏊‍♂️': Color(0xFF00897B), // Swimmer → Teal - '🏊‍♀️': Color(0xFF00897B), // Swimmer → Teal + '🚤': Color(0xFF87CEEB), // Speedboat → Sky Blue + '⛵': Color(0xFF87CEEB), // Sailboat → Sky Blue + '🏊': Color(0xFF5F9EA0), // Swimmer → Cadet Blue + '🏊‍♂️': Color(0xFF5F9EA0), // Swimmer → Cadet Blue + '🏊‍♀️': Color(0xFF5F9EA0), // Swimmer → Cadet Blue // Team Roles - Leadership - '🎯': Color(0xFFE64A19), // Target → Deep Orange (team leader) - '⭐': Color(0xFFFDD835), // Star → Yellow (coordinator) - '👑': Color(0xFFFDD835), // Crown → Yellow (leader) + '🎯': Color(0xFFFFB6C1), // Target → Light Pink (team leader) + '⭐': Color(0xFFFFE4B5), // Star → Moccasin (coordinator) + '👑': Color(0xFFFFE4B5), // Crown → Moccasin (leader) // Team Roles - Communication - '📡': Color(0xFF00897B), // Satellite → Teal (radio/comms) - '📻': Color(0xFF00897B), // Radio → Teal - '📞': Color(0xFF00897B), // Phone → Teal + '📡': Color(0xFF5F9EA0), // Satellite → Cadet Blue (radio/comms) + '📻': Color(0xFF5F9EA0), // Radio → Cadet Blue + '📞': Color(0xFF5F9EA0), // Phone → Cadet Blue // Team Roles - Navigation - '🗺️': Color(0xFF00ACC1), // Map → Cyan (navigator) - '🧭': Color(0xFF00ACC1), // Compass → Cyan - '📍': Color(0xFFE53935), // Pin → Red (location marker) + '🗺️': Color(0xFF87CEEB), // Map → Sky Blue (navigator) + '🧭': Color(0xFF87CEEB), // Compass → Sky Blue + '📍': Color(0xFFFF7F7F), // Pin → Coral (location marker) // Team Roles - Documentation - '📷': Color(0xFFAB47BC), // Camera → Light Purple - '📹': Color(0xFFAB47BC), // Video camera → Light Purple - '📝': Color(0xFF9E9D24), // Note → Lime (scribe) + '📷': Color(0xFFDDA0DD), // Camera → Plum + '📹': Color(0xFFDDA0DD), // Video camera → Plum + '📝': Color(0xFFE0E0A0), // Note → Khaki (scribe) // Equipment - '🔦': Color(0xFFFB8C00), // Flashlight → Amber - '⚡': Color(0xFFFDD835), // Lightning → Yellow (power/energy) - '🔋': Color(0xFF43A047), // Battery → Green - '🎒': Color(0xFF5D4037), // Backpack → Brown + '🔦': Color(0xFFFFE4B5), // Flashlight → Moccasin + '⚡': Color(0xFFFFE4B5), // Lightning → Moccasin (power/energy) + '🔋': Color(0xFF7FFFD4), // Battery → Mint + '🎒': Color(0xFFDEB887), // Backpack → Burlywood // Generic Person Icons - '👤': Color(0xFF9E9E9E), // Silhouette → Gray - '🧑': Color(0xFF9E9E9E), // Person → Gray - '👨': Color(0xFF9E9E9E), // Man → Gray - '👩': Color(0xFF9E9E9E), // Woman → Gray - '👥': Color(0xFF757575), // People → Dark Gray + '👤': Color(0xFFD3D3D3), // Silhouette → Light Gray + '🧑': Color(0xFFD3D3D3), // Person → Light Gray + '👨': Color(0xFFD3D3D3), // Man → Light Gray + '👩': Color(0xFFD3D3D3), // Woman → Light Gray + '👥': Color(0xFFC0C0C0), // People → Silver }; /// Get trail color for a contact /// Priority: Emoji mapping > Name hash > Default + /// Returns fully opaque color - alpha transparency applied by caller static Color getTrailColor(Contact contact) { // 1. Try emoji-based color mapping if (contact.roleEmoji != null) { final emojiColor = _emojiColorMap[contact.roleEmoji]; if (emojiColor != null) { - // Return with slight transparency for better map visibility - return emojiColor.withValues(alpha: 0.75); + return emojiColor; } } @@ -203,7 +193,7 @@ class TrailColorService { final hash = _hashString(name); final colorIndex = hash % _colorPalette.length; // 0-63 - return _colorPalette[colorIndex].withValues(alpha: 0.75); + return _colorPalette[colorIndex]; } /// Simple string hash function (DJB2 algorithm)