package com.vpn.fastestvpnservice.navigation import android.util.Log import androidx.activity.ComponentActivity import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.Surface import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.vpn.fastestvpnservice.R import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen val screens = listOf( BottomBarScreen.Home, BottomBarScreen.Settings, BottomBarScreen.Help, BottomBarScreen.Account ) var isHomeScreenPressed: MutableState = mutableStateOf(true) var isSettingsScreenPressed: MutableState = mutableStateOf(false) var isHelpScreenPressed: MutableState = mutableStateOf(false) var isAccountScreenPressed: MutableState = mutableStateOf(false) var selectedItemIndex: MutableState = mutableIntStateOf(0) var isFirstItemPressed: MutableState = mutableStateOf(false) var isSecondItemPressed: MutableState = mutableStateOf(false) var isThirdItemPressed: MutableState = mutableStateOf(false) var isFourthItemPressed: MutableState = mutableStateOf(false) var isFirstItemFocused: MutableState = mutableStateOf(false) var isSecondItemFocused: MutableState = mutableStateOf(false) var isThirdItemFocused: MutableState = mutableStateOf(false) var isFourthItemFocused: MutableState = mutableStateOf(false) @Composable fun CustomBottomBarTV(navHostController: NavHostController, activity: ComponentActivity) { val navController1 = rememberNavController() var isBottomBarVisible by remember { mutableStateOf(true) } // var selectedItemIndex by remember { mutableIntStateOf(0) } var focusRequestersList = remember { List(screens.size) { FocusRequester() } } navController1.addOnDestinationChangedListener { _,_,_ -> isBottomBarVisible = navController1.currentDestination?.route in listOf( screens[0].route, screens[1].route, screens[2].route, screens[3].route) } Scaffold ( modifier = Modifier.fillMaxSize(), bottomBar = { if (isBottomBarVisible) { BottomBarNavTV( navHostController = navController1, screens = screens ) } }, content = { padding -> Box(modifier = Modifier.padding(padding)) { BottomBarNavGraphTV( navHostController = navController1, settingsNavHostController = navHostController, activity ) } } ) } @Composable fun BottomBarNavTV( navHostController: NavHostController, screens: List ) { // var isFirstItemFocused by remember { mutableStateOf(false) } // var isSecondItemFocused by remember { mutableStateOf(false) } // var isThirdItemFocused by remember { mutableStateOf(false) } // var isFourthItemFocused by remember { mutableStateOf(false) } val focusRequester1 = remember { FocusRequester() } val focusRequester2 = remember { FocusRequester() } val focusRequester3 = remember { FocusRequester() } val focusRequester4 = remember { FocusRequester() } var isClicked by remember { mutableStateOf(false) } val navBackStackEntry = navHostController.currentBackStackEntryAsState() var currentDestination = navBackStackEntry.value?.destination var screen: BottomBarScreen = BottomBarScreen.Home val topPadding = 5.dp when (selectedItemIndex.value) { 0 -> { screen = BottomBarScreen.Home } 1 -> { screen = BottomBarScreen.Settings } 2 -> { screen = BottomBarScreen.Help } 3 -> { screen = BottomBarScreen.Account } } if (isClicked) { Log.d("test_bottom_navbar", "Before:: currentDestination -> " + currentDestination?.route + " -> " + screen.route + " " + selectedItemIndex.value ) if (currentDestination?.route != screen.route) { Log.d("test_bottom_navbar", "currentDestination -> " + currentDestination?.route + "Screen Clicked -> " + screen.route ) LaunchedEffect(Unit) { navHostController.navigate(screen.route) { popUpTo( navHostController.graph .findStartDestination().id) { saveState = true } launchSingleTop = true } } } isClicked = false } if (isFirstItemPressed.value) { LaunchedEffect(key1 = Unit) { focusRequester1.requestFocus() } isFirstItemPressed.value = false } if (isSecondItemPressed.value) { LaunchedEffect(key1 = Unit) { focusRequester2.requestFocus() } isSecondItemPressed.value = false } if (isThirdItemPressed.value) { LaunchedEffect(key1 = Unit) { focusRequester3.requestFocus() } isThirdItemPressed.value = false } if (isFourthItemPressed.value) { LaunchedEffect(key1 = Unit) { focusRequester4.requestFocus() } isFourthItemPressed.value = false } Box( modifier = Modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.background), contentAlignment = Alignment.Center ) { val iconSize = 45.dp Row( modifier = Modifier .height(55.dp) .fillMaxWidth(fraction = 0.4f) .padding(horizontal = 0.dp) .background(MaterialTheme.colorScheme.background), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Surface( color = if (isFirstItemFocused.value) MaterialTheme.colorScheme.outline else MaterialTheme.colorScheme.background, modifier = Modifier .focusRequester(focusRequester1) .onFocusChanged { Log.d("is_focused", "1st") isFirstItemFocused.value = it.isFocused if (it.isFocused) { Log.d("is_focused", "1st if") selectedItemIndex.value = 0 isClicked = true } } .focusable() .clickable { isHomeScreenPressed.value = true } ) { val color = if (selectedItemIndex.value == 0) colorResource(id = R.color.blue_text) else MaterialTheme.colorScheme.primary val alpha = if (selectedItemIndex.value == 0) 1f else 0.5f Icon( painter = painterResource(id = screens[0].icon), contentDescription = "Navigation Icon", tint = color, modifier = Modifier .size(iconSize) .padding(top = topPadding, bottom = 4.dp) .alpha(alpha) ) } Surface( color = if (isSecondItemFocused.value) MaterialTheme.colorScheme.outline else MaterialTheme.colorScheme.background, modifier = Modifier .focusRequester(focusRequester2) .onFocusChanged { Log.d("is_focused", "2nd") isSecondItemFocused.value = it.isFocused if (it.isFocused) { Log.d("is_focused", "2nd if") selectedItemIndex.value = 1 isClicked = true } } .focusable() .clickable { isSettingsScreenPressed.value = true } ) { val color = if (selectedItemIndex.value == 1) colorResource(id = R.color.blue_text) else MaterialTheme.colorScheme.primary val alpha = if (selectedItemIndex.value == 1) 1f else 0.5f Icon( painter = painterResource(id = screens[1].icon), contentDescription = "Navigation Icon", tint = color, modifier = Modifier .size(iconSize) .padding(top = topPadding, bottom = 4.dp) .alpha(alpha) ) } Surface( color = if (isThirdItemFocused.value) MaterialTheme.colorScheme.outline else MaterialTheme.colorScheme.background, modifier = Modifier .focusRequester(focusRequester3) .onFocusChanged { Log.d("is_focused", "3rd") isThirdItemFocused.value = it.isFocused if (it.isFocused) { Log.d("is_focused", "3rd if") selectedItemIndex.value = 2 isClicked = true } } .focusable() .clickable { isHelpScreenPressed.value = true } ) { val color = if (selectedItemIndex.value == 2) colorResource(id = R.color.blue_text) else MaterialTheme.colorScheme.primary val alpha = if (selectedItemIndex.value == 2) 1f else 0.5f Icon( painter = painterResource(id = screens[2].icon), contentDescription = "Navigation Icon", tint = color, modifier = Modifier .size(iconSize) .padding(top = topPadding, bottom = 4.dp) .alpha(alpha) ) } Surface( color = if (isFourthItemFocused.value) MaterialTheme.colorScheme.outline else MaterialTheme.colorScheme.background, modifier = Modifier .focusRequester(focusRequester4) .onFocusChanged { Log.d("is_focused", "4th") isFourthItemFocused.value = it.isFocused if (it.isFocused) { Log.d("is_focused", "4th if") selectedItemIndex.value = 3 isClicked = true } } .focusable() .clickable { isAccountScreenPressed.value = true } ) { val color = if (selectedItemIndex.value == 3) colorResource(id = R.color.blue_text) else MaterialTheme.colorScheme.primary val alpha = if (selectedItemIndex.value == 3) 1f else 0.5f Icon( painter = painterResource(id = screens[3].icon), contentDescription = "Navigation Icon", tint = color, modifier = Modifier .size(iconSize) .padding(top = topPadding, bottom = 4.dp) .alpha(alpha) ) } } } }