diff --git a/.gitignore b/.gitignore
index bd6785e4..e599ccf5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,5 @@
/captures
.externalNativeBuild
.cxx
+.kotlin
local.properties
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
deleted file mode 100644
index 4292f07d..00000000
--- a/app/build.gradle.kts
+++ /dev/null
@@ -1,31 +0,0 @@
-@file:Suppress("UnstableApiUsage")
-
-plugins {
- id("com.streamplayer.application")
-}
-
-dependencies {
- implementation(projects.featureFavorites)
- implementation(projects.featureListStreams)
- implementation(projects.featureProfile)
- implementation(projects.coreShared)
- implementation(projects.coreSharedUi)
- implementation(projects.coreNavigation)
- implementation(projects.coreNetworking)
- implementation(projects.coreLocalStorage)
-
- implementation(platform(libs.compose.bom))
- androidTestImplementation(platform(libs.compose.bom))
-
- implementation(libs.bundles.koin)
- implementation(libs.bundles.androidSupport)
- implementation(libs.bundles.compose)
- implementation(libs.bundles.kotlin)
-
- implementation(libs.lottie)
- implementation(libs.lottie)
- testImplementation(libs.bundles.test)
-
- // Kover - Combined report
- rootProject.subprojects.forEach { kover(it) }
-}
\ No newline at end of file
diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml
deleted file mode 100644
index fa0f996d..00000000
--- a/app/src/main/res/xml/backup_rules.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml
deleted file mode 100644
index 9ee9997b..00000000
--- a/app/src/main/res/xml/data_extraction_rules.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/test/java/com/codandotv/streamplayerapp/ExampleUnitTest.kt b/app/src/test/java/com/codandotv/streamplayerapp/ExampleUnitTest.kt
deleted file mode 100644
index e83e0c8a..00000000
--- a/app/src/test/java/com/codandotv/streamplayerapp/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.codandotv.streamplayerapp
-
-import org.junit.Test
-
-import org.junit.Assert.assertEquals
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file
diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts
index eaf67121..8377f141 100644
--- a/build-logic/build.gradle.kts
+++ b/build-logic/build.gradle.kts
@@ -6,8 +6,10 @@ plugins {
}
repositories {
- mavenCentral()
google()
+ mavenCentral()
+ gradlePluginPortal()
+ maven(url = "https://plugins.gradle.org/m2/")
}
dependencies {
@@ -15,4 +17,6 @@ dependencies {
implementation(libs.kotlin.gradle.plugin)
implementation(libs.kover.gradle.plugin)
implementation(libs.detekt.gradle.plugin)
+ implementation(libs.serialization)
+ implementation(libs.com.google.devtools.ksp.gradle.plugin)
}
\ No newline at end of file
diff --git a/build-logic/src/main/java/Config.kt b/build-logic/src/main/java/Config.kt
index 2ba49cd2..2bcfd844 100644
--- a/build-logic/src/main/java/Config.kt
+++ b/build-logic/src/main/java/Config.kt
@@ -1,5 +1,6 @@
object Config {
- const val applicationId = "com.codandotv.streamplayerapp"
+ const val appName = "streamplayerapp"
+ const val applicationId = "com.codandotv.$appName"
const val compileSdkVersion = 34
const val minSdkVersion = 24
const val targetSdkVersion = 34
@@ -8,17 +9,13 @@ object Config {
const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
object BuildField {
- const val host_debug = "\"https://api.themoviedb.org/3/\""
- const val host_release = "\"https://api.themoviedb.org/3/\""
- const val api_profile_debug = "\"https://demo3364084.mockable.io/\""
- const val api_profile_release = "\"https://demo3364084.mockable.io/\""
+ const val host = "https://api.themoviedb.org/3/"
+ const val api_profile = "https://demo3364084.mockable.io/"
private const val tmdb_token_name_debug = "TMDB_BEARER_TOKEN_DEBUG"
- private const val tmdb_token_name_release = "TMDB_BEARER_TOKEN_RELEASE"
private const val bearear_without_environment = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJiNDg2NWM4YTAzNzhmM2I4NjI0OWU1ZjNiYWFiMjU2NyIsInN1YiI6IjY0Mjk4YTg5YTNlNGJhMWM0NDgzM2U4OCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.9cIxv29vkaZ2yW88DIFRUFK_nXbK2b6KS8t96kA8WAE"
- val api_bearer_debug = "\"Bearer ${System.getenv(tmdb_token_name_debug) ?: bearear_without_environment}\""
- val api_bearer_release = "\"Bearer ${System.getenv(tmdb_token_name_release) ?: bearear_without_environment}\""
+ val api_bearer = System.getenv(tmdb_token_name_debug) ?: bearear_without_environment
}
}
\ No newline at end of file
diff --git a/build-logic/src/main/java/Keys.kt b/build-logic/src/main/java/Keys.kt
deleted file mode 100644
index 4475b22e..00000000
--- a/build-logic/src/main/java/Keys.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-object Keys {
- private const val default_tmdb_token = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJiNDg2NWM4YTAzNzhmM2I4NjI0OWU1ZjNiYWFiMjU2NyIsInN1YiI6IjY0Mjk4YTg5YTNlNGJhMWM0NDgzM2U4OCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.9cIxv29vkaZ2yW88DIFRUFK_nXbK2b6KS8t96kA8WAE"
- private const val tmdb_token_name_debug = "TMDB_BEARER_TOKEN_DEBUG"
- private const val tmdb_token_name_release = "TMDB_BEARER_TOKEN_RELEASE"
-
- object BuildField {
- val api_bearer_debug =
- "\"Bearer ${System.getenv(tmdb_token_name_debug) ?: default_tmdb_token}\""
- val api_bearer_release =
- "\"Bearer ${System.getenv(tmdb_token_name_release) ?: default_tmdb_token}\""
- }
-}
\ No newline at end of file
diff --git a/build-logic/src/main/java/com.streamplayer.application.gradle.kts b/build-logic/src/main/java/com.streamplayer.application.gradle.kts
index e5af04a1..3c0fac6e 100644
--- a/build-logic/src/main/java/com.streamplayer.application.gradle.kts
+++ b/build-logic/src/main/java/com.streamplayer.application.gradle.kts
@@ -2,16 +2,18 @@
import extensions.dokkaPlugin
import extensions.getLibrary
+import extensions.iosTarget
import extensions.setupAndroidDefaultConfig
import extensions.setupCompileOptions
-import extensions.setupCompose
import extensions.setupPackingOptions
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
val libs: VersionCatalog = extensions.getByType().named("libs")
plugins {
id("com.android.application")
- id("kotlin-android")
+ id("org.jetbrains.kotlin.multiplatform")
id("kotlin-kapt")
id("kotlin-parcelize")
id("com.streamplayer.dokka")
@@ -20,6 +22,16 @@ plugins {
}
val catalog: VersionCatalog = extensions.getByType().named("libs")
+kotlin {
+ androidTarget {
+ @OptIn(ExperimentalKotlinGradlePluginApi::class)
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_17)
+ }
+ }
+
+ iosTarget()
+}
android {
namespace = Config.applicationId
@@ -27,7 +39,6 @@ android {
setupCompileOptions()
setupPackingOptions()
setupAndroidDefaultConfig()
- setupCompose(catalog)
defaultConfig {
applicationId = Config.applicationId
diff --git a/build-logic/src/main/java/com.streamplayer.compose.gradle.kts b/build-logic/src/main/java/com.streamplayer.compose.gradle.kts
deleted file mode 100644
index c6542e3e..00000000
--- a/build-logic/src/main/java/com.streamplayer.compose.gradle.kts
+++ /dev/null
@@ -1,22 +0,0 @@
-@file:Suppress("UnstableApiUsage")
-import extensions.getBundle
-import extensions.getLibrary
-import extensions.setupCompose
-
-plugins {
- id("com.streamplayer.android-library")
-}
-
-val libs: VersionCatalog = extensions.getByType().named("libs")
-
-android {
- setupCompose(libs)
-}
-
-dependencies {
- implementation(platform(libs.getLibrary("compose.bom")))
- androidTestImplementation(platform(libs.getLibrary("compose.bom")))
-
- implementation(libs.getBundle("compose"))
- debugImplementation(libs.getLibrary("compose.ui.tooling"))
-}
\ No newline at end of file
diff --git a/build-logic/src/main/java/com.streamplayer.android-library.gradle.kts b/build-logic/src/main/java/com.streamplayer.kmp-library.gradle.kts
similarity index 71%
rename from build-logic/src/main/java/com.streamplayer.android-library.gradle.kts
rename to build-logic/src/main/java/com.streamplayer.kmp-library.gradle.kts
index 6b0ea5af..5d5d4c7b 100644
--- a/build-logic/src/main/java/com.streamplayer.android-library.gradle.kts
+++ b/build-logic/src/main/java/com.streamplayer.kmp-library.gradle.kts
@@ -2,16 +2,20 @@
import extensions.dokkaPlugin
import extensions.getLibrary
+import extensions.iosTarget
import extensions.setupAndroidDefaultConfig
import extensions.setupCompileOptions
import extensions.setupNameSpace
import extensions.setupPackingOptions
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
-val libs: VersionCatalog = extensions.getByType().named("libs")
+val libs: VersionCatalog = extensions.getByType().named("libs")
plugins {
+ id("org.jetbrains.kotlin.multiplatform")
id("com.android.library")
- id("kotlin-android")
+ id("org.jetbrains.kotlin.plugin.serialization")
id("kotlin-kapt")
id("kotlin-parcelize")
id("com.streamplayer.dokka")
@@ -19,6 +23,17 @@ plugins {
id("com.streamplayer.detekt")
}
+kotlin {
+ androidTarget {
+ @OptIn(ExperimentalKotlinGradlePluginApi::class)
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_17)
+ }
+ }
+
+ iosTarget()
+}
+
android {
setupNameSpace(project)
@@ -44,4 +59,4 @@ android {
dependencies {
dokkaPlugin(libs.getLibrary("dokka"))
-}
\ No newline at end of file
+}
diff --git a/build-logic/src/main/java/extensions/CommonExtensions.kt b/build-logic/src/main/java/extensions/CommonExtensions.kt
index 84543ee2..88e2b69b 100644
--- a/build-logic/src/main/java/extensions/CommonExtensions.kt
+++ b/build-logic/src/main/java/extensions/CommonExtensions.kt
@@ -7,8 +7,8 @@ import com.android.build.api.dsl.CommonExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
-import org.gradle.api.plugins.ExtensionAware
-import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.getByType
internal fun CommonExtension<*, *, *, *, *>.setupPackingOptions() {
packaging {
@@ -41,33 +41,8 @@ internal fun CommonExtension<*, *, *, *, *>.setupCompileOptions() {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
-
- kotlinOptions {
- jvmTarget = "17"
- }
-}
-
-fun CommonExtension<*, *, *, *, *>.setupCompose(catalog: VersionCatalog) {
- buildFeatures {
- compose = true
- buildConfig = true
- }
-
- composeOptions {
- kotlinCompilerExtensionVersion = "${catalog.getVersion("compose")}"
- }
-
- packaging {
- resources {
- excludes.apply {
- add("META-INF/AL2.0")
- add("META-INF/LGPL2.1")
- }
- }
- }
}
-
internal fun CommonExtension<*, *, *, *, *>.setupNameSpace(project: Project) {
val moduleName = project.displayName
.removePrefix("project ")
@@ -76,8 +51,12 @@ internal fun CommonExtension<*, *, *, *, *>.setupNameSpace(project: Project) {
.replace("-", ".")
namespace = "${Config.applicationId}$moduleName"
-}
-private fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
- (this as ExtensionAware).extensions.configure("kotlinOptions", block)
+ println(">>>> $namespace")
}
+
+internal val Project.libs: VersionCatalog
+ get() {
+ return project.extensions.getByType()
+ .named("libs")
+ }
\ No newline at end of file
diff --git a/build-logic/src/main/java/extensions/KotlinMultiPlatformExt.kt b/build-logic/src/main/java/extensions/KotlinMultiPlatformExt.kt
new file mode 100644
index 00000000..bd263ef0
--- /dev/null
+++ b/build-logic/src/main/java/extensions/KotlinMultiPlatformExt.kt
@@ -0,0 +1,17 @@
+package extensions
+
+import Config
+import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
+
+fun KotlinMultiplatformExtension.iosTarget() {
+ listOf(
+ iosX64(),
+ iosArm64(),
+ iosSimulatorArm64()
+ ).forEach { iosTarget ->
+ iosTarget.binaries.framework {
+ baseName = Config.appName
+ isStatic = true
+ }
+ }
+}
diff --git a/build-logic/src/main/java/extensions/VersionCatalog.kt b/build-logic/src/main/java/extensions/VersionCatalog.kt
index ee317e56..fcfdaf10 100644
--- a/build-logic/src/main/java/extensions/VersionCatalog.kt
+++ b/build-logic/src/main/java/extensions/VersionCatalog.kt
@@ -6,3 +6,11 @@ internal fun VersionCatalog.getLibrary(library: String) = findLibrary(library).g
internal fun VersionCatalog.getVersion(library: String) = findVersion(library).get()
internal fun VersionCatalog.getBundle(bundle: String) = findBundle(bundle).get()
+internal fun VersionCatalog.koinCoreDependency() = findLibrary("koin_core").get()
+
+internal fun VersionCatalog.koinAnnotationsDependency() = findLibrary("koin_annotations").get()
+
+internal fun VersionCatalog.koinComposeDependency() = findLibrary("koin_compose").get()
+
+internal fun VersionCatalog.koinCompiler() = findLibrary("koin_ksp_compiler").get()
+
diff --git a/build.gradle.kts b/build.gradle.kts
index df8846e7..4e1f6f7b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,9 +5,14 @@ plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false
+ alias(libs.plugins.serialization) apply false
+ alias(libs.plugins.kotlin.multiplatform) apply false
+ alias(libs.plugins.jetbrains.compose) apply false
+ alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.ksp) apply false
alias(libs.plugins.dokka) apply false
alias(libs.plugins.kover) apply false
+ alias(libs.plugins.buildkonfig.plugin) apply false
}
tasks.register("clean", Delete::class) {
diff --git a/app/.gitignore b/composeApp/.gitignore
similarity index 100%
rename from app/.gitignore
rename to composeApp/.gitignore
diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts
new file mode 100644
index 00000000..183dc9ad
--- /dev/null
+++ b/composeApp/build.gradle.kts
@@ -0,0 +1,41 @@
+@file:Suppress("UnstableApiUsage")
+
+plugins {
+ id("com.streamplayer.application")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
+}
+kotlin {
+ sourceSets {
+ androidMain.dependencies {
+ implementation(libs.koin.android)
+ }
+ commonMain.dependencies {
+ implementation(projects.featureListStreams)
+ implementation(projects.featureDetail)
+ implementation(projects.featureSearch)
+ implementation(projects.featureProfile)
+ implementation(projects.coreShared)
+ implementation(projects.coreSharedUi)
+ implementation(projects.coreNavigation)
+ implementation(projects.coreNetworking)
+ implementation(projects.coreLocalStorage)
+
+ implementation(libs.navigation.compose)
+
+ implementation(compose.material3)
+ implementation(compose.ui)
+ implementation(compose.preview)
+
+ implementation(libs.lottie)
+
+ implementation(libs.koin.core)
+ implementation(libs.koin.compose)
+ }
+ }
+}
+
+dependencies {
+ // Kover - Combined report
+ rootProject.subprojects.forEach { kover(it) }
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/composeApp/proguard-rules.pro
similarity index 100%
rename from app/proguard-rules.pro
rename to composeApp/proguard-rules.pro
diff --git a/app/src/main/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml
similarity index 72%
rename from app/src/main/AndroidManifest.xml
rename to composeApp/src/androidMain/AndroidManifest.xml
index 43b331ce..80a3280c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/composeApp/src/androidMain/AndroidManifest.xml
@@ -3,16 +3,14 @@
+ android:name=".CustomApplication">
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/CustomApplication.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/CustomApplication.kt
similarity index 100%
rename from app/src/main/java/com/codandotv/streamplayerapp/CustomApplication.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/CustomApplication.kt
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/MainActivity.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/MainActivity.kt
similarity index 100%
rename from app/src/main/java/com/codandotv/streamplayerapp/MainActivity.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/MainActivity.kt
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/di/AppModule.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/di/AppModule.kt
similarity index 100%
rename from app/src/main/java/com/codandotv/streamplayerapp/di/AppModule.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/di/AppModule.kt
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/navigation/NavigationGraph.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/navigation/NavigationGraph.kt
similarity index 81%
rename from app/src/main/java/com/codandotv/streamplayerapp/navigation/NavigationGraph.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/navigation/NavigationGraph.kt
index b8df253a..23d9c4cc 100644
--- a/app/src/main/java/com/codandotv/streamplayerapp/navigation/NavigationGraph.kt
+++ b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/navigation/NavigationGraph.kt
@@ -14,11 +14,12 @@ import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.bottomnavigation.StreamPlayerBottomNavigation
import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.navigation.detailStreamNavGraph
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.navigation.listStreamsNavGraph
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.navigation.searchStreamsNavGraph
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.navigation.profilePickerStreamNavGraph
-import com.codandotv.streamplayerapp.splah.presentation.navigation.splashNavGraph
+import com.codandotv.streamplayerapp.profile.presentation.navigation.profilePickerStreamNavGraph
+
+import com.codandotv.streamplayerapp.presentation.navigation.splashNavGraph
+import com.codandotv.streamplayerapp.feature_detail.presentation.navigation.detailStreamNavGraph
+import com.codandotv.streamplayerapp.feature_search.presentation.navigation.searchStreamsNavGraph
@Composable
fun NavigationGraph(navController: NavHostController) {
@@ -27,11 +28,11 @@ fun NavigationGraph(navController: NavHostController) {
listStreamsNavGraph(navController = navController)
searchStreamsNavGraph(navController = navController)
detailStreamNavGraph(navController = navController)
+ profilePickerStreamNavGraph(navController = navController)
temporaryFun(BottomNavRoutes.GAMES, navController)
temporaryFun(BottomNavRoutes.NEWS, navController)
temporaryFun(BottomNavRoutes.SCENES, navController)
temporaryFun(BottomNavRoutes.DOWNLOADS, navController)
- profilePickerStreamNavGraph(navController = navController)
}
}
@@ -42,7 +43,6 @@ fun NavGraphBuilder.temporaryFun(route: String, navController: NavController) {
}
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun example(navController: NavController, route: String) {
Scaffold(
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/navigation/SplashNavigation.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/navigation/SplashNavigation.kt
similarity index 77%
rename from app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/navigation/SplashNavigation.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/navigation/SplashNavigation.kt
index a272c263..9952dc97 100644
--- a/app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/navigation/SplashNavigation.kt
+++ b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/navigation/SplashNavigation.kt
@@ -1,11 +1,11 @@
-package com.codandotv.streamplayerapp.splah.presentation.navigation
+package com.codandotv.streamplayerapp.presentation.navigation
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
-import com.codandotv.streamplayerapp.splah.presentation.screens.SplashScreen
+import com.codandotv.streamplayerapp.presentation.screens.SplashScreen
fun NavGraphBuilder.splashNavGraph(navController: NavHostController) {
composable(Routes.Splash) {
diff --git a/app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/screens/SplashScreen.kt b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/screens/SplashScreen.kt
similarity index 96%
rename from app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/screens/SplashScreen.kt
rename to composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/screens/SplashScreen.kt
index f08c7848..97aa353b 100644
--- a/app/src/main/java/com/codandotv/streamplayerapp/splah/presentation/screens/SplashScreen.kt
+++ b/composeApp/src/commonMain/kotlin/com.codandotv.streamplayerapp/presentation/screens/SplashScreen.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.splah.presentation.screens
+package com.codandotv.streamplayerapp.presentation.screens
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
diff --git a/core-local-storage/build.gradle.kts b/core-local-storage/build.gradle.kts
index c8e2ff05..2ffd79e4 100644
--- a/core-local-storage/build.gradle.kts
+++ b/core-local-storage/build.gradle.kts
@@ -1,13 +1,24 @@
plugins {
- id("com.streamplayer.android-library")
+ id("com.streamplayer.kmp-library")
id("com.google.devtools.ksp")
+ alias(libs.plugins.room)
+}
+
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.room.bundled)
+ implementation(libs.room.runtime)
+
+ implementation(libs.koin.core)
+ }
+ }
}
dependencies {
+ add("kspAndroid", libs.room.compiler)
+}
- ksp(libs.roomCompiler)
- implementation(libs.bundles.room)
- implementation(libs.bundles.kotlin)
- implementation(libs.bundles.koin)
- testImplementation(libs.bundles.test)
-}
\ No newline at end of file
+room {
+ schemaDirectory("$projectDir/schemas")
+}
diff --git a/core-local-storage/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.android.kt b/core-local-storage/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.android.kt
new file mode 100644
index 00000000..8540c5f0
--- /dev/null
+++ b/core-local-storage/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.android.kt
@@ -0,0 +1,12 @@
+package com.codandotv.streamplayerapp.core_local_storage.data.database
+
+import androidx.room.Room
+import org.koin.mp.KoinPlatform
+
+actual fun databaseInstance(): AppDatabase {
+ return Room.databaseBuilder(
+ KoinPlatform.getKoin().get(),
+ AppDatabase::class.java,
+ dbFileName
+ ).build()
+}
\ No newline at end of file
diff --git a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/dao/FavoriteDao.kt b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/dao/FavoriteDao.kt
similarity index 100%
rename from core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/dao/FavoriteDao.kt
rename to core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/dao/FavoriteDao.kt
diff --git a/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.kt b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.kt
new file mode 100644
index 00000000..64f0a620
--- /dev/null
+++ b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.kt
@@ -0,0 +1,25 @@
+package com.codandotv.streamplayerapp.core_local_storage.data.database
+
+import androidx.room.ConstructedBy
+import androidx.room.Database
+import androidx.room.RoomDatabase
+import androidx.room.RoomDatabaseConstructor
+import com.codandotv.streamplayerapp.core_local_storage.data.dao.FavoriteDao
+import com.codandotv.streamplayerapp.core_local_storage.domain.model.MovieEntity
+
+
+@Database(entities = [MovieEntity::class], version = 1, exportSchema = false)
+@ConstructedBy(AppDatabaseConstructor::class)
+abstract class AppDatabase : RoomDatabase() {
+ abstract fun favoriteDao(): FavoriteDao
+}
+
+// The Room compiler generates the `actual` implementations.
+@Suppress("NO_ACTUAL_FOR_EXPECT")
+expect object AppDatabaseConstructor : RoomDatabaseConstructor {
+ override fun initialize(): AppDatabase
+}
+
+expect fun databaseInstance(): AppDatabase
+
+internal const val dbFileName = "app-database.db"
\ No newline at end of file
diff --git a/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt
new file mode 100644
index 00000000..9d934c0d
--- /dev/null
+++ b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt
@@ -0,0 +1,12 @@
+package com.codandotv.streamplayerapp.core_local_storage.di
+
+import com.codandotv.streamplayerapp.core_local_storage.data.database.AppDatabase
+import com.codandotv.streamplayerapp.core_local_storage.data.database.databaseInstance
+import org.koin.dsl.module
+
+object LocalStorageModule {
+ val module = module {
+ single { databaseInstance() }
+ single { get().favoriteDao() }
+ }
+}
\ No newline at end of file
diff --git a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/domain/model/MovieEntity.kt b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/domain/model/MovieEntity.kt
similarity index 100%
rename from core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/domain/model/MovieEntity.kt
rename to core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/domain/model/MovieEntity.kt
diff --git a/core-local-storage/src/iosMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.ios.kt b/core-local-storage/src/iosMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.ios.kt
new file mode 100644
index 00000000..469b746b
--- /dev/null
+++ b/core-local-storage/src/iosMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/AppDatabasePlatform.ios.kt
@@ -0,0 +1,35 @@
+package com.codandotv.streamplayerapp.core_local_storage.data.database
+
+import androidx.room.Room
+import androidx.room.util.findDatabaseConstructorAndInitDatabaseImpl
+import androidx.sqlite.driver.bundled.BundledSQLiteDriver
+import kotlinx.cinterop.ExperimentalForeignApi
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.IO
+import platform.Foundation.NSDocumentDirectory
+import platform.Foundation.NSFileManager
+import platform.Foundation.NSURL
+import platform.Foundation.NSUserDomainMask
+
+@OptIn(ExperimentalForeignApi::class)
+private fun documentDirectory(): String {
+ val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
+ directory = NSDocumentDirectory,
+ inDomain = NSUserDomainMask,
+ appropriateForURL = null,
+ create = false,
+ error = null
+ )
+ return requireNotNull(documentDirectory).path!!
+}
+
+actual fun databaseInstance(): AppDatabase {
+ val dbFile = "${documentDirectory()}/$dbFileName"
+ return Room.databaseBuilder(
+ name = dbFile,
+ factory = { findDatabaseConstructorAndInitDatabaseImpl(AppDatabase::class) }
+ ).setDriver(BundledSQLiteDriver())
+ .setQueryCoroutineContext(Dispatchers.IO)
+ .build()
+}
+
diff --git a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt b/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt
deleted file mode 100644
index d5d60723..00000000
--- a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.codandotv.streamplayerapp.core_local_storage.data.database
-
-import android.content.Context
-import androidx.room.Database
-import androidx.room.Room
-import androidx.room.RoomDatabase
-import com.codandotv.streamplayerapp.core_local_storage.data.dao.FavoriteDao
-import com.codandotv.streamplayerapp.core_local_storage.domain.model.MovieEntity
-
-@Database(entities = [MovieEntity::class], version = 1)
-abstract class StreamPlayerAppDatabase : RoomDatabase() {
-
- abstract fun favoriteDao(): FavoriteDao
-
- companion object {
-
- private var instance: StreamPlayerAppDatabase? = null
-
- fun getInstance(context: Context): StreamPlayerAppDatabase {
- if (instance == null) {
- synchronized(this) {
- instance = Room.databaseBuilder(
- context.applicationContext,
- StreamPlayerAppDatabase::class.java,
- DATABASE_NAME
- ).build()
- }
- }
- return instance!!
- }
-
- const val DATABASE_NAME = "app-database.db"
- }
-}
\ No newline at end of file
diff --git a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt b/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt
deleted file mode 100644
index a42c8854..00000000
--- a/core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.codandotv.streamplayerapp.core_local_storage.di
-
-import androidx.room.Room
-import com.codandotv.streamplayerapp.core_local_storage.data.database.StreamPlayerAppDatabase
-import com.codandotv.streamplayerapp.core_local_storage.data.database.StreamPlayerAppDatabase.Companion.DATABASE_NAME
-import org.koin.android.ext.koin.androidContext
-import org.koin.dsl.module
-
-object LocalStorageModule {
- val module = module {
- single { Room.databaseBuilder(androidContext(), StreamPlayerAppDatabase::class.java, DATABASE_NAME).build() }
- single { StreamPlayerAppDatabase.getInstance(get()) }
- single { get().favoriteDao() }
- }
-}
\ No newline at end of file
diff --git a/core-navigation/build.gradle.kts b/core-navigation/build.gradle.kts
index f7a359d3..21fc6a77 100644
--- a/core-navigation/build.gradle.kts
+++ b/core-navigation/build.gradle.kts
@@ -1,9 +1,17 @@
@file:Suppress("UnstableApiUsage")
plugins {
- id("com.streamplayer.android-library")
- id("com.streamplayer.compose")
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
}
-dependencies {
- implementation(libs.bundles.kotlin)
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.navigation.compose)
+
+ implementation(compose.material3)
+ implementation(compose.components.resources)
+ }
+ }
}
\ No newline at end of file
diff --git a/core-navigation/src/main/res/drawable/ic_downloads_selected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_downloads_selected.xml
similarity index 91%
rename from core-navigation/src/main/res/drawable/ic_downloads_selected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_downloads_selected.xml
index e64c7219..93b67523 100644
--- a/core-navigation/src/main/res/drawable/ic_downloads_selected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_downloads_selected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_downloads_unselected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_downloads_unselected.xml
similarity index 91%
rename from core-navigation/src/main/res/drawable/ic_downloads_unselected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_downloads_unselected.xml
index c23d8c3b..c85cae47 100644
--- a/core-navigation/src/main/res/drawable/ic_downloads_unselected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_downloads_unselected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_games_selected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_games_selected.xml
similarity index 94%
rename from core-navigation/src/main/res/drawable/ic_games_selected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_games_selected.xml
index 7108c3be..1b5f631c 100644
--- a/core-navigation/src/main/res/drawable/ic_games_selected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_games_selected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_games_unselected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_games_unselected.xml
similarity index 96%
rename from core-navigation/src/main/res/drawable/ic_games_unselected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_games_unselected.xml
index 1b02d38d..ebad3d46 100644
--- a/core-navigation/src/main/res/drawable/ic_games_unselected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_games_unselected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_home_selected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_home_selected.xml
similarity index 85%
rename from core-navigation/src/main/res/drawable/ic_home_selected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_home_selected.xml
index 1ce23235..16cfe658 100644
--- a/core-navigation/src/main/res/drawable/ic_home_selected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_home_selected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_home_unselected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_home_unselected.xml
similarity index 84%
rename from core-navigation/src/main/res/drawable/ic_home_unselected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_home_unselected.xml
index 5dc49b78..9517ebda 100644
--- a/core-navigation/src/main/res/drawable/ic_home_unselected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_home_unselected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/drawable/ic_news_selected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_news_selected.xml
similarity index 94%
rename from core-navigation/src/main/res/drawable/ic_news_selected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_news_selected.xml
index 50b53635..48906958 100644
--- a/core-navigation/src/main/res/drawable/ic_news_selected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_news_selected.xml
@@ -5,6 +5,6 @@
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
diff --git a/core-navigation/src/main/res/drawable/ic_news_unselected.xml b/core-navigation/src/commonMain/composeResources/drawable/ic_news_unselected.xml
similarity index 90%
rename from core-navigation/src/main/res/drawable/ic_news_unselected.xml
rename to core-navigation/src/commonMain/composeResources/drawable/ic_news_unselected.xml
index b4d4c7a5..45cfe6ac 100644
--- a/core-navigation/src/main/res/drawable/ic_news_unselected.xml
+++ b/core-navigation/src/commonMain/composeResources/drawable/ic_news_unselected.xml
@@ -3,8 +3,8 @@
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
- android:tint="@android:color/white">
+ android:tint="#FFFFFF">
diff --git a/core-navigation/src/main/res/values/strings.xml b/core-navigation/src/commonMain/composeResources/values/strings.xml
similarity index 100%
rename from core-navigation/src/main/res/values/strings.xml
rename to core-navigation/src/commonMain/composeResources/values/strings.xml
diff --git a/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt
new file mode 100644
index 00000000..96c2e576
--- /dev/null
+++ b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt
@@ -0,0 +1,56 @@
+package com.codandotv.streamplayerapp.core_navigation.bottomnavigation
+
+import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes
+import org.jetbrains.compose.resources.DrawableResource
+import org.jetbrains.compose.resources.StringResource
+import streamplayerapp_kmp.core_navigation.generated.resources.Res
+import streamplayerapp_kmp.core_navigation.generated.resources.bottom_nav_downloads
+import streamplayerapp_kmp.core_navigation.generated.resources.bottom_nav_games
+import streamplayerapp_kmp.core_navigation.generated.resources.bottom_nav_home
+import streamplayerapp_kmp.core_navigation.generated.resources.bottom_nav_news
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_downloads_selected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_downloads_unselected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_games_selected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_games_unselected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_home_selected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_home_unselected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_news_selected
+import streamplayerapp_kmp.core_navigation.generated.resources.ic_news_unselected
+
+sealed class BottomNavItem(
+ val title: StringResource,
+ val iconUnselected: DrawableResource,
+ val iconSelected: DrawableResource,
+ val screenRoute: String
+) {
+ object Home :
+ BottomNavItem(
+ Res.string.bottom_nav_home,
+ Res.drawable.ic_home_unselected,
+ Res.drawable.ic_home_selected,
+ BottomNavRoutes.HOME
+ )
+
+ object Games :
+ BottomNavItem(
+ Res.string.bottom_nav_games,
+ Res.drawable.ic_games_unselected,
+ Res.drawable.ic_games_selected,
+ BottomNavRoutes.GAMES
+ )
+
+ object News :
+ BottomNavItem(
+ Res.string.bottom_nav_news,
+ Res.drawable.ic_news_unselected,
+ Res.drawable.ic_news_selected,
+ BottomNavRoutes.NEWS
+ )
+
+ object Downloads : BottomNavItem(
+ Res.string.bottom_nav_downloads,
+ Res.drawable.ic_downloads_unselected,
+ Res.drawable.ic_downloads_selected,
+ BottomNavRoutes.DOWNLOADS
+ )
+}
\ No newline at end of file
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt
similarity index 88%
rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt
rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt
index aa9375b0..f4096a3a 100644
--- a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt
+++ b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/StreamPlayerBottomNavigation.kt
@@ -11,11 +11,11 @@ import androidx.compose.material3.Text
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.codandotv.streamplayerapp.core_navigation.helper.currentRoute
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
private val bottomMenuItems = listOf(
BottomNavItem.Home,
@@ -46,7 +46,7 @@ fun StreamPlayerBottomNavigation(navController: NavController) {
icon = { NavItemIcon(currentRoute, item) },
label = {
Text(
- text = stringResource(id = item.title),
+ text = stringResource(item.title),
style = MaterialTheme.typography.bodySmall,
)
},
@@ -62,8 +62,8 @@ private fun NavItemIcon(
item: BottomNavItem
) {
Icon(
- painterResource(id = if (currentRoute == item.screenRoute) item.iconSelected else item.iconUnselected),
- contentDescription = stringResource(id = item.title),
+ painterResource(if (currentRoute == item.screenRoute) item.iconSelected else item.iconUnselected),
+ contentDescription = stringResource(item.title),
)
}
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/extensions/NavControllerExtension.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/extensions/NavControllerExtension.kt
similarity index 100%
rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/extensions/NavControllerExtension.kt
rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/extensions/NavControllerExtension.kt
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/helper/NavigationHelper.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/helper/NavigationHelper.kt
similarity index 100%
rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/helper/NavigationHelper.kt
rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/helper/NavigationHelper.kt
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/routes/BottomNavRoutes.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/routes/BottomNavRoutes.kt
similarity index 100%
rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/routes/BottomNavRoutes.kt
rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/routes/BottomNavRoutes.kt
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt
similarity index 87%
rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt
rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt
index 572636d9..552cfc46 100644
--- a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt
+++ b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/routes/Routes.kt
@@ -4,7 +4,7 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PARAM.ID
object Routes {
const val DETAIL = "DetailList/"
- const val DETAIL_COMPLETE = "${DETAIL}{${ID}}"
+ const val DETAIL_COMPLETE = "$DETAIL{${ID}}"
const val Splash = "splash"
const val SEARCH = "Search"
const val PROFILE_PICKER = "profilePicker"
diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt b/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt
deleted file mode 100644
index b7cfb7b4..00000000
--- a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.codandotv.streamplayerapp.core_navigation.bottomnavigation
-
-import androidx.annotation.DrawableRes
-import androidx.annotation.StringRes
-import com.codandotv.streamplayerapp.core.navigation.R
-import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes
-
-sealed class BottomNavItem(
- @StringRes var title: Int,
- @DrawableRes var iconUnselected: Int,
- @DrawableRes var iconSelected: Int,
- var screenRoute: String
-) {
- object Home :
- BottomNavItem(
- R.string.bottom_nav_home,
- R.drawable.ic_home_unselected,
- R.drawable.ic_home_selected,
- BottomNavRoutes.HOME
- )
-
- object Games :
- BottomNavItem(
- R.string.bottom_nav_games,
- R.drawable.ic_games_unselected,
- R.drawable.ic_games_selected,
- BottomNavRoutes.GAMES
- )
-
- object News :
- BottomNavItem(
- R.string.bottom_nav_news,
- R.drawable.ic_news_unselected,
- R.drawable.ic_news_selected,
- BottomNavRoutes.NEWS
- )
-
- object Downloads : BottomNavItem(
- R.string.bottom_nav_downloads,
- R.drawable.ic_downloads_unselected,
- R.drawable.ic_downloads_selected,
- BottomNavRoutes.DOWNLOADS
- )
-}
\ No newline at end of file
diff --git a/core-networking/build.gradle.kts b/core-networking/build.gradle.kts
index f5602562..273aa0e4 100644
--- a/core-networking/build.gradle.kts
+++ b/core-networking/build.gradle.kts
@@ -1,27 +1,44 @@
+import com.codingfeline.buildkonfig.compiler.FieldSpec
+
plugins {
- id("com.streamplayer.android-library")
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
+ alias(libs.plugins.buildkonfig.plugin)
}
-android {
- buildFeatures {
- buildConfig = true
+
+buildkonfig {
+ packageName = "core.networking"
+
+ defaultConfigs {
+ buildConfigField(FieldSpec.Type.STRING, "HOST", Config.BuildField.host)
+ buildConfigField(FieldSpec.Type.STRING, "API_BEARER_AUTH", Config.BuildField.api_bearer)
+ buildConfigField(FieldSpec.Type.STRING, "PROFILE", Config.BuildField.api_profile)
}
- buildTypes {
- debug {
- buildConfigField("String", "HOST", Config.BuildField.host_debug)
- buildConfigField("String", "API_BEARER_AUTH", Config.BuildField.api_bearer_debug)
- buildConfigField("String", "PROFILE", Config.BuildField.api_profile_debug)
+}
+
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.kotlin.stdlib)
+
+ implementation(libs.koin.core)
+ implementation(libs.ktor.client.core)
+ implementation(libs.ktor.client.content.serialization.json)
+ implementation(libs.ktor.client.content.negotiation)
+ implementation(libs.ktor.client.logger)
+ implementation(libs.ktor.client.auth)
+ implementation(compose.components.resources)
+ implementation(compose.runtime)
}
- getByName("release") {
- buildConfigField("String", "HOST", Config.BuildField.host_release)
- buildConfigField("String", "API_BEARER_AUTH", Config.BuildField.api_bearer_release)
- buildConfigField("String", "PROFILE", Config.BuildField.api_profile_release)
+
+ androidMain.dependencies {
+ implementation(libs.okhttp)
+
+ implementation(libs.interceptor)
+
+ implementation(libs.ktor.client.okhttp)
}
}
-}
-dependencies {
- implementation(libs.bundles.kotlin)
- implementation(libs.bundles.networking)
- implementation(libs.bundles.koin)
- testImplementation(libs.bundles.test)
-}
+}
\ No newline at end of file
diff --git a/core-networking/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.android.kt b/core-networking/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.android.kt
new file mode 100644
index 00000000..04598d01
--- /dev/null
+++ b/core-networking/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.android.kt
@@ -0,0 +1,7 @@
+package com.codandotv.streamplayerapp.core_networking
+
+import io.ktor.client.engine.HttpClientEngine
+import io.ktor.client.engine.okhttp.OkHttpConfig
+import io.ktor.client.engine.okhttp.OkHttpEngine
+
+actual fun httpClientEngine() : HttpClientEngine = OkHttpEngine(OkHttpConfig())
\ No newline at end of file
diff --git a/core-networking/src/main/res/values/strings.xml b/core-networking/src/commonMain/composeResources/values/strings.xml
similarity index 100%
rename from core-networking/src/main/res/values/strings.xml
rename to core-networking/src/commonMain/composeResources/values/strings.xml
diff --git a/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.kt
new file mode 100644
index 00000000..a8f99a4a
--- /dev/null
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/HttpClientEngineProvider.kt
@@ -0,0 +1,7 @@
+@file:Suppress("EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE")
+
+package com.codandotv.streamplayerapp.core_networking
+
+import io.ktor.client.engine.HttpClientEngine
+
+expect fun httpClientEngine(): HttpClientEngine
\ No newline at end of file
diff --git a/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt
new file mode 100644
index 00000000..aca7f32e
--- /dev/null
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt
@@ -0,0 +1,92 @@
+package com.codandotv.streamplayerapp.core_networking.di
+
+import android.util.Log
+import com.codandotv.streamplayerapp.core_networking.di.Network.TIMEOUT
+import com.codandotv.streamplayerapp.core_networking.httpClientEngine
+import core.networking.BuildKonfig
+import io.ktor.client.HttpClient
+import io.ktor.client.plugins.HttpTimeout
+import io.ktor.client.plugins.auth.Auth
+import io.ktor.client.plugins.auth.providers.BearerTokens
+import io.ktor.client.plugins.auth.providers.bearer
+import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
+import io.ktor.client.plugins.defaultRequest
+import io.ktor.client.plugins.logging.LogLevel
+import io.ktor.client.plugins.logging.Logger
+import io.ktor.client.plugins.logging.Logging
+import io.ktor.client.request.accept
+import io.ktor.http.ContentType
+import io.ktor.http.contentType
+import io.ktor.serialization.kotlinx.json.json
+import kotlinx.serialization.json.Json
+import org.koin.dsl.module
+
+object NetworkModule {
+ val module = module {
+ single(QualifierHost) { BuildKonfig.HOST }
+ single(QualifierProfile) { BuildKonfig.PROFILE }
+
+ single {
+ provideKtorHttpClient(
+ baseUrl = get(QualifierHost),
+ )
+ }
+
+ single(QualifierProfileHttpClient) {
+ provideKtorHttpClient(
+ baseUrl = get(QualifierProfile),
+ )
+ }
+ }
+
+ private fun provideKtorHttpClient(
+ baseUrl: String,
+ ): HttpClient {
+ return HttpClient(engine = httpClientEngine()) {
+ expectSuccess = false
+
+ install(ContentNegotiation) {
+ json(Json {
+ explicitNulls = false
+ ignoreUnknownKeys = true
+ })
+ }
+
+ install(HttpTimeout) {
+ socketTimeoutMillis = TIMEOUT
+ requestTimeoutMillis = TIMEOUT
+ connectTimeoutMillis = TIMEOUT
+ }
+
+ defaultRequest {
+ url(baseUrl)
+ contentType(ContentType.Application.Json)
+ accept(ContentType.Application.Json)
+ }
+
+ install(Auth) {
+ bearer {
+ loadTokens {
+ BearerTokens(
+ accessToken = BuildKonfig.API_BEARER_AUTH,
+ refreshToken = ""
+ )
+ }
+ }
+ }
+
+ install(Logging) {
+ level = LogLevel.ALL
+ logger = object : Logger {
+ override fun log(message: String) {
+ Log.i("HttpClient", message)
+ }
+ }
+ }
+ }
+ }
+}
+
+internal object Network {
+ const val TIMEOUT = 10000L
+}
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt
similarity index 93%
rename from core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt
rename to core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt
index c3564c8f..b21a5e27 100644
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/QualifierNetworking.kt
@@ -13,12 +13,11 @@ object QualifierProfile : Qualifier {
get() = "QualifierProfile"
}
-object QualifierProfileRetrofit : Qualifier {
+object QualifierProfileHttpClient : Qualifier {
override val value: QualifierValue
get() = "QualifierProfileRetrofit"
}
-
object QualifierLoggerInterceptor : Qualifier {
override val value: QualifierValue
get() = "QualifierLoggerInterceptor"
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt
similarity index 71%
rename from core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt
rename to core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt
index eeb1421a..f09b8b03 100644
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/Failure.kt
@@ -1,6 +1,7 @@
package com.codandotv.streamplayerapp.core_networking.handleError
-import com.codandotv.streamplayerapp.core.networking.R
+import com.codandotv.streamplayerapp.core_networking.resources.StringNetworking
+import kotlinx.serialization.Serializable
import org.koin.core.component.KoinComponent
/**
@@ -11,19 +12,21 @@ import org.koin.core.component.KoinComponent
"TooGenericExceptionCaught",
"MagicNumber"
)
+
+@Serializable
sealed class Failure(
val code: Int? = -1,
val errorMessage: String? = null,
- val errorMessageRes: Int = R.string.core_networking_msg_default_error
+ val errorMessageResKey: String = StringNetworking.msgDefaultErrorKey()
) : Exception(), KoinComponent {
data class NoDataContent(val codeStatus: Int? = null) :
- Failure(codeStatus, errorMessageRes = R.string.core_networking_no_data_content)
+ Failure(codeStatus, errorMessageResKey = StringNetworking.msgNoDataContentKey())
data class ServerError(val codeStatus: Int? = null) :
- Failure(codeStatus, errorMessageRes = R.string.core_networking_no_server_error)
+ Failure(codeStatus, errorMessageResKey = StringNetworking.msgServerErrorKey())
data class GenericError(
- val codeStatus: Int? = -12, private val msg: String? = null
+ val codeStatus: Int? = -12, private val msg: String? = StringNetworking.msgNetworkErrorKey()
) : Failure(
codeStatus
)
@@ -31,7 +34,7 @@ sealed class Failure(
data class NetworkError(
val codeStatus: Int? = -13, private val throwable: Throwable
) : Failure(
- codeStatus, errorMessageRes = R.string.core_networking_networking_error
+ codeStatus, errorMessageResKey = StringNetworking.msgNetworkErrorKey()
)
data class UnknownError(
diff --git a/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/HttpClientConfigExtensions.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/HttpClientConfigExtensions.kt
new file mode 100644
index 00000000..5ccadb2c
--- /dev/null
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/HttpClientConfigExtensions.kt
@@ -0,0 +1,35 @@
+package com.codandotv.streamplayerapp.core_networking.handleError
+
+import io.ktor.client.HttpClient
+import io.ktor.client.call.body
+import io.ktor.client.plugins.ClientRequestException
+import io.ktor.client.request.HttpRequestBuilder
+import io.ktor.client.request.request
+import io.ktor.client.statement.bodyAsText
+import io.ktor.utils.io.errors.IOException
+import kotlinx.serialization.SerializationException
+
+suspend inline fun HttpClient.safeRequest(
+ block: HttpRequestBuilder.() -> Unit,
+): NetworkResponse =
+ try {
+ val response = request { block() }
+ NetworkResponse.Success(response.body())
+ } catch (exception: ClientRequestException) {
+ NetworkResponse.Error(
+ body = exception.response.bodyAsText(),
+ exception = Failure.ServerError(exception.response.status.value)
+ )
+ } catch (e: SerializationException) {
+ NetworkResponse.Error(
+ exception = Failure.UnparsableResponseException(throwable = e)
+ )
+ } catch (e: IOException) {
+ NetworkResponse.Error(
+ exception = Failure.NetworkError(throwable = e)
+ )
+ } catch (e: Exception) {
+ NetworkResponse.Error(
+ exception = Failure.GenericError(msg = e.message ?: "Unknown error")
+ )
+ }
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt
similarity index 89%
rename from core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt
rename to core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt
index ca705691..60ba6259 100644
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/NetworkResponse.kt
@@ -2,14 +2,18 @@ package com.codandotv.streamplayerapp.core_networking.handleError
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
+import kotlinx.serialization.Serializable
+@Serializable
sealed class NetworkResponse {
+ @Serializable
data class Success(
val value: T
) : NetworkResponse()
+ @Serializable
data class Error(
- val body: Any? = null,
+ val body: String? = null,
@Transient
val exception: Failure? = null
) : NetworkResponse()
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/ResultExtensions.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/ResultExtensions.kt
similarity index 100%
rename from core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/handleError/ResultExtensions.kt
rename to core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/ResultExtensions.kt
diff --git a/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/resources/StringNetworking.kt b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/resources/StringNetworking.kt
new file mode 100644
index 00000000..b7edb0a2
--- /dev/null
+++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/resources/StringNetworking.kt
@@ -0,0 +1,25 @@
+package com.codandotv.streamplayerapp.core_networking.resources
+
+import org.jetbrains.compose.resources.StringResource
+import streamplayerapp_kmp.core_networking.generated.resources.Res
+import streamplayerapp_kmp.core_networking.generated.resources.core_networking_msg_default_error
+import streamplayerapp_kmp.core_networking.generated.resources.core_networking_networking_error
+import streamplayerapp_kmp.core_networking.generated.resources.core_networking_no_data_content
+import streamplayerapp_kmp.core_networking.generated.resources.core_networking_no_server_error
+
+//Note: done this to search for strings in the innermost layers because you can't use them because they are not composable
+object StringNetworking {
+ internal fun msgDefaultErrorKey(): String = Res.string.core_networking_msg_default_error.key
+ internal fun msgNoDataContentKey(): String = Res.string.core_networking_no_data_content.key
+ internal fun msgServerErrorKey(): String = Res.string.core_networking_no_server_error.key
+ internal fun msgNetworkErrorKey(): String = Res.string.core_networking_networking_error.key
+
+ private val errorMessageMap = mapOf(
+ msgDefaultErrorKey() to Res.string.core_networking_msg_default_error,
+ msgNoDataContentKey() to Res.string.core_networking_no_data_content,
+ msgServerErrorKey() to Res.string.core_networking_no_server_error,
+ msgNetworkErrorKey() to Res.string.core_networking_networking_error
+ )
+
+ fun getStringResource(key: String): StringResource? = errorMessageMap[key]
+}
diff --git a/core-networking/src/main/AndroidManifest.xml b/core-networking/src/main/AndroidManifest.xml
deleted file mode 100644
index a8800291..00000000
--- a/core-networking/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapter.kt b/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapter.kt
deleted file mode 100644
index eafeb5b9..00000000
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapter.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.codandotv.streamplayerapp.core_networking.coroutines
-
-import com.squareup.moshi.Moshi
-import retrofit2.Call
-import retrofit2.CallAdapter
-import java.lang.reflect.Type
-
-class NetworkResponseAdapter(
- private val responseType: Type,
- private val moshi: Moshi
-): CallAdapter {
-
- override fun responseType(): Type = responseType
- override fun adapt(call: Call) = NetworkResponseCall(call,moshi)
-}
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapterFactory.kt b/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapterFactory.kt
deleted file mode 100644
index d2626078..00000000
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseAdapterFactory.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.codandotv.streamplayerapp.core_networking.coroutines
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.squareup.moshi.Moshi
-import retrofit2.Call
-import retrofit2.CallAdapter
-import retrofit2.Retrofit
-import java.lang.reflect.ParameterizedType
-import java.lang.reflect.Type
-
-@Suppress("ReturnCount", "SwallowedException")
-class NetworkResponseAdapterFactory(private val moshi: Moshi) : CallAdapter.Factory() {
- override fun get(
- returnType: Type,
- annotations: Array,
- retrofit: Retrofit
- ): CallAdapter<*, *>? {
- return try {
- // suspend functions wrap the response type in `Call`
- if (Call::class.java != getRawType(returnType)) {
- return null
- }
-
- // check first that the return type is `ParameterizedType`
- check(returnType is ParameterizedType) {
- "return type must be parameterized as Call> or Call>"
- }
-
- // get the response type inside the `Call` type
- val responseType = getParameterUpperBound(0, returnType)
-
- // if the response type is not ApiResponse then we can't handle this type, so we return null
- if (getRawType(responseType) != NetworkResponse::class.java) {
- return null
- }
-
- // the response type is ApiResponse and should be parameterized
- check(responseType is ParameterizedType) {
- "Response must be parameterized as NetworkResponse " +
- "or NetworkResponse"
- }
-
- val successBodyType = getParameterUpperBound(0, responseType)
-
- return NetworkResponseAdapter(successBodyType, moshi)
- } catch (ex: ClassCastException) {
- null
- }
- }
-}
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseCall.kt b/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseCall.kt
deleted file mode 100644
index 710ad937..00000000
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/coroutines/NetworkResponseCall.kt
+++ /dev/null
@@ -1,158 +0,0 @@
-package com.codandotv.streamplayerapp.core_networking.coroutines
-
-import com.codandotv.streamplayerapp.core_networking.handleError.Failure
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.squareup.moshi.Moshi
-import okhttp3.Request
-import okhttp3.ResponseBody
-import okio.Timeout
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.HttpException
-import retrofit2.Response
-import java.io.IOException
-
-@Suppress("SwallowedException", "TooGenericExceptionCaught")
-class NetworkResponseCall(
- proxy: Call,
- private val moshi: Moshi
-) :
- CallDelegate>(proxy) {
-
- override fun enqueueImpl(callback: Callback>) =
- proxy.enqueue(object : Callback {
- override fun onResponse(call: Call, response: Response) {
- val body = response.body()
- val code = response.code()
- val error = response.errorBody()
- if (response.isSuccessful) {
- responseSuccessful(body, callback, code)
- } else {
- responseError(callback,error, code)
- }
- }
-
- override fun onFailure(call: Call, throwable: Throwable) {
- val networkResponse = when (throwable) {
- is IOException -> Failure.NetworkError(throwable = throwable)
- is HttpException -> convertException(throwable)
- else -> Failure.GenericError(msg = throwable.message)
- }
- callback.onResponse(
- this@NetworkResponseCall,
- Response.success(NetworkResponse.Error(exception = networkResponse))
- )
- }
-
-
- private fun convertException(exception: HttpException): Failure {
- return try {
- val response = getErrorResponse(exception)
- Failure.UnexpectedApiException(throwable = response.exception)
- } catch (ex: Failure.ClientException) {
- ex
- }catch (ex : Failure.UnparsableResponseException){
- ex
- }
- }
-
- private fun getErrorResponse(ex: HttpException): NetworkResponse.Error {
- val error = ex.response()?.errorBody()?.string()
- if (error?.isEmpty() != false) {
- throw Failure.ClientException(throwable = ex)
- }
- return parseError(error, ex)
- }
-
- private fun parseError(error: String, ex: HttpException): NetworkResponse.Error {
- try {
- return moshi
- .adapter(NetworkResponse.Error::class.java)
- .fromJson(error)!!
- } catch (e: Exception) {
- throw Failure.UnparsableResponseException(throwable = ex)
- }
- }
- })
-
- private fun responseSuccessful(
- body: T?,
- callback: Callback>,
- code: Int
- ) {
- if (body != null) {
- callback.onResponse(
- this@NetworkResponseCall,
- Response.success(NetworkResponse.Success(body))
- )
- } else {
- callback.onResponse(
- this@NetworkResponseCall,
- Response.success(
- NetworkResponse.Error(
- exception = Failure.NoDataContent(
- code
- )
- )
- )
- )
- }
- }
-
- private fun responseError(callback: Callback>, error: ResponseBody?, code: Int) {
- val errorBody = when {
- error == null -> null
- error.contentLength() == 0L -> null
- else -> try {
- moshi
- .adapter(NetworkResponse.Error::class.java)
- .fromJson(error.string())
- } catch (ex: Exception) {
- null
- }
- }
- if (errorBody != null) {
- callback.onResponse(
- this@NetworkResponseCall,
- Response.success(
- NetworkResponse.Error(
- body = errorBody,
- exception = Failure.ServerError(code)
- )
- )
- )
- } else {
- callback.onResponse(
- this@NetworkResponseCall,
- Response.success(
- NetworkResponse.Error(
- exception = Failure.UnknownError(
- code
- )
- )
- )
- )
- }
- }
-
-
- override fun cloneImpl(): Call> =
- NetworkResponseCall(proxy.clone(), moshi)
-}
-
-abstract class CallDelegate(
- protected val proxy: Call
-) : Call {
- override fun execute(): Response = throw NotImplementedError()
- final override fun enqueue(callback: Callback) = enqueueImpl(callback)
- final override fun clone(): Call = cloneImpl()
-
- override fun cancel() = proxy.cancel()
- override fun request(): Request = proxy.request()
- override fun isExecuted() = proxy.isExecuted
- override fun isCanceled() = proxy.isCanceled
-
- abstract fun enqueueImpl(callback: Callback)
- abstract fun cloneImpl(): Call
- override fun timeout(): Timeout = proxy.timeout()
-}
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt b/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt
deleted file mode 100644
index 7b0dc322..00000000
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.codandotv.streamplayerapp.core_networking.di
-
-import com.codandotv.streamplayerapp.core.networking.BuildConfig
-import com.codandotv.streamplayerapp.core_networking.coroutines.NetworkResponseAdapterFactory
-import com.squareup.moshi.Moshi
-import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
-import okhttp3.Interceptor
-import okhttp3.OkHttpClient
-import okhttp3.logging.HttpLoggingInterceptor
-import org.koin.dsl.module
-import retrofit2.Retrofit
-import retrofit2.converter.moshi.MoshiConverterFactory
-import java.util.concurrent.TimeUnit
-
-@Suppress("MagicNumber")
-object NetworkModule {
- val module = module {
- single(QualifierHost) {
- BuildConfig.HOST
- }
-
- single(QualifierProfile) {
- BuildConfig.PROFILE
- }
-
- single {
- Moshi.Builder()
- .add(KotlinJsonAdapterFactory())
- .build()
- }
-
- single(QualifierAuthInterceptor) {
- Interceptor { chain ->
- val newRequest =
- chain.request()
- .newBuilder()
- .addHeader(
- "Authorization",
- BuildConfig.API_BEARER_AUTH
- )
- .addHeader("Content-Type", "application/json;charset=utf-8")
- .build()
- chain.proceed(newRequest)
- }
- }
-
- single(QualifierLoggerInterceptor) {
- HttpLoggingInterceptor().setLevel(
- if (BuildConfig.DEBUG) {
- HttpLoggingInterceptor.Level.BODY
- } else {
- HttpLoggingInterceptor.Level.NONE
- }
- )
- }
- single {
- provideRetrofit(
- okHttpClient = get(),
- moshi = get(),
- baseUrl = get(QualifierHost)
- )
- }
-
- single(QualifierProfileRetrofit) {
- provideRetrofit(
- okHttpClient = get(),
- moshi = get(),
- baseUrl = get(QualifierProfile)
- )
- }
-
- single {
- provideOkhttp(
- get(QualifierAuthInterceptor),
- get(QualifierLoggerInterceptor),
- )
- }
- }
-
- private fun provideOkhttp(
- vararg interceptor: Interceptor
- ): OkHttpClient {
- val okHttpClientBuilder = OkHttpClient.Builder()
- interceptor.forEach {
- okHttpClientBuilder.addInterceptor(it)
- }
- return okHttpClientBuilder
- .connectTimeout(15, TimeUnit.SECONDS)
- .build()
- }
-
- private fun provideRetrofit(
- okHttpClient: OkHttpClient,
- moshi: Moshi,
- baseUrl: String
- ): Retrofit =
- Retrofit.Builder()
- .baseUrl(baseUrl)
- .client(okHttpClient)
- .addConverterFactory(MoshiConverterFactory.create(moshi))
- .addCallAdapterFactory(NetworkResponseAdapterFactory(moshi))
- .build()
-}
\ No newline at end of file
diff --git a/core-shared-ui/build.gradle.kts b/core-shared-ui/build.gradle.kts
index 5f46ed8a..6f6a642f 100644
--- a/core-shared-ui/build.gradle.kts
+++ b/core-shared-ui/build.gradle.kts
@@ -1,15 +1,31 @@
@file:Suppress("UnstableApiUsage")
plugins {
- id("com.streamplayer.android-library")
- id("com.streamplayer.compose")
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
}
-dependencies {
- implementation(projects.coreShared)
- implementation(libs.bundles.koin)
- implementation(libs.bundles.kotlin)
- implementation(libs.bundles.androidSupport)
- implementation(libs.android.youtube.player)
- testImplementation(libs.bundles.test)
- implementation(libs.coil)
-}
\ No newline at end of file
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(projects.coreShared)
+
+ implementation(compose.material3)
+ implementation(compose.preview)
+ implementation(compose.ui)
+ implementation(compose.components.resources)
+
+ implementation(libs.navigation.compose)
+
+ implementation(libs.android.youtube.player)
+
+ implementation(libs.coil)
+
+ implementation(libs.paging.compose)
+ }
+ }
+}
+
+compose.resources {
+ publicResClass = true
+}
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt b/core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.android.kt
similarity index 91%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt
rename to core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.android.kt
index 3013210d..51fc8e77 100644
--- a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt
+++ b/core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.android.kt
@@ -13,14 +13,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
-import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerListener
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
@Composable
-fun PlayerComponent(videoId: String, modifier: Modifier = Modifier) {
+actual fun PlayerComponent(videoId: String, modifier: Modifier) {
val context = LocalContext.current
@@ -93,13 +92,4 @@ fun PlayerComponent(videoId: String, modifier: Modifier = Modifier) {
onDispose { youtubePlayerView.release() }
},
)
-}
-
-@Composable
-@ThemePreviews
-fun PlayerComponentPreview() {
- PlayerComponent(
- videoId = "BigBuckBunny.mp4",
- modifier = Modifier.fillMaxWidth()
- )
-}
+}
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/drawable/transparent_image.xml b/core-shared-ui/src/androidMain/res/drawable/transparent_image.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/transparent_image.xml
rename to core-shared-ui/src/androidMain/res/drawable/transparent_image.xml
diff --git a/core-shared-ui/src/main/res/mipmap-hdpi/ic_netflix.png b/core-shared-ui/src/androidMain/res/mipmap-hdpi/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-hdpi/ic_netflix.png
rename to core-shared-ui/src/androidMain/res/mipmap-hdpi/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/mipmap-hdpi/ic_netflix_round.png b/core-shared-ui/src/androidMain/res/mipmap-hdpi/ic_netflix_round.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-hdpi/ic_netflix_round.png
rename to core-shared-ui/src/androidMain/res/mipmap-hdpi/ic_netflix_round.png
diff --git a/core-shared-ui/src/main/res/mipmap-mdpi/ic_netflix.png b/core-shared-ui/src/androidMain/res/mipmap-mdpi/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-mdpi/ic_netflix.png
rename to core-shared-ui/src/androidMain/res/mipmap-mdpi/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/mipmap-mdpi/ic_netflix_round.png b/core-shared-ui/src/androidMain/res/mipmap-mdpi/ic_netflix_round.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-mdpi/ic_netflix_round.png
rename to core-shared-ui/src/androidMain/res/mipmap-mdpi/ic_netflix_round.png
diff --git a/core-shared-ui/src/main/res/mipmap-xhdpi/ic_netflix.png b/core-shared-ui/src/androidMain/res/mipmap-xhdpi/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xhdpi/ic_netflix.png
rename to core-shared-ui/src/androidMain/res/mipmap-xhdpi/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/mipmap-xhdpi/ic_netflix_round.png b/core-shared-ui/src/androidMain/res/mipmap-xhdpi/ic_netflix_round.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xhdpi/ic_netflix_round.png
rename to core-shared-ui/src/androidMain/res/mipmap-xhdpi/ic_netflix_round.png
diff --git a/core-shared-ui/src/main/res/mipmap-xxhdpi/ic_netflix.png b/core-shared-ui/src/androidMain/res/mipmap-xxhdpi/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xxhdpi/ic_netflix.png
rename to core-shared-ui/src/androidMain/res/mipmap-xxhdpi/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/mipmap-xxhdpi/ic_netflix_round.png b/core-shared-ui/src/androidMain/res/mipmap-xxhdpi/ic_netflix_round.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xxhdpi/ic_netflix_round.png
rename to core-shared-ui/src/androidMain/res/mipmap-xxhdpi/ic_netflix_round.png
diff --git a/core-shared-ui/src/main/res/mipmap-xxxhdpi/ic_netflix.png b/core-shared-ui/src/androidMain/res/mipmap-xxxhdpi/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xxxhdpi/ic_netflix.png
rename to core-shared-ui/src/androidMain/res/mipmap-xxxhdpi/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/mipmap-xxxhdpi/ic_netflix_round.png b/core-shared-ui/src/androidMain/res/mipmap-xxxhdpi/ic_netflix_round.png
similarity index 100%
rename from core-shared-ui/src/main/res/mipmap-xxxhdpi/ic_netflix_round.png
rename to core-shared-ui/src/androidMain/res/mipmap-xxxhdpi/ic_netflix_round.png
diff --git a/core-shared-ui/src/main/res/raw/logo.json b/core-shared-ui/src/androidMain/res/raw/logo.json
similarity index 100%
rename from core-shared-ui/src/main/res/raw/logo.json
rename to core-shared-ui/src/androidMain/res/raw/logo.json
diff --git a/core-shared-ui/src/main/res/values-v31/themes.xml b/core-shared-ui/src/androidMain/res/values-v31/themes.xml
similarity index 50%
rename from core-shared-ui/src/main/res/values-v31/themes.xml
rename to core-shared-ui/src/androidMain/res/values-v31/themes.xml
index f234904b..d6657630 100644
--- a/core-shared-ui/src/main/res/values-v31/themes.xml
+++ b/core-shared-ui/src/androidMain/res/values-v31/themes.xml
@@ -2,8 +2,9 @@
\ No newline at end of file
diff --git a/core-shared-ui/src/androidMain/res/values/strings.xml b/core-shared-ui/src/androidMain/res/values/strings.xml
new file mode 100644
index 00000000..22f3d553
--- /dev/null
+++ b/core-shared-ui/src/androidMain/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ StreamPlayerApp
+
\ No newline at end of file
diff --git a/core-shared-ui/src/androidMain/res/values/themes.xml b/core-shared-ui/src/androidMain/res/values/themes.xml
new file mode 100644
index 00000000..4dfb4c91
--- /dev/null
+++ b/core-shared-ui/src/androidMain/res/values/themes.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/drawable/ic_add.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_add.xml
similarity index 88%
rename from core-shared-ui/src/main/res/drawable/ic_add.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_add.xml
index eaf0cd27..7d46aa21 100644
--- a/core-shared-ui/src/main/res/drawable/ic_add.xml
+++ b/core-shared-ui/src/commonMain/composeResources/drawable/ic_add.xml
@@ -5,6 +5,6 @@
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
diff --git a/core-shared-ui/src/main/res/drawable/ic_close.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_close.xml
similarity index 54%
rename from core-shared-ui/src/main/res/drawable/ic_close.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_close.xml
index 844b6b62..6df42aa8 100644
--- a/core-shared-ui/src/main/res/drawable/ic_close.xml
+++ b/core-shared-ui/src/commonMain/composeResources/drawable/ic_close.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/core-shared-ui/src/commonMain/composeResources/drawable/ic_copy_content.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_copy_content.xml
new file mode 100644
index 00000000..32b6ed83
--- /dev/null
+++ b/core-shared-ui/src/commonMain/composeResources/drawable/ic_copy_content.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/core-shared-ui/src/main/res/drawable/ic_info.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_info.xml
similarity index 96%
rename from core-shared-ui/src/main/res/drawable/ic_info.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_info.xml
index a85cba3b..75a1da27 100644
--- a/core-shared-ui/src/main/res/drawable/ic_info.xml
+++ b/core-shared-ui/src/commonMain/composeResources/drawable/ic_info.xml
@@ -5,6 +5,6 @@
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
diff --git a/core-shared-ui/src/main/res/drawable/ic_instagram.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_instagram.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_instagram.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_instagram.xml
diff --git a/core-shared-ui/src/main/res/drawable/ic_message.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_message.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_message.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_message.xml
diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix.png b/core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix.png
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_netflix.png
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix.png
diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix_background.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix_background.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_netflix_background.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix_background.xml
diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix_foreground.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix_foreground.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_netflix_foreground.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_netflix_foreground.xml
diff --git a/core-shared-ui/src/main/res/drawable/ic_play.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_play.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_play.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_play.xml
diff --git a/core-shared-ui/src/main/res/drawable/ic_whatsapp.xml b/core-shared-ui/src/commonMain/composeResources/drawable/ic_whatsapp.xml
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/ic_whatsapp.xml
rename to core-shared-ui/src/commonMain/composeResources/drawable/ic_whatsapp.xml
diff --git a/core-shared-ui/src/main/res/drawable/perfil_fake.png b/core-shared-ui/src/commonMain/composeResources/drawable/perfil_fake.png
similarity index 100%
rename from core-shared-ui/src/main/res/drawable/perfil_fake.png
rename to core-shared-ui/src/commonMain/composeResources/drawable/perfil_fake.png
diff --git a/core-shared-ui/src/commonMain/composeResources/drawable/transparent_image.xml b/core-shared-ui/src/commonMain/composeResources/drawable/transparent_image.xml
new file mode 100644
index 00000000..fa4a79ea
--- /dev/null
+++ b/core-shared-ui/src/commonMain/composeResources/drawable/transparent_image.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/values/strings.xml b/core-shared-ui/src/commonMain/composeResources/values/strings.xml
similarity index 77%
rename from core-shared-ui/src/main/res/values/strings.xml
rename to core-shared-ui/src/commonMain/composeResources/values/strings.xml
index 61def186..b4a573fa 100644
--- a/core-shared-ui/src/main/res/values/strings.xml
+++ b/core-shared-ui/src/commonMain/composeResources/values/strings.xml
@@ -24,4 +24,12 @@
Preview
+
+ Ícone Netflix
+ Ícone Perfil
+ Ícone Buscar
+ Ícone Fechar
+ Ícone Microfone
+ Ícone Voltar
+ Ícone Projetar
\ No newline at end of file
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/resources/Colors.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/resources/Colors.kt
similarity index 100%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/resources/Colors.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/resources/Colors.kt
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/theme/StreamPlayerTheme.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/theme/StreamPlayerTheme.kt
similarity index 100%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/theme/StreamPlayerTheme.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/theme/StreamPlayerTheme.kt
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/theme/ThemePreviews.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/theme/ThemePreviews.kt
similarity index 100%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/theme/ThemePreviews.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/theme/ThemePreviews.kt
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/utils/Sharing.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/utils/Sharing.kt
similarity index 100%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/utils/Sharing.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/utils/Sharing.kt
diff --git a/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/CloseButton.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/CloseButton.kt
new file mode 100644
index 00000000..02993088
--- /dev/null
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/CloseButton.kt
@@ -0,0 +1,19 @@
+package com.codandotv.streamplayerapp.core_shared_ui.widget
+
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_close
+
+@Composable
+fun CloseButton(action: () -> Unit = {}) {
+ DefaultIcon(
+ searchIcon = Icons.Default.Close,
+ contentDescription = stringResource(Res.string.icon_close),
+ onIconClickAction = action,
+ iconColor = Color.Gray
+ )
+}
diff --git a/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/DefaultIcon.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/DefaultIcon.kt
new file mode 100644
index 00000000..8ec6b8d2
--- /dev/null
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/DefaultIcon.kt
@@ -0,0 +1,30 @@
+package com.codandotv.streamplayerapp.core_shared_ui.widget
+
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Search
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+
+@Composable
+fun DefaultIcon(
+ modifier: Modifier = Modifier,
+ searchIcon: ImageVector = Icons.Default.Search,
+ iconColor: Color = Color.White,
+ contentDescription: String = "",
+ onIconClickAction: () -> Unit = {}
+) {
+ IconButton(
+ modifier = modifier,
+ onClick = onIconClickAction
+ ) {
+ Icon(
+ imageVector = searchIcon,
+ contentDescription = contentDescription,
+ tint = iconColor
+ )
+ }
+}
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt
similarity index 100%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt
diff --git a/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/MicButton.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/MicButton.kt
new file mode 100644
index 00000000..53b1f4ea
--- /dev/null
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/MicButton.kt
@@ -0,0 +1,19 @@
+package com.codandotv.streamplayerapp.core_shared_ui.widget
+
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Check
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_mic
+
+@Composable
+fun MicButton(action: () -> Unit = {}) {
+ DefaultIcon(
+ searchIcon = Icons.Default.Check,
+ contentDescription = stringResource(Res.string.icon_mic),
+ onIconClickAction = action,
+ iconColor = Color.Gray
+ )
+}
\ No newline at end of file
diff --git a/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt
new file mode 100644
index 00000000..e11d12a3
--- /dev/null
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt
@@ -0,0 +1,10 @@
+@file:Suppress("EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE")
+
+package com.codandotv.streamplayerapp.core_shared_ui.widget
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Composable
+expect fun PlayerComponent(videoId: String, modifier: Modifier = Modifier)
+
diff --git a/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SearchIcon.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SearchIcon.kt
new file mode 100644
index 00000000..c92c7987
--- /dev/null
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SearchIcon.kt
@@ -0,0 +1,19 @@
+package com.codandotv.streamplayerapp.core_shared_ui.widget
+
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Search
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_search
+
+@Composable
+fun SearchIcon(action: () -> Unit = {}) {
+ DefaultIcon(
+ searchIcon = Icons.Filled.Search,
+ contentDescription = stringResource(Res.string.icon_search),
+ onIconClickAction = action,
+ iconColor = Color.Gray
+ )
+}
\ No newline at end of file
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt
similarity index 85%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt
index b3063630..dd788dbc 100644
--- a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt
@@ -42,14 +42,11 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
-import com.codandotv.streamplayerapp.core.shared.ui.R
import com.codandotv.streamplayerapp.core_shared.extension.getUriFromUrlImage
import com.codandotv.streamplayerapp.core_shared_ui.resources.Colors
import com.codandotv.streamplayerapp.core_shared_ui.utils.Sharing.ANIMATION_DURATION
@@ -67,6 +64,25 @@ import com.codandotv.streamplayerapp.core_shared_ui.utils.isPackageInstalled
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_close
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_copy_content
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_instagram
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_whatsapp
+import streamplayerapp_kmp.core_shared_ui.generated.resources.instagram_not_installed_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_link_copied_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_instagram
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_link
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_more_options
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_sms
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_title_whatsapp
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sharing_whatsapp_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.sms_app_error_message
+import streamplayerapp_kmp.core_shared_ui.generated.resources.whatsapp_not_installed_message
@Suppress("LongMethod")
@Composable
@@ -80,12 +96,12 @@ fun SharingStreamCustomView(
val animateTrigger = remember { mutableStateOf(false) }
val context = LocalContext.current
- val linkCopiedMessage = stringResource(id = R.string.sharing_link_copied_message)
+ val linkCopiedMessage = stringResource(Res.string.sharing_link_copied_message)
val contentMessage =
- stringResource(id = R.string.sharing_whatsapp_message, contentTitle, contentUrl)
- val whatsAppNotInstalledMessage = stringResource(id = R.string.whatsapp_not_installed_message)
- val instagramNotInstalledMessage = stringResource(id = R.string.instagram_not_installed_message)
- val smsErrorMessage = stringResource(id = R.string.sms_app_error_message)
+ stringResource(Res.string.sharing_whatsapp_message, contentTitle, contentUrl)
+ val whatsAppNotInstalledMessage = stringResource(Res.string.whatsapp_not_installed_message)
+ val instagramNotInstalledMessage = stringResource(Res.string.instagram_not_installed_message)
+ val smsErrorMessage = stringResource(Res.string.sms_app_error_message)
LaunchedEffect(key1 = Unit) {
launch {
@@ -106,7 +122,7 @@ fun SharingStreamCustomView(
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(
- text = stringResource(id = R.string.sharing_title_message),
+ text = stringResource(Res.string.sharing_title_message),
style = TextStyle(
fontSize = 16.sp,
fontFamily = FontFamily.Default,
@@ -130,7 +146,7 @@ fun SharingStreamCustomView(
}
) {
Image(
- painter = painterResource(id = R.drawable.ic_whatsapp),
+ painter = painterResource(Res.drawable.ic_whatsapp),
contentDescription = null,
modifier = Modifier
.width(24.dp)
@@ -138,7 +154,7 @@ fun SharingStreamCustomView(
)
Spacer(modifier = Modifier.width(8.dp))
Text(
- text = stringResource(id = R.string.sharing_title_whatsapp),
+ text = stringResource(Res.string.sharing_title_whatsapp),
style = TextStyle(
fontSize = 18.sp,
fontFamily = FontFamily.Default,
@@ -163,7 +179,7 @@ fun SharingStreamCustomView(
}
) {
Image(
- painter = painterResource(id = R.drawable.ic_message),
+ painter = painterResource(Res.drawable.ic_message),
contentDescription = null,
modifier = Modifier
.width(24.dp)
@@ -171,7 +187,7 @@ fun SharingStreamCustomView(
)
Spacer(modifier = Modifier.width(8.dp))
Text(
- text = stringResource(id = R.string.sharing_title_sms),
+ text = stringResource(Res.string.sharing_title_sms),
style = TextStyle(
fontSize = 18.sp,
fontFamily = FontFamily.Default,
@@ -192,7 +208,7 @@ fun SharingStreamCustomView(
}
) {
Image(
- painter = painterResource(id = R.drawable.ic_instagram),
+ painter = painterResource(Res.drawable.ic_instagram),
contentDescription = null,
modifier = Modifier
.width(24.dp)
@@ -200,7 +216,7 @@ fun SharingStreamCustomView(
)
Spacer(modifier = Modifier.width(8.dp))
Text(
- text = stringResource(id = R.string.sharing_title_instagram),
+ text = stringResource(Res.string.sharing_title_instagram),
style = TextStyle(
fontSize = 18.sp,
fontFamily = FontFamily.Default,
@@ -221,7 +237,7 @@ fun SharingStreamCustomView(
}
) {
Image(
- painter = painterResource(id = R.drawable.ic_copy_content),
+ painter = painterResource(Res.drawable.ic_copy_content),
contentDescription = null,
modifier = Modifier
.width(28.dp)
@@ -234,7 +250,7 @@ fun SharingStreamCustomView(
)
Spacer(modifier = Modifier.width(8.dp))
Text(
- text = stringResource(id = R.string.sharing_title_link),
+ text = stringResource(Res.string.sharing_title_link),
style = TextStyle(
fontSize = 18.sp,
fontFamily = FontFamily.Default,
@@ -244,7 +260,7 @@ fun SharingStreamCustomView(
}
Spacer(modifier = Modifier.height(20.dp))
Text(
- text = stringResource(id = R.string.sharing_title_more_options),
+ text = stringResource(Res.string.sharing_title_more_options),
style = TextStyle(
fontSize = 18.sp,
fontFamily = FontFamily.Default,
@@ -281,7 +297,7 @@ fun SharingStreamCustomView(
}
) {
Image(
- painter = painterResource(id = R.drawable.ic_close),
+ painter = painterResource(Res.drawable.ic_close),
contentDescription = null,
modifier = Modifier
.width(32.dp)
diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt
similarity index 77%
rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt
index 0b51a8db..b0954304 100644
--- a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt
@@ -24,15 +24,23 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
-import com.codandotv.streamplayerapp.core.shared.ui.R
import com.codandotv.streamplayerapp.core_shared.extension.empty
import com.codandotv.streamplayerapp.core_shared_ui.resources.Colors
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreview
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_netflix
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_netflix
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_profile
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_search
+import streamplayerapp_kmp.core_shared_ui.generated.resources.perfil_fake
+import streamplayerapp_kmp.core_shared_ui.generated.resources.topbar_categories
+import streamplayerapp_kmp.core_shared_ui.generated.resources.topbar_movies
+import streamplayerapp_kmp.core_shared_ui.generated.resources.topbar_shows
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -69,8 +77,8 @@ private fun StreamPlayerTopBar(
onClick = { /* todo */ }
) {
Icon(
- painter = painterResource(R.drawable.ic_netflix),
- contentDescription = stringResource(id = R.string.icon_netflix),
+ painter = painterResource(Res.drawable.ic_netflix),
+ contentDescription = stringResource(Res.string.icon_netflix),
tint = Color.Unspecified,
)
}
@@ -84,7 +92,7 @@ private fun StreamPlayerTopBar(
) {
Icon(
imageVector = Icons.Default.Search,
- contentDescription = stringResource(id = R.string.icon_search),
+ contentDescription = stringResource(Res.string.icon_search),
tint = Color.White,
)
}
@@ -98,9 +106,9 @@ private fun StreamPlayerTopBar(
.height(24.dp)
.clip(RoundedCornerShape(4.dp)),
model = profilePicture,
- error = painterResource(id = R.drawable.perfil_fake),
- placeholder = painterResource(id = R.drawable.perfil_fake),
- contentDescription = stringResource(id = R.string.icon_profile)
+ error = painterResource(Res.drawable.perfil_fake),
+ placeholder = painterResource(Res.drawable.perfil_fake),
+ contentDescription = stringResource(Res.string.icon_profile)
)
}
}
@@ -120,17 +128,17 @@ private fun StreamPlayerOptionsTopBar(modifier: Modifier, scrollBehavior: TopApp
modifier = Modifier.padding(horizontal = 40.dp)
) {
Text(
- text = stringResource(id = R.string.topbar_shows),
+ text = stringResource(Res.string.topbar_shows),
modifier = Modifier.weight(1f),
color = Color.White
)
Text(
- text = stringResource(id = R.string.topbar_movies),
+ text = stringResource(Res.string.topbar_movies),
modifier = Modifier.weight(1f),
color = Color.White
)
Text(
- text = stringResource(id = R.string.topbar_categories),
+ text = stringResource(Res.string.topbar_categories),
modifier = Modifier.weight(1f),
color = Color.White
)
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCard.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCard.kt
similarity index 91%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCard.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCard.kt
index e58661be..1633791e 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCard.kt
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCard.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets
+package com.codandotv.streamplayerapp.core_shared_ui.widget
import android.os.Parcelable
import androidx.compose.foundation.clickable
@@ -13,7 +13,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
-import com.codandotv.streamplayerapp.core_networking.Url.IMAGE_URL_SIZE_300
+import com.codandotv.streamplayerapp.core_shared.Url.IMAGE_URL_SIZE_300
import kotlinx.parcelize.Parcelize
@Composable
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCarousel.kt b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCarousel.kt
similarity index 96%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCarousel.kt
rename to core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCarousel.kt
index 61b5e89f..40100d2a 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCarousel.kt
+++ b/core-shared-ui/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamsCarousel.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets
+package com.codandotv.streamplayerapp.core_shared_ui.widget
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
diff --git a/core-shared-ui/src/main/AndroidManifest.xml b/core-shared-ui/src/main/AndroidManifest.xml
deleted file mode 100644
index ee784d7a..00000000
--- a/core-shared-ui/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/drawable/ic_copy_content.xml b/core-shared-ui/src/main/res/drawable/ic_copy_content.xml
deleted file mode 100644
index 9b16f48a..00000000
--- a/core-shared-ui/src/main/res/drawable/ic_copy_content.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
diff --git a/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix.xml b/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix.xml
deleted file mode 100644
index 4cc788ad..00000000
--- a/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix_round.xml b/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix_round.xml
deleted file mode 100644
index 4cc788ad..00000000
--- a/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/values-night/themes.xml b/core-shared-ui/src/main/res/values-night/themes.xml
deleted file mode 100644
index 04c0b155..00000000
--- a/core-shared-ui/src/main/res/values-night/themes.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
diff --git a/core-shared-ui/src/main/res/values/colors.xml b/core-shared-ui/src/main/res/values/colors.xml
deleted file mode 100644
index f8c6127d..00000000
--- a/core-shared-ui/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
- #FFBB86FC
- #FF6200EE
- #FF3700B3
- #FF03DAC5
- #FF018786
- #FF000000
- #FFFFFFFF
-
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/values/content-description.xml b/core-shared-ui/src/main/res/values/content-description.xml
deleted file mode 100644
index a3353e8e..00000000
--- a/core-shared-ui/src/main/res/values/content-description.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
- Ícone Netflix
- Ícone Perfil
- Ícone Buscar
- Ícone Fechar
- Ícone Microfone
- Ícone Voltar
- Ícone Projetar
-
\ No newline at end of file
diff --git a/core-shared-ui/src/main/res/values/themes.xml b/core-shared-ui/src/main/res/values/themes.xml
deleted file mode 100644
index 56f74635..00000000
--- a/core-shared-ui/src/main/res/values/themes.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/core-shared/build.gradle.kts b/core-shared/build.gradle.kts
index f1b45dda..692b2f9a 100644
--- a/core-shared/build.gradle.kts
+++ b/core-shared/build.gradle.kts
@@ -1,7 +1,12 @@
plugins {
- id("com.streamplayer.android-library")
+ id("com.streamplayer.kmp-library")
}
-dependencies {
- implementation(libs.bundles.koin)
+
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.koin.core)
+ }
+ }
}
\ No newline at end of file
diff --git a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/Url.kt b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/Url.kt
similarity index 80%
rename from core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/Url.kt
rename to core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/Url.kt
index 1b0d9b77..8ea4c8e2 100644
--- a/core-networking/src/main/java/com/codandotv/streamplayerapp/core_networking/Url.kt
+++ b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/Url.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.core_networking
+package com.codandotv.streamplayerapp.core_shared
object Url {
const val IMAGE_URL_SIZE_200 = "https://image.tmdb.org/t/p/w200/"
diff --git a/core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/ErrorExt.kt b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/ErrorExt.kt
similarity index 100%
rename from core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/ErrorExt.kt
rename to core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/ErrorExt.kt
diff --git a/core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/String.Ext.kt b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/String.Ext.kt
similarity index 100%
rename from core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/String.Ext.kt
rename to core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/String.Ext.kt
diff --git a/core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/UriExt.kt b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/UriExt.kt
similarity index 100%
rename from core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/extension/UriExt.kt
rename to core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/extension/UriExt.kt
diff --git a/core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/qualifier/QualifierDispatcherIO.kt b/core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/qualifier/QualifierDispatcherIO.kt
similarity index 100%
rename from core-shared/src/main/java/com/codandotv/streamplayerapp/core_shared/qualifier/QualifierDispatcherIO.kt
rename to core-shared/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_shared/qualifier/QualifierDispatcherIO.kt
diff --git a/core-shared/src/main/AndroidManifest.xml b/core-shared/src/main/AndroidManifest.xml
deleted file mode 100644
index a8800291..00000000
--- a/core-shared/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/feature-favorites/.gitignore b/feature-detail/.gitignore
similarity index 100%
rename from feature-favorites/.gitignore
rename to feature-detail/.gitignore
diff --git a/feature-detail/build.gradle.kts b/feature-detail/build.gradle.kts
new file mode 100644
index 00000000..7b57b974
--- /dev/null
+++ b/feature-detail/build.gradle.kts
@@ -0,0 +1,37 @@
+@file:Suppress("UnstableApiUsage")
+
+plugins {
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
+}
+
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.koin.core)
+ implementation(libs.koin.compose)
+
+ implementation(projects.coreNetworking)
+ implementation(projects.coreNavigation)
+ implementation(projects.coreShared)
+ implementation(projects.coreSharedUi)
+ implementation(projects.coreLocalStorage)
+
+ implementation(compose.material3)
+ implementation(compose.ui)
+ implementation(compose.preview)
+ implementation(compose.components.resources)
+
+ implementation(libs.navigation.compose)
+
+ implementation(libs.coil)
+
+ implementation(libs.ktor.client.content.serialization.json)
+ implementation(libs.ktor.client.content.negotiation)
+ }
+ commonTest.dependencies {
+ implementation(libs.bundles.test)
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature-favorites/consumer-rules.pro b/feature-detail/consumer-rules.pro
similarity index 100%
rename from feature-favorites/consumer-rules.pro
rename to feature-detail/consumer-rules.pro
diff --git a/feature-favorites/proguard-rules.pro b/feature-detail/proguard-rules.pro
similarity index 100%
rename from feature-favorites/proguard-rules.pro
rename to feature-detail/proguard-rules.pro
diff --git a/feature-list-streams/src/main/res/drawable/netflix_detail.webp b/feature-detail/src/commonMain/composeResources/drawable/netflix_detail.webp
similarity index 100%
rename from feature-list-streams/src/main/res/drawable/netflix_detail.webp
rename to feature-detail/src/commonMain/composeResources/drawable/netflix_detail.webp
diff --git a/feature-list-streams/src/main/res/drawable/play_circle.xml b/feature-detail/src/commonMain/composeResources/drawable/play_circle.xml
similarity index 100%
rename from feature-list-streams/src/main/res/drawable/play_circle.xml
rename to feature-detail/src/commonMain/composeResources/drawable/play_circle.xml
diff --git a/feature-detail/src/commonMain/composeResources/values/strings.xml b/feature-detail/src/commonMain/composeResources/values/strings.xml
new file mode 100644
index 00000000..ac85d916
--- /dev/null
+++ b/feature-detail/src/commonMain/composeResources/values/strings.xml
@@ -0,0 +1,12 @@
+
+
+ Assistir
+ Baixar E1
+ Filme
+ Minha Lista
+ Classificar
+ Compartilhar
+ Baixar completo
+ Pesquisar
+ Voltar
+
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamRepository.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamRepository.kt
similarity index 75%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamRepository.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamRepository.kt
index 7fd6c5e1..21adf8f1 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamRepository.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamRepository.kt
@@ -1,12 +1,12 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.data
+package com.codandotv.streamplayerapp.feature_detail.data
import com.codandotv.streamplayerapp.core_local_storage.data.dao.FavoriteDao
import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.toDetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.toDetailStreamLocal
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.toVideoStreams
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStream
+import com.codandotv.streamplayerapp.feature_detail.domain.toDetailStream
+import com.codandotv.streamplayerapp.feature_detail.domain.toDetailStreamLocal
+import com.codandotv.streamplayerapp.feature_detail.domain.toVideoStreams
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
diff --git a/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamService.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamService.kt
new file mode 100644
index 00000000..f4c69ba1
--- /dev/null
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/DetailStreamService.kt
@@ -0,0 +1,28 @@
+package com.codandotv.streamplayerapp.feature_detail.data
+
+import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.safeRequest
+import com.codandotv.streamplayerapp.feature_detail.data.model.DetailStreamResponse
+import com.codandotv.streamplayerapp.feature_detail.data.model.VideoStreamsResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.request.url
+
+interface DetailStreamService {
+ suspend fun getMovie(movieId: String): NetworkResponse
+ suspend fun getVideoStreams(movieId: String): NetworkResponse
+}
+
+class DetailStreamServiceImpl(
+ private val client: HttpClient
+) : DetailStreamService {
+
+ override suspend fun getMovie(movieId: String): NetworkResponse =
+ client.safeRequest {
+ url("movie/$movieId")
+ }
+
+ override suspend fun getVideoStreams(movieId: String): NetworkResponse =
+ client.safeRequest {
+ url("movie/$movieId/videos")
+ }
+}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/DetailStreamResponse.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/DetailStreamResponse.kt
similarity index 60%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/DetailStreamResponse.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/DetailStreamResponse.kt
index 58f66c52..27c79e86 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/DetailStreamResponse.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/DetailStreamResponse.kt
@@ -1,8 +1,11 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.data.model
+package com.codandotv.streamplayerapp.feature_detail.data.model
+import kotlinx.serialization.Serializable
+
+@Serializable
@Suppress("ConstructorParameterNaming")
data class DetailStreamResponse(
- val id : String,
+ val id : Long,
val title : String,
val overview : String,
val tagline : String,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/VideoStreamResponse.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/VideoStreamResponse.kt
similarity index 67%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/VideoStreamResponse.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/VideoStreamResponse.kt
index e6b4a696..e7fcc7eb 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/model/VideoStreamResponse.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/data/model/VideoStreamResponse.kt
@@ -1,5 +1,8 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.data.model
+package com.codandotv.streamplayerapp.feature_detail.data.model
+import kotlinx.serialization.Serializable
+
+@Serializable
data class VideoStreamResponse(
val id: String,
val name: String,
@@ -10,6 +13,7 @@ data class VideoStreamResponse(
val type: String,
)
+@Serializable
data class VideoStreamsResponse(
val id: Long,
val results: List
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/di/DetailStreamModule.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/di/DetailStreamModule.kt
similarity index 56%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/di/DetailStreamModule.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/di/DetailStreamModule.kt
index 30723490..ff8c0934 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/di/DetailStreamModule.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/di/DetailStreamModule.kt
@@ -1,18 +1,18 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.di
+package com.codandotv.streamplayerapp.feature_detail.di
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepository
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepositoryImpl
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamService
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCaseImpl
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStreamsUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStreamsUseCaseImpl
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamViewModel
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepository
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepositoryImpl
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamService
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamServiceImpl
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCase
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCaseImpl
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStreamsUseCase
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStreamsUseCaseImpl
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamViewModel
import kotlinx.coroutines.Dispatchers
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.parameter.parametersOf
import org.koin.dsl.module
-import retrofit2.Retrofit
object DetailStreamModule {
val module = module {
@@ -49,6 +49,10 @@ object DetailStreamModule {
)
}
- factory { get().create(DetailStreamService::class.java) }
+ factory {
+ DetailStreamServiceImpl(
+ client = get()
+ )
+ }
}
}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStream.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStream.kt
similarity index 73%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStream.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStream.kt
index 0cd575a5..0d9f6689 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStream.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStream.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
+package com.codandotv.streamplayerapp.feature_detail.domain
data class DetailStream(
val id : String,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamMapper.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamMapper.kt
similarity index 69%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamMapper.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamMapper.kt
index 174f7fc1..e12cf78f 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamMapper.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamMapper.kt
@@ -1,14 +1,13 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
+package com.codandotv.streamplayerapp.feature_detail.domain
import com.codandotv.streamplayerapp.core_local_storage.domain.model.MovieEntity
-import com.codandotv.streamplayerapp.core_networking.Url.IMAGE_URL_SIZE_500
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.model.DetailStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.model.VideoStreamsResponse
+import com.codandotv.streamplayerapp.core_shared.Url.IMAGE_URL_SIZE_500
+import com.codandotv.streamplayerapp.feature_detail.data.model.DetailStreamResponse
+import com.codandotv.streamplayerapp.feature_detail.data.model.VideoStreamsResponse
-@Suppress("MagicNumber")
fun DetailStreamResponse.toDetailStream(isFavorite: Boolean = false): DetailStream =
DetailStream(
- id = this.id,
+ id = this.id.toString(),
title = this.title,
overview = this.overview,
tagline = this.tagline,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamUseCase.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamUseCase.kt
similarity index 80%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamUseCase.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamUseCase.kt
index 88bd4705..74c3c256 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamUseCase.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/DetailStreamUseCase.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
+package com.codandotv.streamplayerapp.feature_detail.domain
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepository
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepository
import kotlinx.coroutines.flow.Flow
interface DetailStreamUseCase {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStream.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStream.kt
similarity index 50%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStream.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStream.kt
index b97c964f..39ccb50e 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStream.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStream.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
+package com.codandotv.streamplayerapp.feature_detail.domain
data class VideoStream(
val movieId: Long,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStreamsUseCase.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStreamsUseCase.kt
similarity index 69%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStreamsUseCase.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStreamsUseCase.kt
index b15bb7bd..d35544be 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStreamsUseCase.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/domain/VideoStreamsUseCase.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
+package com.codandotv.streamplayerapp.feature_detail.domain
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepository
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepository
import kotlinx.coroutines.flow.Flow
interface VideoStreamsUseCase {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/navigation/DetailStreamNavigation.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt
similarity index 82%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/navigation/DetailStreamNavigation.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt
index 9db0b723..7917c3f3 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/navigation/DetailStreamNavigation.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.navigation
+package com.codandotv.streamplayerapp.feature_detail.presentation.navigation
import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
@@ -7,8 +7,8 @@ import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
import com.codandotv.streamplayerapp.core_navigation.routes.Routes.DETAIL_COMPLETE
import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PARAM.ID
-import com.codandotv.streamplayerapp.feature_list_streams.detail.di.DetailStreamModule
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamScreen
+import com.codandotv.streamplayerapp.feature_detail.di.DetailStreamModule
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamScreen
import org.koin.androidx.compose.koinViewModel
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamViewModel.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamViewModel.kt
similarity index 73%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamViewModel.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamViewModel.kt
index 5d3ca5ba..ba330dbb 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamViewModel.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamViewModel.kt
@@ -1,13 +1,14 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens
+package com.codandotv.streamplayerapp.feature_detail.presentation.screens
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStreamsUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamsUIState.DetailStreamsLoadedUIState
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamsUIState.LoadingStreamUIState
+import com.codandotv.streamplayerapp.core_networking.resources.StringNetworking
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCase
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStreamsUseCase
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamsUIState.DetailStreamsLoadedUIState
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamsUIState.LoadingStreamUIState
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@@ -44,7 +45,7 @@ class DetailStreamViewModel(
.flowOn(dispatcher)
.onStart { onLoading() }
.catchFailure {
- println(">>>> ${it.errorMessage}")
+ println(">>>> ${StringNetworking.getStringResource(it.errorMessageResKey)}")
}
.collect { result ->
_uiState.update {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsScreen.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt
similarity index 85%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsScreen.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt
index d4cbc47a..2ce51aec 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsScreen.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens
+package com.codandotv.streamplayerapp.feature_detail.presentation.screens
import android.annotation.SuppressLint
import androidx.activity.compose.BackHandler
@@ -12,7 +12,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.FileDownload
+import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
@@ -29,7 +29,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
@@ -39,14 +38,17 @@ import androidx.lifecycle.compose.LifecycleEventEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.codandotv.streamplayerapp.core_shared_ui.widget.SharingStreamCustomView
-import com.codandotv.streamplayerapp.feature.list.streams.R
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget.DetailStreamActionOption
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget.DetailStreamButtonAction
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget.DetailStreamImagePreview
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget.DetailStreamRowHeader
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget.DetailStreamToolbar
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature_detail.presentation.widget.DetailStreamActionOption
+import com.codandotv.streamplayerapp.feature_detail.presentation.widget.DetailStreamButtonAction
+import com.codandotv.streamplayerapp.feature_detail.presentation.widget.DetailStreamImagePreview
+import com.codandotv.streamplayerapp.feature_detail.presentation.widget.DetailStreamRowHeader
+import com.codandotv.streamplayerapp.feature_detail.presentation.widget.DetailStreamToolbar
+import org.jetbrains.compose.resources.stringResource
import org.koin.androidx.compose.koinViewModel
+import streamplayerapp_kmp.feature_detail.generated.resources.Res
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_default_text_secondary_button
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_watch_primary_button
@Composable
fun DetailStreamScreen(
@@ -154,7 +156,7 @@ private fun SetupDetailScreen(
),
imageVector = Icons.Filled.PlayArrow,
imageVectorColor = MaterialTheme.colorScheme.onSurface,
- text = stringResource(R.string.detail_watch_primary_button),
+ text = stringResource(Res.string.detail_watch_primary_button),
textColor = MaterialTheme.colorScheme.onSurface
)
Spacer(modifier = Modifier.height(4.dp))
@@ -162,9 +164,9 @@ private fun SetupDetailScreen(
buttonsColors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.onSurfaceVariant
),
- imageVector = Icons.Filled.FileDownload,
+ imageVector = Icons.Filled.Add,
imageVectorColor = MaterialTheme.colorScheme.onSurface,
- text = stringResource(id = R.string.detail_default_text_secondary_button),
+ text = stringResource(Res.string.detail_default_text_secondary_button),
textColor = MaterialTheme.colorScheme.onSurface,
)
Text(
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsUIState.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsUIState.kt
similarity index 58%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsUIState.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsUIState.kt
index cfc4ebb7..66c2a144 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsUIState.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsUIState.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens
+package com.codandotv.streamplayerapp.feature_detail.presentation.screens
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
sealed class DetailStreamsUIState {
data class DetailStreamsLoadedUIState(
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamActionOption.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamActionOption.kt
similarity index 71%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamActionOption.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamActionOption.kt
index e4b92603..d694d8c2 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamActionOption.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamActionOption.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget
+package com.codandotv.streamplayerapp.feature_detail.presentation.widget
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
@@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Check
-import androidx.compose.material.icons.filled.Download
import androidx.compose.material.icons.filled.Share
import androidx.compose.material.icons.filled.ThumbUp
import androidx.compose.runtime.Composable
@@ -18,10 +17,15 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.stringResource
import com.codandotv.streamplayerapp.core_shared_ui.widget.IconWithText
-import com.codandotv.streamplayerapp.feature.list.streams.R
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature.detail.R
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.feature_detail.generated.resources.Res
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_classification
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_download
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_my_list
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_share
@Composable
fun DetailStreamActionOption(
@@ -49,28 +53,28 @@ fun DetailStreamActionOption(
},
imageVector = iconCheckList,
imageColor = Color.White,
- text = stringResource(id = R.string.detail_my_list),
+ text = stringResource(Res.string.detail_my_list),
textColor = Color.Gray,
)
IconWithText(
onClick = { TODO("Implementar mecanismo de classificação.") },
imageVector = Icons.Filled.ThumbUp,
imageColor = Color.White,
- text = stringResource(id = R.string.detail_classification),
+ text = stringResource(Res.string.detail_classification),
textColor = Color.Gray,
)
IconWithText(
onClick = { onShowSharingOptions.invoke() },
imageVector = Icons.Filled.Share,
imageColor = Color.White,
- text = stringResource(id = R.string.detail_share),
+ text = stringResource(Res.string.detail_share),
textColor = Color.Gray,
)
IconWithText(
onClick = { TODO("Implementar mecanismo de download.") },
- imageVector = Icons.Filled.Download,
+ imageVector = Icons.Filled.Share,
imageColor = Color.White,
- text = stringResource(id = R.string.detail_download),
+ text = stringResource(Res.string.detail_download),
textColor = Color.Gray,
)
}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamButtonAction.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamButtonAction.kt
similarity index 95%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamButtonAction.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamButtonAction.kt
index 0cdefd53..c97b9f1e 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamButtonAction.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamButtonAction.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget
+package com.codandotv.streamplayerapp.feature_detail.presentation.widget
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamImagePreview.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamImagePreview.kt
similarity index 82%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamImagePreview.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamImagePreview.kt
index e1451f60..f21e7bf9 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamImagePreview.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamImagePreview.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget
+package com.codandotv.streamplayerapp.feature_detail.presentation.widget
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -14,12 +14,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
-import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.codandotv.streamplayerapp.core_shared_ui.widget.PlayerComponent
-import com.codandotv.streamplayerapp.feature.list.streams.R
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamsUIState.DetailStreamsLoadedUIState
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamsUIState.DetailStreamsLoadedUIState
+import org.jetbrains.compose.resources.painterResource
+import streamplayerapp_kmp.feature_detail.generated.resources.Res
+import streamplayerapp_kmp.feature_detail.generated.resources.play_circle
@Suppress("MagicNumber")
@Composable
@@ -56,7 +57,7 @@ fun DetailStreamImagePreview(
.align(Alignment.Center),
)
Icon(
- painter = painterResource(id = R.drawable.play_circle),
+ painter = painterResource(Res.drawable.play_circle),
tint = Color.White,
contentDescription = null,
modifier = Modifier
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamRowHeader.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamRowHeader.kt
similarity index 71%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamRowHeader.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamRowHeader.kt
index 5ef2dfa5..cf5d5c0f 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamRowHeader.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamRowHeader.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget
+package com.codandotv.streamplayerapp.feature_detail.presentation.widget
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row
@@ -11,13 +11,15 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import androidx.compose.ui.unit.sp
-import com.codandotv.streamplayerapp.feature.list.streams.R
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.feature_detail.generated.resources.Res
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_movie
+import streamplayerapp_kmp.feature_detail.generated.resources.netflix_detail
@Composable
fun DetailStreamRowHeader(
@@ -28,7 +30,7 @@ fun DetailStreamRowHeader(
modifier = modifier
) {
Image(
- painter = painterResource(id = R.drawable.netflix_detail),
+ painter = painterResource(Res.drawable.netflix_detail),
contentDescription = null,
modifier = Modifier
.size(26.dp)
@@ -36,7 +38,7 @@ fun DetailStreamRowHeader(
)
Text(
- text = stringResource(id = R.string.detail_movie),
+ text = stringResource(Res.string.detail_movie),
modifier = Modifier.offset(x = (-6).dp),
style = MaterialTheme.typography.headlineMedium.copy(
color = Color.Gray,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamToolbar.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamToolbar.kt
similarity index 66%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamToolbar.kt
rename to feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamToolbar.kt
index 152ebe46..cdf05dce 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamToolbar.kt
+++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/widget/DetailStreamToolbar.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.widget
+package com.codandotv.streamplayerapp.feature_detail.presentation.widget
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.height
@@ -13,11 +13,15 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
-import com.codandotv.streamplayerapp.feature.list.streams.R
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.perfil_fake
+import streamplayerapp_kmp.feature_detail.generated.resources.Res
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res as SharedRes
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_back
+import streamplayerapp_kmp.feature_detail.generated.resources.detail_search
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -32,7 +36,7 @@ fun DetailStreamToolbar(
IconButton(onClick = { navController.navigateUp() }) {
Icon(
imageVector = Icons.Filled.ArrowBack,
- contentDescription = stringResource(id = R.string.detail_back)
+ contentDescription = stringResource(Res.string.detail_back)
)
}
}, actions = {
@@ -42,12 +46,12 @@ fun DetailStreamToolbar(
Icon(
imageVector = Icons.Default.Search,
tint = Color.White,
- contentDescription = stringResource(id = R.string.detail_search)
+ contentDescription = stringResource(Res.string.detail_search)
)
}
IconButton(onClick = { }) {
Image(
- painter = painterResource(id = com.codandotv.streamplayerapp.core.shared.ui.R.drawable.perfil_fake),
+ painter = painterResource(SharedRes.drawable.perfil_fake),
contentDescription = null
)
}
diff --git a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamRepositoryTest.kt b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamRepositoryTest.kt
similarity index 80%
rename from feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamRepositoryTest.kt
rename to feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamRepositoryTest.kt
index f2f00d88..042fb260 100644
--- a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamRepositoryTest.kt
+++ b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamRepositoryTest.kt
@@ -1,10 +1,10 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail
+package com.codandotv.streamplayerapp.feature_detail
import com.codandotv.streamplayerapp.core_local_storage.data.dao.FavoriteDao
import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepository
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepositoryImpl
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamService
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepository
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepositoryImpl
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamService
import io.mockk.coEvery
import io.mockk.coVerifyOrder
import io.mockk.mockk
diff --git a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamUseCaseTest.kt b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamUseCaseTest.kt
similarity index 66%
rename from feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamUseCaseTest.kt
rename to feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamUseCaseTest.kt
index f08442b4..37e4c128 100644
--- a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamUseCaseTest.kt
+++ b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamUseCaseTest.kt
@@ -1,15 +1,12 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail
+package com.codandotv.streamplayerapp.feature_detail
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.DetailStreamRepository
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCaseImpl
+import com.codandotv.streamplayerapp.feature_detail.data.DetailStreamRepository
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCase
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCaseImpl
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
diff --git a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamViewModelTest.kt b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamViewModelTest.kt
similarity index 78%
rename from feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamViewModelTest.kt
rename to feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamViewModelTest.kt
index 60a47271..65a2ae0d 100644
--- a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/DetailStreamViewModelTest.kt
+++ b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/DetailStreamViewModelTest.kt
@@ -1,11 +1,10 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail
+package com.codandotv.streamplayerapp.feature_detail
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import androidx.lifecycle.LifecycleOwner
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStreamUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStreamsUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamViewModel
-import com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.screens.DetailStreamsUIState
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStreamUseCase
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStreamsUseCase
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamViewModel
+import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamsUIState
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
diff --git a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/InstantTaskCoroutinesExecutorRule.kt b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/InstantTaskCoroutinesExecutorRule.kt
similarity index 91%
rename from feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/InstantTaskCoroutinesExecutorRule.kt
rename to feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/InstantTaskCoroutinesExecutorRule.kt
index f30e6ca3..f0cf84a7 100644
--- a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/InstantTaskCoroutinesExecutorRule.kt
+++ b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/InstantTaskCoroutinesExecutorRule.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail
+package com.codandotv.streamplayerapp.feature_detail
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
diff --git a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/Shared.kt b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/Shared.kt
similarity index 64%
rename from feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/Shared.kt
rename to feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/Shared.kt
index 3adda93e..095ab5dc 100644
--- a/feature-list-streams/src/test/java/com/codandotv/streamplayerapp/feature_list_streams/detail/Shared.kt
+++ b/feature-detail/src/commonTest/kotlin/com/codandotv/streamplayerapp/feature_detail/Shared.kt
@@ -1,8 +1,8 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail
+package com.codandotv.streamplayerapp.feature_detail
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.model.DetailStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailStream
-import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.VideoStream
+import com.codandotv.streamplayerapp.feature_detail.data.model.DetailStreamResponse
+import com.codandotv.streamplayerapp.feature_detail.domain.DetailStream
+import com.codandotv.streamplayerapp.feature_detail.domain.VideoStream
val videoStream = VideoStream(
movieId = 123,
@@ -22,7 +22,7 @@ val videosStreamsList = listOf(
)
val detailStreamResponse = DetailStreamResponse(
- id = "id",
+ id = 12,
title = "title",
overview = "overview",
tagline = "tagline",
diff --git a/feature-favorites/build.gradle.kts b/feature-favorites/build.gradle.kts
deleted file mode 100644
index 6bf94b61..00000000
--- a/feature-favorites/build.gradle.kts
+++ /dev/null
@@ -1,19 +0,0 @@
-@file:Suppress("UnstableApiUsage")
-plugins {
- id("com.streamplayer.android-library")
- id("com.streamplayer.compose")
-}
-
-dependencies {
- implementation(projects.coreNetworking)
- implementation(projects.coreNavigation)
- implementation(projects.coreShared)
- implementation(projects.coreSharedUi)
-
- implementation(libs.bundles.koin)
- implementation(libs.bundles.networking)
- implementation(libs.bundles.androidSupport)
- implementation(libs.coil)
-
- testImplementation(libs.bundles.test)
-}
\ No newline at end of file
diff --git a/feature-list-streams/.gitignore b/feature-list-streams/.gitignore
index 42afabfd..581f8daa 100644
--- a/feature-list-streams/.gitignore
+++ b/feature-list-streams/.gitignore
@@ -1 +1 @@
-/build
\ No newline at end of file
+**/build/**
\ No newline at end of file
diff --git a/feature-list-streams/build.gradle.kts b/feature-list-streams/build.gradle.kts
index 7faf9beb..da9998b1 100644
--- a/feature-list-streams/build.gradle.kts
+++ b/feature-list-streams/build.gradle.kts
@@ -1,30 +1,36 @@
@file:Suppress("UnstableApiUsage")
plugins {
- id("com.streamplayer.android-library")
- id("com.streamplayer.compose")
- alias(libs.plugins.ksp)
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
}
-dependencies {
- implementation(projects.coreNetworking)
- implementation(projects.coreNavigation)
- implementation(projects.coreShared)
- implementation(projects.coreSharedUi)
- implementation(projects.coreLocalStorage)
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(projects.coreNetworking)
+ implementation(projects.coreNavigation)
+ implementation(projects.coreShared)
+ implementation(projects.coreSharedUi)
+ implementation(projects.coreLocalStorage)
- implementation(libs.bundles.koin)
- implementation(libs.koin.annotations)
- ksp(libs.koin.compiler)
+ implementation(compose.components.resources)
+ implementation(compose.material3)
+ implementation(compose.ui)
+ implementation(compose.preview)
- implementation(libs.bundles.networking)
- implementation(libs.roomRuntime)
- implementation(libs.bundles.androidSupport)
- implementation(libs.coil)
+ implementation(libs.paging.compose)
- testImplementation(libs.bundles.test)
-}
+ implementation(libs.navigation.compose)
+
+ implementation(libs.coil)
+
+ implementation(libs.ktor.client.content.serialization.json)
+ implementation(libs.ktor.client.content.negotiation)
-ksp {
- arg("KOIN_CONFIG_CHECK","true")
+ implementation(libs.koin.core)
+ implementation(libs.koin.compose)
+ }
+ }
}
\ No newline at end of file
diff --git a/feature-list-streams/consumer-rules.pro b/feature-list-streams/consumer-rules.pro
deleted file mode 100644
index e69de29b..00000000
diff --git a/feature-list-streams/proguard-rules.pro b/feature-list-streams/proguard-rules.pro
deleted file mode 100644
index 481bb434..00000000
--- a/feature-list-streams/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature-list-streams/src/commonMain/composeResources/drawable/ic_top_10.png b/feature-list-streams/src/commonMain/composeResources/drawable/ic_top_10.png
new file mode 100644
index 00000000..03b1f3b0
Binary files /dev/null and b/feature-list-streams/src/commonMain/composeResources/drawable/ic_top_10.png differ
diff --git a/feature-list-streams/src/main/res/drawable/image_placeholder.xml b/feature-list-streams/src/commonMain/composeResources/drawable/image_placeholder.xml
similarity index 100%
rename from feature-list-streams/src/main/res/drawable/image_placeholder.xml
rename to feature-list-streams/src/commonMain/composeResources/drawable/image_placeholder.xml
diff --git a/feature-list-streams/src/main/res/drawable/netflix_horizontal_logo.xml b/feature-list-streams/src/commonMain/composeResources/drawable/netflix_horizontal_logo.xml
similarity index 100%
rename from feature-list-streams/src/main/res/drawable/netflix_horizontal_logo.xml
rename to feature-list-streams/src/commonMain/composeResources/drawable/netflix_horizontal_logo.xml
diff --git a/feature-list-streams/src/commonMain/composeResources/values/strings.xml b/feature-list-streams/src/commonMain/composeResources/values/strings.xml
new file mode 100644
index 00000000..2211d1eb
--- /dev/null
+++ b/feature-list-streams/src/commonMain/composeResources/values/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+ Série
+ Séries
+ Filme
+ Filmes
+
+ Minha lista
+ Saiba mais
+ Assistir
+ Top 1 em %s hoje
+
+ Ícone Reprodução
+ Ícone adicionar
+ Ícone informações
+ Poster de conteúdo em destaque
+ Ícone top 10
+
+
\ No newline at end of file
diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt
new file mode 100644
index 00000000..57dec607
--- /dev/null
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt
@@ -0,0 +1,23 @@
+package com.codandotv.streamplayerapp.feature_list_streams.core
+
+import androidx.annotation.StringRes
+import com.codandotv.streamplayerapp.feature.list.streams.R
+import org.jetbrains.compose.resources.StringResource
+import streamplayerapp_kmp.feature_list_streams.generated.resources.Res
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_content_type_film
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_content_type_film_plural
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_content_type_show
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_content_type_show_plural
+
+enum class ContentType(val contentName: StringResource, val contentNameAsPlural: StringResource) {
+ SHOW(Res.string.list_content_type_show, Res.string.list_content_type_show_plural),
+ FILM(Res.string.list_content_type_film, Res.string.list_content_type_film_plural);
+
+ companion object {
+ fun getContentName(contentType: ContentType) =
+ entries.first { contentType == it }.contentName
+
+ fun getContentNameAsPlural(contentType: ContentType) =
+ entries.first { contentType == it }.contentNameAsPlural
+ }
+}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt
similarity index 97%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt
index 42a14d44..dce60971 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamRepository.kt
@@ -10,7 +10,6 @@ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.toGenres
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.toStream
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
-import org.koin.core.annotation.Factory
interface ListStreamRepository {
suspend fun getGenres(): Flow>
@@ -20,7 +19,6 @@ interface ListStreamRepository {
fun loadMovies(genre: Genre): Flow>
}
-@Factory
class ListStreamRepositoryImpl(
private val service: ListStreamService,
) : ListStreamRepository {
diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt
new file mode 100644
index 00000000..e2634895
--- /dev/null
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt
@@ -0,0 +1,59 @@
+package com.codandotv.streamplayerapp.feature_list_streams.list.data
+
+import ListStreamResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.safeRequest
+import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.GenresResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.request.parameter
+import io.ktor.client.request.url
+
+interface ListStreamService {
+ suspend fun getMovies(genres: String): NetworkResponse
+ suspend fun getPaginatedMovies(genres: String, page: Int): NetworkResponse
+ suspend fun getGenres(): NetworkResponse
+ suspend fun getTopRatedMovies(
+ sortBy: String = "vote_average.desc",
+ page: Int = 1
+ ): NetworkResponse
+}
+
+class ListStreamServiceImpl(
+ private val client: HttpClient
+) : ListStreamService {
+
+ override suspend fun getMovies(genres: String): NetworkResponse {
+ return client.safeRequest {
+ url("discover/movie")
+ parameter("with_genres", genres)
+ }
+ }
+
+ override suspend fun getPaginatedMovies(
+ genres: String,
+ page: Int
+ ): NetworkResponse {
+ return client.safeRequest {
+ url("discover/movie")
+ parameter("with_genres", genres)
+ parameter("page", page)
+ }
+ }
+
+ override suspend fun getGenres(): NetworkResponse {
+ return client.safeRequest {
+ url("genre/movie/list")
+ }
+ }
+
+ override suspend fun getTopRatedMovies(
+ sortBy: String,
+ page: Int
+ ): NetworkResponse {
+ return client.safeRequest {
+ url("discover/movie")
+ parameter("sort_by", sortBy)
+ parameter("page", page)
+ }
+ }
+}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/StreamDataSource.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/StreamDataSource.kt
similarity index 100%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/StreamDataSource.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/StreamDataSource.kt
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt
similarity index 74%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt
index 90f9bed1..3533dcdd 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/GenresResponse.kt
@@ -1,10 +1,14 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.data.model
+import kotlinx.serialization.Serializable
+
+@Serializable
data class GenreResponse(
val id: Long,
val name: String
)
+@Serializable
data class GenresResponse(
val genres: List
)
\ No newline at end of file
diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt
new file mode 100644
index 00000000..89574e2c
--- /dev/null
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt
@@ -0,0 +1,14 @@
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class StreamResponse(
+ val id: Int,
+ val title: String,
+ val overview: String,
+ val poster_path: String? = null
+)
+
+@Serializable
+data class ListStreamResponse(
+ val results: List
+)
diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt
new file mode 100644
index 00000000..e6a3a5af
--- /dev/null
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt
@@ -0,0 +1,63 @@
+package com.codandotv.streamplayerapp.feature_list_streams.list.di
+
+import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamRepository
+import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamRepositoryImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamService
+import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamServiceImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetGenresUseCase
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetGenresUseCaseImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetTopRatedStream
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetTopRatedStreamImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.ListStreamAnalytics
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.ListStreamAnalyticsImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.ListStreamUseCase
+import com.codandotv.streamplayerapp.feature_list_streams.list.domain.ListStreamUseCaseImpl
+import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens.ListStreamViewModel
+import org.koin.androidx.viewmodel.dsl.viewModel
+import org.koin.dsl.module
+
+object ListStreamModule {
+ val module = module {
+ viewModel {
+ ListStreamViewModel(
+ listStreams = get(),
+ listGenres = get(),
+ latestStream = get()
+ )
+ }
+
+ factory {
+ ListStreamUseCaseImpl(
+ repository = get()
+ )
+ }
+
+ factory {
+ GetGenresUseCaseImpl(
+ repository = get()
+ )
+ }
+
+ factory {
+ GetTopRatedStreamImpl(
+ repository = get()
+ )
+ }
+
+ factory {
+ ListStreamAnalyticsImpl()
+ }
+
+ factory {
+ ListStreamRepositoryImpl(
+ service = get(),
+ )
+ }
+
+ factory {
+ ListStreamServiceImpl(
+ client = get()
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt
similarity index 92%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt
index 36b2b4d9..e3da0b8c 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetGenresUseCase.kt
@@ -3,13 +3,11 @@ package com.codandotv.streamplayerapp.feature_list_streams.list.domain
import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamRepository
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genre
import kotlinx.coroutines.flow.Flow
-import org.koin.core.annotation.Factory
interface GetGenresUseCase {
suspend operator fun invoke(): Flow>
}
-@Factory
class GetGenresUseCaseImpl(
private val repository: ListStreamRepository
) : GetGenresUseCase {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt
similarity index 92%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt
index 7257a40c..a5300816 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/GetLatestMovieUseCase.kt
@@ -3,13 +3,11 @@ package com.codandotv.streamplayerapp.feature_list_streams.list.domain
import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamRepository
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
import kotlinx.coroutines.flow.Flow
-import org.koin.core.annotation.Factory
interface GetTopRatedStream {
suspend operator fun invoke(): Flow
}
-@Factory
class GetTopRatedStreamImpl(
private val repository: ListStreamRepository
) : GetTopRatedStream {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt
similarity index 93%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt
index 367f47be..b4aff62b 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListMovieUseCase.kt
@@ -5,13 +5,11 @@ import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamRe
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genre
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
import kotlinx.coroutines.flow.Flow
-import org.koin.core.annotation.Factory
interface ListStreamUseCase {
operator fun invoke(genre: Genre): Flow>
}
-@Factory
class ListStreamUseCaseImpl(
private val repository: ListStreamRepository
) : ListStreamUseCase {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt
similarity index 75%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt
index e599c1fa..e2fc2866 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamAnalytics.kt
@@ -1,8 +1,6 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.domain
-import org.koin.core.annotation.Factory
interface ListStreamAnalytics
-@Factory
class ListStreamAnalyticsImpl : ListStreamAnalytics
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt
similarity index 78%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt
index 5e5d86c0..105d61a4 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/ListStreamMapper.kt
@@ -1,9 +1,9 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.domain
-import com.codandotv.streamplayerapp.core_networking.Url
+import ListStreamResponse
+import StreamResponse
+import com.codandotv.streamplayerapp.core_shared.Url
import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.GenresResponse
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.ListStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.StreamResponse
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genre
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.ListStream
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
@@ -24,5 +24,5 @@ fun StreamResponse.toStream(): Stream = Stream(
description = overview,
name = title,
posterPathUrl = "${Url.IMAGE_URL_SIZE_300}${poster_path}",
- id = id
+ id = id.toString()
)
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/Genre.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/Genre.kt
similarity index 100%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/Genre.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/Genre.kt
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt
similarity index 51%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt
index 7bdd369d..75c93595 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/HighlightBanner.kt
@@ -1,24 +1,20 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.domain.model
-import android.os.Parcelable
-import androidx.annotation.DrawableRes
-import androidx.annotation.StringRes
-import kotlinx.parcelize.Parcelize
+import org.jetbrains.compose.resources.DrawableResource
+import org.jetbrains.compose.resources.StringResource
-@Parcelize
data class HighlightBanner(
val name: String,
val imageUrl: String,
- val contentType: Int,
- val contentTypeAsPlural: Int,
+ val contentType: StringResource,
+ val contentTypeAsPlural: StringResource,
val extraInfo: IconAndTextInfo,
val leftButton: IconAndTextInfo,
val centralButton: IconAndTextInfo,
val rightButton: IconAndTextInfo
-) : Parcelable
+)
-@Parcelize
data class IconAndTextInfo(
- @DrawableRes val icon: Int,
- @StringRes val text: Int
-) : Parcelable
\ No newline at end of file
+ val icon: DrawableResource,
+ val text: StringResource
+)
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/ListStream.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/ListStream.kt
similarity index 100%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/ListStream.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/domain/model/ListStream.kt
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt
similarity index 92%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt
index ac58e2be..633a92fd 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt
@@ -14,7 +14,6 @@ import com.codandotv.streamplayerapp.feature_list_streams.list.di.ListStreamModu
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens.ListStreamsScreen
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
-import org.koin.ksp.generated.module
internal const val DEFAULT_ID = ""
@@ -22,7 +21,7 @@ fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
composable(HOME_COMPLETE) { nav ->
BackHandler(true) {}
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
- loadKoinModules(ListStreamModule().module)
+ loadKoinModules(ListStreamModule.module)
}
ListStreamsScreen(navController = navController,
onNavigateDetailList = { id ->
@@ -35,7 +34,7 @@ fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
navController.navigate(Routes.SEARCH)
},
disposable = {
- unloadKoinModules(ListStreamModule().module)
+ unloadKoinModules(ListStreamModule.module)
},
profilePicture = nav.arguments?.getString(PROFILE_ID) ?: DEFAULT_ID
)
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt
similarity index 74%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt
index f470f26f..0c6ad07f 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt
@@ -5,7 +5,6 @@ import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn
import androidx.paging.map
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
-import com.codandotv.streamplayerapp.feature.list.streams.R
import com.codandotv.streamplayerapp.feature_list_streams.core.ContentType
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetGenresUseCase
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.GetTopRatedStream
@@ -14,8 +13,8 @@ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genr
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.HighlightBanner
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.IconAndTextInfo
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCardContent
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCarouselContent
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCardContent
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCarouselContent
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
@@ -25,10 +24,17 @@ import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-import org.koin.android.annotation.KoinViewModel
-import com.codandotv.streamplayerapp.core.shared.ui.R as SharedUiR
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_add
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_info
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_play
+import streamplayerapp_kmp.feature_list_streams.generated.resources.Res
+import streamplayerapp_kmp.feature_list_streams.generated.resources.ic_top_10
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res as SharedRes
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_add
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_info
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_stream_ranking
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_watch
-@KoinViewModel
class ListStreamViewModel(
private val listStreams: ListStreamUseCase,
private val listGenres: GetGenresUseCase,
@@ -64,7 +70,6 @@ class ListStreamViewModel(
}
.collect { pair ->
val (latest, genres) = pair
-
_uiState.update {
it.copy(
streamsCarouselContent = genres.map { genreTarget ->
@@ -84,23 +89,24 @@ class ListStreamViewModel(
contentType = ContentType.getContentName(ContentType.FILM),
contentTypeAsPlural = ContentType.getContentNameAsPlural(ContentType.FILM),
extraInfo = IconAndTextInfo(
- R.drawable.ic_top_10,
- R.string.list_highlight_banner_stream_ranking
+ Res.drawable.ic_top_10,
+ Res.string.list_highlight_banner_stream_ranking
),
leftButton = IconAndTextInfo(
- SharedUiR.drawable.ic_add,
- R.string.list_highlight_banner_add
+ SharedRes.drawable.ic_add,
+ Res.string.list_highlight_banner_add
),
centralButton = IconAndTextInfo(
- SharedUiR.drawable.ic_play,
- R.string.list_highlight_banner_watch
+ SharedRes.drawable.ic_play,
+ Res.string.list_highlight_banner_watch
),
rightButton = IconAndTextInfo(
- SharedUiR.drawable.ic_info,
- R.string.list_highlight_banner_info
+ SharedRes.drawable.ic_info,
+ Res.string.list_highlight_banner_info
),
)
+
private fun getStreamsByGenre(genre: Genre): StreamsCarouselContent {
return StreamsCarouselContent(
genre.name,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt
similarity index 97%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt
index 345d078b..5916e5ee 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt
@@ -31,7 +31,7 @@ import com.codandotv.streamplayerapp.core_navigation.bottomnavigation.StreamPlay
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamPlayerTopBar
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.HighlightBanner
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCarousel
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCarousel
import org.koin.androidx.compose.koinViewModel
@Suppress("LongParameterList")
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt
similarity index 76%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt
index fba66712..5260d36c 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsUIState.kt
@@ -1,7 +1,7 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.HighlightBanner
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCarouselContent
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCarouselContent
data class ListStreamsUIState(
val highlightBanner: HighlightBanner? = null,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt
similarity index 70%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt
rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt
index bbeb30ec..a5a35a4d 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt
+++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/HighlightBanner.kt
@@ -1,6 +1,5 @@
package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets
-import androidx.annotation.StringRes
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -27,8 +26,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
@@ -40,7 +37,27 @@ import com.codandotv.streamplayerapp.feature.list.streams.R
import com.codandotv.streamplayerapp.feature_list_streams.core.ContentType
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.HighlightBanner
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.IconAndTextInfo
+import org.jetbrains.compose.resources.StringResource
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.app_name
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_add
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_info
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_netflix
+import streamplayerapp_kmp.core_shared_ui.generated.resources.ic_play
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_netflix
+import streamplayerapp_kmp.feature_list_streams.generated.resources.Res
+import streamplayerapp_kmp.feature_list_streams.generated.resources.ic_top_10
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highligh_banner_content
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_add
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_info
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_highlight_banner_watch
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_icon_add
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_icon_highligh_banner_ranking
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_icon_info
+import streamplayerapp_kmp.feature_list_streams.generated.resources.list_icon_play
import com.codandotv.streamplayerapp.core.shared.ui.R as RSharedUI
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res as SharedRes
@Suppress("MagicNumber")
@Composable
@@ -78,7 +95,7 @@ fun ContentImage(modifier: Modifier = Modifier, imageUrl: String) {
modifier = modifier.fillMaxSize(),
model = imageUrl,
contentScale = ContentScale.Crop,
- contentDescription = stringResource(id = R.string.list_highligh_banner_content)
+ contentDescription = stringResource(Res.string.list_highligh_banner_content)
)
}
@@ -115,20 +132,17 @@ fun ContentName(modifier: Modifier = Modifier, name: String) {
fun ContentRanking(
modifier: Modifier = Modifier,
extraInfo: IconAndTextInfo,
- @StringRes contentTypeAsPlural: Int
+ contentTypeAsPlural: StringResource
) {
Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
Icon(
- painter = painterResource(id = extraInfo.icon),
- contentDescription = stringResource(id = R.string.list_icon_highligh_banner_ranking),
+ painter = painterResource(extraInfo.icon),
+ contentDescription = stringResource(Res.string.list_icon_highligh_banner_ranking),
modifier = Modifier.size(24.dp),
tint = Color.Unspecified
)
Text(
- text = stringResource(
- id = extraInfo.text,
- stringResource(contentTypeAsPlural).lowercase()
- ),
+ text = stringResource(contentTypeAsPlural).lowercase(),
Modifier.padding(start = 4.dp),
style = TextStyle(fontWeight = FontWeight.Bold),
fontSize = 14.sp,
@@ -138,11 +152,11 @@ fun ContentRanking(
}
@Composable
-fun ContentType(modifier: Modifier = Modifier, @StringRes contentType: Int) {
+fun ContentType(modifier: Modifier = Modifier, contentType: StringResource) {
Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
Icon(
- painter = painterResource(id = RSharedUI.drawable.ic_netflix),
- contentDescription = stringResource(id = RSharedUI.string.icon_netflix),
+ painter = painterResource(SharedRes.drawable.ic_netflix),
+ contentDescription = stringResource(SharedRes.string.icon_netflix),
modifier = Modifier.size(16.dp),
tint = Color.Unspecified
)
@@ -189,13 +203,13 @@ fun AddToListButton(
IconButton(onClick = { onClick.invoke() }, modifier = modifier) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Icon(
- painter = painterResource(id = RSharedUI.drawable.ic_add),
- contentDescription = stringResource(id = R.string.list_icon_add),
+ painter = painterResource(SharedRes.drawable.ic_add),
+ contentDescription = stringResource(Res.string.list_icon_add),
tint = Color.White,
)
Text(
fontSize = 10.sp,
- text = stringResource(id = data.leftButton.text),
+ text = stringResource(data.leftButton.text),
color = Color.White,
)
}
@@ -211,12 +225,12 @@ fun InfoButton(
IconButton(onClick = { onClick.invoke() }, modifier = modifier) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Icon(
- painter = painterResource(id = RSharedUI.drawable.ic_info),
- contentDescription = stringResource(id = R.string.list_icon_info),
+ painter = painterResource(SharedRes.drawable.ic_info),
+ contentDescription = stringResource(Res.string.list_icon_info),
tint = Color.White
)
Text(
- text = stringResource(id = data.rightButton.text),
+ text = stringResource(data.rightButton.text),
fontSize = 10.sp,
color = Color.White
)
@@ -242,14 +256,14 @@ fun PlayButton(
)
) {
Icon(
- painter = painterResource(RSharedUI.drawable.ic_play),
- contentDescription = stringResource(id = R.string.list_icon_play),
+ painter = painterResource(SharedRes.drawable.ic_play),
+ contentDescription = stringResource(Res.string.list_icon_play),
tint = Color.Black,
modifier = Modifier.padding(vertical = 8.dp)
)
Spacer(modifier = Modifier.width(4.dp))
Text(
- text = stringResource(id = R.string.list_highlight_banner_watch),
+ text = stringResource(Res.string.list_highlight_banner_watch),
color = Color.Black,
fontSize = 14.sp,
modifier = Modifier
@@ -264,17 +278,17 @@ fun PlayButton(
fun HighlightBannerPreview() {
HighlightBanner(
data = HighlightBanner(
- name = stringResource(id = RSharedUI.string.app_name),
+ name = stringResource(SharedRes.string.app_name),
imageUrl = String(),
contentType = ContentType.getContentName(ContentType.SHOW),
contentTypeAsPlural = ContentType.getContentNameAsPlural(ContentType.SHOW),
extraInfo = IconAndTextInfo(
- R.drawable.ic_top_10,
+ Res.drawable.ic_top_10,
ContentType.getContentName(ContentType.SHOW)
),
- leftButton = IconAndTextInfo(RSharedUI.drawable.ic_add, R.string.list_highlight_banner_add),
- centralButton = IconAndTextInfo(RSharedUI.drawable.ic_play, R.string.list_highlight_banner_watch),
- rightButton = IconAndTextInfo(RSharedUI.drawable.ic_info, R.string.list_highlight_banner_info),
+ leftButton = IconAndTextInfo(SharedRes.drawable.ic_add, Res.string.list_highlight_banner_add),
+ centralButton = IconAndTextInfo(SharedRes.drawable.ic_play, Res.string.list_highlight_banner_watch),
+ rightButton = IconAndTextInfo(SharedRes.drawable.ic_info, Res.string.list_highlight_banner_info),
)
)
}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt
deleted file mode 100644
index eef6a23b..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.core
-
-import androidx.annotation.StringRes
-import com.codandotv.streamplayerapp.feature.list.streams.R
-
-enum class ContentType(@StringRes val contentName: Int, @StringRes val contentNameAsPlural: Int) {
- SHOW(R.string.list_content_type_show, R.string.list_content_type_show_plural),
- FILM(R.string.list_content_type_film, R.string.list_content_type_film_plural);
-
- companion object {
- fun getContentName(contentType: ContentType) =
- values().first { contentType == it }.contentName
-
- fun getContentNameAsPlural(contentType: ContentType) =
- values().first { contentType == it }.contentNameAsPlural
- }
-}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamService.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamService.kt
deleted file mode 100644
index d61f86a4..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/data/DetailStreamService.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.detail.data
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.model.DetailStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.detail.data.model.VideoStreamsResponse
-import retrofit2.http.GET
-import retrofit2.http.Path
-
-interface DetailStreamService {
- @GET("movie/{movie_id}")
- suspend fun getMovie(@Path("movie_id") movieId: String): NetworkResponse
-
- @GET("movie/{movie_id}/videos")
- suspend fun getVideoStreams(@Path("movie_id") movieId: String): NetworkResponse
-}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt
deleted file mode 100644
index d702c49e..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/ListStreamService.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.list.data
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.GenresResponse
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.ListStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.model.StreamResponse
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface ListStreamService {
- @GET("discover/movie")
- suspend fun getMovies(@Query("with_genres") genres: String) : NetworkResponse
-
- @GET("discover/movie")
- suspend fun getPaginatedMovies(
- @Query("with_genres") genres: String,
- @Query("page") page: Int
- ) : NetworkResponse
-
- @GET("genre/movie/list")
- suspend fun getGenres(): NetworkResponse
-
- @GET("discover/movie")
- suspend fun getTopRatedMovies(
- @Query("sort_by") sortBy: String = "vote_average.desc",
- @Query("page") page: Int = 1
- ): NetworkResponse
-}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt
deleted file mode 100644
index 0cd75ada..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/data/model/ListStreamResponse.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.list.data.model
-
-@Suppress("ConstructorParameterNaming")
-data class StreamResponse(
- val id : String,
- val title : String,
- val overview : String,
- val poster_path: String? = null,
-)
-data class ListStreamResponse(
- val results: List
-)
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt
deleted file mode 100644
index 9a4ea1ac..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/di/ListStreamModule.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.list.di
-
-import com.codandotv.streamplayerapp.feature_list_streams.list.data.ListStreamService
-import org.koin.core.annotation.ComponentScan
-import org.koin.core.annotation.Factory
-import org.koin.core.annotation.Module
-import org.koin.core.context.GlobalContext
-import retrofit2.Retrofit
-
-@Module
-@ComponentScan("com.codandotv.streamplayerapp.feature_list_streams.list")
-class ListStreamModule {
-
- @Factory
- fun service(): ListStreamService {
- val koin = GlobalContext.get()
- val retrofit = koin.get()
- return retrofit.create(ListStreamService::class.java)
- }
-}
\ No newline at end of file
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/MostPopularMoviesService.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/MostPopularMoviesService.kt
deleted file mode 100644
index a2d6e452..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/MostPopularMoviesService.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.api
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import retrofit2.http.GET
-
-interface MostPopularMoviesService {
- @GET("movie/popular")
- suspend fun getPopular(): NetworkResponse
-}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/SearchStreamService.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/SearchStreamService.kt
deleted file mode 100644
index c9d43b1d..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/api/SearchStreamService.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.api
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface SearchStreamService {
- @GET("search/movie")
- suspend fun getSearch(@Query("query") query: String) : NetworkResponse
-}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt
deleted file mode 100644
index d15bdc21..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.model
-
-import com.squareup.moshi.Json
-
-data class ListSearchStreamResponse(
- @Json(name = "results")
- val results: List
-) {
- data class SearchStreamResponse(
- @Json(name = "id")
- val id: String,
- @Json(name = "title")
- val title: String,
- @Json(name="overview")
- val overview: String,
- @Json(name = "poster_path")
- val posterPath: String,
- )
-}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/di/SearchModule.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/di/SearchModule.kt
deleted file mode 100644
index 44025733..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/di/SearchModule.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.di
-
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.api.SearchStreamService
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.SearchStreamDataSourceImpl
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.MostPopularMoviesDataSource
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.MostPopularMoviesDataSourceImpl
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.MostPopularMoviesRepository
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.MostPopularMoviesRepositoryImpl
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.api.MostPopularMoviesService
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.SearchStreamDataSource
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.SearchStreamRepository
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.SearchStreamRepositoryImp
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.MostPopularMoviesUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.MostPopularMoviesUseCaseImpl
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.SearchUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.SearchUseCaseImpl
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.screens.SearchViewModel
-import org.koin.androidx.viewmodel.dsl.viewModel
-import org.koin.dsl.module
-import retrofit2.Retrofit
-
-object SearchModule {
- val module = module {
- viewModel {
- SearchViewModel(
- searchUseCase = get(),
- mostPopularMoviesUseCase = get()
- )
- }
-
- factory { get().create(SearchStreamService::class.java) }
- factory { get().create(MostPopularMoviesService::class.java) }
-
- factory { MostPopularMoviesUseCaseImpl(repository = get()) }
- factory { MostPopularMoviesDataSourceImpl(service = get()) }
- factory { MostPopularMoviesRepositoryImpl(dataSource = get()) }
-
- factory { SearchUseCaseImpl(repository = get()) }
- factory { SearchStreamDataSourceImpl(service = get()) }
- factory { SearchStreamRepositoryImp(dataSource = get()) }
- }
-}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/mapper/SearchMapper.kt b/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/mapper/SearchMapper.kt
deleted file mode 100644
index 2817a44b..00000000
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/mapper/SearchMapper.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.domain.mapper
-
-import com.codandotv.streamplayerapp.core_networking.Url
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse.SearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets.SearchStreamCardModel
-
-fun SearchStreamResponse.toSearchStreamCardModel() = SearchStreamCardModel(
- id = id,
- title = title,
- url = "${Url.IMAGE_URL_SIZE_200}${posterPath}"
-)
diff --git a/feature-list-streams/src/main/res/drawable/ic_top_10.webp b/feature-list-streams/src/main/res/drawable/ic_top_10.webp
deleted file mode 100644
index e165119d..00000000
Binary files a/feature-list-streams/src/main/res/drawable/ic_top_10.webp and /dev/null differ
diff --git a/feature-list-streams/src/main/res/layout/activity_list_stream.xml b/feature-list-streams/src/main/res/layout/activity_list_stream.xml
deleted file mode 100644
index 5377cc83..00000000
--- a/feature-list-streams/src/main/res/layout/activity_list_stream.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/feature-list-streams/src/main/res/values/content-description.xml b/feature-list-streams/src/main/res/values/content-description.xml
deleted file mode 100644
index 99cae6c4..00000000
--- a/feature-list-streams/src/main/res/values/content-description.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Ícone Reprodução
- Ícone adicionar
- Ícone informações
- Poster de conteúdo em destaque
- Ícone top 10
-
\ No newline at end of file
diff --git a/feature-list-streams/src/main/res/values/strings.xml b/feature-list-streams/src/main/res/values/strings.xml
deleted file mode 100644
index beceb11d..00000000
--- a/feature-list-streams/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
- Assistir
- Baixar E1
- Filme
- Minha Lista
- Classificar
- Compartilhar
- Baixar completo
- Pesquisar
- Voltar
-
-
- Série
- Séries
- Filme
- Filmes
-
- Minha lista
- Saiba mais
- Assistir
- Top 1 em %s hoje
-
-
-
- Principais buscas
- Principais buscas
-
-
- Houve um problema ao conectar à Netflix. Tente novamente mais tarde.
- Tente novamente
- Conteúdo não encontrado
-
-
\ No newline at end of file
diff --git a/feature-profile/build.gradle.kts b/feature-profile/build.gradle.kts
index 4695d8f9..781d5b15 100644
--- a/feature-profile/build.gradle.kts
+++ b/feature-profile/build.gradle.kts
@@ -1,28 +1,32 @@
@file:Suppress("UnstableApiUsage")
plugins {
- id("com.streamplayer.android-library")
- id("com.streamplayer.compose")
- alias(libs.plugins.ksp)
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
}
-dependencies {
- implementation(projects.coreNetworking)
- implementation(projects.coreNavigation)
- implementation(projects.coreShared)
- implementation(projects.coreSharedUi)
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(projects.coreNetworking)
+ implementation(projects.coreNavigation)
+ implementation(projects.coreShared)
+ implementation(projects.coreSharedUi)
- implementation(libs.bundles.koin)
- implementation(libs.koin.annotations)
- ksp(libs.koin.compiler)
+ implementation(libs.navigation.compose)
- implementation(libs.bundles.networking)
- implementation(libs.bundles.androidSupport)
- implementation(libs.coil)
+ implementation(compose.material3)
+ implementation(compose.ui)
+ implementation(compose.components.resources)
- testImplementation(libs.bundles.test)
-}
+ implementation(libs.coil)
-ksp {
- arg("KOIN_CONFIG_CHECK","true")
-}
+ implementation(libs.ktor.client.content.serialization.json)
+ implementation(libs.ktor.client.content.negotiation)
+
+ implementation(libs.koin.core)
+ implementation(libs.koin.compose)
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature-profile/src/main/res/drawable/image_placeholder.xml b/feature-profile/src/commonMain/composeResources/drawable/image_placeholder.xml
similarity index 100%
rename from feature-profile/src/main/res/drawable/image_placeholder.xml
rename to feature-profile/src/commonMain/composeResources/drawable/image_placeholder.xml
diff --git a/feature-profile/src/main/res/drawable/netflix_horizontal_logo.xml b/feature-profile/src/commonMain/composeResources/drawable/netflix_horizontal_logo.xml
similarity index 100%
rename from feature-profile/src/main/res/drawable/netflix_horizontal_logo.xml
rename to feature-profile/src/commonMain/composeResources/drawable/netflix_horizontal_logo.xml
diff --git a/feature-profile/src/main/res/values/strings.xml b/feature-profile/src/commonMain/composeResources/values/strings.xml
similarity index 100%
rename from feature-profile/src/main/res/values/strings.xml
rename to feature-profile/src/commonMain/composeResources/values/strings.xml
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamRepository.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamRepository.kt
similarity index 88%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamRepository.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamRepository.kt
index 7fdba887..91e2404f 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamRepository.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamRepository.kt
@@ -1,20 +1,18 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.data
+package com.codandotv.streamplayerapp.profile.data
import android.util.Log
import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
import com.codandotv.streamplayerapp.core_networking.handleError.toResult
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfileStream
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.toProfiles
+import com.codandotv.streamplayerapp.profile.domain.ProfileStream
+import com.codandotv.streamplayerapp.profile.domain.toProfiles
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
-import org.koin.core.annotation.Factory
interface ProfilePickerStreamRepository {
suspend fun getProfiles(): Flow>
}
-@Factory
class ProfilePickerStreamRepositoryImpl(
private val service: ProfilePickerStreamService
) : ProfilePickerStreamRepository {
diff --git a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamService.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamService.kt
new file mode 100644
index 00000000..e071ddf2
--- /dev/null
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/ProfilePickerStreamService.kt
@@ -0,0 +1,20 @@
+package com.codandotv.streamplayerapp.profile.data
+
+import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.safeRequest
+import com.codandotv.streamplayerapp.profile.data.model.ProfilesResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.request.url
+
+interface ProfilePickerStreamService {
+ suspend fun getProfiles(): NetworkResponse
+}
+
+class ProfilePickerStreamServiceImpl(
+ private val client: HttpClient
+) : ProfilePickerStreamService {
+ override suspend fun getProfiles(): NetworkResponse =
+ client.safeRequest {
+ url("profiles")
+ }
+}
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/model/ProfileStreamResponse.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/model/ProfileStreamResponse.kt
similarity index 63%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/model/ProfileStreamResponse.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/model/ProfileStreamResponse.kt
index b8534939..afac8e93 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/model/ProfileStreamResponse.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/data/model/ProfileStreamResponse.kt
@@ -1,5 +1,8 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.data.model
+package com.codandotv.streamplayerapp.profile.data.model
+import kotlinx.serialization.Serializable
+
+@Serializable
@Suppress("ConstructorParameterNaming")
data class ProfileStreamResponse(
val id: String,
@@ -7,6 +10,7 @@ data class ProfileStreamResponse(
val profile_url: String,
)
+@Serializable
data class ProfilesResponse(
val profiles: List
)
\ No newline at end of file
diff --git a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/di/ProfilePickerStreamModule.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/di/ProfilePickerStreamModule.kt
new file mode 100644
index 00000000..b026f91b
--- /dev/null
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/di/ProfilePickerStreamModule.kt
@@ -0,0 +1,39 @@
+package com.codandotv.streamplayerapp.profile.di
+
+import com.codandotv.streamplayerapp.profile.data.ProfilePickerStreamRepository
+import com.codandotv.streamplayerapp.profile.data.ProfilePickerStreamRepositoryImpl
+import com.codandotv.streamplayerapp.profile.data.ProfilePickerStreamService
+import com.codandotv.streamplayerapp.profile.data.ProfilePickerStreamServiceImpl
+import com.codandotv.streamplayerapp.profile.domain.ProfilePickerStreamUseCase
+import com.codandotv.streamplayerapp.profile.domain.ProfilePickerStreamUseCaseImpl
+import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamViewModel
+import org.koin.androidx.viewmodel.dsl.viewModel
+import org.koin.dsl.module
+
+object ProfilePickerStreamModule {
+ val module = module {
+ viewModel {
+ ProfilePickerStreamViewModel(
+ useCase = get()
+ )
+ }
+
+ factory {
+ ProfilePickerStreamUseCaseImpl(
+ profilePickerStreamRepository = get()
+ )
+ }
+
+ factory {
+ ProfilePickerStreamRepositoryImpl(
+ service = get()
+ )
+ }
+
+ factory {
+ ProfilePickerStreamServiceImpl(
+ client = get()
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamMapper.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamMapper.kt
similarity index 60%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamMapper.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamMapper.kt
index 6d5ce0ac..ff732549 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamMapper.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamMapper.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.domain
+package com.codandotv.streamplayerapp.profile.domain
-import com.codandotv.streamplayerapp.feature_profile.profile.data.model.ProfilesResponse
+import com.codandotv.streamplayerapp.profile.data.model.ProfilesResponse
fun ProfilesResponse.toProfiles(): List = this.profiles.map { profileResponse ->
ProfileStream(
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamUseCase.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamUseCase.kt
similarity index 91%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamUseCase.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamUseCase.kt
index 225a15be..abf1a4a6 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfilePickerStreamUseCase.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfilePickerStreamUseCase.kt
@@ -1,9 +1,8 @@
@file:Suppress("MagicNumber")
-package com.codandotv.streamplayerapp.feature_profile.profile.domain
+package com.codandotv.streamplayerapp.profile.domain
-import com.codandotv.streamplayerapp.feature_profile.profile.data.ProfilePickerStreamRepository
+import com.codandotv.streamplayerapp.profile.data.ProfilePickerStreamRepository
import kotlinx.coroutines.flow.Flow
-import org.koin.core.annotation.Factory
interface ProfilePickerStreamUseCase {
suspend fun getProfile(): Flow>
@@ -22,7 +21,6 @@ interface ProfilePickerStreamUseCase {
): Pair
}
-@Factory
class ProfilePickerStreamUseCaseImpl(
private val profilePickerStreamRepository: ProfilePickerStreamRepository
) : ProfilePickerStreamUseCase {
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfileStream.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfileStream.kt
similarity index 57%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfileStream.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfileStream.kt
index 7c365999..5440084a 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/domain/ProfileStream.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/domain/ProfileStream.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.domain
+package com.codandotv.streamplayerapp.profile.domain
data class ProfileStream(
val id: String,
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/navigation/ProfilePickerStreamNavigation.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt
similarity index 67%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/navigation/ProfilePickerStreamNavigation.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt
index 3624f939..8d42759a 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/navigation/ProfilePickerStreamNavigation.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.navigation
+package com.codandotv.streamplayerapp.profile.presentation.navigation
import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
@@ -7,23 +7,22 @@ import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes.HOME
import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes.PARAM.PROFILE_ID
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
-import com.codandotv.streamplayerapp.feature_profile.profile.di.ProfilePickerStreamModule
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens.ProfilePickerStreamScreen
+import com.codandotv.streamplayerapp.profile.di.ProfilePickerStreamModule
+import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamScreen
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
-import org.koin.ksp.generated.module
fun NavGraphBuilder.profilePickerStreamNavGraph(navController: NavHostController) {
composable(Routes.PROFILE_PICKER) { nav ->
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
- loadKoinModules(ProfilePickerStreamModule().module)
+ loadKoinModules(ProfilePickerStreamModule.module)
}
ProfilePickerStreamScreen(
onNavigateListStreams = { profilePic ->
navController.navigate("$HOME?$PROFILE_ID=$profilePic")
}
) {
- unloadKoinModules(ProfilePickerStreamModule().module)
+ unloadKoinModules(ProfilePickerStreamModule.module)
}
}
}
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamScreen.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt
similarity index 81%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamScreen.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt
index e54b0442..0e8818f2 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamScreen.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens
+package com.codandotv.streamplayerapp.profile.presentation.screens
import android.annotation.SuppressLint
import androidx.compose.animation.animateColorAsState
@@ -16,7 +16,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLifecycleOwner
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.LifecycleOwner
@@ -24,14 +23,20 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreview
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
import com.codandotv.streamplayerapp.feature.profile.R
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfileStream
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.LoadScreen
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.ProfilePickerOpacityLayer
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.ProfilePickerProfilesGrid
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.ProfilePickerSelectedProfileContainer
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.ProfilePickerStreamToolbar
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget.dpToPx
+import com.codandotv.streamplayerapp.profile.domain.ProfileStream
+import com.codandotv.streamplayerapp.profile.presentation.widget.LoadScreen
+import com.codandotv.streamplayerapp.profile.presentation.widget.ProfilePickerOpacityLayer
+import com.codandotv.streamplayerapp.profile.presentation.widget.ProfilePickerProfilesGrid
+import com.codandotv.streamplayerapp.profile.presentation.widget.ProfilePickerSelectedProfileContainer
+import com.codandotv.streamplayerapp.profile.presentation.widget.ProfilePickerStreamToolbar
+import com.codandotv.streamplayerapp.profile.presentation.widget.dpToPx
+import org.jetbrains.compose.resources.stringResource
import org.koin.androidx.compose.koinViewModel
+import streamplayerapp_kmp.feature_profile.generated.resources.Res
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation_background_opacity
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation_selected_image_position
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation_selected_image_size
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation_showing_all_profiles
@Composable
fun ProfilePickerStreamScreen(
@@ -81,7 +86,7 @@ private fun SetupProfilePickerScreen(
} else {
Color.Transparent
},
- label = stringResource(R.string.profile_animation_background_opacity),
+ label = stringResource(Res.string.profile_animation_background_opacity),
animationSpec = tween(durationMillis = 1000),
finishedListener = {
onSetCenterImageAlpha(0f)
@@ -109,13 +114,13 @@ private fun SetupProfilePickerScreen(
// Preparing animations
val animatedSizeImage by animateDpAsState(
targetValue = if (expandImage) expandedImageSize.dp else defaultImageSize.dp,
- label = stringResource(R.string.profile_animation_selected_image_size),
+ label = stringResource(Res.string.profile_animation_selected_image_size),
animationSpec = tween(durationMillis = 1000),
)
val animatedProfileAlpha: Float by animateFloatAsState(
if (lastItemPositioned) 1f else 0f,
- label = stringResource(R.string.profile_animation_showing_all_profiles),
+ label = stringResource(Res.string.profile_animation_showing_all_profiles),
)
val animatedOffsetSelectedProfileImage by animateIntOffsetAsState(
@@ -130,7 +135,7 @@ private fun SetupProfilePickerScreen(
IntOffset(0, 0)
}
},
- label = stringResource(R.string.profile_animation_selected_image_position),
+ label = stringResource(Res.string.profile_animation_selected_image_position),
animationSpec = tween(durationMillis = if (!showCenterImage) 100 else 800)
)
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamViewModel.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt
similarity index 93%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamViewModel.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt
index 36e3aa90..75b5a2b6 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamViewModel.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt
@@ -1,21 +1,19 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens
+package com.codandotv.streamplayerapp.profile.presentation.screens
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfilePickerStreamUseCase
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfileStream
+import com.codandotv.streamplayerapp.profile.domain.ProfilePickerStreamUseCase
+import com.codandotv.streamplayerapp.profile.domain.ProfileStream
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-import org.koin.android.annotation.KoinViewModel
-@KoinViewModel
class ProfilePickerStreamViewModel(
private val useCase: ProfilePickerStreamUseCase,
) : ViewModel(), DefaultLifecycleObserver {
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamsUIState.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamsUIState.kt
similarity index 83%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamsUIState.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamsUIState.kt
index 414b8d83..0ca2751b 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/screens/ProfilePickerStreamsUIState.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamsUIState.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens
+package com.codandotv.streamplayerapp.profile.presentation.screens
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfileStream
+import com.codandotv.streamplayerapp.profile.domain.ProfileStream
data class ProfilePickerStreamsUIState(
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ComposeExtensions.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ComposeExtensions.kt
similarity index 72%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ComposeExtensions.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ComposeExtensions.kt
index 2d30f8c5..109a6561 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ComposeExtensions.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ComposeExtensions.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalDensity
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerOpacityLayer.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerOpacityLayer.kt
similarity index 84%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerOpacityLayer.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerOpacityLayer.kt
index f8fb3601..efbd403f 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerOpacityLayer.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerOpacityLayer.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerProfilesGrid.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerProfilesGrid.kt
similarity index 83%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerProfilesGrid.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerProfilesGrid.kt
index f24737a2..0fe678f4 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerProfilesGrid.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerProfilesGrid.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.BoxWithConstraints
@@ -18,14 +18,17 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.codandotv.streamplayerapp.feature.profile.R
-import com.codandotv.streamplayerapp.feature_profile.profile.domain.ProfileStream
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens.ProfilePickerStreamsUIState
+import com.codandotv.streamplayerapp.profile.domain.ProfileStream
+import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamsUIState
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.feature_profile.generated.resources.Res
+import streamplayerapp_kmp.feature_profile.generated.resources.image_placeholder
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_current_profile_name
@Composable
fun ProfilePickerProfilesGrid(
@@ -92,11 +95,10 @@ private fun ProfileItem(
) {
AsyncImage(
model = profile.imageUrl,
- placeholder = painterResource(id = R.drawable.image_placeholder),
+ placeholder = painterResource(Res.drawable.image_placeholder),
contentDescription = stringResource(
- id = R.string.profile_current_profile_name,
- profile.name
- ),
+ Res.string.profile_current_profile_name,
+ ).format(profile.name),
modifier = Modifier
.clip(RoundedCornerShape(5))
.alpha(if (selectedItem == profile) selectedImageAlpha else 1f)
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt
similarity index 71%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt
index beade0ac..e42b7786 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerSelectedProfileContainer.kt
@@ -1,5 +1,6 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
+import android.annotation.SuppressLint
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
@@ -13,16 +14,19 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.request.ImageRequest
-import com.codandotv.streamplayerapp.feature.profile.R
-import com.codandotv.streamplayerapp.feature_profile.profile.presentation.screens.ProfilePickerStreamsUIState
+import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamsUIState
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.feature_profile.generated.resources.Res
+import streamplayerapp_kmp.feature_profile.generated.resources.image_placeholder
+import streamplayerapp_kmp.feature_profile.generated.resources.profile_current_profile_name
+@SuppressLint("UnusedBoxWithConstraintsScope")
@Suppress("MagicNumber")
@Composable
fun ProfilePickerSelectedProfileContainer(
@@ -47,12 +51,11 @@ fun ProfilePickerSelectedProfileContainer(
.data(selectedItem?.imageUrl)
.crossfade(true)
.build(),
- placeholder = painterResource(id = R.drawable.image_placeholder),
+ placeholder = painterResource(Res.drawable.image_placeholder),
contentDescription = selectedItem?.let {
stringResource(
- id = R.string.profile_current_profile_name,
- it.name
- )
+ Res.string.profile_current_profile_name,
+ ).format(it.name)
},
modifier = Modifier
.clip(RoundedCornerShape(5))
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamLoad.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamLoad.kt
similarity index 85%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamLoad.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamLoad.kt
index 7c2bc50d..a2746cbd 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamLoad.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamLoad.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamToolbar.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamToolbar.kt
similarity index 83%
rename from feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamToolbar.kt
rename to feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamToolbar.kt
index 50a2c455..e8727675 100644
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/presentation/widget/ProfilePickerStreamToolbar.kt
+++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/widget/ProfilePickerStreamToolbar.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget
+package com.codandotv.streamplayerapp.profile.presentation.widget
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
@@ -14,10 +14,11 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
-import com.codandotv.streamplayerapp.feature.profile.R
+import org.jetbrains.compose.resources.painterResource
+import streamplayerapp_kmp.feature_profile.generated.resources.Res
+import streamplayerapp_kmp.feature_profile.generated.resources.netflix_horizontal_logo
@Composable
fun ProfilePickerStreamToolbar(modifier: Modifier = Modifier) {
@@ -34,7 +35,7 @@ fun ProfilePickerStreamToolbar(modifier: Modifier = Modifier) {
horizontalArrangement = Arrangement.Center
) {
Image(
- painter = painterResource(id = R.drawable.netflix_horizontal_logo),
+ painter = painterResource(Res.drawable.netflix_horizontal_logo),
contentDescription = null,
modifier = Modifier
.height(28.dp)
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamService.kt b/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamService.kt
deleted file mode 100644
index 6c512286..00000000
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/data/ProfilePickerStreamService.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.data
-
-import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
-import com.codandotv.streamplayerapp.feature_profile.profile.data.model.ProfilesResponse
-import retrofit2.http.GET
-
-interface ProfilePickerStreamService {
- @GET("profiles")
- suspend fun getProfiles(): NetworkResponse
-}
\ No newline at end of file
diff --git a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/di/ProfilePickerStreamModule.kt b/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/di/ProfilePickerStreamModule.kt
deleted file mode 100644
index d6ae9651..00000000
--- a/feature-profile/src/main/java/com/codandotv/streamplayerapp/feature_profile/profile/di/ProfilePickerStreamModule.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.codandotv.streamplayerapp.feature_profile.profile.di
-
-import com.codandotv.streamplayerapp.core_networking.di.QualifierProfileRetrofit
-import com.codandotv.streamplayerapp.feature_profile.profile.data.ProfilePickerStreamService
-import org.koin.core.annotation.ComponentScan
-import org.koin.core.annotation.Factory
-import org.koin.core.annotation.Module
-import org.koin.core.context.GlobalContext
-import retrofit2.Retrofit
-
-@Module
-@ComponentScan("com.codandotv.streamplayerapp.feature_profile")
-class ProfilePickerStreamModule {
-
- @Factory
- fun service(): ProfilePickerStreamService {
- val koin = GlobalContext.get()
- val retrofit = koin.get(QualifierProfileRetrofit)
- return retrofit.create(ProfilePickerStreamService::class.java)
- }
-
-}
diff --git a/feature-search/.gitignore b/feature-search/.gitignore
new file mode 100644
index 00000000..581f8daa
--- /dev/null
+++ b/feature-search/.gitignore
@@ -0,0 +1 @@
+**/build/**
\ No newline at end of file
diff --git a/feature-search/build.gradle.kts b/feature-search/build.gradle.kts
new file mode 100644
index 00000000..08be24cd
--- /dev/null
+++ b/feature-search/build.gradle.kts
@@ -0,0 +1,36 @@
+@file:Suppress("UnstableApiUsage")
+
+plugins {
+ id("com.streamplayer.kmp-library")
+ alias(libs.plugins.jetbrains.compose)
+ alias(libs.plugins.compose.compiler)
+}
+
+kotlin {
+ sourceSets {
+ commonMain.dependencies {
+ implementation(libs.paging.compose)
+
+ implementation(projects.coreNetworking)
+ implementation(projects.coreNavigation)
+ implementation(projects.coreShared)
+ implementation(projects.coreSharedUi)
+ implementation(projects.coreLocalStorage)
+
+ implementation(compose.components.resources)
+ implementation(compose.material3)
+ implementation(compose.ui)
+ implementation(compose.preview)
+
+ implementation(libs.navigation.compose)
+
+ implementation(libs.coil)
+
+ implementation(libs.ktor.client.content.serialization.json)
+ implementation(libs.ktor.client.content.negotiation)
+
+ implementation(libs.koin.core)
+ implementation(libs.koin.compose)
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature-search/src/commonMain/composeResources/values/strings.xml b/feature-search/src/commonMain/composeResources/values/strings.xml
new file mode 100644
index 00000000..e8445742
--- /dev/null
+++ b/feature-search/src/commonMain/composeResources/values/strings.xml
@@ -0,0 +1,12 @@
+
+
+
+ Principais buscas
+ Principais buscas
+ Voltar
+
+
+ Houve um problema ao conectar à Netflix. Tente novamente mais tarde.
+ Tente novamente
+ Conteúdo não encontrado
+
\ No newline at end of file
diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/MostPopularMoviesService.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/MostPopularMoviesService.kt
new file mode 100644
index 00000000..aa4ac25f
--- /dev/null
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/MostPopularMoviesService.kt
@@ -0,0 +1,22 @@
+package com.codandotv.streamplayerapp.feature_search.data.api
+
+import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.safeRequest
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.call.body
+import io.ktor.client.request.get
+import io.ktor.client.request.url
+
+interface MostPopularMoviesService {
+ suspend fun getPopular(): NetworkResponse
+}
+
+class MostPopularMoviesServiceImpl(
+ private val client: HttpClient
+) : MostPopularMoviesService {
+ override suspend fun getPopular(): NetworkResponse =
+ client.safeRequest {
+ url("movie/popular")
+ }
+}
diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/SearchStreamService.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/SearchStreamService.kt
new file mode 100644
index 00000000..1020971f
--- /dev/null
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/api/SearchStreamService.kt
@@ -0,0 +1,22 @@
+package com.codandotv.streamplayerapp.feature_search.data.api
+
+import com.codandotv.streamplayerapp.core_networking.handleError.NetworkResponse
+import com.codandotv.streamplayerapp.core_networking.handleError.safeRequest
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import io.ktor.client.HttpClient
+import io.ktor.client.request.parameter
+import io.ktor.client.request.url
+
+interface SearchStreamService {
+ suspend fun getSearch(query: String): NetworkResponse
+}
+
+class SearchStreamServiceImpl(
+ private val client: HttpClient
+) : SearchStreamService {
+ override suspend fun getSearch(query: String): NetworkResponse =
+ client.safeRequest {
+ url("search/movie")
+ parameter("query", query)
+ }
+}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/MostPopularMoviesDataSource.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/MostPopularMoviesDataSource.kt
similarity index 62%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/MostPopularMoviesDataSource.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/MostPopularMoviesDataSource.kt
index 82f01044..b074864d 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/MostPopularMoviesDataSource.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/MostPopularMoviesDataSource.kt
@@ -1,8 +1,8 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource
+package com.codandotv.streamplayerapp.feature_search.data.datasource
import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.api.MostPopularMoviesService
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.api.MostPopularMoviesService
import kotlinx.coroutines.flow.Flow
interface MostPopularMoviesDataSource {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/SearchStreamDataSource.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/SearchStreamDataSource.kt
similarity index 63%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/SearchStreamDataSource.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/SearchStreamDataSource.kt
index 77f25ce3..e3d65b3b 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/datasource/SearchStreamDataSource.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/datasource/SearchStreamDataSource.kt
@@ -1,8 +1,8 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource
+package com.codandotv.streamplayerapp.feature_search.data.datasource
import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.api.SearchStreamService
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.api.SearchStreamService
import kotlinx.coroutines.flow.Flow
interface SearchStreamDataSource {
diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt
new file mode 100644
index 00000000..88fa6d04
--- /dev/null
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt
@@ -0,0 +1,22 @@
+package com.codandotv.streamplayerapp.feature_search.data.model
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class ListSearchStreamResponse(
+ @SerialName("results")
+ val results: List
+) {
+ @Serializable
+ data class SearchStreamResponse(
+ @SerialName("id")
+ val id: Int,
+ @SerialName("title")
+ val title: String,
+ @SerialName("overview")
+ val overview: String,
+ @SerialName("poster_path")
+ val posterPath: String? = null
+ )
+}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/MostPopularMoviesRepository.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/MostPopularMoviesRepository.kt
similarity index 58%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/MostPopularMoviesRepository.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/MostPopularMoviesRepository.kt
index cbf9ddb3..5fbf97e5 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/MostPopularMoviesRepository.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/MostPopularMoviesRepository.kt
@@ -1,7 +1,7 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.repository
+package com.codandotv.streamplayerapp.feature_search.data.repository
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.MostPopularMoviesDataSource
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.datasource.MostPopularMoviesDataSource
import kotlinx.coroutines.flow.Flow
interface MostPopularMoviesRepository {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/SearchStreamRepository.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/SearchStreamRepository.kt
similarity index 58%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/SearchStreamRepository.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/SearchStreamRepository.kt
index d336d2ba..9b101176 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/repository/SearchStreamRepository.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/repository/SearchStreamRepository.kt
@@ -1,7 +1,7 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.data.repository
+package com.codandotv.streamplayerapp.feature_search.data.repository
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.datasource.SearchStreamDataSource
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.datasource.SearchStreamDataSource
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import kotlinx.coroutines.flow.Flow
interface SearchStreamRepository {
diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/di/SearchModule.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/di/SearchModule.kt
new file mode 100644
index 00000000..4d6215cd
--- /dev/null
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/di/SearchModule.kt
@@ -0,0 +1,43 @@
+package com.codandotv.streamplayerapp.feature_search.di
+
+import com.codandotv.streamplayerapp.feature_search.data.api.SearchStreamService
+import com.codandotv.streamplayerapp.feature_search.data.datasource.SearchStreamDataSourceImpl
+import com.codandotv.streamplayerapp.feature_search.data.datasource.MostPopularMoviesDataSource
+import com.codandotv.streamplayerapp.feature_search.data.datasource.MostPopularMoviesDataSourceImpl
+import com.codandotv.streamplayerapp.feature_search.data.repository.MostPopularMoviesRepository
+import com.codandotv.streamplayerapp.feature_search.data.repository.MostPopularMoviesRepositoryImpl
+import com.codandotv.streamplayerapp.feature_search.data.api.MostPopularMoviesService
+import com.codandotv.streamplayerapp.feature_search.data.api.MostPopularMoviesServiceImpl
+import com.codandotv.streamplayerapp.feature_search.data.api.SearchStreamServiceImpl
+import com.codandotv.streamplayerapp.feature_search.data.datasource.SearchStreamDataSource
+import com.codandotv.streamplayerapp.feature_search.data.repository.SearchStreamRepository
+import com.codandotv.streamplayerapp.feature_search.data.repository.SearchStreamRepositoryImp
+import com.codandotv.streamplayerapp.feature_search.domain.MostPopularMoviesUseCase
+import com.codandotv.streamplayerapp.feature_search.domain.MostPopularMoviesUseCaseImpl
+import com.codandotv.streamplayerapp.feature_search.domain.SearchUseCase
+import com.codandotv.streamplayerapp.feature_search.domain.SearchUseCaseImpl
+import com.codandotv.streamplayerapp.feature_search.presentation.screens.SearchViewModel
+import org.koin.androidx.viewmodel.dsl.viewModel
+import org.koin.dsl.module
+
+object SearchModule {
+ val module = module {
+ viewModel {
+ SearchViewModel(
+ searchUseCase = get(),
+ mostPopularMoviesUseCase = get()
+ )
+ }
+
+ factory { SearchStreamServiceImpl(get()) }
+ factory { MostPopularMoviesServiceImpl(get()) }
+
+ factory { MostPopularMoviesUseCaseImpl(repository = get()) }
+ factory { MostPopularMoviesDataSourceImpl(service = get()) }
+ factory { MostPopularMoviesRepositoryImpl(dataSource = get()) }
+
+ factory { SearchUseCaseImpl(repository = get()) }
+ factory { SearchStreamDataSourceImpl(service = get()) }
+ factory { SearchStreamRepositoryImp(dataSource = get()) }
+ }
+}
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/MostPopularMoviesUseCase.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/MostPopularMoviesUseCase.kt
similarity index 58%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/MostPopularMoviesUseCase.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/MostPopularMoviesUseCase.kt
index 1ba461fc..b924c782 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/MostPopularMoviesUseCase.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/MostPopularMoviesUseCase.kt
@@ -1,7 +1,7 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.domain
+package com.codandotv.streamplayerapp.feature_search.domain
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.MostPopularMoviesRepository
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.repository.MostPopularMoviesRepository
import kotlinx.coroutines.flow.Flow
interface MostPopularMoviesUseCase {
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/SearchUseCase.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/SearchUseCase.kt
similarity index 57%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/SearchUseCase.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/SearchUseCase.kt
index 90e2e3b9..075f7bfe 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/domain/SearchUseCase.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/SearchUseCase.kt
@@ -1,7 +1,7 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.domain
+package com.codandotv.streamplayerapp.feature_search.domain
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.repository.SearchStreamRepository
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.repository.SearchStreamRepository
import kotlinx.coroutines.flow.Flow
interface SearchUseCase {
diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/mapper/SearchMapper.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/mapper/SearchMapper.kt
new file mode 100644
index 00000000..a96edcb1
--- /dev/null
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/domain/mapper/SearchMapper.kt
@@ -0,0 +1,11 @@
+package com.codandotv.streamplayerapp.feature_search.domain.mapper
+
+import com.codandotv.streamplayerapp.core_shared.Url
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse.SearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.presentation.widgets.SearchStreamCardModel
+
+fun SearchStreamResponse.toSearchStreamCardModel() = SearchStreamCardModel(
+ id = id.toString(),
+ title = title,
+ url = "${Url.IMAGE_URL_SIZE_200}${posterPath}"
+)
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/navigation/SearchStreamNavigation.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt
similarity index 77%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/navigation/SearchStreamNavigation.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt
index adcec747..ebcf0742 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/navigation/SearchStreamNavigation.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.navigation
+package com.codandotv.streamplayerapp.feature_search.presentation.navigation
import androidx.activity.compose.BackHandler
import androidx.lifecycle.Lifecycle
@@ -6,8 +6,8 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
-import com.codandotv.streamplayerapp.feature_list_streams.search.di.SearchModule
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.screens.SearchScreen
+import com.codandotv.streamplayerapp.feature_search.di.SearchModule
+import com.codandotv.streamplayerapp.feature_search.presentation.screens.SearchScreen
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchScreen.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt
similarity index 83%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchScreen.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt
index f3f68d21..94ff555e 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchScreen.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.screens
+package com.codandotv.streamplayerapp.feature_search.presentation.screens
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Box
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.CircularProgressIndicator
-import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -19,21 +18,21 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLifecycleOwner
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.codandotv.streamplayerapp.core_navigation.extensions.goBack
-import com.codandotv.streamplayerapp.feature.list.streams.R
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.mapper.toSearchStreamCardModel
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets.SearchStreamCard
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets.SearchableTopBar
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets.StreamsEmpty
-import com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets.StreamsError
+import com.codandotv.streamplayerapp.feature_search.domain.mapper.toSearchStreamCardModel
+import com.codandotv.streamplayerapp.feature_search.presentation.widgets.SearchStreamCard
+import com.codandotv.streamplayerapp.feature_search.presentation.widgets.SearchableTopBar
+import com.codandotv.streamplayerapp.feature_search.presentation.widgets.StreamsEmpty
+import com.codandotv.streamplayerapp.feature_search.presentation.widgets.StreamsError
+import org.jetbrains.compose.resources.stringResource
import org.koin.androidx.compose.koinViewModel
+import streamplayerapp_kmp.feature_search.generated.resources.Res
+import streamplayerapp_kmp.feature_search.generated.resources.search_list_describle
@Composable
fun SearchScreen(
@@ -43,7 +42,7 @@ fun SearchScreen(
disposable: () -> Unit = {}
) {
- val uiState by viewModel.uiState.collectAsStateWithLifecycle()
+ val uiState by viewModel.uiState.collectAsState()
Lifecycle(
lifecycleOwner = LocalLifecycleOwner.current,
viewModel = viewModel,
@@ -88,7 +87,6 @@ fun SearchScreen(
}
}
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun SetupSearchScreen(
onNavigateDetailList: (String) -> Unit = {},
@@ -129,7 +127,7 @@ private fun SetupSearchScreen(
.verticalScroll(rememberScrollState()),
) {
Text(
- text = stringResource(id = R.string.search_list_describle),
+ text = stringResource(Res.string.search_list_describle),
color = Color.White,
fontWeight = FontWeight.SemiBold,
fontSize = 20.sp,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchUIState.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchUIState.kt
similarity index 58%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchUIState.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchUIState.kt
index 965ec7dd..3e716dfc 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchUIState.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchUIState.kt
@@ -1,6 +1,6 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.screens
+package com.codandotv.streamplayerapp.feature_search.presentation.screens
-import com.codandotv.streamplayerapp.feature_list_streams.search.data.model.ListSearchStreamResponse
+import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
sealed class SearchUIState {
data class Success(val listCharacters: ListSearchStreamResponse) : SearchUIState()
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchViewModel.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt
similarity index 92%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchViewModel.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt
index f02c07ac..f1d48fdd 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/screens/SearchViewModel.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt
@@ -1,11 +1,11 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.screens
+package com.codandotv.streamplayerapp.feature_search.presentation.screens
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.MostPopularMoviesUseCase
-import com.codandotv.streamplayerapp.feature_list_streams.search.domain.SearchUseCase
+import com.codandotv.streamplayerapp.feature_search.domain.MostPopularMoviesUseCase
+import com.codandotv.streamplayerapp.feature_search.domain.SearchUseCase
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchCarousel.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchCarousel.kt
similarity index 79%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchCarousel.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchCarousel.kt
index 0e884005..5009e593 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchCarousel.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchCarousel.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets
+package com.codandotv.streamplayerapp.feature_search.presentation.widgets
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -21,7 +21,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@@ -31,11 +30,18 @@ import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.itemContentType
import androidx.paging.compose.itemKey
-import com.codandotv.streamplayerapp.feature.list.streams.R
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCard
-import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCardContent
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCard
+import com.codandotv.streamplayerapp.core_shared_ui.widget.StreamsCardContent
+import com.codandotv.streamplayerapp.feature.search.R
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.feature_search.generated.resources.Res
+import streamplayerapp_kmp.feature_search.generated.resources.bottom_search_list_error
+import streamplayerapp_kmp.feature_search.generated.resources.empty_search_list
+import streamplayerapp_kmp.feature_search.generated.resources.search_back
+import streamplayerapp_kmp.feature_search.generated.resources.search_list_describle
+import streamplayerapp_kmp.feature_search.generated.resources.search_list_error
data class SearchCarousel(
val genreTitle: String,
@@ -51,7 +57,7 @@ fun SearchCarouselStream(
val lazyPagingItems = content.contentList.collectAsLazyPagingItems()
Text(
- text = stringResource(id = R.string.search_list_describle),
+ text = stringResource(Res.string.search_list_describle),
color = Color.Black,
fontSize = 14.sp
)
@@ -105,12 +111,12 @@ fun StreamsError(
}) {
Icon(
imageVector = Icons.Filled.Close,
- contentDescription = stringResource(id = R.string.detail_back),
+ contentDescription = stringResource(Res.string.search_back),
tint = Color.White
)
}
Text(
- text = stringResource(id = R.string.search_list_error),
+ text = stringResource(Res.string.search_list_error),
color = Color.White,
fontWeight = FontWeight.SemiBold,
fontSize = 20.sp,
@@ -132,7 +138,7 @@ fun StreamsError(
),
shape = RoundedCornerShape(8.dp),
) {
- Text(text = stringResource(id = R.string.bottom_search_list_error))
+ Text(text = stringResource(Res.string.bottom_search_list_error))
}
}
}
@@ -143,7 +149,7 @@ fun StreamsEmpty() {
Row(verticalAlignment = Alignment.CenterVertically) {
Column {
Text(
- text = stringResource(id = R.string.empty_search_list),
+ text = stringResource(Res.string.empty_search_list),
color = Color.White,
fontWeight = FontWeight.SemiBold,
fontSize = 20.sp,
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreamCard.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreamCard.kt
similarity index 97%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreamCard.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreamCard.kt
index 86d1d674..54f75499 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreamCard.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreamCard.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets
+package com.codandotv.streamplayerapp.feature_search.presentation.widgets
import androidx.compose.foundation.background
import androidx.compose.foundation.border
diff --git a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreams.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreams.kt
similarity index 69%
rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreams.kt
rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreams.kt
index 6626e3ca..0aaf1e8e 100644
--- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/presentation/widgets/SearchStreams.kt
+++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/widgets/SearchStreams.kt
@@ -1,4 +1,4 @@
-package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.widgets
+package com.codandotv.streamplayerapp.feature_search.presentation.widgets
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
@@ -13,11 +13,7 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
-import androidx.compose.material.icons.filled.Cast
-import androidx.compose.material.icons.filled.Close
-import androidx.compose.material.icons.filled.MicNone
-import androidx.compose.material.icons.filled.Search
-import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -28,16 +24,23 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.codandotv.streamplayerapp.core.shared.ui.R
import com.codandotv.streamplayerapp.core_shared_ui.resources.Colors
-import com.codandotv.streamplayerapp.feature.list.streams.R as ResourceListStream
+import com.codandotv.streamplayerapp.core_shared_ui.widget.CloseButton
+import com.codandotv.streamplayerapp.core_shared_ui.widget.MicButton
+import com.codandotv.streamplayerapp.core_shared_ui.widget.SearchIcon
+import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_back
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_cast
+import streamplayerapp_kmp.core_shared_ui.generated.resources.icon_profile
+import streamplayerapp_kmp.core_shared_ui.generated.resources.perfil_fake
+import streamplayerapp_kmp.feature_search.generated.resources.Res
+import streamplayerapp_kmp.feature_search.generated.resources.search_list_main_search
+import streamplayerapp_kmp.core_shared_ui.generated.resources.Res as SharedRes
@Suppress("LongParameterList")
@Composable
@@ -79,7 +82,7 @@ private fun StreamPlayerTopBar(
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
- contentDescription = stringResource(id = R.string.icon_back),
+ contentDescription = stringResource(SharedRes.string.icon_back),
tint = Color.White,
)
}
@@ -90,8 +93,8 @@ private fun StreamPlayerTopBar(
onClick = { /* todo */ }
) {
Icon(
- imageVector = Icons.Default.Cast,
- contentDescription = stringResource(id = R.string.icon_cast),
+ imageVector = Icons.Default.Check,
+ contentDescription = stringResource(SharedRes.string.icon_cast),
tint = Color.White,
)
}
@@ -104,15 +107,14 @@ private fun StreamPlayerTopBar(
modifier = Modifier
.height(24.dp)
.clip(RoundedCornerShape(4.dp)),
- painter = painterResource(R.drawable.perfil_fake),
- contentDescription = stringResource(id = R.string.icon_profile),
+ painter = painterResource(SharedRes.drawable.perfil_fake),
+ contentDescription = stringResource(SharedRes.string.icon_profile),
tint = Color.Unspecified,
)
}
}
}
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchTopBar(
currentSearchText: String,
@@ -142,7 +144,7 @@ fun SearchTopBar(
},
placeholder = {
Text(
- text = stringResource(id = ResourceListStream.string.search_list_main_search),
+ text = stringResource(Res.string.search_list_main_search),
color = Color.Gray
)
},
@@ -168,55 +170,6 @@ fun SearchTopBar(
}
}
-@Composable
-fun DefaultIcon(
- modifier: Modifier = Modifier,
- searchIcon: ImageVector = Icons.Default.Search,
- iconColor: Color = Color.White,
- contentDescription: String = "",
- onIconClickAction: () -> Unit = {}
-) {
- IconButton(
- modifier = modifier,
- onClick = onIconClickAction
- ) {
- Icon(
- imageVector = searchIcon,
- contentDescription = contentDescription,
- tint = iconColor
- )
- }
-}
-
-@Composable
-fun SearchIcon(action: () -> Unit = {}) {
- DefaultIcon(
- searchIcon = Icons.Filled.Search,
- contentDescription = stringResource(id = R.string.icon_search),
- onIconClickAction = action,
- iconColor = Color.Gray
- )
-}
-
-@Composable
-fun CloseButton(action: () -> Unit = {}) {
- DefaultIcon(
- searchIcon = Icons.Default.Close,
- contentDescription = stringResource(id = R.string.icon_close),
- onIconClickAction = action,
- iconColor = Color.Gray
- )
-}
-
-@Composable
-private fun MicButton(action: () -> Unit = {}) {
- DefaultIcon(
- searchIcon = Icons.Default.MicNone,
- contentDescription = stringResource(id = R.string.icon_mic),
- onIconClickAction = action,
- iconColor = Color.Gray
- )
-}
@Composable
@Preview
diff --git a/gradle.properties b/gradle.properties
index f63f4eac..1d55b8a4 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -21,5 +21,4 @@ kotlin.code.style=official
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
-android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 865020d6..57383d29 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,55 +1,34 @@
[versions]
-kotlin = "1.9.25"
+kotlin = "2.0.21"
android_gradle_plugin = "8.2.2"
-koin = "3.4.0"
-koin-annotations-bom = "1.3.0"
-ksp = "1.9.25-1.0.20"
+koin = "3.5.3"
+ksp = "2.0.21-1.0.27"
+
dokka = "1.9.10"
kover = "0.7.5"
detekt = "1.23.6"
+compose_plugin_multiplataform = "1.7.1"
+navigation-compose-version = "2.7.0-alpha07"
+paging-compose = "3.3.5"
+buildkonfig = "0.15.2"
#Test
test_junit = "4.13.2"
androidx_core_testing = "2.2.0"
mockk = "1.13.7"
-kotlinx-coroutines-test= "1.8.1"
-
-#Android Test
-androidx_test_core = "1.6.1"
-androidx_test_rules = "1.6.1"
-androidx_test_runner = "1.6.2"
-androidx_test_junit_ext = "1.2.1"
-mockWebServer = "4.10.0"
-
-#Android Support
-android_core_ktx = "1.7.0"
-androidx_appcompat = "1.7.0"
-material = "1.12.0"
-dynamic_animation = "1.0.0"
-constraint_motion = "2.1.3"
-viewmodel = "2.8.6"
-androidx_core_ktx = "1.13.1"
+kotlinx-coroutines-test = "1.8.1"
#Networking
-moshi = "1.14.0"
okhttp = "4.12.0"
-retrofit = "2.9.0"
-
-#Compose
-compose = "1.5.15"
-compose_bom = "2024.09.02"
-compose_material_3 = "1.3.0"
-compose_activity = "1.5.0"
-compose_icons = "1.4.3"
-compose_navigation = "2.8.1"
-lifecycle_version = "2.8.6"
-compose_pagging="3.3.2"
+ktor = "3.0.1"
coil = "2.3.0"
lottie = "5.2.0"
#Room Database
-room = "2.5.2"
+room = "2.7.0-alpha13"
+sqlite = "2.5.0-SNAPSHOT"
+
android_youtube_player_version = "12.0.0"
@@ -57,104 +36,68 @@ android_youtube_player_version = "12.0.0"
kotlin_gradle_plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
android_gradle_plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "android_gradle_plugin" }
detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" }
+serialization = { module = "org.jetbrains.kotlin.plugin.serialization:org.jetbrains.kotlin.plugin.serialization.gradle.plugin", version.ref = "kotlin" }
+
+com-google-devtools-ksp-gradle-plugin = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }
-#Kover
kover-gradle-plugin = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kover" }
-#Coil
coil = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
-#Lottie
lottie = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottie" }
-# Kotlin
kotlin_stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk7", version.ref = "kotlin" }
-kotlin_reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" }
-
-# Android Support
-androidx_core = { group = "androidx.core", name = "core-ktx", version.ref = "androidx_core_ktx" }
-androidx_appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx_appcompat" }
-androidx_dynamicanimation = { group = "androidx.dynamicanimation", name = "dynamicanimation", version.ref = "dynamic_animation" }
-# Test
junit = { group = "junit", name = "junit", version.ref = "test_junit" }
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
mockk_android = { group = "io.mockk", name = "mockk-android", version.ref = "mockk" }
viewmodel_test = { group = "androidx.arch.core", name = "core-testing", version.ref = "androidx_core_testing" }
coroutines_test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinx-coroutines-test" }
-
-# AndroidX Lifecycle
-androidx_viewmodel_lifecycle-extensions = { group = "androidx.lifecycle", name = "lifecycle-extensions", version.ref = "viewmodel" }
-androidx_common_java = { group = "androidx.lifecycle", name = "lifecycle-reactivestreams", version.ref = "viewmodel" }
-
-# AndroidX test
-androidx_test_core = { group = "androidx.test", name = "core-ktx", version.ref = "androidx_test_core" }
-androidx_test_rules = { group = "androidx.test", name = "rules", version.ref = "androidx_test_rules" }
-androidx_test_runner = { group = "androidx.test", name = "runner", version.ref = "androidx_test_runner" }
-androidx_test_junit_ext = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidx_test_junit_ext" }
-android_test_mockwebserver = { group = "com.squareup.okhttp3", name = "mockwebserver", version.ref = "mockWebServer" }
-
-# Google
-google_material = { group = "com.google.android.material", name = "material", version.ref = "material" }
-
-# Compose
-compose_bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose_bom" }
-compose_ui = { module = "androidx.compose.ui:ui" }
-compose_toolingpreview = { module = "androidx.compose.ui:ui-tooling-preview" }
-compose_icons = { module = "androidx.compose.material:material-icons-extended" }
-compose_lifecycle = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle_version" }
-compose_material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "compose_material_3" }
-compose_navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "compose_navigation" }
-compose_pagging = { group = "androidx.paging", name = "paging-compose", version.ref = "compose_pagging" }
-compose_activity = { module = "androidx.activity:activity-compose" }
-compose_ui_tooling = { module = "androidx.compose.ui:ui-tooling" }
-compose_ui_test = { module = "androidx.compose.ui:ui-test-junit4" }
-compose_manifest = { module = "androidx.compose.ui:ui-test-manifest" }
-compose_uitest = { module = "androidx.compose.ui:ui-test" }
-compose_junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
+navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation-compose-version" }
+paging-compose = { module = "androidx.paging:paging-compose", version.ref = "paging-compose" }
# Koin
koin_test = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" }
koin_android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" }
-koin_annotations = { group = "io.insert-koin", name = "koin-annotations", version.ref = "koin-annotations-bom" }
-koin_compiler = { group = "io.insert-koin", name = "koin-ksp-compiler", version.ref = "koin-annotations-bom" }
+koin_core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" }
koin_compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" }
#Networking
-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
-moshi = { group = "com.squareup.moshi", name = "moshi-kotlin", version.ref = "moshi" }
-moshi_converter = { group = "com.squareup.retrofit2", name = "converter-moshi", version.ref = "retrofit" }
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" }
-compose-material = { group = "androidx.wear.compose", name = "compose-material", version = "1.2.0" }
+
+ktor_client_core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
+ktor_client_okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
+ktor_client_logger = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
+ktor_client_auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" }
+ktor_client_content_negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
+ktor_client_content_serialization_json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
#Room
-roomRuntime = { group = "androidx.room", name = "room-runtime", version.ref = "room"}
-roomCompiler = { group = "androidx.room", name= "room-compiler", version.ref = "room"}
-roomKtx = { group = "androidx.room", name = "room-ktx", version.ref = "room"}
+room_runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
+room_compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
+room_bundled = { group = "androidx.sqlite", name = "sqlite-bundled", version.ref = "sqlite" }
android_youtube_player = { group = "com.pierfrancescosoffritti.androidyoutubeplayer", name = "core", version.ref = "android_youtube_player_version" }
dokka = { group = "org.jetbrains.dokka", name = "android-documentation-plugin", version.ref = "dokka" }
[bundles]
-room = ["roomRuntime","roomKtx"]
-compose = ["compose.ui", "compose.icons", "compose.material3","compose_pagging", "compose.lifecycle", "compose.navigation", "compose.activity", "compose.ui.tooling"]
-composetest = ["compose.uitest", "compose.junit4", "compose.manifest", "compose.ui.test"]
-networking = ["retrofit", "moshi", "moshi_converter", "okhttp", "interceptor"]
-koin = ["koin_android", "koin_compose"]
-test = ["junit", "mockk", "mockk_android", "viewmodel_test", "koin_test","coroutines_test"]
-androidSupport = ["androidx_core", "androidx_appcompat", "androidx_dynamicanimation","google_material"]
-kotlin = ["androidx_core", "kotlin_stdlib", "kotlin_reflect"]
+test = ["junit", "mockk", "mockk_android", "viewmodel_test", "koin_test", "coroutines_test"]
[plugins]
android_application = { id = "com.android.application", version.ref = "android_gradle_plugin" }
android_library = { id = "com.android.library", version.ref = "android_gradle_plugin" }
kotlin_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
-kotlin_kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
-kotlin_parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"}
-dokka = { id = "org.jetbrains.dokka", version.ref = "dokka"}
+serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
+
+jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose_plugin_multiplataform" }
+kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
+compose_compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
+room = { id = "androidx.room", version.ref = "room" }
+
+ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
+dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
-detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
\ No newline at end of file
+buildkonfig_plugin = { id = "com.codingfeline.buildkonfig", version.ref = "buildkonfig" }
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index e708b1c0..2c352119 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 30be1904..62f495df 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
-#Sat Apr 08 14:40:45 BRT 2023
distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
distributionPath=wrapper/dists
-zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 4f906e0c..f5feea6d 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
-# Copyright 2015 the original author or authors.
+# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,69 +15,104 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +122,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,88 +133,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=`expr $i + 1`
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 107acd32..9d21a218 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -13,8 +13,10 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +27,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 2e3a17f0..7bbc2720 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,4 +1,5 @@
-@file:Suppress("UnstableApiUsage")
+rootProject.name = "StreamPlayerApp-KMP"
+
pluginManagement {
includeBuild("build-logic")
repositories {
@@ -14,11 +15,12 @@ dependencyResolutionManagement {
mavenCentral()
maven { setUrl("https://jitpack.io") }
maven(url = uri("https://oss.sonatype.org/content/repositories/snapshots/"))
+
}
}
-include(":app")
+include(":composeApp")
include(":feature-list-streams")
include(":core-shared")
include(":core-networking")
@@ -26,6 +28,8 @@ include(":core-shared-ui")
include(":core-navigation")
include(":feature-profile")
include(":core-local-storage")
-include(":feature-favorites")
+include(":feature-detail")
+include(":feature-search")
+
-enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
\ No newline at end of file
+enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")