davidliu
Committed by GitHub

use protobuf-javalite library (#63)

@@ -18,7 +18,7 @@ buildscript { @@ -18,7 +18,7 @@ buildscript {
18 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 18 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
19 classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" 19 classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
20 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version" 20 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
21 - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.15' 21 + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
22 classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0" 22 classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0"
23 // NOTE: Do not place your application dependencies here; they belong 23 // NOTE: Do not place your application dependencies here; they belong
24 // in the individual module build.gradle files 24 // in the individual module build.gradle files
@@ -61,7 +61,7 @@ ext { @@ -61,7 +61,7 @@ ext {
61 junitJupiter : "5.5.0", 61 junitJupiter : "5.5.0",
62 coroutines : "1.6.0", 62 coroutines : "1.6.0",
63 lint : "30.0.1", 63 lint : "30.0.1",
64 - protobuf : "3.15.1", 64 + protobuf : "3.19.4",
65 ] 65 ]
66 generated = [ 66 generated = [
67 protoSrc: "$projectDir/protocol", 67 protoSrc: "$projectDir/protocol",
@@ -62,6 +62,7 @@ protobuf { @@ -62,6 +62,7 @@ protobuf {
62 all().each { task -> 62 all().each { task ->
63 task.builtins { 63 task.builtins {
64 java { 64 java {
  65 + option "lite"
65 } 66 }
66 } 67 }
67 } 68 }
@@ -108,8 +109,7 @@ dependencies { @@ -108,8 +109,7 @@ dependencies {
108 api "com.squareup.okhttp3:okhttp:4.9.1" 109 api "com.squareup.okhttp3:okhttp:4.9.1"
109 implementation "androidx.annotation:annotation:1.3.0" 110 implementation "androidx.annotation:annotation:1.3.0"
110 implementation "androidx.core:core:${versions.androidx_core}" 111 implementation "androidx.core:core:${versions.androidx_core}"
111 - implementation "com.google.protobuf:protobuf-java:${versions.protobuf}"  
112 - implementation "com.google.protobuf:protobuf-java-util:${versions.protobuf}" 112 + implementation "com.google.protobuf:protobuf-javalite:${versions.protobuf}"
113 implementation "androidx.compose.ui:ui:$compose_version" 113 implementation "androidx.compose.ui:ui:$compose_version"
114 114
115 implementation 'com.google.dagger:dagger:2.38' 115 implementation 'com.google.dagger:dagger:2.38'
@@ -42,3 +42,5 @@ @@ -42,3 +42,5 @@
42 -keepclasseswithmembers class io.livekit.android.** { # <-- change package name to your app's 42 -keepclasseswithmembers class io.livekit.android.** { # <-- change package name to your app's
43 kotlinx.serialization.KSerializer serializer(...); 43 kotlinx.serialization.KSerializer serializer(...);
44 } 44 }
  45 +
  46 +-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
@@ -22,8 +22,6 @@ object InjectionNames { @@ -22,8 +22,6 @@ object InjectionNames {
22 */ 22 */
23 internal const val DISPATCHER_UNCONFINED = "dispatcher_unconfined" 23 internal const val DISPATCHER_UNCONFINED = "dispatcher_unconfined"
24 24
25 - internal const val SIGNAL_JSON_ENABLED = "signal_json_enabled"  
26 -  
27 internal const val OPTIONS_VIDEO_HW_ACCEL = "options_video_hw_accel" 25 internal const val OPTIONS_VIDEO_HW_ACCEL = "options_video_hw_accel"
28 26
29 // Overrides 27 // Overrides
1 package io.livekit.android.dagger 1 package io.livekit.android.dagger
2 2
3 -import com.google.protobuf.util.JsonFormat  
4 import dagger.Module 3 import dagger.Module
5 import dagger.Provides 4 import dagger.Provides
6 import dagger.Reusable 5 import dagger.Reusable
7 import kotlinx.serialization.json.Json 6 import kotlinx.serialization.json.Json
8 -import javax.inject.Named  
9 7
10 @Module 8 @Module
11 object JsonFormatModule { 9 object JsonFormatModule {
12 @Provides 10 @Provides
13 - fun protobufJsonFormatParser(): JsonFormat.Parser {  
14 - return JsonFormat.parser()  
15 - }  
16 -  
17 - @Provides  
18 - fun protobufJsonFormatPrinter(): JsonFormat.Printer {  
19 - return JsonFormat.printer()  
20 - }  
21 -  
22 - @Provides  
23 @Reusable 11 @Reusable
24 fun kotlinSerializationJson(): Json = 12 fun kotlinSerializationJson(): Json =
25 Json { 13 Json {
26 ignoreUnknownKeys = true 14 ignoreUnknownKeys = true
27 } 15 }
28 16
29 - @Provides  
30 - @Named(InjectionNames.SIGNAL_JSON_ENABLED)  
31 - fun signalJsonEnabled(): Boolean = false  
32 } 17 }
1 package io.livekit.android.dagger 1 package io.livekit.android.dagger
2 2
3 import android.content.Context 3 import android.content.Context
  4 +import androidx.annotation.Nullable
4 import dagger.BindsInstance 5 import dagger.BindsInstance
5 import dagger.Component 6 import dagger.Component
6 import io.livekit.android.room.Room 7 import io.livekit.android.room.Room
7 import okhttp3.OkHttpClient 8 import okhttp3.OkHttpClient
8 import org.webrtc.EglBase 9 import org.webrtc.EglBase
9 import org.webrtc.PeerConnectionFactory 10 import org.webrtc.PeerConnectionFactory
10 -import javax.annotation.Nullable  
11 import javax.inject.Named 11 import javax.inject.Named
12 import javax.inject.Singleton 12 import javax.inject.Singleton
13 13
1 package io.livekit.android.dagger 1 package io.livekit.android.dagger
2 2
  3 +import androidx.annotation.Nullable
3 import dagger.Module 4 import dagger.Module
4 import dagger.Provides 5 import dagger.Provides
5 import okhttp3.OkHttpClient 6 import okhttp3.OkHttpClient
6 import okhttp3.WebSocket 7 import okhttp3.WebSocket
7 -import javax.annotation.Nullable  
8 import javax.inject.Named 8 import javax.inject.Named
9 import javax.inject.Singleton 9 import javax.inject.Singleton
10 10
1 package io.livekit.android.room 1 package io.livekit.android.room
2 2
3 import android.os.SystemClock 3 import android.os.SystemClock
  4 +import com.google.protobuf.ByteString
4 import io.livekit.android.ConnectOptions 5 import io.livekit.android.ConnectOptions
5 import io.livekit.android.dagger.InjectionNames 6 import io.livekit.android.dagger.InjectionNames
6 import io.livekit.android.room.participant.ParticipantTrackPermission 7 import io.livekit.android.room.participant.ParticipantTrackPermission
@@ -682,7 +683,7 @@ internal constructor( @@ -682,7 +683,7 @@ internal constructor(
682 if (buffer == null) { 683 if (buffer == null) {
683 return 684 return
684 } 685 }
685 - val dp = LivekitModels.DataPacket.parseFrom(buffer.data) 686 + val dp = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffer.data))
686 when (dp.valueCase) { 687 when (dp.valueCase) {
687 LivekitModels.DataPacket.ValueCase.SPEAKER -> { 688 LivekitModels.DataPacket.ValueCase.SPEAKER -> {
688 listener?.onActiveSpeakersUpdate(dp.speaker.speakersList) 689 listener?.onActiveSpeakersUpdate(dp.speaker.speakersList)
1 package io.livekit.android.room 1 package io.livekit.android.room
2 2
3 -import com.google.protobuf.util.JsonFormat  
4 import com.vdurmont.semver4j.Semver 3 import com.vdurmont.semver4j.Semver
5 import io.livekit.android.ConnectOptions 4 import io.livekit.android.ConnectOptions
6 import io.livekit.android.dagger.InjectionNames 5 import io.livekit.android.dagger.InjectionNames
@@ -38,12 +37,8 @@ class SignalClient @@ -38,12 +37,8 @@ class SignalClient
38 @Inject 37 @Inject
39 constructor( 38 constructor(
40 private val websocketFactory: WebSocket.Factory, 39 private val websocketFactory: WebSocket.Factory,
41 - private val fromJsonProtobuf: JsonFormat.Parser,  
42 - private val toJsonProtobuf: JsonFormat.Printer,  
43 private val json: Json, 40 private val json: Json,
44 private val okHttpClient: OkHttpClient, 41 private val okHttpClient: OkHttpClient,
45 - @Named(InjectionNames.SIGNAL_JSON_ENABLED)  
46 - private val useJson: Boolean,  
47 @Named(InjectionNames.DISPATCHER_IO) 42 @Named(InjectionNames.DISPATCHER_IO)
48 private val ioDispatcher: CoroutineDispatcher, 43 private val ioDispatcher: CoroutineDispatcher,
49 ) : WebSocketListener() { 44 ) : WebSocketListener() {
@@ -197,11 +192,7 @@ constructor( @@ -197,11 +192,7 @@ constructor(
197 } 192 }
198 193
199 override fun onMessage(webSocket: WebSocket, text: String) { 194 override fun onMessage(webSocket: WebSocket, text: String) {
200 - val signalResponseBuilder = LivekitRtc.SignalResponse.newBuilder()  
201 - fromJsonProtobuf.merge(text, signalResponseBuilder)  
202 - val response = signalResponseBuilder.build()  
203 -  
204 - handleSignalResponse(response) 195 + LKLog.w { "received JSON message, unsupported in this version." }
205 } 196 }
206 197
207 override fun onMessage(webSocket: WebSocket, bytes: ByteString) { 198 override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
@@ -444,14 +435,8 @@ constructor( @@ -444,14 +435,8 @@ constructor(
444 LKLog.w { "not connected, could not send request $request" } 435 LKLog.w { "not connected, could not send request $request" }
445 return 436 return
446 } 437 }
447 - val sent: Boolean  
448 - if (useJson) {  
449 - val message = toJsonProtobuf.print(request)  
450 - sent = currentWs?.send(message) ?: false  
451 - } else {  
452 val message = request.toByteArray().toByteString() 438 val message = request.toByteArray().toByteString()
453 - sent = currentWs?.send(message) ?: false  
454 - } 439 + val sent = currentWs?.send(message) ?: false
455 440
456 if (!sent) { 441 if (!sent) {
457 LKLog.e { "error sending request: $request" } 442 LKLog.e { "error sending request: $request" }
@@ -463,7 +448,7 @@ constructor( @@ -463,7 +448,7 @@ constructor(
463 448
464 if (!isConnected) { 449 if (!isConnected) {
465 // Only handle joins if not connected. 450 // Only handle joins if not connected.
466 - if (response.hasJoin()) { 451 + if (response.join != null) {
467 isConnected = true 452 isConnected = true
468 startRequestQueue() 453 startRequestQueue()
469 try { 454 try {
@@ -473,7 +458,7 @@ constructor( @@ -473,7 +458,7 @@ constructor(
473 } 458 }
474 joinContinuation?.resumeWith(Result.success(Either.Left(response.join))) 459 joinContinuation?.resumeWith(Result.success(Either.Left(response.join)))
475 } else { 460 } else {
476 - LKLog.e { "Received response while not connected. ${toJsonProtobuf.print(response)}" } 461 + LKLog.e { "Received response while not connected. $response" }
477 } 462 }
478 return 463 return
479 } 464 }
1 package io.livekit.android.room 1 package io.livekit.android.room
2 2
3 -import com.google.protobuf.util.JsonFormat  
4 import io.livekit.android.BaseTest 3 import io.livekit.android.BaseTest
5 import io.livekit.android.mock.MockWebSocketFactory 4 import io.livekit.android.mock.MockWebSocketFactory
6 import io.livekit.android.mock.TestData 5 import io.livekit.android.mock.TestData
@@ -38,10 +37,7 @@ class SignalClientTest : BaseTest() { @@ -38,10 +37,7 @@ class SignalClientTest : BaseTest() {
38 wsFactory = MockWebSocketFactory() 37 wsFactory = MockWebSocketFactory()
39 client = SignalClient( 38 client = SignalClient(
40 wsFactory, 39 wsFactory,
41 - JsonFormat.parser(),  
42 - JsonFormat.printer(),  
43 Json, 40 Json,
44 - useJson = false,  
45 okHttpClient = okHttpClient, 41 okHttpClient = okHttpClient,
46 ioDispatcher = coroutineRule.dispatcher 42 ioDispatcher = coroutineRule.dispatcher
47 ) 43 )
@@ -221,8 +217,8 @@ class SignalClientTest : BaseTest() { @@ -221,8 +217,8 @@ class SignalClientTest : BaseTest() {
221 const val EXAMPLE_URL = "ws://www.example.com" 217 const val EXAMPLE_URL = "ws://www.example.com"
222 218
223 val JOIN = with(LivekitRtc.SignalResponse.newBuilder()) { 219 val JOIN = with(LivekitRtc.SignalResponse.newBuilder()) {
224 - join = with(joinBuilder) {  
225 - room = with(roomBuilder) { 220 + join = with(LivekitRtc.JoinResponse.newBuilder()) {
  221 + room = with(LivekitModels.Room.newBuilder()) {
226 name = "roomname" 222 name = "roomname"
227 sid = "room_sid" 223 sid = "room_sid"
228 build() 224 build()
@@ -236,7 +232,7 @@ class SignalClientTest : BaseTest() { @@ -236,7 +232,7 @@ class SignalClientTest : BaseTest() {
236 } 232 }
237 233
238 val OFFER = with(LivekitRtc.SignalResponse.newBuilder()) { 234 val OFFER = with(LivekitRtc.SignalResponse.newBuilder()) {
239 - offer = with(offerBuilder) { 235 + offer = with(LivekitRtc.SessionDescription.newBuilder()) {
240 sdp = "remote_offer" 236 sdp = "remote_offer"
241 type = "offer" 237 type = "offer"
242 build() 238 build()
@@ -245,8 +241,8 @@ class SignalClientTest : BaseTest() { @@ -245,8 +241,8 @@ class SignalClientTest : BaseTest() {
245 } 241 }
246 242
247 val ROOM_UPDATE = with(LivekitRtc.SignalResponse.newBuilder()) { 243 val ROOM_UPDATE = with(LivekitRtc.SignalResponse.newBuilder()) {
248 - roomUpdate = with(roomUpdateBuilder) {  
249 - room = with(roomBuilder) { 244 + roomUpdate = with(LivekitRtc.RoomUpdate.newBuilder()) {
  245 + room = with(LivekitModels.Room.newBuilder()) {
250 metadata = "metadata" 246 metadata = "metadata"
251 build() 247 build()
252 } 248 }
@@ -256,7 +252,7 @@ class SignalClientTest : BaseTest() { @@ -256,7 +252,7 @@ class SignalClientTest : BaseTest() {
256 } 252 }
257 253
258 val LOCAL_TRACK_PUBLISHED = with(LivekitRtc.SignalResponse.newBuilder()) { 254 val LOCAL_TRACK_PUBLISHED = with(LivekitRtc.SignalResponse.newBuilder()) {
259 - trackPublished = with(trackPublishedBuilder) { 255 + trackPublished = with(LivekitRtc.TrackPublishedResponse.newBuilder()) {
260 cid = "local_cid" 256 cid = "local_cid"
261 track = TestData.LOCAL_AUDIO_TRACK 257 track = TestData.LOCAL_AUDIO_TRACK
262 build() 258 build()
@@ -306,7 +302,7 @@ class SignalClientTest : BaseTest() { @@ -306,7 +302,7 @@ class SignalClientTest : BaseTest() {
306 302
307 303
308 val CONNECTION_QUALITY = with(LivekitRtc.SignalResponse.newBuilder()) { 304 val CONNECTION_QUALITY = with(LivekitRtc.SignalResponse.newBuilder()) {
309 - connectionQuality = with(connectionQualityBuilder) { 305 + connectionQuality = with(LivekitRtc.ConnectionQualityUpdate.newBuilder()) {
310 addUpdates(with(LivekitRtc.ConnectionQualityInfo.newBuilder()) { 306 addUpdates(with(LivekitRtc.ConnectionQualityInfo.newBuilder()) {
311 participantSid = JOIN.join.participant.sid 307 participantSid = JOIN.join.participant.sid
312 quality = LivekitModels.ConnectionQuality.EXCELLENT 308 quality = LivekitModels.ConnectionQuality.EXCELLENT
@@ -345,7 +341,7 @@ class SignalClientTest : BaseTest() { @@ -345,7 +341,7 @@ class SignalClientTest : BaseTest() {
345 build() 341 build()
346 } 342 }
347 val LEAVE = with(LivekitRtc.SignalResponse.newBuilder()) { 343 val LEAVE = with(LivekitRtc.SignalResponse.newBuilder()) {
348 - leave = with(leaveBuilder) { 344 + leave = with(LivekitRtc.LeaveRequest.newBuilder()) {
349 build() 345 build()
350 } 346 }
351 build() 347 build()
@@ -40,7 +40,7 @@ dependencies { @@ -40,7 +40,7 @@ dependencies {
40 api "androidx.lifecycle:lifecycle-runtime-ktx:${versions.androidx_lifecycle}" 40 api "androidx.lifecycle:lifecycle-runtime-ktx:${versions.androidx_lifecycle}"
41 api "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.androidx_lifecycle}" 41 api "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.androidx_lifecycle}"
42 api "androidx.lifecycle:lifecycle-common-java8:${versions.androidx_lifecycle}" 42 api "androidx.lifecycle:lifecycle-common-java8:${versions.androidx_lifecycle}"
43 - api "com.google.protobuf:protobuf-java:${versions.protobuf}" 43 + api "com.google.protobuf:protobuf-javalite:${versions.protobuf}"
44 api project(":livekit-android-sdk") 44 api project(":livekit-android-sdk")
45 implementation 'androidx.preference:preference-ktx:1.1.1' 45 implementation 'androidx.preference:preference-ktx:1.1.1'
46 // debugImplementation because LeakCanary should only run in debug builds. 46 // debugImplementation because LeakCanary should only run in debug builds.