Files
rider-pro-android-app/app/src/main/java/com/aiosman/riderpro/MainActivity.kt

187 lines
7.6 KiB
Kotlin
Raw Normal View History

2024-06-22 04:25:20 +08:00
package com.aiosman.riderpro
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
2024-07-20 16:06:37 +08:00
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionScope
2024-07-19 10:05:06 +08:00
import androidx.compose.animation.animateColorAsState
2024-07-12 01:36:59 +08:00
import androidx.compose.animation.core.tween
2024-07-12 23:37:21 +08:00
import androidx.compose.foundation.layout.Box
2024-06-22 04:25:20 +08:00
import androidx.compose.foundation.layout.WindowInsets
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.runtime.Composable
2024-07-12 23:37:21 +08:00
import androidx.compose.runtime.compositionLocalOf
2024-06-22 04:25:20 +08:00
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
2024-07-13 17:41:51 +08:00
import androidx.core.view.WindowCompat
2024-06-22 04:25:20 +08:00
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
2024-07-31 14:50:55 +08:00
import com.aiosman.riderpro.data.AccountService
import com.aiosman.riderpro.data.TestAccountServiceImpl
2024-07-30 16:57:25 +08:00
import com.aiosman.riderpro.data.TestUserServiceImpl
import com.aiosman.riderpro.data.UserService
2024-07-23 15:25:00 +08:00
import com.aiosman.riderpro.ui.Navigation
2024-07-30 16:57:25 +08:00
import com.aiosman.riderpro.ui.NavigationRoute
2024-07-23 15:25:00 +08:00
import com.aiosman.riderpro.ui.index.NavigationItem
2024-07-12 01:36:59 +08:00
import com.google.accompanist.systemuicontroller.rememberSystemUiController
2024-07-15 19:02:42 +08:00
import com.google.android.libraries.places.api.Places
2024-07-30 16:57:25 +08:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2024-06-22 04:25:20 +08:00
class MainActivity : ComponentActivity() {
2024-07-30 16:57:25 +08:00
private val scope = CoroutineScope(Dispatchers.Main)
suspend fun getAccount() {
//TODO apply token to client
if (!AppStore.rememberMe) {
return
}
2024-07-31 14:50:55 +08:00
val accountService: AccountService = TestAccountServiceImpl()
accountService.getMyAccount()
2024-07-30 16:57:25 +08:00
}
2024-06-22 04:25:20 +08:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2024-07-13 17:41:51 +08:00
WindowCompat.setDecorFitsSystemWindows(window, false)
2024-07-15 19:02:42 +08:00
if (!Places.isInitialized()) {
2024-07-15 20:21:03 +08:00
Places.initialize(applicationContext, "AIzaSyDpgLDH1-SECw_pdjJq_msynq1XrxwgKVI")
2024-07-15 19:02:42 +08:00
}
2024-07-30 16:57:25 +08:00
AppStore.init(this)
2024-06-22 04:25:20 +08:00
enableEdgeToEdge()
2024-07-30 16:57:25 +08:00
scope.launch {
getAccount()
var startDestination = NavigationRoute.Login.route
if (AppStore.token != null && AppStore.rememberMe) {
startDestination = NavigationRoute.Index.route
}
setContent {
Navigation(startDestination)
}
2024-06-22 04:25:20 +08:00
}
}
}
2024-07-12 23:37:21 +08:00
val LocalNavController = compositionLocalOf<NavHostController> {
error("NavController not provided")
}
2024-07-20 16:06:37 +08:00
@OptIn(ExperimentalSharedTransitionApi::class)
val LocalSharedTransitionScope = compositionLocalOf<SharedTransitionScope> {
error("SharedTransitionScope not provided")
}
val LocalAnimatedContentScope = compositionLocalOf<AnimatedContentScope> {
error("AnimatedContentScope not provided")
}
// 用于带导航栏的路由的可复用 composable
@Composable
fun ScaffoldWithNavigationBar(
navController: NavHostController,
content: @Composable () -> Unit
) {
2024-06-22 04:25:20 +08:00
val navigationBarHeight = with(LocalDensity.current) {
WindowInsets.navigationBars.getBottom(this).toDp()
}
val item = listOf(
NavigationItem.Home,
NavigationItem.Street,
NavigationItem.Add,
NavigationItem.Message,
NavigationItem.Profile
)
Scaffold(
modifier = Modifier.statusBarsPadding(),
2024-07-15 10:30:56 +08:00
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 ->
2024-07-19 10:05:06 +08:00
val isSelected = currentRoute == it.route
val iconTint by animateColorAsState(
targetValue = if (isSelected) Color.Red else Color.White,
animationSpec = tween(durationMillis = 250), label = ""
)
2024-07-15 10:30:56 +08:00
NavigationBarItem(
selected = currentRoute == it.route,
onClick = {
2024-07-17 14:35:18 +08:00
// Check if the current route is not the same as the tab's route to avoid unnecessary navigation
2024-07-15 10:30:56 +08:00
if (currentRoute != it.route) {
2024-07-17 14:35:18 +08:00
navController.navigate(it.route) {
// Avoid creating a new layer on top of the navigation stack
launchSingleTop = true
// Attempt to pop up to the existing instance of the destination, if present
popUpTo(navController.graph.startDestinationId) {
saveState = true
}
// Restore state when navigating back to the composable
restoreState = true
}
}
2024-07-17 14:35:18 +08:00
// Additional logic for system UI color changes
2024-07-15 10:30:56 +08:00
when (it.route) {
NavigationItem.Add.route -> {
2024-07-17 14:35:18 +08:00
systemUiController.setSystemBarsColor(color = Color.Black)
2024-07-15 10:30:56 +08:00
}
2024-07-12 23:37:21 +08:00
2024-07-15 10:30:56 +08:00
NavigationItem.Message.route -> {
2024-07-17 14:35:18 +08:00
systemUiController.setSystemBarsColor(color = Color.Black)
2024-07-15 10:30:56 +08:00
}
2024-06-22 04:25:20 +08:00
2024-07-15 10:30:56 +08:00
else -> {
2024-07-17 14:35:18 +08:00
systemUiController.setSystemBarsColor(color = Color.Transparent)
2024-07-15 10:30:56 +08:00
}
2024-07-12 23:37:21 +08:00
}
2024-07-15 10:30:56 +08:00
},
colors = NavigationBarItemColors(
selectedTextColor = Color.Red,
selectedIndicatorColor = Color.Black,
unselectedTextColor = Color.Red,
disabledIconColor = Color.Red,
disabledTextColor = Color.Red,
2024-07-19 10:05:06 +08:00
selectedIconColor = iconTint,
unselectedIconColor = iconTint,
),
2024-07-15 10:30:56 +08:00
icon = {
Icon(
modifier = Modifier.size(24.dp),
2024-07-19 10:05:06 +08:00
imageVector = if (currentRoute == it.route) it.selectedIcon() else it.icon(),
contentDescription = null,
tint = iconTint
2024-07-15 10:30:56 +08:00
)
}
2024-07-15 10:30:56 +08:00
)
}
2024-07-12 23:37:21 +08:00
}
2024-07-15 10:30:56 +08:00
}
) { innerPadding ->
Box(
modifier = Modifier.padding(innerPadding)
) {
content()
2024-06-22 04:25:20 +08:00
}
}
}