From 431abfa27713f2652d6559aec65b060a7e2cc8ef Mon Sep 17 00:00:00 2001
From: kirich1409 <kirill@androidbroadcast.dev>
Date: Fri, 14 Jun 2024 16:11:43 +0300
Subject: [PATCH] Migrating android source to platform specific

---
 build.gradle.kts                              |  2 +
 core/common/build.gradle.kts                  | 33 +++++---
 .../common/AndroidLogcatLogger.kt}            | 12 ---
 .../androidbroadcast/common/AppDispatchers.kt |  0
 .../dev/androidbroadcast/common/Logger.kt     | 13 ++++
 core/data/build.gradle.kts                    | 39 ++++++----
 .../news/data/ArticlesRepository.kt           |  0
 .../dev/androidbroadcast/news/data/Mappers.kt |  0
 .../news/data/MergeStrategy.kt                |  0
 .../news/data/RequestResult.kt                |  0
 .../news/data/model/Article.kt                |  0
 core/database/build.gradle.kts                | 30 ++++++--
 .../news/database/NewsRoomDatabase.kt         |  0
 .../news/database/dao/ArticleDao.kt           |  0
 .../news/database/models/ArticleDBO.kt        |  0
 .../news/database/utils/Converters.kt         |  0
 core/opennews-api/build.gradle.kts            | 34 ++++----
 .../dev/androidbroadcast/newsapi/NewsApi.kt   |  0
 .../newsapi/models/ArticleDTO.kt              |  0
 .../newsapi/models/Language.kt                |  0
 .../newsapi/models/ResponseDTO.kt             |  0
 .../androidbroadcast/newsapi/models/SortBy.kt |  0
 .../newsapi/models/SourceDTO.kt               |  0
 .../newsapi/utils/DateTimeUTCSerializer.kt    |  0
 .../newsapi/utils/NewsApiKeyInterceptor.kt    |  0
 core/uikit/build.gradle.kts                   | 52 +++++++++----
 .../kotlin/dev/androidbroadcast/news/Color.kt |  0
 .../kotlin/dev/androidbroadcast/news/Theme.kt |  0
 .../kotlin/dev/androidbroadcast/news/Type.kt  |  0
 core/uikit/src/main/AndroidManifest.xml       |  4 -
 features/news-main/ui-logic/build.gradle.kts  | 52 ++++++++-----
 features/news-main/ui/build.gradle.kts        | 77 +++++++++++--------
 .../news/main/ArticleListContent.kt           |  1 +
 .../news/main/NewsMainFeatureUI.kt            |  0
 .../res/values/strings.xml                    |  0
 .../news-main/ui/src/main/AndroidManifest.xml |  4 -
 gradle/libs.versions.toml                     |  4 +
 37 files changed, 225 insertions(+), 132 deletions(-)
 rename core/common/src/{main/kotlin/dev/androidbroadcast/common/Logger.kt => androidMain/kotlin/dev/androidbroadcast/common/AndroidLogcatLogger.kt} (70%)
 rename core/common/src/{main => commonMain}/kotlin/dev/androidbroadcast/common/AppDispatchers.kt (100%)
 create mode 100644 core/common/src/commonMain/kotlin/dev/androidbroadcast/common/Logger.kt
 rename core/data/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/data/ArticlesRepository.kt (100%)
 rename core/data/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/data/Mappers.kt (100%)
 rename core/data/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/data/MergeStrategy.kt (100%)
 rename core/data/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/data/RequestResult.kt (100%)
 rename core/data/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/data/model/Article.kt (100%)
 rename core/database/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/database/NewsRoomDatabase.kt (100%)
 rename core/database/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/database/dao/ArticleDao.kt (100%)
 rename core/database/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/database/models/ArticleDBO.kt (100%)
 rename core/database/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/database/utils/Converters.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/NewsApi.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/models/ArticleDTO.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/models/Language.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/models/ResponseDTO.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/models/SortBy.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/models/SourceDTO.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/utils/DateTimeUTCSerializer.kt (100%)
 rename core/opennews-api/src/{main/java => jvmMain/kotlin}/dev/androidbroadcast/newsapi/utils/NewsApiKeyInterceptor.kt (100%)
 rename core/uikit/src/{main => commonMain}/kotlin/dev/androidbroadcast/news/Color.kt (100%)
 rename core/uikit/src/{main => commonMain}/kotlin/dev/androidbroadcast/news/Theme.kt (100%)
 rename core/uikit/src/{main => commonMain}/kotlin/dev/androidbroadcast/news/Type.kt (100%)
 delete mode 100644 core/uikit/src/main/AndroidManifest.xml
 rename features/news-main/ui/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt (98%)
 rename features/news-main/ui/src/{main => androidMain}/kotlin/dev/androidbroadcast/news/main/NewsMainFeatureUI.kt (100%)
 rename features/news-main/ui/src/{main => androidMain}/res/values/strings.xml (100%)
 delete mode 100644 features/news-main/ui/src/main/AndroidManifest.xml

diff --git a/build.gradle.kts b/build.gradle.kts
index 04d4756..979d646 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -15,6 +15,8 @@ plugins {
     alias(libs.plugins.android.test) apply false
     alias(libs.plugins.baselineprofile) apply false
     alias(libs.plugins.compose.compiler) apply false
+    alias(libs.plugins.jetbrainsCompose) apply false
+    alias(libs.plugins.kotlinMultiplatform) apply false
 }
 
 // TODO Replace Detekt Gradle with terminal launch
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
index 63f85cd..5601063 100644
--- a/core/common/build.gradle.kts
+++ b/core/common/build.gradle.kts
@@ -1,12 +1,33 @@
+@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
+
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
 import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
 
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
 }
 
 kotlin {
     explicitApi = ExplicitApiMode.Strict
+
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+            implementation(libs.kotlinx.coroutines.core)
+            api(libs.kotlinx.immutable)
+        }
+
+        androidMain.dependencies {
+            implementation(libs.androidx.core.ktx)
+        }
+    }
 }
 
 android {
@@ -21,14 +42,4 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
-
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
-}
-
-dependencies {
-    implementation(libs.androidx.core.ktx)
-    implementation(libs.kotlinx.coroutines.core)
-    api(libs.kotlinx.immutable)
 }
diff --git a/core/common/src/main/kotlin/dev/androidbroadcast/common/Logger.kt b/core/common/src/androidMain/kotlin/dev/androidbroadcast/common/AndroidLogcatLogger.kt
similarity index 70%
rename from core/common/src/main/kotlin/dev/androidbroadcast/common/Logger.kt
rename to core/common/src/androidMain/kotlin/dev/androidbroadcast/common/AndroidLogcatLogger.kt
index f771a33..d45ebe9 100644
--- a/core/common/src/main/kotlin/dev/androidbroadcast/common/Logger.kt
+++ b/core/common/src/androidMain/kotlin/dev/androidbroadcast/common/AndroidLogcatLogger.kt
@@ -2,18 +2,6 @@ package dev.androidbroadcast.common
 
 import android.util.Log
 
-public interface Logger {
-    public fun d(
-        tag: String,
-        message: String
-    )
-
-    public fun e(
-        tag: String,
-        message: String
-    )
-}
-
 public fun AndroidLogcatLogger(): Logger =
     object : Logger {
         override fun d(
diff --git a/core/common/src/main/kotlin/dev/androidbroadcast/common/AppDispatchers.kt b/core/common/src/commonMain/kotlin/dev/androidbroadcast/common/AppDispatchers.kt
similarity index 100%
rename from core/common/src/main/kotlin/dev/androidbroadcast/common/AppDispatchers.kt
rename to core/common/src/commonMain/kotlin/dev/androidbroadcast/common/AppDispatchers.kt
diff --git a/core/common/src/commonMain/kotlin/dev/androidbroadcast/common/Logger.kt b/core/common/src/commonMain/kotlin/dev/androidbroadcast/common/Logger.kt
new file mode 100644
index 0000000..a9429f2
--- /dev/null
+++ b/core/common/src/commonMain/kotlin/dev/androidbroadcast/common/Logger.kt
@@ -0,0 +1,13 @@
+package dev.androidbroadcast.common
+
+public interface Logger {
+    public fun d(
+        tag: String,
+        message: String
+    )
+
+    public fun e(
+        tag: String,
+        message: String
+    )
+}
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
index 3c0d52e..22951e8 100644
--- a/core/data/build.gradle.kts
+++ b/core/data/build.gradle.kts
@@ -1,12 +1,34 @@
 import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
 
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
 }
 
 kotlin {
     explicitApi = ExplicitApiMode.Strict
+
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+            implementation(libs.kotlinx.coroutines.core)
+            implementation(projects.core.common)
+            implementation(projects.core.database)
+            implementation(projects.core.opennewsApi)
+        }
+
+        androidMain.dependencies {
+            implementation(libs.kotlinx.coroutines.android)
+            implementation(libs.androidx.core.ktx)
+            implementation(libs.javax.inject)
+        }
+    }
 }
 
 android {
@@ -21,19 +43,4 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
-
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
-}
-
-dependencies {
-    implementation(libs.androidx.core.ktx)
-    implementation(libs.kotlinx.coroutines.android)
-
-    implementation(projects.core.database)
-    implementation(projects.core.opennewsApi)
-    implementation(projects.core.common)
-
-    implementation(libs.javax.inject)
 }
diff --git a/core/data/src/main/kotlin/dev/androidbroadcast/news/data/ArticlesRepository.kt b/core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/ArticlesRepository.kt
similarity index 100%
rename from core/data/src/main/kotlin/dev/androidbroadcast/news/data/ArticlesRepository.kt
rename to core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/ArticlesRepository.kt
diff --git a/core/data/src/main/kotlin/dev/androidbroadcast/news/data/Mappers.kt b/core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/Mappers.kt
similarity index 100%
rename from core/data/src/main/kotlin/dev/androidbroadcast/news/data/Mappers.kt
rename to core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/Mappers.kt
diff --git a/core/data/src/main/kotlin/dev/androidbroadcast/news/data/MergeStrategy.kt b/core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/MergeStrategy.kt
similarity index 100%
rename from core/data/src/main/kotlin/dev/androidbroadcast/news/data/MergeStrategy.kt
rename to core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/MergeStrategy.kt
diff --git a/core/data/src/main/kotlin/dev/androidbroadcast/news/data/RequestResult.kt b/core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/RequestResult.kt
similarity index 100%
rename from core/data/src/main/kotlin/dev/androidbroadcast/news/data/RequestResult.kt
rename to core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/RequestResult.kt
diff --git a/core/data/src/main/kotlin/dev/androidbroadcast/news/data/model/Article.kt b/core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/model/Article.kt
similarity index 100%
rename from core/data/src/main/kotlin/dev/androidbroadcast/news/data/model/Article.kt
rename to core/data/src/androidMain/kotlin/dev/androidbroadcast/news/data/model/Article.kt
diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts
index 7581131..2d85812 100644
--- a/core/database/build.gradle.kts
+++ b/core/database/build.gradle.kts
@@ -1,10 +1,33 @@
+@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
+
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
     alias(libs.plugins.ksp)
     alias(libs.plugins.androidx.room)
 }
 
+kotlin {
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+        }
+
+        androidMain.dependencies {
+            implementation(libs.androidx.core.ktx)
+            implementation(libs.androidx.room.ktx)
+        }
+    }
+}
+
 android {
     namespace = "dev.androidbroadcast.news.database"
     compileSdk = 34
@@ -22,9 +45,6 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
 }
 
 room {
@@ -32,7 +52,5 @@ room {
 }
 
 dependencies {
-    implementation(libs.androidx.core.ktx)
     ksp(libs.androidx.room.compiler)
-    implementation(libs.androidx.room.ktx)
 }
diff --git a/core/database/src/main/kotlin/dev/androidbroadcast/news/database/NewsRoomDatabase.kt b/core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/NewsRoomDatabase.kt
similarity index 100%
rename from core/database/src/main/kotlin/dev/androidbroadcast/news/database/NewsRoomDatabase.kt
rename to core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/NewsRoomDatabase.kt
diff --git a/core/database/src/main/kotlin/dev/androidbroadcast/news/database/dao/ArticleDao.kt b/core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/dao/ArticleDao.kt
similarity index 100%
rename from core/database/src/main/kotlin/dev/androidbroadcast/news/database/dao/ArticleDao.kt
rename to core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/dao/ArticleDao.kt
diff --git a/core/database/src/main/kotlin/dev/androidbroadcast/news/database/models/ArticleDBO.kt b/core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/models/ArticleDBO.kt
similarity index 100%
rename from core/database/src/main/kotlin/dev/androidbroadcast/news/database/models/ArticleDBO.kt
rename to core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/models/ArticleDBO.kt
diff --git a/core/database/src/main/kotlin/dev/androidbroadcast/news/database/utils/Converters.kt b/core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/utils/Converters.kt
similarity index 100%
rename from core/database/src/main/kotlin/dev/androidbroadcast/news/database/utils/Converters.kt
rename to core/database/src/androidMain/kotlin/dev/androidbroadcast/news/database/utils/Converters.kt
diff --git a/core/opennews-api/build.gradle.kts b/core/opennews-api/build.gradle.kts
index 9028b79..41ab101 100644
--- a/core/opennews-api/build.gradle.kts
+++ b/core/opennews-api/build.gradle.kts
@@ -1,21 +1,29 @@
 plugins {
-    alias(libs.plugins.jetbrainsKotlinJvm)
     alias(libs.plugins.kotlinSerialization)
-    alias(libs.plugins.kapt)
+    alias(libs.plugins.kotlinMultiplatform)
+    // KAPT не поддерживает KMP
+}
+
+kotlin {
+    jvm()
+
+    sourceSets {
+        commonMain.dependencies {
+            implementation(libs.kotlinx.coroutines.core)
+            api(libs.kotlinx.serialization.json)
+        }
+
+        jvmMain.dependencies {
+            implementation(libs.retrofit)
+            implementation(libs.androidx.annotation)
+            implementation(libs.retrofit.converter.kotlinx.serialization)
+            implementation(libs.retrofit.adapters.result)
+            api(libs.okhttp)
+        }
+    }
 }
 
 java {
     sourceCompatibility = JavaVersion.VERSION_17
     targetCompatibility = JavaVersion.VERSION_17
 }
-
-dependencies {
-    implementation(libs.retrofit)
-    implementation(libs.kotlinx.coroutines.core)
-    api(libs.kotlinx.serialization.json)
-    implementation(libs.androidx.annotation)
-    implementation(libs.retrofit.converter.kotlinx.serialization)
-    implementation(libs.retrofit.adapters.result)
-    api(libs.okhttp)
-    kapt(libs.retrofit.responseTypeKeeper)
-}
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/NewsApi.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/NewsApi.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/NewsApi.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/NewsApi.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/ArticleDTO.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/ArticleDTO.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/ArticleDTO.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/ArticleDTO.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/Language.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/Language.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/Language.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/Language.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/ResponseDTO.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/ResponseDTO.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/ResponseDTO.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/ResponseDTO.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/SortBy.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/SortBy.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/SortBy.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/SortBy.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/SourceDTO.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/SourceDTO.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/models/SourceDTO.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/models/SourceDTO.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/utils/DateTimeUTCSerializer.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/utils/DateTimeUTCSerializer.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/utils/DateTimeUTCSerializer.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/utils/DateTimeUTCSerializer.kt
diff --git a/core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/utils/NewsApiKeyInterceptor.kt b/core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/utils/NewsApiKeyInterceptor.kt
similarity index 100%
rename from core/opennews-api/src/main/java/dev/androidbroadcast/newsapi/utils/NewsApiKeyInterceptor.kt
rename to core/opennews-api/src/jvmMain/kotlin/dev/androidbroadcast/newsapi/utils/NewsApiKeyInterceptor.kt
diff --git a/core/uikit/build.gradle.kts b/core/uikit/build.gradle.kts
index 6096e69..f3b1c72 100644
--- a/core/uikit/build.gradle.kts
+++ b/core/uikit/build.gradle.kts
@@ -1,7 +1,41 @@
+@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
+
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
     alias(libs.plugins.compose.compiler)
+    alias(libs.plugins.jetbrainsCompose)
+    alias(libs.plugins.detekt)
+}
+
+kotlin {
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+            api(compose.ui)
+            api(compose.runtime)
+            api(compose.foundation)
+            api(compose.material3)
+            implementation(compose.components.uiToolingPreview)
+        }
+
+        androidMain.dependencies {
+            implementation(libs.androidx.core.ktx)
+            // Need only for debug
+            implementation(libs.androidx.compose.ui.tooling)
+            // Need only for debug
+            implementation(libs.androidx.compose.ui.test.manifest)
+            implementation(project.dependencies.platform(libs.androidx.compose.bom))
+        }
+    }
 }
 
 android {
@@ -16,20 +50,4 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
-
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
-}
-
-dependencies {
-    implementation(libs.androidx.core.ktx)
-    implementation(platform(libs.androidx.compose.bom))
-    api(libs.androidx.compose.ui)
-    api(libs.androidx.compose.ui.graphics)
-    api(libs.androidx.compose.ui.tooling.preview)
-    api(libs.androidx.compose.runtime)
-    api(libs.androidx.material3)
-    debugApi(libs.androidx.compose.ui.tooling)
-    debugApi(libs.androidx.compose.ui.test.manifest)
 }
diff --git a/core/uikit/src/main/kotlin/dev/androidbroadcast/news/Color.kt b/core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Color.kt
similarity index 100%
rename from core/uikit/src/main/kotlin/dev/androidbroadcast/news/Color.kt
rename to core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Color.kt
diff --git a/core/uikit/src/main/kotlin/dev/androidbroadcast/news/Theme.kt b/core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Theme.kt
similarity index 100%
rename from core/uikit/src/main/kotlin/dev/androidbroadcast/news/Theme.kt
rename to core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Theme.kt
diff --git a/core/uikit/src/main/kotlin/dev/androidbroadcast/news/Type.kt b/core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Type.kt
similarity index 100%
rename from core/uikit/src/main/kotlin/dev/androidbroadcast/news/Type.kt
rename to core/uikit/src/commonMain/kotlin/dev/androidbroadcast/news/Type.kt
diff --git a/core/uikit/src/main/AndroidManifest.xml b/core/uikit/src/main/AndroidManifest.xml
deleted file mode 100644
index 44008a4..0000000
--- a/core/uikit/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest>
-
-</manifest>
\ No newline at end of file
diff --git a/features/news-main/ui-logic/build.gradle.kts b/features/news-main/ui-logic/build.gradle.kts
index de790d3..72e7e20 100644
--- a/features/news-main/ui-logic/build.gradle.kts
+++ b/features/news-main/ui-logic/build.gradle.kts
@@ -1,18 +1,48 @@
+@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
+
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
 import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
 
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
     alias(libs.plugins.dagger.hilt.android)
     alias(libs.plugins.kapt)
+    // Dagger Hilt нужно будет менять на мультиплатформенное решение
 }
 
 kotlin {
     explicitApi = ExplicitApiMode.Strict
+
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+            implementation(libs.kotlinx.coroutines.core)
+            api(libs.kotlinx.immutable)
+            api(projects.core.data)
+        }
+
+        androidMain.dependencies {
+            implementation(libs.androidx.core.ktx)
+            implementation(libs.androidx.lifecycle.runtime.ktx)
+            implementation(libs.androidx.lifecycle.viewmodel.ktx)
+
+            implementation(libs.kotlinx.coroutines.android)
+
+            compileOnly(libs.androidx.compose.runtime)
+            implementation(libs.dagger.hilt.android)
+        }
+    }
 }
 
 android {
-    namespace = "dev.androidbroadcast.news.main"
+    namespace = "dev.androidbroadcast.news.main.uilogic"
     compileSdk = libs.versions.androidSdk.compile.get().toInt()
 
     defaultConfig {
@@ -24,24 +54,8 @@ android {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
     }
-
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
 }
 
 dependencies {
-    implementation(libs.androidx.core.ktx)
-    implementation(libs.androidx.lifecycle.runtime.ktx)
-    implementation(libs.androidx.lifecycle.viewmodel.ktx)
-
-    implementation(libs.kotlinx.coroutines.android)
-
-    compileOnly(libs.androidx.compose.runtime)
-    api(libs.kotlinx.immutable)
-
-    api(projects.core.data)
-
-    implementation(libs.dagger.hilt.android)
-    kapt(libs.dagger.hilt.compiler)
+    "kapt"(libs.dagger.hilt.compiler)
 }
diff --git a/features/news-main/ui/build.gradle.kts b/features/news-main/ui/build.gradle.kts
index 9b52920..4a6493b 100644
--- a/features/news-main/ui/build.gradle.kts
+++ b/features/news-main/ui/build.gradle.kts
@@ -1,20 +1,58 @@
+@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
+
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
+import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
 plugins {
     alias(libs.plugins.androidLibrary)
-    alias(libs.plugins.jetbrainsKotlinAndroid)
+    alias(libs.plugins.kotlinMultiplatform)
+    alias(libs.plugins.compose.compiler)
+    alias(libs.plugins.jetbrainsCompose)
+    alias(libs.plugins.detekt)
     alias(libs.plugins.dagger.hilt.android)
     alias(libs.plugins.kapt)
-    alias(libs.plugins.compose.compiler)
+}
+
+kotlin {
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
+    }
+
+    sourceSets  {
+        commonMain.dependencies {
+            implementation(libs.kotlinx.coroutines.core)
+            implementation(projects.features.newsMain.uiLogic)
+            implementation(projects.core.common)
+            implementation(libs.coil.compose)
+            implementation(projects.core.uikit)
+        }
+
+        androidMain.dependencies {
+            implementation(libs.androidx.core.ktx)
+            implementation(libs.androidx.lifecycle.runtime.ktx)
+            implementation(libs.androidx.activity.compose)
+
+            implementation(libs.androidx.lifecycle.viewmodel.ktx)
+            implementation(libs.androidx.lifecycle.viewmodel.compose)
+
+            implementation(libs.kotlinx.coroutines.android)
+
+            implementation(libs.dagger.hilt.android)
+
+            implementation(project.dependencies.platform(libs.androidx.compose.bom))
+        }
+    }
 }
 
 android {
-    namespace = "dev.androidbroadcast.news.main"
+    namespace = "dev.androidbroadcast.news.main.ui"
     compileSdk = libs.versions.androidSdk.compile.get().toInt()
 
     defaultConfig {
         minSdk = libs.versions.androidSdk.min.get().toInt()
-
-        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
-        consumerProguardFiles("consumer-rules.pro")
     }
 
     compileOptions {
@@ -22,10 +60,6 @@ android {
         targetCompatibility = JavaVersion.VERSION_1_8
     }
 
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
-
     buildFeatures {
         compose = true
     }
@@ -33,28 +67,11 @@ android {
 
 composeCompiler {
     enableStrongSkippingMode = true
-
     reportsDestination = layout.buildDirectory.dir("compose_compiler")
 }
 
 dependencies {
-    implementation(platform(libs.androidx.compose.bom))
-
-    implementation(libs.androidx.core.ktx)
-    implementation(libs.androidx.lifecycle.runtime.ktx)
-    implementation(libs.androidx.activity.compose)
-
-    implementation(libs.androidx.lifecycle.viewmodel.ktx)
-    implementation(libs.androidx.lifecycle.viewmodel.compose)
-
-    implementation(libs.kotlinx.coroutines.android)
-
-    implementation(projects.features.newsMain.uiLogic)
-    implementation(projects.core.uikit)
-
-    implementation(libs.dagger.hilt.android)
-    kapt(libs.dagger.hilt.compiler)
-
-    implementation(libs.coil.compose)
-    implementation(projects.core.common)
+    "kapt"(libs.dagger.hilt.compiler)
+    debugImplementation(libs.androidx.compose.ui.tooling)
+    debugImplementation(libs.androidx.compose.ui.tooling.preview)
 }
diff --git a/features/news-main/ui/src/main/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt b/features/news-main/ui/src/androidMain/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt
similarity index 98%
rename from features/news-main/ui/src/main/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt
rename to features/news-main/ui/src/androidMain/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt
index 2ebfc81..b999cfa 100644
--- a/features/news-main/ui/src/main/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt
+++ b/features/news-main/ui/src/androidMain/kotlin/dev/androidbroadcast/news/main/ArticleListContent.kt
@@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.compose.AsyncImagePainter
 import dev.androidbroadcast.news.NewsTheme
+import dev.androidbroadcast.news.main.ui.R
 
 @Composable
 internal fun ArticleList(
diff --git a/features/news-main/ui/src/main/kotlin/dev/androidbroadcast/news/main/NewsMainFeatureUI.kt b/features/news-main/ui/src/androidMain/kotlin/dev/androidbroadcast/news/main/NewsMainFeatureUI.kt
similarity index 100%
rename from features/news-main/ui/src/main/kotlin/dev/androidbroadcast/news/main/NewsMainFeatureUI.kt
rename to features/news-main/ui/src/androidMain/kotlin/dev/androidbroadcast/news/main/NewsMainFeatureUI.kt
diff --git a/features/news-main/ui/src/main/res/values/strings.xml b/features/news-main/ui/src/androidMain/res/values/strings.xml
similarity index 100%
rename from features/news-main/ui/src/main/res/values/strings.xml
rename to features/news-main/ui/src/androidMain/res/values/strings.xml
diff --git a/features/news-main/ui/src/main/AndroidManifest.xml b/features/news-main/ui/src/main/AndroidManifest.xml
deleted file mode 100644
index 44008a4..0000000
--- a/features/news-main/ui/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest>
-
-</manifest>
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 0e06c65..dc67530 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -21,6 +21,7 @@ ksp = "2.0.0-1.0.21"
 dagger = "2.51.1"
 javax-inject = "1"
 okhttp = "4.12.0"
+# Используем альфа версию Coil т.к. она поддерживает KMP
 coil = "2.6.0"
 detekt = "1.23.6"
 uiautomator = "2.3.0"
@@ -32,6 +33,7 @@ androidSdk-min = "24"
 androidSdk-compile = "34"
 kotlinx-immutable = "0.3.7"
 compose-rules = "0.4.3"
+compose-plugin = "1.6.11"
 
 [libraries]
 androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -108,3 +110,5 @@ detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
 android-test = { id = "com.android.test", version.ref = "agp" }
 baselineprofile = { id = "androidx.baselineprofile", version.ref = "baselineprofile" }
 compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
+jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
+kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }