From a66d07ae84c11e0c7770b42077d42743f0007a19 Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 1 Nov 2021 15:09:53 +0100 Subject: [PATCH] Use modern network APIs --- .../org/moire/ultrasonic/util/Settings.kt | 6 +-- .../kotlin/org/moire/ultrasonic/util/Util.kt | 50 +++++++++++++++++-- ultrasonic/src/main/res/values/strings.xml | 4 +- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt index 7a45b123..fd541dd6 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt @@ -9,7 +9,6 @@ package org.moire.ultrasonic.util import android.content.Context import android.content.SharedPreferences -import android.net.ConnectivityManager import android.os.Build import androidx.preference.PreferenceManager import java.util.regex.Pattern @@ -70,12 +69,9 @@ object Settings { @JvmStatic val maxBitRate: Int get() { - val manager = Util.getConnectivityManager() - val networkInfo = manager.activeNetworkInfo ?: return 0 - val wifi = networkInfo.type == ConnectivityManager.TYPE_WIFI val preferences = preferences return preferences.getString( - if (wifi) Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI + if (Util.networkInfo().unmetered) Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI else Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE, "0" )!!.toInt() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index c6a8af0b..26ae9369 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -22,9 +22,13 @@ import android.graphics.Canvas import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED import android.net.Uri import android.net.wifi.WifiManager import android.net.wifi.WifiManager.WifiLock +import android.os.Build import android.os.Bundle import android.os.Environment import android.os.Parcelable @@ -374,14 +378,45 @@ object Util { return null } + /** + * Check if a usable network for downloading media is available + * + * @return Boolean + */ @JvmStatic fun isNetworkConnected(): Boolean { - val manager = getConnectivityManager() - val networkInfo = manager.activeNetworkInfo - val connected = networkInfo != null && networkInfo.isConnected - val wifiConnected = connected && networkInfo!!.type == ConnectivityManager.TYPE_WIFI + val info = networkInfo() + val isUnmetered = info.unmetered val wifiRequired = Settings.isWifiRequiredForDownload - return connected && (!wifiRequired || wifiConnected) + return info.connected && (!wifiRequired || isUnmetered) + } + + /** + * Query connectivity status + * + * @return NetworkInfo object + */ + @Suppress("DEPRECATION") + fun networkInfo(): NetworkInfo { + val manager = getConnectivityManager() + val info = NetworkInfo() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val network: Network? = manager.activeNetwork + val capabilities = manager.getNetworkCapabilities(network) + + if (capabilities != null) { + info.unmetered = capabilities.hasCapability(NET_CAPABILITY_NOT_METERED) + info.connected = capabilities.hasCapability(NET_CAPABILITY_INTERNET) + } + } else { + val networkInfo = manager.activeNetworkInfo + if (networkInfo != null) { + info.unmetered = networkInfo.type == ConnectivityManager.TYPE_WIFI + info.connected = networkInfo.isConnected + } + } + return info } @JvmStatic @@ -921,4 +956,9 @@ object Util { val context = appContext() return context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager } + + data class NetworkInfo( + var connected: Boolean = false, + var unmetered: Boolean = false + ) } diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index a4f4e6f2..bbf382a2 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -339,8 +339,8 @@ 4 seconds 4.5 seconds 5 seconds - Only stream media if connected to Wi-Fi - Wi-Fi Streaming Only + Only download media on unmetered connections + Download on Wi-Fi only %1$s%2$s %d kbps 0 B