From 01fbb7de6c5e73ae08edaa7126ebb94a1a3ae7ee Mon Sep 17 00:00:00 2001 From: Janez T Date: Wed, 18 Mar 2026 14:45:55 +0100 Subject: [PATCH] fix: Profile duplication on device connect DeviceKey resolver was falling back to deviceId when publicKey wasn't yet available during early connection. This created two different keys (id:xxx then pk:yyy) for the same device, causing a new profile to be created each time. Now returns null until publicKey is available, so profile sync waits for the stable identifier. --- lib/services/profile_device_key_resolver.dart | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/lib/services/profile_device_key_resolver.dart b/lib/services/profile_device_key_resolver.dart index 472fe8b..b058ac5 100644 --- a/lib/services/profile_device_key_resolver.dart +++ b/lib/services/profile_device_key_resolver.dart @@ -5,25 +5,17 @@ class ProfileDeviceKeyResolver { required DeviceInfo deviceInfo, required ConnectionMode connectionMode, }) { + // Always prefer the public key — it's the only truly stable identifier. + // Don't fall back to deviceId to avoid creating duplicate profiles when + // publicKey arrives late (after initial connection but before DeviceInfo). final publicKey = deviceInfo.publicKey; - if (publicKey != null && publicKey.isNotEmpty) { - final hex = publicKey - .map((byte) => byte.toRadixString(16).padLeft(2, '0')) - .join(); - if (hex.isNotEmpty) { - return 'pk:$hex'; - } + if (publicKey == null || publicKey.isEmpty) { + return null; // Wait until publicKey is available } - final deviceId = deviceInfo.deviceId?.trim(); - if (deviceId == null || deviceId.isEmpty) { - return null; - } - - if (connectionMode == ConnectionMode.usb && deviceId == 'usb') { - return null; - } - - return 'id:$deviceId'; + final hex = publicKey + .map((byte) => byte.toRadixString(16).padLeft(2, '0')) + .join(); + return hex.isNotEmpty ? 'pk:$hex' : null; } }