diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d0fcc44..d78a7ea 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -13,6 +13,9 @@ android { compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 + // Required by some dependencies (e.g., flutter_local_notifications) + // to support Java 8+ APIs on older Android devices. + isCoreLibraryDesugaringEnabled = true } kotlinOptions { @@ -42,3 +45,8 @@ android { flutter { source = "../.." } + +dependencies { + // Core library desugaring support library + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") +} diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png index 88c9355..fd20a8e 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png index 9bbc576..8c6e630 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png index b485d23..ff9d71c 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png index d51c4d2..41d83ae 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png index 19cdad6..07c3067 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/icon.png b/icon.png index bc817a5..6753d4a 100644 Binary files a/icon.png and b/icon.png differ diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip index b666670..85f0d26 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 b91f49e..426027e 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 c5cd293..652a87c 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 = 14; + CURRENT_PROJECT_VERSION = 17; 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 = 14; + CURRENT_PROJECT_VERSION = 17; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests; @@ -529,7 +529,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 17; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests; @@ -545,7 +545,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 17; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests; @@ -676,7 +676,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 17; DEVELOPMENT_TEAM = JND55328G8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -699,7 +699,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 17; DEVELOPMENT_TEAM = JND55328G8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 1.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 1.png deleted file mode 100644 index df9b639..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 2.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 2.png deleted file mode 100644 index df9b639..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024 2.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024.png deleted file mode 100644 index df9b639..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon 11024x1024.png and /dev/null differ 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 4fa585f..5a47b7e 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 95d7306..d4c4f1a 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 a512cc4..b048832 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 dac0e7f..0120ab7 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 b6fd8da..28bcbb6 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 1d0d1c8..54750ad 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 95705ce..45216fd 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 a512cc4..b048832 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 5a36032..66c871c 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 bdab2dd..dde0afd 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 f6e4306..b5c100c 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 563fb1a..4a7ea9d 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 688b377..bb4a242 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 fcaa7cf..c1a2bc2 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 bdab2dd..dde0afd 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 c71a732..e0877d7 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 88c9355..fd20a8e 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 d51c4d2..41d83ae 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 d4c7a6e..a423f4c 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 c420306..842d351 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 802e6e8..f25ae33 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/Info.plist b/ios/Runner/Info.plist index 06b3c1c..dd820cd 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 14 + 17 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml index ee27f90..6b73287 100644 --- a/ios/fastlane/report.xml +++ b/ios/fastlane/report.xml @@ -5,22 +5,17 @@ - + - + - - - - - - + diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 308edb5..78eccb9 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1733,5 +1733,48 @@ "tapToViewOnMap": "Tap to view on map", "@tapToViewOnMap": { "description": "Notification action text" + }, + + "radioSettings": "Radio Settings", + "@radioSettings": { + "description": "Section title for radio settings" + }, + + "frequencyMHz": "Frequency (MHz)", + "@frequencyMHz": { + "description": "Label for radio frequency field" + }, + + "frequencyExample": "e.g., 869.618", + "@frequencyExample": { + "description": "Helper text example for frequency" + }, + + "bandwidth": "Bandwidth", + "@bandwidth": { + "description": "Label for bandwidth dropdown" + }, + + "spreadingFactor": "Spreading Factor", + "@spreadingFactor": { + "description": "Label for spreading factor dropdown" + }, + + "codingRate": "Coding Rate", + "@codingRate": { + "description": "Label for coding rate dropdown" + }, + + "txPowerDbm": "TX Power (dBm)", + "@txPowerDbm": { + "description": "Label for TX power field" + }, + + "maxPowerDbm": "Max: {power} dBm", + "@maxPowerDbm": { + "description": "Helper text showing maximum TX power", + "placeholders": { + "power": { "type": "int" } + } } } diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 566b01e..1d284f6 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -581,5 +581,14 @@ "coordinates": "Koordinate", - "tapToViewOnMap": "Dodirnite za prikaz na karti" + "tapToViewOnMap": "Dodirnite za prikaz na karti", + + "radioSettings": "Postavke radija", + "frequencyMHz": "Frekvencija (MHz)", + "frequencyExample": "npr. 869.618", + "bandwidth": "Širina pojasa", + "spreadingFactor": "Faktor širenja", + "codingRate": "Omjer kodiranja", + "txPowerDbm": "TX snaga (dBm)", + "maxPowerDbm": "Maks: {power} dBm" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 39a94a2..2e69a9a 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -1850,6 +1850,54 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Tap to view on map'** String get tapToViewOnMap; + + /// Section title for radio settings + /// + /// In en, this message translates to: + /// **'Radio Settings'** + String get radioSettings; + + /// Label for radio frequency field + /// + /// In en, this message translates to: + /// **'Frequency (MHz)'** + String get frequencyMHz; + + /// Helper text example for frequency + /// + /// In en, this message translates to: + /// **'e.g., 869.618'** + String get frequencyExample; + + /// Label for bandwidth dropdown + /// + /// In en, this message translates to: + /// **'Bandwidth'** + String get bandwidth; + + /// Label for spreading factor dropdown + /// + /// In en, this message translates to: + /// **'Spreading Factor'** + String get spreadingFactor; + + /// Label for coding rate dropdown + /// + /// In en, this message translates to: + /// **'Coding Rate'** + String get codingRate; + + /// Label for TX power field + /// + /// In en, this message translates to: + /// **'TX Power (dBm)'** + String get txPowerDbm; + + /// Helper text showing maximum TX power + /// + /// In en, this message translates to: + /// **'Max: {power} dBm'** + String maxPowerDbm(int power); } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 1b19817..3632038 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1009,4 +1009,30 @@ class AppLocalizationsEn extends AppLocalizations { @override String get tapToViewOnMap => 'Tap to view on map'; + + @override + String get radioSettings => 'Radio Settings'; + + @override + String get frequencyMHz => 'Frequency (MHz)'; + + @override + String get frequencyExample => 'e.g., 869.618'; + + @override + String get bandwidth => 'Bandwidth'; + + @override + String get spreadingFactor => 'Spreading Factor'; + + @override + String get codingRate => 'Coding Rate'; + + @override + String get txPowerDbm => 'TX Power (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Max: $power dBm'; + } } diff --git a/lib/l10n/app_localizations_hr.dart b/lib/l10n/app_localizations_hr.dart index 63c1606..6d3639e 100644 --- a/lib/l10n/app_localizations_hr.dart +++ b/lib/l10n/app_localizations_hr.dart @@ -1011,4 +1011,30 @@ class AppLocalizationsHr extends AppLocalizations { @override String get tapToViewOnMap => 'Dodirnite za prikaz na karti'; + + @override + String get radioSettings => 'Postavke radija'; + + @override + String get frequencyMHz => 'Frekvencija (MHz)'; + + @override + String get frequencyExample => 'npr. 869.618'; + + @override + String get bandwidth => 'Širina pojasa'; + + @override + String get spreadingFactor => 'Faktor širenja'; + + @override + String get codingRate => 'Omjer kodiranja'; + + @override + String get txPowerDbm => 'TX snaga (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Maks: $power dBm'; + } } diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index c516629..a0d3af9 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -1011,4 +1011,30 @@ class AppLocalizationsSl extends AppLocalizations { @override String get tapToViewOnMap => 'Tapnite za prikaz na zemljevidu'; + + @override + String get radioSettings => 'Nastavitve radia'; + + @override + String get frequencyMHz => 'Frekvenca (MHz)'; + + @override + String get frequencyExample => 'npr. 869.618'; + + @override + String get bandwidth => 'Pasovna širina'; + + @override + String get spreadingFactor => 'Faktor razširitve'; + + @override + String get codingRate => 'Razmerje kodiranja'; + + @override + String get txPowerDbm => 'Izhodna moč (dBm)'; + + @override + String maxPowerDbm(int power) { + return 'Največ: $power dBm'; + } } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index e43b2c3..7017897 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -581,5 +581,14 @@ "coordinates": "Koordinate", - "tapToViewOnMap": "Tapnite za prikaz na zemljevidu" + "tapToViewOnMap": "Tapnite za prikaz na zemljevidu", + + "radioSettings": "Nastavitve radia", + "frequencyMHz": "Frekvenca (MHz)", + "frequencyExample": "npr. 869.618", + "bandwidth": "Pasovna širina", + "spreadingFactor": "Faktor razširitve", + "codingRate": "Razmerje kodiranja", + "txPowerDbm": "Izhodna moč (dBm)", + "maxPowerDbm": "Največ: {power} dBm" } diff --git a/lib/screens/device_config_screen.dart b/lib/screens/device_config_screen.dart index b074c43..d569f76 100644 --- a/lib/screens/device_config_screen.dart +++ b/lib/screens/device_config_screen.dart @@ -48,31 +48,44 @@ class _DeviceConfigScreenState extends State { text: deviceInfo.selfName ?? deviceInfo.deviceName ?? '', ); _latController = TextEditingController( - text: deviceInfo.advLat != null ? (deviceInfo.advLat! / 1000000).toStringAsFixed(6) : '0.0', + text: deviceInfo.advLat != null + ? (deviceInfo.advLat! / 1000000).toStringAsFixed(6) + : '0.0', ); _lonController = TextEditingController( - text: deviceInfo.advLon != null ? (deviceInfo.advLon! / 1000000).toStringAsFixed(6) : '0.0', + text: deviceInfo.advLon != null + ? (deviceInfo.advLon! / 1000000).toStringAsFixed(6) + : '0.0', ); _freqController = TextEditingController( - text: deviceInfo.radioFreq != null ? (deviceInfo.radioFreq! / 1000).toStringAsFixed(3) : '869.618', + text: deviceInfo.radioFreq != null + ? (deviceInfo.radioFreq! / 1000).toStringAsFixed(3) + : '869.618', ); _txPowerController = TextEditingController( text: deviceInfo.txPower?.toString() ?? '20', ); - if (deviceInfo.radioBw != null && deviceInfo.radioBw! >= 0 && deviceInfo.radioBw! <= 9) { + if (deviceInfo.radioBw != null && + deviceInfo.radioBw! >= 0 && + deviceInfo.radioBw! <= 9) { _selectedBandwidth = _bandwidthFromValue(deviceInfo.radioBw!); } - if (deviceInfo.radioSf != null && deviceInfo.radioSf! >= 7 && deviceInfo.radioSf! <= 12) { + if (deviceInfo.radioSf != null && + deviceInfo.radioSf! >= 7 && + deviceInfo.radioSf! <= 12) { _selectedSpreadingFactor = deviceInfo.radioSf!; } - if (deviceInfo.radioCr != null && deviceInfo.radioCr! >= 5 && deviceInfo.radioCr! <= 8) { + if (deviceInfo.radioCr != null && + deviceInfo.radioCr! >= 5 && + deviceInfo.radioCr! <= 8) { _selectedCodingRate = deviceInfo.radioCr!; } // Check if telemetry is enabled (check if lat/lon are set and not zero) - _telemetryEnabled = (deviceInfo.advLat != null && deviceInfo.advLat! != 0) || - (deviceInfo.advLon != null && deviceInfo.advLon! != 0); + _telemetryEnabled = + (deviceInfo.advLat != null && deviceInfo.advLat! != 0) || + (deviceInfo.advLon != null && deviceInfo.advLon! != 0); } @override @@ -87,17 +100,28 @@ class _DeviceConfigScreenState extends State { String _bandwidthFromValue(int bw) { switch (bw) { - case 0: return '7.8 kHz'; - case 1: return '10.4 kHz'; - case 2: return '15.6 kHz'; - case 3: return '20.8 kHz'; - case 4: return '31.25 kHz'; - case 5: return '41.7 kHz'; - case 6: return '62.5 kHz'; - case 7: return '125 kHz'; - case 8: return '250 kHz'; - case 9: return '500 kHz'; - default: return '62.5 kHz'; + case 0: + return '7.8 kHz'; + case 1: + return '10.4 kHz'; + case 2: + return '15.6 kHz'; + case 3: + return '20.8 kHz'; + case 4: + return '31.25 kHz'; + case 5: + return '41.7 kHz'; + case 6: + return '62.5 kHz'; + case 7: + return '125 kHz'; + case 8: + return '250 kHz'; + case 9: + return '500 kHz'; + default: + return '62.5 kHz'; } } @@ -159,10 +183,7 @@ class _DeviceConfigScreenState extends State { ); } else { // Clear position - await connectionProvider.setAdvertLatLon( - latitude: 0.0, - longitude: 0.0, - ); + await connectionProvider.setAdvertLatLon(latitude: 0.0, longitude: 0.0); // Set telemetry modes to "Deny" (mode 0) final telemetryModes = 0x00; @@ -269,7 +290,11 @@ class _DeviceConfigScreenState extends State { if (!serviceEnabled) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(AppLocalizations.of(context)!.locationServicesDisabled)), + SnackBar( + content: Text( + AppLocalizations.of(context)!.locationServicesDisabled, + ), + ), ); } return; @@ -281,7 +306,11 @@ class _DeviceConfigScreenState extends State { if (permission == LocationPermission.denied) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(AppLocalizations.of(context)!.locationPermissionDenied)), + SnackBar( + content: Text( + AppLocalizations.of(context)!.locationPermissionDenied, + ), + ), ); } return; @@ -291,7 +320,13 @@ class _DeviceConfigScreenState extends State { if (permission == LocationPermission.deniedForever) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(AppLocalizations.of(context)!.locationPermissionPermanentlyDenied)), + SnackBar( + content: Text( + AppLocalizations.of( + context, + )!.locationPermissionPermanentlyDenied, + ), + ), ); } return; @@ -312,19 +347,21 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(AppLocalizations.of(context)!.locationBroadcast( - position.latitude.toStringAsFixed(6), - position.longitude.toStringAsFixed(6), - )), + content: Text( + AppLocalizations.of(context)!.locationBroadcast( + position.latitude.toStringAsFixed(6), + position.longitude.toStringAsFixed(6), + ), + ), backgroundColor: Colors.green, ), ); } } catch (e) { if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Failed to get location: $e')), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Failed to get location: $e'))); } } } @@ -352,11 +389,17 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { final deviceInfo = connectionProvider.deviceInfo; - final lat = deviceInfo.advLat != null ? (deviceInfo.advLat! / 1000000).toStringAsFixed(6) : '0.0'; - final lon = deviceInfo.advLon != null ? (deviceInfo.advLon! / 1000000).toStringAsFixed(6) : '0.0'; + final lat = deviceInfo.advLat != null + ? (deviceInfo.advLat! / 1000000).toStringAsFixed(6) + : '0.0'; + final lon = deviceInfo.advLon != null + ? (deviceInfo.advLon! / 1000000).toStringAsFixed(6) + : '0.0'; ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(AppLocalizations.of(context)!.advertisedAtLocation(lat, lon)), + content: Text( + AppLocalizations.of(context)!.advertisedAtLocation(lat, lon), + ), backgroundColor: Colors.green, ), ); @@ -365,7 +408,9 @@ class _DeviceConfigScreenState extends State { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(AppLocalizations.of(context)!.failedToAdvertise(e.toString())), + content: Text( + AppLocalizations.of(context)!.failedToAdvertise(e.toString()), + ), backgroundColor: Colors.red, ), ); @@ -383,9 +428,7 @@ class _DeviceConfigScreenState extends State { final theme = Theme.of(context); return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context)!.settings), - ), + appBar: AppBar(title: Text(AppLocalizations.of(context)!.settings)), body: ListView( padding: const EdgeInsets.all(16), children: [ @@ -408,11 +451,26 @@ class _DeviceConfigScreenState extends State { _InfoRow('Type', _getDeviceTypeString(deviceInfo.deviceType)), _InfoRow('Model', deviceInfo.manufacturerModel ?? 'Unknown'), _InfoRow('Version', deviceInfo.semanticVersion ?? 'Unknown'), - _InfoRow('Build Date', deviceInfo.firmwareBuildDate ?? 'Unknown'), - _InfoRow('Firmware', 'v${deviceInfo.firmwareVersion?.toString() ?? "?"}'), - _InfoRow('Max Contacts', deviceInfo.maxContacts?.toString() ?? 'Unknown'), - _InfoRow('Max Channels', deviceInfo.maxChannels?.toString() ?? 'Unknown'), - _CopyableInfoRow('Public Key', _getPublicKeyHex(deviceInfo.publicKey)), + _InfoRow( + 'Build Date', + deviceInfo.firmwareBuildDate ?? 'Unknown', + ), + _InfoRow( + 'Firmware', + 'v${deviceInfo.firmwareVersion?.toString() ?? "?"}', + ), + _InfoRow( + 'Max Contacts', + deviceInfo.maxContacts?.toString() ?? 'Unknown', + ), + _InfoRow( + 'Max Channels', + deviceInfo.maxChannels?.toString() ?? 'Unknown', + ), + _CopyableInfoRow( + 'Public Key', + _getPublicKeyHex(deviceInfo.publicKey), + ), ], ), ), @@ -439,17 +497,6 @@ class _DeviceConfigScreenState extends State { Row( mainAxisSize: MainAxisSize.min, children: [ - IconButton.outlined( - onPressed: _isBroadcasting ? null : _broadcastNow, - icon: _isBroadcasting - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : const Icon(Icons.sensors), - tooltip: AppLocalizations.of(context)!.settings, - ), const SizedBox(width: 8), IconButton.filled( onPressed: _savePublicInfo, @@ -554,7 +601,7 @@ class _DeviceConfigScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'Radio Settings', + AppLocalizations.of(context)!.radioSettings, style: theme.textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, ), @@ -571,21 +618,23 @@ class _DeviceConfigScreenState extends State { // LoRa Frequency TextField( controller: _freqController, - decoration: const InputDecoration( - labelText: 'Frequency (MHz)', - border: OutlineInputBorder(), - helperText: 'e.g., 869.618', + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.frequencyMHz, + border: const OutlineInputBorder(), + helperText: AppLocalizations.of(context)!.frequencyExample, + ), + keyboardType: const TextInputType.numberWithOptions( + decimal: true, ), - keyboardType: const TextInputType.numberWithOptions(decimal: true), ), const SizedBox(height: 16), // Bandwidth DropdownButtonFormField( value: _selectedBandwidth, - decoration: const InputDecoration( - labelText: 'Bandwidth', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.bandwidth, + border: const OutlineInputBorder(), ), items: _bandwidthOptions.map((String value) { return DropdownMenuItem( @@ -606,11 +655,13 @@ class _DeviceConfigScreenState extends State { // Spreading Factor DropdownButtonFormField( value: _selectedSpreadingFactor, - decoration: const InputDecoration( - labelText: 'Spreading Factor', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.spreadingFactor, + border: const OutlineInputBorder(), ), - items: List.generate(6, (index) => index + 7).map((int value) { + items: List.generate(6, (index) => index + 7).map(( + int value, + ) { return DropdownMenuItem( value: value, child: Text(value.toString()), @@ -629,11 +680,13 @@ class _DeviceConfigScreenState extends State { // Coding Rate DropdownButtonFormField( value: _selectedCodingRate, - decoration: const InputDecoration( - labelText: 'Coding Rate', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.codingRate, + border: const OutlineInputBorder(), ), - items: List.generate(4, (index) => index + 5).map((int value) { + items: List.generate(4, (index) => index + 5).map(( + int value, + ) { return DropdownMenuItem( value: value, child: Text(value.toString()), @@ -653,9 +706,9 @@ class _DeviceConfigScreenState extends State { TextField( controller: _txPowerController, decoration: InputDecoration( - labelText: 'TX Power (dBm)', + labelText: AppLocalizations.of(context)!.txPowerDbm, border: const OutlineInputBorder(), - helperText: 'Max: ${deviceInfo.maxTxPower ?? 22} dBm', + helperText: AppLocalizations.of(context)!.maxPowerDbm(deviceInfo.maxTxPower ?? 22), ), keyboardType: TextInputType.number, ), @@ -673,11 +726,16 @@ class _DeviceConfigScreenState extends State { String _getDeviceTypeString(int? deviceType) { if (deviceType == null) return 'Unknown'; switch (deviceType) { - case 0: return 'None/Unknown'; - case 1: return 'Chat Node'; - case 2: return 'Repeater'; - case 3: return 'Room/Channel'; - default: return 'Type $deviceType'; + case 0: + return 'None/Unknown'; + case 1: + return 'Chat Node'; + case 2: + return 'Repeater'; + case 3: + return 'Room/Channel'; + default: + return 'Type $deviceType'; } } @@ -713,9 +771,7 @@ class _InfoRow extends StatelessWidget { Expanded( child: Text( value, - style: const TextStyle( - fontWeight: FontWeight.w600, - ), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ], diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 94b03c3..cfab60c 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -254,7 +254,7 @@ class _HomeScreenState extends State // Info banner Container( - margin: const EdgeInsets.symmetric(horizontal: 16), + margin: const EdgeInsets.only(left: 16, right: 16, top: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primaryContainer, diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index 4fa585f..5a47b7e 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 915bebf..4642bcf 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index 06172e3..6b278d4 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png index b855a61..757997b 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index 4f91c29..3581391 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index 499e74c..097d07a 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index cec553b..d8e98e1 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/web/favicon.png b/web/favicon.png index 06172e3..6b278d4 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 19cdad6..07c3067 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index 499e74c..097d07a 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png index 19cdad6..07c3067 100644 Binary files a/web/icons/Icon-maskable-192.png and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png index 499e74c..097d07a 100644 Binary files a/web/icons/Icon-maskable-512.png and b/web/icons/Icon-maskable-512.png differ diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index 3101351..a2a1c74 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ