From 09ad638827d47c8910246c714beae8cc3729ad39 Mon Sep 17 00:00:00 2001 From: Linus789 Date: Sat, 18 Feb 2023 18:12:50 +0100 Subject: [PATCH 1/2] Fix no connection with gnirehtet reverse tethering --- .../github/libretube/helpers/NetworkHelper.kt | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt b/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt index 8f303230e6..5f5eb9e437 100644 --- a/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt @@ -2,6 +2,8 @@ package com.github.libretube.helpers import android.content.Context import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build import androidx.core.content.getSystemService object NetworkHelper { @@ -9,33 +11,24 @@ object NetworkHelper { * Detect whether network is available */ fun isNetworkAvailable(context: Context): Boolean { - val connectivityManager = context.getSystemService() + // In case we are using a VPN, we return true since we might be using reverse tethering + val connectivityManager = context.getSystemService() ?: return false - // this seems to not recognize vpn connections - /* - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val nw = connectivityManager.activeNetwork ?: return false - val actNw = connectivityManager.getNetworkCapabilities(nw) ?: return false - return when { - // WiFi - actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true - // Mobile - actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true - // Ethernet - actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true - // Bluetooth - actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true - // VPN - actNw.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> true - else -> false - } + if (Build.VERSION.SDK_INT >= 23) { + val activeNetwork = connectivityManager.activeNetwork + val caps = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false + val hasConnection = caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + val isVpn = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) + return hasConnection || isVpn } else { - return connectivityManager.activeNetworkInfo?.isConnected ?: false - } - */ + if (connectivityManager.activeNetworkInfo?.isConnected == true) { + return true + } - @Suppress("DEPRECATION") - return connectivityManager?.activeNetworkInfo?.isConnected ?: false + // activeNetworkInfo might return null instead of the VPN, so better check it explicitly + val vpnInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN) + return vpnInfo?.isConnected == true + } } /** From f9873fd6345ab3c6e6cabfe3e4a5213fc2f15ff4 Mon Sep 17 00:00:00 2001 From: Linus789 Date: Sun, 19 Feb 2023 18:46:06 +0100 Subject: [PATCH 2/2] Treat reverse tethering as not metered connection --- .../github/libretube/helpers/NetworkHelper.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt b/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt index 5f5eb9e437..e14562e1f9 100644 --- a/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/NetworkHelper.kt @@ -37,6 +37,20 @@ object NetworkHelper { * @return whether the network is metered or not */ fun isNetworkMetered(context: Context): Boolean { - return context.getSystemService()!!.isActiveNetworkMetered + val connectivityManager = context.getSystemService()!! + val activeNetworkInfo = connectivityManager.activeNetworkInfo + + // In case we are using nothing but a VPN, it should default to not metered + if (activeNetworkInfo == null) { + // activeNetworkInfo might return null instead of the VPN, so better check it explicitly + val vpnInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN) + if (vpnInfo?.isConnected == true) { + return false + } + } else if (activeNetworkInfo.type == ConnectivityManager.TYPE_VPN) { + return false + } + + return connectivityManager.isActiveNetworkMetered } }