From e5c073cebdb6e9c97ee85de064a64b8c137abdd7 Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 14:51:54 +0200 Subject: [PATCH 1/8] Update gradle versions to be on par with the client --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33576f24..bfa81ed4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ mockito = "5.8.0" mockito-kotlin = "5.2.1" moshi = "1.15.1" okhttp3 = "4.12.0" -plugin-android = "8.2.2" +plugin-android = "8.10.0" retrofit = "2.11.0" room = "2.6.1" slf4j-api = "2.0.12" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37a6725d..026384a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From e43797d6bc8d9aaab69b898901b732050d01075e Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 14:54:01 +0200 Subject: [PATCH 2/8] Remove unnecessary kapt plugin in tidalapi --- tidalapi/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/tidalapi/build.gradle.kts b/tidalapi/build.gradle.kts index 319adeaf..312bc3d3 100644 --- a/tidalapi/build.gradle.kts +++ b/tidalapi/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.tidal.android.library) - alias(libs.plugins.kotlin.kapt) alias(libs.plugins.android.junit5) alias(libs.plugins.kotlin.plugin.serialization) } From 50f52d246bfb3a482f6849ee0f39cfd91cb0f5ca Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 14:55:06 +0200 Subject: [PATCH 3/8] Fix demo app inclusion :common doesn't have one, that becomes an issue when including the sdk code into the client --- settings.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 688c11d6..49e67c9f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,10 @@ include("bom") fun includeFromDefaultHierarchy(sdkModuleName: String) { include(sdkModuleName) - include("$sdkModuleName:apps:demo") + val demoDir = file("$sdkModuleName/apps/demo") + if (demoDir.exists() && demoDir.isDirectory) { + include("$sdkModuleName:apps:demo") + } } includeFromDefaultHierarchy("player") From ad8381bbd7fe21d6a6341d5294dad6ce54cff646 Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 15:43:14 +0200 Subject: [PATCH 4/8] Replace outdated TikXML with SimpleXML in eventproducer --- eventproducer/build.gradle.kts | 11 ++++------ .../sdk/eventproducer/di/ConvertersModule.kt | 8 +++---- .../sdk/eventproducer/di/NetworkModule.kt | 4 ++-- .../service/SendMessageBatchResponse.kt | 21 +++++++++++-------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/eventproducer/build.gradle.kts b/eventproducer/build.gradle.kts index 77df14b8..bde47294 100644 --- a/eventproducer/build.gradle.kts +++ b/eventproducer/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.tidal.android.library) - alias(libs.plugins.kotlin.kapt) alias(libs.plugins.google.devtools.ksp) alias(libs.plugins.android.junit5) } @@ -22,15 +21,13 @@ dependencies { implementation(libs.room.runtime) implementation(libs.moshi) implementation(libs.okhttp.loggingInterceptor) - implementation(libs.tickaroo.annotation) - implementation(libs.tickaroo.core) - implementation(libs.tickaroo.retrofitConverter) implementation(libs.truetime) + implementation(libs.retrofit.converter.simplexml) + ksp(libs.dagger.compiler) - kapt(libs.room.compiler) - kapt(libs.tickaroo.processor) - kapt(libs.moshi.codegen) + ksp(libs.room.compiler) + ksp(libs.moshi.codegen) testImplementation(libs.test.assertk) testImplementation(libs.test.mockk) diff --git a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/ConvertersModule.kt b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/ConvertersModule.kt index 1479c603..8efe23f9 100644 --- a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/ConvertersModule.kt +++ b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/ConvertersModule.kt @@ -1,19 +1,19 @@ package com.tidal.sdk.eventproducer.di import com.squareup.moshi.Moshi -import com.tickaroo.tikxml.TikXml -import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory import dagger.Module import dagger.Provides import javax.inject.Singleton +import retrofit2.Converter +import retrofit2.converter.simplexml.SimpleXmlConverterFactory @Module internal class ConvertersModule { @Provides @Singleton - fun provideXmlConverter(): TikXmlConverterFactory { - return TikXmlConverterFactory.create(TikXml.Builder().exceptionOnUnreadXml(false).build()) + fun provideXmlConverter(): Converter.Factory { + return SimpleXmlConverterFactory.createNonStrict() } @Provides @Singleton fun provideMoshi(): Moshi = Moshi.Builder().build() diff --git a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/NetworkModule.kt b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/NetworkModule.kt index 91ab9208..4e5d47e2 100644 --- a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/NetworkModule.kt +++ b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/di/NetworkModule.kt @@ -1,12 +1,12 @@ package com.tidal.sdk.eventproducer.di -import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory import com.tidal.sdk.eventproducer.network.service.SqsService import dagger.Module import dagger.Provides import java.net.URI import javax.inject.Singleton import okhttp3.OkHttpClient +import retrofit2.Converter import retrofit2.Retrofit @Module @@ -17,7 +17,7 @@ internal class NetworkModule { fun provideSqsService( tlConsumerUri: URI, okhttpClient: OkHttpClient, - xmlConverter: TikXmlConverterFactory, + xmlConverter: Converter.Factory, ): SqsService { val retrofit = Retrofit.Builder() diff --git a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/network/service/SendMessageBatchResponse.kt b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/network/service/SendMessageBatchResponse.kt index 2d302fa7..7af89427 100644 --- a/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/network/service/SendMessageBatchResponse.kt +++ b/eventproducer/src/main/kotlin/com/tidal/sdk/eventproducer/network/service/SendMessageBatchResponse.kt @@ -1,16 +1,19 @@ package com.tidal.sdk.eventproducer.network.service -import com.tickaroo.tikxml.annotation.Element -import com.tickaroo.tikxml.annotation.PropertyElement -import com.tickaroo.tikxml.annotation.Xml +import org.simpleframework.xml.Element +import org.simpleframework.xml.ElementList +import org.simpleframework.xml.Root -@Xml(name = "SendMessageBatchResponse") -internal data class SendMessageBatchResponse(@Element val result: SendMessageBatchResult) +@Root(name = "SendMessageBatchResponse", strict = false) +internal data class SendMessageBatchResponse( + @field:Element(name = "SendMessageBatchResult") var result: SendMessageBatchResult? = null +) -@Xml(name = "SendMessageBatchResult") +@Root(name = "SendMessageBatchResult", strict = false) internal data class SendMessageBatchResult( - @Element val successfullySentEntries: List? + @field:ElementList(inline = true, entry = "SendMessageBatchResultEntry", required = false) + var successfullySentEntries: List? = null ) -@Xml(name = "SendMessageBatchResultEntry") -internal data class SendMessageBatchResultEntry(@PropertyElement(name = "Id") val id: String) +@Root(name = "SendMessageBatchResultEntry", strict = false) +internal data class SendMessageBatchResultEntry(@field:Element(name = "Id") var id: String = "") From 1abbdd48a64738a7b68c5af5ae2fd8a6a92e9bd9 Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 15:43:46 +0200 Subject: [PATCH 5/8] Remove kapt from the project --- build.gradle.kts | 1 - gradle/libs.versions.toml | 9 +-------- template/apps/demo/build.gradle.kts | 1 - template/build.gradle.kts | 1 - tidalapi/apps/demo/build.gradle.kts | 1 - 5 files changed, 1 insertion(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 21070093..89d3d58c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,6 @@ plugins { alias(libs.plugins.tidal.android.application) apply false alias(libs.plugins.tidal.android.library) apply false alias(libs.plugins.tidal.kotlin.jvm) apply false - alias(libs.plugins.kotlin.kapt) apply false alias(libs.plugins.tidal.jvm.platform) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bfa81ed4..25733e1b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,6 @@ plugin-android = "8.10.0" retrofit = "2.11.0" room = "2.6.1" slf4j-api = "2.0.12" -tickaroo = "0.8.13" tidal-androidx-media = "1.5.0.1" [libraries] @@ -69,6 +68,7 @@ okhttp-loggingInterceptor = { module = "com.squareup.okhttp3:logging-interceptor okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp3" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } +retrofit-converter-simplexml = { module = "com.squareup.retrofit2:converter-simplexml", version.ref = "retrofit" } # Room room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } @@ -102,12 +102,6 @@ test-mockito-android = { module = "org.mockito:mockito-android", version.ref = " test-mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockito-kotlin" } test-turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } -#Tickaroo -tickaroo-annotation = { module = "com.tickaroo.tikxml:annotation", version.ref = "tickaroo" } -tickaroo-core = { module = "com.tickaroo.tikxml:core", version.ref = "tickaroo" } -tickaroo-processor = { module = "com.tickaroo.tikxml:processor", version.ref = "tickaroo" } -tickaroo-retrofitConverter = { module = "com.tickaroo.tikxml:retrofit-converter", version.ref = "tickaroo" } - tidal-exoPlayer-core = { module = "com.tidal.androidx.media3:media3-exoplayer", version.ref = "tidal-androidx-media" } tidal-exoPlayer-dash = { module = "com.tidal.androidx.media3:media3-exoplayer-dash", version.ref = "tidal-androidx-media" } tidal-exoPlayer-hls = { module = "com.tidal.androidx.media3:media3-exoplayer-hls", version.ref = "tidal-androidx-media" } @@ -130,7 +124,6 @@ android-junit5 = { id = "de.mannodermaus.android-junit5", version = "1.10.0.0" } google-devtools-ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.20" } gradle-maven-publish = { id = "com.vanniktech.maven.publish", version = "0.28.0" } kotlin-dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } tidal-android-application = { id = "com.tidal-sdk.android.application" } tidal-android-library = { id = "com.tidal-sdk.android.library" } diff --git a/template/apps/demo/build.gradle.kts b/template/apps/demo/build.gradle.kts index 05268f26..a12525af 100644 --- a/template/apps/demo/build.gradle.kts +++ b/template/apps/demo/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.tidal.android.application) - alias(libs.plugins.kotlin.kapt) } android { diff --git a/template/build.gradle.kts b/template/build.gradle.kts index 0cce7fc0..02245434 100644 --- a/template/build.gradle.kts +++ b/template/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.tidal.android.library) - alias(libs.plugins.kotlin.kapt) alias(libs.plugins.android.junit5) } diff --git a/tidalapi/apps/demo/build.gradle.kts b/tidalapi/apps/demo/build.gradle.kts index 76bee41f..ebf5d327 100644 --- a/tidalapi/apps/demo/build.gradle.kts +++ b/tidalapi/apps/demo/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.tidal.android.application) - alias(libs.plugins.kotlin.kapt) } android { From b7d5a4b6d43bea8b2620cf117f2b08cceded256d Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Thu, 2 Oct 2025 16:02:12 +0200 Subject: [PATCH 6/8] Test firebender fix --- auth/build.gradle.kts | 9 +++------ .../com/tidal/sdk/plugins/ConfiguresKotlinCompiler.kt | 5 ++++- eventproducer/build.gradle.kts | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index ec3d2602..35ec1f20 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { implementation(libs.dagger) implementation(libs.kotlinxCoroutinesAndroid) implementation(libs.kotlinxCoroutinesCore) - implementation(libs.kotlinx.coroutines.test) implementation(libs.kotlinx.datetime) implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.retrofit.converter) @@ -23,21 +22,19 @@ dependencies { ksp(libs.dagger.compiler) + testImplementation(libs.test.androidx.junit) testImplementation(libs.test.junit5Api) testImplementation(libs.test.mockk) testImplementation(libs.test.kotlin.test) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.test.fluidtime) + testImplementation(libs.test.turbine) testRuntimeOnly(libs.test.junit5Engine) + testRuntimeOnly("org.junit.platform:junit-platform-launcher") kspTest(libs.dagger.compiler) - testApi(libs.test.androidx.junit) - testApi(libs.test.junit5Api) - testApi(libs.test.junit5Engine) - testApi(libs.test.turbine) - androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.espresso.core) } diff --git a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresKotlinCompiler.kt b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresKotlinCompiler.kt index a1e04f8c..d3755e12 100644 --- a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresKotlinCompiler.kt +++ b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresKotlinCompiler.kt @@ -9,7 +9,10 @@ internal class ConfiguresKotlinCompiler : (Project) -> Unit { override fun invoke(target: Project) = with(target) { tasks.withType().configureEach { - kotlinOptions { freeCompilerArgs = freeCompilerArgs + listOf("-Xjvm-default=all") } + kotlinOptions { + jvmTarget = "17" + freeCompilerArgs = freeCompilerArgs + listOf("-Xjvm-default=all") + } } } } diff --git a/eventproducer/build.gradle.kts b/eventproducer/build.gradle.kts index bde47294..e6805b16 100644 --- a/eventproducer/build.gradle.kts +++ b/eventproducer/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation(libs.okhttp.loggingInterceptor) implementation(libs.truetime) + // Simple XML for XML parsing (no annotation processing needed) implementation(libs.retrofit.converter.simplexml) ksp(libs.dagger.compiler) From 95da1d49179cbec0e26bf6d406261f449791d3cc Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Mon, 6 Oct 2025 22:38:30 +0200 Subject: [PATCH 7/8] wip --- auth/build.gradle.kts | 4 ---- .../com/tidal/sdk/plugins/ConfiguresJUnit5.kt | 15 ++++++++++++++- .../plugins/KotlinJvmLibraryConventionPlugin.kt | 10 ++++++++++ eventproducer/build.gradle.kts | 4 ++-- player/build.gradle.kts | 2 -- player/common-android/build.gradle.kts | 3 --- player/common/build.gradle.kts | 3 --- player/events/build.gradle.kts | 2 -- player/playback-engine/build.gradle.kts | 2 -- player/streaming-api/build.gradle.kts | 2 +- player/streaming-privileges/build.gradle.kts | 2 -- player/testutil/build.gradle.kts | 4 +++- template/build.gradle.kts | 4 ---- tidalapi/build.gradle.kts | 4 ---- 14 files changed, 30 insertions(+), 31 deletions(-) diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index 35ec1f20..1957ccdf 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -23,16 +23,12 @@ dependencies { ksp(libs.dagger.compiler) testImplementation(libs.test.androidx.junit) - testImplementation(libs.test.junit5Api) testImplementation(libs.test.mockk) testImplementation(libs.test.kotlin.test) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.test.fluidtime) testImplementation(libs.test.turbine) - testRuntimeOnly(libs.test.junit5Engine) - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - kspTest(libs.dagger.compiler) androidTestImplementation(libs.test.androidx.junit) diff --git a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresJUnit5.kt b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresJUnit5.kt index 8ea8ff7d..ea06af80 100644 --- a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresJUnit5.kt +++ b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/ConfiguresJUnit5.kt @@ -1,12 +1,25 @@ package com.tidal.sdk.plugins import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.withType internal class ConfiguresJUnit5 : (Project) -> Unit { override fun invoke(target: Project) { - target.tasks.withType { useJUnitPlatform() } + with(target) { + tasks.withType { useJUnitPlatform() } + + // Add common JUnit 5 dependencies + val libs = extensions.getByType().named("libs") + dependencies { + add("testImplementation", libs.findLibrary("test-junit5Api").get()) + add("testRuntimeOnly", libs.findLibrary("test-junit5Engine").get()) + add("testRuntimeOnly", "org.junit.platform:junit-platform-launcher") + } + } } } diff --git a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/KotlinJvmLibraryConventionPlugin.kt b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/KotlinJvmLibraryConventionPlugin.kt index 2f4f13d5..6739a689 100644 --- a/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/KotlinJvmLibraryConventionPlugin.kt +++ b/buildlogic/src/main/kotlin/com/tidal/sdk/plugins/KotlinJvmLibraryConventionPlugin.kt @@ -1,14 +1,24 @@ package com.tidal.sdk.plugins import com.tidal.sdk.plugins.constant.PluginId +import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.kotlin.dsl.configure internal class KotlinJvmLibraryConventionPlugin : Plugin { override fun apply(target: Project) = target.run { pluginManager.apply(PluginId.KOTLIN_JVM_PLUGIN_ID) + + // Configure Java compatibility + extensions.configure { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + ConfiguresDokka()(this) ConfiguresKotlinCompiler()(this) ConfiguresMavenPublish()(this) diff --git a/eventproducer/build.gradle.kts b/eventproducer/build.gradle.kts index e6805b16..8b5715f5 100644 --- a/eventproducer/build.gradle.kts +++ b/eventproducer/build.gradle.kts @@ -35,7 +35,7 @@ dependencies { testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.kotlinx.coroutines.test) + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testApi(libs.test.androidx.junit) - testApi(libs.test.junit5Api) - testApi(libs.test.junit5Engine) } diff --git a/player/build.gradle.kts b/player/build.gradle.kts index d1c5f0d2..a75128ce 100644 --- a/player/build.gradle.kts +++ b/player/build.gradle.kts @@ -31,8 +31,6 @@ dependencies { implementation(project(":player:streaming-privileges")) testImplementation(libs.test.assertk) - testImplementation(libs.test.junit5Api) - testRuntimeOnly(libs.test.junit5Engine) testImplementation(libs.test.junit5Params) testImplementation(project(":player:testutil")) testImplementation(libs.test.mockito.kotlin) diff --git a/player/common-android/build.gradle.kts b/player/common-android/build.gradle.kts index 96d57729..5aa054e3 100644 --- a/player/common-android/build.gradle.kts +++ b/player/common-android/build.gradle.kts @@ -9,9 +9,6 @@ dependencies { implementation(libs.kotlinx.serialization.json) implementation(libs.truetime) - testImplementation(libs.test.junit5Api) - testRuntimeOnly(libs.test.junit5Engine) - androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.espresso.core) androidTestImplementation(libs.test.assertk) diff --git a/player/common/build.gradle.kts b/player/common/build.gradle.kts index 259da96d..8410acd1 100644 --- a/player/common/build.gradle.kts +++ b/player/common/build.gradle.kts @@ -5,7 +5,4 @@ dependencies { implementation(libs.gson) implementation(libs.okhttp.okhttp) - - testImplementation(libs.test.junit5Api) - testRuntimeOnly(libs.test.junit5Engine) } diff --git a/player/events/build.gradle.kts b/player/events/build.gradle.kts index 74b0668e..28ac4c64 100644 --- a/player/events/build.gradle.kts +++ b/player/events/build.gradle.kts @@ -26,11 +26,9 @@ dependencies { implementation(libs.kotlinxCoroutinesCore) testImplementation(libs.test.assertk) - testImplementation(libs.test.junit5Api) testImplementation(libs.test.junit5Params) testImplementation(libs.test.mockito.kotlin) testImplementation(libs.kotlinx.coroutines.test) - testRuntimeOnly(libs.test.junit5Engine) testImplementation(project(":player:testutil")) androidTestImplementation(project(":player:testutil")) diff --git a/player/playback-engine/build.gradle.kts b/player/playback-engine/build.gradle.kts index 701f688d..7783a5b5 100644 --- a/player/playback-engine/build.gradle.kts +++ b/player/playback-engine/build.gradle.kts @@ -36,9 +36,7 @@ dependencies { implementation(libs.dagger) testImplementation(libs.test.assertk) - testImplementation(libs.test.junit5Api) testImplementation(libs.test.mockito.kotlin) - testRuntimeOnly(libs.test.junit5Engine) testImplementation(libs.test.junit5Params) testImplementation(project(":player:testutil")) diff --git a/player/streaming-api/build.gradle.kts b/player/streaming-api/build.gradle.kts index bbd77701..8db17089 100644 --- a/player/streaming-api/build.gradle.kts +++ b/player/streaming-api/build.gradle.kts @@ -19,7 +19,6 @@ dependencies { testImplementation(libs.kotlin.reflect) testImplementation(libs.kotlinxCoroutinesCore) testImplementation(libs.test.assertk) - testImplementation(libs.test.junit5Api) testImplementation(libs.test.junit5Params) testImplementation(libs.test.mockito.kotlin) testImplementation(libs.okhttp.mockwebserver) { @@ -28,4 +27,5 @@ dependencies { testImplementation(project(":player:testutil")) testRuntimeOnly(libs.test.junit5Engine) + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/player/streaming-privileges/build.gradle.kts b/player/streaming-privileges/build.gradle.kts index d23b4c6b..4c72b5d5 100644 --- a/player/streaming-privileges/build.gradle.kts +++ b/player/streaming-privileges/build.gradle.kts @@ -23,9 +23,7 @@ dependencies { testImplementation(project(":player:testutil")) testImplementation(libs.test.assertk) testImplementation(libs.test.mockito.kotlin) - testImplementation(libs.test.junit5Api) testImplementation(libs.test.junit5Params) - testRuntimeOnly(libs.test.junit5Engine) androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.espresso.core) diff --git a/player/testutil/build.gradle.kts b/player/testutil/build.gradle.kts index f4a8c0d8..4e041a06 100644 --- a/player/testutil/build.gradle.kts +++ b/player/testutil/build.gradle.kts @@ -1,4 +1,6 @@ -plugins { kotlin("jvm") } +plugins { + alias(libs.plugins.tidal.kotlin.jvm) +} dependencies { implementation(libs.kotlin.reflect) diff --git a/template/build.gradle.kts b/template/build.gradle.kts index 02245434..629eb786 100644 --- a/template/build.gradle.kts +++ b/template/build.gradle.kts @@ -8,10 +8,6 @@ android { namespace = "com.tidal.sdk.template" } dependencies { api(libs.tidal.sdk.common) - testApi(libs.test.androidx.junit) - testApi(libs.test.junit5Api) - testApi(libs.test.junit5Engine) - androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.espresso.core) } diff --git a/tidalapi/build.gradle.kts b/tidalapi/build.gradle.kts index 312bc3d3..b87635e2 100644 --- a/tidalapi/build.gradle.kts +++ b/tidalapi/build.gradle.kts @@ -18,10 +18,6 @@ dependencies { implementation(libs.converter.kotlinx.serialization) implementation(libs.converter.scalars) - testApi(libs.test.androidx.junit) - testApi(libs.test.junit5Api) - testApi(libs.test.junit5Engine) - androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.espresso.core) } From fa811c8a465f15847021b5c97f179952ad7e21f4 Mon Sep 17 00:00:00 2001 From: Michael Pohl Date: Tue, 7 Oct 2025 12:34:59 +0200 Subject: [PATCH 8/8] Create dedicated serializer for interface using a non-standard discriminator --- .../generated/models/LyricsAttributes.kt | 3 ++- .../models/LyricsAttributesProvider.kt | 24 +++++++++++++++++-- .../tidalapi/generated/models/ThirdParty.kt | 1 - .../sdk/tidalapi/generated/models/Tidal.kt | 1 - .../sdk/tidalapi/generated/models/Utils.kt | 7 +++--- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributes.kt b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributes.kt index 9a0158e3..a5b4ff5a 100644 --- a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributes.kt +++ b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributes.kt @@ -6,6 +6,7 @@ package com.tidal.sdk.tidalapi.generated.models +import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -21,7 +22,7 @@ data class LyricsAttributes( @SerialName(value = "technicalStatus") val technicalStatus: LyricsAttributes.TechnicalStatus, @SerialName(value = "direction") val direction: LyricsAttributes.Direction? = null, @SerialName(value = "lrcText") val lrcText: kotlin.String? = null, - @SerialName(value = "provider") val provider: LyricsAttributesProvider? = null, + @Contextual @SerialName(value = "provider") val provider: LyricsAttributesProvider? = null, @SerialName(value = "text") val text: kotlin.String? = null, ) { diff --git a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributesProvider.kt b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributesProvider.kt index 4a552f52..a6c82867 100644 --- a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributesProvider.kt +++ b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/LyricsAttributesProvider.kt @@ -6,8 +6,12 @@ package com.tidal.sdk.tidalapi.generated.models -import kotlinx.serialization.Polymorphic +import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonContentPolymorphicSerializer +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive /** * @param commonTrackId @@ -15,4 +19,20 @@ import kotlinx.serialization.Serializable * @param name * @param source */ -@Serializable @Polymorphic sealed interface LyricsAttributesProvider +@Serializable(with = LyricsAttributesProviderSerializer::class) +sealed interface LyricsAttributesProvider + +object LyricsAttributesProviderSerializer : + JsonContentPolymorphicSerializer(LyricsAttributesProvider::class) { + override fun selectDeserializer( + element: JsonElement + ): DeserializationStrategy { + val source = element.jsonObject["source"]?.jsonPrimitive?.content + return when (source) { + "TIDAL" -> Tidal.serializer() + "THIRD_PARTY" -> ThirdParty.serializer() + else -> + throw IllegalArgumentException("Unknown LyricsAttributesProvider source: $source") + } + } +} diff --git a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/ThirdParty.kt b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/ThirdParty.kt index 48ae9f95..6e30ffac 100644 --- a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/ThirdParty.kt +++ b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/ThirdParty.kt @@ -16,7 +16,6 @@ import kotlinx.serialization.Serializable * @param source */ @Serializable -@SerialName(value = "thirdParty") data class ThirdParty( @SerialName(value = "name") override val name: kotlin.String, @SerialName(value = "commonTrackId") val commonTrackId: kotlin.String, diff --git a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Tidal.kt b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Tidal.kt index 5b8ebb6f..89e7a932 100644 --- a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Tidal.kt +++ b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Tidal.kt @@ -14,7 +14,6 @@ import kotlinx.serialization.Serializable * @param source */ @Serializable -@SerialName(value = "tidal") data class Tidal( @SerialName(value = "name") override val name: kotlin.String? = null, @SerialName(value = "source") override val source: LyricsProvider.Source? = null, diff --git a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Utils.kt b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Utils.kt index 68b654f7..06d913d2 100644 --- a/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Utils.kt +++ b/tidalapi/src/main/kotlin/com/tidal/sdk/tidalapi/generated/models/Utils.kt @@ -1,9 +1,12 @@ package com.tidal.sdk.tidalapi.generated.models import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual import kotlinx.serialization.modules.polymorphic fun getOneOfSerializer() = SerializersModule { + contextual(LyricsAttributesProvider::class, LyricsAttributesProviderSerializer) + polymorphic(IncludedInner::class) { subclass(AlbumsResourceObject::class, AlbumsResourceObject.serializer()) subclass(AppreciationsResourceObject::class, AppreciationsResourceObject.serializer()) @@ -40,8 +43,4 @@ fun getOneOfSerializer() = SerializersModule { subclass(UsersResourceObject::class, UsersResourceObject.serializer()) subclass(VideosResourceObject::class, VideosResourceObject.serializer()) } - polymorphic(LyricsAttributesProvider::class) { - subclass(ThirdParty::class, ThirdParty.serializer()) - subclass(Tidal::class, Tidal.serializer()) - } }