Unregister network callback on stop (Android) (#34)
Previously when `stopVpn()` was called, it was possible for the network change callback to fire while we were in the middle of shutting down. This commit unregisters the network change callback before telling Nebula to shutdown.
This commit is contained in:
parent
1d044a1e36
commit
3194028a78
|
@ -39,6 +39,7 @@ class NebulaVpnService : VpnService() {
|
||||||
private var nebula: mobileNebula.Nebula? = null
|
private var nebula: mobileNebula.Nebula? = null
|
||||||
private var vpnInterface: ParcelFileDescriptor? = null
|
private var vpnInterface: ParcelFileDescriptor? = null
|
||||||
private var didSleep = false
|
private var didSleep = false
|
||||||
|
private var networkCallback: NetworkCallback = NetworkCallback();
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
if (intent?.getStringExtra("COMMAND") == "STOP") {
|
if (intent?.getStringExtra("COMMAND") == "STOP") {
|
||||||
|
@ -128,20 +129,27 @@ class NebulaVpnService : VpnService() {
|
||||||
val builder = NetworkRequest.Builder()
|
val builder = NetworkRequest.Builder()
|
||||||
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
|
|
||||||
connectivityManager.registerNetworkCallback(builder.build(),
|
connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
|
||||||
object : ConnectivityManager.NetworkCallback () {
|
|
||||||
override fun onAvailable(network: Network?) {
|
|
||||||
super.onAvailable(network)
|
|
||||||
nebula!!.rebind("network change")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLost(network: Network?) {
|
|
||||||
super.onLost(network)
|
|
||||||
nebula!!.rebind("network change")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun unregisterNetworkCallback() {
|
||||||
|
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||||
|
connectivityManager.unregisterNetworkCallback(networkCallback)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class NetworkCallback() : ConnectivityManager.NetworkCallback () {
|
||||||
|
override fun onAvailable(network: Network?) {
|
||||||
|
super.onAvailable(network)
|
||||||
|
nebula!!.rebind("network change")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLost(network: Network?) {
|
||||||
|
super.onLost(network)
|
||||||
|
nebula!!.rebind("network change")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun registerSleep() {
|
private fun registerSleep() {
|
||||||
val receiver: BroadcastReceiver = object : BroadcastReceiver() {
|
val receiver: BroadcastReceiver = object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context, intent: Intent?) {
|
override fun onReceive(context: Context, intent: Intent?) {
|
||||||
|
@ -163,6 +171,7 @@ class NebulaVpnService : VpnService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun stopVpn() {
|
private fun stopVpn() {
|
||||||
|
unregisterNetworkCallback()
|
||||||
nebula?.stop()
|
nebula?.stop()
|
||||||
vpnInterface?.close()
|
vpnInterface?.close()
|
||||||
running = false
|
running = false
|
||||||
|
|
Loading…
Reference in New Issue