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