Proto commits in GetStream/stream-video-android

These 61 commits are when the Protocol Buffers files have changed:

Commit:f204d27
Author:Pratim Mallick
Committer:GitHub

chore: merge develop into develop-v2 (#1761) * Upgrade to `m145` webrtc and noise-cancellation lib `v3.0.0` (#1678) * upgrade to m145 webrtc and noise-cancellation * Update to webrtc m145 and corresponding noiseCancellation lib * Remove the snapshot repo resolution * [skip ci] Update SDK sizes * AUTOMATION: Version Bump * Honor SFU-provided degradation preference for adaptive video publishing (#1699) * feat(core): pick up SFU DegradationPreference and add WebRTC mapper Regenerate SFU protos to pick up the new DegradationPreference enum and its degradation_preference fields on PublishOption and VideoSender (plus TrackInfo.self_sub_audio_video), and refresh the public API dump. Add toRtcDegradationPreference() converting the SFU enum to org.webrtc.RtpParameters.DegradationPreference, returning null for UNSPECIFIED so callers can keep the current value. Includes unit tests covering every enum variant. Co-authored-by: Cursor <cursoragent@cursor.com> * publisher changes for applying degradation preferences * Remove duplicate handling of ChangePublishQualityEvent from callState. This event directly gets handled by RtcSession handleEvent method * Added test for the two call sites where degradation Preference is getting set to test for the case where sfu sends the same degrdation preference which is already set in the transcevier sender param --------- Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): initialize Call.events before CallState to avoid NPE in sorted-participants init (#1701) * AUTOMATION: Version Bump * [skip ci] Update SDK sizes * Add ability to add custom user in demo-app (#1700) * demo: Add logic to add custom user * chore(demo-app): gate add user dialog to development flavor Hide the new add-user button and popup outside the development flavor so the production demo app doesn't expose internal user injection. --------- Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com> * fix(core): send only the changed track in UpdateMuteStates (#1706) When toggling a single track (e.g. muting the mic while the camera stays on, or turning the camera off while the mic stays on), RtcSession sent the full declarative mute-state map for all track types. Re-asserting an unchanged track as un-muted made the SFU re-emit a redundant TrackPublishedEvent for that track. That event carries a potentially stale published_tracks snapshot which re-enabled the just-disabled track, freezing the local self-view on the last frame / showing the avatar while no frames arrive. Send only the mute state of the track that actually changed, matching the web SDK. On SFU (re)connect/migration each enabled track is re-signalled individually via listenToMediaChanges, so the full state is still restored. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): clear stored push device even when deleteDevice API fails (#1705) deleteDevice previously only purged the cached Device on API success. When DELETE /devices returned 404 or the network failed, the stale token sat in deviceTokenStorage. The next createDevice for a different user short-circuited on token equality (when autoRegisterPushDevice=true) and returned Success without calling POST /devices, silently leaving the new user without a device row server-side and breaking incoming-call push. Local cleanup now runs unconditionally and is guarded so a storage failure doesn't mask the API outcome. CancellationException is re-thrown to preserve structured concurrency. Three regression tests added. AND-1214 * [skip ci] Update SDK sizes * fix(core): make apiCall wait for guestUserJob to avoid anonymous push device registration (#1703) Guest user setup runs asynchronously: StreamVideoBuilder.build returns immediately while setupGuestUser kicks off a background createGuest call to fetch the JWT. Any authenticated request that fires in that window goes out with stream-auth-type "anonymous" and no Authorization header, so the backend silently registers it against the wrong identity. The customer-visible effect is push device registration succeeding under !anon and incoming-call pushes never reaching the guest user. apiCall now awaits guestUserJob before invoking the request block, with a self-job guard so createGuestUser — which also goes through apiCall — does not await its own enclosing job and deadlock. Adds two regression tests: one for the wait, one for the deadlock guard. AND-1202 Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> * [skip ci] Update SDK sizes * Adopt createGuest's server-issued identity for guest users (#1704) * fix(core): adopt response.user from createGuest to keep guest identity in sync The createGuest endpoint returns the server-resolved user (which may differ from what was passed in — e.g. normalized id). The SDK previously kept only the access token and left its in-memory user as the builder's input, so the WS auth payload and the JWT user_id claim could disagree. setupGuestUser now also updates client.user from response.user (matching the JS SDK's connectUser(response.user, response.access_token) semantics). userId becomes a computed property so every existing reader of client.userId picks up the new identity automatically. CoordinatorSocketConnection.user turns into a var so its onCreated() auth payload reads the latest user. Adds three regression tests: userId reactivity, the var update inside the socket connection's connect path, and a full setupGuestUser flow with the api mocked to return a different user id than the input. AND-1202 * fix(core): mirror adopted guest user into ClientState.user ClientState._user was snapshotted from the integrator-supplied user at construction, so observers of state.user kept the old id after setupGuestUser adopted the server-issued one. Propagate the adopted user via a new internal ClientState.setUser. * [skip ci] Update SDK sizes * Introduce UserRepository as single source of truth for SDK user (#1708) * refactor(core): introduce UserRepository as single source of truth for SDK user Replaces the parallel `var user` fields in `StreamVideoClient` and `CoordinatorSocketConnection` (and the `_user` mirror in `ClientState`) with a single `UserRepository`: - `UserRepository` — public, read-only access via `user` / `userFlow`. - `WritableUserRepository` — internal sub-interface with `setUser`. Only `StreamVideoClient` holds a write reference, so identity updates go through one path. - `StreamUserRepositoryImpl` — in-memory impl backed by a `MutableStateFlow`. `StreamVideoBuilder` constructs one instance and shares it between the client (writer) and the coordinator socket / `ClientState` (readers). `setupGuestUser` writes the adopted user to the repo once; readers pick it up automatically without any local copy to keep in sync. `connect()`/`reconnect()` no longer mutate a snapshot of the user on the socket — they only forward the call to `internalSocket`, and `onCreated()` reads from the repository when building the WS auth payload. * test(core): add direct unit tests for StreamUserRepositoryImpl Covers seed-from-constructor, user/userFlow reads, setUser write, emission to active StateFlow collectors, and replacement semantics. Lifts coverage on the new repository from indirect-only (via StreamVideoClient tests) to full coverage of the impl. * Auto-connect and register push device for guest users (#1707) * feat(core): auto-connect and register push device for guest users StreamVideoBuilder previously only ran the auto-register-push and auto-connect block for UserType.Authenticated. Guest users fell through, forcing every Guest integrator to write the same boilerplate (manual registerPushDevice + connect after build) — boilerplate the iOS and JS SDKs don't require. Widen the gate to include UserType.Guest. registerPushDevice() and connectAsync() inside StreamVideoClient already await guestUserJob, so both are safe to fire from the builder block before /video/guest completes. Anonymous users still don't have an identity to register a device against, so they remain excluded. AND-1202 * fix(core): wait for guestUserJob before registering push device StreamNotificationManager.createDevice() goes straight to api.createDevice() without the apiCall {} wrapper, so the guestUserJob await guard added in #1703 doesn't cover it. registerPushDevice() now waits for guest setup itself before delegating, so the push generator can't fire createDevice() before the coordinator's auth headers flip from anonymous to JWT. * Include internal audio switch to fix concurrency issue (#1710) * fix: include internal audio switch to fix concurrency issue * fix: include aar * chore(core): deprecate StreamVideo.logOut (#1709) The KDoc claimed `logOut` clears internal user state, removes push notification devices, and clears call state. The actual implementation only writes null to the local DeviceTokenStorage — no `DELETE /devices`, no socket disconnect, no in-memory clear. The name and the historical doc invite a customer to ship broken user-switching: anyone reading the API surface would reasonably assume a clean slate. Surfaced while diagnosing a customer integration where push delivery silently failed across user transitions. Annotate the interface declaration and the StreamVideoClient override with `@Deprecated`. Update the KDoc to describe current behavior accurately. Point `ReplaceWith` at `StreamVideo.removeClient()`, which triggers a real `cleanup()` and uninstalls the singleton. Customers who need to remove the server-side device row should call `deleteDevice()` before `removeClient()`. No binary signature change — `@Deprecated` is annotation-only, so the public `.api` file is unchanged. AND-1217 Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> * fix(core): prevent DevicePreferences ClassCastException in updateDevice (#1711) Assign the DataStore.updateData() result to a local in DeviceTokenStorage.updateUserDevice so the suspend function is compiled as a state machine that returns Unit. Without it the compiler tail-call-optimizes the call and propagates the DevicePreferences result up the updateDevice suspend chain, which can surface as "DevicePreferences cannot be cast to kotlin.Unit" at the caller once R8 inlines the chain. Co-authored-by: Cursor <cursoragent@cursor.com> * AUTOMATION: Version Bump * fix(core): stop coordinator events from clobbering SFU participant count (#1712) Post-join, the SFU healthcheck delivers the authoritative participant count. Coordinator session events (participant_joined/left, counts_updated, anything carrying a CallSessionResponse) carry a smaller, stale snapshot that disagrees at scale. The previous guard checked only !is RealtimeConnection.Joined — a transient state immediately replaced by Connected — so every coordinator session event re-wrote the count, producing wild swings during livestreams (e.g. 25k -> 32k -> 42k -> 28k in seconds). Broaden the guard to cover the entire in-call lifetime (Joined, Connected, Reconnecting, Migrating). Pre-join, the session-derived path now uses max(byRoleCount, participants.size) for monotonicity during fast joins, matching the stream-video-js SDK. AND-926 * Prevent "MediaSource has been disposed" crash when leaving a call (#1718) * fix(core): prevent "MediaSource has been disposed" crash on leave Guards the lazy audio/video source and track creation/disposal in MediaManagerImpl with a single reentrant lock, and adds a terminal `released` flag so the mic/camera mute paths no-op after cleanup instead of lazily resurrecting native objects. The crash occurred when a call was left while the first AudioSwitch setup was still in flight: cleanup() disposed the audio source on one thread while the deferred mic-disable callback recreated the audio track from that disposed source on stream-audio-thread. Co-authored-by: Cursor <cursoragent@cursor.com> * test(core): stub runOnAudioTrackIfAvailable in MicrophoneManager tests enable()/disable() now route the track toggle through mediaManager.runOnAudioTrackIfAvailable instead of the audioTrack getter, so the test helper stubs the new helper to invoke its block with the mock track. Fixes the 5 failing MicrophoneManagerTest verifications. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * [skip ci] Update SDK sizes * Revert audio switch local AAR (#1710) and reset version to allow re-release of 1.26.0 (#1719) * Revert " Include internal audio switch to fix concurrency issue (#1710)" This reverts commit 9a8da366bc87602dbd785e0c011604d63c4c899f. * chore(release): reset version to 1.25.0 to allow re-release of 1.26.0 The 1.26.0 Maven publish failed due to the local AAR introduced in #1710. Resetting gradle.properties to 1.25.0 so the release workflow can re-tag and publish 1.26.0 cleanly from the reverted develop state. * AUTOMATION: Version Bump * fix(core): set small icon on setting-up-call notification (#1720) The "setting up call" foreground-service notification was built without a small icon for any non-incoming trigger (outgoing/ongoing/livestream). The non-deprecated getSettingUpCallNotification(trigger, callId) delegated its else branch to the deprecated no-arg overload, which never called setSmallIcon. A small icon is mandatory for foreground-service notifications, so Android 13+ rejected it with CannotPostForegroundServiceNotificationException ("Bad notification for startForeground") when the call foreground service started. Extract a non-deprecated buildSettingUpCallNotification() helper that always sets setSmallIcon(R.drawable.stream_video_ic_call), and have both the non-deprecated else branch and the deprecated overload delegate to it. Add a regression test covering the non-incoming (outgoing) trigger path. Co-authored-by: Cursor <cursoragent@cursor.com> * Update open api generated models in Video SDK(1/4) (#1713) * update open api generated models * update code gen script * Fix self cancelling coroutine code (2/4) (#1714) * update open api generated models * update code gen script * fix: self cancelling coroutine code * fix: fix self cancelling coroutine code * Send standardized call leave reason instead of string when leaving the call (3/4) (#1715) * update open api generated models * update code gen script * fix: self cancelling coroutine code * internal: add call leave reason * internal: update Call Leave Reason LLC * fix: fix unit tests * 📝 CodeRabbit Chat: Implement requested code changes * Update stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallLeaveReason.kt * chore: send correct leave reason from StreamCallActivity.kt --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com> * [skip ci] Update SDK sizes * Add Video Analytics in call-join flow (#1716) * update open api generated models * internal: add call leave reason * internal: Add analytics * internal: renaming * internal: spotless * chore: fix tests, remove logs * chore: fix retry exception * chore: fix binary compatibility * chore: add capping to analytics file * chore: use isolate coroutine scope to interact with data source * chore: renaming * chore: renaming * chore: fix paparazzi tests * chore: write analytics tests * chore: fix tests * chore: Enable Audio Analytics * chore: update audio analytics unit-test * chore: update PeerConnectionAnalyticsState * chore: add temp commit * fix: fix incorrect events * fix: fix incorrect events in pc and video * fix: fix pc publish analytics * fix: remove persistance and audio analytics, update tests fix: remove persistance and audio analytics * fix: fix error code and reason * fix: fix tests * fix: remove comments * fix: spotless * fix: Correctly send sfu ws terminal * fix: spotless * fix: spotless * fix: fix failed permission * fix: fix failed permission * fix: add missing class * fix: run only if user id is not null * fix: fix tests * AUTOMATION: Version Bump * [skip ci] Update SDK sizes * Do not show error message while video is loading (#1721) * fix(compose): show loading spinner in CallLobby while camera warms up Replace the misleading track-failure fallback with a neutral loading placeholder and overlay it in CallLobby until the first video frame renders. Removes the redundant demo-app workaround. Fixes #1656 Co-authored-by: Cursor <cursoragent@cursor.com> * use DefaultBadNetworkFallbackContent with a CircularProgressBar instead of Text --------- Co-authored-by: Cursor <cursoragent@cursor.com> * feat(ui-compose): add participantLabelContent slot to CallLobby (#1726) The previous CallLobby rendered the lobby participant label unconditionally with no way to hide or override it. iOS and React do not render a participant label on the local preview, so Android was the outlier and customers had no escape hatch. Add a participantLabelContent slot (matches React VideoPreview's slot-based overrides). Pass `{}` to hide the label or override to supply custom content and positioning. The previous overload (labelPosition: Alignment) is deprecated and delegates to the new one. * [skip ci] Update SDK sizes * Chore(deps): Bump actions/checkout from 6 to 7 (#1728) Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Move @Preview composables out of published artifact to fix R8 builds (#1730) * fix(compose): move @Preview composables out of published artifact to fix R8 builds Compose-generated ComposableSingletons classes referenced the compileOnly stream-video-android-previewdata module (StreamPreviewDataUtils, previewCall, etc.) from production code, breaking consumers' minified (R8) release builds with "Missing class" errors. - Move all @Preview composables from src/main into a new debug-only source set (one <Name>Preview.kt per file), so preview-data is never referenced from the release artifact. - Change previewdata dependency from compileOnly to debugImplementation. - Declare kotlinx-datetime explicitly (used by the livestream countdown UI) so it no longer leaks in transitively, fixing the related kotlinx.datetime R8 missing-class errors. Fixes #1448 Co-authored-by: Cursor <cursoragent@cursor.com> * api dump --------- Co-authored-by: Cursor <cursoragent@cursor.com> * [skip ci] Update SDK sizes * Fix `runCallServiceInForeground` handling for incoming PN and non-ringing call flows (#1729) * temp: force-commit * fix: invoke updateRingingState() when setting active call * fix: add canRunService on incoming calls * demo-app: add screen to configure call settings * fix: refactor * fix: refactor * fix: remove unused classes * fix: fix unit-test * Improve video analytics by correctly sending ice state (#1724) * improve: fix sending correct ice state * improve: correctly update analytics stage * improve: refactor * fix: remove grace period to wait for ice state * fix: refactor * fix: refactor --------- Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com> * Code refactor for Video Analytics (#1727) * improvement: video analytics refactor * fix: fix unit test * Fix a crash when application put to background restriction (#1731) * temp: force-commit * fix: refactor * fix: remove unused classes * fix: Fix a crash when application put to background restriction by rendering normal notification instead of CallStyle notification * fix: add safe null-check * fix: moved file to utils * [skip ci] Update SDK sizes * Fix notification dismissal for Leave/Hang Up notification actions (#1732) * temp: force-commit * fix: invoke updateRingingState() when setting active call * fix: add canRunService on incoming calls * demo-app: add screen to configure call settings * fix: refactor * fix: refactor * fix: remove unused classes * fix: Fix a crash when application put to background restriction by rendering normal notification instead of CallStyle notification * fix: add safe null-check * fix: fix unit-test * fix: fix notification cleaning from leave button in notification * fix: add todos for future fixes * feat(ui-compose): add videoPreviewModifier slot to CallLobby (#1733) The lobby video preview Box was hardcoded to a responsive height (180/280/200dp by screen size and orientation), fillMaxWidth, and a 12dp rounded corner clip with no way to override size or shape. iOS sizes the preview via the parent's GeometryReader; React drives size via className on VideoPreview. Android was the outlier. Add a videoPreviewModifier parameter so callers can override the box modifier directly. The default preserves the previous responsive height, full width, and 12dp clip, so existing callers see no change. * AUTOMATION: Version Bump * fix: fix tracer timestamp and remove additional lock (#1734) * Report SFU WebSocket connection and join timeouts accurately (#1740) * fix(core): report SFU WebSocket connection/join timeouts accurately Splits the SFU socket connect into a transport-open phase (bounded by OkHttp's connect timeout) and a distinct join-response phase (bounded by a dedicated timer via a new WebSocketConnected state), so a silent SFU no longer hangs the join. Surfaces real transport failure messages and HTTP status codes on the resulting NetworkError, routes all recoverable errors through a single DisconnectedTemporarily state carrying the exact code/reason, and maps both timeout flavours to REQUEST_TIMEOUT in analytics (join-response via error code, transport via SocketTimeoutException cause). Also moves join-error analytics to the join flow only, adds a per-session SFU WS retry counter, and wires connectionTimeoutInMs from the builder to both the OkHttp client and the join-response deadline. Co-authored-by: Cursor <cursoragent@cursor.com> * Remove !! operator on session.value and send a proper Failure when session.value was cleared to null while connecting to sfu was still in progress * Update comment * fix(core): address PR review comments for SFU WS timeout handling - Rename SfuSocketStateEvent.WebSocketConnected to WebSocketEstablished to avoid the naming collision with the SfuSocketState.WebSocketConnected state. - Guard monitorSession() in _join recovery so it only runs when the original session is reused, preventing double-registration after rejoin/migrate. - Default connectionTimeoutInMs to 5s and fix stale KDoc. - Rename triggersReconnect() to canTriggersReconnect() for clarity. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): classify OkHttp InterruptedIOException timeouts as REQUEST_TIMEOUT OkHttp connect/call timeouts surface as InterruptedIOException("timeout"), not SocketTimeoutException, so SFU join analytics were incorrectly reporting SFU_ERROR despite the failure reason being "timeout". Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): add safety timeout to connectInternal SFU socket wait Wrap the wait for a terminal SfuSocketState in withTimeoutOrNull so connectInternal always returns even if the socket state machine never reaches Connected or Disconnected. On timeout, return a recoverable Failure with REQUEST_TIMEOUT so higher-level reconnect logic can escalate. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> * [skip ci] Update SDK sizes * CI: add least-privilege permissions to GitHub Actions workflows (#1742) * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * CI: add least-privilege permissions to GitHub Actions workflows Add explicit workflow-level permissions blocks to resolve CodeQL actions/missing-workflow-permissions alerts. Scopes are derived from workflow operations (git push, artifact upload, Danger, release lanes). Refs: APPSEC-164 * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: move workflow permissions to job level (SonarCloud) * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: address CodeRabbit review feedback and fix workflow YAML * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * ci: repair workflow permissions blocks for actionlint/SonarCloud * e2e: Port the chat test harness improvements: retry visibility, video on retries only (#1746) - RetryRule: each failed attempt that is retried is written as its own Allure result sharing the real test's historyId, with that attempt's steps, error and artifacts, so TestOps groups attempts as retries and can flag flaky tests - RetryRule: screen recording runs only on retry attempts; previously every test recorded an 8 Mbit/s video that was discarded on pass - RetryRule: the recording file uses methodName instead of displayName (the display name's parentheses break when the recording commands go through the device shell), and a recording stop failure no longer replaces the test result - RetryRule: move to io.getstream.video.android.rules (the file declared a chat package), remove the unused Retry annotation, simplify DatabaseOperations - Wait: waitForText and waitForCount poll at 50ms instead of spinning the CPU until timeout; remove the unused waitForTextToChange - Allurefile: name launches 'Cron checks' only for real scheduled events, so manual dispatches stay distinguishable in TestOps - Fastfile: batch_tests splits round-robin, always yielding exactly batch_count groups; the previous rounded-up slicing could produce fewer groups and crash on nil for the last batch Ported from GetStream/stream-chat-android#6568. * Recover initial join when connect safety-timeout leaves no reconnect (#1741) * fix(core): recover initial join when connect safety-timeout leaves no reconnect When RtcSession.connectInternal hits its own safety-timeout, the socket is left in a non-terminal state that stateJob ignores, so no Call.reconnect is ever launched and _join's didReconnectSucceed() would block forever. - Add SfuConnectionResult.Failure.reconnectTriggered so the join flow can tell whether a recovery loop has already been started by stateJob. - On the safety-timeout path, tear down the abandoned (still-in-flight) socket so a late Connected/JoinResponse can't resurface and resurrect the session. - In Call._join, trigger a REJOIN ourselves when a recoverable failure reports no reconnect was triggered; otherwise await the existing loop. - Rename canTriggersReconnect() to triggersStateJobReconnect() for clarity. - demo-app: align connectionTimeoutInMs with the SDK default (5s). Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(core): type SFU connect failures instead of a reconnect flag Address PR review: reconnect-orchestration state should not live on the SfuConnectionResult.Failure DTO. Replace the boolean flag with a typed error so callers of connectInternal branch on the failure kind. - Add sealed SfuConnectException with Timeout (connect safety-timeout tore down a stuck socket; no recovery started) and Disconnected (terminal SFU state). - connectInternal now returns these typed errors instead of Exception("msg"). - Drop SfuConnectionResult.Failure.hasReconnectStarted; _join self-triggers a REJOIN only when the error is SfuConnectException.Timeout, else awaits the loop stateJob already started. - Update tests to construct/assert the typed errors. Co-authored-by: Cursor <cursoragent@cursor.com> * Replace SfuConnectException with SfuConnectFailureCause code (#1744) * fix: Refactor with SfuConnectFailureCause code * fix: Add kdoc * fix: Replace Singletone shared Call.testInstanceProvider.rtcSessionCreator with Call..unitTestRtcSessionFactory --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com> Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> * AUTOMATION: Version Bump * test(e2e): harden recording and outgoing-call waits against backend latency (#1751) * test(e2e): harden recording and outgoing-call waits against backend latency The composite recorder can take 20-30s to start and emit call.recording_started, and the outgoing ringing screen only renders after the call create/ring network round-trip. The 5s default (recording icon) and 10s (outgoing decline button) waits time out before the UI appears, causing deterministic findObject NPEs in testParticipantRecordsCall and testUserRejectsTheOutgoingAudioCall. Co-authored-by: Cursor <cursoragent@cursor.com> * test(e2e): extend recording-consent and stop waits to 30s The recording-consent dialog (acceptCallRecording/declineCallRecording) and the recording-icon disappear assert are all gated on backend recorder events (call.recording_started / call.recording_stopped), which can take 20-30s. The 10s/5s waits time out first, so testParticipantRecordsCall still failed at acceptCallRecording after the initial icon-wait bump. Extend these waits to 30s. Co-authored-by: Cursor <cursoragent@cursor.com> * test(e2e): record for 60s so the recording icon is observable Composite recording spins up ~10-15s after the request, so recording for only 15s left a ~5s client-visible window that closed before the 3-view assertion loop could observe the icon. Record for 60s and keep the buddy in the call for 120s (matching the ReconnectionTests pattern) so the icon is reliably visible, then extend the "recording disappeared" wait to 70s to cover the longer run. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * chore: pass OpenAPI generator config via --opt flags (#1743) * chore: pass OpenAPI generator config via --opt flags The chat-side Kotlin generator now takes its configuration through the generic `--opt key=value` flag (via the Configurable interface) instead of bespoke named flags. Update the generation script accordingly: - Convert the generate-client invocation to `--opt key=value` form. - Drop `--model-dir` (the generator hardcodes the models directory; the flag was a no-op) and its now-unused MODEL_DIR variable / argument. - classes-to-skip is space-separated (the --opt slice flag splits comma lists). - Point REFERENCE_VALUE at `master`, since the generator changes land there. Generated output is unchanged (byte-identical vs the previous generator). * fix: use the renamed android-sdk generator option The backend generator's SDK option was renamed androidSdk -> android-sdk during review before landing on master. Update the invocation to match, otherwise generate-client fails with `kotlin: unknown option "androidSdk"`. * chore: drop retired --model-dir from the openapi generator gradle task generate_openapi_v2.sh no longer accepts --model-dir (the backend generator hardcodes the models directory and never honored the flag), so the Gradle caller passing it would fail with "Unknown argument". Remove the argument and the now-unused modelsDir property. * fix: default the openapi generator to clone master The Gradle task's default refValue still pointed at the merged (now-deleted) feature branch, so `generateOpenApiClient` would fail at `git clone --branch`. Default to master, matching the script's own default and the intended source. * Chore(deps): Bump actions/checkout from 7.0.0 to 7.0.1 (#1748) Bumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gianmarco <47775302+gpunto@users.noreply.github.com> * fix(core): stop orphaned publisher transceivers to prevent SFU rejoin loop (#1757) Three transceiver-lifecycle bugs in Publisher could strand live sendonly m-lines that SetPublisher.tracks never announces, causing the SFU to force-rejoin the publisher (VID-1376): - syncPublishOptions: the cleanup loop compared the cache against itself (always true), so every transceiver was torn down on each ChangePublishOptions event. Now keep transceivers whose option is still requested by the SFU. - publishStreamInternal fallback: replaced the old transceiver without stopping it, leaving an orphaned m-line. Now stop() the old one first. - addTransceiver: silently overwrote the cache entry for the same [track_type, publish_option_id], stranding the old transceiver. Now stop() any pre-existing transceiver before adding. All paths use stop() only (never dispose()) on a live PeerConnection; the PC owns the native transceiver/sender and frees it safely at teardown. Disposing mid-session is a use-after-free on network_thread (SIGSEGV). Adds unit tests covering all three cases. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): resolve develop merge compile/runtime conflicts for v2 Keep UserRepository + StreamConnectionState + StreamClient as v2 SSOT while adopting develop analytics/degradation-preference changes under io.getstream.webrtc. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(ui-compose): refresh API dump after develop merge Co-authored-by: Cursor <cursoragent@cursor.com> * Decompose Call into focused internal components (#1747) * refactor(core): decompose Call into focused internal components Break the ~2,260-line Call class into 11 internal collaborators under call/components (CallApiClient, CallStatsReporter, CallRenderer, CallEventManager, CallMediaManager, CallSessionManager, CallIceConnectionMonitor, CallConnectivityMonitor, CallJoinCoordinator, CallReconnector, CallLifecycleManager). Call remains a thin, binary-compatible public facade that delegates to them; public API is unchanged (apiCheck passes). Update white-box reflection tests to target the new component owners after internals moved out of Call. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(core): remove duplicated join preflight from Call facade Call.join() ran join analytics, permission checks, and the guest-token wait before delegating to CallJoinCoordinator.join(), which performed the exact same preflight — so every join() executed it twice. Make the facade a pure delegation so the preflight runs only once in the coordinator. Co-authored-by: Cursor <cursoragent@cursor.com> * test(core): add unit tests for Call decomposition components Add JVM unit tests for the extracted Call collaborators (CallApiClient, CallEventManager, CallSessionManager, CallRenderer, CallMediaManager) to raise coverage on the refactor's new code toward the SonarCloud gate. Co-authored-by: Cursor <cursoragent@cursor.com> * test(core): add unit tests for join/reconnect/connectivity/ice components Broaden new-code coverage for the extracted Call components: exercise the CallJoinCoordinator retry loop and join-and-ring flow (via the RtcSession test factory), the CallConnectivityMonitor reconnect/leave listener, the reachable CallReconnector state-machine branches, the CallIceConnectionMonitor restart paths, plus additional CallMediaManager (monitorHeadset, not-selected devices) and CallApiClient (ring request, ringing create) cases. Co-authored-by: Cursor <cursoragent@cursor.com> * test(core): cover reconnector rejoin/migrate and renderer audio paths Add a unitTestRtcSessionFactory seam to CallReconnector's rejoin/migrate so the session-swap, monitor and finalize paths are unit-testable, and add tests for them (success + retry-until-exhausted). Also cover CallRenderer's incoming-audio track walking for all/selected participants. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(core): decouple Call collaborators from the Call facade Give the Call decomposition components explicit dependencies so they no longer reach into the Call facade: - CallApiClient, CallConnectivityMonitor, CallEventManager, CallIceConnectionMonitor, CallRenderer, CallStatsReporter, CallSessionManager and CallMediaManager now take the granular collaborators they need (type/id/scope/state/session/clientImpl/eglBase) instead of a Call. - Isolate the unavoidable identity hand-offs behind small seams/providers: RingingCallRegistrar for CallApiClient's ring/accept client-state writes, and a lazy () -> Call provider for CallMediaManager's MediaManagerImpl (a public type that requires a Call). - Behaviour is unchanged; component unit tests now construct each collaborator directly without a Call mock. The three orchestrators (CallReconnector, CallJoinCoordinator, CallLifecycleManager) still hold Call and are left for a follow-up. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(core): finish decoupling Call collaborators and repair the suite Removes the last Call references from the extracted components so no class under call/components holds the facade any more. CallLifecycleManager now takes its collaborators directly (lazy providers, since it is constructed before CallState and the monitors exist), which made Call.stopConnectionMonitors/stopStatsReporting/cancelSfuObservers/ shutDownJobsGracefully dead; they are removed. CallMediaManager gains disableLocalCapture() so the lifecycle no longer reaches through to the device handles. The three callback interfaces into Call (CallHost, CallTeardownHost, RingingCallRegistrar) were named after who implements them rather than what they do, and six of their eight methods did the same thing: register or deregister this call in the client's ringing/active registries. Two were byte-identical. They collapse into one ClientCallRegistry; the genuine outliers (hasRequiredPermissions, shutDownJobs) become plain lambdas. Two production fixes surfaced while repairing the tests: - CallMediaManager evaluated eglBase().eglBaseContext to build an argument for MediaManagerFactory.create, forcing a real EGL context before the factory ran. Call owns both the context and the factory, so the parameter is dropped and the factory resolves it itself. - The reconnect loop reads connectivity straight off the connection module (it must not go through CallConnectivityMonitor, which would close a dependency cycle), but injectMockNetwork was repointed at the monitor. The loop therefore polled the real provider and stalled without consuming an attempt. Injecting at the module fixes three reconnect tests that had been failing since the decomposition commit. JoinRecoverableFailureTest is rebuilt on the coordinator harness: it relied on spying Call and reflectively repointing CallJoinCoordinator.call, a field that no longer exists. Core suite: 978 tests, 0 failures. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(core): read session state from its owner instead of the Call facade CallSessionManager owns the session identity and reconnect bookkeeping, but Call still re-exposed it through internal accessors that mostly existed for a single caller. Remove them: location and nonFastReconnectAttempts were only reachable from tests, connectStartTime/reconnectStartTime had dead setters, and unifiedSessionId was read by RtcSession alone. RtcSession now takes CallSessionManager directly and reads session identity and reconnect timings from it. The elapsed-time arithmetic moves onto the manager as connectionTimeSeconds()/reconnectionTimeSeconds(), next to the timestamps it derives from. The two test-only reads move into CallTestSeams.kt so they stay out of the production API. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(core): break the reconnector/join-coordinator dependency cycle CallReconnector and CallJoinCoordinator each depended on the other, so one had to be injected as a lazy provider. Move the shared joinRequest into CallApiClient, which already owns the coordinator REST calls, and relocate the failed-SFU set to CallSessionManager so the request no longer has to ask the reconnector for it. Both orchestrators now depend on the api client and neither depends on the other. Also drops the provider lambdas around state, analytics, stats and media by declaring those components before their consumers. FailedSfuIdsTest no longer needs reflection into private reconnector members; the behaviour is covered directly in CallSessionManagerTest. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: remove unused code (#1762) --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> * [skip ci] Update SDK sizes * Make the Android Video SDK compatible with Android 17. (#1752) * Chore: make incoming call android 17 compatible * Chore: revert * Chore: refactor name * refactor: remove maxSize named argument for AGP 9 compatibility * refactor: remove unnecessary inline arg * update: Update streamLog to 1.3.4 which fixes namespace issue which is returned as error in AGP 9 * test: cover incoming-ring service type on Android 15/16/17 Move VERSION_CODES polyfills to shared AndroidVersionCodes.kt (fix BALAKLAVA typo). Force SDK_INT for API 35/36/37 tests and restore it via @After teardown. * AUTOMATION: Version Bump * test(e2e): widen call-start wait to 30s for reconnection/recording flow --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com> Co-authored-by: Rahul Kumar Lohra <tgunix@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Peter Matkovski <peter.matkovski@getstream.io> Co-authored-by: André Mion <andremion@gmail.com> Co-authored-by: Gianmarco <47775302+gpunto@users.noreply.github.com>

The documentation is generated from this commit.

Commit:29acfef
Author:Pratim Mallick
Committer:GitHub

Honor SFU-provided degradation preference for adaptive video publishing (#1699) * feat(core): pick up SFU DegradationPreference and add WebRTC mapper Regenerate SFU protos to pick up the new DegradationPreference enum and its degradation_preference fields on PublishOption and VideoSender (plus TrackInfo.self_sub_audio_video), and refresh the public API dump. Add toRtcDegradationPreference() converting the SFU enum to org.webrtc.RtpParameters.DegradationPreference, returning null for UNSPECIFIED so callers can keep the current value. Includes unit tests covering every enum variant. Co-authored-by: Cursor <cursoragent@cursor.com> * publisher changes for applying degradation preferences * Remove duplicate handling of ChangePublishQualityEvent from callState. This event directly gets handled by RtcSession handleEvent method * Added test for the two call sites where degradation Preference is getting set to test for the case where sfu sends the same degrdation preference which is already set in the transcevier sender param --------- Co-authored-by: Cursor <cursoragent@cursor.com>

The documentation is generated from this commit.

Commit:799baec
Author:Rahul Kumar Lohra
Committer:GitHub

Improve pinned participant state on rejoin with new session (#1683) * update sfu models * feat: add pins param in ParticipantJoinedEvent * feat: add logic with logs * feat: remove logs * fix: correct the jetpack compose logic to render pinned icon * fix: remove logs * chore: revert changes * chore: revert changes * chore: remove finally * fix: fix unit tests * feat: update codebase with develop * chore: align with JS logic * fix: refactor pins ownership, move them to PinManager * fix: add unit-tests * fix: remove duplicate code * chore: add logic to updateServer Pins from list of participants with pin information * chore: refactor code * chore: Replace PinUpdateAtTime with PinEntry --------- Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com>

Commit:97f19f4
Author:rahullohra
Committer:rahullohra

update sfu models

Commit:39e92e1
Author:Pratim Mallick
Committer:GitHub

Add support for stereo playback (#1560) * Update to latest proto * Send stereo = true in Audio track's TrackInfo if hifi is enabled in dashboard * fix: microphone not getting enabled if we join with USAGE_MEDIA mode * Provide a way to set the audio usage from app to call.speaker - it can be either VOICE_COMMUNICATION or MEDIA * Provide a way on the debug option menu to switch between usage_media and usage_voice_communication * Expose the audioDeviceModule from peerConnectionFactory * Apply spotless * Upgraded to webrtc version that supports switching audio usage mid call * api dump * Dont send stereo = true in trackInfo while publishing. This will be done when adding stereo capture to recording feature * Added unit tests to test the audioUsage stateFlow of SpeakerManager * refactor(demo-app): simplify onToggleAudioUsage by removing suspend modifier * Fix: `setAudioUsage` of speakerManager does not work if called before any remote track has come in. Updated to webrtc which has the fix for this. --------- Co-authored-by: Aleksandar Apostolov <apostolov.alexandar@gmail.com>

Commit:383e41d
Author:pratimmallick

Update to latest proto

Commit:637f3ff
Author:rahullohra

chore: merge with develop and refactor

Commit:e8140b9
Author:Aleksandar Apostolov
Committer:GitHub

Add participant source to the ParticipantState and sort with it (#1523)

Commit:ca9ad26
Author:Aleksandar Apostolov
Committer:GitHub

Pause incoming video if network conditions are bad (#1479) * SDP offers should be processed serially * Fix wildcard * Add new SFU events * Pause videos when the network conditions are bad * ApiDump * Improve livestream player when working with the video "pause" * Spotless * Fix compile * Update audio usage in demo-app for livestreams * Update audio usage in demo-app for livestreams * Update example in demo-app * Spotless * Spotless * Do not stop channel

Commit:d766317
Author:Aleksandar Apostolov

Add new SFU events

Commit:3a2a7ed
Author:Aleksandar Apostolov

Reconnect improvements

Commit:d01b9d2
Author:Aleksandar Apostolov
Committer:GitHub

Allow for the SDK to collect RTC stats if configured (#1445) * RTC stats impl * spotless & apidump * Add the ability to delta PC stats * spotless * spotless * Min subscriber extract * Working subscriber extract * cleanup * moved tracks * move trackDimensions initial * move trackDimensions initial * moving subscriptions and delegating track override handler * renaming and encapsulation * fully decoupled subscriber * added viewport id * take viewport id into account * Update test and fix order of arguments * initial test * initial test * Spotless & api dump * api dump * Spotless * Fix test * PC stats * Fix subscriber mixup of video and screenshare track * Add RTC stats * Use key instead of hardcoded text * add create for both PRs * Add initial rtc stats delta * Add onTrack tracing * Spotless & Api dump * Spotless & Api dump * Mark as internal, rename variables to avoid confusion * move variable to top * rename variable and make method private * Send the events as Json * update tests with the tracers * update publisher tests with the tracers * Fix timestamps and delta rtcs stats * Fix timestamps and delta rtcs stats * Fix timestamps and delta rtcs stats * ontrack based on peer connection type * spotless * include reconnectionAttempt number in the tracer id * Add tests * Add tests * Add more tests * Update stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Use the tracermanager in the SFU connection module * Add internal annotations and fix typo * ApiDump --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

Commit:46a8060
Author:Aleksandar Apostolov

Add the ability to delta PC stats

Commit:d2fcdd1
Author:Aleksandar Apostolov
Committer:GitHub

[AND-18] Codec negotiation (#1261) * New publisher * map svc codec correctly * Set codec * Send correct layers * Spotless & Api dump * Correctly update, publish options, send all three layers correctly, respect `shouldRetry` when set publisher fails, send preferred options on reconnect or migrate * Spotless and apidump * Remove unnecessary tests * Make the layers functions internal * Api dump * Remove code * Correctly compute encodings and layers based on spatial layers, add test * Remove unused code in transceiver cache and add tests * Remove old dynascale test * Remove lscale test, add mini publisher test * Spotless & ApiDump and import cleanup * Additional cleanup * Update on layer calculation and tests * Add codec to track info. * Spotless & ApiDump * Remove transceiver when stream is unpublished * Log encodings * Spotless ApiDump * Spotless ApiDump * Do not calculate layers for audio tracks * Spotless * Update initial screenshare resolution * Use PCF from call * Send publish options Id with the track info * Api dump * Cache publisher events in case publisher is not created yet. * setTrack instead of add new transceiver when there is already publish option available for that kind of track * remove commented code * Update package name of video layers * Update package in test * Update publisher tests * Minimal SPC test * Spotless & Apidump * Add minimal SPC Factory tests * Fix wildcard imports * Spotless & ApiDump * Add SPC test for the init parameters * Add more tests for RTC session * Remove wildcard imports * Remove wildcard imports * Reformatting * Fix failing tests * Formatting * Add change quality test * Spotless & ApiDump * Correctly test empty encodings * Formatting

Commit:2fe09db
Author:Aleksandar Apostolov

Send publish options Id with the track info

Commit:65791ee
Author:Aleksandar Apostolov

Add codec to track info.

Commit:30b036a
Author:Aleksandar Apostolov

Update proto models

Commit:a3b4321
Author:Liviu Timar

Update protobuf definitions

Commit:1bb5618
Author:Aleksandar Apostolov
Committer:GitHub

[AND-157] Send thermal state of the device to the SFU (#1245) * Update SFU events * Update API * Send thermal state to the SFU

Commit:93064d7
Author:Liviu Timar
Committer:Liviu Timar

Add new proto defs

Commit:6c06ce4
Author:Aleksandar Apostolov
Committer:GitHub

Reconnect v2 (#1219) * Initial socket from chat implementation * Authenticate on connected in coordinator socket. * Spotless * Migrate `CoordinatorSocket` * Spotless and API dump * Fix an issue where StreamCallActivity would leave the call when going into background * Initial reconnect V2 implementation * API dump * Spotless * Correct JoinRequest * [WIP] Refactored Coordinator and SFU sockets * Update correct type for SfuSocketStateEvent * Update state in Connection module, package renaming * Resolve merge conflicts * Continue refactoring * Add connection common implementation * Keep refactoring the SFU socket * Merge conflicts * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Spotless & ApiDump * Adapt for the new token provider * Update tests * Spotless apidump * Update * Sotless api dump * Update * Spotless * Move call health monitor into call * Spotless * Update * Revert "Update" This reverts commit fdd64d22c402864805f95f17dc7a84674089e885. * Revert "Spotless" This reverts commit e064aa9016c51e0a46738b54e97a654ab1ba94e2. * Revert "Move call health monitor into call" This reverts commit c0d260f4b43fc845ee41a75601848fe06aabb339. * Revert "Spotless" This reverts commit 0c445e32bcce3161c6eda0d350f040950617d6f8. * Revert "Update" This reverts commit 084bf883771a5e970414358d5183fa6d117d0397. * Revert "Sotless api dump" This reverts commit 0be905df37b03f1168104ff3968ad7108cf2cfb6. * Revert "Update" This reverts commit b73572cb663de58d65dfa3a8f0a0d66fb382d233. * Update * Spotless * Update * Update * Update * Update * Update * Update * Update * Add timeout to the scheduled jobs * Update tests * Update tests * Add missing dependencies * Add javadoc, make some methods internal, remove myself when rejoin to speedup participant list update * Add javadoc, make some methods internal, remove myself when rejoin to speedup participant list update * Add javadoc, make some methods internal, remove myself when rejoin to speedup participant list update * Rejoin if PC state is FAILED * Try fast reconnect instead. * Cancel previous job instead * Synchronize the job handling process

Commit:d0a54b4
Author:Liviu Timar
Committer:Liviu Timar

Add new proto defs for SFU events

Commit:a15ec4d
Author:Kanat Kiialbaev
Committer:GitHub

[PBE-3907] Update SDK to handle missed call notifications (#1105)

Commit:f76e503
Author:Liviu Timar
Committer:GitHub

Add call stats reporting (#1030)

Commit:0b6e6b2
Author:Daniel Novak
Committer:GitHub

Fast-Reconnect support (#822)

Commit:9c4b955
Author:Thierry Schellenbach

update to latest openapi

Commit:7f12227
Author:Thierry Schellenbach

update to latest openapi spec

Commit:0a19ecc
Author:Tommaso Barbugli

make sure old proto files are purged when regenerating

Commit:4096c9d
Author:Thierry Schellenbach

merge

Commit:d570305
Author:Thierry Schellenbach

wip

Commit:9620ad5
Author:TGazica

Merge remote-tracking branch 'origin/update/proto' into task/protocol-update # Conflicts: # stream-video-android-core/api/stream-video-android-core.api # stream-video-android-core/src/main/proto/video/sfu/event/events.pb.go # stream-video-android-core/src/main/proto/video/sfu/models/models.pb.go # stream-video-android-core/src/main/proto/video/sfu/models/models.proto # stream-video-android-core/src/main/proto/video/sfu/models/models_vtproto.pb.go

Commit:8d3c1f4
Author:TGazica

Update models and protos

Commit:47ea323
Author:skydoves

Remove unused files and update sfu

Commit:f84e239
Author:skydoves

Update proto

Commit:bc7bf1e
Author:filbabic

Module restructuring

Commit:1bb7ce0
Author:Filip Babic

Update proto, clean up audio levels, add connection quality state update and partial participant load

Commit:c81f7f9
Author:TGazica

Fix style referencing

Commit:4768052
Author:Filip Babic

Update proto to latest

Commit:29c2c9d
Author:Filip Babic

Proto, SFU & track fixes

Commit:ac2867b
Author:Filip Babic

More work on proto & SFU flow

Commit:b96fdd2
Author:Filip Babic

WIP SFU update to latest

Commit:4f083b0
Author:Filip Babic

Update proto to latest

Commit:b4b2885
Author:Filip Babic

Proto update, tons of API cleanup and improvements

Commit:1ad3bd2
Author:Filip Babic

Proto update to latest, added mute change events

Commit:d051e36
Author:kanat

[50] Fix race condition during join flow

Commit:ef127eb
Author:Filip Babic

WIP SFU update

Commit:0ddbc7e
Author:Filip Babic

Update proto & coord/sfu

Commit:abfd79a
Author:Filip Babic

WIP update proto & BE stuff, readme update

Commit:1ee3fa2
Author:Filip Babic

Update proto, imports, types and bits of logic, left TODOs for cleanup

Commit:6d53f1d
Author:Filip Babic

Add codec support for Join request, update to latest BE

Commit:cbed49a
Author:Filip Babic

WIP rendering on Android

Commit:c311f4b
Author:Filip Babic

WIP SFU implementation

Commit:eeab7db
Author:Filip Babic

Auth cleanup, new credentials, WS auth payload update

Commit:71f6aae
Author:Filip Babic

Api dump

Commit:9605a3e
Author:Filip Babic

Update to proto, code cleanup, new events flow implemented, wrapped LK

Commit:29ea3a0
Author:Filip Babic

Update BE definition, remove VideoParser

Commit:31be604
Author:Filip Babic

Add lifecycle and WS connection logic, more docs, updated proto

Commit:d404ca7
Author:filbabic

Add compose, some login setup

Commit:4637c7c
Author:Filip Babic

Added basic API communication, package rename/restructure

Commit:c19a41f
Author:Filip Babic

Renamed module, sorted out packages

Commit:b2ca60c
Author:Filip Babic

Initial setup for protobufs Kotlin