mirror of
https://github.com/yggdrasil-network/crispa-android.git
synced 2025-01-22 16:06:30 +00:00
1. corrected VPN service status on GUI
This commit is contained in:
parent
bee63041f4
commit
484bc7c3d3
@ -14,7 +14,9 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
|
|||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
||||||
import io.github.chronosx88.yggdrasil.models.config.SelectDNSInfoListAdapter
|
import io.github.chronosx88.yggdrasil.models.config.SelectDNSInfoListAdapter
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2DNSInfoSet
|
||||||
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.ping
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.ping
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.serializeDNSInfoSet2StringList
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import java.net.*
|
import java.net.*
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
@ -54,7 +56,7 @@ class DNSListActivity : AppCompatActivity() {
|
|||||||
dnsList.adapter = adapter
|
dnsList.adapter = adapter
|
||||||
thread(start = true) {
|
thread(start = true) {
|
||||||
try {
|
try {
|
||||||
var cd = MainActivity.deserializeStringList2DNSInfoSet(
|
var cd = deserializeStringList2DNSInfoSet(
|
||||||
extras!!.getStringArrayList(MainActivity.DNS_LIST)!!
|
extras!!.getStringArrayList(MainActivity.DNS_LIST)!!
|
||||||
)
|
)
|
||||||
for (d in cd) {
|
for (d in cd) {
|
||||||
@ -93,7 +95,7 @@ class DNSListActivity : AppCompatActivity() {
|
|||||||
var adapter = findViewById<ListView>(R.id.dnsList).adapter as SelectDNSInfoListAdapter
|
var adapter = findViewById<ListView>(R.id.dnsList).adapter as SelectDNSInfoListAdapter
|
||||||
val selectedDNS = adapter.getSelectedDNS()
|
val selectedDNS = adapter.getSelectedDNS()
|
||||||
if(selectedDNS.isNotEmpty()) {
|
if(selectedDNS.isNotEmpty()) {
|
||||||
result.putExtra(MainActivity.DNS_LIST, MainActivity.serializeDNSInfoSet2StringList(selectedDNS))
|
result.putExtra(MainActivity.DNS_LIST, serializeDNSInfoSet2StringList(selectedDNS))
|
||||||
setResult(Activity.RESULT_OK, result)
|
setResult(Activity.RESULT_OK, result)
|
||||||
finish()
|
finish()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
package io.github.chronosx88.yggdrasil
|
package io.github.chronosx88.yggdrasil
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.BroadcastReceiver
|
import android.app.ActivityManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
|
||||||
import android.net.VpnService
|
import android.net.VpnService
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@ -14,13 +13,17 @@ import android.view.MenuItem
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.*
|
import android.widget.*
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
||||||
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
||||||
import io.github.chronosx88.yggdrasil.models.config.DNSInfoListAdapter
|
import io.github.chronosx88.yggdrasil.models.config.DNSInfoListAdapter
|
||||||
import io.github.chronosx88.yggdrasil.models.config.PeerInfoListAdapter
|
import io.github.chronosx88.yggdrasil.models.config.PeerInfoListAdapter
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2DNSInfoSet
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2PeerInfoSet
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringSet2DNSInfoSet
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringSet2PeerInfoSet
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.serializeDNSInfoSet2StringList
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.serializePeerInfoSet2StringList
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
@ -48,65 +51,6 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
@JvmStatic var isStarted = false
|
@JvmStatic var isStarted = false
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun deserializeStringList2PeerInfoSet(list: List<String>): MutableSet<PeerInfo> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = mutableSetOf<PeerInfo>()
|
|
||||||
for(s in list) {
|
|
||||||
out.add(gson.fromJson(s, PeerInfo::class.java))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun deserializeStringList2DNSInfoSet(list: List<String>): MutableSet<DNSInfo> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = mutableSetOf<DNSInfo>()
|
|
||||||
for(s in list) {
|
|
||||||
out.add(gson.fromJson(s, DNSInfo::class.java))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun deserializeStringSet2PeerInfoSet(list: Set<String>): MutableSet<PeerInfo> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = mutableSetOf<PeerInfo>()
|
|
||||||
for(s in list) {
|
|
||||||
out.add(gson.fromJson(s, PeerInfo::class.java))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun deserializeStringSet2DNSInfoSet(list: Set<String>): MutableSet<DNSInfo> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = mutableSetOf<DNSInfo>()
|
|
||||||
for(s in list) {
|
|
||||||
out.add(gson.fromJson(s, DNSInfo::class.java))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun serializePeerInfoSet2StringList(list: Set<PeerInfo>): ArrayList<String> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = ArrayList<String>()
|
|
||||||
for(p in list) {
|
|
||||||
out.add(gson.toJson(p))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun serializeDNSInfoSet2StringList(list: Set<DNSInfo>): ArrayList<String> {
|
|
||||||
var gson = Gson()
|
|
||||||
var out = ArrayList<String>()
|
|
||||||
for(p in list) {
|
|
||||||
out.add(gson.toJson(p))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var currentPeers = setOf<PeerInfo>()
|
private var currentPeers = setOf<PeerInfo>()
|
||||||
@ -114,9 +58,8 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
LocalBroadcastManager.getInstance(this).registerReceiver(ServiceEchoReceiver(), IntentFilter("pong"));
|
|
||||||
LocalBroadcastManager.getInstance(this).sendBroadcastSync(Intent("ping"));
|
|
||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
|
isStarted = isYggServiceRunning(this)
|
||||||
val listView = findViewById<ListView>(R.id.peers)
|
val listView = findViewById<ListView>(R.id.peers)
|
||||||
//save to shared preferences
|
//save to shared preferences
|
||||||
val preferences =
|
val preferences =
|
||||||
@ -294,10 +237,15 @@ class MainActivity : AppCompatActivity() {
|
|||||||
toast.show()
|
toast.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ServiceEchoReceiver : BroadcastReceiver() {
|
//TODO reimplement it
|
||||||
override fun onReceive(context: Context?, intent: Intent?) {
|
private fun isYggServiceRunning(context: Context): Boolean {
|
||||||
isStarted = true
|
val manager =
|
||||||
|
context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
||||||
|
for (service in manager.getRunningServices(Int.MAX_VALUE)) {
|
||||||
|
if (YggdrasilTunService::class.java.getName() == service.service.className) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,9 @@ import com.hbb20.CCPCountry
|
|||||||
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
||||||
import io.github.chronosx88.yggdrasil.models.Status
|
import io.github.chronosx88.yggdrasil.models.Status
|
||||||
import io.github.chronosx88.yggdrasil.models.config.SelectPeerInfoListAdapter
|
import io.github.chronosx88.yggdrasil.models.config.SelectPeerInfoListAdapter
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2PeerInfoSet
|
||||||
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.ping
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.ping
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.serializePeerInfoSet2StringList
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@ -60,7 +62,7 @@ class PeerListActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
GlobalScope.launch {
|
GlobalScope.launch {
|
||||||
try {
|
try {
|
||||||
var cp = MainActivity.deserializeStringList2PeerInfoSet(
|
var cp = deserializeStringList2PeerInfoSet(
|
||||||
extras!!.getStringArrayList(MainActivity.PEER_LIST)!!
|
extras!!.getStringArrayList(MainActivity.PEER_LIST)!!
|
||||||
)
|
)
|
||||||
for(pi in cp){
|
for(pi in cp){
|
||||||
@ -125,7 +127,7 @@ class PeerListActivity : AppCompatActivity() {
|
|||||||
var adapter = findViewById<ListView>(R.id.peerList).adapter as SelectPeerInfoListAdapter
|
var adapter = findViewById<ListView>(R.id.peerList).adapter as SelectPeerInfoListAdapter
|
||||||
val selectedPeers = adapter.getSelectedPeers()
|
val selectedPeers = adapter.getSelectedPeers()
|
||||||
if(selectedPeers.size>0) {
|
if(selectedPeers.size>0) {
|
||||||
result.putExtra(MainActivity.PEER_LIST, MainActivity.serializePeerInfoSet2StringList(selectedPeers))
|
result.putExtra(MainActivity.PEER_LIST, serializePeerInfoSet2StringList(selectedPeers))
|
||||||
setResult(Activity.RESULT_OK, result)
|
setResult(Activity.RESULT_OK, result)
|
||||||
finish()
|
finish()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package io.github.chronosx88.yggdrasil
|
package io.github.chronosx88.yggdrasil
|
||||||
|
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.BroadcastReceiver
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
|
||||||
import android.net.VpnService
|
import android.net.VpnService
|
||||||
import android.os.ParcelFileDescriptor
|
import android.os.ParcelFileDescriptor
|
||||||
import android.system.OsConstants
|
import android.system.OsConstants
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import dummy.ConduitEndpoint
|
import dummy.ConduitEndpoint
|
||||||
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
||||||
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2DNSInfoSet
|
||||||
|
import io.github.chronosx88.yggdrasil.models.config.Utils.Companion.deserializeStringList2PeerInfoSet
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import mobile.Mobile
|
import mobile.Mobile
|
||||||
import mobile.Yggdrasil
|
import mobile.Yggdrasil
|
||||||
@ -46,13 +44,6 @@ class YggdrasilTunService : VpnService() {
|
|||||||
private var tunOutputStream: OutputStream? = null
|
private var tunOutputStream: OutputStream? = null
|
||||||
private var scope: CoroutineScope? = null
|
private var scope: CoroutineScope? = null
|
||||||
|
|
||||||
override fun onCreate() {
|
|
||||||
super.onCreate()
|
|
||||||
LocalBroadcastManager
|
|
||||||
.getInstance(this)
|
|
||||||
.registerReceiver(ServiceEchoReceiver(), IntentFilter("ping"))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
|
|
||||||
if (intent?.getStringExtra(MainActivity.COMMAND) == MainActivity.STOP) {
|
if (intent?.getStringExtra(MainActivity.COMMAND) == MainActivity.STOP) {
|
||||||
@ -60,8 +51,8 @@ class YggdrasilTunService : VpnService() {
|
|||||||
stopVpn(pi)
|
stopVpn(pi)
|
||||||
}
|
}
|
||||||
if (intent?.getStringExtra(MainActivity.COMMAND) == MainActivity.START) {
|
if (intent?.getStringExtra(MainActivity.COMMAND) == MainActivity.START) {
|
||||||
val peers = MainActivity.deserializeStringList2PeerInfoSet(intent.getStringArrayListExtra(MainActivity.PEERS))
|
val peers = deserializeStringList2PeerInfoSet(intent.getStringArrayListExtra(MainActivity.PEERS))
|
||||||
val dns = MainActivity.deserializeStringList2DNSInfoSet(intent.getStringArrayListExtra(MainActivity.DNS))
|
val dns = deserializeStringList2DNSInfoSet(intent.getStringArrayListExtra(MainActivity.DNS))
|
||||||
val pi: PendingIntent = intent.getParcelableExtra(MainActivity.PARAM_PINTENT)
|
val pi: PendingIntent = intent.getParcelableExtra(MainActivity.PARAM_PINTENT)
|
||||||
ygg = Yggdrasil()
|
ygg = Yggdrasil()
|
||||||
setupTunInterface(pi, peers, dns)
|
setupTunInterface(pi, peers, dns)
|
||||||
@ -194,12 +185,4 @@ class YggdrasilTunService : VpnService() {
|
|||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
stopSelf()
|
stopSelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ServiceEchoReceiver : BroadcastReceiver() {
|
|
||||||
override fun onReceive(context: Context?, intent: Intent?) {
|
|
||||||
LocalBroadcastManager
|
|
||||||
.getInstance(context!!)
|
|
||||||
.sendBroadcastSync(Intent("pong"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package io.github.chronosx88.yggdrasil.models.config
|
package io.github.chronosx88.yggdrasil.models.config
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import io.github.chronosx88.yggdrasil.models.DNSInfo
|
||||||
|
import io.github.chronosx88.yggdrasil.models.PeerInfo
|
||||||
import java.net.InetAddress
|
import java.net.InetAddress
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
import java.net.Socket
|
import java.net.Socket
|
||||||
@ -8,6 +11,66 @@ class Utils {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun deserializeStringList2PeerInfoSet(list: List<String>): MutableSet<PeerInfo> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = mutableSetOf<PeerInfo>()
|
||||||
|
for(s in list) {
|
||||||
|
out.add(gson.fromJson(s, PeerInfo::class.java))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun deserializeStringList2DNSInfoSet(list: List<String>): MutableSet<DNSInfo> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = mutableSetOf<DNSInfo>()
|
||||||
|
for(s in list) {
|
||||||
|
out.add(gson.fromJson(s, DNSInfo::class.java))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun deserializeStringSet2PeerInfoSet(list: Set<String>): MutableSet<PeerInfo> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = mutableSetOf<PeerInfo>()
|
||||||
|
for(s in list) {
|
||||||
|
out.add(gson.fromJson(s, PeerInfo::class.java))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun deserializeStringSet2DNSInfoSet(list: Set<String>): MutableSet<DNSInfo> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = mutableSetOf<DNSInfo>()
|
||||||
|
for(s in list) {
|
||||||
|
out.add(gson.fromJson(s, DNSInfo::class.java))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun serializePeerInfoSet2StringList(list: Set<PeerInfo>): ArrayList<String> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = ArrayList<String>()
|
||||||
|
for(p in list) {
|
||||||
|
out.add(gson.toJson(p))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun serializeDNSInfoSet2StringList(list: Set<DNSInfo>): ArrayList<String> {
|
||||||
|
var gson = Gson()
|
||||||
|
var out = ArrayList<String>()
|
||||||
|
for(p in list) {
|
||||||
|
out.add(gson.toJson(p))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun ping(address: InetAddress, port:Int): Int {
|
fun ping(address: InetAddress, port:Int): Int {
|
||||||
val start = System.currentTimeMillis()
|
val start = System.currentTimeMillis()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user