diff --git a/src/main/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXIntegration.java b/src/main/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXIntegration.java index d2f1c72..6fe39de 100644 --- a/src/main/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXIntegration.java +++ b/src/main/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXIntegration.java @@ -48,6 +48,7 @@ public class OptimizelyXIntegration extends Integration { static final Options options = new Options().setIntegration(OPTIMIZELYX_KEY, false); private Map attributes = new HashMap<>(); List trackEvents = new ArrayList<>(); + private ScheduledExecutorService scheduler; private final Handler handler = new Handler(); public static Factory factory(OptimizelyManager manager) { @@ -88,7 +89,7 @@ public OptimizelyXIntegration( client.addNotificationListener(listener); } } else { - pollOptimizelyClient(manager, analytics); + pollScheduler(manager, analytics); } } @@ -107,22 +108,49 @@ public void identify(IdentifyPayload identify) { public void track(TrackPayload track) { super.track(track); - int queueSize = trackEvents.size(); + if (!client.isValid()) { + enqueueTrack(track); + return; + } + trackEvent(track); + } - synchronized (this) { - if (!client.isValid()) { - logger.verbose("Optimizely not initialized. Enqueueing action: %s", track); - if (queueSize >= 100) { - logger.verbose( - "Event queue has exceeded limit. Dropping event at index zero: %s", - trackEvents.get(0)); - trackEvents.remove(0); - } - trackEvents.add(track); - return; - } + @Override + public void reset() { + super.reset(); + + client.removeNotificationListener(listener); + logger.verbose("client.removeNotificationListener(listener)"); + } + + private void pollScheduler(final OptimizelyManager manager, final Analytics analytics) { + this.scheduler = Executors.newScheduledThreadPool(1); + + final Runnable poll = + new Runnable() { + @Override + public void run() { + handler.post( + new Runnable() { + @Override + public void run() { + checkClient(manager, analytics); + } + }); + } + }; + scheduler.scheduleAtFixedRate(poll, 60, 60, SECONDS); + } + + private void checkClient(OptimizelyManager manager, Analytics analytics) { + this.client = manager.getOptimizely(); + if (client.isValid()) { + scheduler.shutdown(); + setClientAndFlushTracks(analytics); } + } + private void trackEvent(TrackPayload track) { // Segment will default sending `track` calls with `anonymousId`s since Optimizely X does not alias known and unknown users // https://developers.optimizely.com/x/solutions/sdks/reference/index.html?language=objectivec&platform=mobile#user-ids String userId = track.userId(); @@ -146,37 +174,16 @@ public void track(TrackPayload track) { logger.verbose("client.track(%s, %s, %s, %s)", event, id, attributes, properties); } - @Override - public void reset() { - super.reset(); - - client.removeNotificationListener(listener); - logger.verbose("client.removeNotificationListener(listener)"); - } - - private void pollOptimizelyClient(final OptimizelyManager manager, final Analytics analytics) { - final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private void enqueueTrack(TrackPayload track) { + int queueSize = trackEvents.size(); - final Runnable poll = - new Runnable() { - @Override - public void run() { - synchronized (OptimizelyXIntegration.this) { - OptimizelyXIntegration.this.client = manager.getOptimizely(); - } - if (client.isValid()) { - handler.post( - new Runnable() { - @Override - public void run() { - setClientAndFlushTracks(analytics); - } - }); - scheduler.shutdown(); - } - } - }; - scheduler.scheduleAtFixedRate(poll, 60, 60, SECONDS); + if (queueSize >= 100) { + logger.verbose( + "Event queue has exceeded limit. Dropping event at index zero: %s", trackEvents.get(0)); + trackEvents.remove(0); + } + trackEvents.add(track); + logger.verbose("Optimizely not initialized. Enqueueing action: %s", track); } void setClientAndFlushTracks(Analytics analytics) { @@ -185,7 +192,7 @@ void setClientAndFlushTracks(Analytics analytics) { logger.verbose("Flushing track queue"); for (TrackPayload t : trackEvents) { - track(t); + trackEvent(t); } trackEvents = null; diff --git a/src/test/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXTest.java b/src/test/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXTest.java index c83aa5e..2f68648 100644 --- a/src/test/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXTest.java +++ b/src/test/java/com/segment/analytics/android/integrations/optimizelyx/OptimizelyXTest.java @@ -118,7 +118,7 @@ public class OptimizelyXTest { verify(client).track("event", "123", attributes, properties.toStringMap()); } - @Test public void pollOptimizelyClient() { + @Test public void flushTrackEventQueue() { Properties properties = new Properties(); Traits traits = new Traits() .putValue("anonymousId", "456");