Browse Source

Code: version_1.0

Khubaib 1 year ago
parent
commit
139cb0b926
25 changed files with 418 additions and 96 deletions
  1. 3 0
      app/build.gradle.kts
  2. 10 0
      app/src/main/AndroidManifest.xml
  3. 4 1
      app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt
  4. 29 0
      app/src/main/java/com/vpn/fastestvpnservice/application/App.java
  5. 17 8
      app/src/main/java/com/vpn/fastestvpnservice/customItems/CountryItem.kt
  6. 20 10
      app/src/main/java/com/vpn/fastestvpnservice/customItems/ServerItem.kt
  7. 16 9
      app/src/main/java/com/vpn/fastestvpnservice/customItems/SubscriptionPackageItem.kt
  8. 10 0
      app/src/main/java/com/vpn/fastestvpnservice/helpers/BasePreferenceHelper.kt
  9. 3 3
      app/src/main/java/com/vpn/fastestvpnservice/navigation/BottomBarNavGraph.kt
  10. 4 0
      app/src/main/java/com/vpn/fastestvpnservice/navigation/NavGraph.kt
  11. 4 1
      app/src/main/java/com/vpn/fastestvpnservice/screens/LoginScreen.kt
  12. 15 12
      app/src/main/java/com/vpn/fastestvpnservice/screens/ServerListScreen.kt
  13. 3 1
      app/src/main/java/com/vpn/fastestvpnservice/screens/SignUpScreen.kt
  14. 1 1
      app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/FavoriteServersScreen.kt
  15. 29 14
      app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/SubscriptionScreen.kt
  16. 52 11
      app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HomeScreen.kt
  17. 12 12
      app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt
  18. 1 0
      app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/FAQScreen.kt
  19. 17 6
      app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/TermsAndConditionsScreen.kt
  20. 1 0
      app/src/main/java/com/vpn/fastestvpnservice/sealedClass/Screen.kt
  21. 128 1
      app/src/main/java/com/vpn/fastestvpnservice/utils/WireGuardConnection.kt
  22. 9 1
      app/src/main/java/com/vpn/fastestvpnservice/viewmodels/HomeViewModel.kt
  23. 4 3
      app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SplashViewModel.kt
  24. 8 2
      app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SubscriptionViewModel.kt
  25. 18 0
      app/src/main/java/wireguard/WgTunnel.java

+ 3 - 0
app/build.gradle.kts

@@ -84,6 +84,9 @@ dependencies {
     implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
     implementation("androidx.compose.runtime:runtime-livedata:1.6.1")
 
+    implementation("com.wireguard.android:tunnel:1.0.20210211")
+
+
     // Ping
     implementation("com.github.stealthcopter:AndroidNetworkTools:0.4.5.3")
 

+ 10 - 0
app/src/main/AndroidManifest.xml

@@ -29,6 +29,16 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <service
+            android:name="com.wireguard.android.backend.GoBackend$VpnService"
+            android:exported="true"
+            android:permission="android.permission.BIND_VPN_SERVICE">
+            <intent-filter>
+                <action android:name="android.net.VpnService" />
+            </intent-filter>
+        </service>
+
     </application>
 
 </manifest>

+ 4 - 1
app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt

@@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.get
 import androidx.lifecycle.viewmodel.compose.viewModel
@@ -35,6 +36,8 @@ import com.vpn.fastestvpnservice.navigation.SetUpNavGraph
 import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
 import com.vpn.fastestvpnservice.viewmodels.BillingViewModel
 import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
+import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
+import com.vpn.fastestvpnservice.viewmodels.SubscriptionViewModel
 
 class MainActivity : ComponentActivity() {
     val loginViewModel: LoginViewModel by viewModels()
@@ -42,9 +45,9 @@ class MainActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-
         setContent {
             val context = LocalContext.current
+
             val basePreferenceHelper = BasePreferenceHelper(context)
             val selectedTheme = basePreferenceHelper.getTheme()
 

+ 29 - 0
app/src/main/java/com/vpn/fastestvpnservice/application/App.java

@@ -2,10 +2,39 @@ package com.vpn.fastestvpnservice.application;
 
 import android.app.Application;
 
+import com.wireguard.android.backend.Backend;
+import com.wireguard.android.backend.Tunnel;
+import com.wireguard.config.Peer;
+
+import wireguard.WgTunnel;
+
 public class App extends Application {
 
     private static App instance;
 
+    public static WgTunnel tunnel;
+    public static Tunnel.State tunnelStatus;
+    public static Peer.Builder peerBuilder = new Peer.Builder();
+    public static Backend backend;
+
+    public static void setBackend(Backend backend1) {
+        backend = backend1;
+    }
+
+    public static Backend getBackend() {
+        return backend;
+    }
+
+    public static WgTunnel getTunnel() {
+        try {
+            tunnel.getName();
+        } catch (Exception e) {
+            tunnel = new WgTunnel();
+        }
+        return tunnel;
+    }
+
+
     @Override
     public void onCreate() {
         super.onCreate();

+ 17 - 8
app/src/main/java/com/vpn/fastestvpnservice/customItems/CountryItem.kt

@@ -5,6 +5,7 @@ import android.util.Log
 import android.widget.Toast
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -38,6 +39,7 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.painterResource
@@ -47,6 +49,8 @@ import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.CountryServerList
 import com.vpn.fastestvpnservice.beans.Server
@@ -57,13 +61,14 @@ import com.vpn.fastestvpnservice.utils.Utils
 import com.stealthcopter.networktools.Ping
 import com.stealthcopter.networktools.ping.PingResult
 import com.stealthcopter.networktools.ping.PingStats
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import java.lang.Exception
 import java.util.logging.Handler
 
 @Composable
-fun CountryItem(server: Server, category: String) {
+fun CountryItem(server: Server, category: String, navHostController: NavHostController) {
     Log.d("test_countrySize", "CountryItem Called")
     Box(
         modifier = Modifier
@@ -74,7 +79,8 @@ fun CountryItem(server: Server, category: String) {
             .padding(bottom = 1.dp)
     ) {
         val context = LocalContext.current
-        var countrySize by rememberSaveable { mutableStateOf(server.countryServers) }
+        val basePreferenceHelper = BasePreferenceHelper(context)
+        val countrySize by rememberSaveable { mutableStateOf(server.countryServers) }
         var isServerExpanded by rememberSaveable { mutableStateOf(false) }
         val serverListViewModel: ServerListViewModel = viewModel{
             ServerListViewModel(context)
@@ -111,7 +117,7 @@ fun CountryItem(server: Server, category: String) {
                                         indication = null,
                                         interactionSource = remember { MutableInteractionSource() }
                                     ) {
-
+                                        navHostController.popBackStack()
                                     }
                             ) {
                                 val icon = Utils.getDrawable(context, server.iso)
@@ -167,7 +173,7 @@ fun CountryItem(server: Server, category: String) {
                             if (isServerExpanded) {
 
 
-                                ExpandableRow(server = server)
+                                ExpandableRow(server = server, navHostController)
                             }
                         }
                     }
@@ -203,8 +209,9 @@ fun CountryItem(server: Server, category: String) {
                                     indication = null,
                                     interactionSource = remember { MutableInteractionSource() }
                                 ) {
-
+                                    navHostController.popBackStack()
                                 }
+
                         ) {
                             val icon = Utils.getDrawable(context, server.iso)
                             Icon(
@@ -291,8 +298,9 @@ fun CountryItem(server: Server, category: String) {
 }
 
 @Composable
-fun ColumnScope.ExpandableRow(server: Server) {
+fun ColumnScope.ExpandableRow(server: Server, navHostController: NavHostController) {
     val context = LocalContext.current
+    val basePreferenceHelper = BasePreferenceHelper(context)
     val serverListViewModel: ServerListViewModel = viewModel{
         ServerListViewModel(context)
     }
@@ -329,7 +337,8 @@ fun ColumnScope.ExpandableRow(server: Server) {
                                 indication = null,
                                 interactionSource = remember { MutableInteractionSource() }
                             ) {
-
+                                navHostController.popBackStack()
+//                                basePreferenceHelper.setServerObject(serverInfo)
                             }
                     ) {
                         Text(text = serverInfo.server_name!!,
@@ -429,5 +438,5 @@ fun calculatePing(server: Server, onPingResult: (Int) -> Unit) {
 @Preview
 @Composable
 fun CountryItemPreview() {
-    CountryItem(server = favListServer[0], "servers")
+    CountryItem(server = favListServer[0], "servers", rememberNavController())
 }

+ 20 - 10
app/src/main/java/com/vpn/fastestvpnservice/customItems/ServerItem.kt

@@ -50,6 +50,8 @@ import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.rememberNavController
 import com.stealthcopter.networktools.Ping
 import com.stealthcopter.networktools.ping.PingResult
 import com.stealthcopter.networktools.ping.PingStats
@@ -58,6 +60,7 @@ import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.ServerList
 import com.vpn.fastestvpnservice.beans.favList
 import com.vpn.fastestvpnservice.beans.favListServer
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.helpers.UIHelper
 import com.vpn.fastestvpnservice.utils.Utils
 import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
@@ -66,14 +69,15 @@ import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import java.lang.Exception
 
 @Composable
-fun ServerItem(server: Server) {
+fun ServerItem(server: Server, navHostController: NavHostController) {
+    val context = LocalContext.current
+    val basePreferenceHelper = BasePreferenceHelper(context)
     Box(
         modifier = Modifier
             .fillMaxWidth()
             .background(color = MaterialTheme.colorScheme.background)
             .padding(bottom = 1.dp)
     ) {
-        val context = LocalContext.current
         val serverListViewModel: ServerListViewModel = viewModel{
             ServerListViewModel(context)
         }
@@ -91,7 +95,8 @@ fun ServerItem(server: Server) {
                     indication = null,
                     interactionSource = remember { MutableInteractionSource() }
                 ) {
-
+                    basePreferenceHelper.setServerObject(server)
+                    navHostController.popBackStack()
                 }
         ) {
             var ping by remember { mutableIntStateOf(0) }
@@ -208,8 +213,9 @@ fun ServerItem(server: Server) {
 }
 
 @Composable
-fun FavoriteServerItem(server: Server) {
+fun FavoriteServerItem(server: Server, navHostController: NavHostController) {
     val context = LocalContext.current
+    val basePreferenceHelper = BasePreferenceHelper(context)
     var serverListViewModel: ServerListViewModel = viewModel {
         ServerListViewModel(context = context)
     }
@@ -233,7 +239,8 @@ fun FavoriteServerItem(server: Server) {
                     indication = null,
                     interactionSource = remember { MutableInteractionSource() }
                 ) {
-
+                    basePreferenceHelper.setServerObject(server)
+                    navHostController.popBackStack()
                 }
         ) {
             var ping by remember { mutableIntStateOf(0) }
@@ -338,8 +345,9 @@ fun FavoriteServerItem(server: Server) {
 }
 
 @Composable
-fun ServerSearchItem(server: Server) {
+fun ServerSearchItem(server: Server, navHostController: NavHostController) {
     val context = LocalContext.current
+    val basePreferenceHelper = BasePreferenceHelper(context)
     var serverListViewModel: ServerListViewModel = viewModel {
         ServerListViewModel(context = context)
     }
@@ -366,6 +374,8 @@ fun ServerSearchItem(server: Server) {
                     indication = null,
                     interactionSource = remember { MutableInteractionSource() }
                 ) {
+                    basePreferenceHelper.setServerObject(server)
+                    navHostController.popBackStack()
 
                 }
         ) {
@@ -481,23 +491,23 @@ fun ServerSearchItem(server: Server) {
 @Preview
 @Composable
 fun ServerItemPreview() {
-    ServerItem(server = favListServer[0])
+    ServerItem(server = favListServer[0], rememberNavController())
 }
 
 @Preview
 @Composable
 fun FavoriteServerItemPreview() {
-    FavoriteServerItem(server = favListServer[0])
+    FavoriteServerItem(server = favListServer[0], rememberNavController())
 }
 
 @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
 @Composable
 fun FavoriteServerItemPreviewDark() {
-    FavoriteServerItem(server = favListServer[0])
+    FavoriteServerItem(server = favListServer[0], rememberNavController())
 }
 
 @Preview
 @Composable
 fun ServerSearchItemPreview() {
-    ServerSearchItem(server = favListServer[0])
+    ServerSearchItem(server = favListServer[0], rememberNavController())
 }

+ 16 - 9
app/src/main/java/com/vpn/fastestvpnservice/customItems/SubscriptionPackageItem.kt

@@ -6,6 +6,7 @@ import android.widget.Toast
 import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -56,11 +57,14 @@ fun SubscriptionPackageItem(item: SubscriptionPackageList, position: Int, activi
     var selectedPosition by remember { mutableIntStateOf(0) }
     var items by remember { mutableStateOf(item) }
     var isSelected by remember { mutableStateOf(true) }
-    val random = kotlin.random.Random.nextInt(1, 999)
+    val random = kotlin.random.Random.nextInt(999)
     val subscriptionViewModel: SubscriptionViewModel = viewModel{
         SubscriptionViewModel(context = context, activity)
     }
 
+//    val num4 = subscriptionViewModel.mutableLiveDataNumber.value
+//    Log.d("test_num_viewmodel", "num4 = $num4 , random = $random")
+
     Box(
         modifier = Modifier
             .fillMaxWidth()
@@ -79,6 +83,9 @@ fun SubscriptionPackageItem(item: SubscriptionPackageList, position: Int, activi
                 shape = RoundedCornerShape(24.dp),
                 color = Color.White
             )
+            .clickable {
+//                subscriptionViewModel.setNumber(random)
+            }
             .pointerInput(Unit) {
                 detectTapGestures {
 
@@ -106,18 +113,19 @@ fun SubscriptionPackageItem(item: SubscriptionPackageList, position: Int, activi
 //                        Log.d("test_plan", "False : selectedPosition = $selectedPosition position = $position" )
                         selectedPosition = position
 
+                        // uncomment this below
                         subscriptionViewModel.mutableLiveDataProducts.value?.let { it1 ->
                             subscriptionViewModel.setProductsData(
                                 it1
                             )
                         }
 
-                        val featuresSize = subscriptionViewModel.liveDataProducts.value
-                        Log.d(
-                            "test_api_response_p",
-                            "Products selectedPosition = $selectedPosition ," +
-                                    "features size = ${featuresSize?.data?.get(selectedPosition)?.features?.size}"
-                        )
+//                        val featuresSize = subscriptionViewModel.liveDataProducts.value
+//                        Log.d(
+//                            "test_api_response_p",
+//                            "Products selectedPosition = $selectedPosition ," +
+//                                    "features size = ${featuresSize?.data?.get(selectedPosition)?.features?.size}"
+//                        )
 
                         subscriptionPackageList.forEachIndexed { index, subscriptionPackageList ->
 //                            if (selectedPosition == index) {
@@ -136,9 +144,8 @@ fun SubscriptionPackageItem(item: SubscriptionPackageList, position: Int, activi
 //                            Log.d("test_plan", "Update ${subscriptionPackageList.packageDuration} ${subscriptionPackageList.isSelected.value}" )
 
                         }
-                    }
-
 
+                    }
                 }
             },
     )

+ 10 - 0
app/src/main/java/com/vpn/fastestvpnservice/helpers/BasePreferenceHelper.kt

@@ -38,6 +38,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         removePreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH)
         removePreference(context, KEY_FILENAME, KEY_ISLOGGEDIN)
         removePreference(context, KEY_FILENAME, THEME)
+        removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
     }
 
     fun saveUser(user: UserResponse) {
@@ -416,6 +417,14 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         putBooleanPreference(context, KEY_FILENAME, KEY_ISLOGGEDIN, state)
     }
 
+    fun getConnectState(): Boolean {
+        return getBooleanPreference(context, KEY_FILENAME, KEY_ISCONNECT)
+    }
+
+    fun setConnectState(state: Boolean) {
+        putBooleanPreference(context, KEY_FILENAME, KEY_ISCONNECT, state)
+    }
+
     fun getFcmToken(): String {
         return getStringPreference(context, KEY_FILENAME, KEY_FCM)
     }
@@ -459,5 +468,6 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         private const val KEY_ADBLOCK_SWITCH = "keydata_adblock"
         private const val KEY_ISLOGGEDIN = "key_isloggedin"
         private const val THEME = "key_theme"
+        private const val KEY_ISCONNECT = "keydata_isconnect"
     }
 }

+ 3 - 3
app/src/main/java/com/vpn/fastestvpnservice/navigation/BottomBarNavGraph.kt

@@ -33,12 +33,12 @@ fun BottomBarNavGraph(navHostController: NavHostController,
         startDestination = BottomBarScreen.Home.route) {
 
         composable(route = BottomBarScreen.Home.route) {
-            Home(navHostController = navHostController)
+            Home(navHostController = navHostController, activity)
         }
         composable(route = BottomBarScreen.Settings.route) {
             Settings(navHostController = navHostController)
         }
-        composable(route = BottomBarScreen.Help.route) {
+        composable(route = BottomBarScreen.Help.route) { entry ->
             Help(navHostController = navHostController)
         }
         composable(route = BottomBarScreen.Account.route) {
@@ -52,7 +52,7 @@ fun BottomBarNavGraph(navHostController: NavHostController,
             PrivacyPolicy(navHostController = navHostController)
         }
         composable(route = Screen.TermsAndConditions.route) {
-            TermsAndConditions(navHostController = navHostController)
+            TermsAndConditions(navHostController = navHostController, false)
         }
         composable(route = Screen.About.route) {
             About(navHostController = navHostController)

+ 4 - 0
app/src/main/java/com/vpn/fastestvpnservice/navigation/NavGraph.kt

@@ -13,6 +13,7 @@ import com.vpn.fastestvpnservice.screens.SignUp
 import com.vpn.fastestvpnservice.screens.Splash
 import com.vpn.fastestvpnservice.screens.Started
 import com.vpn.fastestvpnservice.screens.helpScreensAll.FAQ
+import com.vpn.fastestvpnservice.screens.helpScreensAll.TermsAndConditions
 import com.vpn.fastestvpnservice.sealedClass.Screen
 
 @Composable
@@ -38,5 +39,8 @@ fun SetUpNavGraph(navHostController: NavHostController, activity: ComponentActiv
         composable(route = Screen.BottomBarMainScreen.route) {
             BottomBarMainScreen(navController = navHostController, activity)
         }
+        composable(route = Screen.TermsAndConditions.route) {
+            TermsAndConditions(navHostController = navHostController, true)
+        }
     }
 }

+ 4 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/LoginScreen.kt

@@ -527,7 +527,10 @@ fun BoxScope.SignInButton(
 
                     prefHelper.savePassword(password)
                     prefHelper.saveUser(it)
-                    it.wireguard?.let { it1 -> prefHelper.saveWireGuard(it1) }
+                    it.wireguard?.let { wg ->
+                        prefHelper.saveWireGuard(wg)
+                        Log.d("test_wg_data", "Login:: ${wg.ip} ${wg.key}")
+                    }
                     it.product?.let { it1 -> prefHelper.saveProduct(it1) }
                     prefHelper.saveEnabledProtocols(it.enabled_protocols)
                     prefHelper.saveAvailableProtocols(it.available_protocols)

+ 15 - 12
app/src/main/java/com/vpn/fastestvpnservice/screens/ServerListScreen.kt

@@ -117,7 +117,7 @@ fun ServerList(
                 .padding(horizontal = 16.dp)
                 .padding(top = 100.dp)
         ) {
-            ShowSearchBar(serverListViewModel, basePreferenceHelper)
+            ShowSearchBar(serverListViewModel, basePreferenceHelper, navHostController)
 
             val serverTabItems = listOf("Recommended", "All Locations")
             val pagerState = rememberPagerState(pageCount = {serverTabItems.size})
@@ -206,10 +206,10 @@ fun ServerList(
                                 .padding(top = 0.dp, bottom = 10.dp)
                         ) {
                             if (page == 0) {
-                                ShowRecommendedList(serverListViewModel, basePreferenceHelper)
+                                ShowRecommendedList(serverListViewModel, basePreferenceHelper, navHostController)
                             }
                             else if (page == 1) {
-                                ShowAllLocationsList(serverListViewModel, basePreferenceHelper)
+                                ShowAllLocationsList(serverListViewModel, basePreferenceHelper, navHostController)
                             }
                         }
                     }
@@ -265,7 +265,8 @@ fun BoxScope.HeaderRowSL(
 @Composable
 fun ColumnScope.ShowRecommendedList(
     serverListViewModel: ServerListViewModel,
-    prefHelper: BasePreferenceHelper
+    prefHelper: BasePreferenceHelper,
+    navHostController: NavHostController
 ) {
     CompositionLocalProvider(
         LocalOverscrollConfiguration provides null
@@ -385,7 +386,7 @@ fun ColumnScope.ShowRecommendedList(
 
             favList?.let {
                 items(items = favList) { server ->
-                    ServerItem(server)
+                    ServerItem(server, navHostController)
                 }
             }
 
@@ -428,7 +429,7 @@ fun ColumnScope.ShowRecommendedList(
 //            }
 
             items(items = smartLocationList) { server ->
-                ServerItem(server)
+                ServerItem(server, navHostController)
             }
 
             /* Recent List */
@@ -473,7 +474,7 @@ fun ColumnScope.ShowRecommendedList(
                 recentLocation.add(it)
             }
             items(items = recentLocation) { server ->
-                ServerItem(server)
+                ServerItem(server, navHostController)
             }
 
             /* Recommended List */
@@ -515,7 +516,7 @@ fun ColumnScope.ShowRecommendedList(
 //            }
 
             items(items = recommendedList) { server ->
-                ServerItem(server)
+                ServerItem(server, navHostController)
             }
         }
     }
@@ -526,7 +527,8 @@ fun ColumnScope.ShowRecommendedList(
 @Composable
 fun ColumnScope.ShowAllLocationsList(
     serverListViewModel: ServerListViewModel,
-    basePreferenceHelper: BasePreferenceHelper
+    basePreferenceHelper: BasePreferenceHelper,
+    navHostController: NavHostController
 ) {
     val serverData = basePreferenceHelper.getServerData()
 //    val filterData = serverData.get(0).servers?.let {
@@ -715,7 +717,7 @@ fun ColumnScope.ShowAllLocationsList(
                                 calculatePing(country) {
                                     country.ping = it
                                 }
-                                CountryItem(server = country, data[serverTabPager].name!!)
+                                CountryItem(server = country, data[serverTabPager].name!!, navHostController )
                             }
                         }
 
@@ -808,7 +810,8 @@ fun ColumnScope.ShowHeaderItem(
 @Composable
 fun ColumnScope.ShowSearchBar(
     serverListViewModel: ServerListViewModel,
-    basePreferenceHelper: BasePreferenceHelper) {
+    basePreferenceHelper: BasePreferenceHelper,
+    navHostController: NavHostController) {
 
     val context = LocalContext.current
     val splashViewModel: SplashViewModel = viewModel{
@@ -903,7 +906,7 @@ fun ColumnScope.ShowSearchBar(
             ) {
                 val searchServersList = searchListViewModel.countriesList.value
                 items(items = searchServersList!!) { server ->
-                    ServerSearchItem(server)
+                    ServerSearchItem(server, navHostController = navHostController)
                 }
             }
         }

+ 3 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/SignUpScreen.kt

@@ -407,7 +407,9 @@ fun SignUp(navHostController: NavHostController) {
                 ClickableText(
                     onClick = {
                         if (!isSignUpEnabled) {
-
+                            navHostController.navigate(
+                                Screen.TermsAndConditions.route
+                            )
                         }
                     },
                     modifier = Modifier

+ 1 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/FavoriteServersScreen.kt

@@ -94,7 +94,7 @@ fun FavoriteServers(navHostController: NavHostController) {
 
                     favoriteServers?.let {
                         items(items = favoriteServers) {server ->
-                            FavoriteServerItem(server = server)
+                            FavoriteServerItem(server = server, navHostController)
                         }
                     }
 

+ 29 - 14
app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/SubscriptionScreen.kt

@@ -83,12 +83,15 @@ import com.vpn.fastestvpnservice.beans.subscriptionPackageList
 import com.vpn.fastestvpnservice.customItems.SubscriptionDataItem
 import com.vpn.fastestvpnservice.customItems.SubscriptionPackageItem
 import com.vpn.fastestvpnservice.customItems.getSelectedPosition
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.OnLifecycleEvent
 import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
 import com.vpn.fastestvpnservice.utils.Utils
 import com.vpn.fastestvpnservice.viewmodels.BillingViewModel
 import com.vpn.fastestvpnservice.viewmodels.SubscriptionViewModel
+import kotlin.random.Random
+import kotlin.random.nextInt
 
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -96,20 +99,23 @@ import com.vpn.fastestvpnservice.viewmodels.SubscriptionViewModel
 fun SubscriptionScreen(navHostController: NavHostController, activity: ComponentActivity)
 {
 
-
     val context = LocalContext.current
     val subscriptionViewModel: SubscriptionViewModel = viewModel{
         SubscriptionViewModel(context = context, activity)
     }
     var selectedPosition: Int = 0
     var skuDetailsList: List<SkuDetails>? = null
+    val basePreferenceHelper = BasePreferenceHelper(context)
 
-
+    val num1 = subscriptionViewModel.mutableLiveDataNumber.observeAsState().value
+    Log.d("test_num_viewmodel", "num1 = $num1")
     Box(
         modifier = Modifier
             .fillMaxSize()
             .background(MaterialTheme.colorScheme.background)
     ) {
+        val num2 = subscriptionViewModel.mutableLiveDataNumber.observeAsState().value
+        Log.d("test_num_viewmodel", "num2 = $num2")
 
         LaunchedEffect(key1 = true) {
             subscriptionViewModel.getProducts()
@@ -145,25 +151,35 @@ fun SubscriptionScreen(navHostController: NavHostController, activity: Component
                 CompositionLocalProvider(
                     LocalOverscrollConfiguration provides null
                 ) {
+                    val num3 = subscriptionViewModel.liveDataNumber.observeAsState().value
+                    Log.d("test_num_viewmodel", "num3 = $num3")
 
-//                    val productsData = subscriptionViewModel.liveDataProducts.observeAsState().value
+                    val productsData = subscriptionViewModel.liveDataProducts.observeAsState().value
 
-                    val productsData = subscriptionViewModel.mutableLiveDataProducts.observeAsState()
+//                    val productsData = basePreferenceHelper.getFeaturesData()
                     LazyColumn() {
 
                         selectedPosition = getSelectedPosition()
 
-                        productsData.value?.let {
+                        productsData?.let {
 
                             it.data?.let {
                                 Log.d("test_api_response_p",
                                     "Products screen = ${it.size}, selectedPosition = $selectedPosition")
 
-                                val features = it.get(selectedPosition).features
-                                features?.let {
-                                    items(items = it) {item ->
-                                        SubscriptionDataItem(item = item)
+                                if (it.size > 0) {
+                                    val features = it.get(selectedPosition).features
+                                    features?.let {
+                                        items(items = it) {item ->
+                                            SubscriptionDataItem(item = item)
+                                        }
+                                    }
+
+                                    item { Spacer(modifier = Modifier.height(20.dp)) }
+                                    itemsIndexed(items = subscriptionPackageList) {position, plan ->
+                                        SubscriptionPackageItem(item = plan, position, activity)
                                     }
+                                    item { Spacer(modifier = Modifier.height(20.dp)) }
                                 }
                             }
 
@@ -172,11 +188,7 @@ fun SubscriptionScreen(navHostController: NavHostController, activity: Component
                         }
 
 
-                        item { Spacer(modifier = Modifier.height(20.dp)) }
-                        itemsIndexed(items = subscriptionPackageList) {position, plan ->
-                            SubscriptionPackageItem(item = plan, position, activity)
-                        }
-                        item { Spacer(modifier = Modifier.height(20.dp)) }
+
                     }
                 }
             }
@@ -190,6 +202,9 @@ fun SubscriptionScreen(navHostController: NavHostController, activity: Component
                 Log.d("test_button", "onClick")
                 selectedPosition = getSelectedPosition()
 //                Log.d("SubscriptionViewModel", "liveData ${skuDetailsListsSubs.value}")
+                val random = Random.nextInt(999)
+//                subscriptionViewModel.setNumber(1)
+                subscriptionViewModel.mutableLiveDataNumber.value = random
 
                 subscriptionViewModel.startConnection(selectedPosition)
 

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

@@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.text.ClickableText
 import androidx.compose.foundation.verticalScroll
@@ -72,31 +73,38 @@ import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.draw.clip
 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.core.app.ComponentActivity
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
+import com.vpn.fastestvpnservice.application.App
 import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
+import com.vpn.fastestvpnservice.utils.Utils
+import com.vpn.fastestvpnservice.utils.WireGuardConnection
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
+import com.wireguard.android.backend.GoBackend
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
-fun Home(navHostController: NavHostController) {
+fun Home(navHostController: NavHostController, activity: ComponentActivity) {
 
     val context = LocalContext.current
-    var isConnect by remember { mutableStateOf(false) }
+    val basePreferenceHelper = BasePreferenceHelper(context)
+    var isConnect by remember { mutableStateOf(basePreferenceHelper.getConnectState()) }
     val prefHelper = BasePreferenceHelper(context)
     val homeViewModel: HomeViewModel = viewModel{
         HomeViewModel(context)
@@ -108,11 +116,21 @@ fun Home(navHostController: NavHostController) {
         SplashViewModel(context)
     }
     var server: Server = Server()
+    val wireGuardConnection = WireGuardConnection(context, activity)
 
     OnLifecycleEvent{owner, event ->
         when(event) {
             Lifecycle.Event.ON_RESUME -> {
                 Log.d("test_home_resume", "ON_RESUME: Home Screen!")
+
+                try {
+                    App.backend?.runningTunnelNames
+                } catch (e: Exception) {
+                    val back = GoBackend(context)
+                    App.setBackend(back)
+                    App.backend = App.getBackend()
+                }
+
                 homeViewModel.getIp()
 
                 var filterServerByConnectionCount = Server()
@@ -206,7 +224,15 @@ fun Home(navHostController: NavHostController) {
 
         IconButton(
             onClick = {
+
+                if (isConnect) {
+                    wireGuardConnection.stopVpn()
+                } else {
+                    wireGuardConnection.startVpn()
+                }
+
                 isConnect = !isConnect
+                basePreferenceHelper.setConnectState(isConnect)
 //                homeViewModel.getIp()
 
 //                server.let {
@@ -247,37 +273,52 @@ fun Home(navHostController: NavHostController) {
                 .padding(top = 40.dp)
                 .height(125.dp),
         ) {
+            val serverObj = basePreferenceHelper.getServerObject()
+            val serverDis = basePreferenceHelper.getIpinfo()
 
+            val ip = if (isConnect) serverObj?.ip else serverDis?.query
             AddText(
-                text = "IP 4122.762.21",
+                text = "$ip",
                 size = 18.sp,
                 color = MaterialTheme.colorScheme.primary
             )
             Row(
             ) {
                 if (isConnect) {
+                    val image = Utils.getDrawable(context, serverObj?.iso)
                     Image(
-                        painter = painterResource(id = R.drawable.spainlogo3x),
-                        contentDescription = "Spain",
+                        painter = painterResource(id = image),
+                        contentDescription = "Country",
                         modifier = Modifier
                             .padding(end = 6.dp)
                             .size(20.dp)
+                            .clip(CircleShape)
+                            .paint(
+                                painter = painterResource(id = image),
+                                contentScale = ContentScale.FillHeight
+                            )
                     )
                     AddText(
-                        text = "Madrid, Spain",
+                        text = "${serverObj?.server_name}, ${serverObj?.country}",
                         size = 16.sp,
                         color = MaterialTheme.colorScheme.primary
                     )
                 } else {
+                    val image = Utils.getDrawable(context, serverDis?.countryCode)
                     Image(
-                        painter = painterResource(id = R.drawable.pklogo3x),
-                        contentDescription = "Pakistan",
+                        painter = painterResource(id = image),
+                        contentDescription = "Server",
                         modifier = Modifier
                             .padding(end = 6.dp)
                             .size(20.dp)
+                            .clip(CircleShape)
+                            .paint(
+                                painter = painterResource(id = image),
+                                contentScale = ContentScale.FillHeight
+                            )
                     )
                     AddText(
-                        text = "Karachi, Pakistan",
+                        text = "${serverDis?.city}, ${serverDis?.country}",
                         size = 16.sp,
                         color = MaterialTheme.colorScheme.primary
                     )
@@ -733,11 +774,11 @@ fun blueBackground(): Painter{
 @Preview(showSystemUi = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
 @Composable
 fun HomePreview() {
-    Home(rememberNavController())
+//    Home(rememberNavController())
 }
 
 @Preview(showSystemUi = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
 @Composable
 fun HomePreviewDark() {
-    Home(rememberNavController())
+//    Home(rememberNavController())
 }

+ 12 - 12
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -473,12 +473,12 @@ fun ColumnScope.AddRowSettingsColumn(
                                     .fillMaxWidth()
                                     .background(Color.Transparent)
                                     .padding(start = 2.dp)
-//                                    .selectable(
-//                                        selected = selectedProtocol == protocol,
-//                                        onClick = {
-//                                            selectedProtocol = protocol
-//                                        },
-//                                    )
+                                    .selectable(
+                                        selected = selectedProtocol == protocol,
+                                        onClick = {
+                                            selectedProtocol = protocol
+                                        },
+                                    )
 //                                    .indication(
 //                                        indication = null,
 //                                        interactionSource = remember {
@@ -814,12 +814,12 @@ fun ColumnScope.AddRowSettingsSmart(
                                 .fillMaxWidth()
                                 .background(Color.Transparent)
                                 .padding(start = 2.dp)
-//                                    .selectable(
-//                                        selected = selectedProtocol == protocol,
-//                                        onClick = {
-//                                            selectedProtocol = protocol
-//                                        },
-//                                    )
+                                    .selectable(
+                                        selected = selectedSmartConnect == smart,
+                                        onClick = {
+                                            selectedSmartConnect = smart
+                                        },
+                                    )
 //                                    .indication(
 //                                        indication = null,
 //                                        interactionSource = remember {

+ 1 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/FAQScreen.kt

@@ -170,6 +170,7 @@ fun BoxScope.ShowExpandList(
 ) {
     IconButton(
         onClick = {
+
             navHostController.popBackStack()
             navHostController.popBackStack()
 //                    navHostController.navigate(BottomBarScreen.Help.route)

+ 17 - 6
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/TermsAndConditionsScreen.kt

@@ -59,7 +59,10 @@ import com.vpn.fastestvpnservice.sealedClass.Screen
 import kotlinx.coroutines.delay
 
 @Composable
-fun TermsAndConditions(navHostController: NavHostController) {
+fun TermsAndConditions(
+    navHostController: NavHostController,
+    isFromSignUpScreen: Boolean
+) {
     val configuration = LocalConfiguration.current
     val screenHeight = configuration.screenHeightDp.dp
     val screenWidth = configuration.screenWidthDp.dp
@@ -74,7 +77,7 @@ fun TermsAndConditions(navHostController: NavHostController) {
     ) {
         var showLoader by remember { mutableStateOf(true) }
 
-        ShowHeaderTnC(navHostController = navHostController)
+        ShowHeaderTnC(navHostController = navHostController, isFromSignUpScreen)
 
         Box(modifier = Modifier
             .padding(top = 60.dp)
@@ -140,11 +143,19 @@ fun TermsAndConditions(navHostController: NavHostController) {
 }
 
 @Composable
-fun BoxScope.ShowHeaderTnC(navHostController: NavHostController) {
+fun BoxScope.ShowHeaderTnC(
+    navHostController: NavHostController,
+    isFromSignUpScreen: Boolean
+) {
     IconButton(
         onClick = {
-            navHostController.popBackStack()
-            navHostController.popBackStack()
+            if (isFromSignUpScreen) {
+                navHostController.popBackStack()
+            } else {
+                navHostController.popBackStack()
+                navHostController.popBackStack()
+            }
+
 //                    navHostController.navigate(BottomBarScreen.Help.route)
         },
         modifier = Modifier
@@ -203,5 +214,5 @@ fun BoxScope.ShowHeaderTnC(navHostController: NavHostController) {
 @Preview
 @Composable
 fun TermsAndConditionsPreview() {
-    TermsAndConditions(rememberNavController())
+    TermsAndConditions(rememberNavController(), true)
 }

+ 1 - 0
app/src/main/java/com/vpn/fastestvpnservice/sealedClass/Screen.kt

@@ -18,4 +18,5 @@ sealed class Screen(val route: String, var isTrue: Boolean = false) {
     data object SplitTunneling : Screen("split_tunneling_screen")
     data object FavoriteServers : Screen("favorite_servers_screen")
     data object Subscription : Screen("subscription_screen")
+
 }

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

@@ -1,12 +1,139 @@
 package com.vpn.fastestvpnservice.utils
 
+import android.content.Context
+import android.content.Intent
+import android.os.AsyncTask
+import android.util.Log
+import androidx.core.app.ComponentActivity
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.vpn.fastestvpnservice.application.App
+import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
+import com.wireguard.android.backend.Backend
+import com.wireguard.android.backend.GoBackend
+import com.wireguard.android.backend.Tunnel
+import com.wireguard.config.Config
+import com.wireguard.config.InetEndpoint
+import com.wireguard.config.InetNetwork
+import com.wireguard.config.Interface
+import com.wireguard.config.Peer
+import wireguard.WgTunnel
+import java.util.SortedSet
+
 class WireGuardConnection {
 
+    var context: Context
+    var activity: ComponentActivity
+    var basePreferenceHelper: BasePreferenceHelper
+
+    var backend: Backend? = null
+    final var peerBuilder = Peer.Builder()
+    final var tunnel: Tunnel = WgTunnel()
+    lateinit var tunnelStatus: Tunnel.State
+
+    constructor(context: Context, activity: ComponentActivity) {
+        this.context = context
+        this.activity = activity
+        this.basePreferenceHelper = BasePreferenceHelper(context)
+        this.backend = GoBackend(context)
+    }
+
     fun startVpn() {
+        Log.d("test_wg", "start vpn")
 
+        if (basePreferenceHelper.getProtocol().title.toLowerCase()
+                .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase())
+        ) {
+            Log.d("test_wg", "WG protocol")
+            vpnWireGuardPermission(true)
+        }
+    }
+
+    fun vpnWireGuardPermission(isUp: Boolean) {
+
+        Log.d("test_wg", "vpnWireGuardPermission = $isUp")
+
+        if (App.backend != null)
+        {
+            App.backend?.runningTunnelNames
+        }
+        else {
+            val back = GoBackend(context)
+            App.setBackend(back)
+            App.backend = App.getBackend()
+        }
+
+        try{
+            Log.d("test_wg", "try = $isUp")
+            val intentPrepare: Intent = GoBackend.VpnService.prepare(context)
+            if (intentPrepare != null) {
+                activity.startActivityForResult(intentPrepare, 552)
+            }
+        }catch (e :Exception){
+            Log.d("test_wg", "catch = $isUp")
+            vpnWireGuard(isUp)
+        }
     }
 
-    fun stopVpn() {
 
+    fun vpnWireGuard(isUp: Boolean) {
+        Log.d("test_wg", "vpnWireGuard = $isUp")
+
+        val interfaceBuilder: Interface.Builder? = Interface.Builder()
+        // WireGuard
+
+
+        AsyncTask.execute {
+            try {
+                if (isUp) {
+                    App.tunnelStatus = Tunnel.State.UP
+                    Log.d("test_wg", "tunnelStatus if = ${App.tunnelStatus}")
+
+                } else {
+                    App.tunnelStatus = Tunnel.State.DOWN
+                    Log.d("test_wg", "tunnelStatus else = ${App.tunnelStatus}")
+                }
+
+                val server = basePreferenceHelper.getServerObject()
+                val wireguard = basePreferenceHelper.getWireGuard()
+                Log.d("test_wg", "server = ${server?.server_name}, dns = ${server?.dns}, wg.ip = ${wireguard?.ip}, wg.key = ${wireguard?.key}")
+
+                Log.d("test_wg", "${App.backend} ${App.getTunnel()} ${App.tunnelStatus} ${App.peerBuilder}")
+                App.backend?.setState(
+                    App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
+                        interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
+                            .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
+                            .parseDnsServers("10.8.8.8")
+                            .build()
+                    ).addPeer(
+                        App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
+                            .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getServerObject()?.dns + ":51820"))
+                            .parsePublicKey(basePreferenceHelper.getServerObject()?.wg_key).build()
+                    ).build()
+                )
+
+//                    try {
+//                        App.backend?.runningTunnelNames
+//                    } catch (e: Exception) {
+//                        val back = GoBackend(context)
+//                        App.setBackend(back)
+//                        App.backend = App.getBackend()
+//                    }
+
+            } catch (e: java.lang.Exception) {
+                e.printStackTrace()
+            }
+        }
+    }
+
+    fun stopVpn() {
+        Log.d("test_wg", "stop vpn")
+        if (basePreferenceHelper.getProtocol().title.toLowerCase()
+                .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase())
+        )
+        {
+            vpnWireGuardPermission(false)
+        }
     }
 }

+ 9 - 1
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/HomeViewModel.kt

@@ -17,16 +17,24 @@ import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
 import retrofit2.Call
 
 class HomeViewModel constructor(context: Context): ViewModel() {
-    var prefHelper: BasePreferenceHelper? = null
+    var prefHelper: BasePreferenceHelper = BasePreferenceHelper(context)
     val mutableLiveDataIpInfo = MutableLiveData<IpInfo?>()
 
     var _mutableLiveDataValidate = MutableLiveData<DataResponse<TokenResponse>>()
     var liveDataValidate : LiveData<DataResponse<TokenResponse>> = _mutableLiveDataValidate
     var mutableLiveDataValidateError = MutableLiveData<String>()
 
+    var _isConnect = MutableLiveData<Boolean>(prefHelper.getConnectState())
+    var isConnect: LiveData<Boolean> = _isConnect
+
     init {
         prefHelper = BasePreferenceHelper(context)
     }
+
+    fun setConnectState(state: Boolean) {
+        _isConnect.value = state
+    }
+
     fun getIp() {
         WebServiceFactory.getInstance().getIp()
             .enqueue(RetrofitNetworkHandling<Any>(object :

+ 4 - 3
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SplashViewModel.kt

@@ -39,9 +39,10 @@ class SplashViewModel constructor(context: Context): ViewModel() {
                             mutableLiveDataServerData.value = data
                             data.data?.let { preferenceHelper.saveServerData(it)
                             }
-                            data.wireguard?.let {
-                                preferenceHelper.saveWireGuard(it)
-                            }
+//                            data.wireguard?.let {wg ->
+//                                preferenceHelper.saveWireGuard(wg)
+//                                Log.d("test_wg_data", "Splash:: ${wg.ip} ${wg.key}")
+//                            }
                             data.product?.let {
 //                            Log.d("test_api_response", it.productName.toString())
                                 preferenceHelper.saveProduct(it)

+ 8 - 2
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SubscriptionViewModel.kt

@@ -32,7 +32,6 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
     var mutableLiveDataProducts = MutableLiveData<DataResponse<ArrayList<ProductFeatures>>>()
     var liveDataProducts: LiveData<DataResponse<ArrayList<ProductFeatures>>> = mutableLiveDataProducts
 
-
     var mutableLiveDataSkuDetails = MutableLiveData<MutableList<SkuDetails>>()
     var liveDataSkuDetails: LiveData<MutableList<SkuDetails>> = mutableLiveDataSkuDetails
 
@@ -44,12 +43,19 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
 
     private var selectedPosition: Int = 0
 
+    var mutableLiveDataNumber = MutableLiveData<Int>(0)
+    var liveDataNumber: LiveData<Int> = mutableLiveDataNumber
+
     init {
         this.context = context
         this.activity = activity
         preferenceHelper = BasePreferenceHelper(context)
     }
 
+    fun setNumber(num: Int) {
+        mutableLiveDataNumber.value = num
+    }
+
     fun setProductsData(products: DataResponse<ArrayList<ProductFeatures>>) {
         mutableLiveDataProducts.value = products
     }
@@ -65,7 +71,7 @@ class SubscriptionViewModel constructor(context: Context, activity: ComponentAct
                         val type = object : TypeToken<DataResponse<ArrayList<ProductFeatures>>>() {}.type
                         val data = gson.fromJson<DataResponse<ArrayList<ProductFeatures>>>(jsonString, type)
 
-                        Log.d("test_api_response p", "Products try = ${data.status} ${data.message}")
+                        Log.d("test_api_response_p", "Products try = ${data.status} ${data.message}")
 
                         data?.data?.let {
                             preferenceHelper.saveFeaturesData(it)

+ 18 - 0
app/src/main/java/wireguard/WgTunnel.java

@@ -0,0 +1,18 @@
+package wireguard;
+
+import com.wireguard.android.backend.Tunnel;
+
+public class WgTunnel implements Tunnel {
+
+    @Override
+    public String getName() {
+        return "";
+    }
+
+    @Override
+    public void onStateChange(State newState) {
+        System.out.println("--wg states : " + newState.toString());
+    }
+
+
+}