diff --git a/.idea/misc.xml b/.idea/misc.xml index 39c65f6..d5d35ec 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/java/io/github/chronosx88/yggdrasil/MainActivity.kt b/app/src/main/java/io/github/chronosx88/yggdrasil/MainActivity.kt index 5651a7f..a7cc411 100644 --- a/app/src/main/java/io/github/chronosx88/yggdrasil/MainActivity.kt +++ b/app/src/main/java/io/github/chronosx88/yggdrasil/MainActivity.kt @@ -33,7 +33,7 @@ class MainActivity : AppCompatActivity() { const val PEERS: String = "PEERS" const val PEER_LIST_CODE = 1000 const val PEER_LIST = "PEERS_LIST" - const val CURRENT_PEERS = "CURRENT_PEER_INFO" + const val CURRENT_PEERS = "CURRENT_PEERS_v1.1" const val START_VPN = "START_VPN" private const val TAG="Yggdrasil" private const val VPN_REQUEST_CODE = 0x0F @@ -124,7 +124,7 @@ class MainActivity : AppCompatActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == VPN_REQUEST_CODE && resultCode== Activity.RESULT_OK){ - if(currentPeers.size==0){ + if(currentPeers.isEmpty()){ showToast("No peers selected!") return } @@ -143,7 +143,7 @@ class MainActivity : AppCompatActivity() { showToast("No peers selected!") } else { this.currentPeers = deserializeStringList2PeerInfoSet(currentPeers) - val adapter = PeerInfoListAdapter(this, ArrayList(this.currentPeers)) + val adapter = PeerInfoListAdapter(this, this.currentPeers.sortedWith(compareBy { it.ping })) val listView = findViewById(R.id.peers) listView.adapter = adapter @@ -152,7 +152,7 @@ class MainActivity : AppCompatActivity() { PreferenceManager.getDefaultSharedPreferences(this.baseContext) preferences.edit().putStringSet(CURRENT_PEERS, HashSet(currentPeers)).apply() if(isStarted){ - //apply peer changes + //TODO implement UpdateConfig methon in native interface and apply peer changes stopVpn() val i = baseContext.packageManager .getLaunchIntentForPackage(baseContext.packageName) @@ -161,7 +161,6 @@ class MainActivity : AppCompatActivity() { i.putExtra(START_VPN, true) finish() startActivity(i) - } } } @@ -207,7 +206,7 @@ class MainActivity : AppCompatActivity() { return true } - fun showToast(text: String){ + private fun showToast(text: String){ val duration = Toast.LENGTH_SHORT val toast = Toast.makeText(applicationContext, text, duration) toast.setGravity(Gravity.CENTER, 0, 0) diff --git a/app/src/main/java/io/github/chronosx88/yggdrasil/PeerListActivity.kt b/app/src/main/java/io/github/chronosx88/yggdrasil/PeerListActivity.kt index c83df0f..ac0774b 100644 --- a/app/src/main/java/io/github/chronosx88/yggdrasil/PeerListActivity.kt +++ b/app/src/main/java/io/github/chronosx88/yggdrasil/PeerListActivity.kt @@ -73,13 +73,19 @@ class PeerListActivity : AppCompatActivity() { GlobalScope.launch { try { + var cp = MainActivity.deserializeStringList2PeerInfoSet( + extras!!.getStringArrayList(MainActivity.PEER_LIST)!! + ) + for(pi in cp){ + var ping = ping(pi.address, pi.port) + pi.ping = ping + } var json = downloadJson(PEER_LIST_URL) var countries = CCPCountry.getLibraryMasterCountriesEnglish() val mapType: Type = object : TypeToken>>() {}.type val peersMap: Map> = Gson().fromJson(json, mapType) for ((country, peers) in peersMap.entries) { - println("$country:") for ((peer, status) in peers) { if (status.up) { for (ccp in countries) { @@ -89,9 +95,12 @@ class PeerListActivity : AppCompatActivity() { var url = URI(peer) try { var address = InetAddress.getByName(url.host) - var ping = ping(address, url.port) var peerInfo = PeerInfo(url.scheme, address, url.port, ccp.nameCode) + if(cp.contains(peerInfo)){ + continue + } + var ping = ping(address, url.port) peerInfo.ping = ping adapter.addItem(peerInfo) if(peerList.adapter.count % 5 == 0) { @@ -107,14 +116,9 @@ class PeerListActivity : AppCompatActivity() { } } } - if (extras != null) { - var cp = MainActivity.deserializeStringList2PeerInfoSet( - extras.getStringArrayList(MainActivity.PEER_LIST)!! - ) - var currentPeers = ArrayList(cp.sortedWith(compareBy { it.ping })) - withContext(Dispatchers.Main) { - adapter.addAll(0, currentPeers) - } + var currentPeers = ArrayList(cp.sortedWith(compareBy { it.ping })) + withContext(Dispatchers.Main) { + adapter.addAll(0, currentPeers) } } catch (e: Throwable){ e.printStackTrace() @@ -134,7 +138,7 @@ class PeerListActivity : AppCompatActivity() { var adapter = findViewById(R.id.peerList).adapter as SelectPeerInfoListAdapter val selectedPeers = adapter.getSelectedPeers() if(selectedPeers.size>0) { - result.putExtra(MainActivity.PEER_LIST, MainActivity.serializePeerInfoSet2StringList(adapter.getSelectedPeers())) + result.putExtra(MainActivity.PEER_LIST, MainActivity.serializePeerInfoSet2StringList(selectedPeers)) setResult(Activity.RESULT_OK, result) finish() } else { diff --git a/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt b/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt index ff75e8b..bc86619 100644 --- a/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt +++ b/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt @@ -150,7 +150,13 @@ class YggdrasilTunService : VpnService() { private fun writePacketsToTun() { if(tunOutputStream != null) { val buffer = yggConduitEndpoint.recv() - tunOutputStream!!.write(buffer) + if(buffer!=null) { + try { + tunOutputStream!!.write(buffer) + }catch(e: IOException){ + e.printStackTrace() + } + } } } @@ -162,11 +168,10 @@ class YggdrasilTunService : VpnService() { tunOutputStream!!.close() tunInterface!!.close() tunInterface = null - //this hack due to https://github.com/yggdrasil-network/yggdrasil-go/issues/714 bug - ygg.startAutoconfigure() ygg.stop() val intent: Intent = Intent() pi.send(this, MainActivity.STATUS_STOP, intent) + stopSelf() } override fun onDestroy() { diff --git a/app/src/main/java/io/github/chronosx88/yggdrasil/models/PeerInfo.kt b/app/src/main/java/io/github/chronosx88/yggdrasil/models/PeerInfo.kt index fbbc853..56285bc 100644 --- a/app/src/main/java/io/github/chronosx88/yggdrasil/models/PeerInfo.kt +++ b/app/src/main/java/io/github/chronosx88/yggdrasil/models/PeerInfo.kt @@ -10,25 +10,27 @@ class PeerInfo { constructor(schema: String, address: InetAddress, port: Int, countryCode: String){ this.schema = schema this.address = address + var a = address.toString(); + if(a.lastIndexOf('/')>0){ + this.hostName = a.split("/")[0] + } else { + this.hostName = a.substring(1) + } this.port = port this.countryCode = countryCode } var schema: String var address: InetAddress + var hostName: String var port = 0 var countryCode: String var ping: Int = Int.MAX_VALUE override fun toString(): String { - var a = address.toString(); - if(a.indexOf("/")>0){ - return this.schema+"://"+a.split("/")[0]+":"+port + if(this.hostName.contains(":")) { + return this.schema + "://[" + this.hostName + "]:" + port } else { - if(a.contains(":")) { - return this.schema + "://[" + a.substring(1) + "]:" + port - } else { - return this.schema + ":/" + a + ":" + port - } + return this.schema + "://" + this.hostName + ":" + port } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a34fe0b..751800d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -46,6 +46,7 @@ + + + + +