Релиз 1.4.4: обновление протокола WebRTC, фиксы звонков
All checks were successful
Android Kernel Build / build (push) Successful in 19m16s

- PacketWebRTC: добавлены publicKey и deviceId (новый серверный протокол)
- Фикс ForegroundServiceDidNotStartInTimeException (safeStopForeground)
- Фикс бесконечного "Exchanging keys" (ретрай KEY_EXCHANGE, auto-bind)
- Фикс "Unknown" при сбросе звонка
- Decline работает во всех фазах
- Кастомный WebRTC AAR в git для CI
This commit is contained in:
2026-04-02 21:47:42 +05:00
parent 3217aeaeeb
commit a9be1282c6
4 changed files with 20 additions and 10 deletions

View File

@@ -23,8 +23,8 @@ val gitShortSha = safeGitOutput("rev-parse", "--short", "HEAD") ?: "unknown"
// ═══════════════════════════════════════════════════════════
// Rosetta versioning — bump here on each release
// ═══════════════════════════════════════════════════════════
val rosettaVersionName = "1.4.3"
val rosettaVersionCode = 45 // Increment on each release
val rosettaVersionName = "1.4.4"
val rosettaVersionCode = 46 // Increment on each release
val customWebRtcAar = file("libs/libwebrtc-custom.aar")
android {

View File

@@ -18,15 +18,15 @@ object ReleaseNotes {
Update v$VERSION_PLACEHOLDER
Звонки
- Полноэкранный входящий звонок с Accept/Decline даже когда приложение свёрнуто или убито
- Исправлен сброс PeerConnection — больше нет зависания ~30 сек между звонками
- Защита от фантомных звонков при принятии на другом устройстве
- Обновлён протокол WebRTC: publicKey и deviceId в каждом пакете
- Полноэкранный входящий звонок на экране блокировки
- Фикс бесконечного "Exchanging keys" при принятии звонка
- Фикс краша ForegroundService при исходящем звонке
- Кастомный WebRTC с E2EE теперь работает в CI-сборках
E2EE
- Улучшена диагностика шифрования звонков
Push-уведомления
- Поддержка tokenType и deviceId для новых серверов
Уведомления
- Аватарки и имена в уведомлениях
- Настройка отключения аватарок в уведомлениях
""".trimIndent()
fun getNotice(version: String): String =

View File

@@ -19,12 +19,16 @@ enum class WebRTCSignalType(val value: Int) {
class PacketWebRTC : Packet() {
var signalType: WebRTCSignalType = WebRTCSignalType.OFFER
var sdpOrCandidate: String = ""
var publicKey: String = ""
var deviceId: String = ""
override fun getPacketId(): Int = 0x1B
override fun receive(stream: Stream) {
signalType = WebRTCSignalType.fromValue(stream.readInt8())
sdpOrCandidate = stream.readString()
publicKey = stream.readString()
deviceId = stream.readString()
}
override fun send(): Stream {
@@ -32,6 +36,8 @@ class PacketWebRTC : Packet() {
stream.writeInt16(getPacketId())
stream.writeInt8(signalType.value)
stream.writeString(sdpOrCandidate)
stream.writeString(publicKey)
stream.writeString(deviceId)
return stream
}
}

View File

@@ -1343,10 +1343,14 @@ object ProtocolManager {
* Send WebRTC signaling packet (0x1B).
*/
fun sendWebRtcSignal(signalType: WebRTCSignalType, sdpOrCandidate: String) {
val pk = try { getProtocol().getPublicKey().orEmpty() } catch (_: Exception) { "" }
val did = appContext?.let { getOrCreateDeviceId(it) } ?: ""
send(
PacketWebRTC().apply {
this.signalType = signalType
this.sdpOrCandidate = sdpOrCandidate
this.publicKey = pk
this.deviceId = did
}
)
}