Fix isInAirGappedEnvironment check for older APIs (#6573)
* Fix `isInAirGappedEnvironment` check for older APIs: use `networkCapabilities.hasCapability` instead of `networkCapabilities.capabilities.contains`, which only works on Android 12 and newer versions * Check for air-gapped env in the FOSS app too: this unifies the notification behaviour on EXA and Element Pro
This commit is contained in:
parent
7a9260905e
commit
8b0f3b92da
3 changed files with 7 additions and 12 deletions
|
|
@ -15,13 +15,11 @@ import android.net.ConnectivityManager
|
||||||
import android.net.Network
|
import android.net.Network
|
||||||
import android.net.NetworkCapabilities
|
import android.net.NetworkCapabilities
|
||||||
import android.net.NetworkRequest
|
import android.net.NetworkRequest
|
||||||
import android.os.Build
|
|
||||||
import dev.zacsweers.metro.AppScope
|
import dev.zacsweers.metro.AppScope
|
||||||
import dev.zacsweers.metro.ContributesBinding
|
import dev.zacsweers.metro.ContributesBinding
|
||||||
import dev.zacsweers.metro.SingleIn
|
import dev.zacsweers.metro.SingleIn
|
||||||
import io.element.android.features.networkmonitor.api.NetworkMonitor
|
import io.element.android.features.networkmonitor.api.NetworkMonitor
|
||||||
import io.element.android.features.networkmonitor.api.NetworkStatus
|
import io.element.android.features.networkmonitor.api.NetworkStatus
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
|
||||||
import io.element.android.libraries.di.annotations.AppCoroutineScope
|
import io.element.android.libraries.di.annotations.AppCoroutineScope
|
||||||
import io.element.android.libraries.di.annotations.ApplicationContext
|
import io.element.android.libraries.di.annotations.ApplicationContext
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
@ -44,7 +42,6 @@ import java.util.concurrent.atomic.AtomicInteger
|
||||||
class DefaultNetworkMonitor(
|
class DefaultNetworkMonitor(
|
||||||
@ApplicationContext context: Context,
|
@ApplicationContext context: Context,
|
||||||
@AppCoroutineScope appCoroutineScope: CoroutineScope,
|
@AppCoroutineScope appCoroutineScope: CoroutineScope,
|
||||||
private val buildMeta: BuildMeta,
|
|
||||||
) : NetworkMonitor {
|
) : NetworkMonitor {
|
||||||
private val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java)
|
private val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java)
|
||||||
|
|
||||||
|
|
@ -76,17 +73,10 @@ class DefaultNetworkMonitor(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
|
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
|
||||||
if (!buildMeta.isEnterpriseBuild) {
|
|
||||||
// The air-gapped environment detection is only relevant for the enterprise build.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (network.networkHandle == connectivityManager.activeNetwork?.networkHandle) {
|
if (network.networkHandle == connectivityManager.activeNetwork?.networkHandle) {
|
||||||
// If the network doesn't have the NET_CAPABILITY_VALIDATED capability, it means that the network is not able to reach the internet
|
// If the network doesn't have the NET_CAPABILITY_VALIDATED capability, it means that the network is not able to reach the internet
|
||||||
// (according to Google), which is a common case in air-gapped environments.
|
// (according to Google), which is a common case in air-gapped environments.
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
isInAirGappedEnvironment.value = !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||||
isInAirGappedEnvironment.value = !networkCapabilities.capabilities.contains(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,6 @@ class DefaultSyncPendingNotificationsRequestBuilder(
|
||||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
|
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
|
||||||
|
|
||||||
// If we're in an air-gapped environment, we shouldn't validate internet connectivity, as the checker will fail and the worker won't run at all.
|
// If we're in an air-gapped environment, we shouldn't validate internet connectivity, as the checker will fail and the worker won't run at all.
|
||||||
// Note this will always be false for FOSS, since the feature is only enabled in Element Pro.
|
|
||||||
if (networkMonitor.isInAirGappedEnvironment.first()) {
|
if (networkMonitor.isInAirGappedEnvironment.first()) {
|
||||||
Timber.d("In an air-gapped environment, not adding NET_CAPABILITY_VALIDATED to the network request")
|
Timber.d("In an air-gapped environment, not adding NET_CAPABILITY_VALIDATED to the network request")
|
||||||
networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,9 @@ class DefaultSyncPendingNotificationsRequestBuilderTest {
|
||||||
sessionId = A_SESSION_ID,
|
sessionId = A_SESSION_ID,
|
||||||
sdkVersion = 33,
|
sdkVersion = 33,
|
||||||
isInAirGapEnvironment = false,
|
isInAirGapEnvironment = false,
|
||||||
|
featureFlagService = FakeFeatureFlagService(initialState = mapOf(
|
||||||
|
FeatureFlags.ValidateNetworkWhenSchedulingNotificationFetching.key to true
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
|
|
||||||
val results = request.build()
|
val results = request.build()
|
||||||
|
|
@ -100,6 +103,9 @@ class DefaultSyncPendingNotificationsRequestBuilderTest {
|
||||||
sessionId = A_SESSION_ID,
|
sessionId = A_SESSION_ID,
|
||||||
sdkVersion = 33,
|
sdkVersion = 33,
|
||||||
isInAirGapEnvironment = true,
|
isInAirGapEnvironment = true,
|
||||||
|
featureFlagService = FakeFeatureFlagService(initialState = mapOf(
|
||||||
|
FeatureFlags.ValidateNetworkWhenSchedulingNotificationFetching.key to true
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
|
|
||||||
val results = request.build()
|
val results = request.build()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue