diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 7cd9a79..b59dc16 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -2407,8 +2407,9 @@ class MeshCoreConnector extends ChangeNotifier { _locationSharingContactKey = contactKey; _locationSharingChannelIndex = channelIndex; _lastSharedLocationPositionKey = null; - final gpsInterval = + final rawGpsInterval = int.tryParse(_currentCustomVars?['gps_interval'] ?? '') ?? 900; + final gpsInterval = rawGpsInterval > 0 ? rawGpsInterval : 900; _sendLocationOnce(contactKey, channelIndex); _locationSharingTimer = Timer.periodic(Duration(seconds: gpsInterval), (_) { if (!isConnected || DateTime.now().isAfter(_locationSharingEnd!)) { @@ -5547,6 +5548,10 @@ class MeshCoreConnector extends ChangeNotifier { _stopRadioStatsPolling(); _locationSharingTimer?.cancel(); _locationSharingTimer = null; + _locationSharingEnd = null; + _locationSharingContactKey = null; + _locationSharingChannelIndex = null; + _lastSharedLocationPositionKey = null; _latestRadioStats = null; radioStatsNotifier.value = null; _prevTotalAirSecs = 0; diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index a9668ea..6dde926 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -974,9 +974,10 @@ class _ChannelChatScreenState extends State { maxBytes - utf8.encode(prefix).length - utf8.encode(suffix).length; if (allowsTimedLocationSharing) { - final gpsInterval = + final rawGpsInterval = int.tryParse(connector.currentCustomVars?['gps_interval'] ?? '') ?? 900; + final gpsInterval = rawGpsInterval > 0 ? rawGpsInterval : 900; final minIntervals = (300.0 / gpsInterval).ceil().clamp(2, 9999); final sliderMax = ((86400 / gpsInterval).floor() - minIntervals + 1) .clamp(1, 99999); diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index f803963..6ba281d 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -508,6 +508,7 @@ class _ChatScreenState extends State { ? Smaz.encodeIfSmaller : null; final gpsEnabled = connector.currentCustomVars?['gps'] == '1'; + final isRoomChat = _resolveContact(connector).type == advTypeRoom; final sharingHere = connector.locationSharingContactKey == widget.contact.publicKeyHex; return Column( @@ -565,7 +566,7 @@ class _ChatScreenState extends State { itemBuilder: (context) => [ PopupMenuItem( value: _ChatInputAction.shareLocation, - enabled: gpsEnabled, + enabled: gpsEnabled && !isRoomChat, child: Row( children: [ const Icon(Icons.my_location, size: 20), @@ -606,7 +607,7 @@ class _ChatScreenState extends State { child: ValueListenableBuilder( valueListenable: _textController, builder: (context, value, child) { - final gifId = _parseGifId(value.text); + final gifId = GifHelper.parseGif(value.text); if (gifId != null) { return Focus( autofocus: true, @@ -686,12 +687,6 @@ class _ChatScreenState extends State { ); } - String? _parseGifId(String text) { - final trimmed = text.trim(); - final match = RegExp(r'^g:([A-Za-z0-9_-]+)$').firstMatch(trimmed); - return match?.group(1); - } - void _insertTextAtCursor(String text) { final currentValue = _textController.value; final selection = currentValue.selection; @@ -723,6 +718,10 @@ class _ChatScreenState extends State { } Future _shareLocation(MeshCoreConnector connector) async { + if (_resolveContact(connector).type == advTypeRoom) { + return; + } + final lat = connector.selfLatitude; final lon = connector.selfLongitude; if (lat == null || lon == null) { @@ -757,8 +756,9 @@ class _ChatScreenState extends State { const suffix = '|loc'; final maxLabelBytes = maxBytes - utf8.encode(prefix).length - utf8.encode(suffix).length; - final gpsInterval = + final rawGpsInterval = int.tryParse(connector.currentCustomVars?['gps_interval'] ?? '') ?? 900; + final gpsInterval = rawGpsInterval > 0 ? rawGpsInterval : 900; final minIntervals = (300.0 / gpsInterval).ceil().clamp(2, 9999); final sliderMax = ((86400 / gpsInterval).floor() - minIntervals + 1).clamp( 1, diff --git a/lib/screens/map_screen.dart b/lib/screens/map_screen.dart index 1fc7c84..d893dbb 100644 --- a/lib/screens/map_screen.dart +++ b/lib/screens/map_screen.dart @@ -1310,7 +1310,7 @@ class _MapScreenState extends State { final flags = parts.length > 2 ? parts[2].trim() : ''; return _MarkerPayload( position: LatLng(lat, lon), - label: label.isEmpty ? context.l10n.map_sharedPin : label, + label: label, flags: flags, ); } @@ -1539,7 +1539,9 @@ class _MapScreenState extends State { showDialog( context: context, builder: (dialogContext) => AlertDialog( - title: Text(marker.label), + title: Text( + marker.label.isEmpty ? context.l10n.map_sharedPin : marker.label, + ), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start,