Skip to content

Commit 14b45a5

Browse files
authored
Merge pull request #2458 from DataDog/jmoskovich/prepare-rn-patch
Prepare patch version to support React Native SR
2 parents 0ecf62e + fa8411d commit 14b45a5

File tree

54 files changed

+1139
-311
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1139
-311
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 2.16.1 / 2024-12-18
2+
3+
* [IMPROVEMENT] Refactoring for React Native Session Replay support. See [#2448](https://github.com/DataDog/dd-sdk-android/pull/2448)
4+
15
# 2.16.0 / 2024-11-20
26

37
* [FEATURE] Session Replay: Create Session Replay Compose module.

buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ object AndroidConfig {
2020
const val MIN_SDK_FOR_WEAR = 23
2121
const val BUILD_TOOLS_VERSION = "35.0.0"
2222

23-
val VERSION = Version(2, 16, 0, Version.Type.Release)
23+
val VERSION = Version(2, 16, 1, Version.Type.Release)
2424
}
2525

2626
// TODO RUM-628 Switch to Java 17 bytecode

dd-sdk-android-internal/api/apiSurface

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ sealed class com.datadog.android.internal.telemetry.InternalTelemetryEvent
2929
constructor(Boolean, Boolean, Boolean, MutableMap<String, Any?> = mutableMapOf())
3030
object InterceptorInstantiated : InternalTelemetryEvent
3131
fun ByteArray.toHexString(): String
32+
object com.datadog.android.internal.utils.ImageViewUtils
33+
fun resolveParentRectAbsPosition(android.view.View): android.graphics.Rect
34+
fun calculateClipping(android.graphics.Rect, android.graphics.Rect, Float): android.graphics.Rect
35+
fun resolveContentRectWithScaling(android.widget.ImageView, android.graphics.drawable.Drawable, android.widget.ImageView.ScaleType? = null): android.graphics.Rect
36+
fun Int.densityNormalized(Float): Int
37+
fun Long.densityNormalized(Float): Long
3238
fun Throwable.loggableStackTrace(): String
3339
annotation com.datadog.tools.annotation.NoOpImplementation
3440
constructor(Boolean = false)

dd-sdk-android-internal/api/dd-sdk-android-internal.api

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,22 @@ public final class com/datadog/android/internal/utils/ByteArrayExtKt {
108108
public static final fun toHexString ([B)Ljava/lang/String;
109109
}
110110

111+
public final class com/datadog/android/internal/utils/ImageViewUtils {
112+
public static final field INSTANCE Lcom/datadog/android/internal/utils/ImageViewUtils;
113+
public final fun calculateClipping (Landroid/graphics/Rect;Landroid/graphics/Rect;F)Landroid/graphics/Rect;
114+
public final fun resolveContentRectWithScaling (Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;Landroid/widget/ImageView$ScaleType;)Landroid/graphics/Rect;
115+
public static synthetic fun resolveContentRectWithScaling$default (Lcom/datadog/android/internal/utils/ImageViewUtils;Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;Landroid/widget/ImageView$ScaleType;ILjava/lang/Object;)Landroid/graphics/Rect;
116+
public final fun resolveParentRectAbsPosition (Landroid/view/View;)Landroid/graphics/Rect;
117+
}
118+
119+
public final class com/datadog/android/internal/utils/IntExtKt {
120+
public static final fun densityNormalized (IF)I
121+
}
122+
123+
public final class com/datadog/android/internal/utils/LongExtKt {
124+
public static final fun densityNormalized (JF)J
125+
}
126+
111127
public final class com/datadog/android/internal/utils/ThrowableExtKt {
112128
public static final fun loggableStackTrace (Ljava/lang/Throwable;)Ljava/lang/String;
113129
}
Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,25 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sessionreplay.internal.utils
7+
package com.datadog.android.internal.utils
88

99
import android.graphics.Rect
1010
import android.graphics.drawable.Drawable
1111
import android.view.View
1212
import android.widget.ImageView
13-
import com.datadog.android.sessionreplay.internal.recorder.densityNormalized
14-
import com.datadog.android.sessionreplay.model.MobileSegment
1513

16-
internal object ImageViewUtils {
17-
internal fun resolveParentRectAbsPosition(view: View): Rect {
14+
/**
15+
* A collection of view utility functions for resolving absolute
16+
* positions, clipping bounds, and other useful data for
17+
* image views operations.
18+
*/
19+
object ImageViewUtils {
20+
/**
21+
* Resolves the absolute position on the screen of the given [View].
22+
* @param view the [View].
23+
* @return the [Rect] representing the absolute position of the view.
24+
*/
25+
fun resolveParentRectAbsPosition(view: View): Rect {
1826
val coords = IntArray(2)
1927
// this will always have size >= 2
2028
@Suppress("UnsafeThirdPartyFunctionCall")
@@ -31,7 +39,15 @@ internal object ImageViewUtils {
3139
)
3240
}
3341

34-
internal fun calculateClipping(parentRect: Rect, childRect: Rect, density: Float): MobileSegment.WireframeClip {
42+
/**
43+
* Calculates the clipping [Rect] of the given child [Rect] using its parent [Rect] and
44+
* the screen density.
45+
* @param parentRect the parent [Rect].
46+
* @param childRect the child [Rect].
47+
* @param density the screen density.
48+
* @return the clipping [Rect].
49+
*/
50+
fun calculateClipping(parentRect: Rect, childRect: Rect, density: Float): Rect {
3551
val left = if (childRect.left < parentRect.left) {
3652
parentRect.left - childRect.left
3753
} else {
@@ -52,18 +68,25 @@ internal object ImageViewUtils {
5268
} else {
5369
0
5470
}
55-
56-
return MobileSegment.WireframeClip(
57-
left = left.densityNormalized(density).toLong(),
58-
top = top.densityNormalized(density).toLong(),
59-
right = right.densityNormalized(density).toLong(),
60-
bottom = bottom.densityNormalized(density).toLong()
71+
return Rect(
72+
left.densityNormalized(density),
73+
top.densityNormalized(density),
74+
right.densityNormalized(density),
75+
bottom.densityNormalized(density)
6176
)
6277
}
6378

64-
internal fun resolveContentRectWithScaling(
79+
/**
80+
* Resolves the [Drawable] content [Rect] using the given [ImageView] scale type.
81+
* @param imageView the [ImageView].
82+
* @param drawable the [Drawable].
83+
* @param customScaleType optional custom [ImageView.ScaleType].
84+
* @return the resolved content [Rect].
85+
*/
86+
fun resolveContentRectWithScaling(
6587
imageView: ImageView,
66-
drawable: Drawable
88+
drawable: Drawable,
89+
customScaleType: ImageView.ScaleType? = null
6790
): Rect {
6891
val drawableWidthPx = drawable.intrinsicWidth
6992
val drawableHeightPx = drawable.intrinsicHeight
@@ -79,7 +102,7 @@ internal object ImageViewUtils {
79102

80103
val resultRect: Rect
81104

82-
when (imageView.scaleType) {
105+
when (customScaleType ?: imageView.scaleType) {
83106
ImageView.ScaleType.FIT_START -> {
84107
val contentRect = scaleRectToFitParent(parentRect, childRect)
85108
resultRect = positionRectAtStart(parentRect, contentRect)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sessionreplay.internal.recorder
7+
package com.datadog.android.internal.utils
88

99
/**
1010
* Normalizes an Int value (font size, view dimension, view position, etc.) according with the
@@ -13,7 +13,7 @@ package com.datadog.android.sessionreplay.internal.recorder
1313
* view.height/2.
1414
* @param density
1515
*/
16-
internal fun Int.densityNormalized(density: Float): Int {
16+
fun Int.densityNormalized(density: Float): Int {
1717
if (density == 0f) {
1818
return this
1919
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sessionreplay.internal.recorder
7+
package com.datadog.android.internal.utils
88

99
/**
1010
* Normalizes a Long value (font size, view dimension, view position, etc.) according with the
@@ -13,7 +13,7 @@ package com.datadog.android.sessionreplay.internal.recorder
1313
* view.height/2.
1414
* @param density
1515
*/
16-
internal fun Long.densityNormalized(density: Float): Long {
16+
fun Long.densityNormalized(density: Float): Long {
1717
if (density == 0f) {
1818
return this
1919
}

features/dd-sdk-android-session-replay-material/src/main/kotlin/com/datadog/android/sessionreplay/material/internal/ChipWireframeMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ internal class ChipWireframeMapper(
5555
height = view.chipDrawable.intrinsicHeight,
5656
usePIIPlaceholder = false,
5757
drawable = view.chipDrawable,
58+
customResourceIdCacheKey = null,
5859
asyncJobStatusCallback = asyncJobStatusCallback
5960
)
6061
backgroundWireframe?.let {

features/dd-sdk-android-session-replay-material/src/test/kotlin/com/datadog/android/sessionreplay/material/ChipWireframeMapperTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ import org.mockito.Mock
4141
import org.mockito.junit.jupiter.MockitoExtension
4242
import org.mockito.junit.jupiter.MockitoSettings
4343
import org.mockito.kotlin.any
44+
import org.mockito.kotlin.anyOrNull
4445
import org.mockito.kotlin.doReturn
4546
import org.mockito.kotlin.eq
4647
import org.mockito.kotlin.isNull
4748
import org.mockito.kotlin.mock
48-
import org.mockito.kotlin.times
4949
import org.mockito.kotlin.verify
5050
import org.mockito.kotlin.whenever
5151
import org.mockito.quality.Strictness
@@ -176,7 +176,8 @@ class ChipWireframeMapperTest {
176176
clipping = isNull(),
177177
shapeStyle = isNull(),
178178
border = isNull(),
179-
prefix = any()
179+
prefix = any(),
180+
customResourceIdCacheKey = anyOrNull()
180181
)
181182
}
182183

features/dd-sdk-android-session-replay/api/apiSurface

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,18 @@ interface com.datadog.android.sessionreplay.internal.recorder.obfuscator.StringO
5959
fun obfuscate(String): String
6060
companion object
6161
fun getStringObfuscator(): StringObfuscator
62-
class com.datadog.android.sessionreplay.internal.recorder.resources.DefaultDrawableCopier : DrawableCopier
63-
override fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
64-
interface com.datadog.android.sessionreplay.internal.recorder.resources.DrawableCopier
65-
fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
6662
data class com.datadog.android.sessionreplay.recorder.MappingContext
6763
constructor(SystemInformation, com.datadog.android.sessionreplay.utils.ImageWireframeHelper, com.datadog.android.sessionreplay.TextAndInputPrivacy, com.datadog.android.sessionreplay.ImagePrivacy, Boolean = false)
6864
interface com.datadog.android.sessionreplay.recorder.OptionSelectorDetector
6965
fun isOptionSelector(android.view.ViewGroup): Boolean
7066
data class com.datadog.android.sessionreplay.recorder.SystemInformation
7167
constructor(com.datadog.android.sessionreplay.utils.GlobalBounds, Int = Configuration.ORIENTATION_UNDEFINED, Float, String? = null)
7268
abstract class com.datadog.android.sessionreplay.recorder.mapper.BaseAsyncBackgroundWireframeMapper<T: android.view.View> : BaseWireframeMapper<T>
69+
constructor(com.datadog.android.sessionreplay.utils.ViewIdentifierResolver, com.datadog.android.sessionreplay.utils.ColorStringFormatter, com.datadog.android.sessionreplay.utils.ViewBoundsResolver, com.datadog.android.sessionreplay.utils.DrawableToColorMapper)
7370
override fun map(T, com.datadog.android.sessionreplay.recorder.MappingContext, com.datadog.android.sessionreplay.utils.AsyncJobStatusCallback, com.datadog.android.api.InternalLogger): List<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
71+
protected open fun resolveViewBackground(android.view.View, com.datadog.android.sessionreplay.recorder.MappingContext, com.datadog.android.sessionreplay.utils.AsyncJobStatusCallback, com.datadog.android.api.InternalLogger): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe?
72+
protected open fun resolveBackgroundAsShapeWireframe(android.view.View, com.datadog.android.sessionreplay.utils.GlobalBounds, Int, Int, com.datadog.android.sessionreplay.model.MobileSegment.ShapeStyle?): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe.ShapeWireframe?
73+
protected open fun resolveBackgroundAsImageWireframe(android.view.View, com.datadog.android.sessionreplay.utils.GlobalBounds, Int, Int, com.datadog.android.sessionreplay.recorder.MappingContext, com.datadog.android.sessionreplay.utils.AsyncJobStatusCallback): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe?
7474
companion object
7575
open class com.datadog.android.sessionreplay.recorder.mapper.BaseViewGroupMapper<T: android.view.ViewGroup> : BaseAsyncBackgroundWireframeMapper<T>, TraverseAllChildrenMapper<T>
7676
constructor(com.datadog.android.sessionreplay.utils.ViewIdentifierResolver, com.datadog.android.sessionreplay.utils.ColorStringFormatter, com.datadog.android.sessionreplay.utils.ViewBoundsResolver, com.datadog.android.sessionreplay.utils.DrawableToColorMapper)
@@ -83,7 +83,7 @@ class com.datadog.android.sessionreplay.recorder.mapper.EditTextMapper : TextVie
8383
override fun resolveCapturedText(android.widget.EditText, com.datadog.android.sessionreplay.TextAndInputPrivacy, Boolean): String
8484
companion object
8585
open class com.datadog.android.sessionreplay.recorder.mapper.ImageViewMapper : BaseAsyncBackgroundWireframeMapper<android.widget.ImageView>
86-
constructor(com.datadog.android.sessionreplay.utils.ViewIdentifierResolver, com.datadog.android.sessionreplay.utils.ColorStringFormatter, com.datadog.android.sessionreplay.utils.ViewBoundsResolver, com.datadog.android.sessionreplay.utils.DrawableToColorMapper)
86+
constructor(com.datadog.android.sessionreplay.utils.ViewIdentifierResolver, com.datadog.android.sessionreplay.utils.ColorStringFormatter, com.datadog.android.sessionreplay.utils.ViewBoundsResolver, com.datadog.android.sessionreplay.utils.DrawableToColorMapper, com.datadog.android.sessionreplay.recorder.resources.DrawableCopier)
8787
override fun map(android.widget.ImageView, com.datadog.android.sessionreplay.recorder.MappingContext, com.datadog.android.sessionreplay.utils.AsyncJobStatusCallback, com.datadog.android.api.InternalLogger): List<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
8888
open class com.datadog.android.sessionreplay.recorder.mapper.TextViewMapper<T: android.widget.TextView> : BaseAsyncBackgroundWireframeMapper<T>
8989
constructor(com.datadog.android.sessionreplay.utils.ViewIdentifierResolver, com.datadog.android.sessionreplay.utils.ColorStringFormatter, com.datadog.android.sessionreplay.utils.ViewBoundsResolver, com.datadog.android.sessionreplay.utils.DrawableToColorMapper)
@@ -93,6 +93,10 @@ open class com.datadog.android.sessionreplay.recorder.mapper.TextViewMapper<T: a
9393
interface com.datadog.android.sessionreplay.recorder.mapper.TraverseAllChildrenMapper<T: android.view.ViewGroup> : WireframeMapper<T>
9494
interface com.datadog.android.sessionreplay.recorder.mapper.WireframeMapper<T: android.view.View>
9595
fun map(T, com.datadog.android.sessionreplay.recorder.MappingContext, com.datadog.android.sessionreplay.utils.AsyncJobStatusCallback, com.datadog.android.api.InternalLogger): List<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
96+
class com.datadog.android.sessionreplay.recorder.resources.DefaultDrawableCopier : DrawableCopier
97+
override fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
98+
interface com.datadog.android.sessionreplay.recorder.resources.DrawableCopier
99+
fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
96100
open class com.datadog.android.sessionreplay.utils.AndroidMDrawableToColorMapper : LegacyDrawableToColorMapper
97101
constructor(List<DrawableToColorMapper> = emptyList())
98102
override fun resolveRippleDrawable(android.graphics.drawable.RippleDrawable, com.datadog.android.api.InternalLogger): Int?
@@ -126,8 +130,8 @@ data class com.datadog.android.sessionreplay.utils.GlobalBounds
126130
constructor(Long, Long, Long, Long)
127131
interface com.datadog.android.sessionreplay.utils.ImageWireframeHelper
128132
fun createImageWireframeByBitmap(Long, GlobalBounds, android.graphics.Bitmap, Float, Boolean, com.datadog.android.sessionreplay.ImagePrivacy, AsyncJobStatusCallback, com.datadog.android.sessionreplay.model.MobileSegment.WireframeClip? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeStyle? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeBorder? = null): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe?
129-
fun createImageWireframeByDrawable(android.view.View, com.datadog.android.sessionreplay.ImagePrivacy, Int, Long, Long, Int, Int, Boolean, android.graphics.drawable.Drawable, com.datadog.android.sessionreplay.internal.recorder.resources.DrawableCopier = DefaultDrawableCopier(), AsyncJobStatusCallback, com.datadog.android.sessionreplay.model.MobileSegment.WireframeClip? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeStyle? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeBorder? = null, String? = DRAWABLE_CHILD_NAME): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe?
130-
fun createCompoundDrawableWireframes(android.widget.TextView, com.datadog.android.sessionreplay.recorder.MappingContext, Int, AsyncJobStatusCallback): MutableList<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
133+
fun createImageWireframeByDrawable(android.view.View, com.datadog.android.sessionreplay.ImagePrivacy, Int, Long, Long, Int, Int, Boolean, android.graphics.drawable.Drawable, com.datadog.android.sessionreplay.recorder.resources.DrawableCopier = DefaultDrawableCopier(), AsyncJobStatusCallback, com.datadog.android.sessionreplay.model.MobileSegment.WireframeClip? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeStyle? = null, com.datadog.android.sessionreplay.model.MobileSegment.ShapeBorder? = null, String? = DRAWABLE_CHILD_NAME, String?): com.datadog.android.sessionreplay.model.MobileSegment.Wireframe?
134+
fun createCompoundDrawableWireframes(android.widget.TextView, com.datadog.android.sessionreplay.recorder.MappingContext, Int, String?, AsyncJobStatusCallback): MutableList<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
131135
companion object
132136
open class com.datadog.android.sessionreplay.utils.LegacyDrawableToColorMapper : DrawableToColorMapper
133137
constructor(List<DrawableToColorMapper> = emptyList())

0 commit comments

Comments
 (0)