From fc20d26ee9aa7cb1d5dfd91916a3b41237a8fe30 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 14 Nov 2022 16:04:19 +0100 Subject: [PATCH 01/28] Fix do not add screenshots if should not apply scope data, make setCurrentActivity public --- .../android/core/ScreenshotEventProcessor.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 48e99e7ad3..500b8d7872 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -17,6 +17,7 @@ import io.sentry.Hint; import io.sentry.SentryEvent; import io.sentry.SentryLevel; +import io.sentry.util.HintUtils; import io.sentry.util.Objects; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -51,10 +52,18 @@ public ScreenshotEventProcessor( application.registerActivityLifecycleCallbacks(this); } + public void setCurrentActivity(@NonNull Activity activity) { + if (currentActivity != null && currentActivity.get() == activity) { + return; + } + currentActivity = new WeakReference<>(activity); + } + @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { - if (!lifecycleCallbackInstalled) { + if (!lifecycleCallbackInstalled + || !HintUtils.shouldApplyScopeData(hint)) { return event; } if (!options.isAttachScreenshot()) { @@ -167,13 +176,6 @@ private void cleanCurrentActivity(@NonNull Activity activity) { } } - private void setCurrentActivity(@NonNull Activity activity) { - if (currentActivity != null && currentActivity.get() == activity) { - return; - } - currentActivity = new WeakReference<>(activity); - } - @SuppressLint("NewApi") private boolean isActivityValid(@Nullable Activity activity) { if (activity == null) { From d9a2e695d8afa827460a3f88343b4f109576e29e Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 14 Nov 2022 15:14:33 +0000 Subject: [PATCH 02/28] Format code --- .../java/io/sentry/android/core/ScreenshotEventProcessor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 500b8d7872..a02ede3d5d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -62,8 +62,7 @@ public void setCurrentActivity(@NonNull Activity activity) { @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { - if (!lifecycleCallbackInstalled - || !HintUtils.shouldApplyScopeData(hint)) { + if (!lifecycleCallbackInstalled || !HintUtils.shouldApplyScopeData(hint)) { return event; } if (!options.isAttachScreenshot()) { From 6615b75f03a0818db8e35b196ef6d337bb8bf97e Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 14 Nov 2022 16:04:19 +0100 Subject: [PATCH 03/28] Expose ScreenshotEventProcessor to allow HybridSDKs to use it --- .../core/AndroidOptionsInitializer.java | 2 +- .../core/ScreenshotEventProcessor.java | 138 +++++++++++------- .../src/main/java/io/sentry/OutboxSender.java | 3 + .../main/java/io/sentry/TypeCheckHint.java | 3 + .../main/java/io/sentry/util/HintUtils.java | 21 +++ 5 files changed, 113 insertions(+), 54 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 0ecbbb9067..111eb09eff 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -210,7 +210,7 @@ private static void installDefaultIntegrations( options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true)); } options.addEventProcessor( - new ScreenshotEventProcessor((Application) context, options, buildInfoProvider)); + ScreenshotEventProcessor.createInstance((Application) context, options, buildInfoProvider)); } else { options .getLogger() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 48e99e7ad3..84059568d8 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -17,6 +17,7 @@ import io.sentry.Hint; import io.sentry.SentryEvent; import io.sentry.SentryLevel; +import io.sentry.util.HintUtils; import io.sentry.util.Objects; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -33,6 +34,8 @@ public final class ScreenshotEventProcessor implements EventProcessor, Application.ActivityLifecycleCallbacks, Closeable { + private static @NotNull ScreenshotEventProcessor instance; + private final @NotNull Application application; private final @NotNull SentryAndroidOptions options; private @Nullable WeakReference currentActivity; @@ -51,10 +54,86 @@ public ScreenshotEventProcessor( application.registerActivityLifecycleCallbacks(this); } + public static ScreenshotEventProcessor createInstance( + final @NotNull Application application, + final @NotNull SentryAndroidOptions options, + final @NotNull BuildInfoProvider buildInfoProvider + ) { + ScreenshotEventProcessor.instance = new ScreenshotEventProcessor(application, options, buildInfoProvider); + return ScreenshotEventProcessor.instance; + } + + public static ScreenshotEventProcessor getInstance() { + return ScreenshotEventProcessor.instance; + } + + public void setCurrentActivity(@NonNull Activity activity) { + if (currentActivity != null && currentActivity.get() == activity) { + return; + } + currentActivity = new WeakReference<>(activity); + } + + public byte[] takeScreenshot() { + if (currentActivity == null) { + return null; + } + + final Activity activity = currentActivity.get(); + if (!isActivityValid(activity) + || activity.getWindow() == null + || activity.getWindow().getDecorView() == null + || activity.getWindow().getDecorView().getRootView() == null) { + this.options + .getLogger() + .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); + } + + final View view = activity.getWindow().getDecorView().getRootView(); + if (view.getWidth() <= 0 || view.getHeight() <= 0) { + this.options + .getLogger() + .log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); + return null; + } + + try { + // ARGB_8888 -> This configuration is very flexible and offers the best quality + final Bitmap bitmap = + Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); + + final Canvas canvas = new Canvas(bitmap); + view.draw(canvas); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + + // 0 meaning compress for small size, 100 meaning compress for max quality. + // Some formats, like PNG which is lossless, will ignore the quality setting. + bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); + + if (byteArrayOutputStream.size() <= 0) { + this.options + .getLogger() + .log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); + return null; + } + + // screenshot png is around ~100-150 kb + return byteArrayOutputStream.toByteArray(); + } catch (Throwable e) { + this.options.getLogger().log(SentryLevel.ERROR, "Taking screenshot failed.", e); + } + return null; + } + + @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { - if (!lifecycleCallbackInstalled) { + if (HintUtils.getIsFromHybridSdk(hint) + || !lifecycleCallbackInstalled + || !event.isErrored() + || currentActivity == null) { return event; } if (!options.isAttachScreenshot()) { @@ -70,53 +149,13 @@ public ScreenshotEventProcessor( return event; } - if (event.isErrored() && currentActivity != null) { - final Activity activity = currentActivity.get(); - if (isActivityValid(activity) - && activity.getWindow() != null - && activity.getWindow().getDecorView() != null - && activity.getWindow().getDecorView().getRootView() != null) { - final View view = activity.getWindow().getDecorView().getRootView(); - - if (view.getWidth() > 0 && view.getHeight() > 0) { - try { - // ARGB_8888 -> This configuration is very flexible and offers the best quality - final Bitmap bitmap = - Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); - - final Canvas canvas = new Canvas(bitmap); - view.draw(canvas); - - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - - // 0 meaning compress for small size, 100 meaning compress for max quality. - // Some formats, like PNG which is lossless, will ignore the quality setting. - bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); - - if (byteArrayOutputStream.size() > 0) { - // screenshot png is around ~100-150 kb - hint.setScreenshot(Attachment.fromScreenshot(byteArrayOutputStream.toByteArray())); - hint.set(ANDROID_ACTIVITY, activity); - } else { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); - } - } catch (Throwable e) { - this.options.getLogger().log(SentryLevel.ERROR, "Taking screenshot failed.", e); - } - } else { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); - } - } else { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); - } + final byte[] screenshot = takeScreenshot(); + if (screenshot == null) { + return event; } + hint.setScreenshot(Attachment.fromScreenshot(screenshot)); + hint.set(ANDROID_ACTIVITY, currentActivity.get()); return event; } @@ -167,13 +206,6 @@ private void cleanCurrentActivity(@NonNull Activity activity) { } } - private void setCurrentActivity(@NonNull Activity activity) { - if (currentActivity != null && currentActivity.get() == activity) { - return; - } - currentActivity = new WeakReference<>(activity); - } - @SuppressLint("NewApi") private boolean isActivityValid(@Nullable Activity activity) { if (activity == null) { diff --git a/sentry/src/main/java/io/sentry/OutboxSender.java b/sentry/src/main/java/io/sentry/OutboxSender.java index bd2d948316..fcf21fb121 100644 --- a/sentry/src/main/java/io/sentry/OutboxSender.java +++ b/sentry/src/main/java/io/sentry/OutboxSender.java @@ -133,6 +133,9 @@ private void processEnvelope(final @NotNull SentryEnvelope envelope, final @NotN if (event == null) { logEnvelopeItemNull(item, currentItem); } else { + if (event.getSdk() != null) { + HintUtils.setIsFromHybridSdk(hint, event.getSdk().getName()); + } if (envelope.getHeader().getEventId() != null && !envelope.getHeader().getEventId().equals(event.getEventId())) { logUnexpectedEventId(envelope, event.getEventId(), currentItem); diff --git a/sentry/src/main/java/io/sentry/TypeCheckHint.java b/sentry/src/main/java/io/sentry/TypeCheckHint.java index 11e465ac51..5fde39994a 100644 --- a/sentry/src/main/java/io/sentry/TypeCheckHint.java +++ b/sentry/src/main/java/io/sentry/TypeCheckHint.java @@ -6,6 +6,9 @@ public final class TypeCheckHint { @ApiStatus.Internal public static final String SENTRY_TYPE_CHECK_HINT = "sentry:typeCheckHint"; + @ApiStatus.Internal public static final String SENTRY_IS_FROM_HYBRID_SDK = "sentry:isFromHybridSdk"; + @ApiStatus.Internal public static final String SENTRY_REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native"; + @ApiStatus.Internal public static final String SENTRY_DART_SDK_NAME = "sentry.dart"; /** Used for Synthetic exceptions. */ public static final String SENTRY_SYNTHETIC_EXCEPTION = "syntheticException"; diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 13c6c87d05..3933e6fece 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -1,6 +1,9 @@ package io.sentry.util; import static io.sentry.TypeCheckHint.SENTRY_TYPE_CHECK_HINT; +import static io.sentry.TypeCheckHint.SENTRY_IS_FROM_HYBRID_SDK; +import static io.sentry.TypeCheckHint.SENTRY_REACT_NATIVE_SDK_NAME; +import static io.sentry.TypeCheckHint.SENTRY_DART_SDK_NAME; import io.sentry.Hint; import io.sentry.ILogger; @@ -16,6 +19,24 @@ public final class HintUtils { private HintUtils() {} + @ApiStatus.Internal + public static void setIsFromHybridSdk(Hint hint, String sdkName) { + if (sdkName.startsWith(SENTRY_REACT_NATIVE_SDK_NAME) + || sdkName.startsWith(SENTRY_DART_SDK_NAME)) { + HintUtils.setIsFromHybridSdk(hint, true); + } + } + + @ApiStatus.Internal + public static void setIsFromHybridSdk(Hint hint, boolean isFromHybridSdk) { + hint.set(SENTRY_IS_FROM_HYBRID_SDK, isFromHybridSdk); + } + + @ApiStatus.Internal + public static boolean getIsFromHybridSdk(Hint hint) { + return Boolean.TRUE.equals(hint.getAs(SENTRY_IS_FROM_HYBRID_SDK, Boolean.class)); + } + @ApiStatus.Internal public static Hint createWithTypeCheckHint(Object typeCheckHint) { Hint hint = new Hint(); From d7b8109ff46bac27c6b54cf51c24ed9882f5b8cc Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Tue, 15 Nov 2022 16:10:16 +0100 Subject: [PATCH 04/28] Revert gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8ef36ddf9b..ca951053ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.parallel=true android.useAndroidX=true # Release information -versionName=6.8.0 +versionName=6.7.0 # Override the SDK name on native crashes on Android sentryAndroidSdkName=sentry.native.android From 33eb7e21be2836349a3e6368f8e1680bce820191 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Tue, 15 Nov 2022 15:13:18 +0000 Subject: [PATCH 05/28] Format code --- .../core/AndroidOptionsInitializer.java | 3 ++- .../core/ScreenshotEventProcessor.java | 25 +++++++++---------- .../main/java/io/sentry/TypeCheckHint.java | 9 +++++-- .../main/java/io/sentry/util/HintUtils.java | 4 +-- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 111eb09eff..7a703b680e 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -210,7 +210,8 @@ private static void installDefaultIntegrations( options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true)); } options.addEventProcessor( - ScreenshotEventProcessor.createInstance((Application) context, options, buildInfoProvider)); + ScreenshotEventProcessor.createInstance( + (Application) context, options, buildInfoProvider)); } else { options .getLogger() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 84059568d8..aaba35a147 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -55,11 +55,11 @@ public ScreenshotEventProcessor( } public static ScreenshotEventProcessor createInstance( - final @NotNull Application application, - final @NotNull SentryAndroidOptions options, - final @NotNull BuildInfoProvider buildInfoProvider - ) { - ScreenshotEventProcessor.instance = new ScreenshotEventProcessor(application, options, buildInfoProvider); + final @NotNull Application application, + final @NotNull SentryAndroidOptions options, + final @NotNull BuildInfoProvider buildInfoProvider) { + ScreenshotEventProcessor.instance = + new ScreenshotEventProcessor(application, options, buildInfoProvider); return ScreenshotEventProcessor.instance; } @@ -85,22 +85,22 @@ public byte[] takeScreenshot() { || activity.getWindow().getDecorView() == null || activity.getWindow().getDecorView().getRootView() == null) { this.options - .getLogger() - .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); + .getLogger() + .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); } final View view = activity.getWindow().getDecorView().getRootView(); if (view.getWidth() <= 0 || view.getHeight() <= 0) { this.options - .getLogger() - .log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); + .getLogger() + .log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); return null; } try { // ARGB_8888 -> This configuration is very flexible and offers the best quality final Bitmap bitmap = - Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); + Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); view.draw(canvas); @@ -113,8 +113,8 @@ public byte[] takeScreenshot() { if (byteArrayOutputStream.size() <= 0) { this.options - .getLogger() - .log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); + .getLogger() + .log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); return null; } @@ -126,7 +126,6 @@ public byte[] takeScreenshot() { return null; } - @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { diff --git a/sentry/src/main/java/io/sentry/TypeCheckHint.java b/sentry/src/main/java/io/sentry/TypeCheckHint.java index 5fde39994a..7d6daf4781 100644 --- a/sentry/src/main/java/io/sentry/TypeCheckHint.java +++ b/sentry/src/main/java/io/sentry/TypeCheckHint.java @@ -6,8 +6,13 @@ public final class TypeCheckHint { @ApiStatus.Internal public static final String SENTRY_TYPE_CHECK_HINT = "sentry:typeCheckHint"; - @ApiStatus.Internal public static final String SENTRY_IS_FROM_HYBRID_SDK = "sentry:isFromHybridSdk"; - @ApiStatus.Internal public static final String SENTRY_REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native"; + + @ApiStatus.Internal + public static final String SENTRY_IS_FROM_HYBRID_SDK = "sentry:isFromHybridSdk"; + + @ApiStatus.Internal + public static final String SENTRY_REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native"; + @ApiStatus.Internal public static final String SENTRY_DART_SDK_NAME = "sentry.dart"; /** Used for Synthetic exceptions. */ diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 3933e6fece..4561543378 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -1,9 +1,9 @@ package io.sentry.util; -import static io.sentry.TypeCheckHint.SENTRY_TYPE_CHECK_HINT; +import static io.sentry.TypeCheckHint.SENTRY_DART_SDK_NAME; import static io.sentry.TypeCheckHint.SENTRY_IS_FROM_HYBRID_SDK; import static io.sentry.TypeCheckHint.SENTRY_REACT_NATIVE_SDK_NAME; -import static io.sentry.TypeCheckHint.SENTRY_DART_SDK_NAME; +import static io.sentry.TypeCheckHint.SENTRY_TYPE_CHECK_HINT; import io.sentry.Hint; import io.sentry.ILogger; From 98459b9e1dfcebe779f41b9dcbb3c239a3f843cf Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Tue, 15 Nov 2022 16:15:30 +0100 Subject: [PATCH 06/28] Return correctly when invalid activity --- .../java/io/sentry/android/core/ScreenshotEventProcessor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index aaba35a147..12873d464a 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -87,6 +87,7 @@ public byte[] takeScreenshot() { this.options .getLogger() .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); + return null; } final View view = activity.getWindow().getDecorView().getRootView(); From ba663652a323875047130db038b02b2e94761200 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Tue, 15 Nov 2022 16:29:30 +0100 Subject: [PATCH 07/28] Update api --- sentry-android-core/api/sentry-android-core.api | 4 ++++ sentry/api/sentry.api | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 4bdcfecd27..16628e6325 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -107,6 +107,8 @@ public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/ public final class io/sentry/android/core/ScreenshotEventProcessor : android/app/Application$ActivityLifecycleCallbacks, io/sentry/EventProcessor, java/io/Closeable { public fun (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)V public fun close ()V + public static fun createInstance (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)Lio/sentry/android/core/ScreenshotEventProcessor; + public static fun getInstance ()Lio/sentry/android/core/ScreenshotEventProcessor; public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V public fun onActivityDestroyed (Landroid/app/Activity;)V public fun onActivityPaused (Landroid/app/Activity;)V @@ -115,6 +117,8 @@ public final class io/sentry/android/core/ScreenshotEventProcessor : android/app public fun onActivityStarted (Landroid/app/Activity;)V public fun onActivityStopped (Landroid/app/Activity;)V public fun process (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/SentryEvent; + public fun setCurrentActivity (Landroid/app/Activity;)V + public fun takeScreenshot ()[B } public final class io/sentry/android/core/SentryAndroid { diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 55af4a3b1d..993e3a38ff 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -1897,6 +1897,9 @@ public final class io/sentry/TypeCheckHint { public static final field OKHTTP_RESPONSE Ljava/lang/String; public static final field OPEN_FEIGN_REQUEST Ljava/lang/String; public static final field OPEN_FEIGN_RESPONSE Ljava/lang/String; + public static final field SENTRY_DART_SDK_NAME Ljava/lang/String; + public static final field SENTRY_IS_FROM_HYBRID_SDK Ljava/lang/String; + public static final field SENTRY_REACT_NATIVE_SDK_NAME Ljava/lang/String; public static final field SENTRY_SYNTHETIC_EXCEPTION Ljava/lang/String; public static final field SENTRY_TYPE_CHECK_HINT Ljava/lang/String; public static final field SERVLET_REQUEST Ljava/lang/String; @@ -3301,12 +3304,15 @@ public final class io/sentry/util/FileUtils { public final class io/sentry/util/HintUtils { public static fun createWithTypeCheckHint (Ljava/lang/Object;)Lio/sentry/Hint; + public static fun getIsFromHybridSdk (Lio/sentry/Hint;)Z public static fun getSentrySdkHint (Lio/sentry/Hint;)Ljava/lang/Object; public static fun hasType (Lio/sentry/Hint;Ljava/lang/Class;)Z public static fun runIfDoesNotHaveType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryNullableConsumer;)V public static fun runIfHasType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryConsumer;)V public static fun runIfHasType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryConsumer;Lio/sentry/util/HintUtils$SentryHintFallback;)V public static fun runIfHasTypeLogIfNot (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/ILogger;Lio/sentry/util/HintUtils$SentryConsumer;)V + public static fun setIsFromHybridSdk (Lio/sentry/Hint;Ljava/lang/String;)V + public static fun setIsFromHybridSdk (Lio/sentry/Hint;Z)V public static fun setTypeCheckHint (Lio/sentry/Hint;Ljava/lang/Object;)V public static fun shouldApplyScopeData (Lio/sentry/Hint;)Z } From 465bbf3894146169dad9fa126cf59da8aed259c9 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 13:47:54 +0100 Subject: [PATCH 08/28] Extract screenshot logic to static method, create activity holder singleton --- .../api/sentry-android-core.api | 14 +- .../core/AndroidOptionsInitializer.java | 4 +- .../android/core/CurrentActivityHolder.java | 42 ++++++ .../core/ScreenshotEventProcessor.java | 130 +++--------------- .../core/internal/util/ActivityUtils.java | 20 +++ .../core/internal/util/ScreenshotUtils.java | 64 +++++++++ .../core/ScreenshotEventProcessorTest.kt | 3 +- .../main/java/io/sentry/util/HintUtils.java | 9 +- 8 files changed, 160 insertions(+), 126 deletions(-) create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 16628e6325..1690a8a503 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -72,6 +72,14 @@ public final class io/sentry/android/core/BuildInfoProvider { public fun isEmulator ()Ljava/lang/Boolean; } +public class io/sentry/android/core/CurrentActivityHolder { + public fun ()V + public fun clearActivity ()V + public fun getActivity ()Landroid/app/Activity; + public static fun getInstance ()Lio/sentry/android/core/CurrentActivityHolder; + public fun setActivity (Landroid/app/Activity;)V +} + public abstract class io/sentry/android/core/EnvelopeFileObserverIntegration : io/sentry/Integration, java/io/Closeable { public fun ()V public fun close ()V @@ -105,10 +113,8 @@ public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/ } public final class io/sentry/android/core/ScreenshotEventProcessor : android/app/Application$ActivityLifecycleCallbacks, io/sentry/EventProcessor, java/io/Closeable { - public fun (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)V + public fun (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;)V public fun close ()V - public static fun createInstance (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)Lio/sentry/android/core/ScreenshotEventProcessor; - public static fun getInstance ()Lio/sentry/android/core/ScreenshotEventProcessor; public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V public fun onActivityDestroyed (Landroid/app/Activity;)V public fun onActivityPaused (Landroid/app/Activity;)V @@ -117,8 +123,6 @@ public final class io/sentry/android/core/ScreenshotEventProcessor : android/app public fun onActivityStarted (Landroid/app/Activity;)V public fun onActivityStopped (Landroid/app/Activity;)V public fun process (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/SentryEvent; - public fun setCurrentActivity (Landroid/app/Activity;)V - public fun takeScreenshot ()[B } public final class io/sentry/android/core/SentryAndroid { diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 7a703b680e..a375653d7d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -209,9 +209,7 @@ private static void installDefaultIntegrations( if (isFragmentAvailable) { options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true)); } - options.addEventProcessor( - ScreenshotEventProcessor.createInstance( - (Application) context, options, buildInfoProvider)); + options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options)); } else { options .getLogger() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java new file mode 100644 index 0000000000..c7b4a91817 --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java @@ -0,0 +1,42 @@ +package io.sentry.android.core; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.lang.ref.WeakReference; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class CurrentActivityHolder { + + private static @Nullable CurrentActivityHolder instance; + + private @Nullable WeakReference currentActivity; + + public static CurrentActivityHolder getInstance() { + if (instance != null) { + return instance; + } + instance = new CurrentActivityHolder(); + return instance; + } + + public @Nullable Activity getActivity() { + if (currentActivity != null) { + return currentActivity.get(); + } + return null; + } + + public void setActivity(@NonNull Activity activity) { + if (currentActivity != null && currentActivity.get() == activity) { + return; + } + + currentActivity = new WeakReference<>(activity); + } + + public void clearActivity() { + currentActivity = null; + } +} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 12873d464a..a5e0ced200 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -1,15 +1,11 @@ package io.sentry.android.core; import static io.sentry.TypeCheckHint.ANDROID_ACTIVITY; +import static io.sentry.android.core.internal.util.ScreenshotUtils.takeScreenshot; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Application; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.os.Build; import android.os.Bundle; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import io.sentry.Attachment; @@ -19,10 +15,8 @@ import io.sentry.SentryLevel; import io.sentry.util.HintUtils; import io.sentry.util.Objects; -import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.IOException; -import java.lang.ref.WeakReference; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -34,106 +28,25 @@ public final class ScreenshotEventProcessor implements EventProcessor, Application.ActivityLifecycleCallbacks, Closeable { - private static @NotNull ScreenshotEventProcessor instance; - private final @NotNull Application application; private final @NotNull SentryAndroidOptions options; - private @Nullable WeakReference currentActivity; - private final @NotNull BuildInfoProvider buildInfoProvider; + private final @NotNull CurrentActivityHolder currentActivityHolder; private boolean lifecycleCallbackInstalled = true; public ScreenshotEventProcessor( - final @NotNull Application application, - final @NotNull SentryAndroidOptions options, - final @NotNull BuildInfoProvider buildInfoProvider) { + final @NotNull Application application, final @NotNull SentryAndroidOptions options) { this.application = Objects.requireNonNull(application, "Application is required"); this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required"); - this.buildInfoProvider = - Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); + this.currentActivityHolder = CurrentActivityHolder.getInstance(); application.registerActivityLifecycleCallbacks(this); } - public static ScreenshotEventProcessor createInstance( - final @NotNull Application application, - final @NotNull SentryAndroidOptions options, - final @NotNull BuildInfoProvider buildInfoProvider) { - ScreenshotEventProcessor.instance = - new ScreenshotEventProcessor(application, options, buildInfoProvider); - return ScreenshotEventProcessor.instance; - } - - public static ScreenshotEventProcessor getInstance() { - return ScreenshotEventProcessor.instance; - } - - public void setCurrentActivity(@NonNull Activity activity) { - if (currentActivity != null && currentActivity.get() == activity) { - return; - } - currentActivity = new WeakReference<>(activity); - } - - public byte[] takeScreenshot() { - if (currentActivity == null) { - return null; - } - - final Activity activity = currentActivity.get(); - if (!isActivityValid(activity) - || activity.getWindow() == null - || activity.getWindow().getDecorView() == null - || activity.getWindow().getDecorView().getRootView() == null) { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); - return null; - } - - final View view = activity.getWindow().getDecorView().getRootView(); - if (view.getWidth() <= 0 || view.getHeight() <= 0) { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); - return null; - } - - try { - // ARGB_8888 -> This configuration is very flexible and offers the best quality - final Bitmap bitmap = - Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); - - final Canvas canvas = new Canvas(bitmap); - view.draw(canvas); - - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - - // 0 meaning compress for small size, 100 meaning compress for max quality. - // Some formats, like PNG which is lossless, will ignore the quality setting. - bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); - - if (byteArrayOutputStream.size() <= 0) { - this.options - .getLogger() - .log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); - return null; - } - - // screenshot png is around ~100-150 kb - return byteArrayOutputStream.toByteArray(); - } catch (Throwable e) { - this.options.getLogger().log(SentryLevel.ERROR, "Taking screenshot failed.", e); - } - return null; - } - @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { - if (HintUtils.getIsFromHybridSdk(hint) - || !lifecycleCallbackInstalled - || !event.isErrored() - || currentActivity == null) { + if (!lifecycleCallbackInstalled + || !event.isErrored()) { return event; } if (!options.isAttachScreenshot()) { @@ -148,20 +61,25 @@ public byte[] takeScreenshot() { return event; } + if (currentActivityHolder.getActivity() == null + || HintUtils.isFromHybridSdk(hint)) { + return event; + } - final byte[] screenshot = takeScreenshot(); + final byte[] screenshot = + takeScreenshot(currentActivityHolder.getActivity(), options.getLogger()); if (screenshot == null) { return event; } hint.setScreenshot(Attachment.fromScreenshot(screenshot)); - hint.set(ANDROID_ACTIVITY, currentActivity.get()); + hint.set(ANDROID_ACTIVITY, currentActivityHolder.getActivity()); return event; } @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { - setCurrentActivity(activity); + currentActivityHolder.setActivity(activity); } @Override @@ -196,25 +114,17 @@ public void onActivityDestroyed(@NonNull Activity activity) { public void close() throws IOException { if (options.isAttachScreenshot()) { application.unregisterActivityLifecycleCallbacks(this); - currentActivity = null; + currentActivityHolder.clearActivity(); } } - private void cleanCurrentActivity(@NonNull Activity activity) { - if (currentActivity != null && currentActivity.get() == activity) { - currentActivity = null; - } + private void setCurrentActivity(@NonNull Activity activity) { + currentActivityHolder.setActivity(activity); } - @SuppressLint("NewApi") - private boolean isActivityValid(@Nullable Activity activity) { - if (activity == null) { - return false; - } - if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return !activity.isFinishing() && !activity.isDestroyed(); - } else { - return !activity.isFinishing(); + private void cleanCurrentActivity(@NonNull Activity activity) { + if (currentActivityHolder.getActivity() == activity) { + currentActivityHolder.clearActivity(); } } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java new file mode 100644 index 0000000000..3a494eb414 --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java @@ -0,0 +1,20 @@ +package io.sentry.android.core.internal.util; + +import android.app.Activity; +import android.os.Build; +import androidx.annotation.Nullable; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class ActivityUtils { + public static boolean isActivityValid(@Nullable Activity activity) { + if (activity == null) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + return !activity.isFinishing() && !activity.isDestroyed(); + } else { + return !activity.isFinishing(); + } + } +} 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 new file mode 100644 index 0000000000..3c1703c0d2 --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java @@ -0,0 +1,64 @@ +package io.sentry.android.core.internal.util; + +import static io.sentry.android.core.internal.util.ActivityUtils.isActivityValid; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.view.View; +import androidx.annotation.Nullable; +import io.sentry.ILogger; +import io.sentry.SentryLevel; +import java.io.ByteArrayOutputStream; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Internal +public class ScreenshotUtils { + public static @Nullable byte[] takeScreenshot( + final @Nullable Activity activity, final @NotNull ILogger logger) { + if (activity == null) { + return null; + } + + if (!isActivityValid(activity) + || activity.getWindow() == null + || activity.getWindow().getDecorView() == null + || activity.getWindow().getDecorView().getRootView() == null) { + logger.log(SentryLevel.DEBUG, "Activity isn't valid, not taking screenshot."); + return null; + } + + final View view = activity.getWindow().getDecorView().getRootView(); + if (view.getWidth() <= 0 || view.getHeight() <= 0) { + logger.log(SentryLevel.DEBUG, "View's width and height is zeroed, not taking screenshot."); + return null; + } + + try { + // ARGB_8888 -> This configuration is very flexible and offers the best quality + final Bitmap bitmap = + Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); + + final Canvas canvas = new Canvas(bitmap); + view.draw(canvas); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + + // 0 meaning compress for small size, 100 meaning compress for max quality. + // Some formats, like PNG which is lossless, will ignore the quality setting. + bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); + + if (byteArrayOutputStream.size() <= 0) { + logger.log(SentryLevel.DEBUG, "Screenshot is 0 bytes, not attaching the image."); + return null; + } + + // screenshot png is around ~100-150 kb + return byteArrayOutputStream.toByteArray(); + } catch (Throwable e) { + logger.log(SentryLevel.ERROR, "Taking screenshot failed.", e); + } + return null; + } +} 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 3d81b176bf..c220c73fb2 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 @@ -28,7 +28,6 @@ class ScreenshotEventProcessorTest { private class Fixture { val application = mock() - val buildInfo = mock() val activity = mock() val window = mock() val view = mock() @@ -49,7 +48,7 @@ class ScreenshotEventProcessorTest { fun getSut(attachScreenshot: Boolean = false): ScreenshotEventProcessor { options.isAttachScreenshot = attachScreenshot - return ScreenshotEventProcessor(application, options, buildInfo) + return ScreenshotEventProcessor(application, options) } } diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 4561543378..57ba21ea08 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -19,21 +19,18 @@ public final class HintUtils { private HintUtils() {} - @ApiStatus.Internal - public static void setIsFromHybridSdk(Hint hint, String sdkName) { + public static void setIsFromHybridSdk(@NotNull Hint hint, @NotNull String sdkName) { if (sdkName.startsWith(SENTRY_REACT_NATIVE_SDK_NAME) || sdkName.startsWith(SENTRY_DART_SDK_NAME)) { HintUtils.setIsFromHybridSdk(hint, true); } } - @ApiStatus.Internal - public static void setIsFromHybridSdk(Hint hint, boolean isFromHybridSdk) { + public static void setIsFromHybridSdk(@NotNull Hint hint, boolean isFromHybridSdk) { hint.set(SENTRY_IS_FROM_HYBRID_SDK, isFromHybridSdk); } - @ApiStatus.Internal - public static boolean getIsFromHybridSdk(Hint hint) { + public static boolean isFromHybridSdk(@NotNull Hint hint) { return Boolean.TRUE.equals(hint.getAs(SENTRY_IS_FROM_HYBRID_SDK, Boolean.class)); } From 706dc8e7873676648c375f56a320e49e3f695e56 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 16 Nov 2022 12:51:02 +0000 Subject: [PATCH 09/28] Format code --- .../io/sentry/android/core/ScreenshotEventProcessor.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index a5e0ced200..f14f9e2abe 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -45,8 +45,7 @@ public ScreenshotEventProcessor( @SuppressWarnings("NullAway") @Override public @NotNull SentryEvent process(final @NotNull SentryEvent event, @NotNull Hint hint) { - if (!lifecycleCallbackInstalled - || !event.isErrored()) { + if (!lifecycleCallbackInstalled || !event.isErrored()) { return event; } if (!options.isAttachScreenshot()) { @@ -61,8 +60,7 @@ public ScreenshotEventProcessor( return event; } - if (currentActivityHolder.getActivity() == null - || HintUtils.isFromHybridSdk(hint)) { + if (currentActivityHolder.getActivity() == null || HintUtils.isFromHybridSdk(hint)) { return event; } From 8c89da757efc3d8a3f2e5ffa24419e59a4b40fa1 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 13:53:24 +0100 Subject: [PATCH 10/28] Refactor --- .../io/sentry/android/core/ScreenshotEventProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index f14f9e2abe..22582cece2 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -116,13 +116,13 @@ public void close() throws IOException { } } - private void setCurrentActivity(@NonNull Activity activity) { - currentActivityHolder.setActivity(activity); - } - private void cleanCurrentActivity(@NonNull Activity activity) { if (currentActivityHolder.getActivity() == activity) { currentActivityHolder.clearActivity(); } } + + private void setCurrentActivity(@NonNull Activity activity) { + currentActivityHolder.setActivity(activity); + } } From 2cce8445702f18927636bd56c9515242a3839838 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 14:02:39 +0100 Subject: [PATCH 11/28] Make logger public --- sentry-android-core/api/sentry-android-core.api | 8 ++++++++ .../main/java/io/sentry/android/core/AndroidLogger.java | 4 +++- sentry/api/sentry.api | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 1690a8a503..9745bbf7d6 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -22,6 +22,14 @@ public final class io/sentry/android/core/ActivityLifecycleIntegration : android public fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } +public final class io/sentry/android/core/AndroidLogger : io/sentry/ILogger { + public fun ()V + public fun isEnabled (Lio/sentry/SentryLevel;)Z + public fun log (Lio/sentry/SentryLevel;Ljava/lang/String;Ljava/lang/Throwable;)V + public fun log (Lio/sentry/SentryLevel;Ljava/lang/String;[Ljava/lang/Object;)V + public fun log (Lio/sentry/SentryLevel;Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V +} + public final class io/sentry/android/core/AnrIntegration : io/sentry/Integration, java/io/Closeable { public fun (Landroid/content/Context;)V public fun close ()V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java index 5fc1b84af9..79c1b404a6 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java @@ -3,10 +3,12 @@ import android.util.Log; import io.sentry.ILogger; import io.sentry.SentryLevel; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -final class AndroidLogger implements ILogger { +@ApiStatus.Internal +public final class AndroidLogger implements ILogger { private static final String tag = "Sentry"; diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 8d2e6ccf40..77584c7c42 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -3304,9 +3304,9 @@ public final class io/sentry/util/FileUtils { public final class io/sentry/util/HintUtils { public static fun createWithTypeCheckHint (Ljava/lang/Object;)Lio/sentry/Hint; - public static fun getIsFromHybridSdk (Lio/sentry/Hint;)Z public static fun getSentrySdkHint (Lio/sentry/Hint;)Ljava/lang/Object; public static fun hasType (Lio/sentry/Hint;Ljava/lang/Class;)Z + public static fun isFromHybridSdk (Lio/sentry/Hint;)Z public static fun runIfDoesNotHaveType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryNullableConsumer;)V public static fun runIfHasType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryConsumer;)V public static fun runIfHasType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryConsumer;Lio/sentry/util/HintUtils$SentryHintFallback;)V From 66b4e9e7428f3da48d22b9a0f607eb6dcc812cc3 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 14:32:12 +0100 Subject: [PATCH 12/28] Add configurable tag to android logger --- sentry-android-core/api/sentry-android-core.api | 1 + .../java/io/sentry/android/core/AndroidLogger.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 9745bbf7d6..42afa2f72e 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -24,6 +24,7 @@ public final class io/sentry/android/core/ActivityLifecycleIntegration : android public final class io/sentry/android/core/AndroidLogger : io/sentry/ILogger { public fun ()V + public fun (Ljava/lang/String;)V public fun isEnabled (Lio/sentry/SentryLevel;)Z public fun log (Lio/sentry/SentryLevel;Ljava/lang/String;Ljava/lang/Throwable;)V public fun log (Lio/sentry/SentryLevel;Ljava/lang/String;[Ljava/lang/Object;)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java index 79c1b404a6..8c7ad55316 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java @@ -10,7 +10,15 @@ @ApiStatus.Internal public final class AndroidLogger implements ILogger { - private static final String tag = "Sentry"; + private final String tag; + + public AndroidLogger(){ + tag = "Sentry"; + } + + public AndroidLogger(@NotNull String tag) { + this.tag = tag; + } @SuppressWarnings("AnnotateFormatMethod") @Override From fde798197b7c6759a32d11e5d09c15af02942896 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 16 Nov 2022 13:35:24 +0000 Subject: [PATCH 13/28] Format code --- .../src/main/java/io/sentry/android/core/AndroidLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java index 8c7ad55316..0922cdcaee 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java @@ -12,7 +12,7 @@ public final class AndroidLogger implements ILogger { private final String tag; - public AndroidLogger(){ + public AndroidLogger() { tag = "Sentry"; } From ec050446b2e4f8dab49729f95d0626316e0efafd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Wold=C5=99ich?= <31292499+krystofwoldrich@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:57:30 +0100 Subject: [PATCH 14/28] Update sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java Co-authored-by: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> --- .../src/main/java/io/sentry/android/core/AndroidLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java index 0922cdcaee..a9e4088120 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java @@ -13,7 +13,7 @@ public final class AndroidLogger implements ILogger { private final String tag; public AndroidLogger() { - tag = "Sentry"; + this("Sentry"); } public AndroidLogger(@NotNull String tag) { From 2e19e51ecf8aff32e1fdba90e00995b5868690da Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 15:18:15 +0100 Subject: [PATCH 15/28] Fix activity holder access, return build info --- .../api/sentry-android-core.api | 2 +- .../core/AndroidOptionsInitializer.java | 2 +- .../android/core/CurrentActivityHolder.java | 7 ++---- .../core/ScreenshotEventProcessor.java | 22 +++++++++---------- .../core/internal/util/ActivityUtils.java | 20 ----------------- .../core/internal/util/ScreenshotUtils.java | 20 +++++++++++++---- .../core/ScreenshotEventProcessorTest.kt | 3 ++- 7 files changed, 33 insertions(+), 43 deletions(-) delete mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 42afa2f72e..1759624b6c 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -122,7 +122,7 @@ public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/ } public final class io/sentry/android/core/ScreenshotEventProcessor : android/app/Application$ActivityLifecycleCallbacks, io/sentry/EventProcessor, java/io/Closeable { - public fun (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;)V + public fun (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)V public fun close ()V public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V public fun onActivityDestroyed (Landroid/app/Activity;)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index a375653d7d..21206cc026 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -209,7 +209,7 @@ private static void installDefaultIntegrations( if (isFragmentAvailable) { options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true)); } - options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options)); + options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options, buildInfoProvider)); } else { options .getLogger() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java index c7b4a91817..659dd0400c 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java @@ -5,19 +5,16 @@ import androidx.annotation.Nullable; import java.lang.ref.WeakReference; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; @ApiStatus.Internal public class CurrentActivityHolder { - private static @Nullable CurrentActivityHolder instance; + private static @NotNull CurrentActivityHolder instance = new CurrentActivityHolder(); private @Nullable WeakReference currentActivity; public static CurrentActivityHolder getInstance() { - if (instance != null) { - return instance; - } - instance = new CurrentActivityHolder(); return instance; } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 22582cece2..ff279e0002 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -30,14 +30,14 @@ public final class ScreenshotEventProcessor private final @NotNull Application application; private final @NotNull SentryAndroidOptions options; - private final @NotNull CurrentActivityHolder currentActivityHolder; + private final @NotNull BuildInfoProvider buildInfoProvider; private boolean lifecycleCallbackInstalled = true; public ScreenshotEventProcessor( - final @NotNull Application application, final @NotNull SentryAndroidOptions options) { + final @NotNull Application application, final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider) { this.application = Objects.requireNonNull(application, "Application is required"); this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required"); - this.currentActivityHolder = CurrentActivityHolder.getInstance(); + this.buildInfoProvider = Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); application.registerActivityLifecycleCallbacks(this); } @@ -60,24 +60,24 @@ public ScreenshotEventProcessor( return event; } - if (currentActivityHolder.getActivity() == null || HintUtils.isFromHybridSdk(hint)) { + if (CurrentActivityHolder.getInstance().getActivity() == null || HintUtils.isFromHybridSdk(hint)) { return event; } final byte[] screenshot = - takeScreenshot(currentActivityHolder.getActivity(), options.getLogger()); + takeScreenshot(CurrentActivityHolder.getInstance().getActivity(), options.getLogger(), buildInfoProvider); if (screenshot == null) { return event; } hint.setScreenshot(Attachment.fromScreenshot(screenshot)); - hint.set(ANDROID_ACTIVITY, currentActivityHolder.getActivity()); + hint.set(ANDROID_ACTIVITY, CurrentActivityHolder.getInstance().getActivity()); return event; } @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { - currentActivityHolder.setActivity(activity); + CurrentActivityHolder.getInstance().setActivity(activity); } @Override @@ -112,17 +112,17 @@ public void onActivityDestroyed(@NonNull Activity activity) { public void close() throws IOException { if (options.isAttachScreenshot()) { application.unregisterActivityLifecycleCallbacks(this); - currentActivityHolder.clearActivity(); + CurrentActivityHolder.getInstance().clearActivity(); } } private void cleanCurrentActivity(@NonNull Activity activity) { - if (currentActivityHolder.getActivity() == activity) { - currentActivityHolder.clearActivity(); + if (CurrentActivityHolder.getInstance().getActivity() == activity) { + CurrentActivityHolder.getInstance().clearActivity(); } } private void setCurrentActivity(@NonNull Activity activity) { - currentActivityHolder.setActivity(activity); + CurrentActivityHolder.getInstance().setActivity(activity); } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java deleted file mode 100644 index 3a494eb414..0000000000 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.sentry.android.core.internal.util; - -import android.app.Activity; -import android.os.Build; -import androidx.annotation.Nullable; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public class ActivityUtils { - public static boolean isActivityValid(@Nullable Activity activity) { - if (activity == null) { - return false; - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return !activity.isFinishing() && !activity.isDestroyed(); - } else { - return !activity.isFinishing(); - } - } -} 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 3c1703c0d2..e34265bd7b 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 @@ -1,14 +1,15 @@ package io.sentry.android.core.internal.util; -import static io.sentry.android.core.internal.util.ActivityUtils.isActivityValid; - import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.os.Build; import android.view.View; import androidx.annotation.Nullable; import io.sentry.ILogger; import io.sentry.SentryLevel; +import io.sentry.android.core.BuildInfoProvider; + import java.io.ByteArrayOutputStream; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -16,12 +17,12 @@ @ApiStatus.Internal public class ScreenshotUtils { public static @Nullable byte[] takeScreenshot( - final @Nullable Activity activity, final @NotNull ILogger logger) { + final @Nullable Activity activity, final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) { if (activity == null) { return null; } - if (!isActivityValid(activity) + if (!isActivityValid(activity, buildInfoProvider) || activity.getWindow() == null || activity.getWindow().getDecorView() == null || activity.getWindow().getDecorView().getRootView() == null) { @@ -61,4 +62,15 @@ public class ScreenshotUtils { } return null; } + + public static boolean isActivityValid(final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { + if (activity == null) { + return false; + } + if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + return !activity.isFinishing() && !activity.isDestroyed(); + } else { + return !activity.isFinishing(); + } + } } 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 c220c73fb2..3d81b176bf 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 @@ -28,6 +28,7 @@ class ScreenshotEventProcessorTest { private class Fixture { val application = mock() + val buildInfo = mock() val activity = mock() val window = mock() val view = mock() @@ -48,7 +49,7 @@ class ScreenshotEventProcessorTest { fun getSut(attachScreenshot: Boolean = false): ScreenshotEventProcessor { options.isAttachScreenshot = attachScreenshot - return ScreenshotEventProcessor(application, options) + return ScreenshotEventProcessor(application, options, buildInfo) } } From 42e606b2f1645b9765ef87f49d4ddaf1f986b904 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 16 Nov 2022 14:21:17 +0000 Subject: [PATCH 16/28] Format code --- .../android/core/AndroidOptionsInitializer.java | 3 ++- .../android/core/ScreenshotEventProcessor.java | 15 +++++++++++---- .../core/internal/util/ScreenshotUtils.java | 8 +++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 21206cc026..0ecbbb9067 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -209,7 +209,8 @@ private static void installDefaultIntegrations( if (isFragmentAvailable) { options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true)); } - options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options, buildInfoProvider)); + options.addEventProcessor( + new ScreenshotEventProcessor((Application) context, options, buildInfoProvider)); } else { options .getLogger() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index ff279e0002..2d3d9b380f 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -34,10 +34,13 @@ public final class ScreenshotEventProcessor private boolean lifecycleCallbackInstalled = true; public ScreenshotEventProcessor( - final @NotNull Application application, final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider) { + final @NotNull Application application, + final @NotNull SentryAndroidOptions options, + final @NotNull BuildInfoProvider buildInfoProvider) { this.application = Objects.requireNonNull(application, "Application is required"); this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required"); - this.buildInfoProvider = Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); + this.buildInfoProvider = + Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); application.registerActivityLifecycleCallbacks(this); } @@ -60,12 +63,16 @@ public ScreenshotEventProcessor( return event; } - if (CurrentActivityHolder.getInstance().getActivity() == null || HintUtils.isFromHybridSdk(hint)) { + if (CurrentActivityHolder.getInstance().getActivity() == null + || HintUtils.isFromHybridSdk(hint)) { return event; } final byte[] screenshot = - takeScreenshot(CurrentActivityHolder.getInstance().getActivity(), options.getLogger(), buildInfoProvider); + takeScreenshot( + CurrentActivityHolder.getInstance().getActivity(), + options.getLogger(), + buildInfoProvider); if (screenshot == null) { return event; } 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 e34265bd7b..fe0fa33186 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 @@ -9,7 +9,6 @@ import io.sentry.ILogger; import io.sentry.SentryLevel; import io.sentry.android.core.BuildInfoProvider; - import java.io.ByteArrayOutputStream; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -17,7 +16,9 @@ @ApiStatus.Internal public class ScreenshotUtils { public static @Nullable byte[] takeScreenshot( - final @Nullable Activity activity, final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) { + final @Nullable Activity activity, + final @NotNull ILogger logger, + final @NotNull BuildInfoProvider buildInfoProvider) { if (activity == null) { return null; } @@ -63,7 +64,8 @@ public class ScreenshotUtils { return null; } - public static boolean isActivityValid(final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { + public static boolean isActivityValid( + final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { if (activity == null) { return false; } From 02995127e60d1d85d1fd0f075a7fbe1b5a165551 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 16 Nov 2022 16:24:24 +0100 Subject: [PATCH 17/28] Fix lint --- .../io/sentry/android/core/internal/util/ScreenshotUtils.java | 2 ++ 1 file changed, 2 insertions(+) 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 fe0fa33186..ce4840d4f4 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 @@ -1,5 +1,6 @@ package io.sentry.android.core.internal.util; +import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -64,6 +65,7 @@ public class ScreenshotUtils { return null; } + @SuppressLint("NewApi") public static boolean isActivityValid( final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { if (activity == null) { From 03e03b9074d7fe7aff585228b23b33a67f2acb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Wold=C5=99ich?= <31292499+krystofwoldrich@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:30:39 +0100 Subject: [PATCH 18/28] Apply suggestions from code review Co-authored-by: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> --- .../main/java/io/sentry/android/core/AndroidLogger.java | 4 ++-- .../io/sentry/android/core/ScreenshotEventProcessor.java | 7 ++++--- .../sentry/android/core/internal/util/ScreenshotUtils.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java index a9e4088120..b0f6b8ac92 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidLogger.java @@ -10,13 +10,13 @@ @ApiStatus.Internal public final class AndroidLogger implements ILogger { - private final String tag; + private final @NotNull String tag; public AndroidLogger() { this("Sentry"); } - public AndroidLogger(@NotNull String tag) { + public AndroidLogger(final @NotNull String tag) { this.tag = tag; } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 2d3d9b380f..2a11441b04 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -63,14 +63,15 @@ public ScreenshotEventProcessor( return event; } - if (CurrentActivityHolder.getInstance().getActivity() == null + final Activity activity = CurrentActivityHolder.getInstance().getActivity() + if (activity == null || HintUtils.isFromHybridSdk(hint)) { return event; } final byte[] screenshot = takeScreenshot( - CurrentActivityHolder.getInstance().getActivity(), + activity, options.getLogger(), buildInfoProvider); if (screenshot == null) { @@ -78,7 +79,7 @@ public ScreenshotEventProcessor( } hint.setScreenshot(Attachment.fromScreenshot(screenshot)); - hint.set(ANDROID_ACTIVITY, CurrentActivityHolder.getInstance().getActivity()); + hint.set(ANDROID_ACTIVITY, activity); return event; } 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 ce4840d4f4..4802e62fc8 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 @@ -66,7 +66,7 @@ public class ScreenshotUtils { } @SuppressLint("NewApi") - public static boolean isActivityValid( + private static boolean isActivityValid( final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { if (activity == null) { return false; From 47e66bec97dcb571534046235e16332d6323ff7d Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Thu, 17 Nov 2022 11:00:35 +0100 Subject: [PATCH 19/28] Small refactor and add more hybrid sdks --- .../android/core/ScreenshotEventProcessor.java | 2 +- .../core/internal/util/ScreenshotUtils.java | 6 +----- sentry/api/sentry.api | 4 ++-- sentry/src/main/java/io/sentry/TypeCheckHint.java | 5 ++++- sentry/src/main/java/io/sentry/util/HintUtils.java | 14 ++++++-------- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index 2a11441b04..a65486036d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -63,7 +63,7 @@ public ScreenshotEventProcessor( return event; } - final Activity activity = CurrentActivityHolder.getInstance().getActivity() + final Activity activity = CurrentActivityHolder.getInstance().getActivity(); if (activity == null || HintUtils.isFromHybridSdk(hint)) { return event; 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 4802e62fc8..86542ccfe0 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 @@ -17,13 +17,9 @@ @ApiStatus.Internal public class ScreenshotUtils { public static @Nullable byte[] takeScreenshot( - final @Nullable Activity activity, + final @NotNull Activity activity, final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) { - if (activity == null) { - return null; - } - if (!isActivityValid(activity, buildInfoProvider) || activity.getWindow() == null || activity.getWindow().getDecorView() == null diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 77584c7c42..35eaaa5690 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -1898,8 +1898,9 @@ public final class io/sentry/TypeCheckHint { public static final field OPEN_FEIGN_REQUEST Ljava/lang/String; public static final field OPEN_FEIGN_RESPONSE Ljava/lang/String; public static final field SENTRY_DART_SDK_NAME Ljava/lang/String; + public static final field SENTRY_DOTNET_SDK_NAME Ljava/lang/String; public static final field SENTRY_IS_FROM_HYBRID_SDK Ljava/lang/String; - public static final field SENTRY_REACT_NATIVE_SDK_NAME Ljava/lang/String; + public static final field SENTRY_JAVASCRIPT_SDK_NAME Ljava/lang/String; public static final field SENTRY_SYNTHETIC_EXCEPTION Ljava/lang/String; public static final field SENTRY_TYPE_CHECK_HINT Ljava/lang/String; public static final field SERVLET_REQUEST Ljava/lang/String; @@ -3312,7 +3313,6 @@ public final class io/sentry/util/HintUtils { public static fun runIfHasType (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/util/HintUtils$SentryConsumer;Lio/sentry/util/HintUtils$SentryHintFallback;)V public static fun runIfHasTypeLogIfNot (Lio/sentry/Hint;Ljava/lang/Class;Lio/sentry/ILogger;Lio/sentry/util/HintUtils$SentryConsumer;)V public static fun setIsFromHybridSdk (Lio/sentry/Hint;Ljava/lang/String;)V - public static fun setIsFromHybridSdk (Lio/sentry/Hint;Z)V public static fun setTypeCheckHint (Lio/sentry/Hint;Ljava/lang/Object;)V public static fun shouldApplyScopeData (Lio/sentry/Hint;)Z } diff --git a/sentry/src/main/java/io/sentry/TypeCheckHint.java b/sentry/src/main/java/io/sentry/TypeCheckHint.java index 7d6daf4781..2a06cffdca 100644 --- a/sentry/src/main/java/io/sentry/TypeCheckHint.java +++ b/sentry/src/main/java/io/sentry/TypeCheckHint.java @@ -11,7 +11,10 @@ public final class TypeCheckHint { public static final String SENTRY_IS_FROM_HYBRID_SDK = "sentry:isFromHybridSdk"; @ApiStatus.Internal - public static final String SENTRY_REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native"; + public static final String SENTRY_JAVASCRIPT_SDK_NAME = "sentry.javascript"; + + @ApiStatus.Internal + public static final String SENTRY_DOTNET_SDK_NAME = "sentry.dotnet"; @ApiStatus.Internal public static final String SENTRY_DART_SDK_NAME = "sentry.dart"; diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 57ba21ea08..9c381842e4 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -1,8 +1,9 @@ package io.sentry.util; import static io.sentry.TypeCheckHint.SENTRY_DART_SDK_NAME; +import static io.sentry.TypeCheckHint.SENTRY_DOTNET_SDK_NAME; import static io.sentry.TypeCheckHint.SENTRY_IS_FROM_HYBRID_SDK; -import static io.sentry.TypeCheckHint.SENTRY_REACT_NATIVE_SDK_NAME; +import static io.sentry.TypeCheckHint.SENTRY_JAVASCRIPT_SDK_NAME; import static io.sentry.TypeCheckHint.SENTRY_TYPE_CHECK_HINT; import io.sentry.Hint; @@ -20,16 +21,13 @@ public final class HintUtils { private HintUtils() {} public static void setIsFromHybridSdk(@NotNull Hint hint, @NotNull String sdkName) { - if (sdkName.startsWith(SENTRY_REACT_NATIVE_SDK_NAME) - || sdkName.startsWith(SENTRY_DART_SDK_NAME)) { - HintUtils.setIsFromHybridSdk(hint, true); + if (sdkName.startsWith(SENTRY_JAVASCRIPT_SDK_NAME) + || sdkName.startsWith(SENTRY_DART_SDK_NAME) + || sdkName.startsWith(SENTRY_DOTNET_SDK_NAME)) { + hint.set(SENTRY_IS_FROM_HYBRID_SDK, true); } } - public static void setIsFromHybridSdk(@NotNull Hint hint, boolean isFromHybridSdk) { - hint.set(SENTRY_IS_FROM_HYBRID_SDK, isFromHybridSdk); - } - public static boolean isFromHybridSdk(@NotNull Hint hint) { return Boolean.TRUE.equals(hint.getAs(SENTRY_IS_FROM_HYBRID_SDK, Boolean.class)); } From ce5d2cee0e1299f87dab402dc1b52806522aa982 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 17 Nov 2022 10:04:00 +0000 Subject: [PATCH 20/28] Format code --- .../io/sentry/android/core/ScreenshotEventProcessor.java | 9 ++------- sentry/src/main/java/io/sentry/TypeCheckHint.java | 6 ++---- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java index a65486036d..041d441579 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java @@ -64,16 +64,11 @@ public ScreenshotEventProcessor( return event; } final Activity activity = CurrentActivityHolder.getInstance().getActivity(); - if (activity == null - || HintUtils.isFromHybridSdk(hint)) { + if (activity == null || HintUtils.isFromHybridSdk(hint)) { return event; } - final byte[] screenshot = - takeScreenshot( - activity, - options.getLogger(), - buildInfoProvider); + final byte[] screenshot = takeScreenshot(activity, options.getLogger(), buildInfoProvider); if (screenshot == null) { return event; } diff --git a/sentry/src/main/java/io/sentry/TypeCheckHint.java b/sentry/src/main/java/io/sentry/TypeCheckHint.java index 2a06cffdca..ba2d895ad2 100644 --- a/sentry/src/main/java/io/sentry/TypeCheckHint.java +++ b/sentry/src/main/java/io/sentry/TypeCheckHint.java @@ -10,11 +10,9 @@ public final class TypeCheckHint { @ApiStatus.Internal public static final String SENTRY_IS_FROM_HYBRID_SDK = "sentry:isFromHybridSdk"; - @ApiStatus.Internal - public static final String SENTRY_JAVASCRIPT_SDK_NAME = "sentry.javascript"; + @ApiStatus.Internal public static final String SENTRY_JAVASCRIPT_SDK_NAME = "sentry.javascript"; - @ApiStatus.Internal - public static final String SENTRY_DOTNET_SDK_NAME = "sentry.dotnet"; + @ApiStatus.Internal public static final String SENTRY_DOTNET_SDK_NAME = "sentry.dotnet"; @ApiStatus.Internal public static final String SENTRY_DART_SDK_NAME = "sentry.dart"; From 867a810cdefebc062cf908eaae280f98822d24b9 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Thu, 17 Nov 2022 11:17:23 +0100 Subject: [PATCH 21/28] More refactoring annotations, finals --- .../java/io/sentry/android/core/CurrentActivityHolder.java | 6 +++--- .../sentry/android/core/internal/util/ScreenshotUtils.java | 5 +---- sentry/src/main/java/io/sentry/util/HintUtils.java | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java index 659dd0400c..3e99e5fc26 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java @@ -10,11 +10,11 @@ @ApiStatus.Internal public class CurrentActivityHolder { - private static @NotNull CurrentActivityHolder instance = new CurrentActivityHolder(); + private static final @NotNull CurrentActivityHolder instance = new CurrentActivityHolder(); private @Nullable WeakReference currentActivity; - public static CurrentActivityHolder getInstance() { + public static @NonNull CurrentActivityHolder getInstance() { return instance; } @@ -25,7 +25,7 @@ public static CurrentActivityHolder getInstance() { return null; } - public void setActivity(@NonNull Activity activity) { + public void setActivity(final @NonNull Activity activity) { if (currentActivity != null && currentActivity.get() == activity) { return; } 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 86542ccfe0..119135755e 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 @@ -63,10 +63,7 @@ public class ScreenshotUtils { @SuppressLint("NewApi") private static boolean isActivityValid( - final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { - if (activity == null) { - return false; - } + final @NotNull Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) { if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN_MR1) { return !activity.isFinishing() && !activity.isDestroyed(); } else { diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 9c381842e4..1df59e1820 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -20,7 +20,7 @@ public final class HintUtils { private HintUtils() {} - public static void setIsFromHybridSdk(@NotNull Hint hint, @NotNull String sdkName) { + public static void setIsFromHybridSdk(final @NotNull Hint hint, final @NotNull String sdkName) { if (sdkName.startsWith(SENTRY_JAVASCRIPT_SDK_NAME) || sdkName.startsWith(SENTRY_DART_SDK_NAME) || sdkName.startsWith(SENTRY_DOTNET_SDK_NAME)) { @@ -28,7 +28,7 @@ public static void setIsFromHybridSdk(@NotNull Hint hint, @NotNull String sdkNam } } - public static boolean isFromHybridSdk(@NotNull Hint hint) { + public static boolean isFromHybridSdk(final @NotNull Hint hint) { return Boolean.TRUE.equals(hint.getAs(SENTRY_IS_FROM_HYBRID_SDK, Boolean.class)); } From 3e9008da314668bb230de72f7a8d34c13139d935 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Thu, 17 Nov 2022 11:54:58 +0100 Subject: [PATCH 22/28] Add auto close steam --- .../io/sentry/android/core/internal/util/ScreenshotUtils.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 119135755e..b9a528382e 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 @@ -34,7 +34,7 @@ public class ScreenshotUtils { return null; } - try { + try (final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { // ARGB_8888 -> This configuration is very flexible and offers the best quality final Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); @@ -42,8 +42,6 @@ public class ScreenshotUtils { final Canvas canvas = new Canvas(bitmap); view.draw(canvas); - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - // 0 meaning compress for small size, 100 meaning compress for max quality. // Some formats, like PNG which is lossless, will ignore the quality setting. bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); From 0ce3f0e4c9853366d8ffa0963c64bbd171621b9b Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 21 Nov 2022 10:32:24 +0100 Subject: [PATCH 23/28] HintUtils add only class annotation internal --- sentry/src/main/java/io/sentry/util/HintUtils.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sentry/src/main/java/io/sentry/util/HintUtils.java b/sentry/src/main/java/io/sentry/util/HintUtils.java index 1df59e1820..fcf752ba56 100644 --- a/sentry/src/main/java/io/sentry/util/HintUtils.java +++ b/sentry/src/main/java/io/sentry/util/HintUtils.java @@ -32,30 +32,25 @@ public static boolean isFromHybridSdk(final @NotNull Hint hint) { return Boolean.TRUE.equals(hint.getAs(SENTRY_IS_FROM_HYBRID_SDK, Boolean.class)); } - @ApiStatus.Internal public static Hint createWithTypeCheckHint(Object typeCheckHint) { Hint hint = new Hint(); setTypeCheckHint(hint, typeCheckHint); return hint; } - @ApiStatus.Internal public static void setTypeCheckHint(@NotNull Hint hint, Object typeCheckHint) { hint.set(SENTRY_TYPE_CHECK_HINT, typeCheckHint); } - @ApiStatus.Internal public static @Nullable Object getSentrySdkHint(@NotNull Hint hint) { return hint.get(SENTRY_TYPE_CHECK_HINT); } - @ApiStatus.Internal public static boolean hasType(@NotNull Hint hint, @NotNull Class clazz) { final Object sentrySdkHint = getSentrySdkHint(hint); return clazz.isInstance(sentrySdkHint); } - @ApiStatus.Internal public static void runIfDoesNotHaveType( @NotNull Hint hint, @NotNull Class clazz, SentryNullableConsumer lambda) { runIfHasType( @@ -67,13 +62,11 @@ public static void runIfDoesNotHaveType( }); } - @ApiStatus.Internal public static void runIfHasType( @NotNull Hint hint, @NotNull Class clazz, SentryConsumer lambda) { runIfHasType(hint, clazz, lambda, (value, clazz2) -> {}); } - @ApiStatus.Internal public static void runIfHasTypeLogIfNot( @NotNull Hint hint, @NotNull Class clazz, ILogger logger, SentryConsumer lambda) { runIfHasType( @@ -86,7 +79,6 @@ public static void runIfHasTypeLogIfNot( } @SuppressWarnings("unchecked") - @ApiStatus.Internal public static void runIfHasType( @NotNull Hint hint, @NotNull Class clazz, @@ -106,7 +98,6 @@ public static void runIfHasType( * * @return true if it should apply scope's data or false otherwise */ - @ApiStatus.Internal public static boolean shouldApplyScopeData(@NotNull Hint hint) { return !hasType(hint, Cached.class) || hasType(hint, ApplyScopeData.class); } From baa0a6478e652e5b615ea1c3a1895fada8aff459 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 21 Nov 2022 10:32:41 +0100 Subject: [PATCH 24/28] CurrentActivityHolder make constructor private --- sentry-android-core/api/sentry-android-core.api | 1 - .../main/java/io/sentry/android/core/CurrentActivityHolder.java | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 6c2c0c8d3b..17dca925d3 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -82,7 +82,6 @@ public final class io/sentry/android/core/BuildInfoProvider { } public class io/sentry/android/core/CurrentActivityHolder { - public fun ()V public fun clearActivity ()V public fun getActivity ()Landroid/app/Activity; public static fun getInstance ()Lio/sentry/android/core/CurrentActivityHolder; diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java index 3e99e5fc26..b9bf24e85b 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java @@ -12,6 +12,8 @@ public class CurrentActivityHolder { private static final @NotNull CurrentActivityHolder instance = new CurrentActivityHolder(); + private CurrentActivityHolder() { } + private @Nullable WeakReference currentActivity; public static @NonNull CurrentActivityHolder getInstance() { From 8ebcaa2e2e3a13ca3ff29f7565db3cb655b8155e Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 21 Nov 2022 10:33:11 +0100 Subject: [PATCH 25/28] Add changelog (don't attach screenshots to hybridSDKs) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a874b3954d..5e8c62beb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Use `canonicalName` in Fragment Integration for better de-obfuscation ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) - Fix Timber and Fragment integrations auto-installation for obfuscated builds ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) +- Don't attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360)) ## 6.8.0 From 8b49d104a868e217138a62157b62bdc3a1843f77 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 21 Nov 2022 09:36:34 +0000 Subject: [PATCH 26/28] Format code --- .../main/java/io/sentry/android/core/CurrentActivityHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java index b9bf24e85b..8da322b20b 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java @@ -12,7 +12,7 @@ public class CurrentActivityHolder { private static final @NotNull CurrentActivityHolder instance = new CurrentActivityHolder(); - private CurrentActivityHolder() { } + private CurrentActivityHolder() {} private @Nullable WeakReference currentActivity; From 3bb055f3a614492be31c80c2d5192dc38ae9ddac Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 21 Nov 2022 10:41:15 +0100 Subject: [PATCH 27/28] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e8c62beb1..8d9a7dc605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Use `canonicalName` in Fragment Integration for better de-obfuscation ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) - Fix Timber and Fragment integrations auto-installation for obfuscated builds ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) -- Don't attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360)) +- Do not attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360)) ## 6.8.0 From 6a469aa5f65c48942a73c2708fab13e15bc1f828 Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Mon, 21 Nov 2022 10:41:53 +0100 Subject: [PATCH 28/28] Revert "Update changelog" This reverts commit 3bb055f3a614492be31c80c2d5192dc38ae9ddac. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d9a7dc605..5e8c62beb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Use `canonicalName` in Fragment Integration for better de-obfuscation ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) - Fix Timber and Fragment integrations auto-installation for obfuscated builds ([#2379](https://github.com/getsentry/sentry-java/pull/2379)) -- Do not attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360)) +- Don't attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360)) ## 6.8.0