diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png index 342225a..37fcf16 100644 Binary files a/android/app/src/main/res/drawable-hdpi/splash.png and b/android/app/src/main/res/drawable-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png index 5058638..8d3e645 100644 Binary files a/android/app/src/main/res/drawable-mdpi/splash.png and b/android/app/src/main/res/drawable-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png index 72b7566..6208dfc 100644 Binary files a/android/app/src/main/res/drawable-v21/background.png and b/android/app/src/main/res/drawable-v21/background.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png index 88007cc..1830788 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/splash.png and b/android/app/src/main/res/drawable-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png index 23a7632..6f1fa13 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/splash.png and b/android/app/src/main/res/drawable-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png index 7231139..96da8f7 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png index 72b7566..6208dfc 100644 Binary files a/android/app/src/main/res/drawable/background.png and b/android/app/src/main/res/drawable/background.png differ diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 9d69d3a..3cc4948 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -1,7 +1,5 @@ - - diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 98e79f7..3ff1cb0 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 96baa1c..a8ccbe3 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 2e62a59..4342270 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index c17a2f5..cee83f3 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index bea0ec8..37fcf16 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/assets/app_icon.png b/assets/app_icon.png index d1e6b85..82ca41a 100644 Binary files a/assets/app_icon.png and b/assets/app_icon.png differ diff --git a/do_builds.sh b/do_builds.sh index 404fe46..098bdb8 100755 --- a/do_builds.sh +++ b/do_builds.sh @@ -3,14 +3,18 @@ appver=$(cat lib/dev_config.dart | grep "kClientVersion" | cut -d '=' -f 2 | tr -d ';' | tr -d "\'" | tr -d " ") echo echo "Building app version ${appver}..." + flutter build ios --no-codesign flutter build apk echo + echo "Converting .app to .ipa..." ./app2ipa.sh build/ios/iphoneos/Runner.app echo + echo "Moving files..." cp build/app/outputs/flutter-apk/app-release.apk ../flockmap_v${appver}.apk mv Runner.ipa ../flockmap_v${appver}.ipa echo + echo "Done." diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 7231139..eea7421 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index a9b1b69..00a6d81 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 1132dd1..71feb2a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index e837435..fa79e74 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 2eb1893..a66f065 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 0feeb43..ae08254 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 2b74b1c..752db9b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 1132dd1..71feb2a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index b2bb6bb..b95b378 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 17f5768..df06773 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png index 1a263d8..b0ad747 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index 6c4f500..05e9535 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png index 4c71668..0d38a90 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png index 94bef5f..c3b1627 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 17f5768..df06773 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 5febe7e..8cb2b2b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index 98e79f7..3ff1cb0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png index c17a2f5..cee83f3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index d017514..f400074 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 673b6b6..936f752 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0d3b296..07f6af2 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png index 72b7566..6208dfc 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png index 5058638..8d3e645 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png index 88007cc..1830788 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png index 23a7632..6f1fa13 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index 27363f5..7aa6dfb 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -16,13 +16,19 @@ - - + + - + - - + + + + + + + + @@ -32,6 +38,7 @@ - + + diff --git a/lib/dev_config.dart b/lib/dev_config.dart index cb7e404..2b122c6 100644 --- a/lib/dev_config.dart +++ b/lib/dev_config.dart @@ -28,6 +28,9 @@ const double kAddPinYOffset = 0.0; const String kClientName = 'DeFlock'; const String kClientVersion = '0.9.8'; +// Development/testing features - set to false for production builds +const bool kEnableDevelopmentModes = false; // Set to false to hide sandbox/simulate modes and force production mode + // Marker/node interaction const int kCameraMinZoomLevel = 10; // Minimum zoom to show nodes or warning const Duration kMarkerTapTimeout = Duration(milliseconds: 250); diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 09fff92..9131e92 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -11,6 +11,7 @@ import 'settings_screen_sections/max_nodes_section.dart'; import 'settings_screen_sections/tile_provider_section.dart'; import 'settings_screen_sections/language_section.dart'; import '../services/localization_service.dart'; +import '../dev_config.dart'; class SettingsScreen extends StatelessWidget { const SettingsScreen({super.key}); @@ -23,28 +24,31 @@ class SettingsScreen extends StatelessWidget { appBar: AppBar(title: Text(LocalizationService.instance.t('settings.title'))), body: ListView( padding: const EdgeInsets.all(16), - children: const [ - UploadModeSection(), - Divider(), - AuthSection(), - Divider(), - QueueSection(), - Divider(), - ProfileListSection(), - Divider(), - OperatorProfileListSection(), - Divider(), - MaxNodesSection(), - Divider(), - TileProviderSection(), - Divider(), - OfflineModeSection(), - Divider(), - OfflineAreasSection(), - Divider(), - LanguageSection(), - Divider(), - AboutSection(), + children: [ + // Only show upload mode section in development builds + if (kEnableDevelopmentModes) ...[ + const UploadModeSection(), + const Divider(), + ], + const AuthSection(), + const Divider(), + const QueueSection(), + const Divider(), + const ProfileListSection(), + const Divider(), + const OperatorProfileListSection(), + const Divider(), + const MaxNodesSection(), + const Divider(), + const TileProviderSection(), + const Divider(), + const OfflineModeSection(), + const Divider(), + const OfflineAreasSection(), + const Divider(), + const LanguageSection(), + const Divider(), + const AboutSection(), ], ), ), diff --git a/lib/services/auth_service.dart b/lib/services/auth_service.dart index bd080a8..53809eb 100644 --- a/lib/services/auth_service.dart +++ b/lib/services/auth_service.dart @@ -106,6 +106,36 @@ class AuthService { } } + // Restore login state from stored token (for app startup) + Future restoreLogin() async { + if (_mode == UploadMode.simulate) { + final prefs = await SharedPreferences.getInstance(); + final isLoggedIn = prefs.getBool('sim_user_logged_in') ?? false; + if (isLoggedIn) { + _displayName = 'Demo User'; + return _displayName; + } + return null; + } + + // Get stored token directly from SharedPreferences + final accessToken = await getAccessToken(); + if (accessToken == null) { + return null; + } + + try { + _displayName = await _fetchUsername(accessToken); + return _displayName; + } catch (e) { + print('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(); + return null; + } + } + Future logout() async { if (_mode == UploadMode.simulate) { final prefs = await SharedPreferences.getInstance(); diff --git a/lib/state/auth_state.dart b/lib/state/auth_state.dart index 201a714..0b26be8 100644 --- a/lib/state/auth_state.dart +++ b/lib/state/auth_state.dart @@ -18,7 +18,7 @@ class AuthState extends ChangeNotifier { try { if (await _auth.isLoggedIn()) { - _username = await _auth.login(); + _username = await _auth.restoreLogin(); } } catch (e) { print("AuthState: Error during auth initialization: $e"); @@ -44,7 +44,7 @@ class AuthState extends ChangeNotifier { Future refreshAuthState() async { try { if (await _auth.isLoggedIn()) { - _username = await _auth.login(); + _username = await _auth.restoreLogin(); } else { _username = null; } @@ -83,7 +83,7 @@ class AuthState extends ChangeNotifier { if (await _auth.isLoggedIn()) { final isValid = await validateToken(); if (isValid) { - _username = await _auth.login(); + _username = await _auth.restoreLogin(); } else { await logout(); // This clears _username also. } diff --git a/lib/state/settings_state.dart b/lib/state/settings_state.dart index 08f786c..0857960 100644 --- a/lib/state/settings_state.dart +++ b/lib/state/settings_state.dart @@ -4,6 +4,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:collection/collection.dart'; import '../models/tile_provider.dart'; +import '../dev_config.dart'; // Enum for upload mode (Production, OSM Sandbox, Simulate) enum UploadMode { production, sandbox, simulate } @@ -26,7 +27,7 @@ class SettingsState extends ChangeNotifier { bool _offlineMode = false; int _maxCameras = 250; - UploadMode _uploadMode = UploadMode.simulate; + UploadMode _uploadMode = kEnableDevelopmentModes ? UploadMode.simulate : UploadMode.production; FollowMeMode _followMeMode = FollowMeMode.northUp; List _tileProviders = []; String _selectedTileTypeId = ''; @@ -98,6 +99,13 @@ class SettingsState extends ChangeNotifier { await prefs.setInt(_uploadModePrefsKey, _uploadMode.index); } + // In production builds, force production mode if development modes are disabled + if (!kEnableDevelopmentModes && _uploadMode != UploadMode.production) { + debugPrint('SettingsState: Development modes disabled, forcing production mode'); + _uploadMode = UploadMode.production; + await prefs.setInt(_uploadModePrefsKey, _uploadMode.index); + } + // Load tile providers (default to built-in providers if none saved) await _loadTileProviders(prefs); @@ -170,6 +178,12 @@ class SettingsState extends ChangeNotifier { } Future setUploadMode(UploadMode mode) async { + // In production builds, only allow production mode + if (!kEnableDevelopmentModes && mode != UploadMode.production) { + debugPrint('SettingsState: Development modes disabled, forcing production mode'); + mode = UploadMode.production; + } + _uploadMode = mode; final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_uploadModePrefsKey, mode.index); diff --git a/pubspec.yaml b/pubspec.yaml index eb89bbe..6a4e7c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,7 +43,7 @@ flutter: - lib/localizations/ flutter_native_splash: - color: "#202020" + color: "#152131" image: assets/app_icon.png android: true ios: true