diff --git a/sdk-java/src/main/java/ly/count/sdk/java/internal/EventQueue.java b/sdk-java/src/main/java/ly/count/sdk/java/internal/EventQueue.java index ececc562..ae0e3197 100644 --- a/sdk-java/src/main/java/ly/count/sdk/java/internal/EventQueue.java +++ b/sdk-java/src/main/java/ly/count/sdk/java/internal/EventQueue.java @@ -1,10 +1,9 @@ package ly.count.sdk.java.internal; -import ly.count.sdk.java.Countly; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.annotation.Nonnull; public class EventQueue { @@ -12,19 +11,29 @@ public class EventQueue { Log L; List eventQueueMemoryCache; + protected final Object lockEQ = new Object(); + protected EventQueue() { } - protected EventQueue(@Nonnull Log logger, int eventThreshold) { + protected EventQueue(@Nonnull Log logger) { L = logger; - eventQueueMemoryCache = new ArrayList<>(eventThreshold); + eventQueueMemoryCache = new ArrayList<>(); } /** * Returns the number of events currently stored in the queue. */ protected int eqSize() { - return eventQueueMemoryCache.size(); + synchronized (lockEQ) { + return eventQueueMemoryCache.size(); + } + } + + protected List getEQ() { + synchronized (lockEQ) { + return new ArrayList<>(eventQueueMemoryCache); + } } void addEvent(@Nonnull final EventImpl event) { @@ -33,8 +42,10 @@ void addEvent(@Nonnull final EventImpl event) { return; } L.d("[EventQueue] Adding event: " + event.key); - eventQueueMemoryCache.add(event); - writeEventQueueToStorage(); + synchronized (lockEQ) { + eventQueueMemoryCache.add(event); + writeEventQueueToStorage(); + } } /** @@ -56,20 +67,22 @@ void writeEventQueueToStorage() { * Restores events from disk */ void restoreFromDisk() { - L.d("[EventQueue] Restoring events from disk"); - eventQueueMemoryCache.clear(); - - final String[] array = getEvents(); - for (String s : array) { - - final EventImpl event = EventImpl.fromJSON(s, (ev) -> { - }, L); - if (event != null) { - eventQueueMemoryCache.add(event); + synchronized (lockEQ) { + L.d("[EventQueue] Restoring events from disk"); + eventQueueMemoryCache.clear(); + + final String[] array = getEvents(); + for (String s : array) { + + final EventImpl event = EventImpl.fromJSON(s, (ev) -> { + }, L); + if (event != null) { + eventQueueMemoryCache.add(event); + } } + // order the events from least to most recent + eventQueueMemoryCache.sort((e1, e2) -> (int) (e1.timestamp - e2.timestamp)); } - // order the events from least to most recent - eventQueueMemoryCache.sort((e1, e2) -> (int) (e1.timestamp - e2.timestamp)); } @Nonnull String joinEvents(@Nonnull final Collection collection) { @@ -91,6 +104,8 @@ void restoreFromDisk() { public void clear() { SDKCore.instance.sdkStorage.storeEventQueue(""); - eventQueueMemoryCache.clear(); + synchronized (lockEQ) { + eventQueueMemoryCache.clear(); + } } } diff --git a/sdk-java/src/main/java/ly/count/sdk/java/internal/ModuleEvents.java b/sdk-java/src/main/java/ly/count/sdk/java/internal/ModuleEvents.java index d49262e7..d72fa39c 100644 --- a/sdk-java/src/main/java/ly/count/sdk/java/internal/ModuleEvents.java +++ b/sdk-java/src/main/java/ly/count/sdk/java/internal/ModuleEvents.java @@ -17,7 +17,7 @@ public class ModuleEvents extends ModuleBase { public void init(InternalConfig config) { super.init(config); L.d("[ModuleEvents] init: config = " + config); - eventQueue = new EventQueue(L, config.getEventsBufferSize()); + eventQueue = new EventQueue(L); eventQueue.restoreFromDisk(); eventsInterface = new Events(); } @@ -69,7 +69,7 @@ public void stop(InternalConfig config, final boolean clear) { private synchronized void addEventsToRequestQ(String deviceId) { L.d("[ModuleEvents] addEventsToRequestQ"); - if (eventQueue.eventQueueMemoryCache.isEmpty()) { + if (eventQueue.getEQ().isEmpty()) { L.d("[ModuleEvents] addEventsToRequestQ, eventQueueMemoryCache is empty, skipping"); return; } @@ -78,7 +78,7 @@ private synchronized void addEventsToRequestQ(String deviceId) { if (deviceId != null) { request.params.add("device_id", deviceId); } - request.params.arr("events").put(eventQueue.eventQueueMemoryCache).add(); + request.params.arr("events").put(eventQueue.getEQ()).add(); request.own(ModuleEvents.class); eventQueue.clear(); diff --git a/sdk-java/src/test/java/ly/count/sdk/java/internal/EventQueueTests.java b/sdk-java/src/test/java/ly/count/sdk/java/internal/EventQueueTests.java index cad1f0a6..4ec952d6 100644 --- a/sdk-java/src/test/java/ly/count/sdk/java/internal/EventQueueTests.java +++ b/sdk-java/src/test/java/ly/count/sdk/java/internal/EventQueueTests.java @@ -34,7 +34,7 @@ public class EventQueueTests { private void init(Config cc) { Countly.instance().init(cc); - eventQueue = new EventQueue(L, cc.getEventsBufferSize()); + eventQueue = new EventQueue(L); } @After