Kaynağa Gözat

set protocol interface, dialog protocol working on it, etc..

Khubaib 8 ay önce
ebeveyn
işleme
39180dd38f

+ 13 - 0
app/src/main/java/com/vpn/fastestvpnservice/interfaces/ServerCallbacks.kt

@@ -18,4 +18,17 @@ interface ServerCallbacks {
     )
 
     fun onChangeProtocol(protocol: Protocol, context: Context, serverListViewModel: ServerListViewModel)
+}
+
+interface ServerCallbacksTV {
+    @Composable
+    fun onServerSelected(
+        context: Context,
+        homeViewModel: HomeViewModel,
+        onClick: () -> Unit,
+        isServerDialogShown: Boolean,
+        server: Server
+    )
+
+    fun onChangeProtocol(protocol: Protocol, context: Context, serverListViewModel: ServerListViewModel)
 }

+ 1 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HomeScreen.kt

@@ -266,7 +266,7 @@ fun Home(
         when(event) {
             Lifecycle.Event.ON_RESUME -> {
                 Log.d("test_home_resume", "ON_RESUME: Home Screen!")
-
+                navHostController1 = navHostController
                 try {
                     App.backend?.runningTunnelNames
                 } catch (e: Exception) {

+ 156 - 0
app/src/main/java/com/vpn/fastestvpnservice/screensTV/HomeScreenTV.kt

@@ -37,6 +37,7 @@ import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
@@ -77,22 +78,153 @@ import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
+import com.vpn.fastestvpnservice.MainActivity
 import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.Protocol
+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
 import com.vpn.fastestvpnservice.utils.VPNConnectionsUtil
 import com.vpn.fastestvpnservice.utils.isTablet
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
+import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import de.blinkt.openvpn.core.App
 
 lateinit var vpnConnectionsUtil: VPNConnectionsUtil
+var isProtocolDialog: MutableState<Boolean> = mutableStateOf(false)
 
+val onServerTV = object : ServerCallbacksTV {
+
+    @Composable
+    override fun onServerSelected(
+        context: Context, homeViewModel: HomeViewModel,
+        onClick: () -> Unit, isServerDialogShown: Boolean, server: Server
+    ) {
+//        val wg = VPNConnectionsUtil(context, act ,homeViewModel)
+        val basePreferenceHelper = BasePreferenceHelper(context)
+//         val serverListViewModel: ServerListViewModel = viewModel{
+//             ServerListViewModel(context)
+//         }
+
+        Log.d("ServerCallbacks", "onServerSelected called!")
+
+        val lastServer = basePreferenceHelper.getConnectedServer()
+        val connectState = basePreferenceHelper.getConnectState()
+        if (isServerDialogShown) {
+            Log.d("ServerCallbacks", "onServerSelected true!")
+            if (connectState == 2) {
+                Log.d("ServerCallbacks", "onServerSelected isVPNConnected!")
+                if (lastServer?.id != server.id) {
+                    isServerDialog.value = true
+                    serverObj.value = server
+                }
+                else {
+                    basePreferenceHelper.setConnectedServer(server)
+                    basePreferenceHelper.setServerObject(server)
+                }
+            } else {
+                serverListViewModelSplash.setRecentlyConnectedServer(server)
+
+//                val recentList = basePreferenceHelper.getRecentlyList()
+//                val tempList = ArrayList<Server>()
+//                recentList?.let { tempList.addAll(it) }
+//
+//                if (tempList.size == 0) {
+//                    tempList.add(server)
+//                }
+//                else {
+//                        if (!tempList.any {
+//                                it.id == server.id
+//                            }) {
+//                            if (tempList.size != 5 && tempList.size < 5) {
+//                                tempList.add(0, server)
+//                            }
+//                        }
+//                }
+//
+//                basePreferenceHelper.setRecentlyList(tempList)
+
+                basePreferenceHelper.setConnectedServer(server)
+                basePreferenceHelper.setServerObject(server)
+//                wg.startVpn()
+            }
+        }
+        else {
+//            wg.startVpn()
+        }
+        MainActivity.isSelectedServersShown = true
+
+        onClick()
+
+    }
+
+    override fun onChangeProtocol(
+        protocol: Protocol,
+        context: Context,
+        serverListViewModel: ServerListViewModel
+    ) {
+        val prefHelper = BasePreferenceHelper(context)
+//        val wg = VPNConnectionsUtil(context, act , homeViewModel1)
+        protocolObj.value = protocol
+        val connectState = prefHelper.getConnectState()
+
+        if (getEnableProtocols(protocol.title, prefHelper)) {
+            Log.d("OnChangeProtocol", "getEnableProtocols yes!")
+
+            if (prefHelper.getProtocol().index != protocol.index) {
+
+                if (connectState == 2) {
+                    navHostController1.popBackStack()
+                    isProtocolDialog.value = true
+                }
+                else {
+                    prefHelper.saveProtocol(protocol = protocol)
+
+                    val lastServer = prefHelper.getConnectedServer()
+                    val serverList = prefHelper.getServerData()
+//                     val serverList = serverListViewModelSplash.liveDataGetServersGlobal.value
+
+                    if (lastServer != null) {
+                        val serverProtocol = serverListViewModel.getFilteredServerByProtocolChanged(serverList, lastServer, protocol)
+
+                        if (serverProtocol.isFound) {
+                            prefHelper.setServerObject(serverProtocol.server)
+                            val lastServer1 = prefHelper.getServerObject()
+                        }
+                    }
+                    serverListViewModelSplash.setCountryDataTV()
+                }
+            }
+
+        }
+        else {
+//             Screen.Subscription.isTrue = true
+//            navHostController1.let {
+//                it.navigate(Screen.Subscription.route)
+//            }
+            Toast.makeText(context, "Protocol not enabled", Toast.LENGTH_SHORT).show()
+        }
+    }
+
+}
 @Composable
 fun HomeTV(navHostController: NavHostController) {
 
@@ -187,6 +319,21 @@ fun HomeTV(navHostController: NavHostController) {
             .background(colorResource(id = R.color.background_color_gray))
             .fillMaxSize(),
     ) {
+        if (isServerDialog.value) {
+            ShowServerDialog(
+                basePreferenceHelper,
+                com.vpn.fastestvpnservice.screens.bottomNavBarScreens.vpnConnectionsUtil
+            )
+        }
+
+        if (isProtocolDialog.value) {
+            ShowProtocolDialog(
+                basePreferenceHelper,
+                com.vpn.fastestvpnservice.screens.bottomNavBarScreens.vpnConnectionsUtil,
+                serverListViewModelSplash
+            )
+        }
+
         // 1st box
         ConstraintLayout(modifier = Modifier
             .fillMaxSize()
@@ -967,6 +1114,15 @@ fun OnLifecycleEvent(onEvent: (
     }
 }
 
+private fun getEnableProtocols(protocol_name: String, prefHelper: BasePreferenceHelper): Boolean {
+    prefHelper.getEnabledProtocols().let {
+        if (it.contains(protocol_name)) {
+            return true
+        }
+    }
+    return false
+}
+
 @Composable
 fun pinkBackgroundTV(): Painter {
     return if (isDarkTheme.value) painterResource(id = R.drawable.darkpinkbackground)

+ 76 - 17
app/src/main/java/com/vpn/fastestvpnservice/screensTV/SettingsScreenTV.kt

@@ -7,6 +7,7 @@ import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.util.Log
+import android.widget.Toast
 import androidx.activity.compose.BackHandler
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.Image
@@ -88,8 +89,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.currentBackStackEntryAsState
 import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.Protocol
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.beans.themesList
+import com.vpn.fastestvpnservice.constants.AppEnum
 import com.vpn.fastestvpnservice.constants.smartConnect
 import com.vpn.fastestvpnservice.customItems.ServerSpecificItem
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
@@ -100,12 +103,16 @@ 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
+import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.navHostController1
+import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.onServer
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.vpnConnectionsUtil
 import com.vpn.fastestvpnservice.screens.searchListViewModelSplash
+import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.utils.isTablet
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
+import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import de.blinkt.openvpn.core.App
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
@@ -119,6 +126,8 @@ fun SettingsTV(navHostController: NavHostController) {
     val focusRequester3 = remember { FocusRequester() }
     val focusRequester4 = remember { FocusRequester() }
     val focusRequester5 = remember { FocusRequester() }
+    val focusRequesterProtocol = remember { FocusRequester() }
+
 
     if (isSettingsScreenPressed.value) {
         LaunchedEffect(Unit) {
@@ -191,7 +200,8 @@ fun SettingsTV(navHostController: NavHostController) {
                     text = "VPN Protocols",
                     focusRequester1,
                     focusRequester2,
-                    navHostController
+                    navHostController,
+                    focusRequesterProtocol
                 )
                 AddRowSettingsSmartTV(
                     icon = R.drawable.smart_connect3x,
@@ -475,7 +485,8 @@ fun ColumnScope.AddRowSettingsColumnTV(
     text: String,
     focusRequester1: FocusRequester,
     focusRequester2: FocusRequester,
-    navHostController: NavHostController
+    navHostController: NavHostController,
+    focusRequesterProtocol: FocusRequester
 ) {
     val context = LocalContext.current
     val basePreferenceHelper = BasePreferenceHelper(context = context)
@@ -488,7 +499,6 @@ fun ColumnScope.AddRowSettingsColumnTV(
     var selectedProtocol by remember { mutableStateOf(basePreferenceHelper.getProtocol().full_name) }
     var isFirstRowFocused by remember { mutableStateOf(false) }
 
-
 //    val serverListViewModel = serverListViewModelSplash
 //    val serverListViewModel: ServerListViewModel = viewModel{
 //        ServerListViewModel(context)
@@ -543,7 +553,9 @@ fun ColumnScope.AddRowSettingsColumnTV(
 //                    isSheetOpen = true
 //                }
 //            }
-            .clickable { isSheetOpen = true }
+            .clickable {
+                isSheetOpen = true
+                       }
         ,
         horizontalArrangement = Arrangement.Start,
         verticalAlignment = Alignment.CenterVertically
@@ -627,11 +639,13 @@ fun ColumnScope.AddRowSettingsColumnTV(
 //                containerColor = MaterialTheme.colorScheme.onBackground
                 containerColor = Color.White,
             ) {
+                var isProtocolFocused by remember { mutableStateOf(false) }
                 Box(modifier = Modifier
                     .background(Color.Transparent)
                     .fillMaxWidth()
                     .height(340.dp)
-                    .padding(start = 0.dp, top = 5.dp),
+                    .padding(start = 0.dp, top = 5.dp)
+                    ,
                 ) {
                     Column(
                         verticalArrangement = Arrangement.Top,
@@ -649,18 +663,22 @@ fun ColumnScope.AddRowSettingsColumnTV(
                             Row(
                                 modifier = Modifier
                                     .fillMaxWidth()
-                                    .background(Color.Transparent)
+                                    .background(Color.White)
                                     .padding(start = 2.dp)
                                     .selectable(
                                         selected = selectedProtocol == protocol,
                                         onClick = {
                                             selectedProtocol = protocol
                                             isSheetOpen = false
-//                                            selectProtocolCallback(
-//                                                protocol = protocol,
-//                                                context,
-//                                                serverListViewModel
-//                                            )
+                                            Toast.makeText(
+                                                context, selectedProtocol, Toast.LENGTH_SHORT
+                                            ).show()
+                                            selectProtocolCallbackTV(
+                                                protocol = protocol,
+                                                context,
+                                                serverListViewModelSplash,
+                                                navHostController
+                                            )
                                         },
                                     )
 //                                    .indication(
@@ -672,17 +690,25 @@ fun ColumnScope.AddRowSettingsColumnTV(
                                 ,
                                 verticalAlignment = Alignment.CenterVertically
                             ) {
-                                RadioButton(selected = protocol == selectedProtocol,
+                                RadioButton(
+                                    modifier = Modifier
+                                        .onFocusChanged {
+                                            isProtocolFocused = it.isFocused
+                                        }
+                                        .focusable()
+                                    ,
+                                    selected = protocol == selectedProtocol,
                                     onClick = {
-                                        selectedProtocol = protocol
-                                        isSheetOpen = false
-//                                        selectProtocolCallback(protocol = protocol, context, serverListViewModel)
+//                                        selectedProtocol = protocol
+//                                        isSheetOpen = false
                                     },
                                     colors = RadioButtonDefaults.colors(
                                         selectedColor = colorResource(id = R.color.radio_button_blue),
-                                        unselectedColor = colorResource(id = R.color.gray_icon),)
+                                        unselectedColor = colorResource(id = R.color.gray_icon),
+                                        )
                                 )
-                                Text(text = protocol,
+                                Text(
+                                    text = "$protocol $isProtocolFocused",
                                     modifier = Modifier.padding(start = 12.dp),
                                     color = MaterialTheme.colorScheme.inversePrimary,
                                     style = MaterialTheme.typography.bodySmall
@@ -696,6 +722,39 @@ fun ColumnScope.AddRowSettingsColumnTV(
     }
 }
 
+fun selectProtocolCallbackTV(
+    protocol: String,
+    context: Context,
+    serverListViewModel: ServerListViewModel,
+    navHostController: NavHostController
+) {
+    navHostController1 = navHostController
+    when (protocol) {
+        AppEnum.AUTO_PROTOCOL.title -> {
+            onServerTV.onChangeProtocol(
+                Protocol(AppEnum.AUTO_PROTOCOL.title, AppEnum.IKEV2_PROTOCOL.key, 0), context = context, serverListViewModel)
+        }
+        AppEnum.WG_PROTOCOL.title -> {
+            onServerTV.onChangeProtocol(
+                Protocol(AppEnum.WG_PROTOCOL.title, AppEnum.WG_PROTOCOL.key, 1), context = context, serverListViewModel)
+        }
+        AppEnum.IKEV2_PROTOCOL.title -> {
+            onServerTV.onChangeProtocol(
+                Protocol(AppEnum.IKEV2_PROTOCOL.title, AppEnum.IKEV2_PROTOCOL.key, 2), context = context, serverListViewModel)
+        }
+        AppEnum.TCP_PROTOCOL.title -> {
+            onServerTV.onChangeProtocol(
+                Protocol(AppEnum.TCP_PROTOCOL.title, AppEnum.TCP_PROTOCOL.key, 3), context = context, serverListViewModel)
+        }
+        AppEnum.UDP_PROTOCOL.title -> {
+            onServerTV.onChangeProtocol(
+                Protocol(AppEnum.UDP_PROTOCOL.title, AppEnum.UDP_PROTOCOL.key, 4), context = context, serverListViewModel)
+        }
+
+
+    }
+}
+
 @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
 @Composable
 fun ColumnScope.AddRowSettingsSmartTV(

+ 3 - 0
app/src/main/java/com/vpn/fastestvpnservice/screensTV/SplashScreenTV.kt

@@ -105,7 +105,10 @@ fun SplashTV(navHostController: NavHostController) {
             delay(delay)
             if (isLoggedIn) {
 //                serverListViewModelSplash.setRecommendedSmartServers()
+
                 serverListViewModelSplash.setCountryDataTV()
+
+
                 splashViewModelSplash.serverDataApi()
                 navHostController.popBackStack()
                 navHostController.navigate(ScreenTV.BottomBarTV.route)

+ 7 - 6
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ServerListViewModel.kt

@@ -216,6 +216,7 @@ class ServerListViewModel(context: Context): ViewModel() {
 //        serversGroupListGlobal.clear()
 
         data.forEachIndexed { index, serverData ->
+            Log.d("test_servers_list","$index ${serverData.name} ${serverData.servers?.size}")
             if (data[index].name?.lowercase().toString() == "servers") {
                 data[index].servers?.let {
                     val servers = serverListViewModelSplash.filterServersWithTvCountries(it)
@@ -438,9 +439,9 @@ class ServerListViewModel(context: Context): ViewModel() {
 //                if (entry.key == value.country) {
 //                    distinctBy.get(index).totalServers = entry.value.sumBy { it.totalServers }
 //                }
-                calculatePingNoDelay(value) {
-                    distinctBy.get(index).ping = it
-                }
+//                calculatePingNoDelay(value) {
+//                    distinctBy.get(index).ping = it
+//                }
             }
         }
 
@@ -530,9 +531,9 @@ class ServerListViewModel(context: Context): ViewModel() {
 //                if (entry.key == value.country) {
 ////                    distinctBy.get(index).totalServers = entry.value.sumBy { it.totalServers }
 //                }
-                calculatePingNoDelay(value) {
-                    distinctBy.get(index).ping = it
-                }
+//                calculatePingNoDelay(value) {
+//                    distinctBy.get(index).ping = it
+//                }
             }
         }