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