From 5661fa5c00e0289734b8a46b6c9531a55697c88e Mon Sep 17 00:00:00 2001 From: Sushant Hande Date: Tue, 9 Sep 2025 22:40:35 +0530 Subject: [PATCH 1/4] Removed platform-specific implementation of createApi --- .../kotlin/com/example/fruitties/di/Factory.android.kt | 2 -- .../commonMain/kotlin/com/example/fruitties/di/AppContainer.kt | 2 +- .../src/commonMain/kotlin/com/example/fruitties/di/Factory.kt | 2 -- .../iosMain/kotlin/com/example/fruitties/di/Factory.native.kt | 2 -- 4 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt b/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt index 9391469..31bbb6a 100644 --- a/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt +++ b/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt @@ -45,6 +45,4 @@ actual class Factory( "cart.json", ).absolutePath } - - actual fun createApi(): FruittieApi = commonCreateApi() } diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt index 24ed104..0c11463 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt @@ -31,7 +31,7 @@ class AppContainer( ) { val dataRepository: DataRepository by lazy { DataRepository( - api = factory.createApi(), + api = commonCreateApi(), database = factory.createRoomDatabase(), cartDataStore = factory.createCartDataStore(), scope = CoroutineScope(Dispatchers.Default + SupervisorJob()), diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt index 079df30..8b8274a 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt @@ -28,8 +28,6 @@ import kotlinx.serialization.json.Json expect class Factory { fun createRoomDatabase(): AppDatabase - fun createApi(): FruittieApi - fun createCartDataStore(): CartDataStore } diff --git a/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt b/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt index 65bf22f..079c11c 100644 --- a/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt +++ b/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt @@ -56,6 +56,4 @@ actual class Factory { ) return requireNotNull(documentDirectory).path!! } - - actual fun createApi(): FruittieApi = commonCreateApi() } From b5aed0d669156cac32836887b6967d5b6e418956 Mon Sep 17 00:00:00 2001 From: Sushant Hande Date: Tue, 9 Sep 2025 23:08:26 +0530 Subject: [PATCH 2/4] Refactor: remove platform-specific implementation of createApi and centralize JSON configuration --- .../fruitties/database/CartDataStore.kt | 2 +- .../com/example/fruitties/di/AppContainer.kt | 18 +++++++++++++++ .../com/example/fruitties/di/Factory.kt | 19 ---------------- .../com/example/fruitties/utils/JsonConfig.kt | 22 +++++++++++++++++++ 4 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt index 2cd8afb..b7c19ac 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt @@ -18,8 +18,8 @@ package com.example.fruitties.database import androidx.datastore.core.DataStoreFactory import androidx.datastore.core.okio.OkioSerializer import androidx.datastore.core.okio.OkioStorage -import com.example.fruitties.di.json import com.example.fruitties.model.Fruittie +import com.example.fruitties.utils.JsonConfig.json import kotlinx.coroutines.flow.Flow import kotlinx.serialization.Serializable import okio.BufferedSink diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt index 0c11463..f643464 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt @@ -18,13 +18,21 @@ package com.example.fruitties.di import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import com.example.fruitties.DataRepository +import com.example.fruitties.network.FruittieApi +import com.example.fruitties.network.FruittieNetworkApi +import com.example.fruitties.utils.JsonConfig.json import com.example.fruitties.viewmodel.CartViewModel import com.example.fruitties.viewmodel.FruittieViewModel import com.example.fruitties.viewmodel.FruittieViewModel.Companion.FRUITTIE_ID_KEY import com.example.fruitties.viewmodel.MainViewModel +import io.ktor.client.HttpClient +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.http.ContentType +import io.ktor.serialization.kotlinx.json.json import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.serialization.json.Json class AppContainer( private val factory: Factory, @@ -59,4 +67,14 @@ class AppContainer( ) } } + + internal fun commonCreateApi(): FruittieApi = + FruittieNetworkApi( + client = HttpClient { + install(ContentNegotiation) { + json(json, contentType = ContentType.Any) + } + }, + apiUrl = "https://android.github.io/kotlin-multiplatform-samples/fruitties-api", + ) } diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt index 8b8274a..cf82163 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/Factory.kt @@ -17,28 +17,9 @@ package com.example.fruitties.di import com.example.fruitties.database.AppDatabase import com.example.fruitties.database.CartDataStore -import com.example.fruitties.network.FruittieApi -import com.example.fruitties.network.FruittieNetworkApi -import io.ktor.client.HttpClient -import io.ktor.client.plugins.contentnegotiation.ContentNegotiation -import io.ktor.http.ContentType -import io.ktor.serialization.kotlinx.json.json -import kotlinx.serialization.json.Json expect class Factory { fun createRoomDatabase(): AppDatabase fun createCartDataStore(): CartDataStore } - -internal fun commonCreateApi(): FruittieApi = - FruittieNetworkApi( - client = HttpClient { - install(ContentNegotiation) { - json(json, contentType = ContentType.Any) - } - }, - apiUrl = "https://android.github.io/kotlin-multiplatform-samples/fruitties-api", - ) - -val json = Json { ignoreUnknownKeys = true } diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt new file mode 100644 index 0000000..8c8d961 --- /dev/null +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.fruitties.utils + +import kotlinx.serialization.json.Json + +object JsonConfig { + val json = Json { ignoreUnknownKeys = true } +} \ No newline at end of file From 217c99a3619e26611a960e05201c10f508acb99f Mon Sep 17 00:00:00 2001 From: Sushant Hande Date: Thu, 11 Sep 2025 11:13:06 +0530 Subject: [PATCH 3/4] Refactor: centralize JSON configuration and removed JsonConfig.kt --- .../fruitties/database/CartDataStore.kt | 2 +- .../com/example/fruitties/di/AppContainer.kt | 3 ++- .../com/example/fruitties/utils/JsonConfig.kt | 22 ------------------- 3 files changed, 3 insertions(+), 24 deletions(-) delete mode 100644 Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt index b7c19ac..2cd8afb 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/database/CartDataStore.kt @@ -18,8 +18,8 @@ package com.example.fruitties.database import androidx.datastore.core.DataStoreFactory import androidx.datastore.core.okio.OkioSerializer import androidx.datastore.core.okio.OkioStorage +import com.example.fruitties.di.json import com.example.fruitties.model.Fruittie -import com.example.fruitties.utils.JsonConfig.json import kotlinx.coroutines.flow.Flow import kotlinx.serialization.Serializable import okio.BufferedSink diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt index f643464..5cb2a3a 100644 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt +++ b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/di/AppContainer.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.viewmodel.viewModelFactory import com.example.fruitties.DataRepository import com.example.fruitties.network.FruittieApi import com.example.fruitties.network.FruittieNetworkApi -import com.example.fruitties.utils.JsonConfig.json import com.example.fruitties.viewmodel.CartViewModel import com.example.fruitties.viewmodel.FruittieViewModel import com.example.fruitties.viewmodel.FruittieViewModel.Companion.FRUITTIE_ID_KEY @@ -34,6 +33,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.serialization.json.Json +val json = Json { ignoreUnknownKeys = true } + class AppContainer( private val factory: Factory, ) { diff --git a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt b/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt deleted file mode 100644 index 8c8d961..0000000 --- a/Fruitties/shared/src/commonMain/kotlin/com/example/fruitties/utils/JsonConfig.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.example.fruitties.utils - -import kotlinx.serialization.json.Json - -object JsonConfig { - val json = Json { ignoreUnknownKeys = true } -} \ No newline at end of file From d06a5e694880f863b0a311260f796e86f12ec135 Mon Sep 17 00:00:00 2001 From: Sushant Hande Date: Sat, 13 Sep 2025 13:08:22 +0530 Subject: [PATCH 4/4] Refactor: Addressed formatting issue by running spotless command --- .../kotlin/com/example/fruitties/di/Factory.android.kt | 1 - .../iosMain/kotlin/com/example/fruitties/di/Factory.native.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt b/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt index 31bbb6a..9c86774 100644 --- a/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt +++ b/Fruitties/shared/src/androidMain/kotlin/com/example/fruitties/di/Factory.android.kt @@ -21,7 +21,6 @@ import androidx.sqlite.driver.bundled.BundledSQLiteDriver import com.example.fruitties.database.AppDatabase import com.example.fruitties.database.CartDataStore import com.example.fruitties.database.DB_FILE_NAME -import com.example.fruitties.network.FruittieApi import kotlinx.coroutines.Dispatchers actual class Factory( diff --git a/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt b/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt index 079c11c..db35496 100644 --- a/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt +++ b/Fruitties/shared/src/iosMain/kotlin/com/example/fruitties/di/Factory.native.kt @@ -20,7 +20,6 @@ import androidx.sqlite.driver.bundled.BundledSQLiteDriver import com.example.fruitties.database.AppDatabase import com.example.fruitties.database.CartDataStore import com.example.fruitties.database.DB_FILE_NAME -import com.example.fruitties.network.FruittieApi import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO