From d479072a206254de159368cefe055786fa7f8a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D0=B6=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=90=D1=80?= =?UTF-8?q?=D1=82=D0=B5=D0=BC?= Date: Thu, 19 Feb 2026 20:51:16 +0300 Subject: [PATCH 1/3] Add missed sqlite-core module dependency --- .../main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt b/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt index d04115e..caf83db 100644 --- a/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt +++ b/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt @@ -47,9 +47,14 @@ internal object ModuleArtifacts { KickModule.Logging -> listOf("$GROUP:logging-stub:$version") KickModule.MultiplatformSettings -> listOf("$GROUP:multiplatform-settings-stub:$version") KickModule.Overlay -> listOf("$GROUP:overlay-stub:$version") - KickModule.Room -> listOf("$GROUP:sqlite-runtime-stub:$version", "$GROUP:sqlite-room-adapter-stub:$version") + KickModule.Room -> listOf( + "$GROUP:sqlite-core:$version", + "$GROUP:sqlite-runtime-stub:$version", + "$GROUP:sqlite-room-adapter-stub:$version" + ) KickModule.Runner -> listOf("$GROUP:runner-stub:$version") KickModule.Sqldelight -> listOf( + "$GROUP:sqlite-core:$version", "$GROUP:sqlite-runtime-stub:$version", "$GROUP:sqlite-sqldelight-adapter-stub:$version" ) From d97bb10a368f661135a926f56cd05434cfee8dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D0=B6=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=90=D1=80?= =?UTF-8?q?=D1=82=D0=B5=D0=BC?= Date: Thu, 19 Feb 2026 22:01:01 +0300 Subject: [PATCH 2/3] Fix stub function signatures --- .../firebase/analytics/FirebaseAnalyticsModule.kt | 2 +- .../FirebaseCloudMessagingAccessor.ios.kt | 8 +++++++- .../module/overlay/core/provider/OverlayProvider.kt | 2 ++ .../core/provider/PerformanceOverlayProvider.kt | 10 +++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/module/firebase/firebase-analytics-stub/src/commonMain/kotlin/ru/bartwell/kick/module/firebase/analytics/FirebaseAnalyticsModule.kt b/module/firebase/firebase-analytics-stub/src/commonMain/kotlin/ru/bartwell/kick/module/firebase/analytics/FirebaseAnalyticsModule.kt index 7b754b4..d8ca224 100644 --- a/module/firebase/firebase-analytics-stub/src/commonMain/kotlin/ru/bartwell/kick/module/firebase/analytics/FirebaseAnalyticsModule.kt +++ b/module/firebase/firebase-analytics-stub/src/commonMain/kotlin/ru/bartwell/kick/module/firebase/analytics/FirebaseAnalyticsModule.kt @@ -13,7 +13,7 @@ import ru.bartwell.kick.core.data.PlatformContext @Suppress("EmptyFunctionBlock", "UNUSED_PARAMETER") public class FirebaseAnalyticsModule( - context: PlatformContext, + platformContext: PlatformContext, ) : Module { override val description: ModuleDescription = ModuleDescription.FIREBASE_ANALYTICS diff --git a/module/firebase/firebase-cloud-messaging-stub/src/iosMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/FirebaseCloudMessagingAccessor.ios.kt b/module/firebase/firebase-cloud-messaging-stub/src/iosMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/FirebaseCloudMessagingAccessor.ios.kt index 8e0d95a..e4922d8 100644 --- a/module/firebase/firebase-cloud-messaging-stub/src/iosMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/FirebaseCloudMessagingAccessor.ios.kt +++ b/module/firebase/firebase-cloud-messaging-stub/src/iosMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/FirebaseCloudMessagingAccessor.ios.kt @@ -7,7 +7,13 @@ import platform.UserNotifications.UNNotification public fun FirebaseCloudMessagingAccessor.handleApnsPayload(userInfo: NSDictionary) {} @Suppress("UnusedParameter", "EmptyFunctionBlock", "unused") -public fun FirebaseCloudMessagingAccessor.handleApnsPayload(userInfo: Map) {} +public fun FirebaseCloudMessagingAccessor.handleApnsPayload(userInfo: Map<*, *>) {} @Suppress("UnusedParameter", "EmptyFunctionBlock", "unused") public fun FirebaseCloudMessagingAccessor.handleApnsNotification(notification: UNNotification) {} + +@Suppress("UnusedParameter", "EmptyFunctionBlock", "unused") +public fun FirebaseCloudMessagingAccessor.setFcmToken(token: String?) {} + +@Suppress("UnusedParameter", "EmptyFunctionBlock", "unused") +public fun FirebaseCloudMessagingAccessor.setFirebaseInstallationId(id: String?) {} diff --git a/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/OverlayProvider.kt b/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/OverlayProvider.kt index 555c360..2dd991a 100644 --- a/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/OverlayProvider.kt +++ b/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/OverlayProvider.kt @@ -5,6 +5,8 @@ import kotlinx.coroutines.CoroutineScope public interface OverlayProvider { public val categories: Set + public val isAvailable: Boolean + public fun start(scope: CoroutineScope) public fun stop() diff --git a/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/PerformanceOverlayProvider.kt b/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/PerformanceOverlayProvider.kt index 117ad51..19cf767 100644 --- a/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/PerformanceOverlayProvider.kt +++ b/module/logging/overlay-stub/src/commonMain/kotlin/ru/bartwell/kick/module/overlay/core/provider/PerformanceOverlayProvider.kt @@ -1,9 +1,17 @@ package ru.bartwell.kick.module.overlay.core.provider import kotlinx.coroutines.CoroutineScope +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds -public class PerformanceOverlayProvider : OverlayProvider { +@Suppress("UnusedPrivateProperty") +public class PerformanceOverlayProvider( + private val updateIntervalMillis: Duration, +) : OverlayProvider { override val categories: Set = setOf(CATEGORY) + override val isAvailable: Boolean = true + + public constructor() : this(1.seconds) @Suppress("EmptyFunctionBlock") override fun start(scope: CoroutineScope) {} From d4f2b0ddc9c6a78cbad3bdd84d7014e57503a4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D0=B6=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=90=D1=80?= =?UTF-8?q?=D1=82=D0=B5=D0=BC?= Date: Fri, 20 Feb 2026 01:58:34 +0300 Subject: [PATCH 3/3] Add explicit schema creation calls to all database --- .../bartwell/kick/gradle/ModuleArtifacts.kt | 32 ++++++++++++------- .../analytics/core/persist/DatabaseBuilder.kt | 6 ++++ .../analytics/db/firebase_analytics.sq | 4 +-- .../core/persist/DatabaseBuilder.kt | 10 ++++++ .../firebase/cloudmessaging/db/fcm_message.sq | 2 +- .../logging/core/persist/DatabaseBuilder.kt | 6 ++++ .../ru/bartwell/kick/module/logging/db/log.sq | 2 +- .../ktor3/core/persist/DatabaseBuilder.kt | 6 ++++ .../bartwell/kick/module/ktor3/db/request.sq | 2 +- 9 files changed, 53 insertions(+), 17 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt b/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt index caf83db..b23ea1c 100644 --- a/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt +++ b/gradle-plugin/src/main/kotlin/ru/bartwell/kick/gradle/ModuleArtifacts.kt @@ -10,6 +10,14 @@ internal object ModuleArtifacts { fun mainCore(version: String) = "$GROUP:main-core:$version" fun mainRuntime(version: String) = "$GROUP:main-runtime:$version" fun mainRuntimeStub(version: String) = "$GROUP:main-runtime-stub:$version" + private fun sqliteCore(version: String) = "$GROUP:sqlite-core:$version" + private fun sqliteRuntime(version: String) = "$GROUP:sqlite-runtime:$version" + private fun sqliteRuntimeStub(version: String) = "$GROUP:sqlite-runtime-stub:$version" + private fun sqliteRoomAdapter(version: String) = "$GROUP:sqlite-room-adapter:$version" + private fun sqliteRoomAdapterStub(version: String) = "$GROUP:sqlite-room-adapter-stub:$version" + private fun sqliteSqldelightAdapter(version: String) = "$GROUP:sqlite-sqldelight-adapter:$version" + private fun sqliteSqldelightAdapterStub(version: String) = + "$GROUP:sqlite-sqldelight-adapter-stub:$version" fun runtimeArtifacts(module: KickModule, version: String): List { return when (module) { @@ -23,15 +31,15 @@ internal object ModuleArtifacts { KickModule.MultiplatformSettings -> listOf("$GROUP:multiplatform-settings:$version") KickModule.Overlay -> listOf("$GROUP:overlay:$version") KickModule.Room -> listOf( - "$GROUP:sqlite-core:$version", - "$GROUP:sqlite-runtime:$version", - "$GROUP:sqlite-room-adapter:$version" + sqliteCore(version), + sqliteRuntime(version), + sqliteRoomAdapter(version), ) KickModule.Runner -> listOf("$GROUP:runner:$version") KickModule.Sqldelight -> listOf( - "$GROUP:sqlite-core:$version", - "$GROUP:sqlite-runtime:$version", - "$GROUP:sqlite-sqldelight-adapter:$version" + sqliteCore(version), + sqliteRuntime(version), + sqliteSqldelightAdapter(version), ) } } @@ -48,15 +56,15 @@ internal object ModuleArtifacts { KickModule.MultiplatformSettings -> listOf("$GROUP:multiplatform-settings-stub:$version") KickModule.Overlay -> listOf("$GROUP:overlay-stub:$version") KickModule.Room -> listOf( - "$GROUP:sqlite-core:$version", - "$GROUP:sqlite-runtime-stub:$version", - "$GROUP:sqlite-room-adapter-stub:$version" + sqliteCore(version), + sqliteRuntimeStub(version), + sqliteRoomAdapterStub(version), ) KickModule.Runner -> listOf("$GROUP:runner-stub:$version") KickModule.Sqldelight -> listOf( - "$GROUP:sqlite-core:$version", - "$GROUP:sqlite-runtime-stub:$version", - "$GROUP:sqlite-sqldelight-adapter-stub:$version" + sqliteCore(version), + sqliteRuntimeStub(version), + sqliteSqldelightAdapterStub(version), ) } } diff --git a/module/firebase/firebase-analytics/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/analytics/core/persist/DatabaseBuilder.kt b/module/firebase/firebase-analytics/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/analytics/core/persist/DatabaseBuilder.kt index 904593b..a701011 100644 --- a/module/firebase/firebase-analytics/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/analytics/core/persist/DatabaseBuilder.kt +++ b/module/firebase/firebase-analytics/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/analytics/core/persist/DatabaseBuilder.kt @@ -1,5 +1,6 @@ package ru.bartwell.kick.module.firebase.analytics.core.persist +import android.util.Log import app.cash.sqldelight.async.coroutines.synchronous import app.cash.sqldelight.driver.android.AndroidSqliteDriver import ru.bartwell.kick.core.data.PlatformContext @@ -17,6 +18,11 @@ internal actual class DatabaseBuilder { context = appContext, name = "kick_firebase_analytics.db" ) + runCatching { + FirebaseAnalyticsDb.Schema.synchronous().create(driver) + }.onFailure { throwable -> + Log.e("KickFirebaseAnalyticsDb", "Failed to create firebase analytics schema", throwable) + } val db = FirebaseAnalyticsDb( driver = driver, analyticsEventAdapter = AnalyticsEvent.Adapter( diff --git a/module/firebase/firebase-analytics/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/analytics/db/firebase_analytics.sq b/module/firebase/firebase-analytics/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/analytics/db/firebase_analytics.sq index f3e6b7c..c44cc0a 100644 --- a/module/firebase/firebase-analytics/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/analytics/db/firebase_analytics.sq +++ b/module/firebase/firebase-analytics/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/analytics/db/firebase_analytics.sq @@ -1,7 +1,7 @@ import kotlin.collections.Map; import kotlin.String; -CREATE TABLE analyticsEvent ( +CREATE TABLE IF NOT EXISTS analyticsEvent ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER NOT NULL, name TEXT NOT NULL, @@ -17,7 +17,7 @@ INSERT INTO analyticsEvent (timestamp, name, params) VALUES (?, ?, ?); deleteEvents: DELETE FROM analyticsEvent; -CREATE TABLE userProperty ( +CREATE TABLE IF NOT EXISTS userProperty ( name TEXT PRIMARY KEY NOT NULL, value TEXT NOT NULL, timestamp INTEGER NOT NULL diff --git a/module/firebase/firebase-cloud-messaging/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/core/persist/DatabaseBuilder.kt b/module/firebase/firebase-cloud-messaging/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/core/persist/DatabaseBuilder.kt index 186490a..aa4ff03 100644 --- a/module/firebase/firebase-cloud-messaging/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/core/persist/DatabaseBuilder.kt +++ b/module/firebase/firebase-cloud-messaging/src/androidMain/kotlin/ru/bartwell/kick/module/firebase/cloudmessaging/core/persist/DatabaseBuilder.kt @@ -1,5 +1,6 @@ package ru.bartwell.kick.module.firebase.cloudmessaging.core.persist +import android.util.Log import app.cash.sqldelight.async.coroutines.synchronous import app.cash.sqldelight.driver.android.AndroidSqliteDriver import ru.bartwell.kick.core.data.PlatformContext @@ -17,6 +18,15 @@ internal actual class DatabaseBuilder { context = appContext, name = "kick_firebase_cloud_messaging.db", ) + runCatching { + FirebaseCloudMessagingDb.Schema.synchronous().create(driver) + }.onFailure { throwable -> + Log.e( + "KickFirebaseCloudMessagingDb", + "Failed to create firebase cloud messaging schema", + throwable, + ) + } val db = FirebaseCloudMessagingDb( driver = driver, fcmMessageAdapter = FcmMessage.Adapter( diff --git a/module/firebase/firebase-cloud-messaging/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/cloudmessaging/db/fcm_message.sq b/module/firebase/firebase-cloud-messaging/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/cloudmessaging/db/fcm_message.sq index f343c0e..f628898 100644 --- a/module/firebase/firebase-cloud-messaging/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/cloudmessaging/db/fcm_message.sq +++ b/module/firebase/firebase-cloud-messaging/src/commonMain/sqldelight/ru/bartwell/kick/module/firebase/cloudmessaging/db/fcm_message.sq @@ -1,7 +1,7 @@ import kotlin.collections.Map; import kotlin.String; -CREATE TABLE fcmMessage ( +CREATE TABLE IF NOT EXISTS fcmMessage ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, body TEXT, diff --git a/module/logging/logging/src/androidMain/kotlin/ru/bartwell/kick/module/logging/core/persist/DatabaseBuilder.kt b/module/logging/logging/src/androidMain/kotlin/ru/bartwell/kick/module/logging/core/persist/DatabaseBuilder.kt index 2031d16..ef7f833 100644 --- a/module/logging/logging/src/androidMain/kotlin/ru/bartwell/kick/module/logging/core/persist/DatabaseBuilder.kt +++ b/module/logging/logging/src/androidMain/kotlin/ru/bartwell/kick/module/logging/core/persist/DatabaseBuilder.kt @@ -7,6 +7,7 @@ import ru.bartwell.kick.core.data.get import ru.bartwell.kick.module.logging.core.persist.adapter.logLevelAdapter import ru.bartwell.kick.module.logging.db.Log import ru.bartwell.kick.module.logging.db.LoggingDb +import android.util.Log as AndroidLog @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") internal actual class DatabaseBuilder { @@ -17,6 +18,11 @@ internal actual class DatabaseBuilder { context = appContext, name = "kick_logging.db" ) + runCatching { + LoggingDb.Schema.synchronous().create(driver) + }.onFailure { throwable -> + AndroidLog.e("KickLoggingDb", "Failed to create logging schema", throwable) + } val db = LoggingDb( driver = driver, logAdapter = Log.Adapter(levelAdapter = logLevelAdapter) diff --git a/module/logging/logging/src/commonMain/sqldelight/ru/bartwell/kick/module/logging/db/log.sq b/module/logging/logging/src/commonMain/sqldelight/ru/bartwell/kick/module/logging/db/log.sq index ec6133d..b602441 100644 --- a/module/logging/logging/src/commonMain/sqldelight/ru/bartwell/kick/module/logging/db/log.sq +++ b/module/logging/logging/src/commonMain/sqldelight/ru/bartwell/kick/module/logging/db/log.sq @@ -1,6 +1,6 @@ import ru.bartwell.kick.module.logging.core.data.LogLevel; -CREATE TABLE log ( +CREATE TABLE IF NOT EXISTS log ( id INTEGER PRIMARY KEY AUTOINCREMENT, time INTEGER NOT NULL, level TEXT AS LogLevel NOT NULL, diff --git a/module/network/ktor3/src/androidMain/kotlin/ru/bartwell/kick/module/ktor3/core/persist/DatabaseBuilder.kt b/module/network/ktor3/src/androidMain/kotlin/ru/bartwell/kick/module/ktor3/core/persist/DatabaseBuilder.kt index b7c06b2..425390e 100644 --- a/module/network/ktor3/src/androidMain/kotlin/ru/bartwell/kick/module/ktor3/core/persist/DatabaseBuilder.kt +++ b/module/network/ktor3/src/androidMain/kotlin/ru/bartwell/kick/module/ktor3/core/persist/DatabaseBuilder.kt @@ -1,5 +1,6 @@ package ru.bartwell.kick.module.ktor3.core.persist +import android.util.Log import app.cash.sqldelight.async.coroutines.synchronous import app.cash.sqldelight.driver.android.AndroidSqliteDriver import ru.bartwell.kick.core.data.PlatformContext @@ -17,6 +18,11 @@ internal actual class DatabaseBuilder { context = appContext, name = "kick_ktor3.db" ) + runCatching { + Ktor3Db.Schema.synchronous().create(driver) + }.onFailure { throwable -> + Log.e("KickKtor3Db", "Failed to create ktor3 schema", throwable) + } val db = Ktor3Db( driver = driver, requestAdapter = Request.Adapter( diff --git a/module/network/ktor3/src/commonMain/sqldelight/ru/bartwell/kick/module/ktor3/db/request.sq b/module/network/ktor3/src/commonMain/sqldelight/ru/bartwell/kick/module/ktor3/db/request.sq index 87bf06c..bdf39a3 100644 --- a/module/network/ktor3/src/commonMain/sqldelight/ru/bartwell/kick/module/ktor3/db/request.sq +++ b/module/network/ktor3/src/commonMain/sqldelight/ru/bartwell/kick/module/ktor3/db/request.sq @@ -1,7 +1,7 @@ import ru.bartwell.kick.module.ktor3.feature.list.data.HttpMethod; import kotlin.Boolean; -CREATE TABLE request ( +CREATE TABLE IF NOT EXISTS request ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER NOT NULL, method TEXT AS HttpMethod NOT NULL,