VPNConnectionsUtil.kt 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. package com.vpn.fastestvpnservice.utils
  2. import android.app.Activity
  3. import android.content.BroadcastReceiver
  4. import android.content.ComponentName
  5. import android.content.Context
  6. import android.content.Intent
  7. import android.content.IntentFilter
  8. import android.content.ServiceConnection
  9. import android.content.pm.PackageManager
  10. import android.net.ConnectivityManager
  11. import android.net.NetworkCapabilities
  12. import android.os.AsyncTask
  13. import android.os.Build
  14. import android.os.CountDownTimer
  15. import android.os.Handler
  16. import android.os.IBinder
  17. import android.os.RemoteException
  18. import android.util.Log
  19. import android.widget.Toast
  20. import androidx.activity.ComponentActivity
  21. import androidx.compose.runtime.livedata.observeAsState
  22. import androidx.localbroadcastmanager.content.LocalBroadcastManager
  23. import com.google.gson.Gson
  24. import com.google.gson.reflect.TypeToken
  25. import com.vpn.fastestvpnservice.MainActivity
  26. import com.vpn.fastestvpnservice.R
  27. import com.vpn.fastestvpnservice.constants.AppConstant
  28. import de.blinkt.openvpn.core.App
  29. import com.vpn.fastestvpnservice.constants.AppEnum
  30. import com.vpn.fastestvpnservice.constants.splitList
  31. import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
  32. import com.vpn.fastestvpnservice.helpers.UIHelper
  33. import com.vpn.fastestvpnservice.openVpnUtils.EncryptData
  34. import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
  35. import com.vpn.fastestvpnservice.widgets.SimpleAppWidget
  36. import com.wireguard.android.backend.Backend
  37. import com.wireguard.android.backend.GoBackend
  38. import com.wireguard.android.backend.Tunnel
  39. import com.wireguard.config.Config
  40. import com.wireguard.config.InetEndpoint
  41. import com.wireguard.config.InetNetwork
  42. import com.wireguard.config.Interface
  43. import com.wireguard.config.Peer
  44. import de.blinkt.openvpn.LaunchVPN
  45. import de.blinkt.openvpn.VpnProfile
  46. import de.blinkt.openvpn.core.ConfigParser
  47. import de.blinkt.openvpn.core.ConnectionStatus
  48. import de.blinkt.openvpn.core.IOpenVPNServiceInternal
  49. import de.blinkt.openvpn.core.OpenVPNService
  50. import de.blinkt.openvpn.core.ProfileManager
  51. import de.blinkt.openvpn.core.VpnStatus
  52. import org.json.JSONObject
  53. import org.strongswan.android.logic.CharonVpnService
  54. import org.strongswan.android.ui.VpnProfileControlActivity
  55. import wireguard.WgTunnel
  56. import java.io.BufferedReader
  57. import java.io.InputStream
  58. import java.io.InputStreamReader
  59. import java.util.SortedSet
  60. import java.util.TreeSet
  61. class VPNConnectionsUtil: VpnStatus.StateListener {
  62. var context: Context
  63. var activity: ComponentActivity
  64. var basePreferenceHelper: BasePreferenceHelper
  65. var homeViewModel: HomeViewModel
  66. var countDownTimer: CountDownTimer? = null
  67. var isBound: Boolean = false
  68. /* WireGuard */
  69. var backend: Backend? = null
  70. final var peerBuilder = Peer.Builder()
  71. final var tunnel: Tunnel = WgTunnel()
  72. lateinit var tunnelStatus: Tunnel.State
  73. /*TCP, UDP*/
  74. var mService: IOpenVPNServiceInternal? = null
  75. var inputStream: InputStream? = null
  76. var bufferedReader: BufferedReader? = null
  77. var cp: ConfigParser? = null
  78. var vp: VpnProfile? = null
  79. var pm: ProfileManager? = null
  80. var thread: Thread? = null
  81. private lateinit var openVpnStateReceiver: OpenVpnStateReceiver
  82. private val mConnection: ServiceConnection = object : ServiceConnection {
  83. override fun onServiceConnected(className: ComponentName, service: IBinder) {
  84. App.mService = IOpenVPNServiceInternal.Stub.asInterface(service)
  85. Log.d("test_openvpn", "onServiceConnected: ${App.mService} $isBound")
  86. }
  87. override fun onServiceDisconnected(arg0: ComponentName) {
  88. App.mService = null
  89. Log.d("test_openvpn", "onServiceDisconnected: ${App.mService} $isBound")
  90. }
  91. }
  92. /*IKEV2*/
  93. private lateinit var ikevConnectionStatesReceiver: IkevConnectionStatesReceiver
  94. var dnswg: String = ""
  95. constructor(context: Context, activity: ComponentActivity, homeViewModel: HomeViewModel) {
  96. this.context = context
  97. this.activity = activity
  98. this.basePreferenceHelper = BasePreferenceHelper(context)
  99. this.backend = GoBackend(context)
  100. this.homeViewModel = homeViewModel
  101. }
  102. fun startVpn() {
  103. Log.d("test_wg", "start vpn")
  104. Log.d("isConnect_State_vpn", "startVPN util")
  105. countDownTimer()
  106. try {
  107. if (CheckInternetConnection.getInternetConnection(context).isConnectedToInternet) {
  108. if (basePreferenceHelper.getProtocol().title.contentEquals(AppEnum.IKEV2_PROTOCOL.key))
  109. {
  110. basePreferenceHelper.getConnectedServer().let {
  111. Log.d("getConnectedServer", "s = ${it?.server_name}")
  112. }
  113. basePreferenceHelper.getConnectedServer().let { server ->
  114. /*Connect IKEV2*/
  115. val intent = Intent(context, VpnProfileControlActivity::class.java)
  116. App.connection_status = App.CONNECTION_STATE_CONNECTING
  117. homeViewModel.setConnectState(App.CONNECTING)
  118. val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  119. widgetIntent1.action = SimpleAppWidget.ACTION_CONNECTING_VPN
  120. context.sendBroadcast(widgetIntent1)
  121. intent.action = VpnProfileControlActivity.START_PROFILE
  122. intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_ID, server?.id)
  123. intent.putExtra(AppConstant.SERVER, Gson().toJson(server))
  124. intent.putExtra("username", basePreferenceHelper.getUser()?.userinfo?.email)
  125. intent.putExtra(
  126. "password", basePreferenceHelper.getPassword()
  127. )
  128. context.startActivity(intent)
  129. }
  130. }
  131. else if (basePreferenceHelper.getProtocol().title.toLowerCase()
  132. .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase())
  133. ) {
  134. /*Connect Wire-Guard*/
  135. MainActivity.isWGDown = true
  136. vpnWireGuardPermission(true)
  137. } else {
  138. /*Connect UDP / TCP*/
  139. startTcpUDP()
  140. }
  141. }
  142. } catch (e: Exception) {
  143. e.printStackTrace()
  144. }
  145. }
  146. fun startTcpUDP() {
  147. Log.d("Auto test connect", "ACTION_VPN_SERVER_NOT_RESPONDING startTcpUDP")
  148. Log.d("ServerNotResponding", "startTcpUDP -> ${isBound}")
  149. /*Connect UDP,TCP*/
  150. App.connection_status = App.CONNECTION_STATE_CONNECTING
  151. homeViewModel.setConnectState(App.CONNECTING)
  152. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  153. widgetIntent.action = SimpleAppWidget.ACTION_CONNECTING_VPN
  154. context.sendBroadcast(widgetIntent)
  155. Log.d("ServerNotResponding", "startTcpUDP -> CONNECTING")
  156. // val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  157. // widgetIntent.action = SimpleAppWidget.ACTION_CONNECTING_VPN
  158. // context.sendBroadcast(widgetIntent)
  159. App.isShowNotify = true
  160. countDownTimer?.start()
  161. try {
  162. inputStream = null
  163. bufferedReader = null
  164. inputStream = getJsonFileDetails()
  165. assert(inputStream != null)
  166. bufferedReader =
  167. BufferedReader(InputStreamReader(inputStream /*, Charset.forName("UTF-8")*/))
  168. cp = ConfigParser(context)
  169. cp!!.parseConfig(bufferedReader)
  170. vp = cp!!.convertProfile()
  171. ///////////////// openvpn split tunneling start /////////////////
  172. val type = object : TypeToken<SortedSet<String?>?>() {}.type
  173. val selectedApps = Gson().fromJson<SortedSet<String>>(
  174. basePreferenceHelper.getSplitTunneledApps(), type
  175. )
  176. val selectedAppsNoVpn = Gson().fromJson<SortedSet<String>>(
  177. basePreferenceHelper.getSplitTunneledAppsNotAllow(), type
  178. )
  179. if (StaticMethods.isTV(activity)) // TV
  180. {
  181. val listEnable = basePreferenceHelper.getEnableTvAppsSplit()
  182. if (listEnable?.size == 0) {
  183. Log.d("TCP/UDP Split Tunneling", "All apps")
  184. }
  185. else
  186. {
  187. val appPackageName: SortedSet<String> = TreeSet()
  188. if (listEnable != null){
  189. for (i in listEnable.indices) {
  190. appPackageName.add(listEnable[i].appPackageName)
  191. }
  192. }
  193. if (appPackageName.size > 0)
  194. {
  195. for (app in appPackageName)
  196. {
  197. try {
  198. vp?.mAllowedAppsVpn?.add(app)
  199. Log.d("packages Vpn", app)
  200. } catch (e: PackageManager.NameNotFoundException) {
  201. e.printStackTrace()
  202. }
  203. }
  204. }
  205. }
  206. }
  207. else{ // Android
  208. basePreferenceHelper.getSplitPosition().let {
  209. when (it) {
  210. splitList[0] -> {}
  211. splitList[1] -> {
  212. if (selectedApps != null && selectedApps.size > 0) {
  213. for (app in selectedApps) {
  214. try {
  215. vp?.mAllowedAppsVpn?.add(app)
  216. Log.d("packages Vpn", app)
  217. } catch (e: PackageManager.NameNotFoundException) {
  218. e.printStackTrace()
  219. }
  220. }
  221. }
  222. }
  223. splitList[2] -> {
  224. if (selectedAppsNoVpn != null && selectedAppsNoVpn.size > 0) {
  225. for (app in selectedAppsNoVpn) {
  226. try {
  227. vp?.mAllowedAppsVpn?.add(app)
  228. Log.d("packages NoVpn", app)
  229. } catch (e: PackageManager.NameNotFoundException) {
  230. e.printStackTrace()
  231. }
  232. }
  233. }
  234. }
  235. }
  236. }
  237. }
  238. ///////////////// openvpn split tunneling end /////////////////
  239. vp?.mAllowedAppsVpnAreDisallowed = false
  240. val En = EncryptData()
  241. val AppDetailsValues = En.decrypt(basePreferenceHelper.getAppDetails())
  242. val json_response = JSONObject(AppDetailsValues)
  243. val jsonArray = json_response.getJSONArray("blocked")
  244. for (i in 0 until jsonArray.length()) {
  245. val json_object = jsonArray.getJSONObject(i)
  246. vp?.mAllowedAppsVpn?.add(json_object.getString("app"))
  247. Log.e("packages end", json_object.getString("app"))
  248. }
  249. vp?.mName = Build.MODEL
  250. vp?.mUsername = basePreferenceHelper.getUser()?.userinfo?.email
  251. vp?.mPassword = basePreferenceHelper.getPassword()
  252. pm = ProfileManager.getInstance(context)
  253. pm?.addProfile(vp)
  254. pm?.saveProfileList(context)
  255. pm?.saveProfile(context, vp)
  256. vp = pm?.getProfileByName(Build.MODEL)
  257. val intent = Intent(context, LaunchVPN::class.java)
  258. intent.putExtra(LaunchVPN.EXTRA_KEY, vp?.uuid.toString())
  259. intent.action = Intent.ACTION_MAIN
  260. context.startActivity(intent)
  261. }
  262. catch (e: Exception) {
  263. e.printStackTrace()
  264. Log.d("test_openvpn", "catch = ${e.printStackTrace()}")
  265. }
  266. }
  267. fun vpnWireGuardPermission(isUp: Boolean) {
  268. Log.d("test_wg", "vpnWireGuardPermission = $isUp")
  269. if (App.backend != null)
  270. {
  271. App.backend?.runningTunnelNames
  272. }
  273. else {
  274. val back = GoBackend(context)
  275. App.setBackend(back)
  276. App.backend = App.getBackend()
  277. }
  278. try{
  279. Log.d("test_wg", "try = $isUp")
  280. val intentPrepare: Intent = GoBackend.VpnService.prepare(context)
  281. if (intentPrepare != null) {
  282. activity.startActivityForResult(intentPrepare, 552)
  283. }
  284. }catch (e :Exception){
  285. Log.d("test_wg", "catch = $isUp")
  286. vpnWireGuard(isUp)
  287. }
  288. }
  289. fun vpnWireGuard(isUp: Boolean) {
  290. Log.d("test_wg", "vpnWireGuard = $isUp")
  291. dnswg = if (basePreferenceHelper.getAdBlockState()) {
  292. "10.8.8.8"
  293. } else {
  294. "10.9.9.9"
  295. }
  296. Log.d("test_wg", "dnswg = $dnswg")
  297. val interfaceBuilder: Interface.Builder? = Interface.Builder()
  298. // WireGuard
  299. AsyncTask.execute {
  300. try {
  301. val type = object : TypeToken<SortedSet<String?>?>() {}.type
  302. val selectedApps = Gson().fromJson<SortedSet<String>>(
  303. basePreferenceHelper.getSplitTunneledApps(), type
  304. )
  305. val selectedAppsNoVpn = Gson().fromJson<SortedSet<String>>(
  306. basePreferenceHelper.getSplitTunneledAppsNotAllow(), type
  307. )
  308. if (isUp) {
  309. App.tunnelStatus = Tunnel.State.UP
  310. homeViewModel.setConnectState(App.CONNECTED)
  311. Log.d("test_wg", "tunnelStatus if = ${App.tunnelStatus}")
  312. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  313. widgetIntent.action = SimpleAppWidget.ACTION_CONNECT_VPN
  314. context.sendBroadcast(widgetIntent)
  315. } else {
  316. App.tunnelStatus = Tunnel.State.DOWN
  317. homeViewModel.setConnectState(App.DISCONNECTED)
  318. Log.d("test_wg", "tunnelStatus else = ${App.tunnelStatus}")
  319. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  320. widgetIntent.action = SimpleAppWidget.ACTION_DISCONNECT_VPN
  321. context.sendBroadcast(widgetIntent)
  322. }
  323. val server = basePreferenceHelper.getConnectedServer()
  324. val wireguard = basePreferenceHelper.getWireGuard()
  325. Log.d("test_wg", "server = ${server?.server_name}, dns = ${server?.dns}, wg.ip = ${wireguard?.ip}, wg.key = ${wireguard?.key}")
  326. basePreferenceHelper.getSplitPosition().let {
  327. Log.d("test_wg", "getSplitPosition = $it")
  328. when(it) {
  329. splitList[0] -> {
  330. App.backend?.setState(
  331. App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
  332. interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
  333. .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
  334. .parseDnsServers(dnswg)
  335. .build()
  336. ).addPeer(
  337. App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
  338. .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getConnectedServer()?.dns + ":51820"))
  339. .parsePublicKey(basePreferenceHelper.getConnectedServer()?.wg_key).build()
  340. ).build()
  341. )
  342. }
  343. splitList[1] -> {
  344. App.backend?.setState(
  345. App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
  346. interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
  347. .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
  348. .parseDnsServers(dnswg)
  349. .includeApplications(selectedApps)
  350. .build()
  351. ).addPeer(
  352. App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
  353. .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getConnectedServer()?.dns + ":51820"))
  354. .parsePublicKey(basePreferenceHelper.getConnectedServer()?.wg_key).build()
  355. ).build()
  356. )
  357. }
  358. splitList[2] -> {
  359. App.backend?.setState(
  360. App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
  361. interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
  362. .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
  363. .parseDnsServers(dnswg)
  364. .includeApplications(selectedAppsNoVpn)
  365. .build()
  366. ).addPeer(
  367. App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
  368. .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getConnectedServer()?.dns + ":51820"))
  369. .parsePublicKey(basePreferenceHelper.getConnectedServer()?.wg_key).build()
  370. ).build()
  371. )
  372. }
  373. else -> {}
  374. }
  375. }
  376. Log.d("test_wg", "${App.backend} ${App.getTunnel()} ${App.tunnelStatus} ${App.peerBuilder}")
  377. } catch (e: java.lang.Exception) {
  378. e.printStackTrace()
  379. }
  380. }
  381. }
  382. fun stopVpn() {
  383. Log.d("test_wg", "stop vpn")
  384. Log.d("isConnect_State_vpn", "stopVpn Util")
  385. try {
  386. // Log.d("App.connection stop", App.connection_status.toString())
  387. /*Disconnect IKEV2*/
  388. if (basePreferenceHelper.getProtocol().title.contentEquals(AppEnum.IKEV2_PROTOCOL.key)) {
  389. Log.d("isConnect_State_vpn", "Disconnect IKEV2")
  390. Log.d("ServerNotResponding", "Disconnect IKEV2")
  391. val intent = Intent(context, VpnProfileControlActivity::class.java)
  392. intent.action = VpnProfileControlActivity.DISCONNECT
  393. context.startActivity(intent)
  394. val connectState = homeViewModel.isConnect.value
  395. Log.d("disconnect_ikev2", "connectState = $connectState")
  396. if (connectState == 1) {
  397. homeViewModel.setConnectState(App.DISCONNECTED)
  398. }
  399. }
  400. /*Disconnect Wireguard*/
  401. else if (basePreferenceHelper.getProtocol().title.toLowerCase()
  402. .contentEquals(AppEnum.WG_PROTOCOL.key.toLowerCase()))
  403. {
  404. Log.d("ServerNotResponding", "Disconnect WG")
  405. vpnWireGuardPermission(false)
  406. }
  407. /*Disconnect TCP,UDP*/
  408. else {
  409. Log.d("ServerNotResponding", "Disconnect TCP/UDP")
  410. App.connection_status = App.CONNECTION_STATE_DISCONNECTED
  411. homeViewModel.setConnectState(App.DISCONNECTED)
  412. // val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  413. // widgetIntent1.action = SimpleAppWidget.ACTION_DISCONNECT_VPN
  414. // context.sendBroadcast(widgetIntent1)
  415. App.isShowNotify = false
  416. OpenVPNService.abortConnectionVPN = true
  417. ProfileManager.setConntectedVpnProfileDisconnected(context)
  418. if (App.mService != null) {
  419. Log.d("test_openvpn", "if => ${App.mService}")
  420. try {
  421. Log.d("test_openvpn", "try => ${App.mService}")
  422. App.mService!!.stopVPN(false)
  423. } catch (e: RemoteException) {
  424. e.printStackTrace()
  425. }
  426. try {
  427. pm = ProfileManager.getInstance(context)
  428. vp = pm?.getProfileByName(Build.MODEL)
  429. pm?.removeProfile(context, vp)
  430. } catch (e: Exception) {
  431. e.printStackTrace()
  432. }
  433. }
  434. }
  435. if (basePreferenceHelper.getProtocol().index == 0) {
  436. val state = basePreferenceHelper.isAutoOpenVpnConnected()
  437. Log.d("ServerNotResponding", "Auto StopVpn $state")
  438. if (state) {
  439. stopTcpUdp()
  440. }
  441. }
  442. // val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  443. // widgetIntent.action = SimpleAppWidget.ACTION_STOP_SERVICE
  444. // context.sendBroadcast(widgetIntent)
  445. } catch (e: Exception) {
  446. e.printStackTrace()
  447. }
  448. }
  449. fun stopTcpUdp() {
  450. Log.d("ServerNotResponding", "Auto stopTcpUdp")
  451. App.connection_status = App.CONNECTION_STATE_DISCONNECTED
  452. homeViewModel.setConnectState(App.DISCONNECTED)
  453. basePreferenceHelper.setAutoOpenVpnConnected(false)
  454. App.isShowNotify = false
  455. OpenVPNService.abortConnectionVPN = true
  456. ProfileManager.setConntectedVpnProfileDisconnected(context)
  457. if (App.mService != null) {
  458. Log.d("test_openvpn", "if => ${App.mService}")
  459. try {
  460. Log.d("test_openvpn", "try => ${App.mService}")
  461. App.mService!!.stopVPN(false)
  462. } catch (e: RemoteException) {
  463. e.printStackTrace()
  464. }
  465. try {
  466. pm = ProfileManager.getInstance(context)
  467. vp = pm?.getProfileByName(Build.MODEL)
  468. pm?.removeProfile(context, vp)
  469. } catch (e: Exception) {
  470. e.printStackTrace()
  471. }
  472. }
  473. }
  474. fun countDownTimer() {
  475. countDownTimer = object : CountDownTimer(32000, 1000) {
  476. override fun onTick(millisUntilFinished: Long) {
  477. val connectState = basePreferenceHelper.getConnectState()
  478. if (connectState == App.CONNECTED) {
  479. countDownTimer!!.cancel()
  480. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  481. widgetIntent.action = SimpleAppWidget.ACTION_CONNECT_VPN
  482. context.sendBroadcast(widgetIntent)
  483. }
  484. else if (connectState == App.DISCONNECTED) {
  485. countDownTimer!!.cancel()
  486. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  487. widgetIntent.action = SimpleAppWidget.ACTION_DISCONNECT_VPN
  488. context.sendBroadcast(widgetIntent)
  489. }
  490. }
  491. override fun onFinish() {
  492. val connectState = basePreferenceHelper.getConnectState()
  493. if (connectState == App.CONNECTING) {
  494. UIHelper.showToast(R.string.server_not_responding)
  495. stopVpn()
  496. }
  497. }
  498. }
  499. }
  500. inner class IkevConnectionStatesReceiver : BroadcastReceiver() {
  501. override fun onReceive(context: Context?, intent: Intent?) {
  502. if (intent != null && intent.action != null) {
  503. val action = intent.action
  504. when (action) {
  505. CharonVpnService.ACTION_VPN_CONNECTED -> {
  506. val connectState = homeViewModel.isConnect.value
  507. App.connection_status = App.CONNECTION_STATE_CONNECTED
  508. Log.d("ikev2_rec_conn", "ACTION_VPN_CONNECTED $connectState")
  509. homeViewModel.setConnectState(App.CONNECTED)
  510. Log.d("vpnConnectionCall_ip", "ACTION_VPN_CONNECTED (2) $connectState")
  511. val connectState1 = basePreferenceHelper.getConnectState()
  512. // if (connectState1 == 2) {
  513. // val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  514. // widgetIntent1.action = SimpleAppWidget.ACTION_CONNECT_VPN
  515. // context?.sendBroadcast(widgetIntent1)
  516. // }
  517. }
  518. CharonVpnService.ACTION_VPN_DISCONNECTED -> {
  519. val connectState = homeViewModel.isConnect.value
  520. Log.d("vpnConnectionCall_ip", "ACTION_VPN_DISCONNECTED $connectState")
  521. if (connectState == App.CONNECTING) {
  522. Log.d("vpnConnectionCall_con", "CONNECTING $connectState")
  523. App.connection_status = App.CONNECTION_STATE_CONNECTING
  524. homeViewModel.setConnectState(App.CONNECTING)
  525. val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  526. widgetIntent1.action = SimpleAppWidget.ACTION_CONNECTING_VPN
  527. context?.sendBroadcast(widgetIntent1)
  528. }
  529. // else if (connectState == App.DISCONNECTED) {
  530. // App.connection_status = App.CONNECTION_STATE_DISCONNECTED
  531. // homeViewModel.setConnectState(App.DISCONNECTED)
  532. // }
  533. else if (connectState == App.CONNECTED) {
  534. Log.d("vpnConnectionCall_ip", "connectState == App.CONNECTED $connectState")
  535. App.connection_status = App.CONNECTION_STATE_DISCONNECTED
  536. homeViewModel.setConnectState(App.DISCONNECTED)
  537. val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  538. widgetIntent1.action = SimpleAppWidget.ACTION_DISCONNECT_VPN
  539. context?.sendBroadcast(widgetIntent1)
  540. }
  541. homeViewModel.getIp()
  542. }
  543. CharonVpnService.ACTION_VPN_CONNECTING -> {
  544. val connectState = homeViewModel.isConnect.value
  545. Log.d("vpnConnectionCall_con", "ACTION_VPN_CONNECTING $connectState")
  546. App.connection_status = App.CONNECTION_STATE_CONNECTING
  547. homeViewModel.setConnectState(App.CONNECTING)
  548. val widgetIntent1 = Intent(context, SimpleAppWidget::class.java)
  549. widgetIntent1.action = SimpleAppWidget.ACTION_CONNECTING_VPN
  550. context?.sendBroadcast(widgetIntent1)
  551. }
  552. CharonVpnService.ACTION_VPN_SERVER_NOT_RESPONDING -> {
  553. Log.d("vpnConnectionCall_ip", "ACTION_VPN_SERVER_NOT_RESPONDING")
  554. App.connection_status = App.CONNECTION_STATE_SERVER_NOT_RESPONDING
  555. if (basePreferenceHelper.getProtocol().index == 0) {
  556. Log.d("ServerNotResponding", "Auto -> ${isBound}")
  557. if (MainActivity.isAutoEnabled) {
  558. Log.d("test_auto_p", "Inside()")
  559. stopVpn()
  560. Log.d("test_auto_p", "stopVpn()")
  561. Handler().postDelayed(Runnable {
  562. basePreferenceHelper.setAutoOpenVpnConnected(true)
  563. startTcpUDP()
  564. Log.d("test_auto_p", "startTcpUDP()")
  565. Log.d("test_auto_p", "false")
  566. }, 1000)
  567. MainActivity.isAutoEnabled = false
  568. Log.d("test_auto_p", "Out...()")
  569. }
  570. } else {
  571. Log.d("ServerNotResponding", "IKEv2 -> ${isBound}")
  572. if (MainActivity.isSnrNotify) {
  573. Toast.makeText(
  574. context,
  575. R.string.server_not_responding,
  576. Toast.LENGTH_SHORT
  577. ).show()
  578. MainActivity.isSnrNotify = false
  579. }
  580. homeViewModel.setConnectState(App.DISCONNECTED)
  581. }
  582. // if (context != null) {
  583. // ikev2Callback.ServerNotResponding(context, homeViewModel)
  584. // }
  585. }
  586. }
  587. }
  588. }
  589. }
  590. inner class OpenVpnStateReceiver : BroadcastReceiver() {
  591. override fun onReceive(context: Context?, intent: Intent?) {
  592. if (intent != null && intent.action != null) {
  593. val action = intent.action
  594. when (action) {
  595. OpenVPNService.ACTION_VPN_CONNECTED -> {
  596. Log.d("OpenVpnStateReceiver", "ACTION_VPN_CONNECTED")
  597. homeViewModel.setConnectState(App.CONNECTED)
  598. }
  599. }
  600. }
  601. }
  602. }
  603. fun onStopCallBack() {
  604. Log.d("test_home_resume", "onStopCallBack!")
  605. VpnStatus.removeStateListener(this)
  606. }
  607. fun onResumeCallBack() {
  608. Log.d("test_home_resume", "onResumeCallBack!")
  609. try {
  610. Log.d("test_openvpn", "mConnection = $mConnection")
  611. VpnStatus.addStateListener(this)
  612. val intent = Intent(context, OpenVPNService::class.java)
  613. intent.action = OpenVPNService.START_SERVICE
  614. if (!isBound) {
  615. Log.d("test_openvpn", "mConnection = $mConnection")
  616. Log.d("test_openvpn", "bindServ:: isBound = $isBound")
  617. context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE)
  618. isBound = true
  619. Log.d("test_openvpn", "bindServ2:: isBound = $isBound")
  620. }
  621. } catch (e: Exception) {
  622. e.printStackTrace()
  623. }
  624. // //setting receiver to listen ikev2 protocol connection states
  625. // App.createIKEV2Listener()
  626. /* Currently Commenting ... */
  627. // try {
  628. // LocalBroadcastManager.getInstance(context)
  629. // .unregisterReceiver(WireGuardService.ikevConnectionStatesReceiver)
  630. //
  631. // } catch (e: Exception) {
  632. // e.printStackTrace()
  633. // }
  634. try {
  635. ikevConnectionStatesReceiver = IkevConnectionStatesReceiver()
  636. Log.d("test_home_resume", "ikevConnectionStatesReceiver: $ikevConnectionStatesReceiver")
  637. val filter = IntentFilter()
  638. filter.addAction(CharonVpnService.ACTION_VPN_CONNECTED)
  639. filter.addAction(CharonVpnService.ACTION_VPN_DISCONNECTED)
  640. filter.addAction(CharonVpnService.ACTION_VPN_CONNECTING)
  641. filter.addAction(CharonVpnService.ACTION_VPN_SERVER_NOT_RESPONDING)
  642. LocalBroadcastManager.getInstance(context)
  643. .registerReceiver(ikevConnectionStatesReceiver, filter)
  644. } catch (e: Exception) {
  645. e.printStackTrace()
  646. }
  647. try {
  648. openVpnStateReceiver = OpenVpnStateReceiver()
  649. val filter = IntentFilter()
  650. filter.addAction(OpenVPNService.ACTION_VPN_CONNECTED)
  651. LocalBroadcastManager.getInstance(context)
  652. .registerReceiver(openVpnStateReceiver, filter)
  653. } catch (e: Exception) {
  654. e.printStackTrace()
  655. }
  656. }
  657. fun onPauseCallBack() {
  658. Log.d("test_home_resume", "onPauseCallBack!")
  659. Log.d("test_openvpn", "pause:: mConnection = $mConnection")
  660. Log.d("test_openvpn", "pause:: context = $context")
  661. // TODO uncomment_this_JC
  662. // if (isBound) {
  663. // Log.d("test_openvpn", "pause1:: isBound = $isBound")
  664. // context.unbindService(mConnection)
  665. // } else {
  666. // Log.d("test_openvpn", "pause2:: isBound = $isBound")
  667. // }
  668. // removing receiver to listen ikev2 protocol connection states
  669. // TODO uncomment_this_JC
  670. // try {
  671. // Log.d("test_home_resume", "onPause = ikevConnectionStatesReceiver: $ikevConnectionStatesReceiver")
  672. // LocalBroadcastManager.getInstance(context)
  673. // .unregisterReceiver(ikevConnectionStatesReceiver)
  674. // } catch (e: Exception) {
  675. // e.printStackTrace()
  676. // }
  677. // try {
  678. // LocalBroadcastManager.getInstance(context)
  679. // .unregisterReceiver(openVpnStateReceiver)
  680. // } catch (e: Exception) {
  681. // e.printStackTrace()
  682. // }
  683. }
  684. private fun getJsonFileDetails(): InputStream? {
  685. var conf: InputStream? = null
  686. try {
  687. conf = if (basePreferenceHelper.getProtocol().title.equals(AppEnum.TCP_PROTOCOL.key)) {
  688. context.assets.open("fileDetails/tcp.ovpn")
  689. } else {
  690. context.assets.open("fileDetails/udp.ovpn")
  691. }
  692. Log.d("test_openvpn", "conf = $conf")
  693. return conf
  694. } catch (e: java.lang.Exception) {
  695. e.printStackTrace()
  696. }
  697. return null
  698. }
  699. fun isVPNConnected(): Boolean {
  700. try {
  701. val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  702. val networks = cm.allNetworks
  703. for (network in networks) {
  704. val caps = cm.getNetworkCapabilities(network)
  705. if (caps!!.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) return true
  706. }
  707. return false
  708. } catch (e: Exception) {
  709. e.printStackTrace()
  710. }
  711. return false
  712. }
  713. override fun updateState(
  714. state: String?,
  715. logmessage: String?,
  716. localizedResId: Int,
  717. level: ConnectionStatus?
  718. ) {
  719. if (level == ConnectionStatus.LEVEL_NOTCONNECTED) {
  720. Log.d("vpnConnectionCall ip", "LEVEL_NOTCONNECTED")
  721. homeViewModel.getIp()
  722. }
  723. }
  724. override fun setConnectedVPN(uuid: String?) {}
  725. }