194 lines
7.1 KiB
Kotlin
194 lines
7.1 KiB
Kotlin
package com.acitelight.aether
|
|
|
|
import android.app.Activity
|
|
import androidx.compose.material.icons.Icons
|
|
import android.graphics.drawable.Icon
|
|
import android.net.http.SslCertificate.saveState
|
|
import android.os.Bundle
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.setContent
|
|
import androidx.activity.enableEdgeToEdge
|
|
import androidx.compose.animation.AnimatedVisibility
|
|
import androidx.compose.animation.slideInVertically
|
|
import androidx.compose.animation.slideOutVertically
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.foundation.layout.height
|
|
import androidx.compose.foundation.layout.heightIn
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.material.icons.automirrored.filled.CompareArrows
|
|
import androidx.compose.material.icons.filled.*
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.NavigationBar
|
|
import androidx.compose.material3.NavigationBarItem
|
|
import androidx.compose.material3.Scaffold
|
|
import androidx.compose.material3.SegmentedButtonDefaults.Icon
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.graphics.vector.ImageVector
|
|
import androidx.compose.ui.platform.LocalView
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.core.view.WindowCompat
|
|
import androidx.core.view.WindowInsetsCompat
|
|
import androidx.core.view.WindowInsetsControllerCompat
|
|
import androidx.navigation.NavController
|
|
import androidx.navigation.NavGraph.Companion.findStartDestination
|
|
import androidx.navigation.NavType
|
|
import com.acitelight.aether.ui.theme.AetherTheme
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
|
import androidx.navigation.compose.rememberNavController
|
|
import androidx.navigation.navArgument
|
|
import com.acitelight.aether.view.ComicScreen
|
|
import com.acitelight.aether.view.HomeScreen
|
|
import com.acitelight.aether.view.MeScreen
|
|
import com.acitelight.aether.view.VideoPlayer
|
|
import com.acitelight.aether.view.VideoScreen
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
enableEdgeToEdge()
|
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
setContent {
|
|
AetherTheme {
|
|
AppNavigation()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Composable
|
|
fun ToggleFullScreen(isFullScreen: Boolean)
|
|
{
|
|
val view = LocalView.current
|
|
|
|
LaunchedEffect(isFullScreen) {
|
|
val window = (view.context as Activity).window
|
|
val insetsController = WindowCompat.getInsetsController(window, view)
|
|
|
|
if (isFullScreen) {
|
|
insetsController.hide(WindowInsetsCompat.Type.systemBars())
|
|
insetsController.systemBarsBehavior =
|
|
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
|
} else {
|
|
insetsController.show(WindowInsetsCompat.Type.systemBars())
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
fun AppNavigation() {
|
|
val navController = rememberNavController()
|
|
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
|
val currentRoute = navBackStackEntry?.destination?.route
|
|
|
|
val hideBottomBarRoutes = listOf(
|
|
Screen.VideoPlayer.route,
|
|
)
|
|
val shouldShowBottomBar = currentRoute !in hideBottomBarRoutes
|
|
|
|
Scaffold(
|
|
bottomBar = {
|
|
AnimatedVisibility(
|
|
visible = shouldShowBottomBar,
|
|
enter = slideInVertically(initialOffsetY = { fullHeight -> fullHeight }),
|
|
exit = slideOutVertically(targetOffsetY = { fullHeight -> fullHeight })
|
|
) {
|
|
BottomNavigationBar(navController = navController)
|
|
}
|
|
if(shouldShowBottomBar)
|
|
ToggleFullScreen(false)
|
|
}
|
|
) { innerPadding ->
|
|
NavHost(
|
|
navController = navController,
|
|
startDestination = Screen.Home.route,
|
|
modifier = if(shouldShowBottomBar)Modifier.padding(innerPadding) else Modifier.padding(0.dp)
|
|
) {
|
|
composable(Screen.Home.route) {
|
|
HomeScreen(navController = navController)
|
|
}
|
|
composable(Screen.Video.route) {
|
|
VideoScreen(navController = navController)
|
|
}
|
|
composable(Screen.Comic.route) {
|
|
ComicScreen()
|
|
}
|
|
|
|
composable(Screen.Transmission.route) {
|
|
// ComicScreen()
|
|
}
|
|
composable(Screen.Me.route) {
|
|
MeScreen();
|
|
}
|
|
|
|
composable(
|
|
route = Screen.VideoPlayer.route,
|
|
arguments = listOf(navArgument("videoId") { type = NavType.StringType })
|
|
) {
|
|
backStackEntry ->
|
|
val videoId = backStackEntry.arguments?.getString("videoId")
|
|
if (videoId != null) {
|
|
VideoPlayer(videoId = videoId, navController = navController)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
fun BottomNavigationBar(navController: NavController) {
|
|
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
|
val currentRoute = navBackStackEntry?.destination?.route
|
|
|
|
val items = if(Global.loggedIn) listOf(
|
|
Screen.Home,
|
|
Screen.Video,
|
|
Screen.Comic,
|
|
Screen.Transmission,
|
|
Screen.Me
|
|
) else listOf(
|
|
Screen.Home,
|
|
Screen.Transmission,
|
|
Screen.Me
|
|
)
|
|
|
|
NavigationBar( modifier = Modifier.height(60.dp)) {
|
|
items.forEach { screen ->
|
|
NavigationBarItem(
|
|
icon = { Icon(imageVector = screen.icon, contentDescription = null) },
|
|
selected = currentRoute == screen.route,
|
|
onClick = {
|
|
navController.navigate(screen.route) {
|
|
popUpTo(navController.graph.findStartDestination().id) {
|
|
saveState = true
|
|
}
|
|
launchSingleTop = true
|
|
restoreState = true
|
|
}
|
|
},
|
|
modifier = Modifier.padding(vertical = 2.dp).height(25.dp)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
sealed class Screen(val route: String, val icon: ImageVector, val title: String) {
|
|
data object Home : Screen("home_route", Icons.Filled.Home, "Home")
|
|
data object Video : Screen("video_route", Icons.Filled.VideoLibrary, "Video")
|
|
data object Comic : Screen("comic_route", Icons.Filled.Image, "Comic")
|
|
data object Transmission : Screen("transmission_route",
|
|
Icons.AutoMirrored.Filled.CompareArrows, "Transmission")
|
|
data object Me : Screen("me_route", Icons.Filled.AccountCircle, "me")
|
|
data object VideoPlayer : Screen("video_player_route/{videoId}", Icons.Filled.PlayArrow, "VideoPlayer")
|
|
} |