diff --git a/CHANGELOG.md b/CHANGELOG.md index 686f2d778bd..68067625432 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ - Remove the Android `enablePerformanceV2` option and its `io.sentry.performance-v2.enable` manifest metadata. Performance V2 is always on ([#6458](https://github.com/getsentry/sentry-java/pull/6458)) - App starts are measured from process start on Android 7.0+ (API 24), and slow and frozen frames are measured per span - `ActivityFramesTracker` is removed, and the `ActivityLifecycleIntegration` constructor no longer takes it +- Screenshots attached to errors and user feedback now mask all text and images by default. Turn it off with `options.screenshot.setMaskAllText(false)` and `setMaskAllImages(false)`, or the `io.sentry.screenshot.mask-all-text` and `io.sentry.screenshot.mask-all-images` manifest options. Masking needs `sentry-android-replay`, so apps that depend on `sentry-android-core` alone get no screenshot until they add it or turn masking off ([#6437](https://github.com/getsentry/sentry-java/pull/6437)) ### Improvements diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index 7695d86f0be..b50999ac1ef 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -801,13 +801,12 @@ static void applyMetadata( options.setSpotlightConnectionUrl(spotlightUrl); } - // Screenshot masking options (default to false for backwards compatibility) options .getScreenshot() - .setMaskAllText(readBool(metadata, logger, SCREENSHOT_MASK_ALL_TEXT, false)); + .setMaskAllText(readBool(metadata, logger, SCREENSHOT_MASK_ALL_TEXT, true)); options .getScreenshot() - .setMaskAllImages(readBool(metadata, logger, SCREENSHOT_MASK_ALL_IMAGES, false)); + .setMaskAllImages(readBool(metadata, logger, SCREENSHOT_MASK_ALL_IMAGES, true)); if (options.getAnrProfilingSampleRate() == null) { final double anrProfilingSampleRate = diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryScreenshotOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryScreenshotOptions.java index 6e1cceb760b..b028f7ffcc1 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryScreenshotOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryScreenshotOptions.java @@ -6,8 +6,8 @@ * Screenshot masking options for error screenshots. Extends the base {@link SentryMaskingOptions} * with screenshot-specific defaults. * - *
By default, masking is disabled for screenshots. Enable masking by calling {@link - * #setMaskAllText(boolean)} and/or {@link #setMaskAllImages(boolean)}. + *
By default, all text and images are masked. Disable masking by calling {@link + * #setMaskAllText(boolean)} and/or {@link #setMaskAllImages(boolean)} with {@code false}. * *
Note: Screenshot masking requires the {@code sentry-android-replay} module to be present at
* runtime. If masking is enabled but the replay module is not available, no screenshot is captured
@@ -16,8 +16,8 @@
public final class SentryScreenshotOptions extends SentryMaskingOptions {
public SentryScreenshotOptions() {
- // Default to NO masking until next major version.
- // maskViewClasses starts empty, so nothing is masked by default.
+ setMaskAllText(true);
+ setMaskAllImages(true);
}
@Override
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
index 657ba54cbd2..00d9cc37e3c 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
@@ -87,7 +87,7 @@ public class ScreenshotUtils {
final boolean isMaskingConfigured = !options.getScreenshot().getMaskViewClasses().isEmpty();
if (isMaskingConfigured && !isReplayAvailable) {
options
- .getLogger()
+ .getFatalLogger()
.log(SentryLevel.WARNING, "Screenshot masking requires sentry-android-replay module");
return null;
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt
index d7481c22b25..4a4dba19861 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt
@@ -2843,31 +2843,31 @@ class ManifestMetadataReaderTest {
@Test
fun `applyMetadata reads screenshot mask-all-text to options`() {
// Arrange
- val bundle = bundleOf(ManifestMetadataReader.SCREENSHOT_MASK_ALL_TEXT to true)
+ val bundle = bundleOf(ManifestMetadataReader.SCREENSHOT_MASK_ALL_TEXT to false)
val context = fixture.getContext(metaData = bundle)
// Act
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
// Assert
- assertTrue(fixture.options.screenshot.maskViewClasses.contains("android.widget.TextView"))
+ assertFalse(fixture.options.screenshot.maskViewClasses.contains("android.widget.TextView"))
}
@Test
fun `applyMetadata reads screenshot mask-all-images to options`() {
// Arrange
- val bundle = bundleOf(ManifestMetadataReader.SCREENSHOT_MASK_ALL_IMAGES to true)
+ val bundle = bundleOf(ManifestMetadataReader.SCREENSHOT_MASK_ALL_IMAGES to false)
val context = fixture.getContext(metaData = bundle)
// Act
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
// Assert
- assertTrue(fixture.options.screenshot.maskViewClasses.contains("android.widget.ImageView"))
+ assertFalse(fixture.options.screenshot.maskViewClasses.contains("android.widget.ImageView"))
}
@Test
- fun `applyMetadata without specifying screenshot mask-all-text, stays false`() {
+ fun `applyMetadata without specifying screenshot mask-all-text, stays true`() {
// Arrange
val context = fixture.getContext()
@@ -2875,11 +2875,11 @@ class ManifestMetadataReaderTest {
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
// Assert
- assertFalse(fixture.options.screenshot.maskViewClasses.contains("android.widget.TextView"))
+ assertTrue(fixture.options.screenshot.maskViewClasses.contains("android.widget.TextView"))
}
@Test
- fun `applyMetadata without specifying screenshot mask-all-images, stays false`() {
+ fun `applyMetadata without specifying screenshot mask-all-images, stays true`() {
// Arrange
val context = fixture.getContext()
@@ -2887,7 +2887,7 @@ class ManifestMetadataReaderTest {
ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider)
// Assert
- assertFalse(fixture.options.screenshot.maskViewClasses.contains("android.widget.ImageView"))
+ assertTrue(fixture.options.screenshot.maskViewClasses.contains("android.widget.ImageView"))
}
@Test
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt
index 0abb232b807..1dfb277175d 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt
@@ -73,7 +73,13 @@ class ScreenshotEventProcessorTest {
private class Fixture {
lateinit var activity: Activity
val threadChecker = mock