From 77d736cac7d76093a9655f332005174f9c7acf7d Mon Sep 17 00:00:00 2001 From: Marius Constantin Date: Fri, 15 Sep 2023 13:36:56 +0200 Subject: [PATCH] RUM-1006 Add SR functional tests for ImageButtons --- .../recorder/mapper/WireframeMapper.kt | 1 - .../consent_granted_sr_test_payload.json | 7 ++ .../sr_image_buttons_allow_payload.json | 75 ++++++++++++++++++ .../sr_image_buttons_mask_payload.json | 75 ++++++++++++++++++ ...image_buttons_mask_user_input_payload.json | 75 ++++++++++++++++++ .../sr_images_allow_payload.json | 51 ++++++++++++ .../sr_images_mask_payload.json | 51 ++++++++++++ .../sr_images_mask_user_input_payload.json | 51 ++++++++++++ .../sr_sensitive_fields_allow_payload.json | 49 ++++++++++++ .../sr_sensitive_fields_mask_payload.json | 49 ++++++++++++ ...sitive_fields_mask_user_input_payload.json | 49 ++++++++++++ .../sr_text_fields_allow_payload.json | 35 ++++++++ .../sr_text_fields_mask_payload.json | 35 ++++++++ ...r_text_fields_mask_user_input_payload.json | 35 ++++++++ ...ds_with_input_mask_user_input_payload.json | 35 ++++++++ .../sessionreplay/BaseSessionReplayTest.kt | 22 ++--- .../sessionreplay/ConsentNotGrantedSrTest.kt | 1 + .../sessionreplay/ConsentPendingSrTest.kt | 1 + .../imagebuttons/SrImageButtonsAllowTest.kt | 37 +++++++++ .../imagebuttons/SrImageButtonsMaskTest.kt | 37 +++++++++ .../SrImageButtonsMaskUserInputTest.kt | 37 +++++++++ .../sessionreplay/images/SrImagesAllowTest.kt | 37 +++++++++ .../sessionreplay/images/SrImagesMaskTest.kt | 37 +++++++++ .../images/SrImagesMaskUserInputTest.kt | 37 +++++++++ .../sdk/rules/SessionReplayTestRule.kt | 6 ++ .../integration/src/main/AndroidManifest.xml | 8 ++ .../SessionReplayImageButtonsActivity.kt | 18 +++++ .../SessionReplayImagesActivity.kt | 18 +++++ .../SessionReplayImagesAndIconsActivity.kt | 18 +++++ .../src/main/res/drawable/ic_dd_icon_red.xml | 15 ++++ .../src/main/res/drawable/ic_dd_icon_rgb.png | Bin 0 -> 3667 bytes .../main/res/drawable/ic_dd_icon_white.xml | 15 ++++ .../main/res/drawable/ic_dd_shape_oval.xml | 7 ++ .../main/res/drawable/ic_dd_shape_rect.xml | 7 ++ .../src/main/res/drawable/ic_dd_statelist.xml | 11 +++ .../res/layout/sr_image_buttons_layout.xml | 37 +++++++++ .../src/main/res/layout/sr_images_layout.xml | 30 +++++++ .../src/main/res/values/strings.xml | 7 ++ 38 files changed, 1101 insertions(+), 15 deletions(-) create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_allow_payload.json create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_payload.json create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_user_input_payload.json create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_allow_payload.json create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_payload.json create mode 100644 instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_user_input_payload.json create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsAllowTest.kt create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskTest.kt create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskUserInputTest.kt create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesAllowTest.kt create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskTest.kt create mode 100644 instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskUserInputTest.kt create mode 100644 instrumented/integration/src/main/kotlin/com/datadog/android/sdk/integration/sessionreplay/SessionReplayImageButtonsActivity.kt create mode 100644 instrumented/integration/src/main/kotlin/com/datadog/android/sdk/integration/sessionreplay/SessionReplayImagesActivity.kt create mode 100644 instrumented/integration/src/main/kotlin/com/datadog/android/sdk/integration/sessionreplay/SessionReplayImagesAndIconsActivity.kt create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_icon_red.xml create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_icon_rgb.png create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_icon_white.xml create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_shape_oval.xml create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_shape_rect.xml create mode 100644 instrumented/integration/src/main/res/drawable/ic_dd_statelist.xml create mode 100644 instrumented/integration/src/main/res/layout/sr_image_buttons_layout.xml create mode 100644 instrumented/integration/src/main/res/layout/sr_images_layout.xml diff --git a/features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/mapper/WireframeMapper.kt b/features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/mapper/WireframeMapper.kt index 7f1f9cfc73..50b6725811 100644 --- a/features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/mapper/WireframeMapper.kt +++ b/features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/mapper/WireframeMapper.kt @@ -20,7 +20,6 @@ import com.datadog.android.sessionreplay.model.MobileSegment */ interface WireframeMapper { - /** * Maps a [View] to a [List] in order to be rendered in the Session Replay player. * @param view as the [View] instance that will be mapped diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/consent_granted_sr_test_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/consent_granted_sr_test_payload.json index b78f67378f..5f9bcf76b1 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/consent_granted_sr_test_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/consent_granted_sr_test_payload.json @@ -45,6 +45,13 @@ } } }, + { + "width": 88, + "height": 48, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 88, "height": 48, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_allow_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_allow_payload.json new file mode 100644 index 0000000000..1a481f9944 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_allow_payload.json @@ -0,0 +1,75 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_payload.json new file mode 100644 index 0000000000..1a481f9944 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_payload.json @@ -0,0 +1,75 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_user_input_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_user_input_payload.json new file mode 100644 index 0000000000..1a481f9944 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_image_buttons_mask_user_input_payload.json @@ -0,0 +1,75 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 80, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 75, + "height": 80, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_allow_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_allow_payload.json new file mode 100644 index 0000000000..6fa037ebd4 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_allow_payload.json @@ -0,0 +1,51 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_payload.json new file mode 100644 index 0000000000..6fa037ebd4 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_payload.json @@ -0,0 +1,51 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_user_input_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_user_input_payload.json new file mode 100644 index 0000000000..6fa037ebd4 --- /dev/null +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_images_mask_user_input_payload.json @@ -0,0 +1,51 @@ +[{ + "type": 4, + "data": { + "width": 411, + "height": 914 + } +}, { + "type": 6, + "data": { + "has_focus": true + } +}, { + "type": 10, + "data": { + "wireframes": [ + { + "width": 411, + "height": 914, + "shapeStyle": { + "backgroundColor": "#303030ff", + "opacity": 1.0 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 80, + "height": 80, + "border": { + "color": "#000000ff", + "width": 1 + }, + "type": "shape" + }, + { + "width": 411, + "height": 56, + "type": "placeholder", + "label": "Toolbar" + } + ] + } +}] \ No newline at end of file diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_allow_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_allow_payload.json index 385b8a1dd8..3984003d76 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_allow_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_allow_payload.json @@ -22,6 +22,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -54,6 +61,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -86,6 +100,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -118,6 +139,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -150,6 +178,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -182,6 +217,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -214,6 +256,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_payload.json index 385b8a1dd8..3984003d76 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_payload.json @@ -22,6 +22,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -54,6 +61,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -86,6 +100,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -118,6 +139,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -150,6 +178,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -182,6 +217,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -214,6 +256,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_user_input_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_user_input_payload.json index 385b8a1dd8..3984003d76 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_user_input_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_sensitive_fields_mask_user_input_payload.json @@ -22,6 +22,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -54,6 +61,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -86,6 +100,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -118,6 +139,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -150,6 +178,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -182,6 +217,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -214,6 +256,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_allow_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_allow_payload.json index 8268950d95..2d5906ecbe 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_allow_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_allow_payload.json @@ -91,6 +91,13 @@ } } }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -123,6 +130,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -155,6 +169,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -187,6 +208,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -219,6 +247,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_payload.json index b331e595d5..50d7a232c5 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_payload.json @@ -91,6 +91,13 @@ } } }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -123,6 +130,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -155,6 +169,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -187,6 +208,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -219,6 +247,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_user_input_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_user_input_payload.json index d46a8b5923..fde3a14e05 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_user_input_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_mask_user_input_payload.json @@ -91,6 +91,13 @@ } } }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -123,6 +130,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -155,6 +169,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -187,6 +208,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -219,6 +247,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_with_input_mask_user_input_payload.json b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_with_input_mask_user_input_payload.json index 770fc32211..e4881d7058 100644 --- a/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_with_input_mask_user_input_payload.json +++ b/instrumented/integration/src/androidTest/assets/session_replay_payloads/sr_text_fields_with_input_mask_user_input_payload.json @@ -91,6 +91,13 @@ } } }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -123,6 +130,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -155,6 +169,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -187,6 +208,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, @@ -219,6 +247,13 @@ }, "type": "shape" }, + { + "width": 395, + "height": 44, + "type": "image", + "mimeType": "image/webp", + "isEmpty": false + }, { "width": 395, "height": 44, diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/BaseSessionReplayTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/BaseSessionReplayTest.kt index 8f020d0f3a..73375d3970 100644 --- a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/BaseSessionReplayTest.kt +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/BaseSessionReplayTest.kt @@ -245,10 +245,8 @@ internal abstract class BaseSessionReplayTest { // will be executed in Bitrise and currently Bitrise does not own a specific model for the // API 33. They only have a standard emulator for this API with the required screen size and // X,Y positions are different from the ones we have in our local emulator. - - // TODO: RUM-0000 The image wireframes where removed from the payload assertion because - // of a bug in the base64 logic making the snapshot inconsistent. We need to add this back - // and fix the base64 logic. + // Also the base64 encoded images values are inconsistent from one run to another so will + // be removed from the payload. return this.asJsonObject.apply { remove("timestamp") @@ -256,16 +254,12 @@ internal abstract class BaseSessionReplayTest { dataObject.get("wireframes")?.asJsonArray ?.mapNotNull { wireframe -> val wireframeJson = wireframe.asJsonObject - if (wireframeJson.get("type").asString == "image") { - null - } else { - wireframeJson.remove("id") - wireframeJson.remove("x") - wireframeJson.remove("y") - wireframeJson - } - } - ?.fold(JsonArray()) { acc, jsonObject -> + wireframeJson.remove("id") + wireframeJson.remove("x") + wireframeJson.remove("y") + wireframeJson.remove("base64") + wireframeJson + }?.fold(JsonArray()) { acc, jsonObject -> acc.add(jsonObject) acc }?.let { sanitizedWireframes -> diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentNotGrantedSrTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentNotGrantedSrTest.kt index 7d4b6cc580..c6c29cdd48 100644 --- a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentNotGrantedSrTest.kt +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentNotGrantedSrTest.kt @@ -14,6 +14,7 @@ import com.datadog.tools.unit.ConditionWatcher import org.assertj.core.api.Assertions.assertThat import org.junit.Rule import org.junit.Test + internal class ConsentNotGrantedSrTest : BaseSessionReplayTest() { @get:Rule diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentPendingSrTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentPendingSrTest.kt index a8f7c36b4e..7f2a5b209f 100644 --- a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentPendingSrTest.kt +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/ConsentPendingSrTest.kt @@ -14,6 +14,7 @@ import com.datadog.tools.unit.ConditionWatcher import org.assertj.core.api.Assertions.assertThat import org.junit.Rule import org.junit.Test + internal class ConsentPendingSrTest : BaseSessionReplayTest() { @get:Rule diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsAllowTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsAllowTest.kt new file mode 100644 index 0000000000..abc5726b56 --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsAllowTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.imagebuttons + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImageButtonsActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImageButtonsAllowTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImageButtonsActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.ALLOW) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_image_buttons_allow_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskTest.kt new file mode 100644 index 0000000000..8fb6b86b2f --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.imagebuttons + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImageButtonsActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImageButtonsMaskTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImageButtonsActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.MASK) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_image_buttons_mask_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskUserInputTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskUserInputTest.kt new file mode 100644 index 0000000000..4e646177fe --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/imagebuttons/SrImageButtonsMaskUserInputTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.imagebuttons + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImageButtonsActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImageButtonsMaskUserInputTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImageButtonsActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.MASK_USER_INPUT) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_image_buttons_mask_user_input_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesAllowTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesAllowTest.kt new file mode 100644 index 0000000000..48943d423e --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesAllowTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.images + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImagesActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImagesAllowTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImagesActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.ALLOW) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_images_allow_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskTest.kt new file mode 100644 index 0000000000..a31d4e6ea6 --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.images + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImagesActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImagesMaskTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImagesActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.MASK) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_images_mask_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskUserInputTest.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskUserInputTest.kt new file mode 100644 index 0000000000..a6b399e208 --- /dev/null +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/integration/sessionreplay/images/SrImagesMaskUserInputTest.kt @@ -0,0 +1,37 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.sdk.integration.sessionreplay.images + +import com.datadog.android.privacy.TrackingConsent +import com.datadog.android.sdk.integration.sessionreplay.BaseSessionReplayTest +import com.datadog.android.sdk.integration.sessionreplay.SessionReplayImagesActivity +import com.datadog.android.sdk.rules.SessionReplayTestRule +import com.datadog.android.sdk.utils.SR_PRIVACY_LEVEL +import com.datadog.android.sessionreplay.SessionReplayPrivacy +import org.junit.Rule +import org.junit.Test + +internal class SrImagesMaskUserInputTest : + BaseSessionReplayTest() { + + @get:Rule + val rule = SessionReplayTestRule( + SessionReplayImagesActivity::class.java, + trackingConsent = TrackingConsent.GRANTED, + keepRequests = true, + intentExtras = mapOf(SR_PRIVACY_LEVEL to SessionReplayPrivacy.MASK_USER_INPUT) + ) + + @Test + fun assessRecordedScreenPayload() { + runInstrumentationScenario() + assessSrPayload(EXPECTED_PAYLOAD_FILE_NAME, rule) + } + companion object { + const val EXPECTED_PAYLOAD_FILE_NAME = "sr_images_mask_user_input_payload.json" + } +} diff --git a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/rules/SessionReplayTestRule.kt b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/rules/SessionReplayTestRule.kt index 6f020cfd34..ec46b27eeb 100644 --- a/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/rules/SessionReplayTestRule.kt +++ b/instrumented/integration/src/androidTest/kotlin/com/datadog/android/sdk/rules/SessionReplayTestRule.kt @@ -21,6 +21,12 @@ internal open class SessionReplayTestRule( // region ActivityTestRule override fun beforeActivityLaunched() { + // give time to remove the previous activity. Espresso seems to have moments + // when it tries to launch the new activity while the previous one is still somehow + // in the process of being removed. This creates an issue with our SR recorder which + // calls the WindowInspector.getGlobalWindowViews() which can return the previous window + + // the current window and alters the tests. + Thread.sleep(2000) removeCallbacks(listOf(Class.forName(SESSION_REPLAY_LIFECYCLE_CALLBACK_CLASS_NAME))) super.beforeActivityLaunched() } diff --git a/instrumented/integration/src/main/AndroidManifest.xml b/instrumented/integration/src/main/AndroidManifest.xml index 6dbf77171b..d73870187c 100644 --- a/instrumented/integration/src/main/AndroidManifest.xml +++ b/instrumented/integration/src/main/AndroidManifest.xml @@ -69,6 +69,14 @@ android:name=".sessionreplay.SessionReplayTextFieldsWithInputActivity" android:label="@string/session_replay_text_fields_end_to_end" android:windowSoftInputMode="adjustResize"/> + + + + + + diff --git a/instrumented/integration/src/main/res/drawable/ic_dd_icon_rgb.png b/instrumented/integration/src/main/res/drawable/ic_dd_icon_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..62baf9983b726e5f2979758e9be2dcf49615e36c GIT binary patch literal 3667 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 literal 0 HcmV?d00001 diff --git a/instrumented/integration/src/main/res/drawable/ic_dd_icon_white.xml b/instrumented/integration/src/main/res/drawable/ic_dd_icon_white.xml new file mode 100644 index 0000000000..953c4004d2 --- /dev/null +++ b/instrumented/integration/src/main/res/drawable/ic_dd_icon_white.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/instrumented/integration/src/main/res/drawable/ic_dd_shape_oval.xml b/instrumented/integration/src/main/res/drawable/ic_dd_shape_oval.xml new file mode 100644 index 0000000000..da83159d60 --- /dev/null +++ b/instrumented/integration/src/main/res/drawable/ic_dd_shape_oval.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/instrumented/integration/src/main/res/drawable/ic_dd_shape_rect.xml b/instrumented/integration/src/main/res/drawable/ic_dd_shape_rect.xml new file mode 100644 index 0000000000..97797206e5 --- /dev/null +++ b/instrumented/integration/src/main/res/drawable/ic_dd_shape_rect.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/instrumented/integration/src/main/res/drawable/ic_dd_statelist.xml b/instrumented/integration/src/main/res/drawable/ic_dd_statelist.xml new file mode 100644 index 0000000000..4963c27cdf --- /dev/null +++ b/instrumented/integration/src/main/res/drawable/ic_dd_statelist.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/instrumented/integration/src/main/res/layout/sr_image_buttons_layout.xml b/instrumented/integration/src/main/res/layout/sr_image_buttons_layout.xml new file mode 100644 index 0000000000..106bfb404a --- /dev/null +++ b/instrumented/integration/src/main/res/layout/sr_image_buttons_layout.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/instrumented/integration/src/main/res/layout/sr_images_layout.xml b/instrumented/integration/src/main/res/layout/sr_images_layout.xml new file mode 100644 index 0000000000..1da23f7847 --- /dev/null +++ b/instrumented/integration/src/main/res/layout/sr_images_layout.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/instrumented/integration/src/main/res/values/strings.xml b/instrumented/integration/src/main/res/values/strings.xml index a5a4ce3cda..e642b15558 100644 --- a/instrumented/integration/src/main/res/values/strings.xml +++ b/instrumented/integration/src/main/res/values/strings.xml @@ -65,6 +65,13 @@ App Compat Spinner App Compat Switch Material Switch + default image button bundled + default image button + app compat image button + Session Replay Image Buttons (End to End) + Session Replay Images (End to End) + image view + app compat image view \ No newline at end of file