| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- 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<Boolean> = mutableStateOf(true)
- var isSettingsScreenPressed: MutableState<Boolean> = mutableStateOf(false)
- var isHelpScreenPressed: MutableState<Boolean> = mutableStateOf(false)
- var isAccountScreenPressed: MutableState<Boolean> = mutableStateOf(false)
- var selectedItemIndex: MutableState<Int> = mutableIntStateOf(0)
- var isFirstItemPressed: MutableState<Boolean> = mutableStateOf(false)
- var isSecondItemPressed: MutableState<Boolean> = mutableStateOf(false)
- var isThirdItemPressed: MutableState<Boolean> = mutableStateOf(false)
- var isFourthItemPressed: MutableState<Boolean> = mutableStateOf(false)
- var isFirstItemFocused: MutableState<Boolean> = mutableStateOf(false)
- var isSecondItemFocused: MutableState<Boolean> = mutableStateOf(false)
- var isThirdItemFocused: MutableState<Boolean> = mutableStateOf(false)
- var isFourthItemFocused: MutableState<Boolean> = 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<BottomBarScreen>
- ) {
- // 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)
- )
- }
- }
- }
- }
|