From 9e325e0975ed5e934707742def6730d4b5581e3d Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 9 Mar 2023 23:00:35 -0500 Subject: [PATCH] Use Cronet on Android 14 --- .../java/be/mygod/vpnhotspot/util/Utils.kt | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt index d859931d..172b0432 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt @@ -1,9 +1,12 @@ package be.mygod.vpnhotspot.util import android.annotation.SuppressLint +import android.annotation.TargetApi import android.content.* import android.content.res.Resources import android.net.* +import android.net.http.ConnectionMigrationOptions +import android.net.http.HttpEngine import android.os.Build import android.os.RemoteException import android.text.* @@ -11,12 +14,15 @@ import android.view.MenuItem import android.view.View import android.widget.ImageView import androidx.annotation.DrawableRes +import androidx.annotation.RequiresApi import androidx.core.net.toUri +import androidx.core.os.BuildCompat import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import be.mygod.vpnhotspot.App.Companion.app +import be.mygod.vpnhotspot.client.MacLookup import be.mygod.vpnhotspot.net.MacAddressCompat import be.mygod.vpnhotspot.widget.SmartSnackbar import kotlinx.coroutines.CancellationException @@ -25,6 +31,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import timber.log.Timber +import java.io.File import java.lang.invoke.MethodHandles import java.lang.reflect.InvocationHandler import java.lang.reflect.InvocationTargetException @@ -244,9 +251,26 @@ fun globalNetworkRequestBuilder() = NetworkRequest.Builder().apply { if (Build.VERSION.SDK_INT >= 31) setIncludeOtherUidNetworks(true) } +@get:RequiresApi(34) +private val engine by lazy @TargetApi(34) { + val cache = File(app.deviceStorage.cacheDir, "httpEngine") + HttpEngine.Builder(app.deviceStorage).apply { + if (cache.mkdirs() || cache.isDirectory) { + setStoragePath(cache.absolutePath) + setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK, 1024 * 1024) + } + setConnectionMigrationOptions(ConnectionMigrationOptions.Builder().apply { + setEnableDefaultNetworkMigration(true) + setEnablePathDegradationMigration(true) + }.build()) + setEnableBrotli(true) + addQuicHint(MacLookup.HOST, 443, 443) + }.build() +} suspend fun connectCancellable(url: String, block: suspend (HttpURLConnection) -> T): T { - @Suppress("BlockingMethodInNonBlockingContext") - val conn = URL(url).openConnection() as HttpURLConnection + val conn = (if (BuildCompat.isAtLeastU()) { + engine.openConnection(URL(url)) + } else @Suppress("BlockingMethodInNonBlockingContext") URL(url).openConnection()) as HttpURLConnection return suspendCancellableCoroutine { cont -> val job = GlobalScope.launch(Dispatchers.IO) { try {