package com.aiosman.riderpro import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemColors import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.compositionLocalOf 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.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.view.WindowCompat import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.aiosman.riderpro.ui.theme.RiderProTheme import com.google.accompanist.systemuicontroller.rememberSystemUiController class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) enableEdgeToEdge() setContent { Navigation() } } } val LocalNavController = compositionLocalOf { error("NavController not provided") } @Composable fun NavigationController(navController: NavHostController) { NavHost( navController = navController, startDestination = NavigationItem.Home.route, enterTransition = { fadeIn(animationSpec = tween(0)) }, exitTransition = { fadeOut(animationSpec = tween(0)) }) { composable(route = NavigationItem.Home.route) { Home() } composable(route = NavigationItem.Street.route) { Street() } composable(route = NavigationItem.Add.route) { Add() } composable(route = NavigationItem.Message.route) { Video() } composable(route = NavigationItem.Profile.route) { Profile() } composable(route = "ProfileTimeline") { GalleryPage() } composable(route="LocationDetail") { LocationDetail() } composable(route="OfficialPhoto") { OfficialGalleryPage() } composable(route="OfficialPhotographer") { OfficialPhotographer() } composable(route="Post") { PostPage() } } } @Composable fun Navigation() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } val navController = rememberNavController() val item = listOf( NavigationItem.Home, NavigationItem.Street, NavigationItem.Add, NavigationItem.Message, NavigationItem.Profile ) CompositionLocalProvider(LocalNavController provides navController) { Scaffold( modifier = Modifier.statusBarsPadding(), topBar = {}, bottomBar = { NavigationBar( modifier = Modifier.height(56.dp + navigationBarHeight), containerColor = Color.Black ) { val navBackStackEntry by navController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry?.destination?.route val systemUiController = rememberSystemUiController() item.forEach { it -> NavigationBarItem( selected = currentRoute == it.route, onClick = { if (currentRoute != it.route) { navController.navigate(it.route) } when (it.route) { NavigationItem.Add.route -> { systemUiController.setSystemBarsColor( color = Color.Black ) } NavigationItem.Message.route -> { systemUiController.setSystemBarsColor( color = Color.Black ) } else -> { systemUiController.setSystemBarsColor( color = Color.Transparent ) } } }, colors = NavigationBarItemColors( selectedIconColor = Color.Red, selectedTextColor = Color.Red, selectedIndicatorColor = Color.Black, unselectedIconColor = Color.Red, unselectedTextColor = Color.Red, disabledIconColor = Color.Red, disabledTextColor = Color.Red, ), icon = { Icon( modifier = Modifier.size(24.dp), imageVector = it.icon(), contentDescription = null, tint = if (currentRoute == it.route) Color.Red else Color.White ) } ) } } } ) { it Box( modifier = Modifier.padding(it) ) { NavigationController(navController = navController) } } } } @Composable fun Home() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { PagingBackendSample() } } @Composable fun Street() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { StreetPage() } } @Composable fun Add() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize() .background(Color.Black), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { AddPage() } } @Composable fun Video() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.CenterHorizontally, ) { ShortVideo() } } @Composable fun Message() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.CenterHorizontally, ) { MessagePage() } } @Composable fun Profile() { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { ProfilePage() } } @Preview(showBackground = true) @Composable fun GreetingPreview() { RiderProTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.White) { Navigation() } } }