From 641307a31632574a81dc59ca18f26ff9342eaf1b Mon Sep 17 00:00:00 2001 From: Winston Lowe Date: Mon, 26 Jan 2026 12:19:45 -0800 Subject: [PATCH] Added response code for exporting contacts and implement frame listener in contacts_screen.dart --- lib/connector/meshcore_protocol.dart | 1 + lib/screens/contacts_screen.dart | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/connector/meshcore_protocol.dart b/lib/connector/meshcore_protocol.dart index 0e43e46f..dda07bd0 100644 --- a/lib/connector/meshcore_protocol.dart +++ b/lib/connector/meshcore_protocol.dart @@ -159,6 +159,7 @@ const int respCodeContactMsgRecv = 7; const int respCodeChannelMsgRecv = 8; const int respCodeCurrTime = 9; const int respCodeNoMoreMessages = 10; +const int respCodeExportContact = 11; const int respCodeBattAndStorage = 12; const int respCodeDeviceInfo = 13; const int respCodeContactMsgRecvV3 = 16; diff --git a/lib/screens/contacts_screen.dart b/lib/screens/contacts_screen.dart index 4c8e396a..d5d33777 100644 --- a/lib/screens/contacts_screen.dart +++ b/lib/screens/contacts_screen.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import '../connector/meshcore_connector.dart'; @@ -53,16 +54,20 @@ class _ContactsScreenState extends State List _groups = []; Timer? _searchDebounce; + StreamSubscription? _frameSubscription; + @override void initState() { super.initState(); _loadGroups(); + _setupFrameListener(); } @override void dispose() { _searchDebounce?.cancel(); _searchController.dispose(); + _frameSubscription?.cancel(); super.dispose(); } @@ -78,6 +83,22 @@ class _ContactsScreenState extends State await _groupStore.saveGroups(_groups); } + void _setupFrameListener() { + final connector = Provider.of(context, listen: false); + // Listen for incoming text messages from the repeater + _frameSubscription = connector.receivedFrames.listen((frame) { + if (frame.isEmpty) return; + final frameBuffer = BufferReader(frame); + final code = frameBuffer.readUInt8(); + + if (code == respCodeExportContact) { + final advertPacket = frameBuffer.readRemainingBytes(); + final hexString = pubKeyToHex(advertPacket); + Clipboard.setData(ClipboardData(text: "meshcore://$hexString")); + } + }); + } + Future _contactExport(Uint8List pubKey) async { final connector = Provider.of(context, listen: false); final exportContactFrame = buildExportContactFrame(pubKey);