From f41e8442983beb8e376e34879f7a534fa73fdf59 Mon Sep 17 00:00:00 2001
From: callebtc <93376500+callebtc@users.noreply.github.com>
Date: Tue, 8 Sep 2026 00:43:59 +0300
Subject: [PATCH] Keep parity diagnostics and archive reads compatible with
older Android
---
.../bitchat/android/mesh/MeshPingManager.kt | 2 +-
.../bitchat/android/sync/GossipSyncManager.kt | 19 +++++++++++--------
.../android/ui/LocationChannelsSheet.kt | 7 +++++--
app/src/main/res/values/strings.xml | 2 +-
docs/ios-feature-parity-review.md | 3 ++-
5 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/app/src/main/java/com/bitchat/android/mesh/MeshPingManager.kt b/app/src/main/java/com/bitchat/android/mesh/MeshPingManager.kt
index e9b216c7..11e0a48f 100644
--- a/app/src/main/java/com/bitchat/android/mesh/MeshPingManager.kt
+++ b/app/src/main/java/com/bitchat/android/mesh/MeshPingManager.kt
@@ -80,7 +80,7 @@ internal class MeshPingManager(
times.lastOrNull()?.let { now - it >= MeshDiagnosticsConstants.INBOUND_RATE_WINDOW_MILLIS } != false
}
}
- if (inboundByLink.size >= 256 && link !in inboundByLink) return false
+ if (inboundByLink.size >= 256 && !inboundByLink.containsKey(link)) return false
inboundByLink.putIfAbsent(link, ArrayDeque())
}
val timestamps = inboundByLink[link] ?: return false
diff --git a/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt b/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt
index c10af63a..95f968e7 100644
--- a/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt
+++ b/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt
@@ -457,15 +457,18 @@ class GossipSyncManager(
if (!file.exists()) return
try {
restoringArchive = true
- val input = java.io.DataInputStream(file.inputStream().buffered())
- val count = input.readInt().coerceIn(0, configProvider.seenCapacity())
- repeat(count) {
- val length = input.readInt()
- if (length <= 0 || length > com.bitchat.android.util.AppConstants.Protocol.MAX_PAYLOAD_LENGTH + 256) return@repeat
- val packet = com.bitchat.android.protocol.BinaryProtocol.decode(input.readNBytes(length)) ?: return@repeat
- onPublicPacketSeen(packet)
+ java.io.DataInputStream(file.inputStream().buffered()).use { input ->
+ val count = input.readInt()
+ require(count in 0..configProvider.seenCapacity())
+ repeat(count) {
+ val length = input.readInt()
+ require(length in 1..(com.bitchat.android.util.AppConstants.Protocol.MAX_PAYLOAD_LENGTH + 256))
+ val bytes = ByteArray(length)
+ input.readFully(bytes)
+ val packet = com.bitchat.android.protocol.BinaryProtocol.decode(bytes) ?: return@repeat
+ onPublicPacketSeen(packet)
+ }
}
- input.close()
} catch (_: Exception) {
synchronized(messages) { messages.clear() }
} finally {
diff --git a/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt b/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
index c4f53606..c7030c35 100644
--- a/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
+++ b/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
@@ -233,13 +233,16 @@ fun LocationChannelsSheet(
// Mesh section: icon + title header, offline subtitle, then selection card
(selectedChannel as? ChannelID.Location)?.channel?.geohash?.let { cell ->
item(key = "share_channel") {
+ val shareTitle = stringResource(R.string.share_channel)
+ val link = com.bitchat.android.services.ChannelInvitation.link(cell)
+ val invitation = stringResource(R.string.channel_invitation, cell, link.orEmpty())
androidx.compose.material3.TextButton(onClick = {
val link = com.bitchat.android.services.ChannelInvitation.link(cell)
if (link != null) context.startActivity(android.content.Intent.createChooser(
android.content.Intent(android.content.Intent.ACTION_SEND).apply {
type = "text/plain"
- putExtra(android.content.Intent.EXTRA_TEXT, context.getString(R.string.channel_invitation, cell, link))
- }, context.getString(R.string.share_channel)))
+ putExtra(android.content.Intent.EXTRA_TEXT, invitation)
+ }, shareTitle))
}, modifier = Modifier.fillMaxWidth()) { Text(stringResource(R.string.share_channel)) }
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1993f21b..7cc85a7d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -184,7 +184,7 @@
No servers, accounts, or data collection.
Ephemeral Identity
A new peer ID is generated regularly.
- Triple-tap the logo to instantly clear all data.
+ Triple-tap the logo to review and confirm erasing local app data.
Tor Network
diff --git a/docs/ios-feature-parity-review.md b/docs/ios-feature-parity-review.md
index 002c76f7..29d1cf9d 100644
--- a/docs/ios-feature-parity-review.md
+++ b/docs/ios-feature-parity-review.md
@@ -116,7 +116,8 @@ Physical Mesh Lab and Android-to-iOS interoperability are required separately:
- One-time-prekey races and consumption persistence, plus iOS vectors on both
real clients. Static screenshots cannot establish any of these properties.
-Full locale coverage, accessibility review and the physical matrix remain
+The updated panic-help sentence falls back to English where previous translations
+still promised immediate erasure; those stale claims are removed. Full locale coverage, accessibility review and the physical matrix remain
release work. Manual-channel Nostr board publication still obeys the existing
location-note privacy gate; this integration does not weaken it to force a
successful publish. No claim is made that this large integration is ready to