Доработки звонков и чатов: typing, UI и стабильность

This commit is contained in:
2026-04-04 15:17:47 +05:00
parent a9be1282c6
commit 6886a6cef1
17 changed files with 764 additions and 162 deletions

View File

@@ -81,22 +81,29 @@ class IncomingCallActivity : ComponentActivity() {
LaunchedEffect(callState.phase) {
callLog("phase changed: ${callState.phase}")
if (callState.phase == CallPhase.INCOMING) wasIncoming = true
// Закрываем только если звонок реально начался и потом завершился
// Закрываем только когда звонок завершился
if (callState.phase == CallPhase.IDLE && wasIncoming) {
callLog("IDLE after INCOMING → finish()")
finish()
} else if (callState.phase == CallPhase.CONNECTING ||
callState.phase == CallPhase.ACTIVE) {
callLog("${callState.phase} → openMainActivity + finish")
openMainActivity()
finish()
}
// НЕ закрываемся при CONNECTING/ACTIVE — остаёмся на экране звонка
// IncomingCallActivity показывает полный CallOverlay, не нужно переходить в MainActivity
}
// Показываем INCOMING даже если CallManager ещё в IDLE (push раньше WebSocket)
val displayState = if (callState.phase == CallPhase.IDLE) {
// Показываем INCOMING в IDLE только до первого реального входящего состояния.
// Иначе после Decline/END на мгновение мелькает "Unknown".
val shouldShowProvisionalIncoming =
callState.phase == CallPhase.IDLE &&
!wasIncoming &&
(callState.peerPublicKey.isNotBlank() ||
callState.peerTitle.isNotBlank() ||
callState.peerUsername.isNotBlank())
val displayState = if (shouldShowProvisionalIncoming) {
callState.copy(phase = CallPhase.INCOMING, statusText = "Incoming call...")
} else callState
} else {
callState
}
RosettaAndroidTheme(darkTheme = true) {
CallOverlay(
@@ -108,16 +115,10 @@ class IncomingCallActivity : ComponentActivity() {
if (callState.phase == CallPhase.INCOMING) {
val result = CallManager.acceptIncomingCall()
callLog("acceptIncomingCall result=$result")
if (result == CallActionResult.STARTED) {
openMainActivity()
finish()
}
// Остаёмся на IncomingCallActivity — она покажет CONNECTING → ACTIVE
} else {
callLog("onAccept: phase not INCOMING yet, waiting...")
// WebSocket ещё не доставил CALL — открываем MainActivity,
// она подождёт и примет звонок
openMainActivity()
finish()
callLog("onAccept: phase=${callState.phase}, trying accept anyway")
CallManager.acceptIncomingCall()
}
},
onDecline = {