Skip to content

Commit 7a92c24

Browse files
RUM-7018: Refactoring for React Native Session Replay support
1 parent 551b859 commit 7a92c24

File tree

52 files changed

+1072
-307
lines changed

Some content is hidden

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

52 files changed

+1072
-307
lines changed

dd-sdk-android-internal/api/apiSurface

+6
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

+16
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
}
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)
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
}
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

+1
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

+3-2
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

+11-7
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@ interface com.datadog.android.sessionreplay.internal.recorder.obfuscator.StringO
6262
fun obfuscate(String): String
6363
companion object
6464
fun getStringObfuscator(): StringObfuscator
65-
class com.datadog.android.sessionreplay.internal.recorder.resources.DefaultDrawableCopier : DrawableCopier
66-
override fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
67-
interface com.datadog.android.sessionreplay.internal.recorder.resources.DrawableCopier
68-
fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
6965
interface com.datadog.android.sessionreplay.recorder.InteropViewCallback
7066
fun map(android.view.View, MappingContext): List<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
7167
data class com.datadog.android.sessionreplay.recorder.MappingContext
@@ -75,7 +71,11 @@ interface com.datadog.android.sessionreplay.recorder.OptionSelectorDetector
7571
data class com.datadog.android.sessionreplay.recorder.SystemInformation
7672
constructor(com.datadog.android.sessionreplay.utils.GlobalBounds, Int = Configuration.ORIENTATION_UNDEFINED, Float, String? = null)
7773
abstract class com.datadog.android.sessionreplay.recorder.mapper.BaseAsyncBackgroundWireframeMapper<T: android.view.View> : BaseWireframeMapper<T>
74+
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)
7875
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>
76+
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?
77+
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?
78+
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?
7979
companion object
8080
open class com.datadog.android.sessionreplay.recorder.mapper.BaseViewGroupMapper<T: android.view.ViewGroup> : BaseAsyncBackgroundWireframeMapper<T>, TraverseAllChildrenMapper<T>
8181
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)
@@ -88,7 +88,7 @@ class com.datadog.android.sessionreplay.recorder.mapper.EditTextMapper : TextVie
8888
override fun resolveCapturedText(android.widget.EditText, com.datadog.android.sessionreplay.TextAndInputPrivacy, Boolean): String
8989
companion object
9090
open class com.datadog.android.sessionreplay.recorder.mapper.ImageViewMapper : BaseAsyncBackgroundWireframeMapper<android.widget.ImageView>
91-
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)
91+
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)
9292
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>
9393
open class com.datadog.android.sessionreplay.recorder.mapper.TextViewMapper<T: android.widget.TextView> : BaseAsyncBackgroundWireframeMapper<T>
9494
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)
@@ -98,6 +98,10 @@ open class com.datadog.android.sessionreplay.recorder.mapper.TextViewMapper<T: a
9898
interface com.datadog.android.sessionreplay.recorder.mapper.TraverseAllChildrenMapper<T: android.view.ViewGroup> : WireframeMapper<T>
9999
interface com.datadog.android.sessionreplay.recorder.mapper.WireframeMapper<T: android.view.View>
100100
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>
101+
class com.datadog.android.sessionreplay.recorder.resources.DefaultDrawableCopier : DrawableCopier
102+
override fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
103+
interface com.datadog.android.sessionreplay.recorder.resources.DrawableCopier
104+
fun copy(android.graphics.drawable.Drawable, android.content.res.Resources): android.graphics.drawable.Drawable?
101105
open class com.datadog.android.sessionreplay.utils.AndroidMDrawableToColorMapper : LegacyDrawableToColorMapper
102106
constructor(List<DrawableToColorMapper> = emptyList())
103107
override fun resolveRippleDrawable(android.graphics.drawable.RippleDrawable, com.datadog.android.api.InternalLogger): Int?
@@ -131,8 +135,8 @@ data class com.datadog.android.sessionreplay.utils.GlobalBounds
131135
constructor(Long, Long, Long, Long)
132136
interface com.datadog.android.sessionreplay.utils.ImageWireframeHelper
133137
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?
134-
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?
135-
fun createCompoundDrawableWireframes(android.widget.TextView, com.datadog.android.sessionreplay.recorder.MappingContext, Int, AsyncJobStatusCallback): MutableList<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
138+
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?
139+
fun createCompoundDrawableWireframes(android.widget.TextView, com.datadog.android.sessionreplay.recorder.MappingContext, Int, String?, AsyncJobStatusCallback): MutableList<com.datadog.android.sessionreplay.model.MobileSegment.Wireframe>
136140
companion object
137141
open class com.datadog.android.sessionreplay.utils.LegacyDrawableToColorMapper : DrawableToColorMapper
138142
constructor(List<DrawableToColorMapper> = emptyList())

0 commit comments

Comments
 (0)