From ee4b2610f949d883bec5ba15c68bb8f5b6fe943e Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:40:23 +0700 Subject: [PATCH] refresh peer list more often --- .../android/mesh/BluetoothMeshService.kt | 1 + .../java/com/bitchat/android/mesh/MeshCore.kt | 4 +++ .../com/bitchat/android/mesh/PeerManager.kt | 30 +++++++++++++++++-- .../wifi-aware/WifiAwareMeshService.kt | 4 +++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt index 9a5da7fd..c42a3c6c 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt @@ -61,6 +61,7 @@ class BluetoothMeshService(private val context: Context) : MeshService, Transpor field = value if (::meshCore.isInitialized) { meshCore.delegate = value + meshCore.refreshPeerList() } } // Tracks whether this instance has been terminated via stopServices() diff --git a/app/src/main/java/com/bitchat/android/mesh/MeshCore.kt b/app/src/main/java/com/bitchat/android/mesh/MeshCore.kt index 5771df94..9bbe1b57 100644 --- a/app/src/main/java/com/bitchat/android/mesh/MeshCore.kt +++ b/app/src/main/java/com/bitchat/android/mesh/MeshCore.kt @@ -668,6 +668,10 @@ class MeshCore( fun getActivePeerCount(): Int = try { peerManager.getActivePeerCount() } catch (_: Exception) { 0 } + fun refreshPeerList() { + try { peerManager.refreshPeerList() } catch (_: Exception) { } + } + fun getDeviceAddressForPeer(peerID: String): String? = transport.getDeviceAddressForPeer(peerID) fun getDeviceAddressToPeerMapping(): Map = transport.getDeviceAddressToPeerMapping() diff --git a/app/src/main/java/com/bitchat/android/mesh/PeerManager.kt b/app/src/main/java/com/bitchat/android/mesh/PeerManager.kt index 4c279d4a..27ce6cb0 100644 --- a/app/src/main/java/com/bitchat/android/mesh/PeerManager.kt +++ b/app/src/main/java/com/bitchat/android/mesh/PeerManager.kt @@ -107,10 +107,21 @@ class PeerManager { isVerified: Boolean ): Boolean { if (peerID == "unknown") return false + + fun keysMatch(a: ByteArray?, b: ByteArray?): Boolean { + if (a == null && b == null) return true + if (a == null || b == null) return false + return a.contentEquals(b) + } val now = System.currentTimeMillis() val existingPeer = peers[peerID] val isNewPeer = existingPeer == null + val wasVerified = existingPeer?.isVerifiedNickname == true + val nicknameChanged = existingPeer != null && existingPeer.nickname != nickname + val noiseKeyChanged = existingPeer != null && !keysMatch(existingPeer.noisePublicKey, noisePublicKey) + val signingKeyChanged = existingPeer != null && !keysMatch(existingPeer.signingPublicKey, signingPublicKey) + val connectedChanged = existingPeer != null && existingPeer.isConnected != true // Update or create peer info val peerInfo = PeerInfo( @@ -130,18 +141,27 @@ class PeerManager { // No legacy maps; peers map is the single source of truth // Maintain announcedPeers for first-time announce semantics + val shouldNotify = when { + isNewPeer && isVerified -> true + wasVerified != isVerified -> true + nicknameChanged || noiseKeyChanged || signingKeyChanged || connectedChanged -> true + else -> false + } + if (isNewPeer && isVerified) { announcedPeers.add(peerID) - notifyPeerListUpdate() Log.d(TAG, "🆕 New verified peer: $nickname ($peerID)") - return true } else if (isVerified) { Log.d(TAG, "🔄 Updated verified peer: $nickname ($peerID)") } else { Log.d(TAG, "⚠️ Unverified peer announcement from: $nickname ($peerID)") } + + if (shouldNotify) { + notifyPeerListUpdate() + } - return false + return isNewPeer && isVerified } /** @@ -408,6 +428,10 @@ class PeerManager { val peerList = getActivePeerIDs() delegate?.onPeerListUpdated(peerList) } + + fun refreshPeerList() { + notifyPeerListUpdate() + } /** * Start periodic cleanup of stale peers diff --git a/app/src/main/java/com/bitchat/android/wifi-aware/WifiAwareMeshService.kt b/app/src/main/java/com/bitchat/android/wifi-aware/WifiAwareMeshService.kt index cf1509b2..580743f2 100644 --- a/app/src/main/java/com/bitchat/android/wifi-aware/WifiAwareMeshService.kt +++ b/app/src/main/java/com/bitchat/android/wifi-aware/WifiAwareMeshService.kt @@ -81,6 +81,7 @@ class WifiAwareMeshService(private val context: Context) : MeshService, Transpor field = value if (::meshCore.isInitialized) { meshCore.delegate = value + meshCore.refreshPeerList() } } private val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager @@ -114,6 +115,9 @@ class WifiAwareMeshService(private val context: Context) : MeshService, Transpor try { meshCore.gossipSyncManager.scheduleInitialSyncToPeer(pid, 1_000) } catch (_: Exception) { } } }, + announcementNicknameProvider = { + try { com.bitchat.android.services.NicknameProvider.getNickname(context, myPeerID) } catch (_: Exception) { null } + }, leavePayloadProvider = { (delegate?.getNickname() ?: myPeerID).toByteArray(Charsets.UTF_8) }