Bläddra i källkod

dialog shown of server switching, ip also showing when disconnected...

Khubaib 11 månader sedan
förälder
incheckning
a2ef835227

+ 25 - 13
app/src/main/java/com/vpn/fastestvpnservice/customItems/CountryItem.kt

@@ -107,9 +107,11 @@ fun CountryItem(server: Server, category: String, navHostController: NavHostCont
 
         if (isCountryServerClicked) {
             Log.d("ServerCallbacks", "isServerClicked $isCountryServerClicked")
-            onServer.onServerSelected(context, homeViewModel) {
-                isCountryServerClicked = false
-            }
+            onServer.onServerSelected(context, homeViewModel,
+                onClick =  { isCountryServerClicked = false },
+                false,
+                server
+            )
             navHostController.popBackStack()
         }
 
@@ -119,9 +121,13 @@ fun CountryItem(server: Server, category: String, navHostController: NavHostCont
 
         if (isServerServerClicked) {
             Log.d("ServerCallbacks", "isServerClicked $isServerServerClicked")
-            onServer.onServerSelected(context, homeViewModel) {
-                isServerServerClicked = false
-            }
+            onServer.onServerSelected(
+                context,
+                homeViewModel,
+                onClick =  { isServerServerClicked = false },
+                false,
+                server
+            )
             navHostController.popBackStack()
         }
 
@@ -380,13 +386,6 @@ fun ColumnScope.ExpandableRow(server: ArrayList<Server>, navHostController: NavH
         mutableStateOf(false)
     }
 
-    if (isExpServerClicked) {
-        Log.d("ServerCallbacks", "isServerClicked $isExpServerClicked")
-        onServer.onServerSelected(context, homeViewModel) {
-            isExpServerClicked = false
-        }
-        navHostController.popBackStack()
-    }
 
     Column(
         modifier = Modifier
@@ -404,6 +403,19 @@ fun ColumnScope.ExpandableRow(server: ArrayList<Server>, navHostController: NavH
 
         server.let { serverData ->
                 serverData.forEachIndexed { index, serverInfo ->
+
+                    if (isExpServerClicked) {
+                        Log.d("ServerCallbacks", "isServerClicked $isExpServerClicked :: ${serverInfo.server_name}")
+                        onServer.onServerSelected(
+                            context,
+                            homeViewModel,
+                            onClick = {isExpServerClicked = false},
+                            false,
+                            serverInfo
+                        )
+                        navHostController.popBackStack()
+                    }
+
                     Row(
                         verticalAlignment = Alignment.CenterVertically,
                         horizontalArrangement = Arrangement.Start,

+ 25 - 11
app/src/main/java/com/vpn/fastestvpnservice/customItems/ServerItem.kt

@@ -64,7 +64,6 @@ import com.vpn.fastestvpnservice.beans.favListServer
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.helpers.UIHelper
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.onServer
-import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.onServerSelected
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.utils.Utils
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
@@ -99,9 +98,14 @@ fun ServerItem(server: Server, navHostController: NavHostController) {
 
         if (isServerClicked) {
             Log.d("ServerCallbacks", "isServerClicked $isServerClicked")
-            onServer.onServerSelected(context, homeViewModel) {
-                isServerClicked = false
-            }
+            onServer.onServerSelected(
+                context,
+                homeViewModel,
+                onClick = { isServerClicked = false },
+                false,
+                server
+            )
+
             navHostController.popBackStack()
         }
 
@@ -257,9 +261,15 @@ fun FavoriteServerItem(server: Server, navHostController: NavHostController) {
 
     if (isFavServerClicked) {
         Log.d("ServerCallbacks", "isServerClicked $isFavServerClicked")
-        onServer.onServerSelected(context, homeViewModel) {
-            isFavServerClicked = false
-        }
+        onServer.onServerSelected(
+            context,
+            homeViewModel,
+            onClick = { isFavServerClicked = false },
+            true,
+            server
+        )
+
+
         navHostController.popBackStack(BottomBarScreen.Home.route, false)
     }
 
@@ -284,7 +294,7 @@ fun FavoriteServerItem(server: Server, navHostController: NavHostController) {
 //                            context, server.server_name, Toast.LENGTH_SHORT
 //                        )
 //                        .show()
-                    basePreferenceHelper.setServerObject(server)
+//                    basePreferenceHelper.setServerObject(server)
                     isFavServerClicked = true
 
 //                    navHostController.popBackStack()
@@ -411,9 +421,13 @@ fun ServerSearchItem(server: Server, navHostController: NavHostController) {
 
     if (isSearchServerClicked) {
         Log.d("ServerCallbacks", "isServerClicked $isSearchServerClicked")
-        onServer.onServerSelected(context, homeViewModel) {
-            isSearchServerClicked = false
-        }
+        onServer.onServerSelected(
+            context,
+            homeViewModel,
+            onClick = { isSearchServerClicked = false },
+            false,
+            server
+        )
         navHostController.popBackStack()
     }
 

+ 8 - 1
app/src/main/java/com/vpn/fastestvpnservice/interfaces/ServerCallbacks.kt

@@ -2,9 +2,16 @@ package com.vpn.fastestvpnservice.interfaces
 
 import android.content.Context
 import androidx.compose.runtime.Composable
+import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
 
 interface ServerCallbacks {
     @Composable
-    fun onServerSelected(context: Context, homeViewModel: HomeViewModel, onClick: () -> Unit)
+    fun onServerSelected(
+        context: Context,
+        homeViewModel: HomeViewModel,
+        onClick: () -> Unit,
+        isServerDialogShown: Boolean,
+        server: Server
+    )
 }

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

@@ -29,6 +29,7 @@ import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.RoundedCornerShape
@@ -37,11 +38,13 @@ import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Home
 import androidx.compose.material.ripple.LocalRippleTheme
+import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.Card
 import androidx.compose.material3.CardColors
 import androidx.compose.material3.CardDefaults
+import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
@@ -51,6 +54,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -83,6 +87,7 @@ import androidx.compose.ui.graphics.painter.Painter
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.window.DialogProperties
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleOwner
@@ -107,29 +112,48 @@ import com.wireguard.android.backend.GoBackend
 import kotlinx.coroutines.CoroutineScope
 
 lateinit var act: ComponentActivity
+var isServerDialog: MutableState<Boolean> = mutableStateOf(false)
+var serverObj: MutableState<Server> = mutableStateOf(Server())
 
+ @OptIn(ExperimentalMaterial3Api::class)
  val onServer = object : ServerCallbacks {
     @Composable
     override fun onServerSelected(
         context: Context, homeViewModel: HomeViewModel,
-        onClick: () -> Unit) {
+        onClick: () -> Unit, isServerDialogShown: Boolean, server: Server) {
+        val basePreferenceHelper = BasePreferenceHelper(context)
+        val wg = WireGuardConnection(context, act ,homeViewModel)
 
-        Text(text = "Hi")
         Log.d("ServerCallbacks", "onServerSelected called!")
-        Log.d("onServerSelected", "onServerSelected called")
-//    homeViewModel._isConnect.value = true
-        val basePreferenceHelper = BasePreferenceHelper(context)
-//    basePreferenceHelper.setConnectState(true)
-//    homeViewModel.setConnectState(true)
+        Log.d("ServerCallbacks", "onServerSelected server = ${server.server_name}")
+
+        val lastServer = basePreferenceHelper.getServerObject()
+        if (isServerDialogShown) {
+            if (wg.isVPNConnected()) {
+                if (lastServer?.id != server.id) {
+                    isServerDialog.value = true
+                    serverObj.value = server
+                }
+                else {
+                    basePreferenceHelper.setServerObject(server)
+                    Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
+                }
+            } else {
+                basePreferenceHelper.setServerObject(server)
+                wg.startVpn()
+            }
+        }
+        else {
+            wg.startVpn()
+            Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
+        }
 
-        val wg = WireGuardConnection(context, act ,homeViewModel)
-        wg.startVpn()
-        Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
         onClick()
+
     }
 }
 
-@OptIn(ExperimentalFoundationApi::class)
+@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
 @Composable
 fun Home(navHostController: NavHostController, activity: ComponentActivity) {
 
@@ -152,13 +176,14 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
     }
     var server: Server = Server()
     val wireGuardConnection = WireGuardConnection(context, activity, homeViewModel)
+    val wg = WireGuardConnection(context, activity, homeViewModel)
 
     var isConnect: Boolean = homeViewModel.isConnect.observeAsState().value == true
     Log.d("isConnect_State", "live: $isConnect")
     isConnect = basePreferenceHelper.getConnectState()
     Log.d("isConnect_State", "$isConnect prefs => ${basePreferenceHelper.getConnectState()}")
 
-        OnLifecycleEvent{owner, event ->
+    OnLifecycleEvent{owner, event ->
         when(event) {
             Lifecycle.Event.ON_RESUME -> {
                 Log.d("test_home_resume", "ON_RESUME: Home Screen!")
@@ -241,15 +266,7 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
     Box(
         modifier = Modifier
             .background(MaterialTheme.colorScheme.background)
-//            .paint(
-//                if (isConnect) blueBackground() else pinkBackground(),
-//                alignment = Alignment.TopStart,
-//                contentScale = ContentScale.FillWidth,
-////                colorFilter = ColorFilter.tint(
-////                    color = colorResource(id = R.color.pink_color)),
-//            )
             .fillMaxSize(),
-//        contentAlignment = Alignment.TopCenter
     ) {
 
         Image(
@@ -275,6 +292,13 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
             )
         }
 
+        if (isServerDialog.value) {
+            ShowServerDialog(
+                basePreferenceHelper,
+                wg
+            )
+        }
+
         IconButton(
             onClick = {
                 Log.d("isConnect_State", "onClick{} -> $isConnect")
@@ -325,7 +349,8 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
             val serverObj = basePreferenceHelper.getServerObject()
             val serverDis = basePreferenceHelper.getIpinfo()
 
-            val ipInfo = if (isConnect) serverObj?.ip else serverDis?.query
+            var ipInfo = homeViewModel.mutableLiveDataIpInfo.observeAsState().value?.query
+            ipInfo = if (isConnect) serverObj?.ip.toString() else serverDis?.query
             AddText(
                 text = "$ipInfo",
                 size = 18.sp,
@@ -591,18 +616,129 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
 
     }
 
-    
 }
-fun onServerSelected(context: Context, homeViewModel: HomeViewModel) {
-    Log.d("onServerSelected", "onServerSelected called")
-//    homeViewModel._isConnect.value = true
-    val basePreferenceHelper = BasePreferenceHelper(context)
-//    basePreferenceHelper.setConnectState(true)
-//    homeViewModel.setConnectState(true)
 
-    val wg = WireGuardConnection(context, act ,homeViewModel)
-    wg.startVpn()
-    Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun BoxScope.ShowServerDialog(
+    prefHelper: BasePreferenceHelper,
+    wg: WireGuardConnection
+) {
+    AlertDialog(
+        onDismissRequest = { isServerDialog.value = false },
+        properties = DialogProperties(),
+        modifier = Modifier
+            .fillMaxWidth()
+            .wrapContentHeight()
+    ) {
+        val lastServer = prefHelper.getServerObject()
+        Surface(
+            color = colorResource(id = R.color.white),
+            modifier = Modifier
+                .background(Color.Transparent)
+                .fillMaxWidth()
+            ,
+            shape = RoundedCornerShape(18.dp)
+        ) {
+            Column(
+                verticalArrangement = Arrangement.Top,
+                horizontalAlignment = Alignment.CenterHorizontally,
+                modifier = Modifier
+                    .background(MaterialTheme.colorScheme.onPrimary)
+            ) {
+                Log.d("islogoutClicked", "AlertDialog")
+
+                Text(text = "Confirm",
+                    color = MaterialTheme.colorScheme.primary,
+                    style = MaterialTheme.typography.bodyMedium,
+                    modifier = Modifier.padding(top = 45.dp)
+                )
+                Text(text = "Are you sure to switch from ${lastServer?.server_name} to ${serverObj.value.server_name}?",
+                    color = MaterialTheme.colorScheme.primary,
+                    style = MaterialTheme.typography.labelSmall,
+                    maxLines = 2,
+                    modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 26.dp)
+                )
+                Row (
+                    modifier = Modifier
+                        .padding(top = 34.dp, bottom = 20.dp),
+                    horizontalArrangement = Arrangement.SpaceBetween,
+                    verticalAlignment = Alignment.Bottom
+                ) {
+                    Button(
+                        onClick = {
+                            Log.d("test_button", "No")
+                            isServerDialog.value = false
+                        },
+                        modifier = Modifier
+                            .padding(
+                                start = 15.dp, end = 5.dp,
+                                bottom = 0.dp, top = 0.dp
+                            )
+                            .background(colorResource(id = R.color.transparent))
+                            .weight(1F)
+                            .height(52.dp),
+
+                        shape = RoundedCornerShape(15.dp),
+                        colors = ButtonDefaults.buttonColors(
+                            contentColor = colorResource(id = R.color.white),
+                            containerColor = colorResource(id = R.color.light_blue),
+                        ),
+                    )
+                    {
+                        Text(text = "No",
+                            style = MaterialTheme.typography.labelLarge)
+                        Log.d("test_button", "RowScope")
+                    }
+
+                    Button(
+                        onClick = {
+                            Log.d("test_button", "Yes")
+                            isServerDialog.value = false
+                            prefHelper.setServerObject(serverObj.value)
+                            wg.startVpn()
+                            Log.d("ServerCallbacks", "Yes click => ${isServerDialog.value}")
+
+                        },
+                        modifier = Modifier
+                            .padding(
+                                start = 5.dp, end = 15.dp,
+                                bottom = 0.dp, top = 0.dp
+                            )
+                            .background(colorResource(id = R.color.transparent))
+                            .weight(1F)
+                            .height(52.dp),
+                        shape = RoundedCornerShape(15.dp),
+                        colors = ButtonDefaults.buttonColors(
+                            contentColor = colorResource(id = R.color.white),
+                            containerColor = colorResource(id = R.color.red),
+                        ),
+//                                border = BorderStroke(2.dp,
+//                                    colorResource(id = R.color.gray_icon))
+                    )
+                    {
+                        Text(text = "Yes",
+                            style = MaterialTheme.typography.labelLarge)
+                        Log.d("test_button", "RowScope")
+
+//                    val logoutResponse = accountViewModel.liveDataLogout.observeAsState().value
+//                    if (logoutResponse == true) {
+//                        accountViewModel.setLogoutStatus(false)
+//                        Log.d("test_api_response","Logout live: $logoutResponse")
+//                        basePreferenceHelper.setLoggedInState(false)
+//                        settingsNavHostController.popBackStack()
+//                        settingsNavHostController.navigate(Screen.Started.route)
+//                    }
+//                    else {
+////                        accountViewModel.setLogoutStatus(false)
+////                        onCancel()
+//                    }
+                    }
+                }
+            }
+
+        }
+    }
 }
 
 @Composable

+ 19 - 1
app/src/main/java/com/vpn/fastestvpnservice/utils/WireGuardConnection.kt

@@ -2,6 +2,8 @@ package com.vpn.fastestvpnservice.utils
 
 import android.content.Context
 import android.content.Intent
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
 import android.os.AsyncTask
 import android.util.Log
 import androidx.activity.ComponentActivity
@@ -87,7 +89,6 @@ class WireGuardConnection {
         val interfaceBuilder: Interface.Builder? = Interface.Builder()
         // WireGuard
 
-
         AsyncTask.execute {
             try {
                 if (isUp) {
@@ -143,4 +144,21 @@ class WireGuardConnection {
             vpnWireGuardPermission(false)
         }
     }
+
+    fun isVPNConnected(): Boolean {
+        try {
+            val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+            val networks = cm.allNetworks
+            for (network in networks) {
+                val caps = cm.getNetworkCapabilities(network)
+
+                if (caps!!.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) return true
+            }
+            return false
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return false
+    }
+
 }