Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build-logic/src/main/java/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ object Config {
const val applicationId = "com.codandotv.$appName"
val jvmTarget = JvmTarget.JVM_21
val javaVersion = JavaVersion.VERSION_21
const val compileSdkVersion = 35
const val compileSdkVersion = 36
const val minSdkVersion = 28
const val targetSdkVersion = 35
const val targetSdkVersion = 36
const val versionName = "1.2"
const val versionCode = 1
const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import extensions.koinAnnotationsDependency
import extensions.koinCompiler
import extensions.koinCoreDependency
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val libs: VersionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs")
plugins {
id("org.jetbrains.kotlin.multiplatform")
id("com.google.devtools.ksp")
}

kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.koinCoreDependency())
api(libs.koinAnnotationsDependency())
}
}

// KSP Common sourceSet
sourceSets.named("commonMain").configure {
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
}

// KSP Tasks
dependencies {
add("kspCommonMainMetadata", libs.koinCompiler())
}


// WORKAROUND: ADD this dependsOn("kspCommonMainKotlinMetadata") instead of above dependencies
tasks.withType<KotlinCompile>().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", "true")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If true, anything weird will fail in compile time

}
2 changes: 1 addition & 1 deletion build-logic/src/main/java/extensions/VersionCatalog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ internal fun VersionCatalog.koinAnnotationsDependency() = findLibrary("koin_anno

internal fun VersionCatalog.koinComposeDependency() = findLibrary("koin_compose").get()

internal fun VersionCatalog.koinCompiler() = findLibrary("koin_ksp_compiler").get()
internal fun VersionCatalog.koinCompiler() = findLibrary("koin-ksp-compiler").get()

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.codandotv.streamplayerapp.presentation
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.core.view.WindowCompat
import com.codandotv.streamplayerapp.StreamPlayerApp
import com.google.firebase.Firebase
import com.google.firebase.initialize
Expand All @@ -14,6 +15,7 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
Firebase.initialize(this)
requestNotificationPermission()

setContent {
StreamPlayerApp()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.itemContentType
import androidx.paging.compose.itemKey
import app.cash.paging.compose.collectAsLazyPagingItems
import app.cash.paging.compose.itemContentType
import app.cash.paging.compose.itemKey
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow

@Composable
fun StreamsCarousel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.CircularProgressIndicator
Expand Down Expand Up @@ -46,7 +47,9 @@ fun ListStreamsScreen(
val baseScrollState = rememberScrollState()

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
modifier = Modifier
.statusBarsPadding()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
StreamPlayerTopBar(
scrollBehavior = scrollBehavior,
Expand Down
1 change: 1 addition & 0 deletions feature-search/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ plugins {
id("com.streamplayer.kmp-library")
alias(libs.plugins.jetbrains.compose)
alias(libs.plugins.compose.compiler)
id("com.streamplayer.koin-annotations-setup")
}

kotlin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@ import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.url
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Provided

interface MostPopularMoviesService {
suspend fun getPopular(): NetworkResponse<ListSearchStreamResponse>
}

@Factory(binds = [MostPopularMoviesService::class])
class MostPopularMoviesServiceImpl(
private val client: HttpClient
@Provided private val client: HttpClient
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HttpClient is defined by dsl approach

) : MostPopularMoviesService {
override suspend fun getPopular(): NetworkResponse<ListSearchStreamResponse> =
client.safeRequest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@ import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamR
import io.ktor.client.HttpClient
import io.ktor.client.request.parameter
import io.ktor.client.request.url
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Provided
import org.koin.meta.annotations.ExternalDefinition

interface SearchStreamService {
suspend fun getSearch(query: String): NetworkResponse<ListSearchStreamResponse>
}

@Factory(binds = [SearchStreamService::class])
class SearchStreamServiceImpl(
private val client: HttpClient
@Provided private val client: HttpClient
) : SearchStreamService {
override suspend fun getSearch(query: String): NetworkResponse<ListSearchStreamResponse> =
client.safeRequest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import com.codandotv.streamplayerapp.feature_search.data.api.MostPopularMoviesService
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface MostPopularMoviesDataSource {
suspend fun getMostPopularMovies(): Flow<ListSearchStreamResponse>
}

@Factory(binds = [MostPopularMoviesDataSource::class])
class MostPopularMoviesDataSourceImpl(
private val service: MostPopularMoviesService
) : MostPopularMoviesDataSource {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import com.codandotv.streamplayerapp.feature_search.data.api.SearchStreamService
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface SearchStreamDataSource {
suspend fun getMovieSearch(query: String): Flow<ListSearchStreamResponse>
}

@Factory(binds = [SearchStreamDataSource::class])
class SearchStreamDataSourceImpl(
private val service: SearchStreamService
): SearchStreamDataSource {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.codandotv.streamplayerapp.feature_search.data.repository
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import com.codandotv.streamplayerapp.feature_search.data.datasource.MostPopularMoviesDataSource
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface MostPopularMoviesRepository {
suspend fun getMostPopularMovies(): Flow<ListSearchStreamResponse>
}

@Factory(binds = [MostPopularMoviesRepository::class])
class MostPopularMoviesRepositoryImpl(
private val dataSource: MostPopularMoviesDataSource
) : MostPopularMoviesRepository {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@ package com.codandotv.streamplayerapp.feature_search.data.repository
import com.codandotv.streamplayerapp.feature_search.data.datasource.SearchStreamDataSource
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface SearchStreamRepository {
suspend fun getMovieSearch(query: String) : Flow<ListSearchStreamResponse>
suspend fun getMovieSearch(query: String): Flow<ListSearchStreamResponse>

}

@Factory(binds = [SearchStreamRepository::class])
class SearchStreamRepositoryImp(
private val dataSource: SearchStreamDataSource
) : SearchStreamRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,8 @@
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.core.module.dsl.viewModel
import org.koin.dsl.module
import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module

object SearchModule {
val module = module {
viewModel {
SearchViewModel(
searchUseCase = get(),
mostPopularMoviesUseCase = get()
)
}

factory<SearchStreamService> { SearchStreamServiceImpl(get()) }
factory<MostPopularMoviesService> { MostPopularMoviesServiceImpl(get()) }

factory<MostPopularMoviesUseCase> { MostPopularMoviesUseCaseImpl(repository = get()) }
factory<MostPopularMoviesDataSource> { MostPopularMoviesDataSourceImpl(service = get()) }
factory<MostPopularMoviesRepository> { MostPopularMoviesRepositoryImpl(dataSource = get()) }

factory<SearchUseCase> { SearchUseCaseImpl(repository = get()) }
factory<SearchStreamDataSource> { SearchStreamDataSourceImpl(service = get()) }
factory<SearchStreamRepository> { SearchStreamRepositoryImp(dataSource = get()) }
}
}
@Module
@ComponentScan("com.codandotv.streamplayerapp.feature_search")
class SearchModule
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.codandotv.streamplayerapp.feature_search.domain
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import com.codandotv.streamplayerapp.feature_search.data.repository.MostPopularMoviesRepository
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface MostPopularMoviesUseCase {
suspend operator fun invoke(): Flow<ListSearchStreamResponse>
}

@Factory(binds = [MostPopularMoviesUseCase::class])
class MostPopularMoviesUseCaseImpl(
val repository: MostPopularMoviesRepository
) : MostPopularMoviesUseCase {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.codandotv.streamplayerapp.feature_search.domain
import com.codandotv.streamplayerapp.feature_search.data.model.ListSearchStreamResponse
import com.codandotv.streamplayerapp.feature_search.data.repository.SearchStreamRepository
import kotlinx.coroutines.flow.Flow
import org.koin.core.annotation.Factory

interface SearchUseCase {
suspend operator fun invoke(query:String): Flow<ListSearchStreamResponse>
}

@Factory(binds = [SearchUseCase::class])
class SearchUseCaseImpl(val repository: SearchStreamRepository) : SearchUseCase {
override suspend operator fun invoke(query:String): Flow<ListSearchStreamResponse> {
return repository.getMovieSearch(query = query)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ import com.codandotv.streamplayerapp.feature_search.di.SearchModule
import com.codandotv.streamplayerapp.feature_search.presentation.screens.SearchScreen
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.ksp.generated.module

@OptIn(KoinExperimentalAPI::class)
fun NavGraphBuilder.searchStreamsNavGraph(navController: NavHostController) {
composable(Routes.SEARCH) { _ ->
rememberKoinModules {
listOf(SearchModule.module)
listOf(
SearchModule().module
)
}
SearchScreen(
navController = navController,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ 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

@KoinViewModel
class SearchViewModel(
private val searchUseCase: SearchUseCase,
private val mostPopularMoviesUseCase: MostPopularMoviesUseCase
Expand Down
7 changes: 5 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
[versions]
kotlin = "2.3.10"
android_gradle_plugin = "8.7.3"
koin = "4.1.1"
android_gradle_plugin = "8.9.1"
koin = "4.2.0"
koin-annotations = "2.3.1"
ksp = "2.3.5"
kotzilla = "2.0.8"
lifecycle-viewmodel-compose-version = "2.9.6"
Expand Down Expand Up @@ -85,6 +86,8 @@ androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "
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_core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" }
koin-annotations = { module = "io.insert-koin:koin-annotations", version.ref = "koin-annotations" }
koin-ksp-compiler = { module = "io.insert-koin:koin-ksp-compiler", version.ref = "koin-annotations" }
koin_compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" }
koin_compose_viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }

Expand Down
Loading