From 96a3c6bfb5f5405b7edeea579cd0063eb2bb20e4 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 5 Feb 2026 11:47:36 -0300 Subject: [PATCH] Don't assume metered network if user auto-updates apps when metered This is meant as a low effort alternative for users who have huge or unlimited mobile data to not see the mobile data warning dialogs all the time. Later we may consider to show a "don't ask again toggle" in the dialog or a similar UX. --- .../kotlin/org/fdroid/download/NetworkMonitor.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/org/fdroid/download/NetworkMonitor.kt b/app/src/main/kotlin/org/fdroid/download/NetworkMonitor.kt index 305346fc6..12883f60a 100644 --- a/app/src/main/kotlin/org/fdroid/download/NetworkMonitor.kt +++ b/app/src/main/kotlin/org/fdroid/download/NetworkMonitor.kt @@ -10,19 +10,23 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update +import org.fdroid.settings.SettingsConstants.AutoUpdateValues +import org.fdroid.settings.SettingsManager import javax.inject.Inject import javax.inject.Singleton @Singleton class NetworkMonitor @Inject constructor( @param:ApplicationContext private val context: Context, + private val settingsManager: SettingsManager, ) : ConnectivityManager.NetworkCallback() { private val connectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager + private val neverMetered get() = settingsManager.autoUpdateApps == AutoUpdateValues.Always private val _networkState = MutableStateFlow( connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)?.let { - NetworkState(it) + NetworkState(it, neverMetered) } ?: NetworkState(isOnline = false, isMetered = false) ) val networkState = _networkState.asStateFlow() @@ -37,7 +41,7 @@ class NetworkMonitor @Inject constructor( } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { - _networkState.update { NetworkState(networkCapabilities) } + _networkState.update { NetworkState(networkCapabilities, neverMetered) } } override fun onLost(network: Network) { @@ -49,8 +53,9 @@ data class NetworkState( val isOnline: Boolean, val isMetered: Boolean, ) { - constructor(networkCapabilities: NetworkCapabilities) : this( + constructor(networkCapabilities: NetworkCapabilities, neverMetered: Boolean) : this( isOnline = networkCapabilities.hasCapability(NET_CAPABILITY_INTERNET), - isMetered = !networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED), + isMetered = if (neverMetered) false + else !networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED), ) }