UnigramDev/Unigram/develop • 5356eba • 1 files, +8/-4
Clear the group call E2E delegates after Stop, not before
Both teardown paths cleared them first, leaving a window where tgcalls was still
live and could ask us to transform a frame with no delegate installed. They are
only cleared to break the native to managed cycle that would otherwise leak the
call, and that works just as well once the instance is gone.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 668badd • 6 files, +101/-46
Join requests accessibility
UnigramDev/Unigram/develop • 30abc2e • 1 files, +57/-5
Improve toasts accessibility
UnigramDev/Unigram/develop • b469c6a • 1 files, +302/-0
Track the VoipManager review findings
Catches the doc up to the P0 fixes already committed; from here it moves in the
commit that closes each item.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 806e479 • 3 files, +35/-9
Stop re-registering the same incoming video sink
tgcalls appends sinks and only drops them once the weak_ptr expires, but the
page re-sets the output on every remote media state change where video is
active, always with the same sink. Each one appended another entry, so a single
frame was rendered once per registration.
Remember the last sink and skip a repeat. Weakly, so that dropping the sink
stays the way the output is detached.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • c9247d6 • 3 files, +23/-6
Fire each broadcast task completion exactly once
The deferral is handed to managed code, which can raise it more than once, and
nothing stopped the second call from re-entering tgcalls with a completion it
had already consumed. Latch _done after firing, in all three task impls.
OnMediaChannelDescriptionsRequested was the one doing it, deferring on the
null-participants path and then falling through — where it dereferenced the null
and took down an async void before it ever reached the second deferral.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 2d25c44 • 2 files, +10/-11
Report an empty broadcast part as NotReady
An empty payload was reported as Success, leaving tgcalls to decode a zero-byte
part instead of asking again. Only a non-null, non-empty part is a success.
While here, drop the second copy of the payload: it was read out through the
IVector iterator and then memcpy'd into another vector.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Post #20570
47