Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f211282
Update example colors (#1086)
1egoman May 16, 2026
3ec0288
Update protocol to v1.45.8 (#1088)
hiroshihorie May 18, 2026
c5103bf
fix(android): prevent screen from turning off during active video cal…
mechtech-mind May 19, 2026
3488ba8
Align screen-share simulcast default lower layer (#1089)
hiroshihorie Jun 1, 2026
55295de
chore: fix Windows CI and tidy check names (#1099)
hiroshihorie Jun 1, 2026
d83f272
Clamp simulcast lower layers to top layer (#1084)
hiroshihorie Jun 1, 2026
ead71ca
Merge manual video quality/dimensions with adaptive stream (#1047)
hiroshihorie Jun 1, 2026
a05a782
Fix pixel density in AdaptiveStream (#1098)
hiroshihorie Jun 1, 2026
707792b
v2.8.0 (#1101)
hiroshihorie Jun 3, 2026
b6cc65d
Use maintain-resolution as the default video degradation preference (…
hiroshihorie Jun 6, 2026
d031c3f
chore(android): support AGP 9 built-in Kotlin (#1102)
hiroshihorie Jun 11, 2026
1c03b55
feat(audio): runtime audio processing options and engine-wide state r…
hiroshihorie Jun 12, 2026
a193401
feat: add deployment field to agent dispatch (#1111)
xianshijing-lk Jun 17, 2026
55af814
feat(audio): add AudioManager session and routing APIs (#1108)
hiroshihorie Jun 18, 2026
d1fe342
Apply audio processing options when local capture starts (#1115)
hiroshihorie Jun 19, 2026
faa5b0b
Add Android initial audio session options (#1117)
hiroshihorie Jun 19, 2026
6bdbc3e
fix: improve initial video quality by setting x-google-start-bitrate …
xianshijing-lk Jun 30, 2026
d8572ce
Merge remote-tracking branch 'upstream/main' into cursor/sync-upstrea…
cursoragent Jun 30, 2026
f862833
fix(room): drop redundant track retry loop in favor of upstream pendi…
cursoragent Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .changes/agp9-built-in-kotlin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Android plugin compatibility with AGP 9 built-in Kotlin"
3 changes: 3 additions & 0 deletions .changes/android-media-routing
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
patch type="fixed" "Apply Android media audio attributes during WebRTC initialization"
patch type="fixed" "Use initialization audio options as the default Android session policy"
patch type="fixed" "Avoid sticky Android speaker routing when updating route preference"
1 change: 1 addition & 0 deletions .changes/audio-manager-api
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
minor type="added" "AudioManager audio session options with engine-driven native lifecycle and platform routing controls"
1 change: 1 addition & 0 deletions .changes/audio-processing-create-cleanup
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Clean up local audio tracks when recording start fails"
1 change: 1 addition & 0 deletions .changes/audio-processing-platform-gate
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Throw platformUnavailable when runtime audio processing is unsupported"
1 change: 1 addition & 0 deletions .changes/audio-processing-start-flow
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Apply create-time audio processing when local recording is prepared"
1 change: 0 additions & 1 deletion .changes/fix-buffer-status-busy-wait

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-connected-server-address

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-deferred-track-listener-leak

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-log-interpolation

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-premature-publication-dispose

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-reconnect-counter

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-region-failover-condition

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-send-sync-state-return-type

This file was deleted.

1 change: 0 additions & 1 deletion .changes/fix-session-start-reentrance

This file was deleted.

1 change: 1 addition & 0 deletions .changes/runtime-audio-options
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
minor type="added" "Runtime audio processing controls for local audio tracks"
1 change: 0 additions & 1 deletion .changes/simplify-session-e2ee

This file was deleted.

1 change: 1 addition & 0 deletions .changes/video-degradation-default
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Use maintain-resolution as the default video degradation preference for local video publishing"
24 changes: 12 additions & 12 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ on:

jobs:
dart-format-check:
name: Dart Format Check
name: Dart Format
runs-on: ubuntu-latest

steps:
Expand All @@ -35,7 +35,7 @@ jobs:
run: dart format . --set-exit-if-changed

import-sorter-check:
name: Import Sorter Check
name: Import Sorter
runs-on: ubuntu-latest

steps:
Expand All @@ -46,7 +46,7 @@ jobs:
run: dart run import_sorter:main --no-comments --exit-if-changed

version-consistency-check:
name: Version Consistency Check
name: Version Consistency
runs-on: ubuntu-latest

steps:
Expand All @@ -57,7 +57,7 @@ jobs:
run: dart run scripts/check_version.dart

dart-analyze-check:
name: Dart Analyze Check
name: Dart Analyze
runs-on: ubuntu-latest

steps:
Expand All @@ -68,7 +68,7 @@ jobs:
run: flutter analyze

dart-test-check:
name: Dart Test Check
name: Dart Test
runs-on: ubuntu-latest

steps:
Expand All @@ -79,7 +79,7 @@ jobs:
run: flutter test

build-for-android:
name: Build for Flutter Android
name: Android
runs-on: ubuntu-latest

steps:
Expand All @@ -93,7 +93,7 @@ jobs:
run: flutter build apk

build-for-ios:
name: Build for Flutter iOS
name: iOS
runs-on: macos-latest

steps:
Expand All @@ -112,7 +112,7 @@ jobs:
run: flutter build ios --release --no-codesign

build-for-windows:
name: Build for Flutter Windows
name: Windows
runs-on: windows-latest

steps:
Expand All @@ -124,7 +124,7 @@ jobs:
run: flutter build windows --release

build-for-macos:
name: Build for Flutter macOS
name: macOS
runs-on: macos-latest

steps:
Expand All @@ -136,7 +136,7 @@ jobs:
run: flutter build macos --release

build-for-linux:
name: Build for Flutter Linux
name: Linux
runs-on: ubuntu-latest

steps:
Expand All @@ -154,7 +154,7 @@ jobs:
run: flutter build linux

build-for-web:
name: Build for Flutter Web
name: Web
runs-on: ubuntu-latest

steps:
Expand All @@ -168,7 +168,7 @@ jobs:
run: flutter build web

build-for-web-wasm:
name: Build for Flutter Web WASM
name: Web WASM
runs-on: ubuntu-latest

steps:
Expand Down
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.7.0
2.8.0
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# CHANGELOG

## 2.8.0

* Added: Session API support for simpler E2EE setup
* Changed: Manual video quality selection can be used with adaptive stream enabled
* Changed: Generated protocol definitions for LiveKit protocol v1.45.8
* Fixed: waitForBufferStatusLow busy-waiting after engine close
* Fixed: Simulcast lower layers exceeding the top layer
* Fixed: forceRelay log message interpolation
* Fixed: sendSyncState error handling so sync-state preparation failures are not swallowed
* Fixed: Screen share simulcast default low layer alignment
* Fixed: Region failover null-provider dereference
* Fixed: Android builds with dependencies that require compileSdk 36
* Fixed: Deferred track listener leaks across reconnects
* Fixed: Adaptive stream dimensions on high-density displays
* Fixed: Session.start() reentrancy during concurrent calls
* Fixed: Connected server address resolving from the wrong peer connection
* Fixed: Reconnect counter null assertion on the first reconnect attempt
* Fixed: Premature publication disposal during unpublish

## 2.7.0

* Added: Add setVideoDimensions for remote track publications
Expand Down
35 changes: 15 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Include this package to your `pubspec.yaml`
```yaml
---
dependencies:
livekit_client: ^2.7.0
livekit_client: ^2.8.0
```

### iOS
Expand Down Expand Up @@ -150,30 +150,18 @@ void main() async {

#### Audio Modes

By default, we use the `communication` audio mode on Android which works best for two-way voice communication.
By default LiveKit uses the `communication` audio mode on Android, which works best for two-way voice communication.

If your app is media playback oriented and does not need the use of the device's microphone, you can use the `media`
audio mode which will provide better audio quality.
If your app is media playback oriented and does not need the device's microphone, apply the `media` session yourself. This
switches `AudioManager` to manual mode, where your app owns the session.

```dart
import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc;

Future<void> _initializeAndroidAudioSettings() async {
await webrtc.WebRTC.initialize(options: {
'androidAudioConfiguration': webrtc.AndroidAudioConfiguration.media.toMap()
});
webrtc.Helper.setAndroidAudioConfiguration(
webrtc.AndroidAudioConfiguration.media);
}

void main() async {
await _initializeAudioSettings();
runApp(const MyApp());
}
await AudioManager.instance.setAudioSessionOptions(
const AudioSessionOptions.media(),
);
```

Note: the audio routing will become controlled by the system and cannot be manually changed with functions like
`Hardware.selectAudioOutput`.
See the [audio session guide](https://github.com/livekit/client-sdk-flutter/blob/main/docs/audio.md) for more.

### Desktop support

Expand Down Expand Up @@ -322,6 +310,13 @@ Widget build(BuildContext context) {

Audio tracks are played automatically as long as you are subscribed to them.

LiveKit owns the platform audio session through `AudioManager`. A call is managed automatically with no setup. Speaker routing and, when you need it, manual session control go through the same object. See the [audio session guide](https://github.com/livekit/client-sdk-flutter/blob/main/docs/audio.md) for examples covering the automatic and manual modes, speaker routing, per platform overrides, and migration from the older `Hardware` APIs.

```dart
// A call is managed automatically. Route to the speaker when you want.
await AudioManager.instance.setSpeakerOutputPreferred(true);
```

### Handling changes

LiveKit client makes it simple to build declarative UI that reacts to state changes. It notifies changes in two ways
Expand Down
41 changes: 34 additions & 7 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ group = "io.livekit.plugin"
version = "1.0-SNAPSHOT"

buildscript {
ext.kotlin_version = "1.8.22"
ext.kotlin_version = "2.1.0"
repositories {
google()
mavenCentral()
Expand All @@ -18,11 +18,23 @@ allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}

apply plugin: "com.android.library"
apply plugin: "kotlin-android"

// AGP 9's built-in Kotlin compiles Kotlin itself and rejects the Kotlin Gradle
// Plugin. Apply KGP only when built-in Kotlin is NOT active: that means AGP < 9,
// or AGP 9 with android.builtInKotlin=false (the configuration Flutter currently
// ships by default while the ecosystem migrates).
def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize(".")[0] as int
def builtInKotlinActive = agpMajor >= 9 &&
(!project.hasProperty("android.builtInKotlin") ||
Boolean.parseBoolean(project.property("android.builtInKotlin").toString()))
if (!builtInKotlinActive) {
apply plugin: "kotlin-android"
}

android {
if (project.android.hasProperty("namespace")) {
Expand All @@ -36,10 +48,6 @@ android {
targetCompatibility = JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}

sourceSets {
main.java.srcDirs += "src/main/kotlin"
test.java.srcDirs += "src/test/kotlin"
Expand All @@ -52,8 +60,11 @@ android {
dependencies {
testImplementation("org.jetbrains.kotlin:kotlin-test")
testImplementation("org.mockito:mockito-core:5.0.0")
implementation 'io.github.webrtc-sdk:android:144.7559.01'
implementation 'io.github.webrtc-sdk:android:144.7559.09'
implementation 'io.livekit:noise:2.0.0'
// Audio device/focus/mode routing. Pinned to the same revision used by
// the LiveKit Android SDK (AudioSwitchHandler).
implementation 'com.github.davidliu:audioswitch:039a35aefab7747c557242fa216c9ea11743b604'
}

testOptions {
Expand All @@ -68,3 +79,19 @@ android {
}
}
}

// Configure the Kotlin JVM target. The compilerOptions DSL requires KGP 1.9+ or
// AGP 9 built-in Kotlin; older Flutter app templates ship KGP 1.8.x, which only
// supports the legacy kotlinOptions DSL.
def kotlinExt = project.extensions.findByName("kotlin")
if (kotlinExt?.hasProperty("compilerOptions")) {
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
}
}
} else {
android.kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
Loading
Loading