diff --git a/gradle.properties b/gradle.properties index d3e3b0b4..8beaa64c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=6.0.0 +VERSION_NAME=6.0.1-SNAPSHOT POM_PACKAGING=aar GROUP=com.mixpanel.android diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java index 557ee2fe..960c356c 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; @@ -1423,6 +1424,42 @@ AnalyticsMessages getAnalyticsMessages() { assertEquals(0, anonymousUpdates.size()); } + @Test + public void testEventTiming() throws InterruptedException { + final int MAX_TIMEOUT_POLL = 6500; + Future mMockReferrerPreferences; + final BlockingQueue mStoredEvents = new LinkedBlockingQueue<>(); + mMockReferrerPreferences = new TestUtils.EmptyPreferences(InstrumentationRegistry.getInstrumentation().getContext()); + MixpanelAPI mMixpanelAPI = new MixpanelAPI(InstrumentationRegistry.getInstrumentation().getContext(), mMockReferrerPreferences, "TESTTOKEN", false, null) { + @Override + PersistentIdentity getPersistentIdentity(Context context, Future referrerPreferences, String token) { + mPersistentIdentity = super.getPersistentIdentity(context, referrerPreferences, token); + return mPersistentIdentity; + } + + }; + + mMixpanelAPI.timeEvent("Time Event"); + assertEquals(1, mPersistentIdentity.getTimeEvents().size()); + + mMixpanelAPI.track("Time Event"); + assertEquals(0, mPersistentIdentity.getTimeEvents().size()); + mMixpanelAPI.timeEvent("Time Event1"); + mMixpanelAPI.timeEvent("Time Event2"); + assertEquals(2, mPersistentIdentity.getTimeEvents().size()); + mMixpanelAPI.clearTimedEvents(); + assertEquals(0, mPersistentIdentity.getTimeEvents().size()); + mMixpanelAPI.timeEvent("Time Event3"); + mMixpanelAPI.timeEvent("Time Event4"); + mMixpanelAPI.clearTimedEvent("Time Event3"); + assertEquals(1, mPersistentIdentity.getTimeEvents().size()); + assertTrue(mPersistentIdentity.getTimeEvents().containsKey("Time Event4")); + assertFalse(mPersistentIdentity.getTimeEvents().containsKey("Time Event3")); + mMixpanelAPI.clearTimedEvent(null); + assertEquals(1, mPersistentIdentity.getTimeEvents().size()); + } + + @Test public void testSessionMetadata() throws InterruptedException, JSONException { final BlockingQueue storedJsons = new LinkedBlockingQueue<>(); @@ -1525,4 +1562,6 @@ protected void track(String eventName, JSONObject properties, boolean isAutomati private static final int POLL_WAIT_SECONDS = 10; private String mAppProperties; + + private PersistentIdentity mPersistentIdentity; } diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java index 71eb3c43..3743bb1e 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java @@ -502,6 +502,29 @@ public void timeEvent(final String eventName) { } } + /** + * Clears all current event timings. + * + */ + public void clearTimedEvents() { + synchronized (mEventTimings) { + mEventTimings.clear(); + mPersistentIdentity.clearTimedEvents(); + } + } + + /** + * Clears the event timing for an event. + * + * @param eventName the name of the timed event to clear. + */ + public void clearTimedEvent(final String eventName) { + synchronized (mEventTimings) { + mEventTimings.remove(eventName); + mPersistentIdentity.removeTimedEvent(eventName); + } + } + /** * Retrieves the time elapsed for the named event since timeEvent() was called. * @@ -1007,7 +1030,7 @@ public void optOutTracking() { mPersistentIdentity.clearPreferences(); synchronized (mEventTimings) { mEventTimings.clear(); - mPersistentIdentity.clearTimeEvents(); + mPersistentIdentity.clearTimedEvents(); } mPersistentIdentity.clearReferrerProperties(); mPersistentIdentity.setOptOutTracking(true, mToken); @@ -1996,7 +2019,7 @@ protected void track(String eventName, JSONObject properties, boolean isAutomati synchronized (mEventTimings) { eventBegin = mEventTimings.get(eventName); mEventTimings.remove(eventName); - mPersistentIdentity.removeTimeEvent(eventName); + mPersistentIdentity.removeTimedEvent(eventName); } try { diff --git a/src/main/java/com/mixpanel/android/mpmetrics/PersistentIdentity.java b/src/main/java/com/mixpanel/android/mpmetrics/PersistentIdentity.java index 4d2328e9..f4ff43b2 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/PersistentIdentity.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/PersistentIdentity.java @@ -271,7 +271,7 @@ public synchronized void clearPreferences() { } } - public void clearTimeEvents() { + public void clearTimedEvents() { try { final SharedPreferences prefs = mTimeEventsPreferences.get(); final SharedPreferences.Editor editor = prefs.edit(); @@ -304,7 +304,7 @@ public Map getTimeEvents() { } // access is synchronized outside (mEventTimings) - public void removeTimeEvent(String timeEventName) { + public void removeTimedEvent(String timeEventName) { try { final SharedPreferences prefs = mTimeEventsPreferences.get(); final SharedPreferences.Editor editor = prefs.edit();