Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@file:OptIn(KoinExperimentalAPI::class)

package com.codandotv.streamplayerapp.feature_list_streams.detail.presentation.navigation

import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
Expand All @@ -10,16 +11,16 @@ 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 org.koin.androidx.compose.koinViewModel
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.core.parameter.parametersOf

internal const val DEFAULT_ID = "0"

fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) {
composable(DETAIL_COMPLETE) { nav ->
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(DetailStreamModule.module)
rememberKoinModules {
listOf(DetailStreamModule.module)
}
DetailStreamScreen(
viewModel = koinViewModel {
Expand All @@ -29,9 +30,6 @@ fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) {
onNavigateSearchScreen = {
navController.navigate(Routes.SEARCH)
},
disposable = {
unloadKoinModules(DetailStreamModule.module)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,23 +52,14 @@ import org.koin.androidx.compose.koinViewModel
fun DetailStreamScreen(
viewModel: DetailStreamViewModel = koinViewModel(),
navController: NavController,
disposable: () -> Unit = {},
onNavigateSearchScreen: () -> Unit = {},
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()

val lifecycleOwner = LocalLifecycleOwner.current

LifecycleEventEffect(Lifecycle.Event.ON_START) {
viewModel.loadDetail()
}

DisposableEffect(lifecycleOwner) {
onDispose {
disposable.invoke()
}
}

when (uiState) {
is DetailStreamsUIState.DetailStreamsLoadedUIState -> {
SetupDetailScreen(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
@file:OptIn(KoinExperimentalAPI::class)

package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.navigation

import androidx.activity.compose.BackHandler
import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
Expand All @@ -12,17 +13,17 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.DETAIL
import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PROFILE_PICKER
import com.codandotv.streamplayerapp.feature_list_streams.list.di.ListStreamModule
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.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.ksp.generated.module

internal const val DEFAULT_ID = ""

fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
composable(HOME_COMPLETE) { nav ->
BackHandler(true) {}
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(ListStreamModule().module)
rememberKoinModules {
listOf(ListStreamModule().module)
}
ListStreamsScreen(navController = navController,
onNavigateDetailList = { id ->
Expand All @@ -34,9 +35,6 @@ fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
onNavigateSearchScreen = {
navController.navigate(Routes.SEARCH)
},
disposable = {
unloadKoinModules(ListStreamModule().module)
},
profilePicture = nav.arguments?.getString(PROFILE_ID) ?: DEFAULT_ID
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,13 @@ fun ListStreamsScreen(
onNavigateDetailList: (String) -> Unit = {},
onNavigateProfilePicker: () -> Unit = {},
onNavigateSearchScreen: () -> Unit = {},
disposable: () -> Unit = {},
profilePicture: String
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val lifecycleOwner = LocalLifecycleOwner.current
val scrollBehavior =
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
val baseScrollState = rememberScrollState()

DisposableEffect(lifecycleOwner) {
onDispose {
disposable.invoke()
}
}

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,28 @@
@file:OptIn(KoinExperimentalAPI::class)

package com.codandotv.streamplayerapp.feature_list_streams.search.presentation.navigation

import androidx.activity.compose.BackHandler
import androidx.lifecycle.Lifecycle
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 org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI

fun NavGraphBuilder.searchStreamsNavGraph(navController: NavHostController) {
composable(Routes.SEARCH) { nav ->
BackHandler(true) {}
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(SearchModule.module)
rememberKoinModules{
listOf(SearchModule.module)
}
SearchScreen(
navController = navController,
onNavigateDetailList = { id ->
navController.navigate("${Routes.DETAIL}${id}")
},
disposable = {
unloadKoinModules(SearchModule.module)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,15 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.codandotv.streamplayerapp.core_navigation.extensions.goBack
Expand All @@ -40,15 +37,8 @@ fun SearchScreen(
viewModel: SearchViewModel = koinViewModel(),
onNavigateDetailList: (String) -> Unit = {},
navController: NavController,
disposable: () -> Unit = {}
) {

val uiState by viewModel.uiState.collectAsStateWithLifecycle()
Lifecycle(
lifecycleOwner = LocalLifecycleOwner.current,
viewModel = viewModel,
disposable = disposable
)

when (uiState) {
is SearchUIState.Success -> {
Expand Down Expand Up @@ -88,7 +78,6 @@ fun SearchScreen(
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun SetupSearchScreen(
onNavigateDetailList: (String) -> Unit = {},
Expand Down Expand Up @@ -154,20 +143,4 @@ private fun SetupSearchScreen(
navController.goBack()
}

}

@Composable
private fun Lifecycle(
lifecycleOwner: LifecycleOwner, viewModel: SearchViewModel, disposable: () -> Unit
) {
DisposableEffect(lifecycleOwner) {
val lifecycle = lifecycleOwner.lifecycle

lifecycle.addObserver(viewModel)

onDispose {
lifecycle.removeObserver(viewModel)
disposable.invoke()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@file:OptIn(KoinExperimentalAPI::class)

package com.codandotv.streamplayerapp.feature_profile.profile.presentation.navigation

import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
Expand All @@ -9,21 +10,20 @@ import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes.PARA
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 org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
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)
rememberKoinModules {
listOf(ProfilePickerStreamModule().module)
}

ProfilePickerStreamScreen(
onNavigateListStreams = { profilePic ->
navController.navigate("$HOME?$PROFILE_ID=$profilePic")
}
) {
unloadKoinModules(ProfilePickerStreamModule().module)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,15 @@ import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.animateIntOffsetAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreview
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
Expand All @@ -37,12 +33,8 @@ import org.koin.androidx.compose.koinViewModel
fun ProfilePickerStreamScreen(
viewModel: ProfilePickerStreamViewModel = koinViewModel(),
onNavigateListStreams: (String) -> Unit = {},
disposable: () -> Unit = {}
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val lifecycleOwner = LocalLifecycleOwner.current
Lifecycle(lifecycleOwner, viewModel, disposable)

if (uiState.isLoading) {
LoadScreen()
} else {
Expand All @@ -62,7 +54,6 @@ fun ProfilePickerStreamScreen(
}

@Suppress("LongMethod", "LongParameterList")
@OptIn(ExperimentalMaterial3Api::class)
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
private fun SetupProfilePickerScreen(
Expand Down Expand Up @@ -154,22 +145,6 @@ private fun SetupProfilePickerScreen(
)
}

@Composable
private fun Lifecycle(
lifecycleOwner: LifecycleOwner, viewModel: ProfilePickerStreamViewModel, disposable: () -> Unit
) {
DisposableEffect(lifecycleOwner) {
val lifecycle = lifecycleOwner.lifecycle

lifecycle.addObserver(viewModel)

onDispose {
lifecycle.removeObserver(viewModel)
disposable.invoke()
}
}
}

@ThemePreviews
@Composable
fun SetupProfilePickerScreenPreview() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import org.koin.android.annotation.KoinViewModel
class ProfilePickerStreamViewModel(
private val useCase: ProfilePickerStreamUseCase,
) : ViewModel(), DefaultLifecycleObserver {
init {
loadProfile()
}

private val _uiState = MutableStateFlow(ProfilePickerStreamsUIState())
val uiState = _uiState.stateIn(
Expand All @@ -27,9 +30,7 @@ class ProfilePickerStreamViewModel(
initialValue = _uiState.value
)

override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)

private fun loadProfile() {
viewModelScope.launch {
useCase.getProfile()
.catchFailure {
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[versions]
kotlin = "1.9.25"
android_gradle_plugin = "8.2.2"
koin = "3.4.0"
koin = "4.0.1"
koin-annotations-bom = "1.3.0"
ksp = "1.9.25-1.0.20"
dokka = "1.9.10"
Expand Down
7 changes: 4 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading
Loading