Loading app/src/main/java/at/bitfire/davdroid/Android10Resolver.kt +9 −5 Original line number Diff line number Diff line Loading @@ -3,24 +3,28 @@ package at.bitfire.davdroid import android.net.DnsResolver import android.os.Build import androidx.annotation.RequiresApi import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asExecutor import kotlinx.coroutines.runBlocking import org.xbill.DNS.Message import org.xbill.DNS.Resolver import org.xbill.DNS.ResolverListener import org.xbill.DNS.TSIG import java.util.* import java.util.concurrent.CompletableFuture /** * dnsjava Resolver that uses Android's [DnsResolver] API, which is available since Android 10. */ @RequiresApi(Build.VERSION_CODES.Q) class Android10Resolver: Resolver { object Android10Resolver: Resolver { private val executor = Dispatchers.IO.asExecutor() private val resolver = DnsResolver.getInstance() override fun send(query: Message): Message { val future = CompletableFuture<Message>() override fun send(query: Message): Message = runBlocking { val future = CompletableDeferred<Message>() resolver.rawQuery(null, query.toWire(), DnsResolver.FLAG_EMPTY, executor, null, object: DnsResolver.Callback<ByteArray> { override fun onAnswer(rawAnswer: ByteArray, rcode: Int) { Loading @@ -32,7 +36,7 @@ class Android10Resolver: Resolver { } }) return future.get() future.await() } override fun sendAsync(query: Message, listener: ResolverListener): Any { Loading app/src/main/java/at/bitfire/davdroid/DavUtils.kt +6 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ object DavUtils { ACTIVE, PENDING, IDLE } val DNS_QUAD9 = InetAddress.getByAddress(byteArrayOf(9,9,9,9)) const val MIME_TYPE_ACCEPT_ALL = "*/*" val MEDIA_TYPE_JCARD = "application/vcard+json".toMediaType() Loading Loading @@ -64,9 +66,9 @@ object DavUtils { fun prepareLookup(context: Context, lookup: Lookup) { if (Build.VERSION.SDK_INT >= 29) { /* Since Android 10, there's a native DnsResolver API that allows to send SRV queries without knowing which DNS serv0ers have to be used. DNS over TLS is now also supported. */ knowing which DNS servers have to be used. DNS over TLS is now also supported. */ Logger.log.fine("Using Android 10+ DnsResolver") lookup.setResolver(Android10Resolver()) lookup.setResolver(Android10Resolver) } else if (Build.VERSION.SDK_INT >= 26) { /* Since Android 8, the system properties net.dns1, net.dns2, ... are not available anymore. Loading @@ -88,8 +90,8 @@ object DavUtils { } } // fallback: add Quad9 DNS (9.9.9.9) in case that other DNS works dnsServers.add(InetAddress.getByAddress(byteArrayOf(9,9,9,9))) // fallback: add Quad9 DNS in case that no other DNS works dnsServers.add(DNS_QUAD9) val uniqueDnsServers = LinkedHashSet<InetAddress>(dnsServers) val simpleResolvers = uniqueDnsServers.map { dns -> Loading Loading
app/src/main/java/at/bitfire/davdroid/Android10Resolver.kt +9 −5 Original line number Diff line number Diff line Loading @@ -3,24 +3,28 @@ package at.bitfire.davdroid import android.net.DnsResolver import android.os.Build import androidx.annotation.RequiresApi import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asExecutor import kotlinx.coroutines.runBlocking import org.xbill.DNS.Message import org.xbill.DNS.Resolver import org.xbill.DNS.ResolverListener import org.xbill.DNS.TSIG import java.util.* import java.util.concurrent.CompletableFuture /** * dnsjava Resolver that uses Android's [DnsResolver] API, which is available since Android 10. */ @RequiresApi(Build.VERSION_CODES.Q) class Android10Resolver: Resolver { object Android10Resolver: Resolver { private val executor = Dispatchers.IO.asExecutor() private val resolver = DnsResolver.getInstance() override fun send(query: Message): Message { val future = CompletableFuture<Message>() override fun send(query: Message): Message = runBlocking { val future = CompletableDeferred<Message>() resolver.rawQuery(null, query.toWire(), DnsResolver.FLAG_EMPTY, executor, null, object: DnsResolver.Callback<ByteArray> { override fun onAnswer(rawAnswer: ByteArray, rcode: Int) { Loading @@ -32,7 +36,7 @@ class Android10Resolver: Resolver { } }) return future.get() future.await() } override fun sendAsync(query: Message, listener: ResolverListener): Any { Loading
app/src/main/java/at/bitfire/davdroid/DavUtils.kt +6 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ object DavUtils { ACTIVE, PENDING, IDLE } val DNS_QUAD9 = InetAddress.getByAddress(byteArrayOf(9,9,9,9)) const val MIME_TYPE_ACCEPT_ALL = "*/*" val MEDIA_TYPE_JCARD = "application/vcard+json".toMediaType() Loading Loading @@ -64,9 +66,9 @@ object DavUtils { fun prepareLookup(context: Context, lookup: Lookup) { if (Build.VERSION.SDK_INT >= 29) { /* Since Android 10, there's a native DnsResolver API that allows to send SRV queries without knowing which DNS serv0ers have to be used. DNS over TLS is now also supported. */ knowing which DNS servers have to be used. DNS over TLS is now also supported. */ Logger.log.fine("Using Android 10+ DnsResolver") lookup.setResolver(Android10Resolver()) lookup.setResolver(Android10Resolver) } else if (Build.VERSION.SDK_INT >= 26) { /* Since Android 8, the system properties net.dns1, net.dns2, ... are not available anymore. Loading @@ -88,8 +90,8 @@ object DavUtils { } } // fallback: add Quad9 DNS (9.9.9.9) in case that other DNS works dnsServers.add(InetAddress.getByAddress(byteArrayOf(9,9,9,9))) // fallback: add Quad9 DNS in case that no other DNS works dnsServers.add(DNS_QUAD9) val uniqueDnsServers = LinkedHashSet<InetAddress>(dnsServers) val simpleResolvers = uniqueDnsServers.map { dns -> Loading