├── .changeset
├── README.md
├── config.json
├── gorgeous-ligers-suffer.md
├── itchy-experts-rush.md
└── strange-waves-tap.md
├── .editorconfig
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── banner_dark.png
├── banner_light.png
└── workflows
│ ├── README.md
│ ├── android.yml
│ ├── changesets.yml
│ ├── release.yml
│ └── update_snapshot_pr.yml
├── .gitignore
├── .gitmodules
├── .idea
├── .name
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── compiler.xml
├── dictionaries
│ └── davidliu.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jarRepositories.xml
├── kotlinc.xml
├── migrations.xml
├── scopes
│ └── Library_Projects.xml
└── vcs.xml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── LicenseHeaderFile.txt
├── NOTICE
├── README.md
├── build.gradle
├── ci
├── get_version.sh
├── increment_semver.sh
├── update_android_gradle_version.sh
└── update_snapshot_version.sh
├── deps.gradle
├── examples
├── build.gradle
├── screenshare-audio
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── example
│ │ │ └── screenshareaudio
│ │ │ └── ExampleInstrumentedTest.kt
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── example
│ │ │ └── screenshareaudio
│ │ │ ├── MainActivity.kt
│ │ │ ├── MainViewModel.kt
│ │ │ └── ui
│ │ │ └── theme
│ │ │ ├── Color.kt
│ │ │ ├── Theme.kt
│ │ │ └── Type.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ └── ic_launcher_foreground.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
└── virtual-background
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── android
│ │ └── selfie
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── selfie
│ │ │ ├── MainActivity.kt
│ │ │ └── MainViewModel.kt
│ └── res
│ │ ├── drawable
│ │ ├── background.webp
│ │ ├── ic_launcher_background.xml
│ │ └── ic_launcher_foreground.xml
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values-night
│ │ └── themes.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── selfie
│ └── ExampleUnitTest.kt
├── gradle.properties
├── gradle
├── dokka-kotlin-dep-fix.gradle
├── gradle-mvn-push.gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── livekit-android-camerax
├── .gitignore
├── README.md
├── build.gradle
├── consumer-rules.pro
├── gradle.properties
├── module.md
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ ├── io
│ └── livekit
│ │ └── android
│ │ └── camerax
│ │ └── ui
│ │ └── ScaleZoomHelper.kt
│ └── livekit
│ └── org
│ └── webrtc
│ ├── CameraXCapturer.kt
│ ├── CameraXEnumerator.kt
│ ├── CameraXHelper.kt
│ └── CameraXSession.kt
├── livekit-android-sdk
├── .gitignore
├── README.md
├── build.gradle
├── consumer-rules.pro
├── gradle.properties
├── module.md
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ ├── io
│ └── livekit
│ │ └── android
│ │ ├── ConnectOptions.kt
│ │ ├── LiveKit.kt
│ │ ├── LiveKitOverrides.kt
│ │ ├── RoomOptions.kt
│ │ ├── Version.kt
│ │ ├── annotations
│ │ ├── FeatureStabilityAnnotations.kt
│ │ └── WebRTCSensitive.kt
│ │ ├── audio
│ │ ├── AudioBufferCallbackDispatcher.kt
│ │ ├── AudioFocusHandler.kt
│ │ ├── AudioHandler.kt
│ │ ├── AudioProcessingController.kt
│ │ ├── AudioProcessorInterface.kt
│ │ ├── AudioProcessorOptions.kt
│ │ ├── AudioRecordPrewarmer.kt
│ │ ├── AudioRecordSamplesDispatcher.kt
│ │ ├── AudioSwitchHandler.kt
│ │ ├── CommunicationWorkaround.kt
│ │ ├── MixerAudioBufferCallback.kt
│ │ ├── NoAudioHandler.kt
│ │ ├── PreconnectAudioBuffer.kt
│ │ └── ScreenAudioCapturer.kt
│ │ ├── coroutines
│ │ ├── FlowExt.kt
│ │ └── ReentrantMutex.kt
│ │ ├── dagger
│ │ ├── AudioHandlerModule.kt
│ │ ├── CoroutinesModule.kt
│ │ ├── InjectionNames.kt
│ │ ├── InternalBindsModule.kt
│ │ ├── JsonFormatModule.kt
│ │ ├── LiveKitComponent.kt
│ │ ├── MemoryModule.kt
│ │ ├── OverridesModule.kt
│ │ ├── RTCModule.kt
│ │ └── WebModule.kt
│ │ ├── e2ee
│ │ ├── E2EEManager.kt
│ │ ├── E2EEOptions.kt
│ │ ├── E2EEState.kt
│ │ └── KeyProvider.kt
│ │ ├── events
│ │ ├── BroadcastEventBus.kt
│ │ ├── Event.kt
│ │ ├── EventListenable.kt
│ │ ├── ParticipantEvent.kt
│ │ ├── RoomEvent.kt
│ │ ├── TrackEvent.kt
│ │ └── TrackPublicationEvent.kt
│ │ ├── memory
│ │ ├── CloseableManager.kt
│ │ └── SurfaceTextureHelperCloser.kt
│ │ ├── renderer
│ │ ├── SurfaceViewRenderer.kt
│ │ └── TextureViewRenderer.kt
│ │ ├── room
│ │ ├── ConnectionState.kt
│ │ ├── DefaultsManager.kt
│ │ ├── IceCandidateJSON.kt
│ │ ├── PeerConnectionTransport.kt
│ │ ├── PublisherTransportObserver.kt
│ │ ├── RTCEngine.kt
│ │ ├── RegionUrlProvider.kt
│ │ ├── Room.kt
│ │ ├── SignalClient.kt
│ │ ├── SubscriberTransportObserver.kt
│ │ ├── datastream
│ │ │ ├── StreamException.kt
│ │ │ ├── StreamInfo.kt
│ │ │ ├── StreamOptions.kt
│ │ │ ├── incoming
│ │ │ │ ├── BaseStreamReceiver.kt
│ │ │ │ ├── ByteStreamReceiver.kt
│ │ │ │ ├── IncomingDataStreamManager.kt
│ │ │ │ └── TextStreamReceiver.kt
│ │ │ └── outgoing
│ │ │ │ ├── BaseStreamSender.kt
│ │ │ │ ├── ByteStreamSender.kt
│ │ │ │ ├── OutgoingDataStreamManager.kt
│ │ │ │ └── TextStreamSender.kt
│ │ ├── metrics
│ │ │ └── RTCMetricsManager.kt
│ │ ├── network
│ │ │ └── NetworkCallbackManager.kt
│ │ ├── participant
│ │ │ ├── LocalParticipant.kt
│ │ │ ├── Participant.kt
│ │ │ ├── PublishUtils.kt
│ │ │ └── RemoteParticipant.kt
│ │ ├── provisions
│ │ │ └── LKObjects.kt
│ │ ├── rpc
│ │ │ └── RpcManager.kt
│ │ ├── track
│ │ │ ├── AudioTrack.kt
│ │ │ ├── DataPublishReliability.kt
│ │ │ ├── LocalAudioTrack.kt
│ │ │ ├── LocalAudioTrackOptions.kt
│ │ │ ├── LocalScreencastVideoTrack.kt
│ │ │ ├── LocalTrackPublication.kt
│ │ │ ├── LocalVideoTrack.kt
│ │ │ ├── LocalVideoTrackOptions.kt
│ │ │ ├── RemoteAudioTrack.kt
│ │ │ ├── RemoteTrackPublication.kt
│ │ │ ├── RemoteVideoTrack.kt
│ │ │ ├── Track.kt
│ │ │ ├── TrackPublication.kt
│ │ │ ├── VideoQuality.kt
│ │ │ ├── VideoTrack.kt
│ │ │ ├── screencapture
│ │ │ │ ├── ScreenCaptureConnection.kt
│ │ │ │ ├── ScreenCaptureParams.kt
│ │ │ │ └── ScreenCaptureService.kt
│ │ │ └── video
│ │ │ │ ├── BitmapFrameCapturer.kt
│ │ │ │ ├── CameraCapturerUtils.kt
│ │ │ │ ├── CameraEventsDispatchHandler.kt
│ │ │ │ ├── CaptureDispatchObserver.kt
│ │ │ │ ├── ChainVideoProcessor.kt
│ │ │ │ ├── NoDropVideoProcessor.kt
│ │ │ │ ├── ScalabilityMode.kt
│ │ │ │ ├── ScaleCropVideoProcessor.kt
│ │ │ │ ├── VideoCapturerWithSize.kt
│ │ │ │ ├── VideoFrameCapturer.kt
│ │ │ │ └── VideoSinkVisibility.kt
│ │ ├── types
│ │ │ └── TranscriptionSegment.kt
│ │ └── util
│ │ │ ├── ConnectionWarmer.kt
│ │ │ ├── CoroutineSdpObserver.kt
│ │ │ ├── EncodingUtils.kt
│ │ │ ├── MediaConstraintKeys.kt
│ │ │ └── PeerConnectionStateObservable.kt
│ │ ├── rpc
│ │ └── RpcError.kt
│ │ ├── stats
│ │ ├── ClientInfo.kt
│ │ ├── NetworkInfo.kt
│ │ └── NetworkMonitor.kt
│ │ ├── util
│ │ ├── CloseableCoroutineScope.kt
│ │ ├── CoroutineUtil.kt
│ │ ├── Either.kt
│ │ ├── FlowDelegate.kt
│ │ ├── LKLog.kt
│ │ ├── LoggingLevel.kt
│ │ ├── MapDiffUtil.kt
│ │ ├── MessageLiteExt.kt
│ │ ├── MutexEx.kt
│ │ ├── OkHttpCallExt.kt
│ │ ├── StringByteUtils.kt
│ │ └── UrlUtils.kt
│ │ └── webrtc
│ │ ├── CustomAudioProcessingFactory.kt
│ │ ├── CustomVideoDecoderFactory.kt
│ │ ├── CustomVideoEncoderFactory.kt
│ │ ├── DataChannelManager.kt
│ │ ├── JainSdpUtils.kt
│ │ ├── PeerConnectionExt.kt
│ │ ├── RTCStatsExt.kt
│ │ ├── RtpTransceiverExt.kt
│ │ ├── SessionDescriptionExt.kt
│ │ ├── SimulcastVideoEncoderFactoryWrapper.kt
│ │ └── peerconnection
│ │ ├── PeerConnectionResource.kt
│ │ └── RTCThreadUtils.kt
│ └── livekit
│ └── org
│ └── webrtc
│ ├── Camera1Helper.kt
│ └── Camera2Helper.kt
├── livekit-android-test
├── .gitignore
├── build.gradle
├── consumer-rules.pro
├── gradle.properties
├── module.md
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ ├── io
│ │ └── livekit
│ │ │ └── android
│ │ │ └── test
│ │ │ ├── BaseTest.kt
│ │ │ ├── MockE2ETest.kt
│ │ │ ├── assert
│ │ │ └── Asserts.kt
│ │ │ ├── coroutines
│ │ │ ├── EventListenableExt.kt
│ │ │ └── TestCoroutineRule.kt
│ │ │ ├── events
│ │ │ ├── EventCollector.kt
│ │ │ └── FlowCollector.kt
│ │ │ ├── mock
│ │ │ ├── MockAudioDeviceModule.kt
│ │ │ ├── MockAudioProcessingController.kt
│ │ │ ├── MockAudioSource.kt
│ │ │ ├── MockAudioStreamTrack.kt
│ │ │ ├── MockDataChannel.kt
│ │ │ ├── MockEglBase.kt
│ │ │ ├── MockLKObjects.kt
│ │ │ ├── MockMediaStream.kt
│ │ │ ├── MockMediaStreamTrack.kt
│ │ │ ├── MockNetworkCallbackRegistry.kt
│ │ │ ├── MockPeerConnection.kt
│ │ │ ├── MockRtpReceiver.kt
│ │ │ ├── MockRtpSender.kt
│ │ │ ├── MockVideoCapturer.kt
│ │ │ ├── MockVideoSource.kt
│ │ │ ├── MockVideoStreamTrack.kt
│ │ │ ├── MockWebSocket.kt
│ │ │ ├── MockWebSocketFactory.kt
│ │ │ ├── TestData.kt
│ │ │ ├── camera
│ │ │ │ └── MockCameraProvider.kt
│ │ │ ├── dagger
│ │ │ │ ├── TestAudioHandlerModule.kt
│ │ │ │ ├── TestCoroutinesModule.kt
│ │ │ │ ├── TestLiveKitComponent.kt
│ │ │ │ ├── TestRTCModule.kt
│ │ │ │ └── TestWebModule.kt
│ │ │ └── room
│ │ │ │ ├── datastream
│ │ │ │ └── outgoing
│ │ │ │ │ └── MockStreamDestination.kt
│ │ │ │ ├── track
│ │ │ │ └── MockLocalAudioTrack.kt
│ │ │ │ └── util
│ │ │ │ └── MockConnectionWarmer.kt
│ │ │ └── util
│ │ │ ├── ByteString.kt
│ │ │ ├── DataChannelBufferExt.kt
│ │ │ └── LoggingRule.kt
│ │ └── livekit
│ │ └── org
│ │ └── webrtc
│ │ ├── MockPeerConnectionFactory.kt
│ │ ├── MockRtpParameters.kt
│ │ ├── MockRtpTransceiver.kt
│ │ ├── NativeLibraryLoaderTestHelper.kt
│ │ └── WebRTCInitializer.kt
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ ├── audio
│ ├── AudioBufferCallbackDispatcherTest.kt
│ └── MixerAudioBufferCallbackTest.kt
│ ├── proto
│ └── ProtoConverterTest.kt
│ ├── room
│ ├── RTCEngineMockE2ETest.kt
│ ├── RTCEngineTest.kt
│ ├── RegionUrlProviderTest.kt
│ ├── RoomDataMockE2ETest.kt
│ ├── RoomMockE2ETest.kt
│ ├── RoomParticipantEventMockE2ETest.kt
│ ├── RoomReconnectionMockE2ETest.kt
│ ├── RoomReconnectionTypesMockE2ETest.kt
│ ├── RoomTest.kt
│ ├── RoomTranscriptionMockE2ETest.kt
│ ├── SdpMungingTest.kt
│ ├── SignalClientTest.kt
│ ├── datastream
│ │ ├── RoomIncomingDataStreamMockE2ETest.kt
│ │ ├── RoomOutgoingDataStreamMockE2ETest.kt
│ │ ├── StreamReaderTest.kt
│ │ └── outgoing
│ │ │ ├── ByteStreamSenderTest.kt
│ │ │ └── TextStreamSenderTest.kt
│ ├── participant
│ │ ├── LocalParticipantMockE2ETest.kt
│ │ ├── ParticipantMockE2ETest.kt
│ │ ├── ParticipantTest.kt
│ │ ├── ParticipantTrackPermissionTest.kt
│ │ └── RemoteParticipantTest.kt
│ ├── track
│ │ ├── RemoteTrackPublicationTest.kt
│ │ ├── RemoteVideoTrackTest.kt
│ │ └── video
│ │ │ └── ScalabilityModeTest.kt
│ ├── types
│ │ └── TranscriptionSegmentTest.kt
│ └── util
│ │ └── EncodingUtilsTest.kt
│ ├── rpc
│ └── RpcMockE2ETest.kt
│ ├── util
│ ├── LKLogTest.kt
│ └── MapDiffUtilTest.kt
│ └── webrtc
│ ├── JainSdpUtilsTest.kt
│ └── RTCConfigurationTest.kt
├── livekit-android-track-processors
├── .gitignore
├── README.md
├── build.gradle
├── consumer-rules.pro
├── gradle.properties
├── module.md
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── track
│ └── processing
│ └── video
│ ├── VirtualBackgroundTransformer.kt
│ ├── VirtualBackgroundVideoProcessor.kt
│ ├── opengl
│ └── LKGlTextureFrameBuffer.java
│ └── shader
│ ├── BlurShader.kt
│ ├── BoxBlurShader.kt
│ ├── CompositeShader.kt
│ ├── DefaultVertexShader.kt
│ ├── ResamplerShader.kt
│ └── ShaderUtil.kt
├── livekit-lint
├── .gitignore
├── build.gradle
└── src
│ ├── main
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── lint
│ │ ├── FlowDelegateUsageDetector.kt
│ │ ├── IssueRegistry.kt
│ │ └── MediaTrackEqualsDetector.kt
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── lint
│ ├── FlowDelegateUsageDetectorTest.kt
│ └── MediaTrackEqualsDetectorTest.kt
├── package.json
├── pnpm-lock.yaml
├── release-instructions.md
├── sample-app-basic
├── .gitignore
├── README.md
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── android
│ │ └── sample
│ │ └── basic
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── sample
│ │ │ └── basic
│ │ │ └── MainActivity.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values-night
│ │ └── themes.xml
│ │ ├── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ │ └── xml
│ │ └── network_security_config.xml
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── sample
│ └── basic
│ └── ExampleUnitTest.kt
├── sample-app-common
├── .gitignore
├── README.md
├── build.gradle
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── io
│ │ └── livekit
│ │ └── android
│ │ └── sample
│ │ ├── CallViewModel.kt
│ │ ├── MainViewModel.kt
│ │ ├── model
│ │ └── StressTest.kt
│ │ ├── service
│ │ └── ForegroundService.kt
│ │ └── util
│ │ ├── ActivityPermissionsExt.kt
│ │ └── LiveDataExt.kt
│ └── res
│ ├── drawable
│ ├── account_cancel.xml
│ ├── account_cancel_outline.xml
│ ├── banner_dark.xml
│ ├── baseline_cast_24.xml
│ ├── baseline_cast_connected_24.xml
│ ├── baseline_chat_24.xml
│ ├── dots_horizontal_circle_outline.xml
│ ├── ic_baseline_cancel_24.xml
│ ├── ic_logo_dark.xml
│ ├── outline_flip_camera_android_24.xml
│ ├── outline_mic_24.xml
│ ├── outline_mic_off_24.xml
│ ├── outline_videocam_24.xml
│ ├── outline_videocam_off_24.xml
│ ├── voice_wave_24.xml
│ ├── volume_up_48px.xml
│ ├── wifi_strength_1.xml
│ ├── wifi_strength_2.xml
│ ├── wifi_strength_3.xml
│ ├── wifi_strength_4.xml
│ └── wifi_strength_alert_outline.xml
│ ├── values
│ └── colors.xml
│ └── xml
│ └── network_security_config.xml
├── sample-app-compose
├── .gitignore
├── README.md
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── android
│ │ └── composesample
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── composesample
│ │ │ ├── CallActivity.kt
│ │ │ ├── MainActivity.kt
│ │ │ ├── ParticipantItem.kt
│ │ │ ├── SampleApplication.kt
│ │ │ ├── VideoItem.kt
│ │ │ ├── ViewModelLazyExt.kt
│ │ │ └── ui
│ │ │ ├── ComposeVisibility.kt
│ │ │ ├── DebugMenuDialog.kt
│ │ │ ├── SelectAudioDeviceDialog.kt
│ │ │ ├── VideoRenderer.kt
│ │ │ └── theme
│ │ │ ├── Color.kt
│ │ │ ├── Shape.kt
│ │ │ ├── Theme.kt
│ │ │ └── Type.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── composesample
│ └── ExampleUnitTest.kt
├── sample-app-record-local
├── .gitignore
├── README.md
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── android
│ │ └── sample
│ │ └── record
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── sample
│ │ │ └── record
│ │ │ ├── MainActivity.kt
│ │ │ ├── VideoFileRenderer.java
│ │ │ └── ui
│ │ │ └── theme
│ │ │ ├── Color.kt
│ │ │ ├── Shape.kt
│ │ │ ├── Theme.kt
│ │ │ └── Type.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── sample
│ └── record
│ └── ExampleUnitTest.kt
├── sample-app
├── .gitignore
├── README.md
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── livekit
│ │ └── android
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── livekit
│ │ │ └── android
│ │ │ └── sample
│ │ │ ├── CallActivity.kt
│ │ │ ├── MainActivity.kt
│ │ │ ├── ParticipantItem.kt
│ │ │ ├── SampleApplication.kt
│ │ │ ├── ViewModelLazyExt.kt
│ │ │ └── dialog
│ │ │ ├── AudioProcessorSwitchDialog.kt
│ │ │ ├── DebugMenuDialog.kt
│ │ │ └── SelectAudioDeviceDialog.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ └── speaker_indicator.xml
│ │ ├── layout
│ │ ├── call_activity.xml
│ │ ├── dialog_button.xml
│ │ ├── main_activity.xml
│ │ ├── participant_item.xml
│ │ └── speaker_view.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ └── values
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── io
│ └── livekit
│ └── android
│ └── ExampleUnitTest.kt
├── settings.gradle
└── video-encode-decode-test
├── .gitignore
├── README.md
├── build.gradle
├── proguard-rules.pro
└── src
├── androidTest
└── java
│ └── io
│ └── livekit
│ └── android
│ └── videoencodedecode
│ ├── AndroidIntentComposeTestRule.kt
│ ├── RandomString.kt
│ ├── VideoTest.kt
│ └── test
│ ├── OfficialCodecSupportTest.kt
│ ├── control
│ ├── H264DefaultVideoTest.kt
│ ├── NoWhitelistDefaultVideoTest.kt
│ └── VP8DefaultVideoTest.kt
│ └── test
│ ├── H264SimulcastVideoTest.kt
│ ├── NoWhitelistSimulcastVideoTest.kt
│ └── VP8DefaultVideoTest.kt
└── main
├── AndroidManifest.xml
├── java
└── io
│ └── livekit
│ └── android
│ └── videoencodedecode
│ ├── CallActivity.kt
│ ├── CallViewModel.kt
│ ├── ConnectionItem.kt
│ ├── DummyVideoCapturer.kt
│ ├── MainActivity.kt
│ ├── MainViewModel.kt
│ ├── ParticipantItem.kt
│ ├── SampleApplication.kt
│ ├── VideoItem.kt
│ ├── ViewModelLazyExt.kt
│ ├── WhitelistDefaultVideoEncoderFactory.kt
│ ├── WhitelistEncoderFactory.kt
│ ├── WhitelistSimulcastVideoEncoderFactory.kt
│ └── ui
│ ├── ComposeVisibility.kt
│ ├── DebugMenuDialog.kt
│ ├── VideoRenderer.kt
│ └── theme
│ ├── Color.kt
│ ├── Shape.kt
│ ├── Theme.kt
│ └── Type.kt
└── res
├── drawable-v24
└── ic_launcher_foreground.xml
├── drawable
└── ic_launcher_background.xml
├── mipmap-anydpi-v26
├── ic_launcher.xml
└── ic_launcher_round.xml
├── mipmap-hdpi
├── ic_launcher.webp
└── ic_launcher_round.webp
├── mipmap-mdpi
├── ic_launcher.webp
└── ic_launcher_round.webp
├── mipmap-xhdpi
├── ic_launcher.webp
└── ic_launcher_round.webp
├── mipmap-xxhdpi
├── ic_launcher.webp
└── ic_launcher_round.webp
├── mipmap-xxxhdpi
├── ic_launcher.webp
└── ic_launcher_round.webp
├── values
├── colors.xml
├── strings.xml
└── themes.xml
└── xml
└── network_security_config.xml
/.changeset/README.md:
--------------------------------------------------------------------------------
1 | # Changesets
2 |
3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
4 | with multi-package repos, or single-package repos to help you version and publish your code. You can
5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets)
6 |
7 | We have a quick list of common questions to get you started engaging with this project in
8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
9 |
--------------------------------------------------------------------------------
/.changeset/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://unpkg.com/@changesets/config@3.0.2/schema.json",
3 | "changelog": [
4 | "@livekit/changesets-changelog-github",
5 | { "repo": "livekit/client-sdk-android" }
6 | ],
7 | "commit": false,
8 | "fixed": [],
9 | "linked": [],
10 | "access": "public",
11 | "baseBranch": "main",
12 | "updateInternalDependencies": "patch",
13 | "ignore": [],
14 | "privatePackages": { "version": true, "tag": true }
15 | }
16 |
--------------------------------------------------------------------------------
/.changeset/gorgeous-ligers-suffer.md:
--------------------------------------------------------------------------------
1 | ---
2 | "client-sdk-android": patch
3 | ---
4 |
5 | Fix switchCamera not working if the camera id is physical id
6 |
--------------------------------------------------------------------------------
/.changeset/itchy-experts-rush.md:
--------------------------------------------------------------------------------
1 | ---
2 | "client-sdk-android": patch
3 | ---
4 |
5 | Fix sending pre-connect audio data when byte buffer has backing array
6 |
--------------------------------------------------------------------------------
/.changeset/strange-waves-tap.md:
--------------------------------------------------------------------------------
1 | ---
2 | "client-sdk-android": minor
3 | ---
4 |
5 | Change isMicrophoneEnabled, isCameraEnabled, isScreenshareEnabled to FlowObservable variables
6 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | max_line_length = 180
8 |
9 | end_of_line = lf
10 | charset = utf-8
11 | trim_trailing_whitespace = true
12 | insert_final_newline = true
13 |
14 | [*.{java,kt,kts,scala,rs,xml,kt.spec,kts.spec,gradle,md}]
15 | indent_size = 4
16 |
17 | [*.{kt,kts}]
18 | ktlint_code_style = android_studio
19 |
20 | # default IntelliJ IDEA style, same as alphabetical, but with "java", "javax", "kotlin" and alias imports in the end of the imports list
21 | ij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^
22 |
23 | ktlint_standard = enabled
24 | ktlint_standard_annotation = disabled
25 | ktlint_standard_no-wildcard-imports = disabled
26 |
27 | ktlint_standard_trailing-comma-on-call-site = disabled
28 | ij_kotlin_allow_trailing_comma_on_call_site = true
29 | ktlint_standard_trailing-comma-on-declaration-site = disabled
30 | ij_kotlin_allow_trailing_comma = true
31 |
32 | ktlint_standard_wrapping = disabled
33 |
34 | [*.md]
35 | trim_trailing_whitespace = false
36 | max_line_length = unset
37 |
38 | [*.yml]
39 | ij_yaml_spaces_within_brackets = false
40 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Device Info:**
27 | - Device: [e.g. Google Pixel 4]
28 | - OS: [e.g. Android 12]
29 | - LiveKit SDK version: [e.g. 1.0.0]
30 |
31 | **Additional context**
32 | Add any other context about the problem here.
33 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: enhancement
6 | assignees: davidliu
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/banner_dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/.github/banner_dark.png
--------------------------------------------------------------------------------
/.github/banner_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/.github/banner_light.png
--------------------------------------------------------------------------------
/.github/workflows/README.md:
--------------------------------------------------------------------------------
1 | Use https://github.com/nektos/act to test github actions locally.
2 |
--------------------------------------------------------------------------------
/.github/workflows/update_snapshot_pr.yml:
--------------------------------------------------------------------------------
1 | name: Manually create SNAPSHOT update PR
2 |
3 | on:
4 | workflow_dispatch:
5 |
6 | concurrency: ${{ github.workflow }}-${{ github.ref }}
7 |
8 | permissions:
9 | contents: write
10 | pull-requests: write
11 |
12 | jobs:
13 | update-snapshot:
14 | name: Update SNAPSHOT
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - name: Checkout Repo
19 | uses: actions/checkout@v4
20 |
21 | - name: Update snapshot
22 | id: update
23 | run: echo "SNAPSHOT_VERSION=$(./ci/update_snapshot_version.sh)" >> "$GITHUB_OUTPUT"
24 |
25 | - name: Log version
26 | env:
27 | SNAPSHOT_VERSION: ${{ steps.update.outputs.SNAPSHOT_VERSION }}
28 | run: echo $SNAPSHOT_VERSION
29 |
30 | - name: Create Update SNAPSHOT Pull Request
31 | uses: peter-evans/create-pull-request@v6
32 | with:
33 | token: ${{ secrets.CHANGESET_GH_TOKEN }}
34 | branch: dl/update_snapshot_ver
35 | title: Prepare snapshot version ${{ steps.update.outputs.SNAPSHOT_VERSION }}
36 | commit-message: Prepare snapshot version ${{ steps.update.outputs.SNAPSHOT_VERSION }}
37 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | /.idea/deploymentTargetDropDown.xml
11 | /.idea/misc.xml
12 | /.idea/gradle.xml
13 | /.idea/runConfigurations.xml
14 | /.idea/deploymentTargetSelector.xml
15 | .DS_Store
16 | /build
17 | /captures
18 | .externalNativeBuild
19 | .cxx
20 | /livekit-lint/bin
21 |
22 | ### Changesets
23 | node_modules/
24 | npm-debug.log
25 | yarn-debug.log
26 | yarn-error.log
27 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "protocol"]
2 | path = protocol
3 | url = ../protocol.git
4 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | livekit-android
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/dictionaries/davidliu.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | bitrates
5 | capturer
6 | chunker
7 | exts
8 | msid
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/kotlinc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/migrations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/scopes/Library_Projects.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 | We appreciate any pull requests for changes you may have in mind! Here are some tips and instructions you should follow before we can accept your PR.
3 |
4 | * Consult the [Dev Environment](https://github.com/livekit/client-sdk-android?tab=readme-ov-file#dev-environment) instructions for getting the repo set up on your computer. The contained projects may not compile otherwise.
5 |
6 | * Add a changeset file which explains the changes contained in the PR.
7 |
8 | In the root folder, execute the following commands:
9 | ```
10 | pnpm install
11 | pnpm changeset
12 | ```
13 |
14 | Follow the instructions on screen to create the changeset file.
15 |
16 | * Format your code using `./gradlew spotlessApply`.
17 |
18 | * On your first pull request, the CLA Assistant bot will give you a link to sign this project's Contributor License Agreement, required to add your code to the repository. This license is non-optional and we cannot accept any PRs from contributors who have not signed the CLA.
19 |
--------------------------------------------------------------------------------
/LicenseHeaderFile.txt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright $YEAR LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 |
--------------------------------------------------------------------------------
/ci/get_version.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | set -x
4 |
5 | PACKAGE_VERSION=$(cat ./package.json | jq -r '.version')
6 | echo "$PACKAGE_VERSION"
7 |
--------------------------------------------------------------------------------
/ci/update_android_gradle_version.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | set -x
4 |
5 | PACKAGE_VERSION=$(cat ./package.json | jq -r '.version')
6 | >&2 echo "updating gradle version name to $PACKAGE_VERSION"
7 |
8 | SNAPSHOT_VERSION=$(./ci/increment_semver.sh -p $PACKAGE_VERSION)"-SNAPSHOT"
9 | >&2 echo "next snapshot version to $SNAPSHOT_VERSION"
10 |
11 | # sed command works only on linux based systems as macOS version expects a backup file passed additionally
12 |
13 | if [ "$(uname)" == "Darwin" ]; then
14 | ARGS=('')
15 | else
16 | ARGS=()
17 | fi
18 |
19 | sed -i "${ARGS[@]}" -e "/VERSION_NAME=/ s/=.*/=$PACKAGE_VERSION/" ./gradle.properties
20 | sed -i "${ARGS[@]}" -e '/def livekit_version =/ s/".*"/"'"$PACKAGE_VERSION"'"/' ./README.md
21 | sed -i "${ARGS[@]}" -e '/SNAPSHOT/ s/".*"/"'"io.livekit:livekit-android:$SNAPSHOT_VERSION"'"/' ./README.md
22 |
--------------------------------------------------------------------------------
/ci/update_snapshot_version.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | set -x
4 |
5 | PACKAGE_VERSION=$(cat ./package.json | jq -r '.version')
6 | >&2 echo "current version: $PACKAGE_VERSION"
7 |
8 | SNAPSHOT_VERSION=$(./ci/increment_semver.sh -p $PACKAGE_VERSION)"-SNAPSHOT"
9 | >&2 echo "updating snapshot version to $SNAPSHOT_VERSION"
10 |
11 | # sed command works only on linux based systems as macOS version expects a backup file passed additionally
12 | if [ "$(uname)" == "Darwin" ]; then
13 | ARGS=('')
14 | else
15 | ARGS=()
16 | fi
17 |
18 | sed -i "${ARGS[@]}" -e "/VERSION_NAME=/ s/=.*/=$SNAPSHOT_VERSION/" ./gradle.properties
19 |
20 | echo $SNAPSHOT_VERSION
--------------------------------------------------------------------------------
/deps.gradle:
--------------------------------------------------------------------------------
1 | ext {
2 | android_build_tools_version = '8.7.2'
3 | compose_version = '1.2.1'
4 | compose_compiler_version = '1.5.15'
5 | kotlin_version = '1.9.25'
6 | java_version = JavaVersion.VERSION_1_8
7 | dokka_version = '1.9.20'
8 | androidSdk = [
9 | compileVersion: 35,
10 | targetVersion : 35,
11 | minVersion : 21,
12 | ]
13 | generated = [
14 | protoSrc: "$projectDir/protocol/protobufs",
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/examples/build.gradle:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/build.gradle
--------------------------------------------------------------------------------
/examples/screenshare-audio/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/examples/screenshare-audio/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/java/io/livekit/android/example/screenshareaudio/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.example.screenshareaudio.ui.theme
18 |
19 | import androidx.compose.ui.graphics.Color
20 |
21 | val Purple80 = Color(0xFFD0BCFF)
22 | val PurpleGrey80 = Color(0xFFCCC2DC)
23 | val Pink80 = Color(0xFFEFB8C8)
24 |
25 | val Purple40 = Color(0xFF6650a4)
26 | val PurpleGrey40 = Color(0xFF625b71)
27 | val Pink40 = Color(0xFF7D5260)
28 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/screenshare-audio/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
11 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ScreenShareAudio
3 |
--------------------------------------------------------------------------------
/examples/screenshare-audio/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/examples/virtual-background/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/examples/virtual-background/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/drawable/background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/drawable/background.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/examples/virtual-background/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF000000
4 | #FFFFFFFF
5 |
6 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | LK Virtual Background Example
3 |
4 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/examples/virtual-background/src/test/java/io/livekit/android/selfie/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024-2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.selfie
18 |
19 | import org.junit.Assert.*
20 | import org.junit.Test
21 |
22 | /**
23 | * Example local unit test, which will execute on the development machine (host).
24 | *
25 | * See [testing documentation](http://d.android.com/tools/testing).
26 | */
27 | class ExampleUnitTest {
28 | @Test
29 | fun addition_isCorrect() {
30 | assertEquals(4, 2 + 2)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/gradle/dokka-kotlin-dep-fix.gradle:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | /**
18 | * Original issue
19 | * https://github.com/Kotlin/dokka/issues/3117
20 | */
21 | afterEvaluate {
22 | tasks.named("dokkaHtml").configure {
23 | dependsOn(tasks.named("kaptReleaseKotlin"), tasks.named("kaptDebugKotlin"))
24 | }
25 | tasks.named("dokkaJavadoc").configure {
26 | dependsOn(tasks.named("kaptReleaseKotlin"), tasks.named("kaptDebugKotlin"))
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon May 01 22:58:53 JST 2023
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/livekit-android-camerax/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/livekit-android-camerax/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/livekit-android-camerax/consumer-rules.pro
--------------------------------------------------------------------------------
/livekit-android-camerax/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=CameraX Support for LiveKit Android SDK
2 | POM_ARTIFACT_ID=livekit-android-camerax
3 | POM_PACKAGING=aar
4 |
--------------------------------------------------------------------------------
/livekit-android-camerax/module.md:
--------------------------------------------------------------------------------
1 | # Module livekit-android-camerax
2 |
3 | CameraX support for LiveKit Android SDK. This library provides an CameraX integration for use with
4 | the Android LiveKit SDK, providing access to more camera functionality such as custom zoom and torch
5 | control.
6 |
7 | # Package livekit.org.webrtc
8 |
9 | The core LiveKit CameraX package.
10 |
11 | # Package io.livekit.android.camerax.ui
12 |
13 | Easy to use UI utilities for controlling the camera.
14 |
--------------------------------------------------------------------------------
/livekit-android-camerax/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/livekit-android-camerax/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/livekit-android-sdk/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/livekit-android-sdk/README.md:
--------------------------------------------------------------------------------
1 | # Android Kotlin SDK for LiveKit
2 |
3 | ----
4 |
--------------------------------------------------------------------------------
/livekit-android-sdk/consumer-rules.pro:
--------------------------------------------------------------------------------
1 | # Kotlin Serialization Proguard Rules
2 | ########################################
3 |
4 | -keepattributes *Annotation*, InnerClasses
5 | -dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations
6 |
7 | # kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
8 | -keepclassmembers class kotlinx.serialization.json.** {
9 | *** Companion;
10 | }
11 | -keepclasseswithmembers class kotlinx.serialization.json.** {
12 | kotlinx.serialization.KSerializer serializer(...);
13 | }
14 |
15 | -keep,includedescriptorclasses class io.livekit.android.**$$serializer { *; }
16 | -keepclassmembers class io.livekit.android.** {
17 | *** Companion;
18 | }
19 | -keepclasseswithmembers class io.livekit.android.** {
20 | kotlinx.serialization.KSerializer serializer(...);
21 | }
22 |
23 | # WebRTC
24 | #########################################
25 | -keep class livekit.org.webrtc.** { *; }
26 |
27 | # NIST sdp parser
28 | #########################################
29 | -keep class android.gov.nist.** { *; }
30 | -dontwarn com.sun.nio.sctp.**
31 | -dontwarn org.apache.log4j.**
32 |
33 | # Protobuf
34 | #########################################
35 | -keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
36 |
--------------------------------------------------------------------------------
/livekit-android-sdk/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=LiveKit Client Android SDK
2 | POM_ARTIFACT_ID=livekit-android
3 | POM_PACKAGING=aar
--------------------------------------------------------------------------------
/livekit-android-sdk/module.md:
--------------------------------------------------------------------------------
1 | # Module livekit-android-sdk
2 |
3 | Android Client SDK to [LiveKit](https://github.com/livekit/livekit-server).
4 |
5 | # Package io.livekit.android
6 |
7 | This package contains the initial `connect` function.
8 |
9 | # Package io.livekit.android.compose
10 |
11 | Utilities and composables for use with Jetpack Compose.
12 |
13 | # Package io.livekit.android.room
14 |
15 | Room is the primary class that manages the connection to the LiveKit Room. It exposes listeners that
16 | lets you hook into room events.
17 |
18 | # Package io.livekit.android.room.track
19 |
20 | `AudioTrack` and `VideoTrack` are the classes that represent the types of media streams that can be
21 | subscribed and published.
22 |
--------------------------------------------------------------------------------
/livekit-android-sdk/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | #############################################################################
24 | # NOTE: Any rules should probably be applied to consumer-rules.pro instead. #
25 | #############################################################################
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/Version.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android
18 |
19 | /**
20 | * Version information about LiveKit
21 | */
22 | object Version {
23 | /**
24 | * The current LiveKit SDK version.
25 | */
26 | const val CLIENT_VERSION = BuildConfig.VERSION_NAME
27 | }
28 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/annotations/FeatureStabilityAnnotations.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.annotations
18 |
19 | @Retention(AnnotationRetention.BINARY)
20 | @RequiresOptIn
21 | annotation class Experimental
22 |
23 | @Retention(AnnotationRetention.BINARY)
24 | @RequiresOptIn
25 | annotation class Alpha
26 |
27 | @Retention(AnnotationRetention.BINARY)
28 | @RequiresOptIn
29 | annotation class Beta
30 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/annotations/WebRTCSensitive.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.annotations
18 |
19 | /**
20 | * The target marked with this annotation is sensitive to the internal
21 | * code of WebRTC, and should be directly retested whenever WebRTC version
22 | * is upgraded.
23 | */
24 | @Retention(AnnotationRetention.SOURCE)
25 | annotation class WebRTCSensitive
26 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/audio/AudioHandler.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.audio
18 |
19 | /**
20 | * Interface for handling android audio.
21 | */
22 | interface AudioHandler {
23 | /**
24 | * Called when a room is started.
25 | */
26 | fun start()
27 |
28 | /**
29 | * Called when a room is disconnected.
30 | */
31 | fun stop()
32 | }
33 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/audio/NoAudioHandler.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.audio
18 |
19 | import javax.inject.Inject
20 |
21 | /**
22 | * A dummy implementation that does no audio handling.
23 | */
24 | class NoAudioHandler
25 | @Inject
26 | constructor() : AudioHandler {
27 | override fun start() {
28 | }
29 |
30 | override fun stop() {
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/dagger/JsonFormatModule.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.dagger
18 |
19 | import dagger.Module
20 | import dagger.Provides
21 | import dagger.Reusable
22 | import kotlinx.serialization.json.Json
23 |
24 | /**
25 | * @suppress
26 | */
27 | @Module
28 | object JsonFormatModule {
29 | @Provides
30 | @Reusable
31 | fun kotlinSerializationJson(): Json =
32 | Json {
33 | ignoreUnknownKeys = true
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/dagger/MemoryModule.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.dagger
18 |
19 | import dagger.Module
20 | import dagger.Provides
21 | import io.livekit.android.memory.CloseableManager
22 | import javax.inject.Singleton
23 |
24 | /**
25 | * @suppress
26 | */
27 | @Module
28 | object MemoryModule {
29 |
30 | @Singleton
31 | @Provides
32 | fun closeableManager() = CloseableManager()
33 | }
34 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/e2ee/E2EEState.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.e2ee
18 |
19 | enum class E2EEState {
20 | NEW, // initial state
21 | OK, // encryption or decryption succeeded
22 | KEY_RATCHETED, // key ratcheted
23 | MISSING_KEY, // missing key
24 | ENCRYPTION_FAILED, // encryption failed
25 | DECRYPTION_FAILED, // decryption failed
26 | INTERNAL_ERROR, // internal error
27 | }
28 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/events/Event.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.events
18 |
19 | sealed class Event
20 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/events/EventListenable.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.events
18 |
19 | import kotlinx.coroutines.flow.Flow
20 | import kotlinx.coroutines.flow.SharedFlow
21 |
22 | /**
23 | * An interface declaring that this object emits events that can be collected.
24 | * @see [EventListenable.collect]
25 | */
26 | interface EventListenable {
27 | val events: SharedFlow
28 | }
29 |
30 | /**
31 | * @see [Flow.collect]
32 | */
33 | suspend inline fun EventListenable.collect(crossinline action: suspend (value: T) -> Unit): Nothing {
34 | events.collect { value -> action(value) }
35 | }
36 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/events/TrackEvent.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.events
18 |
19 | import io.livekit.android.room.track.Track
20 |
21 | sealed class TrackEvent(val track: Track) : Event() {
22 | class VisibilityChanged(track: Track, val isVisible: Boolean) : TrackEvent(track)
23 | class VideoDimensionsChanged(track: Track, val newDimensions: Track.Dimensions) : TrackEvent(track)
24 | class StreamStateChanged(track: Track, val streamState: Track.StreamState) : TrackEvent(track)
25 | }
26 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/events/TrackPublicationEvent.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.events
18 |
19 | import io.livekit.android.room.track.TrackPublication
20 | import io.livekit.android.room.types.TranscriptionSegment
21 |
22 | sealed class TrackPublicationEvent(val publication: TrackPublication) : Event() {
23 | class TranscriptionReceived(
24 | /**
25 | * The applicable track publication these transcriptions apply to.
26 | */
27 | publication: TrackPublication,
28 | /**
29 | * The transcription segments.
30 | */
31 | val transcriptions: List,
32 | ) : TrackPublicationEvent(publication)
33 | }
34 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/memory/SurfaceTextureHelperCloser.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.memory
18 |
19 | import livekit.org.webrtc.SurfaceTextureHelper
20 | import java.io.Closeable
21 |
22 | internal class SurfaceTextureHelperCloser(private val surfaceTextureHelper: SurfaceTextureHelper?) : Closeable {
23 | private var isClosed = false
24 | override fun close() {
25 | if (!isClosed) {
26 | isClosed = true
27 | surfaceTextureHelper?.stopListening()
28 | surfaceTextureHelper?.dispose()
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/ConnectionState.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room
18 |
19 | enum class ConnectionState {
20 | CONNECTING,
21 | CONNECTED,
22 | DISCONNECTED,
23 | RECONNECTING,
24 | RESUMING,
25 | }
26 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/IceCandidateJSON.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room
18 |
19 | import kotlinx.serialization.Serializable
20 |
21 | @Serializable
22 | internal data class IceCandidateJSON(val candidate: String, val sdpMLineIndex: Int, val sdpMid: String?)
23 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/datastream/StreamException.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.datastream
18 |
19 | sealed class StreamException(message: String? = null) : Exception(message) {
20 | class AlreadyOpenedException : StreamException()
21 | class AbnormalEndException(message: String?) : StreamException(message)
22 | class DecodeFailedException : StreamException()
23 | class LengthExceededException : StreamException()
24 | class IncompleteException : StreamException()
25 | class TerminatedException : StreamException()
26 | class UnknownStreamException : StreamException()
27 | class NotDirectoryException : StreamException()
28 | class FileInfoUnavailableException : StreamException()
29 | }
30 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/datastream/incoming/ByteStreamReceiver.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.datastream.incoming
18 |
19 | import io.livekit.android.room.datastream.ByteStreamInfo
20 | import kotlinx.coroutines.channels.Channel
21 | import kotlinx.coroutines.flow.Flow
22 | import kotlinx.coroutines.flow.receiveAsFlow
23 |
24 | class ByteStreamReceiver(
25 | val info: ByteStreamInfo,
26 | channel: Channel,
27 | ) : BaseStreamReceiver(channel) {
28 | override val flow: Flow = channel.receiveAsFlow()
29 | }
30 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/datastream/incoming/TextStreamReceiver.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.datastream.incoming
18 |
19 | import io.livekit.android.room.datastream.TextStreamInfo
20 | import kotlinx.coroutines.channels.Channel
21 | import kotlinx.coroutines.flow.Flow
22 | import kotlinx.coroutines.flow.map
23 | import kotlinx.coroutines.flow.receiveAsFlow
24 |
25 | class TextStreamReceiver(
26 | val info: TextStreamInfo,
27 | source: Channel,
28 | ) : BaseStreamReceiver(source) {
29 | override val flow: Flow = source.receiveAsFlow()
30 | .map { bytes -> bytes.toString(Charsets.UTF_8) }
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/participant/PublishUtils.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.participant
18 |
19 | internal fun String.mimeTypeToVideoCodec(): String? {
20 | return split("/")
21 | .takeIf { length > 1 }
22 | ?.get(1)
23 | ?.lowercase()
24 | }
25 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/track/DataPublishReliability.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.track
18 |
19 | enum class DataPublishReliability {
20 | RELIABLE,
21 | LOSSY,
22 | }
23 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalAudioTrackOptions.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.track
18 |
19 | data class LocalAudioTrackOptions(
20 | val noiseSuppression: Boolean = true,
21 | val echoCancellation: Boolean = true,
22 | val autoGainControl: Boolean = true,
23 | val highPassFilter: Boolean = true,
24 | val typingNoiseDetection: Boolean = true,
25 | )
26 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/track/screencapture/ScreenCaptureParams.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.track.screencapture
18 |
19 | import android.app.Notification
20 | import android.content.Intent
21 |
22 | class ScreenCaptureParams(
23 | val mediaProjectionPermissionResultData: Intent,
24 | val notificationId: Int? = null,
25 | val notification: Notification? = null,
26 | val onStop: (() -> Unit)? = null
27 | )
28 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/track/video/ScalabilityMode.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.track.video
18 |
19 | data class ScalabilityMode(val spatial: Int, val temporal: Int, val suffix: String) {
20 | companion object {
21 | private val REGEX = """L(\d)T(\d)(h|_KEY|_KEY_SHIFT)?""".toRegex()
22 | fun parseFromString(mode: String): ScalabilityMode {
23 | val match = REGEX.matchEntire(mode) ?: throw IllegalArgumentException("can't parse scalability mode: $mode")
24 | val (spatial, temporal, suffix) = match.destructured
25 |
26 | return ScalabilityMode(spatial.toInt(), temporal.toInt(), suffix)
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/room/util/MediaConstraintKeys.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.util
18 |
19 | import livekit.org.webrtc.MediaConstraints
20 |
21 | object MediaConstraintKeys {
22 | const val OFFER_TO_RECV_AUDIO = "OfferToReceiveAudio"
23 | const val OFFER_TO_RECV_VIDEO = "OfferToReceiveVideo"
24 | const val ICE_RESTART = "IceRestart"
25 |
26 | const val FALSE = "false"
27 | const val TRUE = "true"
28 | }
29 |
30 | fun MediaConstraints.findConstraint(key: String): String? {
31 | return mandatory.firstOrNull { it.key == key }?.value
32 | ?: optional.firstOrNull { it.key == key }?.value
33 | }
34 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/stats/ClientInfo.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.stats
18 |
19 | import android.os.Build
20 | import io.livekit.android.BuildConfig
21 | import io.livekit.android.room.SignalClient
22 | import livekit.LivekitModels
23 |
24 | internal fun getClientInfo() = with(LivekitModels.ClientInfo.newBuilder()) {
25 | sdk = LivekitModels.ClientInfo.SDK.ANDROID
26 | version = BuildConfig.VERSION_NAME
27 | os = SignalClient.SDK_TYPE
28 | osVersion = Build.VERSION.RELEASE ?: ""
29 |
30 | val vendor = Build.MANUFACTURER ?: ""
31 | val model = Build.MODEL ?: ""
32 | deviceModel = ("$vendor $model").trim()
33 | build()
34 | }
35 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/CloseableCoroutineScope.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import kotlinx.coroutines.CoroutineScope
20 | import kotlinx.coroutines.cancel
21 | import java.io.Closeable
22 | import kotlin.coroutines.CoroutineContext
23 |
24 | internal class CloseableCoroutineScope(context: CoroutineContext) : Closeable, CoroutineScope {
25 | override val coroutineContext: CoroutineContext = context
26 |
27 | override fun close() {
28 | coroutineContext.cancel()
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/CoroutineUtil.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import kotlinx.coroutines.*
20 |
21 | internal fun debounce(
22 | waitMs: Long = 300L,
23 | coroutineScope: CoroutineScope,
24 | destinationFunction: suspend (T) -> R,
25 | ): (T) -> Unit {
26 | var debounceJob: Deferred? = null
27 | return { param: T ->
28 | debounceJob?.cancel()
29 | debounceJob = coroutineScope.async {
30 | delay(waitMs)
31 | return@async destinationFunction(param)
32 | }
33 | }
34 | }
35 |
36 | internal fun ((Unit) -> R).invoke() {
37 | this.invoke(Unit)
38 | }
39 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/Either.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | /**
20 | * @suppress
21 | */
22 | sealed class Either {
23 | class Left(val value: A) : Either()
24 | class Right(val value: B) : Either()
25 | }
26 |
27 | internal fun Either?.nullSafe(): Either {
28 | return this ?: Either.Right("null")
29 | }
30 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/LoggingLevel.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import android.util.Log
20 |
21 | enum class LoggingLevel {
22 | VERBOSE,
23 | DEBUG,
24 | INFO,
25 | WARN,
26 | ERROR,
27 | WTF,
28 | OFF,
29 | ;
30 |
31 | fun toAndroidLogPriority(): Int {
32 | return when (this) {
33 | VERBOSE -> Log.VERBOSE
34 | INFO -> Log.INFO
35 | DEBUG -> Log.DEBUG
36 | WARN -> Log.WARN
37 | ERROR -> Log.ERROR
38 | WTF -> Log.ERROR
39 | OFF -> 0
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/MapDiffUtil.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | fun diffMapChange(newMap: Map, oldMap: Map, defaultValue: V): MutableMap {
20 | val allKeys = newMap.keys + oldMap.keys
21 | val diff = mutableMapOf()
22 |
23 | for (key in allKeys) {
24 | if (newMap[key] != oldMap[key]) {
25 | diff[key] = newMap[key] ?: defaultValue
26 | }
27 | }
28 |
29 | return diff
30 | }
31 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/MessageLiteExt.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import com.google.protobuf.MessageLite
20 | import okio.ByteString
21 | import okio.ByteString.Companion.toByteString
22 |
23 | fun MessageLite.toOkioByteString(): ByteString {
24 | val byteArray = toByteArray()
25 | return byteArray.toByteString(0, byteArray.size)
26 | }
27 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/MutexEx.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import kotlinx.coroutines.sync.Mutex
20 | import kotlinx.coroutines.sync.withLock
21 |
22 | /**
23 | * Applies a double-checked lock before running [action].
24 | */
25 | suspend inline fun Mutex.withCheckLock(check: () -> Unit, action: () -> T): T {
26 | check()
27 | return withLock {
28 | check()
29 | action()
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/util/UrlUtils.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | fun String.toWebsocketUrl(): String {
20 | if (startsWith("http")) {
21 | return replaceFirst("http", "ws")
22 | }
23 | return this
24 | }
25 |
26 | fun String.toHttpUrl(): String {
27 | if (startsWith("ws")) {
28 | return replaceFirst("ws", "http")
29 | }
30 | return this
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-sdk/src/main/java/io/livekit/android/webrtc/SessionDescriptionExt.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.webrtc
18 |
19 | import livekit.LivekitRtc
20 | import livekit.org.webrtc.SessionDescription
21 |
22 | internal fun SessionDescription.toProtoSessionDescription(): LivekitRtc.SessionDescription {
23 | val sdBuilder = LivekitRtc.SessionDescription.newBuilder()
24 | sdBuilder.sdp = description
25 | sdBuilder.type = type.canonicalForm()
26 |
27 | return sdBuilder.build()
28 | }
29 |
--------------------------------------------------------------------------------
/livekit-android-test/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/livekit-android-test/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/livekit-android-test/consumer-rules.pro
--------------------------------------------------------------------------------
/livekit-android-test/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=LiveKit Client Android Mocks for Testing
2 | POM_ARTIFACT_ID=livekit-android-test
3 | POM_PACKAGING=aar
4 |
--------------------------------------------------------------------------------
/livekit-android-test/module.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/livekit-android-test/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/livekit-android-test/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/assert/Asserts.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.assert
18 |
19 | import org.junit.Assert
20 |
21 | fun assertIsClass(expectedClass: Class<*>, actual: Any?) {
22 | val klazz = if (actual == null) {
23 | Nothing::class.java
24 | } else {
25 | actual::class.java
26 | }
27 |
28 | Assert.assertEquals(expectedClass, klazz)
29 | }
30 |
31 | fun assertIsClassList(expectedClasses: List>, actual: List<*>) {
32 | val klazzes = actual.map {
33 | if (it == null) {
34 | Nothing::class.java
35 | } else {
36 | it::class.java
37 | }
38 | }
39 |
40 | Assert.assertEquals(expectedClasses, klazzes)
41 | }
42 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/coroutines/EventListenableExt.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.coroutines
18 |
19 | import io.livekit.android.coroutines.takeUntilSignal
20 | import kotlinx.coroutines.flow.Flow
21 | import kotlinx.coroutines.flow.fold
22 |
23 | /**
24 | * Collect all items until signal is given.
25 | */
26 | suspend fun Flow.toListUntilSignal(signal: Flow): List {
27 | return takeUntilSignal(signal)
28 | .fold(emptyList()) { list, event ->
29 | list.plus(event)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/events/EventCollector.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.events
18 |
19 | import io.livekit.android.events.Event
20 | import io.livekit.android.events.EventListenable
21 | import kotlinx.coroutines.CoroutineScope
22 |
23 | class EventCollector(
24 | eventListenable: EventListenable,
25 | coroutineScope: CoroutineScope,
26 | ) : FlowCollector(eventListenable.events, coroutineScope)
27 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockAudioDeviceModule.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import livekit.org.webrtc.audio.AudioDeviceModule
20 |
21 | class MockAudioDeviceModule : AudioDeviceModule {
22 | override fun getNativeAudioDeviceModulePointer(): Long {
23 | return 1
24 | }
25 |
26 | override fun release() {
27 | }
28 |
29 | override fun setSpeakerMute(muted: Boolean) {
30 | }
31 |
32 | override fun setMicrophoneMute(muted: Boolean) {
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockAudioSource.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import livekit.org.webrtc.AudioSource
20 |
21 | class MockAudioSource : AudioSource(100L)
22 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockLKObjects.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import io.livekit.android.room.provisions.LKObjects
20 | import livekit.org.webrtc.audio.AudioDeviceModule
21 |
22 | object MockLKObjects {
23 | fun get(): LKObjects {
24 | return LKObjects(
25 | eglBaseProvider = { MockEglBase() },
26 | audioDeviceModuleProvider = {
27 | object : AudioDeviceModule {
28 | override fun getNativeAudioDeviceModulePointer(): Long = 1
29 |
30 | override fun release() {}
31 |
32 | override fun setSpeakerMute(p0: Boolean) {}
33 |
34 | override fun setMicrophoneMute(p0: Boolean) {}
35 | }
36 | },
37 | )
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockNetworkCallbackRegistry.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import android.net.ConnectivityManager.NetworkCallback
20 | import android.net.NetworkRequest
21 | import io.livekit.android.room.network.NetworkCallbackRegistry
22 |
23 | class MockNetworkCallbackRegistry : NetworkCallbackRegistry {
24 | val networkCallbacks = mutableSetOf()
25 | override fun registerNetworkCallback(networkRequest: NetworkRequest, networkCallback: NetworkCallback) {
26 | networkCallbacks.add(networkCallback)
27 | }
28 |
29 | override fun unregisterNetworkCallback(networkCallback: NetworkCallback) {
30 | networkCallbacks.remove(networkCallback)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockRtpReceiver.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2025 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import livekit.org.webrtc.RtpReceiver
20 | import org.mockito.Mockito
21 | import org.mockito.kotlin.whenever
22 |
23 | object MockRtpReceiver {
24 | fun create(id: String = "receiver_id"): RtpReceiver {
25 | return Mockito.mock(RtpReceiver::class.java).apply {
26 | whenever(this.id()).thenReturn(id)
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockVideoCapturer.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import android.content.Context
20 | import livekit.org.webrtc.CapturerObserver
21 | import livekit.org.webrtc.SurfaceTextureHelper
22 | import livekit.org.webrtc.VideoCapturer
23 |
24 | class MockVideoCapturer : VideoCapturer {
25 | override fun initialize(p0: SurfaceTextureHelper?, p1: Context?, p2: CapturerObserver?) {
26 | }
27 |
28 | override fun startCapture(p0: Int, p1: Int, p2: Int) {
29 | }
30 |
31 | override fun stopCapture() {
32 | }
33 |
34 | override fun changeCaptureFormat(p0: Int, p1: Int, p2: Int) {
35 | }
36 |
37 | override fun dispose() {
38 | }
39 |
40 | override fun isScreencast(): Boolean {
41 | return false
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/MockVideoSource.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock
18 |
19 | import livekit.org.webrtc.VideoSource
20 |
21 | class MockVideoSource(nativeSource: Long = 100) : VideoSource(nativeSource)
22 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/dagger/TestAudioHandlerModule.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock.dagger
18 |
19 | import dagger.Binds
20 | import dagger.Module
21 | import io.livekit.android.audio.AudioHandler
22 | import io.livekit.android.audio.CommunicationWorkaround
23 | import io.livekit.android.audio.NoAudioHandler
24 | import io.livekit.android.audio.NoopCommunicationWorkaround
25 |
26 | @Module
27 | interface TestAudioHandlerModule {
28 | @Binds
29 | fun audioHandler(audioHandler: NoAudioHandler): AudioHandler
30 |
31 | @Binds
32 | fun communicationWorkaround(communicationWorkaround: NoopCommunicationWorkaround): CommunicationWorkaround
33 | }
34 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/mock/room/util/MockConnectionWarmer.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.mock.room.util
18 |
19 | import io.livekit.android.room.util.ConnectionWarmer
20 | import okhttp3.Response
21 |
22 | class MockConnectionWarmer : ConnectionWarmer {
23 | override suspend fun fetch(url: String): Response {
24 | return Response.Builder().code(200).build()
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/util/ByteString.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.util
18 |
19 | import com.google.protobuf.ByteString
20 | import livekit.LivekitRtc
21 | import okio.ByteString.Companion.toByteString
22 |
23 | fun com.google.protobuf.ByteString.toOkioByteString() = toByteArray().toByteString()
24 |
25 | fun okio.ByteString.toPBByteString() = ByteString.copyFrom(toByteArray())
26 |
27 | fun okio.ByteString.toSignalRequest() = LivekitRtc.SignalRequest.newBuilder()
28 | .mergeFrom(toPBByteString())
29 | .build()
30 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/io/livekit/android/test/util/DataChannelBufferExt.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.test.util
18 |
19 | import com.google.protobuf.MessageLite
20 | import livekit.org.webrtc.DataChannel
21 | import java.nio.ByteBuffer
22 |
23 | fun MessageLite.toDataChannelBuffer() =
24 | DataChannel.Buffer(
25 | ByteBuffer.wrap(toByteArray()),
26 | true,
27 | )
28 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/livekit/org/webrtc/NativeLibraryLoaderTestHelper.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package livekit.org.webrtc
18 |
19 | object NativeLibraryLoaderTestHelper {
20 | fun initialize() {
21 | if (!NativeLibrary.isLoaded()) {
22 | NativeLibrary.initialize({ true }, "")
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/livekit-android-test/src/main/java/livekit/org/webrtc/WebRTCInitializer.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package livekit.org.webrtc
18 |
19 | import android.content.Context
20 | import org.mockito.Mockito
21 |
22 | object WebRTCInitializer {
23 | fun initialize(context: Context = Mockito.mock(Context::class.java)) {
24 | try {
25 | ContextUtils.initialize(context)
26 | NativeLibraryLoaderTestHelper.initialize()
27 | } catch (e: Throwable) {
28 | // do nothing. this is expected.
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/livekit-android-test/src/test/java/io/livekit/android/room/RTCEngineTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room
18 |
19 | class RTCEngineTest
20 |
--------------------------------------------------------------------------------
/livekit-android-test/src/test/java/io/livekit/android/room/participant/ParticipantTrackPermissionTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.participant
18 |
19 | import org.junit.Test
20 |
21 | class ParticipantTrackPermissionTest {
22 | @Test(expected = IllegalArgumentException::class)
23 | fun requireSidOrIdentity() {
24 | ParticipantTrackPermission(
25 | participantIdentity = null,
26 | participantSid = null,
27 | )
28 | }
29 |
30 | @Test
31 | fun sidConstructionDoesntThrow() {
32 | ParticipantTrackPermission(
33 | participantSid = "sid",
34 | )
35 | }
36 |
37 | @Test
38 | fun identyConstructionDoesntThrow() {
39 | ParticipantTrackPermission(
40 | participantIdentity = "identity",
41 | )
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/livekit-android-test/src/test/java/io/livekit/android/room/track/video/ScalabilityModeTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.track.video
18 |
19 | import org.junit.Assert.assertEquals
20 | import org.junit.Test
21 |
22 | class ScalabilityModeTest {
23 |
24 | @Test
25 | fun testL1T3() {
26 | val mode = ScalabilityMode.parseFromString("L1T3")
27 |
28 | assertEquals(1, mode.spatial)
29 | assertEquals(3, mode.temporal)
30 | assertEquals("", mode.suffix)
31 | }
32 |
33 | @Test
34 | fun testL3T3_KEY() {
35 | val mode = ScalabilityMode.parseFromString("L3T3_KEY")
36 |
37 | assertEquals(3, mode.spatial)
38 | assertEquals(3, mode.temporal)
39 | assertEquals("_KEY", mode.suffix)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/livekit-android-test/src/test/java/io/livekit/android/room/util/EncodingUtilsTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.room.util
18 |
19 | class EncodingUtilsTest
20 |
--------------------------------------------------------------------------------
/livekit-android-test/src/test/java/io/livekit/android/util/LKLogTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.util
18 |
19 | import io.livekit.android.LiveKit
20 | import org.junit.Assert.assertFalse
21 | import org.junit.Assert.assertTrue
22 | import org.junit.Test
23 |
24 | class LKLogTest {
25 |
26 | @Test
27 | fun log() {
28 | var called = false
29 | LiveKit.loggingLevel = LoggingLevel.INFO
30 | LKLog.log(LoggingLevel.ERROR) { called = true }
31 | assertTrue(called)
32 | }
33 |
34 | @Test
35 | fun noLog() {
36 | var called = false
37 | LiveKit.loggingLevel = LoggingLevel.OFF
38 | LKLog.log(LoggingLevel.VERBOSE) { called = true }
39 | assertFalse(called)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/livekit-android-track-processors/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/livekit-android-track-processors/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/livekit-android-track-processors/consumer-rules.pro
--------------------------------------------------------------------------------
/livekit-android-track-processors/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=Track Processors for LiveKit Android SDK
2 | POM_ARTIFACT_ID=livekit-android-track-processors
3 | POM_PACKAGING=aar
4 |
--------------------------------------------------------------------------------
/livekit-android-track-processors/module.md:
--------------------------------------------------------------------------------
1 | # Module livekit-android-track-processors
2 |
3 | Track processors for LiveKit Android SDK.
4 |
--------------------------------------------------------------------------------
/livekit-android-track-processors/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/livekit-android-track-processors/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/livekit-lint/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/livekit-lint/src/main/java/io/livekit/lint/IssueRegistry.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.lint
2 |
3 | import com.android.tools.lint.client.api.IssueRegistry
4 | import com.android.tools.lint.client.api.Vendor
5 | import com.android.tools.lint.detector.api.CURRENT_API
6 | import com.android.tools.lint.detector.api.Issue
7 | import com.google.auto.service.AutoService
8 |
9 | @Suppress("UnstableApiUsage", "unused")
10 | @AutoService(value = [IssueRegistry::class])
11 | class IssueRegistry : IssueRegistry() {
12 |
13 | override val api: Int = CURRENT_API
14 |
15 | override val vendor: Vendor = Vendor(
16 | vendorName = "LiveKit",
17 | identifier = "io.livekit.android",
18 | feedbackUrl = "https://github.com/livekit/client-sdk-android",
19 | )
20 |
21 | override val issues: List
22 | get() = listOf(MediaTrackEqualsDetector.ISSUE, FlowDelegateUsageDetector.ISSUE)
23 | }
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client-sdk-android",
3 | "version": "2.16.0",
4 | "repository": "https://github.com/livekit/client-sdk-android.git",
5 | "license": "Apache License 2.0",
6 | "private": true,
7 | "devDependencies": {
8 | "@changesets/cli": "^2.27.7",
9 | "@livekit/changesets-changelog-github": "^0.0.4"
10 | },
11 | "scripts": {
12 | "changeset": "changeset",
13 | "ci:publish": "changeset publish",
14 | "ci:version": "changeset version && ./ci/update_android_gradle_version.sh"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/release-instructions.md:
--------------------------------------------------------------------------------
1 | # Releasing
2 |
3 | 1. In the top-level gradle.properties file, update the `VERSION_NAME` property. This will usually just be removing the `-SNAPSHOT` suffix.
4 | 1. Commit and push changes.
5 | 1. Tag the release: `git tag v[VERSION_NAME]`. Make sure there is a `v` prefix at the front of the tag. This indicates to the CI that this is a release tag.
6 | 1. Push tags: `git push --tags`
7 | 1. Confirm that the `publish` github action is completed successfully.
8 | 1. Add a new GitHub release with change logs.
9 | 1. Prepare the version for the next release by bumping the `VERSION_NAME` property and adding the `-SNAPSHOT` suffix.
10 | 1. Additionally update the version names in README.md.
11 |
--------------------------------------------------------------------------------
/sample-app-basic/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/sample-app-basic/README.md:
--------------------------------------------------------------------------------
1 | # Sample-app-basic
2 |
3 | A quickstart app showing how to:
4 |
5 | 1. Connect to a room.
6 | 2. Publish your device's audio/video.
7 | 3. Display a remote participant's video.
8 |
9 | This app only handles the video of one remote participant. For a more fully featured video
10 | conferencing app, check out the other sample apps in this repo.
11 |
--------------------------------------------------------------------------------
/sample-app-basic/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/sample-app-basic/src/androidTest/java/io/livekit/android/sample/basic/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.basic
2 |
3 | import androidx.test.ext.junit.runners.AndroidJUnit4
4 | import androidx.test.platform.app.InstrumentationRegistry
5 | import org.junit.Assert.*
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | /**
10 | * Instrumented test, which will execute on an Android device.
11 | *
12 | * See [testing documentation](http://d.android.com/tools/testing).
13 | */
14 | @RunWith(AndroidJUnit4::class)
15 | class ExampleInstrumentedTest {
16 | @Test
17 | fun useAppContext() {
18 | // Context of the app under test.
19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
20 | assertEquals("io.livekit.android.sample.basic", appContext.packageName)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
20 |
21 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-basic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | sample-app-basic
3 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/sample-app-basic/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | example.com
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/sample-app-basic/src/test/java/io/livekit/android/sample/basic/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.basic
2 |
3 | import org.junit.Assert.*
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/sample-app-common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/sample-app-common/README.md:
--------------------------------------------------------------------------------
1 | # sample-app-common
2 |
3 | Contains code common to `sample-app` and `sample-app-compose`.
4 |
--------------------------------------------------------------------------------
/sample-app-common/consumer-rules.pro:
--------------------------------------------------------------------------------
1 | # LeakCanary
2 | #######################
3 | -keep class androidx.appcompat.view.WindowCallbackWrapper { *; }
4 | -keep class android.support.v7.view.WindowCallbackWrapper { *; }
--------------------------------------------------------------------------------
/sample-app-common/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/sample-app-common/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
17 |
20 |
21 |
22 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/java/io/livekit/android/sample/model/StressTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.sample.model
18 |
19 | import android.os.Parcelable
20 | import kotlinx.parcelize.Parcelize
21 |
22 | sealed class StressTest : Parcelable {
23 |
24 | @Parcelize
25 | data class SwitchRoom(
26 | val firstToken: String,
27 | val secondToken: String,
28 | ) : StressTest()
29 |
30 | @Parcelize
31 | object None : StressTest()
32 | }
33 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/java/io/livekit/android/sample/util/LiveDataExt.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.util
2 |
3 | import androidx.lifecycle.LiveData
4 | import androidx.lifecycle.MutableLiveData
5 |
6 | fun MutableLiveData.hide(): LiveData = this
7 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/account_cancel.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/account_cancel_outline.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/baseline_cast_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/baseline_cast_connected_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/baseline_chat_24.xml:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/dots_horizontal_circle_outline.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/ic_baseline_cancel_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/ic_logo_dark.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
18 |
21 |
24 |
27 |
30 |
33 |
34 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/outline_flip_camera_android_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
13 |
16 |
17 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/outline_mic_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/outline_mic_off_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/outline_videocam_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/outline_videocam_off_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/volume_up_48px.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/wifi_strength_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/wifi_strength_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/wifi_strength_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/wifi_strength_4.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/drawable/wifi_strength_alert_outline.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #007DFF
4 | #0058b3
5 | #66b1ff
6 | #5A8BFF
7 | #00153C
8 |
9 |
--------------------------------------------------------------------------------
/sample-app-common/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | example.com
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/sample-app-compose/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/sample-app-compose/README.md:
--------------------------------------------------------------------------------
1 | # sample-app-compose
2 |
3 | A sample video conferencing app for LiveKit made using Jetpack Compose.
4 |
--------------------------------------------------------------------------------
/sample-app-compose/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/sample-app-compose/src/androidTest/java/io/livekit/android/composesample/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample
2 |
3 | import androidx.test.ext.junit.runners.AndroidJUnit4
4 | import androidx.test.platform.app.InstrumentationRegistry
5 | import org.junit.Assert.*
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | /**
10 | * Instrumented test, which will execute on an Android device.
11 | *
12 | * See [testing documentation](http://d.android.com/tools/testing).
13 | */
14 | @RunWith(AndroidJUnit4::class)
15 | class ExampleInstrumentedTest {
16 | @Test
17 | fun useAppContext() {
18 | // Context of the app under test.
19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
20 | assertEquals("io.livekit.android.composesample", appContext.packageName)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
15 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/java/io/livekit/android/composesample/SampleApplication.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2023-2024 LiveKit, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package io.livekit.android.composesample
18 |
19 | import android.app.Application
20 | import io.livekit.android.LiveKit
21 | import io.livekit.android.util.LoggingLevel
22 |
23 | class SampleApplication : Application() {
24 |
25 | override fun onCreate() {
26 | super.onCreate()
27 | LiveKit.loggingLevel = LoggingLevel.VERBOSE
28 | // LiveKit.enableWebRTCLogging = true
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/java/io/livekit/android/composesample/ViewModelLazyExt.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample
2 |
3 | import androidx.activity.viewModels
4 | import androidx.fragment.app.FragmentActivity
5 | import androidx.lifecycle.ViewModel
6 | import androidx.lifecycle.ViewModelProvider
7 |
8 | typealias CreateViewModel = () -> VM
9 |
10 | inline fun FragmentActivity.viewModelByFactory(
11 | noinline create: CreateViewModel
12 | ): Lazy {
13 | return viewModels {
14 | createViewModelFactoryFactory(create)
15 | }
16 | }
17 |
18 | fun createViewModelFactoryFactory(
19 | create: CreateViewModel
20 | ): ViewModelProvider.Factory {
21 | return object : ViewModelProvider.Factory {
22 | override fun create(modelClass: Class): T {
23 | @Suppress("UNCHECKED_CAST")
24 | return create() as? T
25 | ?: throw IllegalArgumentException("Unknown viewmodel class!")
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/java/io/livekit/android/composesample/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.ui.graphics.Color
4 |
5 | val BlueMain = Color(0xFF007DFF)
6 | val BlueDark = Color(0xFF0058B3)
7 | val BlueLight = Color(0xFF66B1FF)
8 | val NoVideoIconTint = Color(0xFF5A8BFF)
9 | val NoVideoBackground = Color(0xFF00153C)
10 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/java/io/livekit/android/composesample/ui/theme/Shape.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.foundation.shape.RoundedCornerShape
4 | import androidx.compose.material.Shapes
5 | import androidx.compose.ui.unit.dp
6 |
7 | val Shapes = Shapes(
8 | small = RoundedCornerShape(4.dp),
9 | medium = RoundedCornerShape(4.dp),
10 | large = RoundedCornerShape(0.dp)
11 | )
12 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/java/io/livekit/android/composesample/ui/theme/Type.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.material.Typography
4 | import androidx.compose.ui.text.TextStyle
5 | import androidx.compose.ui.text.font.FontFamily
6 | import androidx.compose.ui.text.font.FontWeight
7 | import androidx.compose.ui.unit.sp
8 |
9 | // Set of Material typography styles to start with
10 | val Typography = Typography(
11 | body1 = TextStyle(
12 | fontFamily = FontFamily.Default,
13 | fontWeight = FontWeight.Normal,
14 | fontSize = 16.sp
15 | )
16 | /* Other default text styles to override
17 | button = TextStyle(
18 | fontFamily = FontFamily.Default,
19 | fontWeight = FontWeight.W500,
20 | fontSize = 14.sp
21 | ),
22 | caption = TextStyle(
23 | fontFamily = FontFamily.Default,
24 | fontWeight = FontWeight.Normal,
25 | fontSize = 12.sp
26 | )
27 | */
28 | )
29 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-compose/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Livekit Compose Sample
3 |
--------------------------------------------------------------------------------
/sample-app-compose/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/sample-app-compose/src/test/java/io/livekit/android/composesample/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample
2 |
3 | import org.junit.Assert.*
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/sample-app-record-local/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/sample-app-record-local/README.md:
--------------------------------------------------------------------------------
1 | # sample-app-record-local
2 |
3 | An example showing how to save the local device's audio and video tracks.
4 |
5 | While connected to a Room, this app will save a video from your microphone and camera. Audio samples
6 | and video frames are passed into a `VideoFileRenderer` object, where they are then encoded using
7 | `android.media.MediaCodec`and saved using a `android.media.MediaMuxer` into a video file.
8 |
9 | Videos are saved to the app's external files directory (
10 | normally `/sdcard/Android/data/io.livekit.android.sample.record/files/Movies`).
11 |
--------------------------------------------------------------------------------
/sample-app-record-local/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/sample-app-record-local/src/androidTest/java/io/livekit/android/sample/record/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record
2 |
3 | import androidx.test.ext.junit.runners.AndroidJUnit4
4 | import androidx.test.platform.app.InstrumentationRegistry
5 | import org.junit.Assert.*
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | /**
10 | * Instrumented test, which will execute on an Android device.
11 | *
12 | * See [testing documentation](http://d.android.com/tools/testing).
13 | */
14 | @RunWith(AndroidJUnit4::class)
15 | class ExampleInstrumentedTest {
16 | @Test
17 | fun useAppContext() {
18 | // Context of the app under test.
19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
20 | assertEquals("io.livekit.android.sample.record", appContext.packageName)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/java/io/livekit/android/sample/record/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record.ui.theme
2 |
3 | import androidx.compose.ui.graphics.Color
4 |
5 | val Purple200 = Color(0xFFBB86FC)
6 | val Purple500 = Color(0xFF6200EE)
7 | val Purple700 = Color(0xFF3700B3)
8 | val Teal200 = Color(0xFF03DAC5)
9 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/java/io/livekit/android/sample/record/ui/theme/Shape.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record.ui.theme
2 |
3 | import androidx.compose.foundation.shape.RoundedCornerShape
4 | import androidx.compose.material.Shapes
5 | import androidx.compose.ui.unit.dp
6 |
7 | val Shapes = Shapes(
8 | small = RoundedCornerShape(4.dp),
9 | medium = RoundedCornerShape(4.dp),
10 | large = RoundedCornerShape(0.dp)
11 | )
12 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/java/io/livekit/android/sample/record/ui/theme/Theme.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record.ui.theme
2 |
3 | import androidx.compose.foundation.isSystemInDarkTheme
4 | import androidx.compose.material.MaterialTheme
5 | import androidx.compose.material.darkColors
6 | import androidx.compose.material.lightColors
7 | import androidx.compose.runtime.Composable
8 |
9 | private val DarkColorPalette = darkColors(
10 | primary = Purple200,
11 | primaryVariant = Purple700,
12 | secondary = Teal200
13 | )
14 |
15 | private val LightColorPalette = lightColors(
16 | primary = Purple500,
17 | primaryVariant = Purple700,
18 | secondary = Teal200
19 |
20 | /* Other default colors to override
21 | background = Color.White,
22 | surface = Color.White,
23 | onPrimary = Color.White,
24 | onSecondary = Color.Black,
25 | onBackground = Color.Black,
26 | onSurface = Color.Black,
27 | */
28 | )
29 |
30 | @Composable
31 | fun LivekitandroidTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
32 | val colors = if (darkTheme) {
33 | DarkColorPalette
34 | } else {
35 | LightColorPalette
36 | }
37 |
38 | MaterialTheme(
39 | colors = colors,
40 | typography = Typography,
41 | shapes = Shapes,
42 | content = content
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/java/io/livekit/android/sample/record/ui/theme/Type.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record.ui.theme
2 |
3 | import androidx.compose.material.Typography
4 | import androidx.compose.ui.text.TextStyle
5 | import androidx.compose.ui.text.font.FontFamily
6 | import androidx.compose.ui.text.font.FontWeight
7 | import androidx.compose.ui.unit.sp
8 |
9 | // Set of Material typography styles to start with
10 | val Typography = Typography(
11 | body1 = TextStyle(
12 | fontFamily = FontFamily.Default,
13 | fontWeight = FontWeight.Normal,
14 | fontSize = 16.sp
15 | )
16 | /* Other default text styles to override
17 | button = TextStyle(
18 | fontFamily = FontFamily.Default,
19 | fontWeight = FontWeight.W500,
20 | fontSize = 14.sp
21 | ),
22 | caption = TextStyle(
23 | fontFamily = FontFamily.Default,
24 | fontWeight = FontWeight.Normal,
25 | fontSize = 12.sp
26 | )
27 | */
28 | )
29 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app-record-local/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | sample-app-record-local
3 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/sample-app-record-local/src/test/java/io/livekit/android/sample/record/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.record
2 |
3 | import org.junit.Assert.*
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/sample-app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/sample-app/README.md:
--------------------------------------------------------------------------------
1 | # sample-app
2 |
3 | A sample video conferencing app for LiveKit.
4 |
--------------------------------------------------------------------------------
/sample-app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/sample-app/src/androidTest/java/io/livekit/android/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android
2 |
3 | import androidx.test.ext.junit.runners.AndroidJUnit4
4 | import androidx.test.platform.app.InstrumentationRegistry
5 | import org.junit.Assert.*
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | /**
10 | * Instrumented test, which will execute on an Android device.
11 | *
12 | * See [testing documentation](http://d.android.com/tools/testing).
13 | */
14 | @RunWith(AndroidJUnit4::class)
15 | class ExampleInstrumentedTest {
16 | @Test
17 | fun useAppContext() {
18 | // Context of the app under test.
19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
20 | assertEquals("io.livekit.android", appContext.packageName)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/sample-app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
13 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/sample-app/src/main/java/io/livekit/android/sample/SampleApplication.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample
2 |
3 | import android.app.Application
4 | import io.livekit.android.LiveKit
5 | import io.livekit.android.util.LoggingLevel
6 |
7 | class SampleApplication : Application() {
8 |
9 | override fun onCreate() {
10 | super.onCreate()
11 | LiveKit.loggingLevel = LoggingLevel.VERBOSE
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/sample-app/src/main/java/io/livekit/android/sample/ViewModelLazyExt.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample
2 |
3 | import androidx.activity.viewModels
4 | import androidx.fragment.app.FragmentActivity
5 | import androidx.lifecycle.ViewModel
6 | import androidx.lifecycle.ViewModelProvider
7 |
8 | typealias CreateViewModel = () -> VM
9 |
10 | inline fun FragmentActivity.viewModelByFactory(
11 | noinline create: CreateViewModel
12 | ): Lazy {
13 | return viewModels {
14 | createViewModelFactoryFactory(create)
15 | }
16 | }
17 |
18 | fun createViewModelFactoryFactory(
19 | create: CreateViewModel
20 | ): ViewModelProvider.Factory {
21 | return object : ViewModelProvider.Factory {
22 | override fun create(modelClass: Class): T {
23 | @Suppress("UNCHECKED_CAST")
24 | return create() as? T
25 | ?: throw IllegalArgumentException("Unknown viewmodel class!")
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/sample-app/src/main/java/io/livekit/android/sample/dialog/DebugMenuDialog.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.dialog
2 |
3 | import android.R
4 | import android.app.Activity
5 | import android.app.AlertDialog
6 | import android.widget.ArrayAdapter
7 | import io.livekit.android.sample.CallViewModel
8 |
9 | fun Activity.showDebugMenuDialog(callViewModel: CallViewModel) {
10 | val builder = with(AlertDialog.Builder(this)) {
11 | setTitle("Debug Menu")
12 |
13 | val arrayAdapter = ArrayAdapter(this@showDebugMenuDialog, R.layout.select_dialog_item)
14 | arrayAdapter.add("Simulate Migration")
15 | arrayAdapter.add("Reconnect to Room")
16 | setAdapter(arrayAdapter) { dialog, index ->
17 | when (index) {
18 | 0 -> callViewModel.simulateMigration()
19 | 1 -> callViewModel.reconnect()
20 | }
21 | dialog.dismiss()
22 | }
23 | }
24 | builder.show()
25 | }
26 |
--------------------------------------------------------------------------------
/sample-app/src/main/java/io/livekit/android/sample/dialog/SelectAudioDeviceDialog.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.sample.dialog
2 |
3 | import android.R
4 | import android.app.Activity
5 | import android.app.AlertDialog
6 | import android.widget.ArrayAdapter
7 | import io.livekit.android.sample.CallViewModel
8 |
9 | fun Activity.showSelectAudioDeviceDialog(callViewModel: CallViewModel) {
10 | val builder = with(AlertDialog.Builder(this)) {
11 | setTitle("Select Audio Device")
12 |
13 | val audioHandler = callViewModel.audioHandler
14 | val audioDevices = audioHandler.availableAudioDevices
15 | val arrayAdapter = ArrayAdapter(this@showSelectAudioDeviceDialog, R.layout.select_dialog_item)
16 | arrayAdapter.addAll(audioDevices.map { it.name })
17 | setAdapter(arrayAdapter) { dialog, index ->
18 | audioHandler.selectDevice(audioDevices[index])
19 | dialog.dismiss()
20 | }
21 | }
22 | builder.show()
23 | }
24 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/drawable/speaker_indicator.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/layout/dialog_button.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/sample-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/sample-app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 40dp
4 | 4dp
5 | 4dp
6 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | livekit-android
3 | Connect
4 | Token
5 | E2EE Key
6 | Enable E2EE
7 | URL
8 | Save Values
9 | Reset Values
10 |
11 |
--------------------------------------------------------------------------------
/sample-app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/sample-app/src/test/java/io/livekit/android/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android
2 |
3 | import org.junit.Assert.*
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google {
4 | content {
5 | includeGroupByRegex("com\\.android.*")
6 | includeGroupByRegex("com\\.google.*")
7 | includeGroupByRegex("androidx.*")
8 | }
9 | }
10 | mavenCentral()
11 | gradlePluginPortal()
12 | }
13 | }
14 | dependencyResolutionManagement {
15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
16 | repositories {
17 | google()
18 | mavenCentral()
19 | maven { url 'https://jitpack.io' }
20 | }
21 | }
22 | include ':sample-app', ':sample-app-compose', ':livekit-android-sdk'
23 | rootProject.name = 'livekit-android'
24 | include ':sample-app-common'
25 | include ':livekit-lint'
26 | include ':video-encode-decode-test'
27 | include ':sample-app-basic'
28 | include ':sample-app-record-local'
29 | include ':examples:virtual-background'
30 | include ':livekit-android-test'
31 | include ':livekit-android-camerax'
32 | include ':examples:screenshare-audio'
33 | include ':livekit-android-track-processors'
34 |
--------------------------------------------------------------------------------
/video-encode-decode-test/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/video-encode-decode-test/README.md:
--------------------------------------------------------------------------------
1 | # video-encode-decode-test
2 |
3 | Tests for checking various video codec capabilities in simulcast.
4 |
--------------------------------------------------------------------------------
/video-encode-decode-test/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/RandomString.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode
2 |
3 | fun randomAlphanumericString(length: Int): String {
4 | val builder = StringBuilder(length)
5 | for (i in 0 until length) {
6 | val value = (0..61).random()
7 | builder.append(value.toAlphaNumeric())
8 | }
9 | return builder.toString()
10 | }
11 |
12 | fun Int.toAlphaNumeric(): Char {
13 | if (this < 0 || this > 62) {
14 | throw IllegalArgumentException()
15 | }
16 |
17 | var offset = this
18 | if (offset < 10) {
19 | return '0' + offset
20 | }
21 |
22 | offset -= 10
23 | if (offset < 26) {
24 | return 'a' + offset
25 | }
26 | offset -= 26
27 | if (offset < 26) {
28 | return 'A' + offset
29 | }
30 | throw IllegalArgumentException()
31 | }
32 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/control/H264DefaultVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.control
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class H264DefaultVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = true,
19 | codecWhiteList = listOf("H264")
20 | )
21 | )
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/control/NoWhitelistDefaultVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.control
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class NoWhitelistDefaultVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = true
19 | )
20 | )
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/control/VP8DefaultVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.control
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class VP8DefaultVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = true,
19 | codecWhiteList = listOf("VP8")
20 | )
21 | )
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/test/H264SimulcastVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.test
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class H264SimulcastVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = false,
19 | codecWhiteList = listOf("H264")
20 | )
21 | )
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/test/NoWhitelistSimulcastVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.test
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class NoWhitelistSimulcastVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = false
19 | )
20 | )
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/androidTest/java/io/livekit/android/videoencodedecode/test/test/VP8DefaultVideoTest.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode.test.test
2 |
3 | import android.content.Intent
4 | import androidx.compose.ui.test.junit4.ComposeTestRule
5 | import io.livekit.android.videoencodedecode.CallActivity
6 | import io.livekit.android.videoencodedecode.VideoTest
7 | import io.livekit.android.videoencodedecode.createAndroidIntentComposeRule
8 |
9 | class VP8DefaultVideoTest : VideoTest() {
10 | override val composeTestRule: ComposeTestRule = createAndroidIntentComposeRule { context ->
11 | Intent(context, CallActivity::class.java).apply {
12 | putExtra(
13 | CallActivity.KEY_ARGS,
14 | CallActivity.BundleArgs(
15 | SERVER_URL,
16 | token1,
17 | token2,
18 | useDefaultVideoEncoderFactory = false,
19 | codecWhiteList = listOf("VP8")
20 | )
21 | )
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/ConnectionItem.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.runtime.collectAsState
5 | import androidx.compose.runtime.getValue
6 | import io.livekit.android.room.Room
7 | import io.livekit.android.room.participant.Participant
8 |
9 | /**
10 | * Widget for showing the other participant in a connection.
11 | */
12 | @Composable
13 | fun ConnectionItem(viewModel: CallViewModel) {
14 | val room by viewModel.room.collectAsState()
15 | val participants by viewModel.participants.collectAsState(initial = emptyList())
16 | if (room != null) {
17 | RoomItem(room = room!!, participants)
18 | }
19 | }
20 |
21 | @Composable
22 | fun RoomItem(room: Room, participants: List) {
23 | val remoteParticipant = participants.filterNot { it == room.localParticipant }.firstOrNull()
24 | if (remoteParticipant != null) {
25 | ParticipantItem(room = room, participant = remoteParticipant, isSpeaking = false)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/SampleApplication.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode
2 |
3 | import android.app.Application
4 | import io.livekit.android.LiveKit
5 | import io.livekit.android.util.LoggingLevel
6 |
7 | class SampleApplication : Application() {
8 |
9 | override fun onCreate() {
10 | super.onCreate()
11 | LiveKit.loggingLevel = LoggingLevel.VERBOSE
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/ViewModelLazyExt.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode
2 |
3 | import androidx.activity.viewModels
4 | import androidx.fragment.app.FragmentActivity
5 | import androidx.lifecycle.ViewModel
6 | import androidx.lifecycle.ViewModelProvider
7 |
8 | typealias CreateViewModel = () -> VM
9 |
10 | inline fun FragmentActivity.viewModelByFactory(
11 | noinline create: CreateViewModel
12 | ): Lazy {
13 | return viewModels {
14 | createViewModelFactoryFactory(create)
15 | }
16 | }
17 |
18 | fun createViewModelFactoryFactory(
19 | create: CreateViewModel
20 | ): ViewModelProvider.Factory {
21 | return object : ViewModelProvider.Factory {
22 | override fun create(modelClass: Class): T {
23 | @Suppress("UNCHECKED_CAST")
24 | return create() as? T
25 | ?: throw IllegalArgumentException("Unknown viewmodel class!")
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/WhitelistEncoderFactory.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.videoencodedecode
2 |
3 | interface WhitelistEncoderFactory {
4 | var codecWhitelist: List?
5 | }
6 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.ui.graphics.Color
4 |
5 | val BlueMain = Color(0xFF007DFF)
6 | val BlueDark = Color(0xFF0058B3)
7 | val BlueLight = Color(0xFF66B1FF)
8 | val NoVideoIconTint = Color(0xFF5A8BFF)
9 | val NoVideoBackground = Color(0xFF00153C)
10 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/ui/theme/Shape.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.foundation.shape.RoundedCornerShape
4 | import androidx.compose.material.Shapes
5 | import androidx.compose.ui.unit.dp
6 |
7 | val Shapes = Shapes(
8 | small = RoundedCornerShape(4.dp),
9 | medium = RoundedCornerShape(4.dp),
10 | large = RoundedCornerShape(0.dp)
11 | )
12 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/java/io/livekit/android/videoencodedecode/ui/theme/Type.kt:
--------------------------------------------------------------------------------
1 | package io.livekit.android.composesample.ui.theme
2 |
3 | import androidx.compose.material.Typography
4 | import androidx.compose.ui.text.TextStyle
5 | import androidx.compose.ui.text.font.FontFamily
6 | import androidx.compose.ui.text.font.FontWeight
7 | import androidx.compose.ui.unit.sp
8 |
9 | // Set of Material typography styles to start with
10 | val Typography = Typography(
11 | body1 = TextStyle(
12 | fontFamily = FontFamily.Default,
13 | fontWeight = FontWeight.Normal,
14 | fontSize = 16.sp
15 | )
16 | /* Other default text styles to override
17 | button = TextStyle(
18 | fontFamily = FontFamily.Default,
19 | fontWeight = FontWeight.W500,
20 | fontSize = 14.sp
21 | ),
22 | caption = TextStyle(
23 | fontFamily = FontFamily.Default,
24 | fontWeight = FontWeight.Normal,
25 | fontSize = 12.sp
26 | )
27 | */
28 | )
29 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/livekit/client-sdk-android/5291759f77c7d38eee38eec5753ee4a27e034de8/video-encode-decode-test/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Video Encode Decode Tester
3 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/video-encode-decode-test/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | example.com
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------