Релиз 1.4.7: фиксы lockscreen, звонков и стабильности

This commit is contained in:
2026-04-05 13:06:29 +05:00
parent 9e14724ae2
commit 9d04ec07e8
13 changed files with 406 additions and 131 deletions

View File

@@ -21,6 +21,7 @@ class AccountManager(private val context: Context) {
private val IS_LOGGED_IN = booleanPreferencesKey("is_logged_in")
private const val PREFS_NAME = "rosetta_account_prefs"
private const val KEY_LAST_LOGGED = "last_logged_public_key"
private const val KEY_LAST_LOGGED_PRIVATE_HASH = "last_logged_private_hash"
}
// Use SharedPreferences for last logged account - more reliable for immediate reads
@@ -43,13 +44,19 @@ class AccountManager(private val context: Context) {
val publicKey = sharedPrefs.getString(KEY_LAST_LOGGED, null)
return publicKey
}
fun getLastLoggedPrivateKeyHash(): String? {
return sharedPrefs.getString(KEY_LAST_LOGGED_PRIVATE_HASH, null)
}
// Synchronous write to SharedPreferences
fun setLastLoggedPublicKey(publicKey: String) {
val success = sharedPrefs.edit().putString(KEY_LAST_LOGGED, publicKey).commit() // commit() is synchronous
// Verify immediately
val saved = sharedPrefs.getString(KEY_LAST_LOGGED, null)
sharedPrefs.edit().putString(KEY_LAST_LOGGED, publicKey).commit() // commit() is synchronous
}
fun setLastLoggedPrivateKeyHash(privateKeyHash: String) {
if (privateKeyHash.isBlank()) return
sharedPrefs.edit().putString(KEY_LAST_LOGGED_PRIVATE_HASH, privateKeyHash).apply()
}
suspend fun saveAccount(account: EncryptedAccount) {
@@ -98,6 +105,7 @@ class AccountManager(private val context: Context) {
context.accountDataStore.edit { preferences ->
preferences[IS_LOGGED_IN] = false
}
sharedPrefs.edit().remove(KEY_LAST_LOGGED_PRIVATE_HASH).apply()
}
/**
@@ -140,12 +148,21 @@ class AccountManager(private val context: Context) {
// Clear SharedPreferences if this was the last logged account
val lastLogged = sharedPrefs.getString(KEY_LAST_LOGGED, null)
if (lastLogged == publicKey) {
sharedPrefs.edit().remove(KEY_LAST_LOGGED).commit()
sharedPrefs
.edit()
.remove(KEY_LAST_LOGGED)
.remove(KEY_LAST_LOGGED_PRIVATE_HASH)
.commit()
}
}
suspend fun clearAll() {
context.accountDataStore.edit { it.clear() }
sharedPrefs
.edit()
.remove(KEY_LAST_LOGGED)
.remove(KEY_LAST_LOGGED_PRIVATE_HASH)
.apply()
}
private fun serializeAccounts(accounts: List<EncryptedAccount>): String {

View File

@@ -17,16 +17,20 @@ object ReleaseNotes {
val RELEASE_NOTICE = """
Update v$VERSION_PLACEHOLDER
Звонки
- Android переведён на новый серверный сигналинг звонков: CALL -> ACCEPT -> KEY_EXCHANGE -> ACTIVE
- Для звонков добавлена полная поддержка callId/joinToken (в CALL/ACCEPT/END_CALL)
- Добавлена обработка RINGING_TIMEOUT с корректным завершением звонка
- WebRTC пакет 0x1B обновлён под новый формат сервера (без лишних полей в payload)
- Push звонка теперь пробрасывает callId/joinToken в CallManager для стабильного принятия до WebSocket
Звонки и lockscreen
- MainActivity больше не открывается поверх экрана блокировки: чаты не раскрываются без разблокировки устройства
- Во входящем полноэкранном звонке отключено автоматическое снятие keyguard
- Исправлено краткое появление "Unknown" при завершении полноэкранного звонка
- При принятии звонка из push добавлено восстановление auth из локального кеша и ускорена отправка ACCEPT
Стабильность
- Улучшены диагностические логи звонков (callId/joinToken в state/log)
- Обновлена совместимость Android с актуальными версиями desktop и rosetta-wss
Сеть и протокол
- Добавлено ожидание активной сети перед reconnect (ConnectivityManager callback + timeout fallback)
- Разрешена pre-auth отправка call/WebRTC/ICE пакетов после открытия сокета
- Очередь исходящих пакетов теперь сбрасывается сразу в onOpen и отправляется state-aware
Стабильность UI
- Crash Details защищён от очень больших логов (без падений при открытии тяжёлых отчётов)
- SharedMedia fast-scroll overlay стабилизирован от NaN/Infinity координат
""".trimIndent()
fun getNotice(version: String): String =