Browse Source

working on custom navigation on TV-2

Khubaib 9 tháng trước cách đây
mục cha
commit
3fd7c140f5

+ 30 - 0
app/src/main/java/com/vpn/fastestvpnservice/navigation/CustomBottomBarTV.kt

@@ -59,6 +59,10 @@ 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)
+
 
 @Composable
 fun CustomBottomBarTV(navHostController: NavHostController, activity: ComponentActivity) {
@@ -103,7 +107,12 @@ fun BottomBarNavTV(
     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
@@ -155,6 +164,24 @@ fun BottomBarNavTV(
         }
         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
@@ -207,6 +234,7 @@ fun BottomBarNavTV(
             Surface(
                 color = if (isSecondItemFocused) Color.LightGray else colorResource(id = R.color.background_color_gray),
                 modifier = Modifier
+                    .focusRequester(focusRequester2)
                     .onFocusChanged {
                         Log.d("is_focused","2nd")
                         isSecondItemFocused = it.isFocused
@@ -240,6 +268,7 @@ fun BottomBarNavTV(
                 color = if (isThirdItemFocused) Color.LightGray else
                     colorResource(id = R.color.background_color_gray),
                 modifier = Modifier
+                    .focusRequester(focusRequester3)
                     .onFocusChanged {
                         Log.d("is_focused","3rd")
                         isThirdItemFocused = it.isFocused
@@ -273,6 +302,7 @@ fun BottomBarNavTV(
                 color = if (isFourthItemFocused) Color.LightGray else
                     colorResource(id = R.color.background_color_gray),
                 modifier = Modifier
+                    .focusRequester(focusRequester4)
                     .onFocusChanged {
                         Log.d("is_focused","4th")
                         isFourthItemFocused = it.isFocused

+ 36 - 2
app/src/main/java/com/vpn/fastestvpnservice/screensTV/AccountScreenTV.kt

@@ -57,6 +57,11 @@ import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.painter.Painter
 import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.KeyEventType
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.onKeyEvent
+import androidx.compose.ui.input.key.type
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalView
@@ -71,6 +76,8 @@ import androidx.navigation.NavHostController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.navigation.isAccountScreenPressed
+import com.vpn.fastestvpnservice.navigation.isFourthItemPressed
+import com.vpn.fastestvpnservice.navigation.isThirdItemPressed
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.LogoutDialog
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.act
 import com.vpn.fastestvpnservice.sealedClass.Screen
@@ -188,7 +195,8 @@ fun AccountTV(navHostController: NavHostController,
                     onClick = {
                         isLoggedOut = true
                         Log.d("islogoutClicked?", "Yes")
-                    }
+                    },
+                    isLastRow = true
                 )
             }
 
@@ -442,7 +450,8 @@ fun ColumnScope.AddRowAccountIconTV(
     icon: Painter,
     text: String,
     onClick : () -> Unit,
-    focusRequester1: FocusRequester = FocusRequester()
+    focusRequester1: FocusRequester = FocusRequester(),
+    isLastRow: Boolean = false
 ) {
     var isRowFocused by remember { mutableStateOf(false) }
     val context = LocalContext.current
@@ -453,6 +462,31 @@ fun ColumnScope.AddRowAccountIconTV(
             .background(if (isRowFocused) Color.LightGray else Color.White,
                 shape = RoundedCornerShape(4.dp))
             .height(61.dp)
+            .onKeyEvent {
+                if (isLastRow) {
+                    if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
+                        Toast
+                            .makeText(
+                                context, "KeyDown & DirectionDown Email", Toast.LENGTH_SHORT
+                            )
+                            .show()
+//                        customNavigation(navHostController, BottomBarScreen.Help)
+                        isFourthItemPressed.value = true
+                        true
+                    }
+                    else if (it.type == KeyEventType.KeyUp && it.key == Key.DirectionUp) {
+                        Toast
+                            .makeText(
+                                context, "KeyUp & DirectionUp Email", Toast.LENGTH_SHORT
+                            )
+                            .show()
+                        false
+                    }
+                    else {
+                        false
+                    }
+                } else { false }
+            }
             .focusRequester(focusRequester1)
             .onFocusChanged {
                 isRowFocused = it.isFocused

+ 37 - 1
app/src/main/java/com/vpn/fastestvpnservice/screensTV/HelpScreenTV.kt

@@ -46,6 +46,11 @@ import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.KeyEventType
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.onKeyEvent
+import androidx.compose.ui.input.key.type
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.res.colorResource
@@ -58,7 +63,11 @@ import androidx.core.view.WindowCompat
 import androidx.navigation.NavHostController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.isDarkTheme
+import com.vpn.fastestvpnservice.navigation.customNavigation
 import com.vpn.fastestvpnservice.navigation.isHelpScreenPressed
+import com.vpn.fastestvpnservice.navigation.isSecondItemPressed
+import com.vpn.fastestvpnservice.navigation.isThirdItemPressed
+import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.sealedClass.Screen
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -165,6 +174,7 @@ fun HelpTV(navHostController: NavHostController) {
                             Screen.EmailUs.route
                         )
                     },
+                    isLastRow = true
                 )
             }
         }
@@ -179,7 +189,8 @@ fun ColumnScope.AddRowTV(
     topPadding: Dp = 40.dp,
     focusRequester1: FocusRequester = FocusRequester(),
     onClick: () -> Unit,
-    isIconTV: Boolean = true
+    isIconTV: Boolean = true,
+    isLastRow: Boolean = false
 ) {
     var isRowFocused by remember { mutableStateOf(false) }
     val context = LocalContext.current
@@ -192,6 +203,31 @@ fun ColumnScope.AddRowTV(
             .clip(RoundedCornerShape(4.dp))
             .background(if (isRowFocused) Color.LightGray else Color.White)
             .height(61.dp)
+            .onKeyEvent {
+                if (isLastRow) {
+                    if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
+                        Toast
+                            .makeText(
+                                context, "KeyDown & DirectionDown Email", Toast.LENGTH_SHORT
+                            )
+                            .show()
+//                        customNavigation(navHostController, BottomBarScreen.Help)
+                        isThirdItemPressed.value = true
+                        true
+                    }
+                    else if (it.type == KeyEventType.KeyUp && it.key == Key.DirectionUp) {
+                        Toast
+                            .makeText(
+                                context, "KeyUp & DirectionUp Email", Toast.LENGTH_SHORT
+                            )
+                            .show()
+                        false
+                    }
+                    else {
+                        false
+                    }
+                } else { false }
+            }
             .focusRequester(focusRequester1)
             .onFocusChanged {
                 isRowFocused = it.isFocused

+ 22 - 2
app/src/main/java/com/vpn/fastestvpnservice/screensTV/SettingsScreenTV.kt

@@ -70,8 +70,10 @@ import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.KeyEventType
 import androidx.compose.ui.input.key.key
 import androidx.compose.ui.input.key.onKeyEvent
+import androidx.compose.ui.input.key.type
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalFocusManager
@@ -94,6 +96,8 @@ import com.vpn.fastestvpnservice.constants.smartConnect
 import com.vpn.fastestvpnservice.customItems.ServerSpecificItem
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.navigation.customNavigation
+import com.vpn.fastestvpnservice.navigation.isFirstItemPressed
+import com.vpn.fastestvpnservice.navigation.isSecondItemPressed
 import com.vpn.fastestvpnservice.navigation.isSettingsScreenPressed
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.AddTextSettings
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.getAvailableProtocols
@@ -216,7 +220,8 @@ fun SettingsTV(navHostController: NavHostController) {
                 AddRowSettingsTV(
                     icon = R.drawable.notification3x,
                     text = "Notifications",
-                    onClick = { navHostController.navigate(Screen.Notifications.route) }
+                    onClick = { navHostController.navigate(Screen.Notifications.route) },
+                    isLastRow = true
                 )
 //                AddRowDarkLightThemeTV(
 //                    icon = Icons.Default.DarkMode,
@@ -242,15 +247,30 @@ fun ColumnScope.AddRowSettingsTV(
     icon: Int,
     text: String,
     topPadding: Dp = 40.dp,
-    onClick: () -> Unit
+    onClick: () -> Unit,
+    isLastRow: Boolean = false
 ) {
     var isRowFocused by remember { mutableStateOf(false) }
+    val context = LocalContext.current
     Row(
         modifier = Modifier
             .fillMaxWidth()
             .padding(top = 5.dp, end = 27.dp)
             .clip(RoundedCornerShape(4.dp))
             .background(if (isRowFocused) Color.LightGray else Color.White)
+            .onKeyEvent {
+                if (isLastRow) {
+                    if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
+                        Toast
+                            .makeText(
+                                context, "KeyDown & DirectionDown Notify", Toast.LENGTH_SHORT
+                            )
+                            .show()
+                        isSecondItemPressed.value = true
+                    }
+                    false
+                } else { false }
+            }
             .onFocusChanged {
                 isRowFocused = it.isFocused
             }