Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
3fbaf80
Bump reactivecircus/android-emulator-runner from 2.30.1 to 2.31.0 (#3…
dependabot[bot] Jul 2, 2024
25f1ca4
Bump codecov/codecov-action from 4.3.1 to 4.5.0 (#3533)
dependabot[bot] Jul 2, 2024
e34c467
[SR] Session Replay (#3339)
romtsn Jul 15, 2024
2937c11
release: 7.12.0
getsentry-bot Jul 15, 2024
9c4170f
Merge branch 'release/7.12.0'
Jul 15, 2024
a449452
Bump github/codeql-action from 3.25.10 to 3.25.11 (#3529)
dependabot[bot] Jul 16, 2024
028e225
Bump JamesIves/github-pages-deploy-action from 4.5.0 to 4.6.1 (#3531)
dependabot[bot] Jul 16, 2024
83b0c04
Bump gradle/actions (#3532)
dependabot[bot] Jul 16, 2024
7620eac
Add sentry-android-replay module to craft and readme (#3578)
romtsn Jul 16, 2024
73237da
Check app start spans time and foreground state (#3550)
stefanosiano Jul 17, 2024
391c199
release: 7.12.1
getsentry-bot Jul 23, 2024
60865fe
Bump github/codeql-action from 3.25.11 to 3.25.13 (#3591)
dependabot[bot] Jul 23, 2024
485ff61
Bump reactivecircus/android-emulator-runner from 2.31.0 to 2.32.0 (#3…
dependabot[bot] Jul 23, 2024
74ed0f6
Bump JamesIves/github-pages-deploy-action from 4.6.1 to 4.6.3 (#3590)
dependabot[bot] Jul 23, 2024
a0423a0
Bump gradle/actions (#3597)
dependabot[bot] Jul 23, 2024
fc84053
Bump gradle/wrapper-validation-action from 3.4.2 to 3.5.0 (#3589)
dependabot[bot] Jul 23, 2024
7ee0493
Merge branch 'release/7.12.1'
Jul 25, 2024
3a89243
Bump Spring Boot to 3.3.2 (#3541)
adinauer Jul 29, 2024
e039872
[SR] Capture Replays for ANRs and crashes (#3565)
romtsn Jul 30, 2024
b64477e
release: 7.13.0
getsentry-bot Jul 30, 2024
ae2294f
Merge branch 'release/7.13.0'
Jul 31, 2024
7c34b37
Fix lazy select queries instrumentation (#3604)
stefanosiano Aug 1, 2024
09dab51
Avoid ArrayIndexOutOfBoundsException on Android cpu data collection (…
stefanosiano Aug 1, 2024
d4b1f82
[SR] ANR with buffered Replay integration test (#3612)
romtsn Aug 2, 2024
9486895
[SR] Buffer mode improvements (#3622)
romtsn Aug 9, 2024
19d98e8
[SR] Gesture/touch support for Flutter (#3623)
romtsn Aug 9, 2024
32eed6a
Fix app start spans missing from Pixel devices (#3634)
stefanosiano Aug 12, 2024
f6e97b1
[SR] Fix Session Replay crashes (#3628)
romtsn Aug 12, 2024
65295e4
release: 7.14.0
getsentry-bot Aug 12, 2024
9762f09
Merge branch 'release/7.14.0'
Aug 13, 2024
a22aea0
Verify sentry-android-replay for Google Play SDK Console (#3651)
markushi Aug 29, 2024
014dbef
[SR] Rename errorSampleRate to onErrorSampleRate (#3637)
romtsn Sep 3, 2024
70d1da1
Avoid stopping appStartProfiler after application creation (#3630)
stefanosiano Sep 3, 2024
1aaf7d1
Bump JamesIves/github-pages-deploy-action from 4.6.3 to 4.6.4 (#3681)
dependabot[bot] Sep 9, 2024
8586d1f
Bump github/codeql-action from 3.25.13 to 3.26.6 (#3672)
dependabot[bot] Sep 9, 2024
731ae5a
[SR] Detect dominant color for TextViews with Spans (#3682)
romtsn Sep 11, 2024
9e9e16d
Bump github/codeql-action from 3.26.6 to 3.26.7 (#3692)
dependabot[bot] Sep 16, 2024
80d5908
Bump gradle/actions (#3691)
dependabot[bot] Sep 16, 2024
6368d4f
[SR] Add custom redaction options (#3689)
romtsn Sep 16, 2024
61c8d80
Add support for `feedback` envelope header item type (#3687)
denrase Sep 17, 2024
6c8acb8
Bump github/codeql-action from 3.26.7 to 3.26.8 (#3708)
dependabot[bot] Sep 25, 2024
b11dc55
Ensure app context is used even when SDK is initialized via Activity …
markushi Sep 26, 2024
7e57220
Adds breadcrumb origin field (#3727)
antonis Oct 1, 2024
b5b093e
Replace Calendar.getInstance with System.currentTimeMillis for breadc…
romtsn Oct 3, 2024
955c6ee
chore(readme): Add info about updated release channels (#3773)
kahest Oct 8, 2024
503f916
[QA] Lazily load SentryOptions members (#3749)
romtsn Oct 8, 2024
1607621
[QA] Fix potential ANRs due to default integrations (#3778)
markushi Oct 9, 2024
6548825
[SR] Support Jetpack Compose redaction (#3739)
romtsn Oct 9, 2024
0ab3bb3
[SR] Change terminology from redact/ignore to mask/unmask (#3741)
romtsn Oct 9, 2024
f74af4a
release: 7.15.0
getsentry-bot Oct 9, 2024
fe8ba2c
Merge branch 'release/7.15.0'
Oct 9, 2024
f79c9c1
Deprecate `enableTracing` in v7 (#3777)
adinauer Oct 10, 2024
2ab34eb
[QA] Replace SecureRandom with vendored Random (#3783)
romtsn Oct 14, 2024
a9c767e
[QA] Move NDK scope sync to background thread (#3754)
markushi Oct 14, 2024
6259a9f
[QA] Offload System.loadLibrary call to background thread (#3670)
markushi Oct 14, 2024
9c19319
Add meta option to attach ANR thread dumps (#3791)
markushi Oct 14, 2024
8fdee54
fix invalid profiles when the transaction name is empty (#3747)
stefanosiano Oct 15, 2024
274c295
chore: Add action to warn about potentially risky PR changes (#3726)
kahest Oct 15, 2024
654c2dc
Bump reactivecircus/android-emulator-runner from 2.32.0 to 2.33.0 (#3…
dependabot[bot] Oct 16, 2024
55ea3cc
[QA] Make logging faster on startup (#3793)
romtsn Oct 16, 2024
94071da
[QA] Hardcode integration names (#3794)
romtsn Oct 16, 2024
bd82483
Fix ANRv2 test flakyness (#3798)
stefanosiano Oct 16, 2024
ee6ab95
[QA] Make replay lazy and faster (#3799)
romtsn Oct 16, 2024
31f96ce
Bump codecov/codecov-action from 4.5.0 to 4.6.0 (#3768)
dependabot[bot] Oct 17, 2024
2a8b4fe
Bump github/codeql-action from 3.26.8 to 3.26.12 (#3787)
dependabot[bot] Oct 17, 2024
87bdc75
Bump gradle/actions (#3788)
dependabot[bot] Oct 17, 2024
a8c72dd
Fix ensure ndk libs are loaded before calling close (#3797)
markushi Oct 17, 2024
eb5d294
docs(okhttp): update documented default value to match actual (#3800)
marcin-kozinski Oct 17, 2024
143f91a
Bump JamesIves/github-pages-deploy-action from 4.6.4 to 4.6.8 (#3728)
dependabot[bot] Oct 17, 2024
9182d86
[QA] Cache parsed Dsn (#3796)
stefanosiano Oct 17, 2024
f14a299
release: 7.16.0-alpha.1
getsentry-bot Oct 17, 2024
a9b3fbc
Merge branch 'release/7.16.0-alpha.1'
Oct 17, 2024
0132cdd
[QA] Replace setOf with HashSet.add (#3801)
stefanosiano Oct 17, 2024
0cc9262
[QA] Load lazy fields on init in the background (#3803)
stefanosiano Oct 18, 2024
4988d5b
test(ui): Add critical tests run by Maestro (#3802)
krystofwoldrich Oct 21, 2024
28b6ac9
ci(build): Lower gradle workers to max 2 (#3814)
krystofwoldrich Oct 23, 2024
285450b
Prepare Changelog for 7.16.0 release (#3816)
markushi Oct 23, 2024
95f6443
release: 7.16.0
getsentry-bot Oct 23, 2024
7b3de1d
Merge branch 'release/7.16.0'
Oct 23, 2024
378d12c
Bump github/codeql-action from 3.26.12 to 3.26.13 (#3808)
dependabot[bot] Oct 25, 2024
771d13f
Bump androidx test libraries (#3743)
markushi Oct 28, 2024
92ab1d9
Add callout about `addIntegrationToSdkVersion` breaking change (#3829)
romtsn Oct 28, 2024
283c6cc
Accept manifest integer values when requiring floating values (#3823)
stefanosiano Oct 28, 2024
58da2a3
update benchmark devices on saucelabs (#3822)
stefanosiano Oct 28, 2024
4c5d0ff
Bump reactivecircus/android-emulator-runner from 2.32.0 to 2.33.0 (#3…
dependabot[bot] Oct 28, 2024
c362c98
Bump github/codeql-action from 3.26.13 to 3.27.0 (#3827)
dependabot[bot] Oct 28, 2024
5183da9
test(critical): Add API Level matrix (#3810)
krystofwoldrich Oct 28, 2024
28a11a7
Use `Random` through `ThreadLocal<Random>` (#3835)
adinauer Oct 31, 2024
2af8d1a
Fix: Allow MaxBreadcrumb 0 / Expose MaxBreadcrumb metadata. (#3836)
lucas-zimerman Nov 4, 2024
fd1151b
Bump gradle/actions (#3842)
dependabot[bot] Nov 4, 2024
fba10b8
Limit emulator size to 4096M (#3875)
markushi Nov 12, 2024
566da76
Fix standalone tomcat jndi issue (#3873)
lbloder Nov 12, 2024
4bd1aa3
release: 7.17.0
getsentry-bot Nov 12, 2024
cb0ecf1
Merge branch 'release/7.17.0'
Nov 12, 2024
17a41c1
Ensure android initialization process continues even if options confi…
romtsn Nov 13, 2024
091f84e
Add support for 16KB page sizes (Android 15) (#3620)
markushi Nov 14, 2024
a183163
Do not report parsing ANR error when there are no threads (#3888)
romtsn Nov 14, 2024
dab52e2
[QA] Avoid collecting normal frames (#3782)
stefanosiano Nov 14, 2024
05024c4
Extend CheckInUtils with check-in for a specific environment
maxhov Nov 14, 2024
4a98ac5
Merge branch '8.x.x' into checkinutils-environment
adinauer Nov 18, 2024
49624de
changelog
adinauer Nov 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[SR] Change terminology from redact/ignore to mask/unmask (#3741)
* WIP

* Compose works

* Custom redaction works for Compose

* Formatting

* Clean up

* Test

* Add tests

* Changelog

* Change terminology from redact/ignore to mask/unmask

* Changelog

* [SR] Mask web and video views (#3775)

* Replace logo with sentry

* Add missing proguard rules

* formatting

* Faster boundsInWindow for compose

* api dump

* Dont use liveliterals

* Remove redundant test

* Increase timeout in failing test
  • Loading branch information
romtsn authored Oct 9, 2024
commit 0ab3bb34d63db186be39273cff42b96b1a983fe4
16 changes: 9 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@

- Add support for `feedback` envelope header item type ([#3687](https://github.com/getsentry/sentry-java/pull/3687))
- Add breadcrumb.origin field ([#3727](https://github.com/getsentry/sentry-java/pull/3727))
- Session Replay: Add options to selectively redact/ignore views from being captured. The following options are available: ([#3689](https://github.com/getsentry/sentry-java/pull/3689))
- `android:tag="sentry-redact|sentry-ignore"` in XML or `view.setTag("sentry-redact|sentry-ignore")` in code tags
- if you already have a tag set for a view, you can set a tag by id: `<tag android:id="@id/sentry_privacy" android:value="redact|ignore"/>` in XML or `view.setTag(io.sentry.android.replay.R.id.sentry_privacy, "redact|ignore")` in code
- `view.sentryReplayRedact()` or `view.sentryReplayIgnore()` extension functions
- redact/ignore `View`s of a certain type by adding fully-qualified classname to one of the lists `options.experimental.sessionReplay.addRedactViewClass()` or `options.experimental.sessionReplay.addIgnoreViewClass()`. Note, that all of the view subclasses/subtypes will be redacted/ignored as well
- For example, (this is already a default behavior) to redact all `TextView`s and their subclasses (`RadioButton`, `EditText`, etc.): `options.experimental.sessionReplay.addRedactViewClass("android.widget.TextView")`
- Session Replay: Add options to selectively mask/unmask views captured in replay. The following options are available: ([#3689](https://github.com/getsentry/sentry-java/pull/3689))
- `android:tag="sentry-mask|sentry-unmask"` in XML or `view.setTag("sentry-mask|sentry-unmask")` in code tags
- if you already have a tag set for a view, you can set a tag by id: `<tag android:id="@id/sentry_privacy" android:value="mask|unmask"/>` in XML or `view.setTag(io.sentry.android.replay.R.id.sentry_privacy, "mask|unmask")` in code
- `view.sentryReplayMask()` or `view.sentryReplayUnmask()` extension functions
- mask/unmask `View`s of a certain type by adding fully-qualified classname to one of the lists `options.experimental.sessionReplay.addMaskViewClass()` or `options.experimental.sessionReplay.addUnmaskViewClass()`. Note, that all of the view subclasses/subtypes will be masked/unmasked as well
- For example, (this is already a default behavior) to mask all `TextView`s and their subclasses (`RadioButton`, `EditText`, etc.): `options.experimental.sessionReplay.addMaskViewClass("android.widget.TextView")`
- If you're using code obfuscation, adjust your proguard-rules accordingly, so your custom view class name is not minified
- Session Replay: Support Jetpack Compose masking ([#3739](https://github.com/getsentry/sentry-java/pull/3739))
- To selectively mask/unmask @Composables, use `Modifier.sentryReplayRedact()` and `Modifier.sentryReplayIgnore()` modifiers
- To selectively mask/unmask @Composables, use `Modifier.sentryReplayMask()` and `Modifier.sentryReplayUnmask()` modifiers
- Session Replay: Mask `WebView`, `VideoView` and `androidx.media3.ui.PlayerView` by default ([#3775](https://github.com/getsentry/sentry-java/pull/3775))

### Fixes

Expand All @@ -29,6 +30,7 @@

- `options.experimental.sessionReplay.errorSampleRate` was renamed to `options.experimental.sessionReplay.onErrorSampleRate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
- Manifest option `io.sentry.session-replay.error-sample-rate` was renamed to `io.sentry.session-replay.on-error-sample-rate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
- Change `redactAllText` and `redactAllImages` to `maskAllText` and `maskAllImages` ([#3741](https://github.com/getsentry/sentry-java/pull/3741))

## 7.14.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ final class ManifestMetadataReader {

static final String REPLAYS_ERROR_SAMPLE_RATE = "io.sentry.session-replay.on-error-sample-rate";

static final String REPLAYS_REDACT_ALL_TEXT = "io.sentry.session-replay.redact-all-text";
static final String REPLAYS_MASK_ALL_TEXT = "io.sentry.session-replay.mask-all-text";

static final String REPLAYS_REDACT_ALL_IMAGES = "io.sentry.session-replay.redact-all-images";
static final String REPLAYS_MASK_ALL_IMAGES = "io.sentry.session-replay.mask-all-images";

/** ManifestMetadataReader ctor */
private ManifestMetadataReader() {}
Expand Down Expand Up @@ -409,12 +409,12 @@ static void applyMetadata(
options
.getExperimental()
.getSessionReplay()
.setRedactAllText(readBool(metadata, logger, REPLAYS_REDACT_ALL_TEXT, true));
.setMaskAllText(readBool(metadata, logger, REPLAYS_MASK_ALL_TEXT, true));

options
.getExperimental()
.getSessionReplay()
.setRedactAllImages(readBool(metadata, logger, REPLAYS_REDACT_ALL_IMAGES, true));
.setMaskAllImages(readBool(metadata, logger, REPLAYS_MASK_ALL_IMAGES, true));
}

options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1465,29 +1465,29 @@ class ManifestMetadataReaderTest {
}

@Test
fun `applyMetadata reads session replay redact flags to options`() {
fun `applyMetadata reads session replay mask flags to options`() {
// Arrange
val bundle = bundleOf(ManifestMetadataReader.REPLAYS_REDACT_ALL_TEXT to false, ManifestMetadataReader.REPLAYS_REDACT_ALL_IMAGES to false)
val bundle = bundleOf(ManifestMetadataReader.REPLAYS_MASK_ALL_TEXT to false, ManifestMetadataReader.REPLAYS_MASK_ALL_IMAGES to false)
val context = fixture.getContext(metaData = bundle)

// Act
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)

// Assert
assertTrue(fixture.options.experimental.sessionReplay.ignoreViewClasses.contains(SentryReplayOptions.IMAGE_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.ignoreViewClasses.contains(SentryReplayOptions.TEXT_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.unmaskViewClasses.contains(SentryReplayOptions.IMAGE_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.unmaskViewClasses.contains(SentryReplayOptions.TEXT_VIEW_CLASS_NAME))
}

@Test
fun `applyMetadata reads session replay redact flags to options and keeps default if not found`() {
fun `applyMetadata reads session replay mask flags to options and keeps default if not found`() {
// Arrange
val context = fixture.getContext()

// Act
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)

// Assert
assertTrue(fixture.options.experimental.sessionReplay.redactViewClasses.contains(SentryReplayOptions.IMAGE_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.redactViewClasses.contains(SentryReplayOptions.TEXT_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.maskViewClasses.contains(SentryReplayOptions.IMAGE_VIEW_CLASS_NAME))
assertTrue(fixture.options.experimental.sessionReplay.maskViewClasses.contains(SentryReplayOptions.TEXT_VIEW_CLASS_NAME))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ class SentryAndroidTest {
.untilTrue(asserted)

// assert that persisted values have changed
options.executorService.close(5000L) // finalizes all enqueued persisting tasks
options.executorService.close(10000L) // finalizes all enqueued persisting tasks
assertEquals(
"TestActivity",
PersistingScopeObserver.read(options, TRANSACTION_FILENAME, String::class.java)
Expand Down
18 changes: 9 additions & 9 deletions sentry-android-replay/api/sentry-android-replay.api
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public final class io/sentry/android/replay/GeneratedVideo {
}

public final class io/sentry/android/replay/ModifierExtensionsKt {
public static final fun sentryReplayIgnore (Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
public static final fun sentryReplayRedact (Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
public static final fun sentryReplayMask (Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
public static final fun sentryReplayUnmask (Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
}

public abstract interface class io/sentry/android/replay/Recorder : java/io/Closeable {
Expand Down Expand Up @@ -120,15 +120,15 @@ public final class io/sentry/android/replay/SentryReplayModifiers {
}

public final class io/sentry/android/replay/SessionReplayOptionsKt {
public static final fun getRedactAllImages (Lio/sentry/SentryReplayOptions;)Z
public static final fun getRedactAllText (Lio/sentry/SentryReplayOptions;)Z
public static final fun setRedactAllImages (Lio/sentry/SentryReplayOptions;Z)V
public static final fun setRedactAllText (Lio/sentry/SentryReplayOptions;Z)V
public static final fun getMaskAllImages (Lio/sentry/SentryReplayOptions;)Z
public static final fun getMaskAllText (Lio/sentry/SentryReplayOptions;)Z
public static final fun setMaskAllImages (Lio/sentry/SentryReplayOptions;Z)V
public static final fun setMaskAllText (Lio/sentry/SentryReplayOptions;Z)V
}

public final class io/sentry/android/replay/ViewExtensionsKt {
public static final fun sentryReplayIgnore (Landroid/view/View;)V
public static final fun sentryReplayRedact (Landroid/view/View;)V
public static final fun sentryReplayMask (Landroid/view/View;)V
public static final fun sentryReplayUnmask (Landroid/view/View;)V
}

public final class io/sentry/android/replay/gestures/GestureRecorder : io/sentry/android/replay/OnRootViewsChangedListener {
Expand Down Expand Up @@ -230,7 +230,7 @@ public abstract class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode {
public final fun getElevation ()F
public final fun getHeight ()I
public final fun getParent ()Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;
public final fun getShouldRedact ()Z
public final fun getShouldMask ()Z
public final fun getVisibleRect ()Landroid/graphics/Rect;
public final fun getWidth ()I
public final fun getX ()F
Expand Down
12 changes: 10 additions & 2 deletions sentry-android-replay/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
# debugging stack traces.
-keepattributes SourceFile,LineNumberTable

# Rules to detect Images/Icons and redact them
# Rules to detect Images/Icons and mask them
-dontwarn androidx.compose.ui.graphics.painter.Painter
-keepnames class * extends androidx.compose.ui.graphics.painter.Painter
-keepclasseswithmembernames class * {
androidx.compose.ui.graphics.painter.Painter painter;
}
# Rules to detect Text colors and if they have Modifier.fillMaxWidth to later redact them
# Rules to detect Text colors and if they have Modifier.fillMaxWidth to later mask them
-dontwarn androidx.compose.ui.graphics.ColorProducer
-dontwarn androidx.compose.foundation.layout.FillElement
-keepnames class androidx.compose.foundation.layout.FillElement
Expand All @@ -18,3 +18,11 @@
# Rules to detect a compose view to parse its hierarchy
-dontwarn androidx.compose.ui.platform.AndroidComposeView
-keepnames class androidx.compose.ui.platform.AndroidComposeView
# Rules to detect a media player view to later mask it
-dontwarn androidx.media3.ui.PlayerView
-keepnames class androidx.media3.ui.PlayerView
# Rules to detect a ExoPlayer view to later mask it
-dontwarn com.google.android.exoplayer2.ui.PlayerView
-keepnames class com.google.android.exoplayer2.ui.PlayerView
-dontwarn com.google.android.exoplayer2.ui.StyledPlayerView
-keepnames class com.google.android.exoplayer2.ui.StyledPlayerView
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@ public object SentryReplayModifiers {
)
}

public fun Modifier.sentryReplayRedact(): Modifier {
public fun Modifier.sentryReplayMask(): Modifier {
return semantics(
properties = {
this[SentryPrivacy] = "redact"
this[SentryPrivacy] = "mask"
}
)
}

public fun Modifier.sentryReplayIgnore(): Modifier {
public fun Modifier.sentryReplayUnmask(): Modifier {
return semantics(
properties = {
this[SentryPrivacy] = "ignore"
this[SentryPrivacy] = "unmask"
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,11 @@ internal class ScreenshotRecorder(
val viewHierarchy = ViewHierarchyNode.fromView(root, null, 0, options)
root.traverse(viewHierarchy, options)

recorder.submitSafely(options, "screenshot_recorder.redact") {
recorder.submitSafely(options, "screenshot_recorder.mask") {
val canvas = Canvas(bitmap)
canvas.setMatrix(prescaledMatrix)
viewHierarchy.traverse { node ->
if (node.shouldRedact && (node.width > 0 && node.height > 0)) {
if (node.shouldMask && (node.width > 0 && node.height > 0)) {
node.visibleRect ?: return@traverse false

// TODO: investigate why it returns true on RN when it shouldn't
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,30 @@ package io.sentry.android.replay

import io.sentry.SentryReplayOptions

// since we don't have getters for redactAllText and redactAllImages, they won't be accessible as
// since we don't have getters for maskAllText and maskAllimages, they won't be accessible as
// properties in Kotlin, therefore we create these extensions where a getter is dummy, but a setter
// delegates to the corresponding method in SentryReplayOptions

/**
* Redact all text content. Draws a rectangle of text bounds with text color on top. By default
* only views extending TextView are redacted.
* Mask all text content. Draws a rectangle of text bounds with text color on top. By default
* only views extending TextView are masked.
*
* <p>Default is enabled.
*/
var SentryReplayOptions.redactAllText: Boolean
var SentryReplayOptions.maskAllText: Boolean
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("Getter not supported")
set(value) = setRedactAllText(value)
set(value) = setMaskAllText(value)

/**
* Redact all image content. Draws a rectangle of image bounds with image's dominant color on top.
* Mask all image content. Draws a rectangle of image bounds with image's dominant color on top.
* By default only views extending ImageView with BitmapDrawable or custom Drawable type are
* redacted. ColorDrawable, InsetDrawable, VectorDrawable are all considered non-PII, as they come
* masked. ColorDrawable, InsetDrawable, VectorDrawable are all considered non-PII, as they come
* from the apk.
*
* <p>Default is enabled.
*/
var SentryReplayOptions.redactAllImages: Boolean
var SentryReplayOptions.maskAllImages: Boolean
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("Getter not supported")
set(value) = setRedactAllImages(value)
set(value) = setMaskAllImages(value)
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ package io.sentry.android.replay
import android.view.View

/**
* Marks this view to be redacted in session replay.
* Marks this view to be masked in session replay.
*/
fun View.sentryReplayRedact() {
setTag(R.id.sentry_privacy, "redact")
fun View.sentryReplayMask() {
setTag(R.id.sentry_privacy, "mask")
}

/**
* Marks this view to be ignored from redaction in session.
* Marks this view to be unmasked in session replay.
* All its content will be visible in the replay, use with caution.
*/
fun View.sentryReplayIgnore() {
setTag(R.id.sentry_privacy, "ignore")
fun View.sentryReplayUnmask() {
setTag(R.id.sentry_privacy, "unmask")
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ internal class ComposeTextLayout(internal val layout: TextLayoutResult, private
// TODO: probably most of the below we can do via bytecode instrumentation and speed up at runtime

/**
* This method is necessary to redact images in Compose.
* This method is necessary to mask images in Compose.
*
* We heuristically look up for classes that have a [Painter] modifier, usually they all have a
* `Painter` string in their name, e.g. PainterElement, PainterModifierNodeElement or
Expand Down Expand Up @@ -71,9 +71,9 @@ internal fun LayoutNode.findPainter(): Painter? {
* [androidx.compose.ui.graphics.painter.BrushPainter]
*
* In theory, [androidx.compose.ui.graphics.painter.BitmapPainter] can also come from local assets,
* but it can as well come from a network resource, so we preemptively redact it.
* but it can as well come from a network resource, so we preemptively mask it.
*/
internal fun Painter.isRedactable(): Boolean {
internal fun Painter.isMaskable(): Boolean {
val className = this::class.java.name
return !className.contains("Vector") &&
!className.contains("Color") &&
Expand All @@ -83,11 +83,11 @@ internal fun Painter.isRedactable(): Boolean {
internal data class TextAttributes(val color: Color?, val hasFillModifier: Boolean)

/**
* This method is necessary to redact text in Compose.
* This method is necessary to mask text in Compose.
*
* We heuristically look up for classes that have a [Text] modifier, usually they all have a
* `Text` string in their name, e.g. TextStringSimpleElement or TextAnnotatedStringElement. We then
* get the color from the modifier, to be able to redact it with the correct color.
* get the color from the modifier, to be able to mask it with the correct color.
*
* We also look up for classes that have a [Fill] modifier, usually they all have a `Fill` string in
* their name, e.g. FillElement. This is necessary to workaround a Compose bug where single-line
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ internal fun View.isVisibleToUser(): Pair<Boolean, Rect?> {

@SuppressLint("ObsoleteSdkInt")
@TargetApi(21)
internal fun Drawable?.isRedactable(): Boolean {
internal fun Drawable?.isMaskable(): Boolean {
// TODO: maybe find a way how to check if the drawable is coming from the apk or loaded from network
// TODO: otherwise maybe check for the bitmap size and don't redact those that take a lot of height (e.g. a background of a whatsapp chat)
// TODO: otherwise maybe check for the bitmap size and don't mask those that take a lot of height (e.g. a background of a whatsapp chat)
return when (this) {
is InsetDrawable, is ColorDrawable, is VectorDrawable, is GradientDrawable -> false
is BitmapDrawable -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ internal class SimpleVideoEncoder(
)
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate)
format.setFloat(MediaFormat.KEY_FRAME_RATE, muxerConfig.frameRate.toFloat())
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, -1) // use -1 to force always non-key frames, meaning only partial updates to save the video size
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 6) // use 6 to force non-key frames, meaning only partial updates to save the video size. Every 6th second is a key frame, which is useful for buffer mode

format
}
Expand Down
Loading