├── .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 | 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 | 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 | 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 | 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 | 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 |