| 
					
				 | 
			
			
				@@ -1,18 +1,35 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.vpn.fastestvpnservice.utils 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.app.Activity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.content.BroadcastReceiver 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.content.ComponentName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.content.Context 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.content.Intent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.content.IntentFilter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.content.ServiceConnection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.content.pm.PackageManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.net.ConnectivityManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.net.NetworkCapabilities 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.os.AsyncTask 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.os.Build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.os.CountDownTimer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.os.IBinder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import android.os.RemoteException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.util.Log 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.activity.ComponentActivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.compose.runtime.livedata.observeAsState 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.localbroadcastmanager.content.LocalBroadcastManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.gson.Gson 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.gson.reflect.TypeToken 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.MainActivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.constants.AppConstant 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import de.blinkt.openvpn.core.App 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.vpn.fastestvpnservice.constants.AppEnum 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.constants.splitList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.helpers.UIHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.vpn.fastestvpnservice.openVpnUtils.EncryptData 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.wireguard.android.backend.Backend 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.wireguard.android.backend.GoBackend 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -22,20 +39,33 @@ import com.wireguard.config.InetEndpoint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.wireguard.config.InetNetwork 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.wireguard.config.Interface 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.wireguard.config.Peer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import de.blinkt.openvpn.LaunchVPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import de.blinkt.openvpn.VpnProfile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import de.blinkt.openvpn.core.ConfigParser 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import de.blinkt.openvpn.core.ConnectionStatus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import de.blinkt.openvpn.core.IOpenVPNServiceInternal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import de.blinkt.openvpn.core.OpenVPNService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import de.blinkt.openvpn.core.ProfileManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import de.blinkt.openvpn.core.VpnStatus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.json.JSONObject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.strongswan.android.logic.CharonVpnService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.strongswan.android.ui.VpnProfileControlActivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import wireguard.WgTunnel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.BufferedReader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.InputStream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.InputStreamReader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.SortedSet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.TreeSet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class VPNConnectionsUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class VPNConnectionsUtil: VpnStatus.StateListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var context: Context 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var activity: ComponentActivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var basePreferenceHelper: BasePreferenceHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var homeViewModel: HomeViewModel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var countDownTimer: CountDownTimer? = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var isBound: Boolean = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* WireGuard */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     var backend: Backend? = null 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -54,16 +84,21 @@ class VPNConnectionsUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private val mConnection: ServiceConnection = object : ServiceConnection { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         override fun onServiceConnected(className: ComponentName, service: IBinder) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            de.blinkt.openvpn.core.App.mService = IOpenVPNServiceInternal.Stub.asInterface(service) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Log.d("test_openvpn", "onServiceConnected: ${de.blinkt.openvpn.core.App.mService}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            App.mService = IOpenVPNServiceInternal.Stub.asInterface(service) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "onServiceConnected: ${App.mService} $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         override fun onServiceDisconnected(arg0: ComponentName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            de.blinkt.openvpn.core.App.mService = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Log.d("test_openvpn", "onServiceDisconnected: ${de.blinkt.openvpn.core.App.mService}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            App.mService = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "onServiceDisconnected: ${App.mService} $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /*IKEV2*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private lateinit var ikevConnectionStatesReceiver: IkevConnectionStatesReceiver 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    var dnswg: String = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     constructor(context: Context, activity: ComponentActivity, homeViewModel: HomeViewModel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.context = context 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.activity = activity 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -74,12 +109,185 @@ class VPNConnectionsUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fun startVpn() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Log.d("test_wg", "start vpn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("isConnect_State_vpn", "startVPN util") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        countDownTimer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CheckInternetConnection.getInternetConnection(context).isConnectedToInternet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (basePreferenceHelper.getProtocol().title.contentEquals(AppEnum.IKEV2_PROTOCOL.key)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    basePreferenceHelper.getServerObject().let { server -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        /*Connect IKEV2*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        val intent = Intent(context, VpnProfileControlActivity::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        App.connection_status = App.CONNECTION_STATE_CONNECTING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        homeViewModel.setConnectState(App.CONNECTING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        val widgetIntent1 = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        widgetIntent1.action = SimpleAppWidget.ACTION_CONNECTING_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        context.sendBroadcast(widgetIntent1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        intent.action = VpnProfileControlActivity.START_PROFILE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_ID, server?.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        intent.putExtra(AppConstant.SERVER, Gson().toJson(server)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        intent.putExtra("username", basePreferenceHelper.getUser()?.userinfo?.email) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        intent.putExtra( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            "password", basePreferenceHelper.getPassword() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        context.startActivity(intent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else if (basePreferenceHelper.getProtocol().title.toLowerCase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    /*Connect Wire-Guard*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    MainActivity.isWGDown = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    vpnWireGuardPermission(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    /*Connect UDP / TCP*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    startTcpUDP() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (basePreferenceHelper.getProtocol().title.toLowerCase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Log.d("test_wg", "WG protocol") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            vpnWireGuardPermission(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun startTcpUDP() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("Auto test connect", "ACTION_VPN_SERVER_NOT_RESPONDING startTcpUDP") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /*Connect UDP,TCP*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        App.connection_status = App.CONNECTION_STATE_CONNECTING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        homeViewModel.setConnectState(App.CONNECTING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        val widgetIntent = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        widgetIntent.action = SimpleAppWidget.ACTION_CONNECTING_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        context.sendBroadcast(widgetIntent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        App.isShowNotify = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        countDownTimer?.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            inputStream = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bufferedReader = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            inputStream = getJsonFileDetails() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            assert(inputStream != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bufferedReader = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BufferedReader(InputStreamReader(inputStream /*, Charset.forName("UTF-8")*/)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            cp = ConfigParser(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            cp!!.parseConfig(bufferedReader) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp = cp!!.convertProfile() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ///////////////// openvpn split tunneling start ///////////////// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val type = object : TypeToken<SortedSet<String?>?>() {}.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val selectedApps = Gson().fromJson<SortedSet<String>>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                basePreferenceHelper.getSplitTunneledApps(), type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val selectedAppsNoVpn = Gson().fromJson<SortedSet<String>>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                basePreferenceHelper.getSplitTunneledAppsNotAllow(), type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (StaticMethods.isTV(activity))                              // TV 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                val listEnable = basePreferenceHelper.getEnableTvAppsSplit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (listEnable?.size == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Log.d("TCP/UDP Split Tunneling", "All apps") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val appPackageName: SortedSet<String> = TreeSet() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (listEnable != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (i in listEnable.indices) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            appPackageName.add(listEnable[i].appPackageName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (appPackageName.size > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (app in appPackageName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                vp?.mAllowedAppsVpn?.add(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                Log.d("packages Vpn", app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } catch (e: PackageManager.NameNotFoundException) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else{                                                           // Android 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                basePreferenceHelper.getSplitPosition().let { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    when (it) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        splitList[0] -> {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        splitList[1] -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (selectedApps != null && selectedApps.size > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                for (app in selectedApps) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        vp?.mAllowedAppsVpn?.add(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        Log.d("packages Vpn", app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } catch (e: PackageManager.NameNotFoundException) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        splitList[2] -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (selectedAppsNoVpn != null && selectedAppsNoVpn.size > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                for (app in selectedAppsNoVpn) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        vp?.mAllowedAppsVpn?.add(app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        Log.d("packages NoVpn", app) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } catch (e: PackageManager.NameNotFoundException) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ///////////////// openvpn split tunneling end ///////////////// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp?.mAllowedAppsVpnAreDisallowed = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val En = EncryptData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val AppDetailsValues = En.decrypt(basePreferenceHelper.getAppDetails()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val json_response = JSONObject(AppDetailsValues) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val jsonArray = json_response.getJSONArray("blocked") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (i in 0 until jsonArray.length()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                val json_object = jsonArray.getJSONObject(i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                vp?.mAllowedAppsVpn?.add(json_object.getString("app")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.e("packages end", json_object.getString("app")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp?.mName = Build.MODEL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp?.mUsername = basePreferenceHelper.getUser()?.userinfo?.email 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp?.mPassword = basePreferenceHelper.getPassword() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pm = ProfileManager.getInstance(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pm?.addProfile(vp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pm?.saveProfileList(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pm?.saveProfile(context, vp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vp = pm?.getProfileByName(Build.MODEL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val intent = Intent(context, LaunchVPN::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            intent.putExtra(LaunchVPN.EXTRA_KEY, vp?.uuid.toString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            intent.action = Intent.ACTION_MAIN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            context.startActivity(intent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "catch = ${e.printStackTrace()}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,14 +371,270 @@ class VPNConnectionsUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fun stopVpn() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Log.d("test_wg", "stop vpn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (basePreferenceHelper.getProtocol().title.toLowerCase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            vpnWireGuardPermission(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("isConnect_State_vpn", "stopVpn Util") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            Log.d("App.connection stop", App.connection_status.toString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            /*Disconnect IKEV2*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (basePreferenceHelper.getProtocol().title.contentEquals(AppEnum.IKEV2_PROTOCOL.key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("App stop ikev2", "1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                val intent = Intent(context, VpnProfileControlActivity::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("App stop ikev2", "2") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                intent.action = VpnProfileControlActivity.DISCONNECT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("App stop ikev2", "3") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                context.startActivity(intent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("App stop ikev2", "4") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            /*Disconnect Wireguard*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else if (basePreferenceHelper.getProtocol().title.toLowerCase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                vpnWireGuardPermission(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                /*Disconnect TCP,UDP*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                App.connection_status = App.CONNECTION_STATE_DISCONNECTED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                homeViewModel.setConnectState(App.DISCONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            val widgetIntent1 = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            widgetIntent1.action = SimpleAppWidget.ACTION_DISCONNECT_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            context.sendBroadcast(widgetIntent1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                App.isShowNotify = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                OpenVPNService.abortConnectionVPN = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ProfileManager.setConntectedVpnProfileDisconnected(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (App.mService != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Log.d("test_openvpn", "if => ${App.mService}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Log.d("test_openvpn", "try => ${App.mService}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        App.mService!!.stopVPN(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (e: RemoteException) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        pm = ProfileManager.getInstance(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        vp = pm?.getProfileByName(Build.MODEL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        pm?.removeProfile(context, vp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            val widgetIntent = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            widgetIntent.action = SimpleAppWidget.ACTION_STOP_SERVICE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            context.sendBroadcast(widgetIntent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun countDownTimer() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        countDownTimer = object : CountDownTimer(32000, 1000) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            override fun onTick(millisUntilFinished: Long) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (App.connection_status == App.CONNECTION_STATE_CONNECTED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    || App.connection_status == App.CONNECTION_STATE_CONNECTED_2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    countDownTimer!!.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    val widgetIntent = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    widgetIntent.action = SimpleAppWidget.ACTION_CONNECT_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    context.sendBroadcast(widgetIntent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else if (App.connection_status == App.CONNECTION_STATE_DISCONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    countDownTimer!!.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    val widgetIntent = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    widgetIntent.action = SimpleAppWidget.ACTION_DISCONNECT_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    context.sendBroadcast(widgetIntent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            override fun onFinish() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (App.connection_status == App.CONNECTION_STATE_CONNECTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    UIHelper.showToast(R.string.server_not_responding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stopVpn() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    inner class IkevConnectionStatesReceiver : BroadcastReceiver() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        override fun onReceive(context: Context?, intent: Intent?) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (intent != null && intent.action != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                val action = intent.action 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                when (action) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CharonVpnService.ACTION_VPN_CONNECTED -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        val connectState = homeViewModel.isConnect.value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Log.d("vpnConnectionCall_ip", "ACTION_VPN_CONNECTED $connectState") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        App.connection_status = App.CONNECTION_STATE_CONNECTED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        homeViewModel.setConnectState(App.CONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        vpnConnectionCallBacks.onVpnConnected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        MainActivity.vpnConnectionCallBacks?.onVpnConnected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        val widgetIntent1 = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        widgetIntent1.action = SimpleAppWidget.ACTION_CONNECT_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        context?.sendBroadcast(widgetIntent1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CharonVpnService.ACTION_VPN_DISCONNECTED -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        val connectState = homeViewModel.isConnect.value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Log.d("vpnConnectionCall_ip", "ACTION_VPN_DISCONNECTED $connectState") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (connectState == App.CONNECTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            App.connection_status = App.CONNECTION_STATE_CONNECTING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            homeViewModel.setConnectState(App.CONNECTING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        else if (connectState == App.DISCONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                            App.connection_status = App.CONNECTION_STATE_DISCONNECTED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                            homeViewModel.setConnectState(App.DISCONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        else if (connectState == App.CONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Log.d("vpnConnectionCall_ip", "connectState == App.CONNECTED $connectState") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            App.connection_status = App.CONNECTION_STATE_DISCONNECTED 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            homeViewModel.setConnectState(App.DISCONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        vpnConnectionCallBacks.onVpnDisconnected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        MainActivity.vpnConnectionCallBacks?.onVpnDisconnected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        val widgetIntent1 = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        widgetIntent1.action = SimpleAppWidget.ACTION_DISCONNECT_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        context?.sendBroadcast(widgetIntent1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        homeViewModel.getIp() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CharonVpnService.ACTION_VPN_CONNECTING -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Log.d("vpnConnectionCall_ip", "ACTION_VPN_CONNECTING") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        App.connection_status = App.CONNECTION_STATE_CONNECTING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        homeViewModel.setConnectState(App.CONNECTING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        vpnConnectionCallBacks.onVpnConnecting() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        MainActivity.vpnConnectionCallBacks?.onVpnConnecting() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        val widgetIntent1 = Intent(context, SimpleAppWidget::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        widgetIntent1.action = SimpleAppWidget.ACTION_CONNECTING_VPN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        context?.sendBroadcast(widgetIntent1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CharonVpnService.ACTION_VPN_SERVER_NOT_RESPONDING -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Log.d("vpnConnectionCall_ip", "ACTION_VPN_SERVER_NOT_RESPONDING") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        App.connection_status = App.CONNECTION_STATE_SERVER_NOT_RESPONDING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        vpnConnectionCallBacks.onServerNotResponding() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                        MainActivity.vpnConnectionCallBacks?.onServerNotResponding() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun onStopCallBack() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("test_home_resume", "onStopCallBack!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VpnStatus.removeStateListener(this) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun onResumeCallBack() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("test_home_resume", "onResumeCallBack!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "mConnection = $mConnection") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VpnStatus.addStateListener(this) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val intent = Intent(context, OpenVPNService::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            intent.action = OpenVPNService.START_SERVICE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!isBound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("test_openvpn", "mConnection = $mConnection") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("test_openvpn", "bindServ:: isBound = $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                isBound = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Log.d("test_openvpn", "bindServ2:: isBound = $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        //setting receiver to listen ikev2 protocol connection states 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        App.createIKEV2Listener() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /* Currently Commenting ... */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            LocalBroadcastManager.getInstance(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                .unregisterReceiver(WireGuardService.ikevConnectionStatesReceiver) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ikevConnectionStatesReceiver = IkevConnectionStatesReceiver() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_home_resume", "ikevConnectionStatesReceiver: $ikevConnectionStatesReceiver") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val filter = IntentFilter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter.addAction(CharonVpnService.ACTION_VPN_CONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter.addAction(CharonVpnService.ACTION_VPN_DISCONNECTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter.addAction(CharonVpnService.ACTION_VPN_CONNECTING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter.addAction(CharonVpnService.ACTION_VPN_SERVER_NOT_RESPONDING) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LocalBroadcastManager.getInstance(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .registerReceiver(ikevConnectionStatesReceiver, filter) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun onPauseCallBack() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("test_home_resume", "onPauseCallBack!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("test_openvpn", "pause:: mConnection = $mConnection") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Log.d("test_openvpn", "pause:: context = $context") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // TODO uncomment_this_JC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (isBound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "pause1:: isBound = $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            context.unbindService(mConnection) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "pause2:: isBound = $isBound") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        removing receiver to listen ikev2 protocol connection states 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Commenting Below Just Now ... !!! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_home_resume", "onPause = ikevConnectionStatesReceiver: $ikevConnectionStatesReceiver") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LocalBroadcastManager.getInstance(context) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .unregisterReceiver(ikevConnectionStatesReceiver) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private fun getJsonFileDetails(): InputStream? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var conf: InputStream? = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            conf = if (basePreferenceHelper.getProtocol().title.equals(AppEnum.TCP_PROTOCOL.key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                context.assets.open("fileDetails/tcp.ovpn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                context.assets.open("fileDetails/udp.ovpn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("test_openvpn", "conf = $conf") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return conf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (e: java.lang.Exception) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fun isVPNConnected(): Boolean { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -187,4 +651,19 @@ class VPNConnectionsUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    override fun updateState( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        state: String?, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logmessage: String?, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        localizedResId: Int, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        level: ConnectionStatus? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (level == ConnectionStatus.LEVEL_NOTCONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Log.d("vpnConnectionCall ip", "LEVEL_NOTCONNECTED") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            homeViewModel.getIp() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    override fun setConnectedVPN(uuid: String?) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |