From 94d44c4cf09965cad697b9f0acbdeb880355468f Mon Sep 17 00:00:00 2001 From: xiaoweii Date: Mon, 25 Sep 2023 22:34:39 +0800 Subject: [PATCH] fix: verify engagement time not contains in first screen view when app warm started. --- .../clickstream/ActivityLifecycleManager.java | 9 ++++- .../client/AutoRecordEventClient.java | 7 ++++ .../AutoRecordEventClientTest.java | 35 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/clickstream/src/main/java/software/aws/solution/clickstream/ActivityLifecycleManager.java b/clickstream/src/main/java/software/aws/solution/clickstream/ActivityLifecycleManager.java index e009d39..9c7bdc7 100644 --- a/clickstream/src/main/java/software/aws/solution/clickstream/ActivityLifecycleManager.java +++ b/clickstream/src/main/java/software/aws/solution/clickstream/ActivityLifecycleManager.java @@ -37,6 +37,7 @@ **/ final class ActivityLifecycleManager implements Application.ActivityLifecycleCallbacks, LifecycleEventObserver { private static final Log LOG = LogFactory.getLog(ActivityLifecycleManager.class); + private static boolean isFromForeground; private final SessionClient sessionClient; private final AutoRecordEventClient autoRecordEventClient; @@ -84,9 +85,14 @@ public void onActivityResumed(final Activity activity) { ScreenRefererTool.isSameScreen(activity.getClass().getCanonicalName(), activity.getClass().getSimpleName(), autoRecordEventClient.getScreenUniqueId(activity)); if (ScreenRefererTool.getCurrentScreenName() != null && !isSameScreen) { - autoRecordEventClient.recordUserEngagement(); + if (!isFromForeground) { + autoRecordEventClient.recordUserEngagement(); + } else { + autoRecordEventClient.resetLastEngageTime(); + } } autoRecordEventClient.recordViewScreen(activity); + isFromForeground = false; } @Override @@ -127,6 +133,7 @@ public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner, @NonNull Life autoRecordEventClient.flushEvents(); } else if (event == Lifecycle.Event.ON_START) { LOG.debug("Application entered the foreground."); + isFromForeground = true; autoRecordEventClient.handleAppStart(); boolean isNewSession = sessionClient.initialSession(); if (isNewSession) { diff --git a/clickstream/src/main/java/software/aws/solution/clickstream/client/AutoRecordEventClient.java b/clickstream/src/main/java/software/aws/solution/clickstream/client/AutoRecordEventClient.java index 290467f..498bad0 100644 --- a/clickstream/src/main/java/software/aws/solution/clickstream/client/AutoRecordEventClient.java +++ b/clickstream/src/main/java/software/aws/solution/clickstream/client/AutoRecordEventClient.java @@ -157,6 +157,13 @@ public void updateStartEngageTimestamp() { startEngageTimestamp = System.currentTimeMillis(); } + /** + * reset last engagement time when app warm start. + */ + public void resetLastEngageTime() { + lastEngageTime = 0; + } + /** * check and record _app_update event. */ diff --git a/clickstream/src/test/java/software/aws/solution/clickstream/AutoRecordEventClientTest.java b/clickstream/src/test/java/software/aws/solution/clickstream/AutoRecordEventClientTest.java index b6895e2..3db6205 100644 --- a/clickstream/src/test/java/software/aws/solution/clickstream/AutoRecordEventClientTest.java +++ b/clickstream/src/test/java/software/aws/solution/clickstream/AutoRecordEventClientTest.java @@ -450,6 +450,41 @@ public void testPreviousTimestampInTwoScreenViewEvent() throws Exception { } } + /** + * test app warm start without engagement_mesc attribute. + * + * @throws Exception exception. + */ + @Test + public void testAppWarmStartWithoutEngagementTime() throws Exception { + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START); + Activity activityA = mock(ActivityA.class); + + Bundle bundle = mock(Bundle.class); + callbacks.onActivityCreated(activityA, bundle); + callbacks.onActivityStarted(activityA); + callbacks.onActivityResumed(activityA); + callbacks.onActivityPaused(activityA); + callbacks.onActivityDestroyed(activityA); + + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START); + + Activity activityA1 = mock(ActivityA.class); + callbacks.onActivityCreated(activityA1, bundle); + callbacks.onActivityStarted(activityA1); + callbacks.onActivityResumed(activityA1); + + try (Cursor cursor = dbUtil.queryAllEvents()) { + cursor.moveToLast(); + String eventString = cursor.getString(2); + JSONObject jsonObject = new JSONObject(eventString); + String eventName = jsonObject.getString("event_type"); + assertEquals(Event.PresetEvent.SCREEN_VIEW, eventName); + JSONObject attributes = jsonObject.getJSONObject("attributes"); + Assert.assertFalse(attributes.has(ReservedAttribute.ENGAGEMENT_TIMESTAMP)); + } + } /** * test app version not update.