165 lines
6.3 KiB
Kotlin
165 lines
6.3 KiB
Kotlin
package com.streamflow.tv
|
|
|
|
import android.os.Bundle
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.setContent
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.runtime.*
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import androidx.navigation.compose.rememberNavController
|
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
|
import androidx.navigation.NavType
|
|
import androidx.navigation.navArgument
|
|
import com.streamflow.tv.data.api.ApiClient
|
|
import com.streamflow.tv.data.repository.UserDataRepository
|
|
import com.streamflow.tv.ui.components.SideNavRail
|
|
import com.streamflow.tv.ui.screens.*
|
|
import com.streamflow.tv.ui.theme.StreamFlowTheme
|
|
import com.streamflow.tv.ui.theme.StreamFlowTvTheme
|
|
import kotlinx.coroutines.flow.first
|
|
import kotlinx.coroutines.launch
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setContent {
|
|
StreamFlowTvApp()
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
fun StreamFlowTvApp() {
|
|
val context = LocalContext.current
|
|
val scope = rememberCoroutineScope()
|
|
val userRepo = remember { UserDataRepository(context) }
|
|
val navController = rememberNavController()
|
|
|
|
var currentTheme by remember { mutableStateOf("default") }
|
|
var selectedNavId by remember { mutableStateOf("home") }
|
|
|
|
// Load persisted settings
|
|
LaunchedEffect(Unit) {
|
|
currentTheme = userRepo.theme.first()
|
|
val serverUrl = userRepo.serverUrl.first()
|
|
if (serverUrl.isNotBlank()) {
|
|
ApiClient.baseUrl = serverUrl
|
|
}
|
|
}
|
|
|
|
StreamFlowTvTheme(themeName = currentTheme) {
|
|
val colors = StreamFlowTheme.colors
|
|
|
|
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
|
val currentRoute = navBackStackEntry?.destination?.route
|
|
val showSideNav = currentRoute != null && !currentRoute.startsWith("player")
|
|
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.background(colors.background)
|
|
) {
|
|
// Side Navigation
|
|
if (showSideNav) {
|
|
SideNavRail(
|
|
selectedId = selectedNavId,
|
|
onNavigate = { item ->
|
|
selectedNavId = item.id
|
|
navController.navigate(item.route) {
|
|
popUpTo("home") { saveState = true }
|
|
launchSingleTop = true
|
|
restoreState = true
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
// Main content
|
|
Box(modifier = Modifier.weight(1f)) {
|
|
NavHost(
|
|
navController = navController,
|
|
startDestination = "home"
|
|
) {
|
|
composable("home") {
|
|
HomeScreen(
|
|
onMovieClick = { slug ->
|
|
navController.navigate("detail/$slug")
|
|
},
|
|
userDataRepository = userRepo
|
|
)
|
|
}
|
|
|
|
composable(
|
|
"home/{category}",
|
|
arguments = listOf(navArgument("category") { type = NavType.StringType })
|
|
) { entry ->
|
|
HomeScreen(
|
|
onMovieClick = { slug -> navController.navigate("detail/$slug") },
|
|
category = entry.arguments?.getString("category"),
|
|
userDataRepository = userRepo
|
|
)
|
|
}
|
|
|
|
composable(
|
|
"detail/{slug}",
|
|
arguments = listOf(navArgument("slug") { type = NavType.StringType })
|
|
) { entry ->
|
|
val slug = entry.arguments?.getString("slug") ?: return@composable
|
|
DetailScreen(
|
|
slug = slug,
|
|
onPlayClick = { s, ep -> navController.navigate("player/$s/$ep") },
|
|
onBack = { navController.popBackStack() }
|
|
)
|
|
}
|
|
|
|
composable(
|
|
"player/{slug}/{episode}",
|
|
arguments = listOf(
|
|
navArgument("slug") { type = NavType.StringType },
|
|
navArgument("episode") { type = NavType.IntType; defaultValue = 1 }
|
|
)
|
|
) { entry ->
|
|
val slug = entry.arguments?.getString("slug")
|
|
val episode = entry.arguments?.getInt("episode") ?: 1
|
|
android.util.Log.e("StreamFlowNav", "Navigating to player: slug=$slug, episode=$episode")
|
|
if (slug == null) {
|
|
android.util.Log.e("StreamFlowNav", "Slug is null - not rendering PlayerScreen")
|
|
return@composable
|
|
}
|
|
PlayerScreen(
|
|
slug = slug,
|
|
episode = episode,
|
|
userDataRepository = userRepo
|
|
)
|
|
}
|
|
|
|
composable("search") {
|
|
SearchScreen(
|
|
onMovieClick = { slug -> navController.navigate("detail/$slug") }
|
|
)
|
|
}
|
|
|
|
composable("mylist") {
|
|
MyListScreen(
|
|
onMovieClick = { slug -> navController.navigate("detail/$slug") }
|
|
)
|
|
}
|
|
|
|
composable("settings") {
|
|
SettingsScreen(
|
|
currentTheme = currentTheme,
|
|
onThemeChange = { theme ->
|
|
currentTheme = theme
|
|
scope.launch { userRepo.setTheme(theme) }
|
|
}
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|