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/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..4c699b1a 100644 --- a/build-logic/src/main/java/Config.kt +++ b/build-logic/src/main/java/Config.kt @@ -18,7 +18,7 @@ object Config { 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_debug = "\"${System.getenv(tmdb_token_name_debug) ?: bearear_without_environment}\"" + val api_bearer_release = "\"${System.getenv(tmdb_token_name_release) ?: 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..b1bcd23f 100644 --- a/build-logic/src/main/java/com.streamplayer.application.gradle.kts +++ b/build-logic/src/main/java/com.streamplayer.application.gradle.kts @@ -4,14 +4,15 @@ import extensions.dokkaPlugin import extensions.getLibrary 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 +21,14 @@ plugins { } val catalog: VersionCatalog = extensions.getByType().named("libs") +kotlin { + androidTarget { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } + } +} android { namespace = Config.applicationId @@ -27,7 +36,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 73% 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..d865de17 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 @@ -6,12 +6,15 @@ 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 +22,15 @@ plugins { id("com.streamplayer.detekt") } +kotlin { + androidTarget { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } + } +} + android { setupNameSpace(project) @@ -44,4 +56,4 @@ android { dependencies { dokkaPlugin(libs.getLibrary("dokka")) -} \ No newline at end of file +} diff --git a/build-logic/src/main/java/com.streamplayer.koin-setup.gradle.kts b/build-logic/src/main/java/com.streamplayer.koin-setup.gradle.kts new file mode 100644 index 00000000..408060b4 --- /dev/null +++ b/build-logic/src/main/java/com.streamplayer.koin-setup.gradle.kts @@ -0,0 +1,53 @@ +import extensions.koinAnnotationsDependency +import extensions.koinCompiler +import extensions.koinComposeDependency +import extensions.koinCoreDependency +import extensions.libs +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile + +plugins { + id("com.google.devtools.ksp") + id("kotlin-multiplatform") +} + +kotlin { + sourceSets { + commonMain { + kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin") + + dependencies { + implementation(libs.koinCoreDependency()) + api(libs.koinAnnotationsDependency()) + api(libs.koinComposeDependency()) + } + } + } +} + +dependencies { + add("kspCommonMainMetadata", libs.koinCompiler()) + add("kspAndroid", libs.koinCompiler()) +// add("kspIosX64", libs.koin.ksp.compiler) +// add("kspIosArm64", libs.koin.ksp.compiler) +// add("kspIosSimulatorArm64", libs.koin.ksp.compiler) +} + +// WORKAROUND: ADD this dependsOn("kspCommonMainKotlinMetadata") instead of above dependencies +tasks.withType>().configureEach { + if (name != "kspCommonMainKotlinMetadata") { + dependsOn("kspCommonMainKotlinMetadata") + } +} + +afterEvaluate { + tasks.filter { + it.name.contains("SourcesJar", true) + }.forEach { + println("SourceJarTask====>${it.name}") + it.dependsOn("kspCommonMainKotlinMetadata") + } +} + +ksp { + arg("KOIN_CONFIG_CHECK", "false") +} \ 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/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..7597b231 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,10 @@ 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 @@ -14,6 +18,8 @@ tasks.register("clean", Delete::class) { delete(rootProject.buildDir) } + + allprojects { repositories { google() 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..ee1a1a8c --- /dev/null +++ b/composeApp/build.gradle.kts @@ -0,0 +1,36 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id("com.streamplayer.application") + alias(libs.plugins.jetbrains.compose) + alias(libs.plugins.compose.compiler) +} +kotlin { + sourceSets { + 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.bundles.koin) + implementation(libs.bundles.androidSupport) + implementation(libs.bundles.kotlin) + implementation(libs.lottie) + } + } +} + +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 85% rename from app/src/main/AndroidManifest.xml rename to composeApp/src/androidMain/AndroidManifest.xml index 43b331ce..4c4f5b7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/composeApp/src/androidMain/AndroidManifest.xml @@ -9,10 +9,10 @@ android:roundIcon="@mipmap/ic_netflix_round" android:label="@string/app_name" android:supportsRtl="true" - android:name="com.codandotv.streamplayerapp.CustomApplication"> + android:name=".CustomApplication"> diff --git a/app/src/main/res/xml/backup_rules.xml b/composeApp/src/androidMain/res/xml/backup_rules.xml similarity index 100% rename from app/src/main/res/xml/backup_rules.xml rename to composeApp/src/androidMain/res/xml/backup_rules.xml diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/composeApp/src/androidMain/res/xml/data_extraction_rules.xml similarity index 100% rename from app/src/main/res/xml/data_extraction_rules.xml rename to composeApp/src/androidMain/res/xml/data_extraction_rules.xml 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 83% 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..fa57d367 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) } } 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..940bb96b 100644 --- a/core-local-storage/build.gradle.kts +++ b/core-local-storage/build.gradle.kts @@ -1,13 +1,27 @@ plugins { - id("com.streamplayer.android-library") + id("com.streamplayer.kmp-library") id("com.google.devtools.ksp") } +kotlin { + sourceSets { + commonMain.dependencies { + implementation(libs.bundles.room) + implementation(libs.bundles.kotlin) + implementation(libs.bundles.koin) + } + } +} + dependencies { + add("kspCommonMainMetadata",libs.koin.ksp.compiler) + add("kspAndroid", libs.koin.ksp.compiler) +} +ksp { + arg("KOIN_CONFIG_CHECK","true") +} + +dependencies { 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 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/main/java/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt b/core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt similarity index 100% rename from core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt rename to core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/data/database/StreamPlayerAppDatabase.kt diff --git a/core-local-storage/src/main/java/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 similarity index 100% rename from core-local-storage/src/main/java/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt rename to core-local-storage/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_local_storage/di/LocalStorageModule.kt 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-navigation/build.gradle.kts b/core-navigation/build.gradle.kts index f7a359d3..334cd190 100644 --- a/core-navigation/build.gradle.kts +++ b/core-navigation/build.gradle.kts @@ -1,9 +1,16 @@ @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.bundles.kotlin) + implementation(libs.navigation.compose) + implementation(compose.material3) + } + } } \ No newline at end of file diff --git a/core-navigation/src/main/res/drawable/ic_downloads_selected.xml b/core-navigation/src/androidMain/res/drawable/ic_downloads_selected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_downloads_selected.xml rename to core-navigation/src/androidMain/res/drawable/ic_downloads_selected.xml diff --git a/core-navigation/src/main/res/drawable/ic_downloads_unselected.xml b/core-navigation/src/androidMain/res/drawable/ic_downloads_unselected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_downloads_unselected.xml rename to core-navigation/src/androidMain/res/drawable/ic_downloads_unselected.xml diff --git a/core-navigation/src/main/res/drawable/ic_games_selected.xml b/core-navigation/src/androidMain/res/drawable/ic_games_selected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_games_selected.xml rename to core-navigation/src/androidMain/res/drawable/ic_games_selected.xml diff --git a/core-navigation/src/main/res/drawable/ic_games_unselected.xml b/core-navigation/src/androidMain/res/drawable/ic_games_unselected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_games_unselected.xml rename to core-navigation/src/androidMain/res/drawable/ic_games_unselected.xml diff --git a/core-navigation/src/main/res/drawable/ic_home_selected.xml b/core-navigation/src/androidMain/res/drawable/ic_home_selected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_home_selected.xml rename to core-navigation/src/androidMain/res/drawable/ic_home_selected.xml diff --git a/core-navigation/src/main/res/drawable/ic_home_unselected.xml b/core-navigation/src/androidMain/res/drawable/ic_home_unselected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_home_unselected.xml rename to core-navigation/src/androidMain/res/drawable/ic_home_unselected.xml diff --git a/core-navigation/src/main/res/drawable/ic_news_selected.xml b/core-navigation/src/androidMain/res/drawable/ic_news_selected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_news_selected.xml rename to core-navigation/src/androidMain/res/drawable/ic_news_selected.xml diff --git a/core-navigation/src/main/res/drawable/ic_news_unselected.xml b/core-navigation/src/androidMain/res/drawable/ic_news_unselected.xml similarity index 100% rename from core-navigation/src/main/res/drawable/ic_news_unselected.xml rename to core-navigation/src/androidMain/res/drawable/ic_news_unselected.xml diff --git a/core-navigation/src/main/res/values/strings.xml b/core-navigation/src/androidMain/res/values/strings.xml similarity index 100% rename from core-navigation/src/main/res/values/strings.xml rename to core-navigation/src/androidMain/res/values/strings.xml diff --git a/core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt b/core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt similarity index 100% rename from core-navigation/src/main/java/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt rename to core-navigation/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_navigation/bottomnavigation/BottomNavItem.kt 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 100% 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 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-networking/build.gradle.kts b/core-networking/build.gradle.kts index f5602562..c190c720 100644 --- a/core-networking/build.gradle.kts +++ b/core-networking/build.gradle.kts @@ -1,6 +1,7 @@ plugins { - id("com.streamplayer.android-library") + id("com.streamplayer.kmp-library") } + android { buildFeatures { buildConfig = true @@ -19,9 +20,13 @@ android { } } } -dependencies { - implementation(libs.bundles.kotlin) - implementation(libs.bundles.networking) - implementation(libs.bundles.koin) - testImplementation(libs.bundles.test) -} + +kotlin { + sourceSets { + androidMain.dependencies { + implementation(libs.bundles.kotlin) + implementation(libs.bundles.networking) + implementation(libs.bundles.koin) + } + } +} \ No newline at end of file diff --git a/core-networking/src/main/res/values/strings.xml b/core-networking/src/androidMain/res/values/strings.xml similarity index 100% rename from core-networking/src/main/res/values/strings.xml rename to core-networking/src/androidMain/res/values/strings.xml 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..ddceb396 --- /dev/null +++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/di/NetworkModule.kt @@ -0,0 +1,115 @@ +package com.codandotv.streamplayerapp.core_networking.di + +import android.util.Log +import com.codandotv.streamplayerapp.core.networking.BuildConfig +import com.codandotv.streamplayerapp.core_networking.di.Network.TIMEOUT +import com.codandotv.streamplayerapp.core_networking.handleError.validator +import com.squareup.moshi.Moshi +import io.ktor.client.HttpClient +import io.ktor.client.HttpClientConfig +import io.ktor.client.engine.okhttp.OkHttp +import io.ktor.client.engine.okhttp.OkHttpConfig +import io.ktor.client.plugins.HttpResponseValidator +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.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import okhttp3.Interceptor +import org.koin.dsl.module + +object NetworkModule { + val module = module { + single(QualifierHost) { BuildConfig.HOST } + single(QualifierProfile) { BuildConfig.PROFILE } + + single { + provideKtorHttpClient( + moshi = get(), + baseUrl = get(QualifierHost), + ) + } + + single(QualifierProfileHttpClient) { + provideKtorHttpClient( + moshi = get(), + baseUrl = get(QualifierProfile), + ) + } + + single { Moshi.Builder().build() } + } + + private fun provideKtorHttpClient( + moshi: Moshi, + baseUrl: String, + ): HttpClient { + return HttpClient(OkHttp) { + installPlugins(moshi, baseUrl) + } + } + + private fun HttpClientConfig.installPlugins( + moshi: Moshi, + baseUrl: String, + ) { + 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) + } + + validator(moshi) + + install(Auth) { + bearer { + loadTokens { + BearerTokens( + accessToken = BuildConfig.API_BEARER_AUTH, + refreshToken = "" + ) + } + } + } + + if (BuildConfig.DEBUG) { + 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 93% 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..7e9c2e26 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 kotlinx.serialization.Serializable import org.koin.core.component.KoinComponent /** @@ -11,6 +12,8 @@ import org.koin.core.component.KoinComponent "TooGenericExceptionCaught", "MagicNumber" ) + +@Serializable sealed class Failure( val code: Int? = -1, val errorMessage: String? = null, @@ -23,7 +26,7 @@ sealed class Failure( Failure(codeStatus, errorMessageRes = R.string.core_networking_no_server_error) data class GenericError( - val codeStatus: Int? = -12, private val msg: String? = null + val codeStatus: Int? = -12, private val msg: String? = "Unknow error" ) : Failure( codeStatus ) 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..ec896a04 --- /dev/null +++ b/core-networking/src/commonMain/kotlin/com/codandotv/streamplayerapp/core_networking/handleError/HttpClientConfigExtensions.kt @@ -0,0 +1,75 @@ +package com.codandotv.streamplayerapp.core_networking.handleError + +import android.util.Log +import com.squareup.moshi.Moshi +import io.ktor.client.HttpClient +import io.ktor.client.HttpClientConfig +import io.ktor.client.call.body +import io.ktor.client.engine.okhttp.OkHttpConfig +import io.ktor.client.plugins.ClientRequestException +import io.ktor.client.plugins.HttpResponseValidator +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 + +internal fun HttpClientConfig.validator( + moshi: Moshi +) { + HttpResponseValidator { + validateResponse { response -> + when (response.status.value) { + in 200..299 -> Unit + in 400..499 -> { + val errorBody = response.bodyAsText() + val error = try { + moshi.adapter(NetworkResponse.Error::class.java).fromJson(errorBody) + } catch (e: Exception) { + throw Failure.UnparsableResponseException(throwable = e) + } + throw Failure.ClientException(throwable = error?.exception) + } + + in 500..599 -> throw Failure.ServerError(response.status.value) + else -> throw Failure.UnknownError(response.status.value) + } + } + + handleResponseExceptionWithRequest { exception, _ -> + Log.d("HttpClientError",exception.stackTraceToString()) + + when (exception) { + is IOException -> throw Failure.NetworkError(throwable = exception) + else -> throw Failure.GenericError( + msg = exception.message ?: "Unknown error" + ) + } + } + } +} + +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/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..e3000310 100644 --- a/core-shared-ui/build.gradle.kts +++ b/core-shared-ui/build.gradle.kts @@ -1,15 +1,28 @@ @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) +} + +kotlin { + sourceSets { + androidMain.dependencies { + implementation(projects.coreShared) + implementation(compose.material3) + implementation(compose.preview) + implementation(compose.ui) + implementation(libs.navigation.compose) + implementation(libs.bundles.koin) + implementation(libs.bundles.kotlin) + implementation(libs.bundles.androidSupport) + implementation(libs.android.youtube.player) + implementation(libs.coil) + } + + commonMain.dependencies { + implementation(libs.paging.compose) + } + } } -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 diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/resources/Colors.kt b/core-shared-ui/src/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/utils/Sharing.kt diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt b/core-shared-ui/src/androidMain/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/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/IconWithText.kt 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.kt similarity index 100% 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.kt diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt b/core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt similarity index 100% rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt rename to core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/SharingStreamCustomView.kt diff --git a/core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt b/core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt similarity index 100% rename from core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt rename to core-shared-ui/src/androidMain/kotlin/com/codandotv/streamplayerapp/core_shared_ui/widget/StreamPlayerTopBar.kt 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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/androidMain/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/res/drawable/ic_add.xml b/core-shared-ui/src/androidMain/res/drawable/ic_add.xml similarity index 100% rename from core-shared-ui/src/main/res/drawable/ic_add.xml rename to core-shared-ui/src/androidMain/res/drawable/ic_add.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_close.xml b/core-shared-ui/src/androidMain/res/drawable/ic_close.xml similarity index 100% rename from core-shared-ui/src/main/res/drawable/ic_close.xml rename to core-shared-ui/src/androidMain/res/drawable/ic_close.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_copy_content.xml b/core-shared-ui/src/androidMain/res/drawable/ic_copy_content.xml similarity index 100% rename from core-shared-ui/src/main/res/drawable/ic_copy_content.xml rename to core-shared-ui/src/androidMain/res/drawable/ic_copy_content.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_info.xml b/core-shared-ui/src/androidMain/res/drawable/ic_info.xml similarity index 100% rename from core-shared-ui/src/main/res/drawable/ic_info.xml rename to core-shared-ui/src/androidMain/res/drawable/ic_info.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_instagram.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_instagram.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_message.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_message.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix.png b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_netflix.png diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix_background.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_netflix_background.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_netflix_foreground.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_netflix_foreground.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_play.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_play.xml diff --git a/core-shared-ui/src/main/res/drawable/ic_whatsapp.xml b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/ic_whatsapp.xml diff --git a/core-shared-ui/src/main/res/drawable/perfil_fake.png b/core-shared-ui/src/androidMain/res/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/androidMain/res/drawable/perfil_fake.png 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-anydpi-v26/ic_netflix.xml b/core-shared-ui/src/androidMain/res/mipmap-anydpi-v26/ic_netflix.xml similarity index 100% rename from core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix.xml rename to core-shared-ui/src/androidMain/res/mipmap-anydpi-v26/ic_netflix.xml diff --git a/core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix_round.xml b/core-shared-ui/src/androidMain/res/mipmap-anydpi-v26/ic_netflix_round.xml similarity index 100% rename from core-shared-ui/src/main/res/mipmap-anydpi-v26/ic_netflix_round.xml rename to core-shared-ui/src/androidMain/res/mipmap-anydpi-v26/ic_netflix_round.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-night/themes.xml b/core-shared-ui/src/androidMain/res/values-night/themes.xml similarity index 100% rename from core-shared-ui/src/main/res/values-night/themes.xml rename to core-shared-ui/src/androidMain/res/values-night/themes.xml 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 100% rename from core-shared-ui/src/main/res/values-v31/themes.xml rename to core-shared-ui/src/androidMain/res/values-v31/themes.xml diff --git a/core-shared-ui/src/main/res/values/colors.xml b/core-shared-ui/src/androidMain/res/values/colors.xml similarity index 100% rename from core-shared-ui/src/main/res/values/colors.xml rename to core-shared-ui/src/androidMain/res/values/colors.xml diff --git a/core-shared-ui/src/main/res/values/content-description.xml b/core-shared-ui/src/androidMain/res/values/content-description.xml similarity index 100% rename from core-shared-ui/src/main/res/values/content-description.xml rename to core-shared-ui/src/androidMain/res/values/content-description.xml diff --git a/core-shared-ui/src/main/res/values/strings.xml b/core-shared-ui/src/androidMain/res/values/strings.xml similarity index 100% rename from core-shared-ui/src/main/res/values/strings.xml rename to core-shared-ui/src/androidMain/res/values/strings.xml diff --git a/core-shared-ui/src/main/res/values/themes.xml b/core-shared-ui/src/androidMain/res/values/themes.xml similarity index 100% rename from core-shared-ui/src/main/res/values/themes.xml rename to core-shared-ui/src/androidMain/res/values/themes.xml 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/build.gradle.kts b/core-shared/build.gradle.kts index f1b45dda..e4ee2dcd 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.bundles.koin) + } + } } \ 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..cdb31651 --- /dev/null +++ b/feature-detail/build.gradle.kts @@ -0,0 +1,32 @@ +@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(projects.coreNetworking) + implementation(projects.coreNavigation) + implementation(projects.coreShared) + implementation(projects.coreSharedUi) + implementation(projects.coreLocalStorage) + + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.preview) + implementation(libs.navigation.compose) + implementation(libs.bundles.koin) + implementation(libs.bundles.networking) + implementation(libs.coil) + implementation(libs.bundles.androidSupport) + } + 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/androidMain/res/drawable/netflix_detail.webp similarity index 100% rename from feature-list-streams/src/main/res/drawable/netflix_detail.webp rename to feature-detail/src/androidMain/res/drawable/netflix_detail.webp diff --git a/feature-list-streams/src/main/res/drawable/play_circle.xml b/feature-detail/src/androidMain/res/drawable/play_circle.xml similarity index 100% rename from feature-list-streams/src/main/res/drawable/play_circle.xml rename to feature-detail/src/androidMain/res/drawable/play_circle.xml diff --git a/feature-detail/src/androidMain/res/values/strings.xml b/feature-detail/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000..ac85d916 --- /dev/null +++ b/feature-detail/src/androidMain/res/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 76% 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..3a0cd02f 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,13 @@ -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.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 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 89% 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..ef6f59f5 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 @@ -39,13 +39,13 @@ 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.R +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.koin.androidx.compose.koinViewModel @Composable @@ -162,7 +162,7 @@ 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), textColor = MaterialTheme.colorScheme.onSurface, 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 88% 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..1363ccf4 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 @@ -20,8 +19,8 @@ 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 @Composable fun DetailStreamActionOption( @@ -68,7 +67,7 @@ fun DetailStreamActionOption( ) 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), 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 89% 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..18657683 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 @@ -18,8 +18,8 @@ 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.R +import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamsUIState.DetailStreamsLoadedUIState @Suppress("MagicNumber") @Composable 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 91% 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..41b6e3e8 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 @@ -17,7 +17,7 @@ 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 com.codandotv.streamplayerapp.feature.detail.R @Composable fun DetailStreamRowHeader( 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 92% 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..9abdcf24 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 @@ -17,7 +17,7 @@ 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 com.codandotv.streamplayerapp.feature.detail.R @OptIn(ExperimentalMaterial3Api::class) @Composable 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..4909bb83 100644 --- a/feature-list-streams/build.gradle.kts +++ b/feature-list-streams/build.gradle.kts @@ -1,30 +1,29 @@ @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(libs.bundles.koin) + implementation(libs.paging.compose) + 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(libs.bundles.networking) - implementation(libs.roomRuntime) - implementation(libs.bundles.androidSupport) - implementation(libs.coil) - - testImplementation(libs.bundles.test) -} - -ksp { - arg("KOIN_CONFIG_CHECK","true") + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.preview) + implementation(libs.navigation.compose) + implementation(libs.bundles.networking) + implementation(libs.coil) + implementation(libs.bundles.androidSupport) + } + } } \ 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/main/res/drawable/ic_top_10.webp b/feature-list-streams/src/androidMain/res/drawable/ic_top_10.webp similarity index 100% rename from feature-list-streams/src/main/res/drawable/ic_top_10.webp rename to feature-list-streams/src/androidMain/res/drawable/ic_top_10.webp diff --git a/feature-list-streams/src/main/res/drawable/image_placeholder.xml b/feature-list-streams/src/androidMain/res/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/androidMain/res/drawable/image_placeholder.xml diff --git a/feature-list-streams/src/main/res/drawable/netflix_horizontal_logo.xml b/feature-list-streams/src/androidMain/res/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/androidMain/res/drawable/netflix_horizontal_logo.xml diff --git a/feature-list-streams/src/main/res/layout/activity_list_stream.xml b/feature-list-streams/src/androidMain/res/layout/activity_list_stream.xml similarity index 100% rename from feature-list-streams/src/main/res/layout/activity_list_stream.xml rename to feature-list-streams/src/androidMain/res/layout/activity_list_stream.xml diff --git a/feature-list-streams/src/main/res/values/content-description.xml b/feature-list-streams/src/androidMain/res/values/content-description.xml similarity index 100% rename from feature-list-streams/src/main/res/values/content-description.xml rename to feature-list-streams/src/androidMain/res/values/content-description.xml diff --git a/feature-list-streams/src/androidMain/res/values/strings.xml b/feature-list-streams/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000..85d4e9b4 --- /dev/null +++ b/feature-list-streams/src/androidMain/res/values/strings.xml @@ -0,0 +1,14 @@ + + + + Série + Séries + Filme + Filmes + + Minha lista + Saiba mais + Assistir + Top 1 em %s hoje + + \ No newline at end of file diff --git a/feature-list-streams/src/main/java/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 similarity index 100% rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt rename to feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/core/ContentType.kt 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 100% 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 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 94% 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..523ad5fe 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 @@ -14,8 +14,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 +25,8 @@ 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 -@KoinViewModel class ListStreamViewModel( private val listStreams: ListStreamUseCase, private val listGenres: GetGenresUseCase, 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 100% 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 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/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/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..df7913b0 100644 --- a/feature-profile/build.gradle.kts +++ b/feature-profile/build.gradle.kts @@ -1,28 +1,28 @@ @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.navigation.compose) + implementation(compose.material3) + implementation(compose.ui) - implementation(libs.bundles.koin) - implementation(libs.koin.annotations) - ksp(libs.koin.compiler) + implementation(libs.bundles.koin) + api(libs.koin.annotations) + implementation(libs.bundles.networking) + implementation(libs.bundles.androidSupport) + implementation(libs.coil) - implementation(libs.bundles.networking) - implementation(libs.bundles.androidSupport) - implementation(libs.coil) - - testImplementation(libs.bundles.test) -} - -ksp { - arg("KOIN_CONFIG_CHECK","true") -} + } + } +} \ No newline at end of file diff --git a/feature-profile/src/main/res/drawable/image_placeholder.xml b/feature-profile/src/androidMain/res/drawable/image_placeholder.xml similarity index 100% rename from feature-profile/src/main/res/drawable/image_placeholder.xml rename to feature-profile/src/androidMain/res/drawable/image_placeholder.xml diff --git a/feature-profile/src/main/res/drawable/netflix_horizontal_logo.xml b/feature-profile/src/androidMain/res/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/androidMain/res/drawable/netflix_horizontal_logo.xml diff --git a/feature-profile/src/main/res/values/strings.xml b/feature-profile/src/androidMain/res/values/strings.xml similarity index 100% rename from feature-profile/src/main/res/values/strings.xml rename to feature-profile/src/androidMain/res/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 90% 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..6474a36c 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,10 +1,10 @@ -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 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 93% 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..490d855b 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,7 +1,7 @@ @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 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 90% 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..1fa56e33 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 @@ -24,13 +24,13 @@ 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.koin.androidx.compose.koinViewModel @Composable 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 94% 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..5e1c9b59 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,12 +1,12 @@ -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 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 93% 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..45ae69e2 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 @@ -24,8 +24,8 @@ 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 @Composable fun ProfilePickerProfilesGrid( 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 92% 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..be4e5e34 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,4 +1,4 @@ -package com.codandotv.streamplayerapp.feature_profile.profile.presentation.widget +package com.codandotv.streamplayerapp.profile.presentation.widget import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column @@ -21,7 +21,7 @@ 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 @Suppress("MagicNumber") @Composable 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 95% 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..fbde3c83 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 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..f05eca76 --- /dev/null +++ b/feature-search/build.gradle.kts @@ -0,0 +1,31 @@ +@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(libs.koin.core) + 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(libs.navigation.compose) + implementation(libs.bundles.koin) + implementation(libs.bundles.networking) + implementation(libs.coil) + implementation(libs.bundles.androidSupport) + implementation(libs.paging.compose) + } + } +} \ No newline at end of file diff --git a/feature-search/src/androidMain/res/values/strings.xml b/feature-search/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000..e8445742 --- /dev/null +++ b/feature-search/src/androidMain/res/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-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt similarity index 65% rename from feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt rename to feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt index d15bdc21..86baae53 100644 --- a/feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/search/data/model/ListSearchStreamResponse.kt +++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/data/model/ListSearchStreamResponse.kt @@ -1,19 +1,22 @@ -package com.codandotv.streamplayerapp.feature_list_streams.search.data.model +package com.codandotv.streamplayerapp.feature_search.data.model import com.squareup.moshi.Json +import kotlinx.serialization.Serializable +@Serializable data class ListSearchStreamResponse( @Json(name = "results") val results: List ) { + @Serializable data class SearchStreamResponse( @Json(name = "id") - val id: String, + val id: Int, @Json(name = "title") val title: String, @Json(name="overview") val overview: String, @Json(name = "poster_path") - val posterPath: String, + 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 86% 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..2064ee7a 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 @@ -24,15 +24,14 @@ 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.R +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.koin.androidx.compose.koinViewModel @Composable @@ -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 = {}, 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 92% 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..a12d559d 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 @@ -31,9 +31,9 @@ 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 @@ -105,7 +105,7 @@ fun StreamsError( }) { Icon( imageVector = Icons.Filled.Close, - contentDescription = stringResource(id = R.string.detail_back), + contentDescription = stringResource(id = R.string.search_back), tint = Color.White ) } 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 93% 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..978aa2e0 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,9 +13,8 @@ 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.Check 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.material3.Icon @@ -37,7 +36,7 @@ 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.feature.search.R.* @Suppress("LongParameterList") @Composable @@ -90,7 +89,7 @@ private fun StreamPlayerTopBar( onClick = { /* todo */ } ) { Icon( - imageVector = Icons.Default.Cast, + imageVector = Icons.Default.Check, contentDescription = stringResource(id = R.string.icon_cast), tint = Color.White, ) @@ -112,7 +111,6 @@ private fun StreamPlayerTopBar( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchTopBar( currentSearchText: String, @@ -142,7 +140,7 @@ fun SearchTopBar( }, placeholder = { Text( - text = stringResource(id = ResourceListStream.string.search_list_main_search), + text = stringResource(id = string.search_list_main_search), color = Color.Gray ) }, @@ -211,7 +209,7 @@ fun CloseButton(action: () -> Unit = {}) { @Composable private fun MicButton(action: () -> Unit = {}) { DefaultIcon( - searchIcon = Icons.Default.MicNone, + searchIcon = Icons.Default.Check, contentDescription = stringResource(id = R.string.icon_mic), onIconClickAction = action, iconColor = Color.Gray diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 865020d6..fe274061 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,25 +1,22 @@ [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" +koin-ksp = "1.3.1" +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" #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" +kotlinx-coroutines-test = "1.8.1" #Android Support android_core_ktx = "1.7.0" @@ -33,17 +30,7 @@ androidx_core_ktx = "1.13.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" @@ -51,12 +38,17 @@ lottie = "5.2.0" #Room Database room = "2.5.2" android_youtube_player_version = "12.0.0" +uiAndroid = "1.7.5" +junit = "1.2.1" +espressoCore = "3.6.1" [libraries] 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" } @@ -83,67 +75,50 @@ mockk_android = { group = "io.mockk", name = "mockk-android", version.ref = "moc 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" } +#Navigation +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" } # 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" } - # 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_annotations = { group = "io.insert-koin", name = "koin-annotations", version.ref = "koin-ksp" } +koin_ksp_compiler = { group = "io.insert-koin", name = "koin-ksp-compiler", version.ref = "koin-ksp" } 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"} +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" } 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" } +ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } [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"] +room = ["roomRuntime", "roomKtx"] +networking = ["moshi", "okhttp", "interceptor", "ktor_client_core", "ktor_client_okhttp", "ktor_client_content_serialization_json", "ktor_client_content_negotiation", "ktor_client_logger", "ktor_client_auth"] +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"] [plugins] @@ -151,10 +126,14 @@ android_application = { id = "com.android.application", version.ref = "android_g 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" } + +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 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")