Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
177 commits
Select commit Hold shift + click to select a range
244e04b
feat(events): summarize and buffer events on the recording thread (ti…
abelonogov-ld Sep 3, 2026
0c98c92
feat(events): add a bounded flush (tier 2)
abelonogov-ld Sep 4, 2026
cf48dbf
feat(events): persist recorded events to an append-only log (tier 3)
abelonogov-ld Sep 9, 2026
75a39b1
test(events): benchmark what recording an event costs on Android
abelonogov-ld Sep 11, 2026
4c52176
bench
abelonogov-ld Sep 15, 2026
73dc7d3
build: build java-sdk-internal from a local checkout (temporary)
abelonogov-ld Sep 15, 2026
e5cb947
refactor(events): move AndroidEventBuffer out of java-sdk-internal's …
abelonogov-ld Sep 15, 2026
d57313c
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 15, 2026
60df384
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 15, 2026
bf9466b
build: use java-sdk-internal 1.12.0
abelonogov-ld Sep 15, 2026
818d239
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 15, 2026
aafc63b
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 15, 2026
9201bfa
fix(events): do not send diagnostics while offline or backgrounded
abelonogov-ld Sep 15, 2026
66a92da
refactor(events): rename AndroidEventProcessor and AndroidEventBuffer
abelonogov-ld Sep 15, 2026
63ca732
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 15, 2026
7b3621b
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 15, 2026
a667019
renaming
abelonogov-ld Sep 17, 2026
839e86d
short eval queue
abelonogov-ld Sep 17, 2026
0fb38cb
chore(events): clear lint warnings on the event processor and buffer
abelonogov-ld Sep 17, 2026
d399f54
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 17, 2026
196fd1b
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 17, 2026
123cb81
fix warning
abelonogov-ld Sep 18, 2026
80f3083
fix warning
abelonogov-ld Sep 18, 2026
df5a6f7
eventCounts
abelonogov-ld Sep 18, 2026
d20585c
persistEvents
abelonogov-ld Sep 18, 2026
9569078
Merge branch 'main' into andrey/event-durability-tier1-buffer
abelonogov-ld Sep 18, 2026
0b39987
option
abelonogov-ld Sep 18, 2026
14349d5
docs(events): record that a failed diagnostic init is not retried
abelonogov-ld Sep 18, 2026
6d77bde
fix(events): deliver buffered events when connectivity returns
abelonogov-ld Sep 18, 2026
ef886dc
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 18, 2026
fd0bd7e
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 18, 2026
363734a
test(events): keep delivery from racing the on-disk assertions
abelonogov-ld Sep 18, 2026
50110b2
fix(events): honour excludeFromSummaries when folding an evaluation
abelonogov-ld Sep 21, 2026
536a453
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 21, 2026
99a1936
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 21, 2026
ca5971a
Update launchdarkly-android-client-sdk/src/main/java/com/launchdarkly…
abelonogov-ld Sep 21, 2026
88c132f
Hold buffered events in the processor and encode outside the lock
abelonogov-ld Sep 21, 2026
19a14b3
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 21, 2026
e408587
Drop the buffer's logger parameter
abelonogov-ld Sep 21, 2026
f233167
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 21, 2026
c96fa88
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 21, 2026
26bd300
Keep the inherited field and assignment order
abelonogov-ld Sep 21, 2026
f6bb653
space
abelonogov-ld Sep 21, 2026
4f11eb0
Split internal quality controls into test app
abelonogov-ld Sep 21, 2026
0bcef8b
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 21, 2026
dee912b
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 21, 2026
927a2f7
Ignore local.properties in any module directory
abelonogov-ld Sep 21, 2026
644ac0f
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 21, 2026
a8bffd3
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 21, 2026
30f7b1a
unserializable unit test
abelonogov-ld Sep 22, 2026
68d8aa9
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
07d4dde
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
f3a19a2
logger
abelonogov-ld Sep 22, 2026
a339448
fix error handlong
abelonogov-ld Sep 22, 2026
bc3431d
Close Budget
abelonogov-ld Sep 22, 2026
7bd8b07
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
3758a86
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
04f1c03
Fold the online catch-up delivery into updateScheduledTasks
abelonogov-ld Sep 22, 2026
7385975
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
288680a
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
2746950
Drop unserializable events and summaries on the persistence path too
abelonogov-ld Sep 22, 2026
29991ab
Merge branch 'main' into andrey/event-durability-tier1-buffer
abelonogov-ld Sep 22, 2026
f278820
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
6a73c56
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
9d69347
Post diagnostic events off the analytics delivery thread
abelonogov-ld Sep 22, 2026
c6386f7
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
c71c976
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
303580c
Rename eventSender to diagnosticEventSender
abelonogov-ld Sep 22, 2026
46cca56
Use volatile for the flags that never do a compound update
abelonogov-ld Sep 22, 2026
f36aee4
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
83c43a1
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
c949ab4
Make the close checks either locked, deleted, or documented
abelonogov-ld Sep 22, 2026
23bba70
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
08fe09d
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
433cf2e
Bound how many contexts are summarized at once
abelonogov-ld Sep 22, 2026
a408e75
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
aeaa74b
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
8f7762c
Reset the counted contexts wherever the counters are reset
abelonogov-ld Sep 22, 2026
113ee34
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
1b027b1
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
b35f4cd
Record an evaluation's counter and events under one lock
abelonogov-ld Sep 22, 2026
70babb2
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
b093a92
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
115a312
Build the diagnostic period on the thread that posts it
abelonogov-ld Sep 22, 2026
ff5aeec
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
a14aaf7
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
0df02b8
Treat a capacity of nought as one, in both places that bound by it
abelonogov-ld Sep 22, 2026
b414476
Report the capacity the SDK will use, and stop the race test overrunn…
abelonogov-ld Sep 22, 2026
105c870
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
73eaf53
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
67690b3
Clamp the capacity where it is set, not where it is used
abelonogov-ld Sep 22, 2026
bdfd13a
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
58492bb
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
38337ab
Make the diagnostics tests real, and cover shutdown and the flush race
abelonogov-ld Sep 22, 2026
6290c38
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 22, 2026
3fb426c
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 22, 2026
af84244
Keep context-limit test payloads small enough for the test server
abelonogov-ld Sep 23, 2026
ee78359
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 23, 2026
2ae461c
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 23, 2026
f3a0f75
Document that close() discards events held while offline
abelonogov-ld Sep 23, 2026
c629046
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 23, 2026
5421ffd
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 23, 2026
f1263bc
Keep the flush interval running while offline instead of delivering o…
abelonogov-ld Sep 23, 2026
2237489
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 23, 2026
7271754
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 23, 2026
30ae37a
Fix the instrumented benchmark's OutboundEventBuffer call for the cur…
abelonogov-ld Sep 23, 2026
394ae90
Count events a commit is staging against capacity
abelonogov-ld Sep 23, 2026
b42f022
Keep tier-3 event persistence disk work off the caller's thread
abelonogov-ld Sep 23, 2026
9c8c889
Make stopping scheduled event tasks independent of the closed check
abelonogov-ld Sep 23, 2026
df9e409
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 23, 2026
6b9bfb1
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 23, 2026
e113694
Report a failed flushAndWait from a closed client
abelonogov-ld Sep 23, 2026
4ea6deb
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 23, 2026
4db9fa7
Restore split-evaluation coverage on tier 3 at the commit boundary
abelonogov-ld Sep 23, 2026
cdfa78d
Keep the event store off the filesystem when persistence is disabled
abelonogov-ld Sep 23, 2026
d27473a
Isolate recording exceptions and reset context limit warning per run
abelonogov-ld Sep 23, 2026
15d3ffa
Tighten recording error handling and the per-run context warning
abelonogov-ld Sep 23, 2026
4ac8572
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 23, 2026
b744e54
Merge tier 2 (tier-1 recording follow-ups) into tier 3
abelonogov-ld Sep 23, 2026
48c6378
Recover the interrupted log before this run first appends to it
abelonogov-ld Sep 23, 2026
9740da3
check persisting
abelonogov-ld Sep 25, 2026
97a17f3
Close the event log if writing its header fails
abelonogov-ld Sep 27, 2026
7ecc1c4
Describe the diagnostic recording interval once
abelonogov-ld Sep 27, 2026
11b788e
Count events on their way into the store exactly once against capacity
abelonogov-ld Sep 27, 2026
741d83f
Summarize per context without Java 8 library calls Android lacks belo…
abelonogov-ld Sep 27, 2026
f432d58
Commit on the store's thread and schedule the delivery retry
abelonogov-ld Sep 28, 2026
68d3dbf
Take less work onto the evaluating thread
abelonogov-ld Sep 28, 2026
e35867e
Group concurrent IMMEDIATE commit points into one commit
abelonogov-ld Sep 28, 2026
92e47dd
Queue no commit at a commit point where there is no disk
abelonogov-ld Sep 28, 2026
8cb6842
Answer isPersisting without the staging lock
abelonogov-ld Sep 28, 2026
11e8a4e
Wait for the commit thread, not the events thread, before counting a …
abelonogov-ld Sep 28, 2026
e2437b4
Update java-sdk-internal to 1.12.1
abelonogov-ld Sep 28, 2026
7fe25ed
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Sep 28, 2026
23ff461
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Sep 28, 2026
0290a36
comment fix
abelonogov-ld Sep 29, 2026
b5c64a0
Merge branch 'main' into andrey/event-durability-tier1-buffer
abelonogov-ld Sep 29, 2026
6f1ae80
Flush through a future, shared by the callers who asked at once
abelonogov-ld Oct 2, 2026
3ab2ffc
Merge branch 'andrey/event-durability-tier1-buffer' into andrey/event…
abelonogov-ld Oct 2, 2026
2979a73
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Oct 2, 2026
90f4eed
change to 500 ms
abelonogov-ld Oct 6, 2026
14b9e47
Tell a flush caller about events an earlier delivery took and lost
abelonogov-ld Oct 6, 2026
6de55d5
Keep flushAndWait bounded at Long.MIN_VALUE and boolean on a cancelle…
abelonogov-ld Oct 6, 2026
0421534
fix
abelonogov-ld Oct 6, 2026
51bae97
Pin flushAndWait's outcome for refused posts, abandoned waits and par…
abelonogov-ld Oct 6, 2026
30a5008
Move the crash flush into the SDK as EventFlushingCrashHandler
abelonogov-ld Oct 6, 2026
f229dde
Rename EventFlushingCrashHandler to LDCrashHandler
abelonogov-ld Oct 6, 2026
b8fd94c
Pin the 503 outcomes Todd proposed, say refused events are not kept, …
abelonogov-ld Oct 7, 2026
49c3bdf
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Oct 7, 2026
7457a26
Say how long a failing delivery takes, so a shorter flushAndWait budg…
abelonogov-ld Oct 7, 2026
c65be26
Pin that a refused batch is posted only by each delivery and its one …
abelonogov-ld Oct 7, 2026
61ba012
Merge branch 'andrey/event-durability-tier2-bounded-flush' into andre…
abelonogov-ld Oct 7, 2026
d35b345
Sample an event once, as it is recorded, not again as it is staged
abelonogov-ld Oct 7, 2026
78ef0b8
Deliver every event left behind when persistence fails, and report ev…
abelonogov-ld Oct 7, 2026
d3d7151
Keep stored events whose read fails instead of deleting them
abelonogov-ld Oct 7, 2026
ec6e121
Split the log format and this process's open log out of EventStore
abelonogov-ld Oct 10, 2026
caefa58
Keep the batch paths off the disk, and out of ioLock, when persistenc…
abelonogov-ld Oct 11, 2026
9513935
Tell the delivery that closed the batch about a loss, not whichever a…
abelonogov-ld Oct 11, 2026
705197e
Merge remote-tracking branch 'origin/main' into andrey/event-durabili…
abelonogov-ld Oct 11, 2026
42aa53c
Take the frames a failed write left back off the log, so they are not…
abelonogov-ld Oct 12, 2026
1fc2081
Rename OpenEventLog to DiskEventLog, so it reads apart from diagnosti…
abelonogov-ld Oct 12, 2026
2464bdb
Remove the whole-run encoder, which nothing but two tests still called
abelonogov-ld Oct 12, 2026
c394ee1
Commit first at close, and never wait past the budget on the caller's…
abelonogov-ld Oct 12, 2026
b4dd983
Group the DirectEventProcessor fields by the lock that guards them
abelonogov-ld Oct 12, 2026
6fb00b4
Keep counting events against capacity while they are on their way out…
abelonogov-ld Oct 12, 2026
cc1b040
Keep the closed-batch count equal to the batches it counts
abelonogov-ld Oct 12, 2026
87e2b21
Stop counting a batch against capacity while its request is out
abelonogov-ld Oct 12, 2026
e184d34
unit tests for disabled
abelonogov-ld Oct 12, 2026
92af3fc
Give the event directory a class of its own
abelonogov-ld Oct 12, 2026
335e7cb
Stop re-sending a delivered batch whose file will not delete
abelonogov-ld Oct 12, 2026
d94c586
Raise the default event capacity to 2000
abelonogov-ld Oct 12, 2026
13727c1
Commit before every flush's delivery, not only flush()
abelonogov-ld Oct 12, 2026
58decdb
Write on flush at DEFERRED too
abelonogov-ld Oct 12, 2026
0a1e8ed
Leave scheduling writes to the event processor, and count a batch's e…
abelonogov-ld Oct 12, 2026
fab94f2
combobox
abelonogov-ld Oct 13, 2026
0c05225
Report a stored batch this version cannot read as lost
abelonogov-ld Oct 13, 2026
3587b23
Report an unreadable batch as lost, and return every batch closeBatch…
abelonogov-ld Oct 13, 2026
5c05668
Do not take a payload id ending in zero-led digits for a count
abelonogov-ld Oct 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.gradle
/local.properties
local.properties
.DS_Store
build
/captures
Expand Down
2 changes: 0 additions & 2 deletions example/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import java.util.Properties

plugins {
id("com.android.application")
// make sure this line comes *after* you apply the Android plugin
id("com.getkeepsafe.dexcount")
}

// local.properties is not checked in, so it is where machine-specific settings such as your mobile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@

import java.util.Date;
import java.util.Locale;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;

import timber.log.Timber;
Expand All @@ -45,6 +41,9 @@ public class MainActivity extends AppCompatActivity {

private static final String DEFAULT_USER_KEY = "user key";

/** How long startup blocks waiting for the first flags to arrive. */
private static final int INIT_WAIT_SECONDS = 10;

private LDClient ldClient;
private LDStatusListener ldStatusListener;
private LDAllFlagsListener allFlagsListener;
Expand Down Expand Up @@ -142,15 +141,12 @@ public void onCreate(Bundle savedInstanceState) {
.set("email", "fake@example.com")
.build();

Future<LDClient> initFuture = LDClient.init(this.getApplication(), ldConfig, context);
try {
ldClient = initFuture.get(10, TimeUnit.SECONDS);
updateStatusString(ldClient.getConnectionInformation());
ldClient.registerStatusListener(ldStatusListener);
ldClient.registerAllFlagsListener(allFlagsListener);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
Timber.e(e, "Exception when awaiting LaunchDarkly Client initialization");
}
// Returns the client either way: if the flags have not arrived within the wait, it is usable
// with whatever it has cached.
ldClient = LDClient.init(this.getApplication(), ldConfig, context, INIT_WAIT_SECONDS);
updateStatusString(ldClient.getConnectionInformation());
ldClient.registerStatusListener(ldStatusListener);
ldClient.registerAllFlagsListener(allFlagsListener);
}

private void setupListeners() {
Expand Down
24 changes: 22 additions & 2 deletions launchdarkly-android-client-sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,30 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments["clearPackageData"] = "true"
if (System.getenv("LD_EVENT_BENCH") == "1") {
// The device benchmark writes one results file for the class. Orchestrator's
// "pm clear" between methods would wipe it, and the runner does not inherit the
// shell environment, so the gate is passed as an instrumentation argument.
testInstrumentationRunnerArguments["clearPackageData"] = "false"
testInstrumentationRunnerArguments["LD_EVENT_BENCH"] = "1"
}
}

testOptions {
execution = "ANDROIDX_TEST_ORCHESTRATOR"
// EventPersistenceBenchmark on a device keeps one process for the class so its results
// file survives; orchestrator would "pm clear" between methods and wipe it.
execution = (System.getenv("LD_EVENT_BENCH") == "1") ? "HOST" : "ANDROIDX_TEST_ORCHESTRATOR"

// EventPersistenceBenchmark reports its measurements on stdout, which Gradle otherwise
// swallows, and it is worth re-running even when nothing has changed. Both only apply when
// LD_EVENT_BENCH is set, which is also what un-skips the benchmark, so an ordinary test run
// is unaffected.
unitTests.all { test ->
if (System.getenv("LD_EVENT_BENCH") == "1") {
test.testLogging.showStandardStreams = true
test.outputs.upToDateWhen { false }
}
}
}

buildFeatures {
Expand Down Expand Up @@ -79,7 +99,7 @@ ext.versions = [
"jacksonDatabind": "2.10.5.1",
"junit": "4.13",
"launchdarklyJavaSdkCommon": "2.4.0",
"launchdarklyJavaSdkInternal": "1.9.0",
"launchdarklyJavaSdkInternal": "1.12.1",
"launchdarklyLogging": "1.1.1",
"okhttp": "4.12.0",
"testHelpers": "2.1.0",
Expand Down
Loading
Loading