Browse Source

server list optimized on home screen TV so that delay shouldn't happen when opening server list screen on TV

Khubaib 11 tháng trước cách đây
mục cha
commit
6913e263bf

+ 1 - 1
.idea/deploymentTargetSelector.xml

@@ -4,7 +4,7 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2024-07-18T13:47:51.214529097Z">
+        <DropdownSelection timestamp="2024-07-18T15:11:26.301183634Z">
           <Target type="DEFAULT_BOOT">
             <handle>
               <DeviceId pluginId="Default" identifier="serial=192.168.108.28:5555;connection=909aac42" />

+ 46 - 4
app/src/main/java/com/vpn/fastestvpnservice/screensTV/HomeScreenTV.kt

@@ -1,5 +1,6 @@
 package com.vpn.fastestvpnservice.screensTV
 
+//import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.act
 import android.content.Context
 import android.os.Build
 import android.util.Log
@@ -45,6 +46,7 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -86,20 +88,16 @@ import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.constants.smartConnect
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
-import com.vpn.fastestvpnservice.interfaces.ServerCallbacks
 import com.vpn.fastestvpnservice.interfaces.ServerCallbacksTV
 import com.vpn.fastestvpnservice.navigation.isFirstItemPressed
 import com.vpn.fastestvpnservice.navigation.isHomeScreenPressed
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.ShowProtocolDialog
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.ShowServerDialog
-//import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.act
-import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.homeViewModel1
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.isServerDialog
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.navHostController1
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.protocolObj
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.serverObj
 import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
-import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.sealedClass.ScreenTV
 import com.vpn.fastestvpnservice.ui.theme.customTypography
 import com.vpn.fastestvpnservice.utils.Utils
@@ -112,6 +110,18 @@ import de.blinkt.openvpn.core.App
 lateinit var vpnConnectionsUtil: VPNConnectionsUtil
 var isProtocolDialog: MutableState<Boolean> = mutableStateOf(false)
 
+var isLocationsEnabled: MutableState<Boolean> = mutableStateOf(false)
+var isDedicatedIpEnabled: MutableState<Boolean> = mutableStateOf(false)
+var isStreamingEnabled: MutableState<Boolean> = mutableStateOf(false)
+var isDvpnEnabled: MutableState<Boolean> = mutableStateOf(false)
+var isP2pEnabled: MutableState<Boolean> = mutableStateOf(false)
+
+var locations: MutableList<Server> = ArrayList<Server>()
+var dedicatedIP: MutableList<Server> = ArrayList<Server>()
+var streaming: MutableList<Server> = ArrayList<Server>()
+var dvpn: MutableList<Server> = ArrayList<Server>()
+var p2p: MutableList<Server> = ArrayList<Server>()
+
 val onServerTV = object : ServerCallbacksTV {
 
     @Composable
@@ -324,6 +334,38 @@ fun HomeTV(navHostController: NavHostController, settingsNavHostController: NavH
         isHomeScreenPressed.value = false
     }
 
+    var isLaunched by rememberSaveable { mutableStateOf(true) }
+
+    if (isLaunched) {
+        Log.d("test_launch","liveDataGetServersGlobal")
+        val countries = serverListViewModelSplash.liveDataGetServersGlobal.value
+        countries?.forEachIndexed { index, serverData ->
+            Log.d("test_serverlist_tv","$index ${serverData?.name} ${serverData?.servers?.size}")
+            if (serverData?.name?.equals("Servers") == true) {
+                serverData.servers?.let { locations = it }
+                if (locations.size > 0) isLocationsEnabled.value = true
+            }
+            else if (serverData?.name?.equals("Dedicated IP") == true) {
+                serverData.servers?.let { dedicatedIP = it }
+                if (dedicatedIP.size > 0) isDedicatedIpEnabled.value = true
+            }
+            else if (serverData?.name?.equals("Streaming") == true) {
+                serverData.servers?.let { streaming = it }
+                if (streaming.size > 0) isStreamingEnabled.value = true
+            }
+            else if (serverData?.name?.equals("D-VPN") == true) {
+                serverData.servers?.let { dvpn = it }
+                if (dvpn.size > 0) isDvpnEnabled.value = true
+            }
+            else if (serverData?.name?.equals("P2P") == true) {
+                serverData.servers?.let { p2p = it }
+                if (p2p.size > 0) isP2pEnabled.value = true
+            }
+        }
+        isLaunched = false
+    }
+
+
 //    BackHandler {
 //        Toast.makeText(
 //            context, "BackHandler Home TV", Toast.LENGTH_SHORT

+ 78 - 86
app/src/main/java/com/vpn/fastestvpnservice/screensTV/ServerListScreenTV.kt

@@ -60,69 +60,61 @@ fun ServerListTV(navHostController: NavHostController) {
     ) {
         HeaderRowSL(navHostController = navHostController)
 
-//        var locations = ArrayList<Server>()
-//        var dedicatedIP = ArrayList<Server>()
-//        var streaming = ArrayList<Server>()
-//        var dvpn = ArrayList<Server>()
-//        var p2p = ArrayList<Server>()
+//        var locations by remember { mutableStateOf(ArrayList<Server>()) }
+//        var dedicatedIP by remember { mutableStateOf(ArrayList<Server>()) }
+//        var streaming by remember { mutableStateOf(ArrayList<Server>()) }
+//        var dvpn by remember { mutableStateOf(ArrayList<Server>()) }
+//        var p2p by remember { mutableStateOf(ArrayList<Server>()) }
 
-        var locations by remember { mutableStateOf(ArrayList<Server>()) }
-        var dedicatedIP by remember { mutableStateOf(ArrayList<Server>()) }
-        var streaming by remember { mutableStateOf(ArrayList<Server>()) }
-        var dvpn by remember { mutableStateOf(ArrayList<Server>()) }
-        var p2p by remember { mutableStateOf(ArrayList<Server>()) }
+//        var isLocationsEnabled by remember { mutableStateOf(false) }
+//        var isDedicatedIpEnabled by remember { mutableStateOf(false) }
+//        var isStreamingEnabled by remember { mutableStateOf(false) }
+//        var isDvpnEnabled by remember { mutableStateOf(false) }
+//        var isP2pEnabled by remember { mutableStateOf(false) }
 
-
-        var isLocationsEnabled by remember { mutableStateOf(false) }
-        var isDedicatedIpEnabled by remember { mutableStateOf(false) }
-        var isStreamingEnabled by remember { mutableStateOf(false) }
-        var isDvpnEnabled by remember { mutableStateOf(false) }
-        var isP2pEnabled by remember { mutableStateOf(false) }
-
-        LaunchedEffect(key1 = Unit) {
-            val countries = serverListViewModelSplash.liveDataGetServersGlobal.value
-            countries?.forEachIndexed { index, serverData ->
-                Log.d("test_serverlist_tv","$index ${serverData?.name} ${serverData?.servers?.size}")
-                if (serverData?.name?.equals("Servers") == true) {
-                    serverData.servers?.let { locations = it }
-                    if (locations.size > 0) isLocationsEnabled = true
-                }
-                else if (serverData?.name?.equals("Dedicated IP") == true) {
-                    serverData.servers?.let { dedicatedIP = it }
-                    if (dedicatedIP.size > 0) isDedicatedIpEnabled = true
-                }
-                else if (serverData?.name?.equals("Streaming") == true) {
-                    serverData.servers?.let { streaming = it }
-                    if (streaming.size > 0) isStreamingEnabled = true
-                }
-                else if (serverData?.name?.equals("D-VPN") == true) {
-                    serverData.servers?.let { dvpn = it }
-                    if (dvpn.size > 0) isDvpnEnabled = true
-                }
-                else if (serverData?.name?.equals("P2P") == true) {
-                    serverData.servers?.let { p2p = it }
-                    if (p2p.size > 0) isP2pEnabled = true
-                }
-            }
-        }
+//        LaunchedEffect(key1 = Unit) {
+//            val countries = serverListViewModelSplash.liveDataGetServersGlobal.value
+//            countries?.forEachIndexed { index, serverData ->
+//                Log.d("test_serverlist_tv","$index ${serverData?.name} ${serverData?.servers?.size}")
+//                if (serverData?.name?.equals("Servers") == true) {
+//                    serverData.servers?.let { locations = it }
+//                    if (locations.size > 0) isLocationsEnabled.value = true
+//                }
+//                else if (serverData?.name?.equals("Dedicated IP") == true) {
+//                    serverData.servers?.let { dedicatedIP = it }
+//                    if (dedicatedIP.size > 0) isDedicatedIpEnabled.value = true
+//                }
+//                else if (serverData?.name?.equals("Streaming") == true) {
+//                    serverData.servers?.let { streaming = it }
+//                    if (streaming.size > 0) isStreamingEnabled.value = true
+//                }
+//                else if (serverData?.name?.equals("D-VPN") == true) {
+//                    serverData.servers?.let { dvpn = it }
+//                    if (dvpn.size > 0) isDvpnEnabled.value = true
+//                }
+//                else if (serverData?.name?.equals("P2P") == true) {
+//                    serverData.servers?.let { p2p = it }
+//                    if (p2p.size > 0) isP2pEnabled.value = true
+//                }
+//            }
+//        }
 
         Column(
             modifier = Modifier
                 .fillMaxSize()
-                .padding(top = 80.dp, start = 24.dp, end = 24.dp, bottom = 24.dp)
+                .padding(top = 60.dp, start = 24.dp, end = 24.dp, bottom = 24.dp)
                 .verticalScroll(rememberScrollState())
                 .background(Color.Transparent)
         ) {
             val topPadding = 25.dp
-            Spacer(modifier = Modifier.height(0.dp))
 
-            if (isLocationsEnabled) {
+            if (isLocationsEnabled.value) {
                 Text(
-                    text = "Top Locations ${locations.size}",
+                    text = "Top Locations",
                     style = MaterialTheme.typography.labelLarge,
                     color = colorResource(id = R.color.dark_blue_gray_text),
                     modifier = Modifier
-                        .padding(top = topPadding, start = 0.dp)
+                        .padding(top = 0.dp, start = 0.dp)
                         .focusable()
                 )
                 LazyRow(
@@ -135,7 +127,7 @@ fun ServerListTV(navHostController: NavHostController) {
                     })
                 }
             }
-            if (isDedicatedIpEnabled) {
+            if (isDedicatedIpEnabled.value) {
                 Text(
                     text = "Dedicated IP",
                     style = MaterialTheme.typography.labelLarge,
@@ -153,7 +145,7 @@ fun ServerListTV(navHostController: NavHostController) {
                     })
                 }
             }
-            if (isStreamingEnabled) {
+            if (isStreamingEnabled.value) {
                 Text(
                     text = "Streaming",
                     style = MaterialTheme.typography.labelLarge,
@@ -171,7 +163,7 @@ fun ServerListTV(navHostController: NavHostController) {
                     })
                 }
             }
-            if (isDvpnEnabled) {
+            if (isDvpnEnabled.value) {
                 Text(
                     text = "D-VPN",
                     style = MaterialTheme.typography.labelLarge,
@@ -189,7 +181,7 @@ fun ServerListTV(navHostController: NavHostController) {
                     })
                 }
             }
-            if (isP2pEnabled) {
+            if (isP2pEnabled.value) {
                 Text(
                     text = "P2P",
                     style = MaterialTheme.typography.labelLarge,
@@ -214,44 +206,44 @@ fun ServerListTV(navHostController: NavHostController) {
 @Composable
 fun BoxScope.HeaderRowSL(
     navHostController: NavHostController) {
-    val focusRequester1 = remember { FocusRequester() }
-    var isButtonFocused by remember { mutableStateOf(false) }
-    LaunchedEffect(key1 = Unit) {
-        focusRequester1.requestFocus()
-    }
+//    val focusRequester1 = remember { FocusRequester() }
+//    var isButtonFocused by remember { mutableStateOf(false) }
+//    LaunchedEffect(key1 = Unit) {
+//        focusRequester1.requestFocus()
+//    }
 
-    IconButton(
-        onClick = {
-            navHostController.popBackStack()
-        },
-        modifier = Modifier
-            .align(Alignment.TopStart)
-            .padding(top = 25.dp)
-            .padding(start = 16.dp)
-            .size(30.dp, 32.dp)
-            .background(if (isButtonFocused) Color.LightGray else Color.Transparent)
-            .focusRequester(focusRequester1)
-            .onFocusChanged {
-                isButtonFocused = it.isFocused
-            }
-            .focusable()
-            .clickable {
-                navHostController.popBackStack()
-            }
-    ) {
-        Icon(
-            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
-            contentDescription = "Arrow-Back",
-            tint = colorResource(id = R.color.dark_blue_gray_text),
-//            tint = MaterialTheme.colorScheme.primary,
-            modifier = Modifier.size(30.dp, 32.dp)
-        )
-    }
+//    IconButton(
+//        onClick = {
+//            navHostController.popBackStack()
+//        },
+//        modifier = Modifier
+//            .align(Alignment.TopStart)
+//            .padding(top = 25.dp)
+//            .padding(start = 16.dp)
+//            .size(30.dp, 32.dp)
+//            .background(if (isButtonFocused) Color.LightGray else Color.Transparent)
+//            .focusRequester(focusRequester1)
+//            .onFocusChanged {
+//                isButtonFocused = it.isFocused
+//            }
+//            .focusable()
+//            .clickable {
+//                navHostController.popBackStack()
+//            }
+//    ) {
+//        Icon(
+//            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
+//            contentDescription = "Arrow-Back",
+//            tint = colorResource(id = R.color.dark_blue_gray_text),
+////            tint = MaterialTheme.colorScheme.primary,
+//            modifier = Modifier.size(30.dp, 32.dp)
+//        )
+//    }
     Surface(
         modifier = Modifier
-            .padding(top = 25.dp)
+            .padding(start = 14.dp, top = 16.dp)
             .height(32.dp)
-            .align(Alignment.TopCenter)
+            .align(Alignment.TopStart)
             .padding(5.dp),
         color = colorResource(id = R.color.transparent)
     ) {