Skip to content

Commit 7fdd225

Browse files
committed
remove coroutines and Flow
1 parent 5a288d8 commit 7fdd225

File tree

8 files changed

+20
-60
lines changed

8 files changed

+20
-60
lines changed

features/dd-sdk-android-flags/api/apiSurface

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ data class com.datadog.android.flags.FlagsConfiguration
2626
interface com.datadog.android.flags.FlagsStateListener
2727
fun onStateChanged(com.datadog.android.flags.model.FlagsClientState)
2828
interface com.datadog.android.flags.StateObservable
29-
val flow: kotlinx.coroutines.flow.StateFlow<com.datadog.android.flags.model.FlagsClientState>
3029
fun getCurrentState(): com.datadog.android.flags.model.FlagsClientState
3130
fun addListener(FlagsStateListener)
3231
fun removeListener(FlagsStateListener)

features/dd-sdk-android-flags/api/dd-sdk-android-flags.api

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public abstract interface class com/datadog/android/flags/FlagsStateListener {
6363
public abstract interface class com/datadog/android/flags/StateObservable {
6464
public abstract fun addListener (Lcom/datadog/android/flags/FlagsStateListener;)V
6565
public abstract fun getCurrentState ()Lcom/datadog/android/flags/model/FlagsClientState;
66-
public abstract fun getFlow ()Lkotlinx/coroutines/flow/StateFlow;
6766
public abstract fun removeListener (Lcom/datadog/android/flags/FlagsStateListener;)V
6867
}
6968

features/dd-sdk-android-flags/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ dependencies {
5252

5353
implementation(libs.gson)
5454
implementation(libs.kotlin)
55-
api(libs.coroutinesCore)
5655
implementation(libs.okHttp)
5756
implementation(libs.androidXAnnotation)
5857
implementation(libs.androidXCollection)

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/StateObservable.kt

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,24 @@
77
package com.datadog.android.flags
88

99
import com.datadog.android.flags.model.FlagsClientState
10-
import kotlinx.coroutines.flow.StateFlow
1110

1211
/**
1312
* Observable interface for tracking [FlagsClient] state changes.
1413
*
15-
* This interface provides three ways to observe state:
16-
* 1. **Synchronous getter**: [getCurrentState] for immediate state queries (Java-friendly)
17-
* 2. **Reactive Flow**: [flow] for coroutine-based reactive updates (Kotlin)
18-
* 3. **Callback pattern**: [addListener]/[removeListener] for traditional observers (Java-friendly)
14+
* This interface provides two ways to observe state:
15+
* 1. **Synchronous getter**: [getCurrentState] for immediate state queries
16+
* 2. **Callback pattern**: [addListener]/[removeListener] for reactive observers
1917
*
2018
* ## Usage Examples
2119
*
2220
* ```kotlin
23-
* // Synchronous getter (Java-friendly, no Flow dependency)
21+
* // Synchronous getter
2422
* val current = client.state.getCurrentState()
2523
* if (current is FlagsClientState.Ready) {
2624
* // Proceed
2725
* }
2826
*
29-
* // Reactive Flow (Kotlin coroutines)
30-
* client.state.flow.value // Current value
31-
* client.state.flow.collect { state -> // Collect updates
32-
* // Handle state change
33-
* }
34-
*
35-
* // Callback pattern (Java-friendly)
27+
* // Callback pattern
3628
* client.state.addListener(object : FlagsStateListener {
3729
* override fun onStateChanged(newState: FlagsClientState) {
3830
* // Handle state change
@@ -41,19 +33,10 @@ import kotlinx.coroutines.flow.StateFlow
4133
* ```
4234
*/
4335
interface StateObservable {
44-
/**
45-
* Reactive Flow of state changes.
46-
*
47-
* This [StateFlow] emits the current state immediately to new collectors,
48-
* then emits all subsequent state changes. Suitable for Kotlin coroutines users.
49-
*/
50-
val flow: StateFlow<FlagsClientState>
51-
5236
/**
5337
* Returns the current state synchronously.
5438
*
55-
* This method is safe to call from any thread and does not require coroutines.
56-
* Suitable for Java users or quick state checks.
39+
* This method is safe to call from any thread.
5740
*
5841
* @return The current [FlagsClientState].
5942
*/
@@ -63,8 +46,7 @@ interface StateObservable {
6346
* Registers a listener to receive state change notifications.
6447
*
6548
* The listener will immediately receive the current state upon registration,
66-
* then be notified of all future state changes. Suitable for Java users or
67-
* when Flow is not available.
49+
* then be notified of all future state changes.
6850
*
6951
* @param listener The [FlagsStateListener] to register.
7052
*/

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/FlagsStateManager.kt

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ import com.datadog.android.flags.FlagsStateListener
1212
import com.datadog.android.flags.StateObservable
1313
import com.datadog.android.flags.model.FlagsClientState
1414
import com.datadog.android.internal.utils.DDCoreSubscription
15-
import kotlinx.coroutines.flow.MutableStateFlow
16-
import kotlinx.coroutines.flow.StateFlow
17-
import kotlinx.coroutines.flow.asStateFlow
1815
import java.util.concurrent.ExecutorService
1916

2017
/**
@@ -36,21 +33,20 @@ internal class FlagsStateManager(
3633
private val executorService: ExecutorService,
3734
private val internalLogger: InternalLogger
3835
) : StateObservable {
39-
/**
40-
* The current state of the client as a mutable flow.
41-
*
42-
* Updates are coordinated through the executor service to ensure ordered delivery.
43-
* MutableStateFlow itself is thread-safe.
44-
*/
45-
private val _stateFlow = MutableStateFlow<FlagsClientState>(FlagsClientState.NotReady)
46-
4736
/**
4837
* The current state of the client.
49-
* Thread-safe: synchronized to ensure atomicity with flow updates.
38+
* Thread-safe: uses volatile for visibility across threads.
5039
*/
5140
@Volatile
5241
private var currentState: FlagsClientState = FlagsClientState.NotReady
5342

43+
/**
44+
* Returns the current state synchronously.
45+
*
46+
* @return The current [FlagsClientState].
47+
*/
48+
override fun getCurrentState(): FlagsClientState = currentState
49+
5450
/**
5551
* Updates the state and notifies all listeners.
5652
*
@@ -64,21 +60,13 @@ internal class FlagsStateManager(
6460
operationName = UPDATE_STATE_OPERATION_NAME,
6561
internalLogger = internalLogger
6662
) {
67-
synchronized(this) {
68-
currentState = newState
69-
_stateFlow.value = newState
70-
}
63+
currentState = newState
7164
subscription.notifyListeners {
7265
onStateChanged(newState)
7366
}
7467
}
7568
}
7669

77-
override val flow: StateFlow<FlagsClientState> = _stateFlow.asStateFlow()
78-
79-
@Synchronized
80-
override fun getCurrentState(): FlagsClientState = currentState
81-
8270
override fun addListener(listener: FlagsStateListener) {
8371
subscription.addListener(listener)
8472

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/NoOpFlagsClient.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ import com.datadog.android.flags.model.ErrorCode
1414
import com.datadog.android.flags.model.EvaluationContext
1515
import com.datadog.android.flags.model.FlagsClientState
1616
import com.datadog.android.flags.model.ResolutionDetails
17-
import kotlinx.coroutines.flow.MutableStateFlow
18-
import kotlinx.coroutines.flow.StateFlow
19-
import kotlinx.coroutines.flow.asStateFlow
2017
import org.json.JSONObject
2118

2219
/**
@@ -39,9 +36,7 @@ internal class NoOpFlagsClient(
3936
) : FlagsClient {
4037

4138
override val state: StateObservable = object : StateObservable {
42-
private val _stateFlow = MutableStateFlow<FlagsClientState>(FlagsClientState.Ready)
43-
override val flow: StateFlow<FlagsClientState> = _stateFlow.asStateFlow()
44-
override fun getCurrentState(): FlagsClientState = FlagsClientState.Ready
39+
override fun getCurrentState(): FlagsClientState = FlagsClientState.Error(null)
4540
override fun addListener(listener: FlagsStateListener) { /* no-op */ }
4641
override fun removeListener(listener: FlagsStateListener) { /* no-op */ }
4742
}

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/NoOpFlagsClientTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,13 +432,12 @@ internal class NoOpFlagsClientTest {
432432
// region State Management
433433

434434
@Test
435-
fun `M return ready state W state_getCurrentState()`() {
435+
fun `M return error state W state_getCurrentState()`() {
436436
// When
437437
val state = testedClient.state.getCurrentState()
438438

439439
// Then
440-
// NoOp client is always "ready" to return default values
441-
assertThat(state).isEqualTo(FlagsClientState.Ready)
440+
assertThat(state).isInstanceOf(FlagsClientState.Error::class.java)
442441
}
443442

444443
@Test

features/dd-sdk-android-flags/transitiveDependencies

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ com.squareup.okio:okio-jvm:3.6.0 : 351 Kb
88
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10 : 959 b
99
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 : 965 b
1010
org.jetbrains.kotlin:kotlin-stdlib:2.0.21 : 1706 Kb
11-
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2 : 1635 Kb
1211
org.jetbrains:annotations:13.0 : 17 Kb
1312

14-
Total transitive dependencies size : 5 Mb
13+
Total transitive dependencies size : 3 Mb
1514

0 commit comments

Comments
 (0)