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:
John Maguire 2021-05-03 14:58:09 -04:00 committed by GitHub
parent 1d044a1e36
commit 3194028a78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 12 deletions

View File

@ -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,8 +129,15 @@ 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 () { }
private fun unregisterNetworkCallback() {
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
}
inner class NetworkCallback() : ConnectivityManager.NetworkCallback () {
override fun onAvailable(network: Network?) { override fun onAvailable(network: Network?) {
super.onAvailable(network) super.onAvailable(network)
nebula!!.rebind("network change") nebula!!.rebind("network change")
@ -139,9 +147,9 @@ class NebulaVpnService : VpnService() {
super.onLost(network) super.onLost(network)
nebula!!.rebind("network change") 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