From f841da0a5a376d3a397b786af70a54f017983a1a Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 27 Oct 2026 08:46:17 +0100 Subject: [PATCH] perf(core): avoid Calendar allocations in the device date provider --- .changeset/chilly-tools-like.md | 9 ++++++ .../internal/PostHogDeviceDateProvider.kt | 8 ++--- .../internal/PostHogDeviceDateProviderTest.kt | 29 +++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 .changeset/chilly-tools-like.md create mode 100644 posthog/src/test/java/com/posthog/internal/PostHogDeviceDateProviderTest.kt diff --git a/.changeset/chilly-tools-like.md b/.changeset/chilly-tools-like.md new file mode 100644 index 000000000..70c909d75 --- /dev/null +++ b/.changeset/chilly-tools-like.md @@ -0,0 +1,9 @@ +--- +"posthog": patch +"posthog-android": patch +"posthog-server": patch +"posthog-android-surveys-compose": patch +"posthog-server-openfeature": patch +--- + +Avoid unnecessary Calendar allocations when reading device-clock timestamps. diff --git a/posthog/src/main/java/com/posthog/internal/PostHogDeviceDateProvider.kt b/posthog/src/main/java/com/posthog/internal/PostHogDeviceDateProvider.kt index 5f705a237..e771dbbf4 100644 --- a/posthog/src/main/java/com/posthog/internal/PostHogDeviceDateProvider.kt +++ b/posthog/src/main/java/com/posthog/internal/PostHogDeviceDateProvider.kt @@ -1,7 +1,6 @@ package com.posthog.internal import com.posthog.PostHogInternal -import java.util.Calendar import java.util.Date /** @@ -11,14 +10,11 @@ import java.util.Date @PostHogInternal public class PostHogDeviceDateProvider : PostHogDateProvider { override fun currentDate(): Date { - val cal = Calendar.getInstance() - return cal.time + return Date() } override fun addSecondsToCurrentDate(seconds: Int): Date { - val cal = Calendar.getInstance() - cal.add(Calendar.SECOND, seconds) - return cal.time + return Date(System.currentTimeMillis() + seconds * 1000L) } override fun currentTimeMillis(): Long { diff --git a/posthog/src/test/java/com/posthog/internal/PostHogDeviceDateProviderTest.kt b/posthog/src/test/java/com/posthog/internal/PostHogDeviceDateProviderTest.kt new file mode 100644 index 000000000..94d2802b4 --- /dev/null +++ b/posthog/src/test/java/com/posthog/internal/PostHogDeviceDateProviderTest.kt @@ -0,0 +1,29 @@ +package com.posthog.internal + +import kotlin.test.Test +import kotlin.test.assertTrue + +internal class PostHogDeviceDateProviderTest { + private val provider = PostHogDeviceDateProvider() + + @Test + fun `current date uses the wall clock`() { + val before = System.currentTimeMillis() + val actual = provider.currentDate().time + val after = System.currentTimeMillis() + + assertTrue(actual in before..after) + } + + @Test + fun `adding seconds uses elapsed milliseconds without integer overflow`() { + listOf(Int.MIN_VALUE, -3601, 0, 3601, Int.MAX_VALUE).forEach { seconds -> + val offset = seconds * 1000L + val before = System.currentTimeMillis() + offset + val actual = provider.addSecondsToCurrentDate(seconds).time + val after = System.currentTimeMillis() + offset + + assertTrue(actual in before..after, "Unexpected date for $seconds seconds: $actual") + } + } +}