Skip to content

Commit 95e43eb

Browse files
committed
Fix AppTP unregister crash
1 parent cdbae61 commit 95e43eb

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

  • app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/service

app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/service/DnsChangeCallback.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ class DnsChangeCallback @Inject constructor(
4545
}
4646
private var lastDns: List<InetAddress>? = null
4747

48+
// Guards against unregistering an unregistered callback.
49+
// Note: Not synchronized, so register()/unregister() must always run on TrackerBlockingVpnService's serviceDispatcher.
50+
private var registered: Boolean = false
51+
4852
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
4953
logcat { "onLinkPropertiesChanged: $linkProperties" }
5054
coroutineScope.launch(dispatcherProvider.io()) {
@@ -68,22 +72,27 @@ class DnsChangeCallback @Inject constructor(
6872
}
6973

7074
internal fun register() {
75+
if (registered) return
7176
kotlin.runCatching {
7277
val request = NetworkRequest.Builder().apply {
7378
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
7479
addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
7580
}.build()
7681
connectivityManager?.registerNetworkCallback(request, this)
82+
registered = true
7783
}.onFailure {
7884
logcat(ERROR) { it.asLog() }
7985
}
8086
}
8187

8288
internal fun unregister() {
89+
if (!registered) return
8390
kotlin.runCatching {
8491
connectivityManager?.unregisterNetworkCallback(this)
8592
}.onFailure {
8693
logcat(ERROR) { it.asLog() }
94+
}.also {
95+
registered = false
8796
}
8897
}
8998

0 commit comments

Comments
 (0)