From fb45b6d9e395f18aed9b809fb3dbd59be026c719 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 20 Oct 2022 07:56:49 +0200 Subject: [PATCH 1/8] Add option to enable or disable Activity Frames Tracker --- .../api/sentry-android-core.api | 21 +++++++++- .../android/core/ActivityFramesTracker.java | 6 ++- .../core/ActivityLifecycleIntegration.java | 10 ++++- .../core/AndroidOptionsInitializer.java | 9 +++-- .../android/core/IActivityFramesTracker.java | 22 +++++++++++ .../android/core/ManifestMetadataReader.java | 7 ++++ .../core/NoOpActivityFramesTracker.java | 25 ++++++++++++ .../PerformanceAndroidEventProcessor.java | 4 +- .../android/core/SentryAndroidOptions.java | 16 ++++++++ .../core/AndroidOptionsInitializerTest.kt | 30 +++++++++++++++ .../core/ManifestMetadataReaderTest.kt | 38 +++++++++++++++++++ 11 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 11e5f679ce3..91a94ab9763 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -1,4 +1,4 @@ -public final class io/sentry/android/core/ActivityFramesTracker { +public final class io/sentry/android/core/ActivityFramesTracker : io/sentry/android/core/IActivityFramesTracker { public fun (Lio/sentry/android/core/LoadClass;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/ILogger;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/ILogger;Lio/sentry/android/core/MainLooperHandler;)V @@ -9,7 +9,7 @@ public final class io/sentry/android/core/ActivityFramesTracker { } public final class io/sentry/android/core/ActivityLifecycleIntegration : android/app/Application$ActivityLifecycleCallbacks, io/sentry/Integration, java/io/Closeable { - public fun (Landroid/app/Application;Lio/sentry/android/core/BuildInfoProvider;Lio/sentry/android/core/ActivityFramesTracker;)V + public fun (Landroid/app/Application;Lio/sentry/android/core/BuildInfoProvider;Lio/sentry/android/core/IActivityFramesTracker;)V public fun close ()V public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V public fun onActivityDestroyed (Landroid/app/Activity;)V @@ -79,6 +79,13 @@ public abstract class io/sentry/android/core/EnvelopeFileObserverIntegration : i public final fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } +public abstract interface class io/sentry/android/core/IActivityFramesTracker { + public abstract fun addActivity (Landroid/app/Activity;)V + public abstract fun setMetrics (Landroid/app/Activity;Lio/sentry/protocol/SentryId;)V + public abstract fun stop ()V + public abstract fun takeMetrics (Lio/sentry/protocol/SentryId;)Ljava/util/Map; +} + public abstract interface class io/sentry/android/core/IDebugImagesLoader { public abstract fun clearDebugImages ()V public abstract fun loadDebugImages ()Ljava/util/List; @@ -98,6 +105,14 @@ public final class io/sentry/android/core/NdkIntegration : io/sentry/Integration public final fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } +public final class io/sentry/android/core/NoOpActivityFramesTracker : io/sentry/android/core/IActivityFramesTracker { + public fun ()V + public fun addActivity (Landroid/app/Activity;)V + public fun setMetrics (Landroid/app/Activity;Lio/sentry/protocol/SentryId;)V + public fun stop ()V + public fun takeMetrics (Lio/sentry/protocol/SentryId;)Ljava/util/Map; +} + public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/sentry/Integration, java/io/Closeable { public fun (Landroid/content/Context;)V public fun close ()V @@ -136,6 +151,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun isAnrReportInDebug ()Z public fun isAttachScreenshot ()Z public fun isCollectAdditionalContext ()Z + public fun isEnableActivityFramesTracking ()Z public fun isEnableActivityLifecycleBreadcrumbs ()Z public fun isEnableActivityLifecycleTracingAutoFinish ()Z public fun isEnableAppComponentBreadcrumbs ()Z @@ -150,6 +166,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun setAttachScreenshot (Z)V public fun setCollectAdditionalContext (Z)V public fun setDebugImagesLoader (Lio/sentry/android/core/IDebugImagesLoader;)V + public fun setEnableActivityFramesTracking (Z)V public fun setEnableActivityLifecycleBreadcrumbs (Z)V public fun setEnableActivityLifecycleTracingAutoFinish (Z)V public fun setEnableAppComponentBreadcrumbs (Z)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index c53626adc60..29acd952c9d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -22,7 +22,7 @@ * androidx.core package. It also checks if the FrameMetricsAggregator class is available at * runtime. */ -public final class ActivityFramesTracker { +public final class ActivityFramesTracker implements IActivityFramesTracker { private @Nullable FrameMetricsAggregator frameMetricsAggregator = null; private boolean androidXAvailable = true; @@ -69,6 +69,7 @@ private boolean isFrameMetricsAggregatorAvailable() { return androidXAvailable && frameMetricsAggregator != null; } + @Override @SuppressWarnings("NullAway") public synchronized void addActivity(final @NotNull Activity activity) { if (!isFrameMetricsAggregatorAvailable()) { @@ -123,6 +124,7 @@ private void snapshotFrameCountsAtStart(final @NotNull Activity activity) { return new FrameCounts(totalFrames, slowFrames, frozenFrames); } + @Override @SuppressWarnings("NullAway") public synchronized void setMetrics( final @NotNull Activity activity, final @NotNull SentryId transactionId) { @@ -183,6 +185,7 @@ public synchronized void setMetrics( return new FrameCounts(diffTotalFrames, diffSlowFrames, diffFrozenFrames); } + @Override @Nullable public synchronized Map takeMetrics( final @NotNull SentryId transactionId) { @@ -196,6 +199,7 @@ public synchronized void setMetrics( return stringMeasurementValueMap; } + @Override @SuppressWarnings("NullAway") public synchronized void stop() { if (isFrameMetricsAggregatorAvailable()) { diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java index f050d36d87d..b3cd26f8cf2 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java @@ -62,12 +62,12 @@ public final class ActivityLifecycleIntegration private final @NotNull WeakHashMap activitiesWithOngoingTransactions = new WeakHashMap<>(); - private final @NotNull ActivityFramesTracker activityFramesTracker; + private final @NotNull IActivityFramesTracker activityFramesTracker; public ActivityLifecycleIntegration( final @NotNull Application application, final @NotNull BuildInfoProvider buildInfoProvider, - final @NotNull ActivityFramesTracker activityFramesTracker) { + final @NotNull IActivityFramesTracker activityFramesTracker) { this.application = Objects.requireNonNull(application, "Application is required"); Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); this.activityFramesTracker = @@ -387,6 +387,12 @@ WeakHashMap getActivitiesWithOngoingTransactions() { return activitiesWithOngoingTransactions; } + @TestOnly + @NotNull + IActivityFramesTracker getActivityFramesTracker() { + return activityFramesTracker; + } + @TestOnly @Nullable ISpan getAppStartSpan() { 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 8a6c244a4ba..cd00fb41f5f 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 @@ -134,8 +134,11 @@ static void init( initializeCacheDirs(context, options); options.setEnvelopeDiskCache(new AndroidEnvelopeCache(options)); - final ActivityFramesTracker activityFramesTracker = - new ActivityFramesTracker(loadClass, options.getLogger()); + final IActivityFramesTracker activityFramesTracker = + options.isEnableActivityFramesTracking() + ? new ActivityFramesTracker(loadClass, options.getLogger()) + : new NoOpActivityFramesTracker(); + installDefaultIntegrations( context, options, @@ -161,7 +164,7 @@ private static void installDefaultIntegrations( final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider, final @NotNull LoadClass loadClass, - final @NotNull ActivityFramesTracker activityFramesTracker, + final @NotNull IActivityFramesTracker activityFramesTracker, final boolean isFragmentAvailable, final boolean isTimberAvailable) { diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java new file mode 100644 index 00000000000..ce7c701eb86 --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java @@ -0,0 +1,22 @@ +package io.sentry.android.core; + +import android.app.Activity; +import io.sentry.protocol.MeasurementValue; +import io.sentry.protocol.SentryId; +import java.util.Map; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface IActivityFramesTracker { + @SuppressWarnings("NullAway") + void addActivity(@NotNull Activity activity); + + @SuppressWarnings("NullAway") + void setMetrics(@NotNull Activity activity, @NotNull SentryId transactionId); + + @Nullable + Map takeMetrics(@NotNull SentryId transactionId); + + @SuppressWarnings("NullAway") + void stop(); +} 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 b22f4f3bf15..c162762a9de 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 @@ -78,6 +78,8 @@ final class ManifestMetadataReader { static final String CLIENT_REPORTS_ENABLE = "io.sentry.send-client-reports"; static final String COLLECT_ADDITIONAL_CONTEXT = "io.sentry.additional-context"; + static final String PERFORM_ACTIVITY_FRAMES_TRACKING = "io.sentry.activity-frames-tracking"; + /** ManifestMetadataReader ctor */ private ManifestMetadataReader() {} @@ -286,6 +288,11 @@ static void applyMetadata( options.setTracePropagationTargets(tracePropagationTargets); } + if (metadata.containsKey(PERFORM_ACTIVITY_FRAMES_TRACKING)) { + options.setEnableActivityFramesTracking( + readBool(metadata, logger, PERFORM_ACTIVITY_FRAMES_TRACKING, true)); + } + options.setProguardUuid( readString(metadata, logger, PROGUARD_UUID, options.getProguardUuid())); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java new file mode 100644 index 00000000000..f234745a302 --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java @@ -0,0 +1,25 @@ +package io.sentry.android.core; + +import android.app.Activity; +import io.sentry.protocol.MeasurementValue; +import io.sentry.protocol.SentryId; +import java.util.Map; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class NoOpActivityFramesTracker implements IActivityFramesTracker { + @Override + public void addActivity(@NotNull Activity activity) {} + + @Override + public void setMetrics(@NotNull Activity activity, @NotNull SentryId transactionId) {} + + @Override + public @Nullable Map takeMetrics( + @NotNull SentryId transactionId) { + return null; + } + + @Override + public void stop() {} +} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index 669f34c80e9..7c261439558 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -24,12 +24,12 @@ final class PerformanceAndroidEventProcessor implements EventProcessor { private boolean sentStartMeasurement = false; - private final @NotNull ActivityFramesTracker activityFramesTracker; + private final @NotNull IActivityFramesTracker activityFramesTracker; private final @NotNull SentryAndroidOptions options; PerformanceAndroidEventProcessor( final @NotNull SentryAndroidOptions options, - final @NotNull ActivityFramesTracker activityFramesTracker) { + final @NotNull IActivityFramesTracker activityFramesTracker) { this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required"); this.activityFramesTracker = Objects.requireNonNull(activityFramesTracker, "ActivityFramesTracker is required"); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index e456228537e..8ca944d6568 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -131,6 +131,8 @@ public final class SentryAndroidOptions extends SentryOptions { */ private final long startupCrashDurationThresholdMillis = 2000; // 2s + private boolean enableActivityFramesTracking = true; + public SentryAndroidOptions() { setSentryClientName(BuildConfig.SENTRY_ANDROID_SDK_NAME + "/" + BuildConfig.VERSION_NAME); setSdkVersion(createSdkVersion()); @@ -357,6 +359,20 @@ public void setCollectAdditionalContext(boolean collectAdditionalContext) { this.collectAdditionalContext = collectAdditionalContext; } + public boolean isEnableActivityFramesTracking() { + return enableActivityFramesTracking; + } + + /** + * Enable or disable Activity Frames Tracking, which is used to report slow and frozen frames. + * + * @param enableActivityFramesTracking true if activity frames tracking should be enabled, false + * otherwise. + */ + public void setEnableActivityFramesTracking(boolean enableActivityFramesTracking) { + this.enableActivityFramesTracking = enableActivityFramesTracking; + } + /** * Returns the Startup Crash flush timeout in Millis * diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt index 2f26c4317a5..cc000815ab1 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt @@ -371,4 +371,34 @@ class AndroidOptionsInitializerTest { assertTrue { fixture.sentryOptions.envelopeDiskCache is AndroidEnvelopeCache } } + + @Test + fun `When Activity Frames Tracking is enabled, the proper class should be initialized`() { + fixture.initSut(hasAppContext = true, configureOptions = { + isEnableActivityFramesTracking = true + }) + + val activityLifeCycleIntegration = fixture.sentryOptions.integrations + .first { it is ActivityLifecycleIntegration } + + assertTrue( + (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker + is ActivityFramesTracker + ) + } + + @Test + fun `When Activity Frames Tracking is disabled, a noop should be initialized`() { + fixture.initSut(hasAppContext = true, configureOptions = { + isEnableActivityFramesTracking = false + }) + + val activityLifeCycleIntegration = fixture.sentryOptions.integrations + .first { it is ActivityLifecycleIntegration } + + assertTrue( + (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker + is NoOpActivityFramesTracker + ) + } } 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 3e4f0b32f40..1e9469524c6 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 @@ -1061,4 +1061,42 @@ class ManifestMetadataReaderTest { // Assert assertTrue(fixture.options.isCollectAdditionalContext) } + + @Test + fun `applyMetadata reads activity frames tracker flag and keeps default value if not found`() { + // Arrange + val context = fixture.getContext() + + // Act + ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) + + // Assert + assertTrue(fixture.options.isEnableActivityFramesTracking) + } + + @Test + fun `applyMetadata reads activity frames tracker and sets it to enabled if true`() { + // Arrange + val bundle = bundleOf(ManifestMetadataReader.PERFORM_ACTIVITY_FRAMES_TRACKING to true) + val context = fixture.getContext(metaData = bundle) + + // Act + ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) + + // Assert + assertTrue(fixture.options.isEnableActivityFramesTracking) + } + + @Test + fun `applyMetadata reads activity frames tracker and sets it to disabled if false`() { + // Arrange + val bundle = bundleOf(ManifestMetadataReader.PERFORM_ACTIVITY_FRAMES_TRACKING to false) + val context = fixture.getContext(metaData = bundle) + + // Act + ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) + + // Assert + assertFalse(fixture.options.isEnableActivityFramesTracking) + } } From fd99cb6b76a02db5c868efbdd45064c21bf82a7b Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 20 Oct 2022 08:33:31 +0200 Subject: [PATCH 2/8] Add Activity Frames Tracker to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 346f07248b1..b2ea9903c97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Profile envelopes are sent directly from profiler ([#2298](https://github.com/getsentry/sentry-java/pull/2298)) - Add support for using Encoder with logback.SentryAppender ([#2246](https://github.com/getsentry/sentry-java/pull/2246)) - Report Startup Crashes ([#2277](https://github.com/getsentry/sentry-java/pull/2277)) +- Add option to enable or disable Activity Frames Tracker ([#2314](https://github.com/getsentry/sentry-java/pull/2314)) ### Dependencies From 88fe044b2900440b5759d228e1d2a84298258b2d Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 20 Oct 2022 12:29:40 +0200 Subject: [PATCH 3/8] Use options flag instead of Noop impl for FrameTracker, improve naming --- .../api/sentry-android-core.api | 29 +++------- .../android/core/ActivityFramesTracker.java | 53 +++++++++---------- .../core/ActivityLifecycleIntegration.java | 6 +-- .../core/AndroidOptionsInitializer.java | 8 ++- .../android/core/IActivityFramesTracker.java | 22 -------- .../android/core/ManifestMetadataReader.java | 7 +-- .../core/NoOpActivityFramesTracker.java | 25 --------- .../PerformanceAndroidEventProcessor.java | 4 +- .../android/core/SentryAndroidOptions.java | 15 +++--- .../android/core/ActivityFramesTrackerTest.kt | 23 ++++---- .../core/AndroidOptionsInitializerTest.kt | 29 +++++++--- .../core/ManifestMetadataReaderTest.kt | 16 +++--- 12 files changed, 92 insertions(+), 145 deletions(-) delete mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java delete mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 91a94ab9763..4bdcfecd270 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -1,15 +1,15 @@ -public final class io/sentry/android/core/ActivityFramesTracker : io/sentry/android/core/IActivityFramesTracker { - public fun (Lio/sentry/android/core/LoadClass;)V - public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/ILogger;)V - public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/ILogger;Lio/sentry/android/core/MainLooperHandler;)V +public final class io/sentry/android/core/ActivityFramesTracker { + public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;)V + public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/MainLooperHandler;)V public fun addActivity (Landroid/app/Activity;)V + public fun isFrameMetricsAggregatorAvailable ()Z public fun setMetrics (Landroid/app/Activity;Lio/sentry/protocol/SentryId;)V public fun stop ()V public fun takeMetrics (Lio/sentry/protocol/SentryId;)Ljava/util/Map; } public final class io/sentry/android/core/ActivityLifecycleIntegration : android/app/Application$ActivityLifecycleCallbacks, io/sentry/Integration, java/io/Closeable { - public fun (Landroid/app/Application;Lio/sentry/android/core/BuildInfoProvider;Lio/sentry/android/core/IActivityFramesTracker;)V + public fun (Landroid/app/Application;Lio/sentry/android/core/BuildInfoProvider;Lio/sentry/android/core/ActivityFramesTracker;)V public fun close ()V public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V public fun onActivityDestroyed (Landroid/app/Activity;)V @@ -79,13 +79,6 @@ public abstract class io/sentry/android/core/EnvelopeFileObserverIntegration : i public final fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } -public abstract interface class io/sentry/android/core/IActivityFramesTracker { - public abstract fun addActivity (Landroid/app/Activity;)V - public abstract fun setMetrics (Landroid/app/Activity;Lio/sentry/protocol/SentryId;)V - public abstract fun stop ()V - public abstract fun takeMetrics (Lio/sentry/protocol/SentryId;)Ljava/util/Map; -} - public abstract interface class io/sentry/android/core/IDebugImagesLoader { public abstract fun clearDebugImages ()V public abstract fun loadDebugImages ()Ljava/util/List; @@ -105,14 +98,6 @@ public final class io/sentry/android/core/NdkIntegration : io/sentry/Integration public final fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } -public final class io/sentry/android/core/NoOpActivityFramesTracker : io/sentry/android/core/IActivityFramesTracker { - public fun ()V - public fun addActivity (Landroid/app/Activity;)V - public fun setMetrics (Landroid/app/Activity;Lio/sentry/protocol/SentryId;)V - public fun stop ()V - public fun takeMetrics (Lio/sentry/protocol/SentryId;)Ljava/util/Map; -} - public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/sentry/Integration, java/io/Closeable { public fun (Landroid/content/Context;)V public fun close ()V @@ -151,12 +136,12 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun isAnrReportInDebug ()Z public fun isAttachScreenshot ()Z public fun isCollectAdditionalContext ()Z - public fun isEnableActivityFramesTracking ()Z public fun isEnableActivityLifecycleBreadcrumbs ()Z public fun isEnableActivityLifecycleTracingAutoFinish ()Z public fun isEnableAppComponentBreadcrumbs ()Z public fun isEnableAppLifecycleBreadcrumbs ()Z public fun isEnableAutoActivityLifecycleTracing ()Z + public fun isEnableFramesTracking ()Z public fun isEnableSystemEventBreadcrumbs ()Z public fun isEnableUserInteractionBreadcrumbs ()Z public fun isEnableUserInteractionTracing ()Z @@ -166,12 +151,12 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun setAttachScreenshot (Z)V public fun setCollectAdditionalContext (Z)V public fun setDebugImagesLoader (Lio/sentry/android/core/IDebugImagesLoader;)V - public fun setEnableActivityFramesTracking (Z)V public fun setEnableActivityLifecycleBreadcrumbs (Z)V public fun setEnableActivityLifecycleTracingAutoFinish (Z)V public fun setEnableAppComponentBreadcrumbs (Z)V public fun setEnableAppLifecycleBreadcrumbs (Z)V public fun setEnableAutoActivityLifecycleTracing (Z)V + public fun setEnableFramesTracking (Z)V public fun setEnableSystemEventBreadcrumbs (Z)V public fun setEnableUserInteractionBreadcrumbs (Z)V public fun setEnableUserInteractionTracing (Z)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index 29acd952c9d..24cb398f8bb 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -3,7 +3,6 @@ import android.app.Activity; import android.util.SparseIntArray; import androidx.core.app.FrameMetricsAggregator; -import io.sentry.ILogger; import io.sentry.MeasurementUnit; import io.sentry.SentryLevel; import io.sentry.android.core.internal.util.MainThreadChecker; @@ -16,60 +15,61 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.annotations.VisibleForTesting; /** * A class that tracks slow and frozen frames using the FrameMetricsAggregator class from * androidx.core package. It also checks if the FrameMetricsAggregator class is available at * runtime. */ -public final class ActivityFramesTracker implements IActivityFramesTracker { +public final class ActivityFramesTracker { private @Nullable FrameMetricsAggregator frameMetricsAggregator = null; - private boolean androidXAvailable = true; + private final SentryAndroidOptions options; private final @NotNull Map> activityMeasurements = new ConcurrentHashMap<>(); private final @NotNull Map frameCountAtStartSnapshots = new WeakHashMap<>(); - private final @Nullable ILogger logger; private final @NotNull MainLooperHandler handler; public ActivityFramesTracker( final @NotNull LoadClass loadClass, - final @Nullable ILogger logger, + final @NotNull SentryAndroidOptions options, final @NotNull MainLooperHandler handler) { - androidXAvailable = - loadClass.isClassAvailable("androidx.core.app.FrameMetricsAggregator", logger); + + final boolean androidXAvailable = + loadClass.isClassAvailable("androidx.core.app.FrameMetricsAggregator", options.getLogger()); + if (androidXAvailable) { frameMetricsAggregator = new FrameMetricsAggregator(); } - this.logger = logger; + this.options = options; this.handler = handler; } - public ActivityFramesTracker(final @NotNull LoadClass loadClass, final @Nullable ILogger logger) { - this(loadClass, logger, new MainLooperHandler()); - } - - public ActivityFramesTracker(final @NotNull LoadClass loadClass) { - this(loadClass, null); + public ActivityFramesTracker( + final @NotNull LoadClass loadClass, final @NotNull SentryAndroidOptions options) { + this(loadClass, options, new MainLooperHandler()); } @TestOnly ActivityFramesTracker( - final @Nullable FrameMetricsAggregator frameMetricsAggregator, - final @NotNull MainLooperHandler handler) { + final @NotNull LoadClass loadClass, + final @NotNull SentryAndroidOptions options, + final @NotNull MainLooperHandler handler, + final @Nullable FrameMetricsAggregator frameMetricsAggregator) { + + this(loadClass, options, handler); this.frameMetricsAggregator = frameMetricsAggregator; - this.logger = null; - this.handler = handler; } - private boolean isFrameMetricsAggregatorAvailable() { - return androidXAvailable && frameMetricsAggregator != null; + @VisibleForTesting + public boolean isFrameMetricsAggregatorAvailable() { + return frameMetricsAggregator != null && options.isEnableFramesTracking(); } - @Override @SuppressWarnings("NullAway") public synchronized void addActivity(final @NotNull Activity activity) { if (!isFrameMetricsAggregatorAvailable()) { @@ -124,7 +124,6 @@ private void snapshotFrameCountsAtStart(final @NotNull Activity activity) { return new FrameCounts(totalFrames, slowFrames, frozenFrames); } - @Override @SuppressWarnings("NullAway") public synchronized void setMetrics( final @NotNull Activity activity, final @NotNull SentryId transactionId) { @@ -185,7 +184,6 @@ public synchronized void setMetrics( return new FrameCounts(diffTotalFrames, diffSlowFrames, diffFrozenFrames); } - @Override @Nullable public synchronized Map takeMetrics( final @NotNull SentryId transactionId) { @@ -199,7 +197,6 @@ public synchronized void setMetrics( return stringMeasurementValueMap; } - @Override @SuppressWarnings("NullAway") public synchronized void stop() { if (isFrameMetricsAggregatorAvailable()) { @@ -219,15 +216,15 @@ private void runSafelyOnUiThread(final Runnable runnable, final String tag) { try { runnable.run(); } catch (Throwable ignored) { - if (logger != null && tag != null) { - logger.log(SentryLevel.WARNING, "Failed to execute " + tag); + if (tag != null) { + options.getLogger().log(SentryLevel.WARNING, "Failed to execute " + tag); } } }); } } catch (Throwable ignored) { - if (logger != null && tag != null) { - logger.log(SentryLevel.WARNING, "Failed to execute " + tag); + if (tag != null) { + options.getLogger().log(SentryLevel.WARNING, "Failed to execute " + tag); } } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java index b3cd26f8cf2..a307b016798 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java @@ -62,12 +62,12 @@ public final class ActivityLifecycleIntegration private final @NotNull WeakHashMap activitiesWithOngoingTransactions = new WeakHashMap<>(); - private final @NotNull IActivityFramesTracker activityFramesTracker; + private final @NotNull ActivityFramesTracker activityFramesTracker; public ActivityLifecycleIntegration( final @NotNull Application application, final @NotNull BuildInfoProvider buildInfoProvider, - final @NotNull IActivityFramesTracker activityFramesTracker) { + final @NotNull ActivityFramesTracker activityFramesTracker) { this.application = Objects.requireNonNull(application, "Application is required"); Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required"); this.activityFramesTracker = @@ -389,7 +389,7 @@ WeakHashMap getActivitiesWithOngoingTransactions() { @TestOnly @NotNull - IActivityFramesTracker getActivityFramesTracker() { + ActivityFramesTracker getActivityFramesTracker() { return activityFramesTracker; } 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 cd00fb41f5f..2167964d17a 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 @@ -134,10 +134,8 @@ static void init( initializeCacheDirs(context, options); options.setEnvelopeDiskCache(new AndroidEnvelopeCache(options)); - final IActivityFramesTracker activityFramesTracker = - options.isEnableActivityFramesTracking() - ? new ActivityFramesTracker(loadClass, options.getLogger()) - : new NoOpActivityFramesTracker(); + final ActivityFramesTracker activityFramesTracker = + new ActivityFramesTracker(loadClass, options); installDefaultIntegrations( context, @@ -164,7 +162,7 @@ private static void installDefaultIntegrations( final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider, final @NotNull LoadClass loadClass, - final @NotNull IActivityFramesTracker activityFramesTracker, + final @NotNull ActivityFramesTracker activityFramesTracker, final boolean isFragmentAvailable, final boolean isTimberAvailable) { diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java deleted file mode 100644 index ce7c701eb86..00000000000 --- a/sentry-android-core/src/main/java/io/sentry/android/core/IActivityFramesTracker.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.sentry.android.core; - -import android.app.Activity; -import io.sentry.protocol.MeasurementValue; -import io.sentry.protocol.SentryId; -import java.util.Map; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface IActivityFramesTracker { - @SuppressWarnings("NullAway") - void addActivity(@NotNull Activity activity); - - @SuppressWarnings("NullAway") - void setMetrics(@NotNull Activity activity, @NotNull SentryId transactionId); - - @Nullable - Map takeMetrics(@NotNull SentryId transactionId); - - @SuppressWarnings("NullAway") - void stop(); -} 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 c162762a9de..37e9f1b7ed4 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 @@ -78,7 +78,7 @@ final class ManifestMetadataReader { static final String CLIENT_REPORTS_ENABLE = "io.sentry.send-client-reports"; static final String COLLECT_ADDITIONAL_CONTEXT = "io.sentry.additional-context"; - static final String PERFORM_ACTIVITY_FRAMES_TRACKING = "io.sentry.activity-frames-tracking"; + static final String PERFORM_FRAMES_TRACKING = "io.sentry.traces.frames-tracking"; /** ManifestMetadataReader ctor */ private ManifestMetadataReader() {} @@ -288,10 +288,7 @@ static void applyMetadata( options.setTracePropagationTargets(tracePropagationTargets); } - if (metadata.containsKey(PERFORM_ACTIVITY_FRAMES_TRACKING)) { - options.setEnableActivityFramesTracking( - readBool(metadata, logger, PERFORM_ACTIVITY_FRAMES_TRACKING, true)); - } + options.setEnableFramesTracking(readBool(metadata, logger, PERFORM_FRAMES_TRACKING, true)); options.setProguardUuid( readString(metadata, logger, PROGUARD_UUID, options.getProguardUuid())); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java deleted file mode 100644 index f234745a302..00000000000 --- a/sentry-android-core/src/main/java/io/sentry/android/core/NoOpActivityFramesTracker.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.sentry.android.core; - -import android.app.Activity; -import io.sentry.protocol.MeasurementValue; -import io.sentry.protocol.SentryId; -import java.util.Map; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public final class NoOpActivityFramesTracker implements IActivityFramesTracker { - @Override - public void addActivity(@NotNull Activity activity) {} - - @Override - public void setMetrics(@NotNull Activity activity, @NotNull SentryId transactionId) {} - - @Override - public @Nullable Map takeMetrics( - @NotNull SentryId transactionId) { - return null; - } - - @Override - public void stop() {} -} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index 7c261439558..669f34c80e9 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -24,12 +24,12 @@ final class PerformanceAndroidEventProcessor implements EventProcessor { private boolean sentStartMeasurement = false; - private final @NotNull IActivityFramesTracker activityFramesTracker; + private final @NotNull ActivityFramesTracker activityFramesTracker; private final @NotNull SentryAndroidOptions options; PerformanceAndroidEventProcessor( final @NotNull SentryAndroidOptions options, - final @NotNull IActivityFramesTracker activityFramesTracker) { + final @NotNull ActivityFramesTracker activityFramesTracker) { this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required"); this.activityFramesTracker = Objects.requireNonNull(activityFramesTracker, "ActivityFramesTracker is required"); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 8ca944d6568..d58ea763146 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -131,7 +131,7 @@ public final class SentryAndroidOptions extends SentryOptions { */ private final long startupCrashDurationThresholdMillis = 2000; // 2s - private boolean enableActivityFramesTracking = true; + private boolean enableFramesTracking = true; public SentryAndroidOptions() { setSentryClientName(BuildConfig.SENTRY_ANDROID_SDK_NAME + "/" + BuildConfig.VERSION_NAME); @@ -359,18 +359,17 @@ public void setCollectAdditionalContext(boolean collectAdditionalContext) { this.collectAdditionalContext = collectAdditionalContext; } - public boolean isEnableActivityFramesTracking() { - return enableActivityFramesTracking; + public boolean isEnableFramesTracking() { + return enableFramesTracking; } /** - * Enable or disable Activity Frames Tracking, which is used to report slow and frozen frames. + * Enable or disable Frames Tracking, which is used to report slow and frozen frames. * - * @param enableActivityFramesTracking true if activity frames tracking should be enabled, false - * otherwise. + * @param enableFramesTracking true if frames tracking should be enabled, false otherwise. */ - public void setEnableActivityFramesTracking(boolean enableActivityFramesTracking) { - this.enableActivityFramesTracking = enableActivityFramesTracking; + public void setEnableFramesTracking(boolean enableFramesTracking) { + this.enableFramesTracking = enableFramesTracking; } /** diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt index 5d29ae714b3..dd6ec6169a3 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt @@ -25,9 +25,14 @@ class ActivityFramesTrackerTest { val sentryId = SentryId() val loadClass = mock() val handler = mock() - - fun getSut(): ActivityFramesTracker { - return ActivityFramesTracker(aggregator, handler) + val options = SentryAndroidOptions() + + fun getSut(mockAggregator: Boolean = true): ActivityFramesTracker { + return if (mockAggregator) { + ActivityFramesTracker(loadClass, options, handler, aggregator) + } else { + ActivityFramesTracker(loadClass, options, handler) + } } } private val fixture = Fixture() @@ -287,7 +292,7 @@ class ActivityFramesTrackerTest { @Test fun `addActivity does not throw if no AndroidX`() { whenever(fixture.loadClass.isClassAvailable(any(), any())).thenReturn(false) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut(false) sut.addActivity(fixture.activity) } @@ -295,7 +300,7 @@ class ActivityFramesTrackerTest { @Test fun `setMetrics does not throw if no AndroidX`() { whenever(fixture.loadClass.isClassAvailable(any(), any())).thenReturn(false) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut(false) sut.setMetrics(fixture.activity, fixture.sentryId) } @@ -303,7 +308,7 @@ class ActivityFramesTrackerTest { @Test fun `addActivity and setMetrics combined do not throw if no AndroidX`() { whenever(fixture.loadClass.isClassAvailable(any(), any())).thenReturn(false) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut(false) sut.addActivity(fixture.activity) sut.setMetrics(fixture.activity, fixture.sentryId) @@ -312,7 +317,7 @@ class ActivityFramesTrackerTest { @Test fun `setMetrics does not throw if Activity is not added`() { whenever(fixture.aggregator.metrics).thenThrow(IllegalArgumentException()) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut() sut.setMetrics(fixture.activity, fixture.sentryId) } @@ -320,7 +325,7 @@ class ActivityFramesTrackerTest { @Test fun `stop does not throw if no AndroidX`() { whenever(fixture.loadClass.isClassAvailable(any(), any())).thenReturn(false) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut(false) sut.stop() } @@ -337,7 +342,7 @@ class ActivityFramesTrackerTest { @Test fun `takeMetrics returns null if no AndroidX`() { whenever(fixture.loadClass.isClassAvailable(any(), any())).thenReturn(false) - val sut = ActivityFramesTracker(fixture.loadClass) + val sut = fixture.getSut(false) assertNull(sut.takeMetrics(fixture.sentryId)) } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt index cc000815ab1..5403d192236 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt @@ -373,32 +373,45 @@ class AndroidOptionsInitializerTest { } @Test - fun `When Activity Frames Tracking is enabled, the proper class should be initialized`() { + fun `When Activity Frames Tracking is enabled, the Activity Frames Tracker should be available`() { fixture.initSut(hasAppContext = true, configureOptions = { - isEnableActivityFramesTracking = true + isEnableFramesTracking = true }) val activityLifeCycleIntegration = fixture.sentryOptions.integrations .first { it is ActivityLifecycleIntegration } assertTrue( - (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker - is ActivityFramesTracker + (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker.isFrameMetricsAggregatorAvailable ) } @Test - fun `When Activity Frames Tracking is disabled, a noop should be initialized`() { + fun `When Frames Tracking is disabled, the Activity Frames Tracker should not be available`() { fixture.initSut(hasAppContext = true, configureOptions = { - isEnableActivityFramesTracking = false + isEnableFramesTracking = false + }) + + val activityLifeCycleIntegration = fixture.sentryOptions.integrations + .first { it is ActivityLifecycleIntegration } + + assertFalse( + (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker.isFrameMetricsAggregatorAvailable + ) + } + + @Test + fun `When Frames Tracking is initially disabled, but enabled via configureOptions it should be available`() { + fixture.sentryOptions.isEnableFramesTracking = false + fixture.initSut(hasAppContext = true, configureOptions = { + isEnableFramesTracking = true }) val activityLifeCycleIntegration = fixture.sentryOptions.integrations .first { it is ActivityLifecycleIntegration } assertTrue( - (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker - is NoOpActivityFramesTracker + (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker.isFrameMetricsAggregatorAvailable ) } } 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 1e9469524c6..9d114020721 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 @@ -1063,7 +1063,7 @@ class ManifestMetadataReaderTest { } @Test - fun `applyMetadata reads activity frames tracker flag and keeps default value if not found`() { + fun `applyMetadata reads frames tracking flag and keeps default value if not found`() { // Arrange val context = fixture.getContext() @@ -1071,32 +1071,32 @@ class ManifestMetadataReaderTest { ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) // Assert - assertTrue(fixture.options.isEnableActivityFramesTracking) + assertTrue(fixture.options.isEnableFramesTracking) } @Test - fun `applyMetadata reads activity frames tracker and sets it to enabled if true`() { + fun `applyMetadata reads frames tracking and sets it to enabled if true`() { // Arrange - val bundle = bundleOf(ManifestMetadataReader.PERFORM_ACTIVITY_FRAMES_TRACKING to true) + val bundle = bundleOf(ManifestMetadataReader.PERFORM_FRAMES_TRACKING to true) val context = fixture.getContext(metaData = bundle) // Act ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) // Assert - assertTrue(fixture.options.isEnableActivityFramesTracking) + assertTrue(fixture.options.isEnableFramesTracking) } @Test - fun `applyMetadata reads activity frames tracker and sets it to disabled if false`() { + fun `applyMetadata reads frames tracking and sets it to disabled if false`() { // Arrange - val bundle = bundleOf(ManifestMetadataReader.PERFORM_ACTIVITY_FRAMES_TRACKING to false) + val bundle = bundleOf(ManifestMetadataReader.PERFORM_FRAMES_TRACKING to false) val context = fixture.getContext(metaData = bundle) // Act ManifestMetadataReader.applyMetadata(context, fixture.options, fixture.buildInfoProvider) // Assert - assertFalse(fixture.options.isEnableActivityFramesTracking) + assertFalse(fixture.options.isEnableFramesTracking) } } From afb587eee9379f2d81add9f002a82e0086ef1678 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 24 Oct 2022 09:09:06 +0200 Subject: [PATCH 4/8] Restore ActivityFramesTracker constructor, as it's required for flutter --- .../io/sentry/android/core/ActivityFramesTracker.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index 24cb398f8bb..560e481f906 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -54,6 +54,14 @@ public ActivityFramesTracker( this(loadClass, options, new MainLooperHandler()); } + /** + * @deprecated please use {{@link ActivityFramesTracker#ActivityFramesTracker(LoadClass, + * SentryAndroidOptions)}} instead. + */ + public ActivityFramesTracker(final @NotNull LoadClass loadClass) { + this(loadClass, new SentryAndroidOptions()); + } + @TestOnly ActivityFramesTracker( final @NotNull LoadClass loadClass, From fb706a8e37758dda5033f540a4d5c4cb8abbb6a2 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 24 Oct 2022 09:19:48 +0200 Subject: [PATCH 5/8] Fix missing @Deprecated annotation for ActivityFramesTracker --- .../main/java/io/sentry/android/core/ActivityFramesTracker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index 560e481f906..b9becb0933d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -58,6 +58,7 @@ public ActivityFramesTracker( * @deprecated please use {{@link ActivityFramesTracker#ActivityFramesTracker(LoadClass, * SentryAndroidOptions)}} instead. */ + @Deprecated public ActivityFramesTracker(final @NotNull LoadClass loadClass) { this(loadClass, new SentryAndroidOptions()); } From 0ebcc82a5327798d4a189e36341ffc21f65d744f Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 24 Oct 2022 09:26:33 +0200 Subject: [PATCH 6/8] Fix disable InlineMeSuggester error --- .../main/java/io/sentry/android/core/ActivityFramesTracker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index b9becb0933d..e14f482b8fb 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -59,6 +59,7 @@ public ActivityFramesTracker( * SentryAndroidOptions)}} instead. */ @Deprecated + @SuppressWarnings("InlineMeSuggester") public ActivityFramesTracker(final @NotNull LoadClass loadClass) { this(loadClass, new SentryAndroidOptions()); } From fc2948e1919f0dea0193d0fd8ce181a0e3654f68 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 24 Oct 2022 09:26:46 +0200 Subject: [PATCH 7/8] Add missing .api file update --- sentry-android-core/api/sentry-android-core.api | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 4bdcfecd270..b0235dda090 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -1,4 +1,5 @@ public final class io/sentry/android/core/ActivityFramesTracker { + public fun (Lio/sentry/android/core/LoadClass;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/MainLooperHandler;)V public fun addActivity (Landroid/app/Activity;)V From 21c07393a5b46f372fb7ff6958b6dcb1d414eb1b Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 24 Oct 2022 10:02:00 +0200 Subject: [PATCH 8/8] Adapt ActivityFramesTracker ctor and options nullability --- sentry-android-core/api/sentry-android-core.api | 1 - .../sentry/android/core/ActivityFramesTracker.java | 12 +----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index b0235dda090..4bdcfecd270 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -1,5 +1,4 @@ public final class io/sentry/android/core/ActivityFramesTracker { - public fun (Lio/sentry/android/core/LoadClass;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;)V public fun (Lio/sentry/android/core/LoadClass;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/MainLooperHandler;)V public fun addActivity (Landroid/app/Activity;)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index e14f482b8fb..4dd16e03e00 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -25,7 +25,7 @@ public final class ActivityFramesTracker { private @Nullable FrameMetricsAggregator frameMetricsAggregator = null; - private final SentryAndroidOptions options; + private @NotNull final SentryAndroidOptions options; private final @NotNull Map> activityMeasurements = new ConcurrentHashMap<>(); @@ -54,16 +54,6 @@ public ActivityFramesTracker( this(loadClass, options, new MainLooperHandler()); } - /** - * @deprecated please use {{@link ActivityFramesTracker#ActivityFramesTracker(LoadClass, - * SentryAndroidOptions)}} instead. - */ - @Deprecated - @SuppressWarnings("InlineMeSuggester") - public ActivityFramesTracker(final @NotNull LoadClass loadClass) { - this(loadClass, new SentryAndroidOptions()); - } - @TestOnly ActivityFramesTracker( final @NotNull LoadClass loadClass,