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.
This commit is contained in:
Torsten Grote
2026-02-05 11:47:36 -03:00
parent e423f50f2b
commit 96a3c6bfb5

View File

@@ -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),
)
}