diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/FallbackUpstreamMonitor.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/FallbackUpstreamMonitor.kt index b6eb2c50..fbe6056c 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/FallbackUpstreamMonitor.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/FallbackUpstreamMonitor.kt @@ -2,6 +2,8 @@ package be.mygod.vpnhotspot.net.monitor import android.content.SharedPreferences import be.mygod.vpnhotspot.App.Companion.app +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch abstract class FallbackUpstreamMonitor private constructor() : UpstreamMonitor() { companion object : SharedPreferences.OnSharedPreferenceChangeListener { @@ -21,19 +23,21 @@ abstract class FallbackUpstreamMonitor private constructor() : UpstreamMonitor() fun unregisterCallback(callback: Callback) = synchronized(this) { monitor.unregisterCallback(callback) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == KEY) synchronized(this) { - val old = monitor - val callbacks = synchronized(old) { - val callbacks = old.callbacks.toList() - old.callbacks.clear() - old.destroyLocked() - callbacks - } - val new = generateMonitor() - monitor = new - for (callback in callbacks) { - callback.onLost() - new.registerCallback(callback) + if (key == KEY) GlobalScope.launch { // prevent callback called in main + synchronized(this) { + val old = monitor + val callbacks = synchronized(old) { + val callbacks = old.callbacks.toList() + old.callbacks.clear() + old.destroyLocked() + callbacks + } + val new = generateMonitor() + monitor = new + for (callback in callbacks) { + callback.onLost() + new.registerCallback(callback) + } } } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/UpstreamMonitor.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/UpstreamMonitor.kt index 8235b610..2cdf3d8b 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/UpstreamMonitor.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/UpstreamMonitor.kt @@ -3,6 +3,8 @@ package be.mygod.vpnhotspot.net.monitor import android.content.SharedPreferences import android.net.LinkProperties import be.mygod.vpnhotspot.App.Companion.app +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import java.lang.UnsupportedOperationException import java.net.InetAddress import java.util.* @@ -26,20 +28,22 @@ abstract class UpstreamMonitor { fun unregisterCallback(callback: Callback) = synchronized(this) { monitor.unregisterCallback(callback) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == KEY) synchronized(this) { - val old = monitor - val (active, callbacks) = synchronized(old) { - val active = old.currentIface != null - val callbacks = old.callbacks.toList() - old.callbacks.clear() - old.destroyLocked() - Pair(active, callbacks) - } - val new = generateMonitor() - monitor = new - for (callback in callbacks) { - if (active) callback.onLost() - new.registerCallback(callback) + if (key == KEY) GlobalScope.launch { // prevent callback called in main + synchronized(this) { + val old = monitor + val (active, callbacks) = synchronized(old) { + val active = old.currentIface != null + val callbacks = old.callbacks.toList() + old.callbacks.clear() + old.destroyLocked() + Pair(active, callbacks) + } + val new = generateMonitor() + monitor = new + for (callback in callbacks) { + if (active) callback.onLost() + new.registerCallback(callback) + } } } }