Skip to content

Commit 7fe6a67

Browse files
authored
Merge pull request #3518 from DataDog/jmoskovich/pass-logger-through-mappers
Pass InternalLogger through the SR mappers
2 parents 453d040 + d8e09d6 commit 7fe6a67

36 files changed

Lines changed: 397 additions & 198 deletions

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/AbstractSemanticsNodeMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import kotlin.math.roundToInt
2121

2222
internal abstract class AbstractSemanticsNodeMapper(
2323
private val colorStringFormatter: ColorStringFormatter,
24-
private val semanticsUtils: SemanticsUtils = SemanticsUtils()
24+
protected val semanticsUtils: SemanticsUtils = SemanticsUtils()
2525
) : SemanticsNodeMapper {
2626

2727
protected val defaultTextStyle = MobileSegment.TextStyle(

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/AndroidComposeViewMapper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ internal class AndroidComposeViewMapper(
4545
view.semanticsOwner.unmergedRootSemanticsNode,
4646
density,
4747
mappingContext,
48-
asyncJobStatusCallback
48+
asyncJobStatusCallback,
49+
internalLogger
4950
)
5051
}
5152
}

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/ButtonSemanticsNodeMapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.datadog.android.sessionreplay.compose.internal.mappers.semantics
88

99
import androidx.compose.ui.semantics.SemanticsNode
10+
import com.datadog.android.api.InternalLogger
1011
import com.datadog.android.sessionreplay.compose.internal.data.SemanticsWireframe
1112
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
1213
import com.datadog.android.sessionreplay.compose.internal.utils.SemanticsUtils
@@ -15,13 +16,14 @@ import com.datadog.android.sessionreplay.utils.ColorStringFormatter
1516

1617
internal class ButtonSemanticsNodeMapper(
1718
colorStringFormatter: ColorStringFormatter,
18-
private val semanticsUtils: SemanticsUtils = SemanticsUtils()
19+
semanticsUtils: SemanticsUtils = SemanticsUtils()
1920
) : AbstractSemanticsNodeMapper(colorStringFormatter, semanticsUtils) {
2021

2122
override fun map(
2223
semanticsNode: SemanticsNode,
2324
parentContext: UiContext,
24-
asyncJobStatusCallback: AsyncJobStatusCallback
25+
asyncJobStatusCallback: AsyncJobStatusCallback,
26+
internalLogger: InternalLogger
2527
): SemanticsWireframe {
2628
return SemanticsWireframe(
2729
wireframes = resolveModifierWireframes(semanticsNode),

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/CheckboxSemanticsNodeMapper.kt

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ import com.datadog.android.sessionreplay.utils.GlobalBounds
2727

2828
internal class CheckboxSemanticsNodeMapper(
2929
colorStringFormatter: ColorStringFormatter,
30-
private val semanticsUtils: SemanticsUtils = SemanticsUtils(),
30+
semanticsUtils: SemanticsUtils = SemanticsUtils(),
3131
private val colorUtils: ColorUtils = ColorUtils(),
32-
private val logger: InternalLogger = InternalLogger.UNBOUND,
33-
private val pathUtils: PathUtils = PathUtils(logger)
32+
private val pathUtils: PathUtils = PathUtils()
3433
) : AbstractSemanticsNodeMapper(colorStringFormatter, semanticsUtils) {
3534

3635
override fun map(
3736
semanticsNode: SemanticsNode,
3837
parentContext: UiContext,
39-
asyncJobStatusCallback: AsyncJobStatusCallback
38+
asyncJobStatusCallback: AsyncJobStatusCallback,
39+
internalLogger: InternalLogger
4040
): SemanticsWireframe {
4141
val globalBounds = resolveBounds(semanticsNode)
4242

@@ -53,7 +53,8 @@ internal class CheckboxSemanticsNodeMapper(
5353
asyncJobStatusCallback = asyncJobStatusCallback,
5454
semanticsNode = semanticsNode,
5555
globalBounds = globalBounds,
56-
currentIndex = 0
56+
currentIndex = 0,
57+
internalLogger = internalLogger
5758
)
5859
}
5960

@@ -86,20 +87,22 @@ internal class CheckboxSemanticsNodeMapper(
8687
asyncJobStatusCallback: AsyncJobStatusCallback,
8788
semanticsNode: SemanticsNode,
8889
globalBounds: GlobalBounds,
89-
currentIndex: Int
90+
currentIndex: Int,
91+
internalLogger: InternalLogger
9092
): List<MobileSegment.Wireframe> {
9193
val borderColor = resolveBorderColor(semanticsNode)
9294
val rawFillColor = semanticsUtils.resolveCheckboxFillColor(semanticsNode)
9395
val rawCheckmarkColor = semanticsUtils.resolveCheckmarkColor(semanticsNode)
9496
val fillColorRgba = rawFillColor?.let { convertColor(it) } ?: DEFAULT_COLOR_WHITE
95-
val fallbackColor = parentContext.parentContentColor?.takeIf { colorUtils.isDarkColor(it) }?.let {
96-
DEFAULT_COLOR_WHITE
97-
} ?: DEFAULT_COLOR_BLACK
97+
val fallbackColor = parentContext.parentContentColor
98+
?.takeIf { colorUtils.isDarkColor(it, internalLogger) }
99+
?.let { DEFAULT_COLOR_WHITE }
100+
?: DEFAULT_COLOR_BLACK
98101
val checkmarkColorRgba = rawCheckmarkColor?.let { convertColor(it) }
99102
?: fallbackColor
100-
val parsedFillColor = colorUtils.parseColorSafe(fillColorRgba)
103+
val parsedFillColor = colorUtils.parseColorSafe(fillColorRgba, internalLogger)
101104
val isChecked = isCheckboxChecked(semanticsNode)
102-
val checkmarkColor = resolveCheckmarkColor(isChecked, checkmarkColorRgba, parsedFillColor)
105+
val checkmarkColor = resolveCheckmarkColor(isChecked, checkmarkColorRgba, parsedFillColor, internalLogger)
103106

104107
val wireframes = mutableListOf<MobileSegment.Wireframe>()
105108

@@ -108,7 +111,7 @@ internal class CheckboxSemanticsNodeMapper(
108111
.resolveCheckPath(semanticsNode)
109112

110113
val androidPath = composePath?.let { checkPath ->
111-
pathUtils.asAndroidPathSafe(checkPath)
114+
pathUtils.asAndroidPathSafe(checkPath, internalLogger)
112115
}
113116

114117
if (androidPath != null) {
@@ -151,13 +154,19 @@ internal class CheckboxSemanticsNodeMapper(
151154
semanticsNode = semanticsNode,
152155
globalBounds = globalBounds,
153156
backgroundColor = fillColorRgba,
154-
borderColor = borderColor
157+
borderColor = borderColor,
158+
internalLogger = internalLogger
155159
)
156160
}
157161

158-
private fun resolveCheckmarkColor(isChecked: Boolean, checkmarkColorRgba: String, fillColor: Int?): Int? =
162+
private fun resolveCheckmarkColor(
163+
isChecked: Boolean,
164+
checkmarkColorRgba: String,
165+
fillColor: Int?,
166+
internalLogger: InternalLogger
167+
): Int? =
159168
if (isChecked) {
160-
colorUtils.parseColorSafe(checkmarkColorRgba)
169+
colorUtils.parseColorSafe(checkmarkColorRgba, internalLogger)
161170
} else {
162171
fillColor
163172
}
@@ -174,9 +183,10 @@ internal class CheckboxSemanticsNodeMapper(
174183
semanticsNode: SemanticsNode,
175184
globalBounds: GlobalBounds,
176185
backgroundColor: String,
177-
borderColor: String
186+
borderColor: String,
187+
internalLogger: InternalLogger
178188
): List<MobileSegment.Wireframe> {
179-
val strokeColor = parentContext.parentContentColor?.takeIf { colorUtils.isDarkColor(it) }?.let {
189+
val strokeColor = parentContext.parentContentColor?.takeIf { colorUtils.isDarkColor(it, internalLogger) }?.let {
180190
DEFAULT_COLOR_WHITE
181191
} ?: DEFAULT_COLOR_BLACK
182192

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/ComposeHiddenMapper.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.datadog.android.sessionreplay.compose.internal.mappers.semantics
88

99
import androidx.compose.ui.semantics.SemanticsNode
10+
import com.datadog.android.api.InternalLogger
1011
import com.datadog.android.sessionreplay.compose.internal.data.SemanticsWireframe
1112
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
1213
import com.datadog.android.sessionreplay.compose.internal.utils.SemanticsUtils
@@ -21,7 +22,8 @@ internal class ComposeHiddenMapper(
2122
override fun map(
2223
semanticsNode: SemanticsNode,
2324
parentContext: UiContext,
24-
asyncJobStatusCallback: AsyncJobStatusCallback
25+
asyncJobStatusCallback: AsyncJobStatusCallback,
26+
internalLogger: InternalLogger
2527
): SemanticsWireframe? {
2628
val id = resolveId(semanticsNode)
2729
val viewGlobalBounds = resolveBounds(semanticsNode)

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/ComposeViewMapper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ internal class ComposeViewMapper(
4646
node,
4747
density,
4848
mappingContext,
49-
asyncJobStatusCallback
49+
asyncJobStatusCallback,
50+
internalLogger
5051
)
5152
} ?: emptyList()
5253
}

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/ContainerSemanticsNodeMapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.datadog.android.sessionreplay.compose.internal.mappers.semantics
88

99
import androidx.compose.ui.semantics.SemanticsNode
10+
import com.datadog.android.api.InternalLogger
1011
import com.datadog.android.sessionreplay.compose.internal.data.SemanticsWireframe
1112
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
1213
import com.datadog.android.sessionreplay.compose.internal.utils.SemanticsUtils
@@ -15,12 +16,13 @@ import com.datadog.android.sessionreplay.utils.ColorStringFormatter
1516

1617
internal class ContainerSemanticsNodeMapper(
1718
colorStringFormatter: ColorStringFormatter,
18-
private val semanticsUtils: SemanticsUtils = SemanticsUtils()
19+
semanticsUtils: SemanticsUtils = SemanticsUtils()
1920
) : AbstractSemanticsNodeMapper(colorStringFormatter, semanticsUtils) {
2021
override fun map(
2122
semanticsNode: SemanticsNode,
2223
parentContext: UiContext,
23-
asyncJobStatusCallback: AsyncJobStatusCallback
24+
asyncJobStatusCallback: AsyncJobStatusCallback,
25+
internalLogger: InternalLogger
2426
): SemanticsWireframe {
2527
val wireframes = resolveModifierWireframes(semanticsNode)
2628
val backgroundColor = semanticsUtils.resolveBackgroundColor(semanticsNode)?.let {

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/ImageSemanticsNodeMapper.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package com.datadog.android.sessionreplay.compose.internal.mappers.semantics
99
import androidx.compose.ui.Alignment
1010
import androidx.compose.ui.layout.ContentScale
1111
import androidx.compose.ui.semantics.SemanticsNode
12+
import com.datadog.android.api.InternalLogger
1213
import com.datadog.android.sessionreplay.compose.internal.data.BitmapInfo
1314
import com.datadog.android.sessionreplay.compose.internal.data.SemanticsWireframe
1415
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
@@ -20,16 +21,17 @@ import com.datadog.android.sessionreplay.utils.GlobalBounds
2021

2122
internal class ImageSemanticsNodeMapper(
2223
colorStringFormatter: ColorStringFormatter,
23-
private val semanticsUtils: SemanticsUtils
24+
semanticsUtils: SemanticsUtils
2425
) : AbstractSemanticsNodeMapper(colorStringFormatter, semanticsUtils) {
2526

2627
override fun map(
2728
semanticsNode: SemanticsNode,
2829
parentContext: UiContext,
29-
asyncJobStatusCallback: AsyncJobStatusCallback
30+
asyncJobStatusCallback: AsyncJobStatusCallback,
31+
internalLogger: InternalLogger
3032
): SemanticsWireframe {
3133
val containerBounds = resolveBounds(semanticsNode)
32-
val bitmapInfo = semanticsUtils.resolveSemanticsPainter(semanticsNode)
34+
val bitmapInfo = semanticsUtils.resolveSemanticsPainter(semanticsNode, internalLogger)
3335
val containerFrames = resolveModifierWireframes(semanticsNode).toMutableList()
3436
val imagePrivacy =
3537
semanticsUtils.getImagePrivacyOverride(semanticsNode) ?: parentContext.imagePrivacy

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/RadioButtonSemanticsNodeMapper.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.annotation.VisibleForTesting
1010
import androidx.compose.ui.semantics.SemanticsNode
1111
import androidx.compose.ui.semantics.SemanticsProperties
1212
import androidx.compose.ui.semantics.getOrNull
13+
import com.datadog.android.api.InternalLogger
1314
import com.datadog.android.sessionreplay.TextAndInputPrivacy
1415
import com.datadog.android.sessionreplay.compose.internal.data.SemanticsWireframe
1516
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
@@ -23,7 +24,7 @@ import com.datadog.android.sessionreplay.utils.ColorStringFormatter
2324

2425
internal class RadioButtonSemanticsNodeMapper(
2526
colorStringFormatter: ColorStringFormatter,
26-
val semanticsUtils: SemanticsUtils = SemanticsUtils(),
27+
semanticsUtils: SemanticsUtils = SemanticsUtils(),
2728
private val colorUtils: ColorUtils = ColorUtils()
2829
) : AbstractSemanticsNodeMapper(
2930
colorStringFormatter,
@@ -32,13 +33,15 @@ internal class RadioButtonSemanticsNodeMapper(
3233
override fun map(
3334
semanticsNode: SemanticsNode,
3435
parentContext: UiContext,
35-
asyncJobStatusCallback: AsyncJobStatusCallback
36+
asyncJobStatusCallback: AsyncJobStatusCallback,
37+
internalLogger: InternalLogger
3638
): SemanticsWireframe {
3739
val wireframes = mutableListOf<MobileSegment.Wireframe>()
3840

39-
val fallbackColor = parentContext.parentContentColor?.takeIf { colorUtils.isDarkColor(it) }?.let {
40-
DEFAULT_COLOR_WHITE
41-
} ?: DEFAULT_COLOR_BLACK
41+
val fallbackColor = parentContext.parentContentColor
42+
?.takeIf { colorUtils.isDarkColor(it, internalLogger) }
43+
?.let { DEFAULT_COLOR_WHITE }
44+
?: DEFAULT_COLOR_BLACK
4245

4346
val radioButtonColor = if (isMasked(parentContext)) {
4447
DEFAULT_COLOR_GRAY

features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/mappers/semantics/RootSemanticsNodeMapper.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.ui.semantics.SemanticsNode
1414
import androidx.compose.ui.semantics.SemanticsProperties
1515
import androidx.compose.ui.semantics.getOrNull
1616
import androidx.core.graphics.toRect
17+
import com.datadog.android.api.InternalLogger
1718
import com.datadog.android.sessionreplay.compose.internal.data.UiContext
1819
import com.datadog.android.sessionreplay.compose.internal.utils.SemanticsUtils
1920
import com.datadog.android.sessionreplay.compose.internal.utils.withinComposeBenchmarkSpan
@@ -36,10 +37,12 @@ internal class RootSemanticsNodeMapper(
3637
),
3738
// Text doesn't have a role in semantics, so it should be a fallback mapper.
3839
private val textSemanticsNodeMapper: TextSemanticsNodeMapper = TextSemanticsNodeMapper(
39-
colorStringFormatter
40+
colorStringFormatter,
41+
semanticsUtils
4042
),
4143
private val textFieldSemanticsNodeMapper: TextFieldSemanticsNodeMapper = TextFieldSemanticsNodeMapper(
42-
colorStringFormatter
44+
colorStringFormatter,
45+
semanticsUtils
4346
),
4447
private val containerSemanticsNodeMapper: ContainerSemanticsNodeMapper = ContainerSemanticsNodeMapper(
4548
colorStringFormatter,
@@ -60,7 +63,8 @@ internal class RootSemanticsNodeMapper(
6063
semanticsNode: SemanticsNode,
6164
density: Float,
6265
mappingContext: MappingContext,
63-
asyncJobStatusCallback: AsyncJobStatusCallback
66+
asyncJobStatusCallback: AsyncJobStatusCallback,
67+
internalLogger: InternalLogger
6468
): List<MobileSegment.Wireframe> {
6569
val wireframes = mutableListOf<MobileSegment.Wireframe>()
6670
withinComposeBenchmarkSpan(ROOT_NODE_SPAN_NAME, true) {
@@ -76,7 +80,8 @@ internal class RootSemanticsNodeMapper(
7680
imageWireframeHelper = mappingContext.imageWireframeHelper
7781
),
7882
asyncJobStatusCallback = asyncJobStatusCallback,
79-
mappingContext = mappingContext
83+
mappingContext = mappingContext,
84+
internalLogger = internalLogger
8085
)
8186
}
8287
return wireframes
@@ -90,7 +95,8 @@ internal class RootSemanticsNodeMapper(
9095
wireframes: MutableList<MobileSegment.Wireframe>,
9196
parentUiContext: UiContext,
9297
asyncJobStatusCallback: AsyncJobStatusCallback,
93-
mappingContext: MappingContext
98+
mappingContext: MappingContext,
99+
internalLogger: InternalLogger
94100
) {
95101
if (semanticsUtils.isNodePositionUnavailable(semanticsNode)) {
96102
// If we cant get the real position, we skip the node.
@@ -103,7 +109,8 @@ internal class RootSemanticsNodeMapper(
103109
composeHiddenMapper.map(
104110
semanticsNode,
105111
parentUiContext,
106-
asyncJobStatusCallback
112+
asyncJobStatusCallback,
113+
internalLogger
107114
)?.let {
108115
wireframes.addAll(it.wireframes)
109116
}
@@ -131,7 +138,8 @@ internal class RootSemanticsNodeMapper(
131138
val semanticsWireframe = mapper.map(
132139
semanticsNode = semanticsNode,
133140
parentContext = parentUiContext,
134-
asyncJobStatusCallback = asyncJobStatusCallback
141+
asyncJobStatusCallback = asyncJobStatusCallback,
142+
internalLogger = internalLogger
135143
)
136144
var currentUiContext = parentUiContext
137145
semanticsWireframe?.let {
@@ -146,7 +154,8 @@ internal class RootSemanticsNodeMapper(
146154
wireframes = wireframes,
147155
parentUiContext = currentUiContext,
148156
asyncJobStatusCallback = asyncJobStatusCallback,
149-
mappingContext = mappingContext
157+
mappingContext = mappingContext,
158+
internalLogger = internalLogger
150159
)
151160
}
152161
}

0 commit comments

Comments
 (0)