From 43a8a8c1fab25bf78be7ed59ada36ab9f9f14503 Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Sun, 5 Oct 2025 10:09:16 -0700 Subject: [PATCH 1/4] Remove .idea/kotlinc.xml from tracking --- .gitignore | 6 ++++-- .idea/.name | 1 + .idea/kotlinc.xml | 6 ------ 3 files changed, 5 insertions(+), 8 deletions(-) create mode 100644 .idea/.name delete mode 100644 .idea/kotlinc.xml diff --git a/.gitignore b/.gitignore index f119b7c0..19015bb5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,18 +16,20 @@ captures .idea/modules.xml .idea/compiler.xml .idea/other.xml +.idea/kotlinc.xml .idea/jarRepositories.xml .idea/deploymentTargetDropDown.xml .idea/deploymentTargetSelector.xml .idea/androidTestResultsUserPreferences.xml .idea/appInsightsSettings.xml .idea/artifacts +.idea/AndroidProjectSystem.xml +.idea/deviceManager.xml +.idea/studiobot.xml .idea/assetWizardSettings.xml .idea/runConfigurations.xml -.idea/studiobot.xml gradle.xml *.iml -ios-app/Fosdem/.idea/* .fleet # General diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..0ebd7c90 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +kanalytics-lib \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index c224ad56..00000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file From ca8b736e3189b0d8ffaa23897de9c6f690751758 Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Sun, 5 Oct 2025 10:25:07 -0700 Subject: [PATCH 2/4] Migrate to Dokka Gradle plugin V2 --- gradle.properties | 4 ++++ kanalytics-viewer-no-op/build.gradle.kts | 2 +- kanalytics-viewer/build.gradle.kts | 2 +- kanalytics/build.gradle.kts | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index f220e160..dcfb7dc5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,7 @@ kotlin.mpp.enableCInteropCommonization=true android.useAndroidX=true android.nonTransitiveRClass=true kanalytics.sampleDebug=debug + +#Dokka V2 Migration +org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled +org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true diff --git a/kanalytics-viewer-no-op/build.gradle.kts b/kanalytics-viewer-no-op/build.gradle.kts index 625a9ee7..a67795d1 100644 --- a/kanalytics-viewer-no-op/build.gradle.kts +++ b/kanalytics-viewer-no-op/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("convention.plugin.android.library") id("convention.plugin.kotlin.multiplatform") - id("org.jetbrains.dokka") + alias(libs.plugins.dokka) id("convention.plugin.maven.publication") id("convention.plugin.metalava") } diff --git a/kanalytics-viewer/build.gradle.kts b/kanalytics-viewer/build.gradle.kts index 63ffc19b..aabf7bae 100644 --- a/kanalytics-viewer/build.gradle.kts +++ b/kanalytics-viewer/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("convention.plugin.android.library") id("convention.plugin.kotlin.multiplatform") - id("org.jetbrains.dokka") + alias(libs.plugins.dokka) id("convention.plugin.maven.publication") id("convention.plugin.compose") id("convention.plugin.metalava") diff --git a/kanalytics/build.gradle.kts b/kanalytics/build.gradle.kts index eea42499..96f561a1 100644 --- a/kanalytics/build.gradle.kts +++ b/kanalytics/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("convention.plugin.android.library") id("convention.plugin.kotlin.multiplatform") - id("org.jetbrains.dokka") + alias(libs.plugins.dokka) id("convention.plugin.maven.publication") id("convention.plugin.metalava") } From 79e0b477a46f1e01f3de623c9f6b5d2e3e6984ab Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Sun, 21 Sep 2025 08:24:27 -0700 Subject: [PATCH 3/4] Bump target sdk to 36 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e9945691..92ac32eb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,8 +3,8 @@ # If it's changed, update the one in the script as well. kanalytics = "1.4.0-SNAPSHOT" minSdk = "24" -targetSdk = "35" -compileSdk = "35" +targetSdk = "36" +compileSdk = "36" agp = "8.13.0" kotlin = "2.2.20" spotless = "7.2.1" From 3026a2836391c1e226f88b452fbdcd268eb05137 Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Sun, 21 Sep 2025 07:40:10 -0700 Subject: [PATCH 4/4] Fix deprecated warnings --- .../main/kotlin/com/addhen/gradle/convention/Kotlin.kt | 1 + .../addhen/kanalytics/viewer/KAnalyticsCollector.kt | 2 +- .../addhen/kanalytics/viewer/KAnalyticsCollector.kt | 2 +- .../addhen/kanalytics/viewer/KAnalyticsInterceptor.kt | 2 +- .../addhen/kanalytics/viewer/RetentionPolicyManager.kt | 10 +++++++--- .../viewer/app/shared/data/database/EventDataDao.kt | 2 +- .../shared/data/database/entities/EventDataEntity.kt | 4 +--- .../database/sqlidelight/adapters/InstantAdapter.kt | 4 ++-- .../viewer/app/shared/data/model/EventData.kt | 2 +- .../app/shared/data/repository/EventDataRepository.kt | 2 +- .../app/shared/data/repository/EventRepository.kt | 2 +- .../addhen/kanalytics/viewer/app/shared/ui/Instant.kt | 2 +- .../app/shared/data/database/sqlidelight/event_data.sq | 2 +- .../viewer/KAnalyticsCollectorTest.kt | 4 ++-- .../viewer/RetentionPolicyManagerTest.kt | 10 +++++++--- 15 files changed, 29 insertions(+), 22 deletions(-) diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Kotlin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Kotlin.kt index 9dcd34b5..12fed3d7 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Kotlin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Kotlin.kt @@ -17,6 +17,7 @@ fun Project.configureKotlin() { // Turning this off due to: //https://youtrack.jetbrains.com/issue/KT-66568/w-KLIB-resolver-The-same-uniquename...-found-in-more-than-one-library allWarningsAsErrors.set(false) + optIn.add("kotlin.time.ExperimentalTime") freeCompilerArgs.add( // expect/actual classes (including interfaces, objects, annotations, enums, actual typealiases) in Beta // https://youtrack.jetbrains.com/issue/KT-61573 diff --git a/kanalytics-viewer-no-op/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt b/kanalytics-viewer-no-op/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt index ee09e94c..1144551d 100644 --- a/kanalytics-viewer-no-op/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt +++ b/kanalytics-viewer-no-op/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt @@ -5,7 +5,7 @@ package com.addhen.kanalytics.viewer import com.addhen.kanalytics.KAnalyticsEvent import com.addhen.kanalytics.KTrackerName -import kotlinx.datetime.Instant +import kotlin.time.Instant public class KAnalyticsCollector( private val showNotification: Boolean = false, diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt index d587f8dc..7883af0f 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsCollector.kt @@ -10,11 +10,11 @@ import com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers import com.addhen.kanalytics.viewer.app.shared.data.model.EventData import com.addhen.kanalytics.viewer.app.shared.data.repository.EventDataRepository import com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository +import kotlin.time.Instant import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import kotlinx.datetime.Instant public class KAnalyticsCollector( showShortcut: Boolean = true, diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsInterceptor.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsInterceptor.kt index b01d63c6..49d86a5f 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsInterceptor.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/KAnalyticsInterceptor.kt @@ -5,7 +5,7 @@ package com.addhen.kanalytics.viewer import com.addhen.kanalytics.Interceptor import com.addhen.kanalytics.KAnalyticsEvent -import kotlinx.datetime.Clock +import kotlin.time.Clock public class KAnalyticsInterceptor( private val collector: KAnalyticsCollector = KAnalyticsCollector(), diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/RetentionPolicyManager.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/RetentionPolicyManager.kt index 2b236308..d88b2017 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/RetentionPolicyManager.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/RetentionPolicyManager.kt @@ -5,8 +5,8 @@ package com.addhen.kanalytics.viewer import com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository import kotlin.jvm.JvmInline -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant +import kotlin.time.Clock +import kotlin.time.Instant public class RetentionPolicyManager( private val clock: Clock = Clock.System, @@ -18,7 +18,11 @@ public class RetentionPolicyManager( val daysInMillis = dayDuration.numberOfDays * 24 * 60 * 60 * 1000L val currentTimeInMillis = clock.now().toEpochMilliseconds() val retentionDeadlineInMillis = currentTimeInMillis - daysInMillis - repository.deleteAllOlderThan(Instant.fromEpochMilliseconds(retentionDeadlineInMillis)) + repository.deleteAllOlderThan( + Instant.fromEpochMilliseconds( + retentionDeadlineInMillis, + ), + ) } @JvmInline diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/EventDataDao.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/EventDataDao.kt index 8efeec29..ea883ff1 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/EventDataDao.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/EventDataDao.kt @@ -8,11 +8,11 @@ import com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers import com.addhen.kanalytics.viewer.app.shared.data.database.entities.EventDataEntity import com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.EventViewerDatabase import com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.createDatabase +import kotlin.time.Instant import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -import kotlinx.datetime.Instant public class EventDataDao( private val database: EventViewerDatabase, diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/entities/EventDataEntity.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/entities/EventDataEntity.kt index a3021f44..98646988 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/entities/EventDataEntity.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/entities/EventDataEntity.kt @@ -3,13 +3,11 @@ package com.addhen.kanalytics.viewer.app.shared.data.database.entities -import kotlinx.datetime.Instant - internal class EventDataEntity( val id: Long?, val name: String, val trackerName: String, val description: String?, - val createdAt: Instant, + val createdAt: kotlin.time.Instant, val properties: Map, ) diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/adapters/InstantAdapter.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/adapters/InstantAdapter.kt index 778757fb..3bbeb47d 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/adapters/InstantAdapter.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/adapters/InstantAdapter.kt @@ -4,11 +4,11 @@ package com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.adapters import app.cash.sqldelight.ColumnAdapter -import kotlinx.datetime.Instant +import kotlin.time.Instant internal val instantAdapter = object : ColumnAdapter { - override fun decode(databaseValue: String): Instant = Instant.parse(databaseValue) + override fun decode(databaseValue: String): Instant = kotlin.time.Instant.parse(databaseValue) override fun encode(value: Instant): String = value.toString() } diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt index e0f3d368..6c53dfc7 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt @@ -3,7 +3,7 @@ package com.addhen.kanalytics.viewer.app.shared.data.model -import kotlinx.datetime.Instant +import kotlin.time.Instant public class EventData( public val id: Long?, diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventDataRepository.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventDataRepository.kt index 9f7acb9b..a75c3dc3 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventDataRepository.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventDataRepository.kt @@ -6,9 +6,9 @@ package com.addhen.kanalytics.viewer.app.shared.data.repository import com.addhen.kanalytics.viewer.app.shared.data.database.EventDataDao import com.addhen.kanalytics.viewer.app.shared.data.database.entities.EventDataEntity import com.addhen.kanalytics.viewer.app.shared.data.model.EventData +import kotlin.time.Instant import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import kotlinx.datetime.Instant public class EventDataRepository(private val eventDataDao: EventDataDao) : EventRepository { diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventRepository.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventRepository.kt index 11469d88..c244313e 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventRepository.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/repository/EventRepository.kt @@ -4,8 +4,8 @@ package com.addhen.kanalytics.viewer.app.shared.data.repository import com.addhen.kanalytics.viewer.app.shared.data.model.EventData +import kotlin.time.Instant import kotlinx.coroutines.flow.Flow -import kotlinx.datetime.Instant public interface EventRepository { diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt index 1f21a891..c22e88cf 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt @@ -1,7 +1,7 @@ // Copyright 2025, Addhen Ltd and the kanalytics project contributors // SPDX-License-Identifier: Apache-2.0 -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime diff --git a/kanalytics-viewer/src/commonMain/sqldelight/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/event_data.sq b/kanalytics-viewer/src/commonMain/sqldelight/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/event_data.sq index e9d23c9d..d9c591a5 100644 --- a/kanalytics-viewer/src/commonMain/sqldelight/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/event_data.sq +++ b/kanalytics-viewer/src/commonMain/sqldelight/com/addhen/kanalytics/viewer/app/shared/data/database/sqlidelight/event_data.sq @@ -1,7 +1,7 @@ import kotlin.String; import kotlin.Any; import kotlin.collections.Map; -import kotlinx.datetime.Instant; +import kotlin.time.Instant; PRAGMA user_version = 3; diff --git a/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/KAnalyticsCollectorTest.kt b/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/KAnalyticsCollectorTest.kt index ff2441f2..1bceaf79 100644 --- a/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/KAnalyticsCollectorTest.kt +++ b/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/KAnalyticsCollectorTest.kt @@ -14,6 +14,8 @@ import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import kotlin.time.Clock +import kotlin.time.Instant import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow @@ -24,8 +26,6 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant @OptIn(ExperimentalCoroutinesApi::class) class KAnalyticsCollectorTest { diff --git a/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/RetentionPolicyManagerTest.kt b/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/RetentionPolicyManagerTest.kt index 635f0fbd..4af0a6db 100644 --- a/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/RetentionPolicyManagerTest.kt +++ b/kanalytics-viewer/src/commonTest/kotlin/com.addhen.kanalytics/viewer/RetentionPolicyManagerTest.kt @@ -13,9 +13,9 @@ import dev.mokkery.verifySuspend import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertFailsWith +import kotlin.time.Clock +import kotlin.time.Instant import kotlinx.coroutines.test.runTest -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant class RetentionPolicyManagerTest { private lateinit var clock: TestClock @@ -43,7 +43,11 @@ class RetentionPolicyManagerTest { manager.processDataRetention() verifySuspend { - repository.deleteAllOlderThan(Instant.fromEpochMilliseconds(expectedRetentionDeadline)) + repository.deleteAllOlderThan( + kotlin.time.Instant.fromEpochMilliseconds( + expectedRetentionDeadline, + ), + ) } }