Use Cronet on Android 14
This commit is contained in:
@@ -1,9 +1,12 @@
|
|||||||
package be.mygod.vpnhotspot.util
|
package be.mygod.vpnhotspot.util
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.annotation.TargetApi
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.net.*
|
import android.net.*
|
||||||
|
import android.net.http.ConnectionMigrationOptions
|
||||||
|
import android.net.http.HttpEngine
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.RemoteException
|
import android.os.RemoteException
|
||||||
import android.text.*
|
import android.text.*
|
||||||
@@ -11,12 +14,15 @@ import android.view.MenuItem
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
|
import androidx.core.os.BuildCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.databinding.BindingAdapter
|
import androidx.databinding.BindingAdapter
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import be.mygod.vpnhotspot.App.Companion.app
|
import be.mygod.vpnhotspot.App.Companion.app
|
||||||
|
import be.mygod.vpnhotspot.client.MacLookup
|
||||||
import be.mygod.vpnhotspot.net.MacAddressCompat
|
import be.mygod.vpnhotspot.net.MacAddressCompat
|
||||||
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
@@ -25,6 +31,7 @@ import kotlinx.coroutines.GlobalScope
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import java.io.File
|
||||||
import java.lang.invoke.MethodHandles
|
import java.lang.invoke.MethodHandles
|
||||||
import java.lang.reflect.InvocationHandler
|
import java.lang.reflect.InvocationHandler
|
||||||
import java.lang.reflect.InvocationTargetException
|
import java.lang.reflect.InvocationTargetException
|
||||||
@@ -244,9 +251,26 @@ fun globalNetworkRequestBuilder() = NetworkRequest.Builder().apply {
|
|||||||
if (Build.VERSION.SDK_INT >= 31) setIncludeOtherUidNetworks(true)
|
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 <T> connectCancellable(url: String, block: suspend (HttpURLConnection) -> T): T {
|
suspend fun <T> connectCancellable(url: String, block: suspend (HttpURLConnection) -> T): T {
|
||||||
@Suppress("BlockingMethodInNonBlockingContext")
|
val conn = (if (BuildCompat.isAtLeastU()) {
|
||||||
val conn = URL(url).openConnection() as HttpURLConnection
|
engine.openConnection(URL(url))
|
||||||
|
} else @Suppress("BlockingMethodInNonBlockingContext") URL(url).openConnection()) as HttpURLConnection
|
||||||
return suspendCancellableCoroutine { cont ->
|
return suspendCancellableCoroutine { cont ->
|
||||||
val job = GlobalScope.launch(Dispatchers.IO) {
|
val job = GlobalScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user