Skip to content

Commit e90e844

Browse files
committed
Add a feature flag to disable the problematic part of the added constraints:
Requesting the OS to have internet connectivity before starting a fetch notifications worker. This feature flag is enabled by default, but can be disabled in case it's problematic.
1 parent 7bf4d75 commit e90e844

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,12 @@ enum class FeatureFlags(
147147
defaultValue = { false },
148148
isFinished = false,
149149
),
150+
ValidateNetworkWhenSchedulingNotificationFetching(
151+
key = "feature.validate_network_when_scheduling_notification_fetching",
152+
title = "validate internet connectivity when scheduling notification fetching",
153+
description = "Only fetch events for push notifications when the device has internet connectivity. " +
154+
"Enabling this can be problematic in air-gapped environments.",
155+
defaultValue = { true },
156+
isFinished = false,
157+
),
150158
}

libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/SyncPendingNotificationsRequestBuilder.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import dev.zacsweers.metro.AssistedFactory
2323
import dev.zacsweers.metro.AssistedInject
2424
import dev.zacsweers.metro.ContributesBinding
2525
import io.element.android.features.enterprise.api.EnterpriseService
26+
import io.element.android.libraries.featureflag.api.FeatureFlagService
27+
import io.element.android.libraries.featureflag.api.FeatureFlags
2628
import io.element.android.libraries.matrix.api.core.SessionId
2729
import io.element.android.libraries.push.impl.workmanager.SyncPendingNotificationsRequestBuilder.Companion.SESSION_ID
2830
import io.element.android.libraries.workmanager.api.WorkManagerRequestBuilder
@@ -49,6 +51,7 @@ class DefaultSyncPendingNotificationsRequestBuilder(
4951
@Assisted private val sessionId: SessionId,
5052
private val buildVersionSdkIntProvider: BuildVersionSdkIntProvider,
5153
private val enterpriseService: EnterpriseService,
54+
private val featureFlagService: FeatureFlagService,
5255
) : SyncPendingNotificationsRequestBuilder {
5356
@AssistedFactory
5457
@ContributesBinding(AppScope::class)
@@ -77,7 +80,7 @@ class DefaultSyncPendingNotificationsRequestBuilder(
7780
if (enterpriseService.isInAirGappedEnvironment().first()) {
7881
Timber.d("In an air-gapped environment, not adding NET_CAPABILITY_VALIDATED to the network request")
7982
networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
80-
} else {
83+
} else if (featureFlagService.isFeatureEnabled(FeatureFlags.ValidateNetworkWhenSchedulingNotificationFetching)) {
8184
Timber.d("Not in an air-gapped environment, adding NET_CAPABILITY_VALIDATED to the network request")
8285
networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
8386
}

libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/DefaultSyncPendingNotificationsRequestBuilderTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import androidx.work.OneTimeWorkRequest
1414
import androidx.work.hasKeyWithValueOfType
1515
import com.google.common.truth.Truth.assertThat
1616
import io.element.android.features.enterprise.test.FakeEnterpriseService
17+
import io.element.android.libraries.featureflag.api.FeatureFlags
18+
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
1719
import io.element.android.libraries.matrix.api.core.SessionId
1820
import io.element.android.libraries.matrix.test.A_SESSION_ID
1921
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
@@ -111,14 +113,39 @@ class DefaultSyncPendingNotificationsRequestBuilderTest {
111113
}
112114
}
113115
}
116+
117+
@Test
118+
fun `build - does not have NET_CAPABILITY_VALIDATED constraint if feature flag is disabled`() = runTest {
119+
val request = createSyncPendingNotificationsRequestBuilder(
120+
sessionId = A_SESSION_ID,
121+
sdkVersion = 33,
122+
isInAirGapEnvironment = false,
123+
featureFlagService = FakeFeatureFlagService(initialState = mapOf(
124+
FeatureFlags.ValidateNetworkWhenSchedulingNotificationFetching.key to false
125+
)),
126+
)
127+
128+
val results = request.build()
129+
assertThat(results.isSuccess).isTrue()
130+
results.getOrNull()!!.first().let { result ->
131+
result.request.run {
132+
assertThat(workSpec.hasConstraints()).isTrue()
133+
val networkRequest = workSpec.constraints.requiredNetworkRequest
134+
assertThat(networkRequest).isNotNull()
135+
assertThat(networkRequest!!.capabilities.contains(NetworkCapabilities.NET_CAPABILITY_VALIDATED)).isFalse()
136+
}
137+
}
138+
}
114139
}
115140

116141
private fun createSyncPendingNotificationsRequestBuilder(
117142
sessionId: SessionId,
118143
sdkVersion: Int = 33,
119144
isInAirGapEnvironment: Boolean = false,
145+
featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(),
120146
) = DefaultSyncPendingNotificationsRequestBuilder(
121147
sessionId = sessionId,
122148
buildVersionSdkIntProvider = FakeBuildVersionSdkIntProvider(sdkVersion),
123149
enterpriseService = FakeEnterpriseService(isInAirGappedEnvironmentResult = { flowOf(isInAirGapEnvironment) }),
150+
featureFlagService = featureFlagService,
124151
)

0 commit comments

Comments
 (0)