Skip to content

Commit e33666e

Browse files
committed
chore: Accept frameTimeSeconds as double, not nanos as long
1 parent c553c5f commit e33666e

File tree

10 files changed

+37
-34
lines changed

10 files changed

+37
-34
lines changed

features/dd-sdk-android-rum/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ interface com.datadog.android.rum.RumSessionListener
162162
class com.datadog.android.rum._RumInternalProxy
163163
fun addLongTask(Long, String)
164164
fun updatePerformanceMetric(RumPerformanceMetric, Double)
165+
fun updateExternalRefreshRate(Double)
165166
fun setInternalViewAttribute(String, Any?)
166167
fun setSyntheticsAttribute(String?, String?)
167168
fun enableJankStatsTracking(android.app.Activity)

features/dd-sdk-android-rum/api/dd-sdk-android-rum.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ public final class com/datadog/android/rum/_RumInternalProxy {
241241
public final fun enableJankStatsTracking (Landroid/app/Activity;)V
242242
public final fun setInternalViewAttribute (Ljava/lang/String;Ljava/lang/Object;)V
243243
public final fun setSyntheticsAttribute (Ljava/lang/String;Ljava/lang/String;)V
244+
public final fun updateExternalRefreshRate (D)V
244245
public final fun updatePerformanceMetric (Lcom/datadog/android/rum/RumPerformanceMetric;D)V
245246
}
246247

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/_RumInternalProxy.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ class _RumInternalProxy internal constructor(private val rumMonitor: AdvancedRum
4545
rumMonitor.updatePerformanceMetric(metric, value)
4646
}
4747

48-
fun updateExternalRefreshRate(frameTimeNanos: Long) {
49-
rumMonitor.updateExternalRefreshRate(frameTimeNanos)
48+
fun updateExternalRefreshRate(frameTimeSeconds: Double) {
49+
rumMonitor.updateExternalRefreshRate(frameTimeSeconds)
5050
}
5151

5252
fun setInternalViewAttribute(key: String, value: Any?) {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumRawEvent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ internal sealed class RumRawEvent {
218218
) : RumRawEvent()
219219

220220
internal data class UpdateExternalRefreshRate(
221-
val frameTimeNanos: Long,
221+
val frameTimeSeconds: Double,
222222
override val eventTime: Time = Time()
223223
) : RumRawEvent()
224224

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumViewScope.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -643,9 +643,9 @@ internal open class RumViewScope(
643643
) {
644644
if (stopped) return
645645

646-
// Convert frame time (nanoseconds) to refresh rate (Hz)
647-
val refreshRateHz = if (event.frameTimeNanos > 0) {
648-
1_000_000_000.0 / event.frameTimeNanos.toDouble()
646+
// Convert frame time (seconds) to refresh rate (Hz)
647+
val refreshRateHz = if (event.frameTimeSeconds > 0) {
648+
1.0 / event.frameTimeSeconds
649649
} else {
650650
return // Invalid frame time
651651
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/monitor/AdvancedRumMonitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ internal interface AdvancedRumMonitor : RumMonitor, AdvancedNetworkRumMonitor {
4949

5050
fun updatePerformanceMetric(metric: RumPerformanceMetric, value: Double)
5151

52-
fun updateExternalRefreshRate(frameTimeNanos: Long)
52+
fun updateExternalRefreshRate(frameTimeSeconds: Double)
5353

5454
fun setInternalViewAttribute(key: String, value: Any?)
5555

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/monitor/DatadogRumMonitor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,8 @@ internal class DatadogRumMonitor(
631631
handleEvent(RumRawEvent.UpdatePerformanceMetric(metric, value))
632632
}
633633

634-
override fun updateExternalRefreshRate(frameTimeNanos: Long) {
635-
handleEvent(RumRawEvent.UpdateExternalRefreshRate(frameTimeNanos))
634+
override fun updateExternalRefreshRate(frameTimeSeconds: Double) {
635+
handleEvent(RumRawEvent.UpdateExternalRefreshRate(frameTimeSeconds))
636636
}
637637

638638
override fun setInternalViewAttribute(key: String, value: Any?) {

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/RumInternalProxyTest.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.app.Activity
1010
import com.datadog.android.rum.internal.monitor.AdvancedRumMonitor
1111
import com.datadog.android.rum.utils.forge.Configurator
1212
import fr.xgouchet.elmyr.Forge
13+
import fr.xgouchet.elmyr.annotation.DoubleForgery
1314
import fr.xgouchet.elmyr.annotation.LongForgery
1415
import fr.xgouchet.elmyr.annotation.StringForgery
1516
import fr.xgouchet.elmyr.junit5.ForgeConfiguration
@@ -66,17 +67,17 @@ internal class RumInternalProxyTest {
6667

6768
@Test
6869
fun `M proxy updateExternalRefreshRate to RumMonitor W updateExternalRefreshRate()`(
69-
@LongForgery frameTimeNanos: Long
70+
@DoubleForgery(min = 0.001, max = 1.0) frameTimeSeconds: Double
7071
) {
7172
// Given
7273
val mockRumMonitor = mock(AdvancedRumMonitor::class.java)
7374
val proxy = _RumInternalProxy(mockRumMonitor)
7475

7576
// When
76-
proxy.updateExternalRefreshRate(frameTimeNanos)
77+
proxy.updateExternalRefreshRate(frameTimeSeconds)
7778

7879
// Then
79-
verify(mockRumMonitor).updateExternalRefreshRate(frameTimeNanos)
80+
verify(mockRumMonitor).updateExternalRefreshRate(frameTimeSeconds)
8081
}
8182

8283
@Test

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/internal/domain/scope/RumViewScopeTest.kt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7870,12 +7870,12 @@ internal class RumViewScopeTest {
78707870
forge: Forge
78717871
) {
78727872
// GIVEN
7873-
val frameTimeNanos = forge.aLong(min = 1_000_000L, max = 50_000_000L) // 1ms to 50ms
7874-
val expectedRefreshRate = 1_000_000_000.0 / frameTimeNanos.toDouble()
7873+
val frameTimeSeconds = forge.aDouble(min = 0.001, max = 0.05) // 1ms to 50ms
7874+
val expectedRefreshRate = 1.0 / frameTimeSeconds
78757875

78767876
// WHEN
78777877
testedScope.handleEvent(
7878-
RumRawEvent.UpdateExternalRefreshRate(frameTimeNanos),
7878+
RumRawEvent.UpdateExternalRefreshRate(frameTimeSeconds),
78797879
mockWriter
78807880
)
78817881
val result = testedScope.handleEvent(
@@ -7898,8 +7898,8 @@ internal class RumViewScopeTest {
78987898
forge: Forge
78997899
) {
79007900
// GIVEN
7901-
val frameTimesNanos = forge.aList(size = 5) {
7902-
aLong(min = 8_000_000L, max = 20_000_000L) // ~50-125 FPS range
7901+
val frameTimesSeconds = forge.aList(size = 5) {
7902+
aDouble(min = 0.008, max = 0.02) // ~50-125 FPS range
79037903
}
79047904

79057905
var sum = 0.0
@@ -7908,8 +7908,8 @@ internal class RumViewScopeTest {
79087908
val refreshRates = mutableListOf<Double>()
79097909

79107910
// WHEN
7911-
frameTimesNanos.forEach { frameTime ->
7912-
val refreshRate = 1_000_000_000.0 / frameTime.toDouble()
7911+
frameTimesSeconds.forEach { frameTime ->
7912+
val refreshRate = 1.0 / frameTime
79137913
refreshRates.add(refreshRate)
79147914
sum += refreshRate
79157915
min = kotlin.math.min(min, refreshRate)
@@ -7941,7 +7941,7 @@ internal class RumViewScopeTest {
79417941
fun `M ignore invalid frame time W handleEvent(UpdateExternalRefreshRate+KeepAlive) { zero frame time }`() {
79427942
// WHEN
79437943
testedScope.handleEvent(
7944-
RumRawEvent.UpdateExternalRefreshRate(0L),
7944+
RumRawEvent.UpdateExternalRefreshRate(0.0),
79457945
mockWriter
79467946
)
79477947
val result = testedScope.handleEvent(
@@ -7964,7 +7964,7 @@ internal class RumViewScopeTest {
79647964
forge: Forge
79657965
) {
79667966
// GIVEN
7967-
val negativeFrameTime = -forge.aLong(min = 1L, max = 1_000_000L)
7967+
val negativeFrameTime = -forge.aDouble(min = 0.001, max = 1.0)
79687968

79697969
// WHEN
79707970
testedScope.handleEvent(
@@ -7991,8 +7991,8 @@ internal class RumViewScopeTest {
79917991
forge: Forge
79927992
) {
79937993
// GIVEN
7994-
val externalFrameTime = forge.aLong(min = 16_000_000L, max = 17_000_000L) // ~60 FPS
7995-
val expectedExternalRefreshRate = 1_000_000_000.0 / externalFrameTime.toDouble()
7994+
val externalFrameTime = forge.aDouble(min = 0.016, max = 0.017) // ~60 FPS
7995+
val expectedExternalRefreshRate = 1.0 / externalFrameTime
79967996

79977997
val internalRefreshRate = forge.aDouble(min = 30.0, max = 45.0) // Different range
79987998
val listenerCaptor = argumentCaptor<VitalListener> {
@@ -8059,11 +8059,11 @@ internal class RumViewScopeTest {
80598059
) {
80608060
// GIVEN
80618061
testedScope.handleEvent(RumRawEvent.StopView(fakeKey, emptyMap()), mockWriter)
8062-
val frameTimeNanos = forge.aLong(min = 16_000_000L, max = 17_000_000L)
8062+
val frameTimeSeconds = forge.aDouble(min = 0.016, max = 0.017)
80638063

80648064
// WHEN
80658065
val result = testedScope.handleEvent(
8066-
RumRawEvent.UpdateExternalRefreshRate(frameTimeNanos),
8066+
RumRawEvent.UpdateExternalRefreshRate(frameTimeSeconds),
80678067
mockWriter
80688068
)
80698069

@@ -8075,13 +8075,13 @@ internal class RumViewScopeTest {
80758075
@Test
80768076
fun `M accumulate external refresh rate samples correctly W multiple updates`() {
80778077
// GIVEN
8078-
val frameTime1 = 16_666_667L // 60 FPS
8079-
val frameTime2 = 33_333_333L // 30 FPS
8080-
val frameTime3 = 11_111_111L // 90 FPS
8078+
val frameTime1 = 1.0 / 60.0 // 60 FPS
8079+
val frameTime2 = 1.0 / 30.0 // 30 FPS
8080+
val frameTime3 = 1.0 / 90.0 // 90 FPS
80818081

8082-
val refreshRate1 = 1_000_000_000.0 / frameTime1.toDouble()
8083-
val refreshRate2 = 1_000_000_000.0 / frameTime2.toDouble()
8084-
val refreshRate3 = 1_000_000_000.0 / frameTime3.toDouble()
8082+
val refreshRate1 = 1.0 / frameTime1
8083+
val refreshRate2 = 1.0 / frameTime2
8084+
val refreshRate3 = 1.0 / frameTime3
80858085

80868086
val expectedAverage = (refreshRate1 + refreshRate2 + refreshRate3) / 3.0
80878087
val expectedMin = kotlin.math.min(refreshRate2, kotlin.math.min(refreshRate1, refreshRate3))

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/internal/monitor/DatadogRumMonitorTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,10 +2003,10 @@ internal class DatadogRumMonitorTest {
20032003
forge: Forge
20042004
) {
20052005
// Given
2006-
val frameTimeNanos = forge.aLong(min = 1_000_000L, max = 50_000_000L)
2006+
val frameTimeSeconds = forge.aDouble(min = 0.001, max = 1.0)
20072007

20082008
// When
2009-
testedMonitor.updateExternalRefreshRate(frameTimeNanos)
2009+
testedMonitor.updateExternalRefreshRate(frameTimeSeconds)
20102010
Thread.sleep(PROCESSING_DELAY)
20112011

20122012
// Then
@@ -2015,7 +2015,7 @@ internal class DatadogRumMonitorTest {
20152015
capture(),
20162016
eq(mockWriter)
20172017
)
2018-
assertThat(lastValue.frameTimeNanos).isEqualTo(frameTimeNanos)
2018+
assertThat(lastValue.frameTimeSeconds).isEqualTo(frameTimeSeconds)
20192019
}
20202020
}
20212021

0 commit comments

Comments
 (0)