From ca02d924e2111276242c08c92b7421271e46e10a Mon Sep 17 00:00:00 2001 From: Marcin Laskowski Date: Fri, 14 Oct 2022 12:38:34 +0200 Subject: [PATCH 1/4] Fix: Make lifecycle breadcrumbs logged in fragments customizable (#1734) --- .../api/sentry-android-fragment.api | 38 +++++++--------- .../fragment/FragmentLifecycleIntegration.kt | 23 ++++++++-- .../fragment/FragmentLifecycleState.kt | 15 +++++++ .../SentryFragmentLifecycleCallbacks.kt | 44 ++++++++----------- .../FragmentLifecycleIntegrationTest.kt | 5 ++- .../SentryFragmentLifecycleCallbacksTest.kt | 21 ++++++--- 6 files changed, 86 insertions(+), 60 deletions(-) create mode 100644 sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleState.kt rename sentry-android-fragment/src/main/java/io/sentry/android/fragment/{ => internal}/SentryFragmentLifecycleCallbacks.kt (78%) rename sentry-android-fragment/src/test/java/io/sentry/android/fragment/{ => internal}/SentryFragmentLifecycleCallbacksTest.kt (90%) diff --git a/sentry-android-fragment/api/sentry-android-fragment.api b/sentry-android-fragment/api/sentry-android-fragment.api index 5e7673c1b3..2256638db4 100644 --- a/sentry-android-fragment/api/sentry-android-fragment.api +++ b/sentry-android-fragment/api/sentry-android-fragment.api @@ -8,6 +8,7 @@ public final class io/sentry/android/fragment/BuildConfig { public final class io/sentry/android/fragment/FragmentLifecycleIntegration : android/app/Application$ActivityLifecycleCallbacks, io/sentry/Integration, java/io/Closeable { public fun (Landroid/app/Application;)V + public fun (Landroid/app/Application;Ljava/util/Set;Z)V public fun (Landroid/app/Application;ZZ)V public fun close ()V public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V @@ -20,28 +21,19 @@ public final class io/sentry/android/fragment/FragmentLifecycleIntegration : and public fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } -public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks : androidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks { - public static final field Companion Lio/sentry/android/fragment/SentryFragmentLifecycleCallbacks$Companion; - public static final field FRAGMENT_LOAD_OP Ljava/lang/String; - public fun (Lio/sentry/IHub;ZZ)V - public synthetic fun (Lio/sentry/IHub;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (ZZ)V - public synthetic fun (ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getEnableAutoFragmentLifecycleTracing ()Z - public final fun getEnableFragmentLifecycleBreadcrumbs ()Z - public fun onFragmentAttached (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/content/Context;)V - public fun onFragmentCreated (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V - public fun onFragmentDestroyed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentDetached (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentPaused (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentResumed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentSaveInstanceState (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V - public fun onFragmentStarted (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentStopped (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V - public fun onFragmentViewCreated (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;)V - public fun onFragmentViewDestroyed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V -} - -public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks$Companion { +public final class io/sentry/android/fragment/FragmentLifecycleState : java/lang/Enum { + public static final field ATTACHED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field CREATED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field DESTROYED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field DETACHED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field PAUSED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field RESUMED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field SAVE_INSTANCE_STATE Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field STARTED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field STOPPED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field VIEW_CREATED Lio/sentry/android/fragment/FragmentLifecycleState; + public static final field VIEW_DESTROYED Lio/sentry/android/fragment/FragmentLifecycleState; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/android/fragment/FragmentLifecycleState; + public static fun values ()[Lio/sentry/android/fragment/FragmentLifecycleState; } diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt index dfa2b145cb..a5e7613265 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt @@ -9,18 +9,35 @@ import io.sentry.IHub import io.sentry.Integration import io.sentry.SentryLevel.DEBUG import io.sentry.SentryOptions +import io.sentry.android.fragment.internal.SentryFragmentLifecycleCallbacks import java.io.Closeable class FragmentLifecycleIntegration( private val application: Application, - private val enableFragmentLifecycleBreadcrumbs: Boolean, + private val loggedFragmentLifecycleStates: Set, private val enableAutoFragmentLifecycleTracing: Boolean ) : ActivityLifecycleCallbacks, Integration, Closeable { - constructor(application: Application) : this(application, true, false) + constructor(application: Application) : this( + application = application, + loggedFragmentLifecycleStates = FragmentLifecycleState.values().toSet(), + enableAutoFragmentLifecycleTracing = false + ) + + constructor( + application: Application, + enableFragmentLifecycleBreadcrumbs: Boolean, + enableAutoFragmentLifecycleTracing: Boolean + ) : this( + application = application, + loggedFragmentLifecycleStates = FragmentLifecycleState.values().toSet() + .takeIf { enableFragmentLifecycleBreadcrumbs } + .orEmpty(), + enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing + ) private lateinit var hub: IHub private lateinit var options: SentryOptions @@ -46,7 +63,7 @@ class FragmentLifecycleIntegration( ?.registerFragmentLifecycleCallbacks( SentryFragmentLifecycleCallbacks( hub = hub, - enableFragmentLifecycleBreadcrumbs = enableFragmentLifecycleBreadcrumbs, + loggedFragmentLifecycleStates = loggedFragmentLifecycleStates, enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ), true diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleState.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleState.kt new file mode 100644 index 0000000000..cdc5ea999d --- /dev/null +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleState.kt @@ -0,0 +1,15 @@ +package io.sentry.android.fragment + +enum class FragmentLifecycleState(internal val breadcrumbName: String) { + ATTACHED("attached"), + SAVE_INSTANCE_STATE("save instance state"), + CREATED("created"), + VIEW_CREATED("view created"), + STARTED("started"), + RESUMED("resumed"), + PAUSED("paused"), + STOPPED("stopped"), + VIEW_DESTROYED("view destroyed"), + DESTROYED("destroyed"), + DETACHED("detached") +} diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt similarity index 78% rename from sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt rename to sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt index dcc1b116a8..19c9a973ab 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt @@ -1,4 +1,4 @@ -package io.sentry.android.fragment +package io.sentry.android.fragment.internal import android.content.Context import android.os.Bundle @@ -14,24 +14,16 @@ import io.sentry.ISpan import io.sentry.SentryLevel.INFO import io.sentry.SpanStatus import io.sentry.TypeCheckHint.ANDROID_FRAGMENT +import io.sentry.android.fragment.FragmentLifecycleState import java.util.WeakHashMap @Suppress("TooManyFunctions") -class SentryFragmentLifecycleCallbacks( +internal class SentryFragmentLifecycleCallbacks( private val hub: IHub = HubAdapter.getInstance(), - val enableFragmentLifecycleBreadcrumbs: Boolean, + val loggedFragmentLifecycleStates: Set, val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { - constructor( - enableFragmentLifecycleBreadcrumbs: Boolean = true, - enableAutoFragmentLifecycleTracing: Boolean = false - ) : this( - hub = HubAdapter.getInstance(), - enableFragmentLifecycleBreadcrumbs = enableFragmentLifecycleBreadcrumbs, - enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing - ) - private val isPerformanceEnabled get() = hub.options.isTracingEnabled && enableAutoFragmentLifecycleTracing private val fragmentsWithOngoingTransactions = WeakHashMap() @@ -41,7 +33,7 @@ class SentryFragmentLifecycleCallbacks( fragment: Fragment, context: Context ) { - addBreadcrumb(fragment, "attached") + addBreadcrumb(fragment, FragmentLifecycleState.ATTACHED) } override fun onFragmentSaveInstanceState( @@ -49,7 +41,7 @@ class SentryFragmentLifecycleCallbacks( fragment: Fragment, outState: Bundle ) { - addBreadcrumb(fragment, "save instance state") + addBreadcrumb(fragment, FragmentLifecycleState.SAVE_INSTANCE_STATE) } override fun onFragmentCreated( @@ -57,7 +49,7 @@ class SentryFragmentLifecycleCallbacks( fragment: Fragment, savedInstanceState: Bundle? ) { - addBreadcrumb(fragment, "created") + addBreadcrumb(fragment, FragmentLifecycleState.CREATED) // we only start the tracing for the fragment if the fragment has been added to its activity // and not only to the backstack @@ -72,48 +64,48 @@ class SentryFragmentLifecycleCallbacks( view: View, savedInstanceState: Bundle? ) { - addBreadcrumb(fragment, "view created") + addBreadcrumb(fragment, FragmentLifecycleState.VIEW_CREATED) } override fun onFragmentStarted(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "started") + addBreadcrumb(fragment, FragmentLifecycleState.STARTED) } override fun onFragmentResumed(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "resumed") + addBreadcrumb(fragment, FragmentLifecycleState.RESUMED) stopTracing(fragment) } override fun onFragmentPaused(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "paused") + addBreadcrumb(fragment, FragmentLifecycleState.PAUSED) } override fun onFragmentStopped(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "stopped") + addBreadcrumb(fragment, FragmentLifecycleState.STOPPED) } override fun onFragmentViewDestroyed(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "view destroyed") + addBreadcrumb(fragment, FragmentLifecycleState.VIEW_DESTROYED) } override fun onFragmentDestroyed(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "destroyed") + addBreadcrumb(fragment, FragmentLifecycleState.DESTROYED) stopTracing(fragment) } override fun onFragmentDetached(fragmentManager: FragmentManager, fragment: Fragment) { - addBreadcrumb(fragment, "detached") + addBreadcrumb(fragment, FragmentLifecycleState.DETACHED) } - private fun addBreadcrumb(fragment: Fragment, state: String) { - if (!enableFragmentLifecycleBreadcrumbs) { + private fun addBreadcrumb(fragment: Fragment, state: FragmentLifecycleState) { + if (!loggedFragmentLifecycleStates.contains(state)) { return } val breadcrumb = Breadcrumb().apply { type = "navigation" - setData("state", state) + setData("state", state.breadcrumbName) setData("screen", getFragmentName(fragment)) category = "ui.fragment.lifecycle" level = INFO diff --git a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt index 889fc424a3..e70c7950cd 100644 --- a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt +++ b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt @@ -12,8 +12,9 @@ import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import io.sentry.IHub import io.sentry.SentryOptions +import io.sentry.android.fragment.internal.SentryFragmentLifecycleCallbacks import kotlin.test.Test -import kotlin.test.assertFalse +import kotlin.test.assertEquals import kotlin.test.assertTrue class FragmentLifecycleIntegrationTest { @@ -91,7 +92,7 @@ class FragmentLifecycleIntegrationTest { check { fragmentCallbacks -> val callback = (fragmentCallbacks as SentryFragmentLifecycleCallbacks) assertTrue(callback.enableAutoFragmentLifecycleTracing) - assertFalse(callback.enableFragmentLifecycleBreadcrumbs) + assertEquals(emptySet(), callback.loggedFragmentLifecycleStates) }, eq(true) ) diff --git a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt similarity index 90% rename from sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt rename to sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt index 6ece174100..d04d1c0fa5 100644 --- a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt +++ b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt @@ -1,4 +1,4 @@ -package io.sentry.android.fragment +package io.sentry.android.fragment.internal import android.content.Context import android.os.Bundle @@ -9,6 +9,7 @@ import com.nhaarman.mockitokotlin2.anyOrNull import com.nhaarman.mockitokotlin2.check import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.never +import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import io.sentry.Breadcrumb @@ -20,9 +21,11 @@ import io.sentry.ScopeCallback import io.sentry.SentryLevel.INFO import io.sentry.SentryOptions import io.sentry.SpanStatus +import io.sentry.android.fragment.FragmentLifecycleState import kotlin.test.Test import kotlin.test.assertEquals +@Suppress("SameParameterValue") class SentryFragmentLifecycleCallbacksTest { private class Fixture { @@ -35,7 +38,7 @@ class SentryFragmentLifecycleCallbacksTest { val span = mock() fun getSut( - enableFragmentLifecycleBreadcrumbs: Boolean = true, + loggedFragmentLifecycleStates: Set = FragmentLifecycleState.values().toSet(), enableAutoFragmentLifecycleTracing: Boolean = false, tracesSampleRate: Double? = 1.0, isAdded: Boolean = true @@ -53,7 +56,7 @@ class SentryFragmentLifecycleCallbacksTest { whenever(fragment.isAdded).thenReturn(isAdded) return SentryFragmentLifecycleCallbacks( hub = hub, - enableFragmentLifecycleBreadcrumbs = enableFragmentLifecycleBreadcrumbs, + loggedFragmentLifecycleStates = loggedFragmentLifecycleStates, enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ) } @@ -71,12 +74,14 @@ class SentryFragmentLifecycleCallbacksTest { } @Test - fun `When fragment is attached with disabled breadcrumbs, it should not add breadcrumb`() { - val sut = fixture.getSut(enableFragmentLifecycleBreadcrumbs = false) + fun `When fragment is attached with subset of logged breadcrumbs, it should add only those breadcrumbs`() { + val sut = fixture.getSut(loggedFragmentLifecycleStates = setOf(FragmentLifecycleState.CREATED)) + sut.onFragmentCreated(fixture.fragmentManager, fixture.fragment, savedInstanceState = null) sut.onFragmentAttached(fixture.fragmentManager, fixture.fragment, fixture.context) - verify(fixture.hub, never()).addBreadcrumb(any()) + verifyBreadcrumbAddedCount(1) + verifyBreadcrumbAdded("created") } @Test @@ -273,4 +278,8 @@ class SentryFragmentLifecycleCallbacksTest { anyOrNull() ) } + + private fun verifyBreadcrumbAddedCount(count: Int) { + verify(fixture.hub, times(count)).addBreadcrumb(any(), anyOrNull()) + } } From e147a16678148adf2cb1bdabd7fc699b6a0310ca Mon Sep 17 00:00:00 2001 From: Marcin Laskowski Date: Sun, 23 Oct 2022 12:01:00 +0200 Subject: [PATCH 2/4] Restored api compatibility --- CHANGELOG.md | 1 + .../api/sentry-android-fragment.api | 27 ++++++++++++++ .../fragment/FragmentLifecycleIntegration.kt | 9 +++-- .../SentryFragmentLifecycleCallbacks.kt | 35 ++++++++++++++++--- .../FragmentLifecycleIntegrationTest.kt | 3 +- .../SentryFragmentLifecycleCallbacksTest.kt | 5 ++- 6 files changed, 65 insertions(+), 15 deletions(-) rename sentry-android-fragment/src/main/java/io/sentry/android/fragment/{internal => }/SentryFragmentLifecycleCallbacks.kt (80%) rename sentry-android-fragment/src/test/java/io/sentry/android/fragment/{internal => }/SentryFragmentLifecycleCallbacksTest.kt (98%) diff --git a/CHANGELOG.md b/CHANGELOG.md index b20b09120e..fafb1633ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - 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)) - HTTP Client errors for OkHttp ([#2287](https://github.com/getsentry/sentry-java/pull/2287)) +- Customizable fragment lifecycle breadcrumbs ([#2299](https://github.com/getsentry/sentry-java/pull/2299)) ### Dependencies diff --git a/sentry-android-fragment/api/sentry-android-fragment.api b/sentry-android-fragment/api/sentry-android-fragment.api index 2256638db4..4b3487c36e 100644 --- a/sentry-android-fragment/api/sentry-android-fragment.api +++ b/sentry-android-fragment/api/sentry-android-fragment.api @@ -37,3 +37,30 @@ public final class io/sentry/android/fragment/FragmentLifecycleState : java/lang public static fun values ()[Lio/sentry/android/fragment/FragmentLifecycleState; } +public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks : androidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks { + public static final field Companion Lio/sentry/android/fragment/SentryFragmentLifecycleCallbacks$Companion; + public static final field FRAGMENT_LOAD_OP Ljava/lang/String; + public fun (Lio/sentry/IHub;Ljava/util/Set;Z)V + public synthetic fun (Lio/sentry/IHub;Ljava/util/Set;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/sentry/IHub;ZZ)V + public fun (ZZ)V + public synthetic fun (ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getEnableAutoFragmentLifecycleTracing ()Z + public final fun getEnableFragmentLifecycleBreadcrumbs ()Z + public final fun getFilterFragmentLifecycleBreadcrumbs ()Ljava/util/Set; + public fun onFragmentAttached (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/content/Context;)V + public fun onFragmentCreated (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V + public fun onFragmentDestroyed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentDetached (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentPaused (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentResumed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentSaveInstanceState (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V + public fun onFragmentStarted (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentStopped (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V + public fun onFragmentViewCreated (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;)V + public fun onFragmentViewDestroyed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V +} + +public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks$Companion { +} + diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt index a5e7613265..521292f8a8 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt @@ -9,12 +9,11 @@ import io.sentry.IHub import io.sentry.Integration import io.sentry.SentryLevel.DEBUG import io.sentry.SentryOptions -import io.sentry.android.fragment.internal.SentryFragmentLifecycleCallbacks import java.io.Closeable class FragmentLifecycleIntegration( private val application: Application, - private val loggedFragmentLifecycleStates: Set, + private val filterFragmentLifecycleBreadcrumbs: Set, private val enableAutoFragmentLifecycleTracing: Boolean ) : ActivityLifecycleCallbacks, @@ -23,7 +22,7 @@ class FragmentLifecycleIntegration( constructor(application: Application) : this( application = application, - loggedFragmentLifecycleStates = FragmentLifecycleState.values().toSet(), + filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.values().toSet(), enableAutoFragmentLifecycleTracing = false ) @@ -33,7 +32,7 @@ class FragmentLifecycleIntegration( enableAutoFragmentLifecycleTracing: Boolean ) : this( application = application, - loggedFragmentLifecycleStates = FragmentLifecycleState.values().toSet() + filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.values().toSet() .takeIf { enableFragmentLifecycleBreadcrumbs } .orEmpty(), enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing @@ -63,7 +62,7 @@ class FragmentLifecycleIntegration( ?.registerFragmentLifecycleCallbacks( SentryFragmentLifecycleCallbacks( hub = hub, - loggedFragmentLifecycleStates = loggedFragmentLifecycleStates, + filterFragmentLifecycleBreadcrumbs = filterFragmentLifecycleBreadcrumbs, enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ), true diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt similarity index 80% rename from sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt rename to sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt index 19c9a973ab..72ef511aae 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacks.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt @@ -1,4 +1,4 @@ -package io.sentry.android.fragment.internal +package io.sentry.android.fragment import android.content.Context import android.os.Bundle @@ -14,13 +14,12 @@ import io.sentry.ISpan import io.sentry.SentryLevel.INFO import io.sentry.SpanStatus import io.sentry.TypeCheckHint.ANDROID_FRAGMENT -import io.sentry.android.fragment.FragmentLifecycleState import java.util.WeakHashMap @Suppress("TooManyFunctions") -internal class SentryFragmentLifecycleCallbacks( +class SentryFragmentLifecycleCallbacks( private val hub: IHub = HubAdapter.getInstance(), - val loggedFragmentLifecycleStates: Set, + val filterFragmentLifecycleBreadcrumbs: Set, val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { @@ -28,6 +27,32 @@ internal class SentryFragmentLifecycleCallbacks( private val fragmentsWithOngoingTransactions = WeakHashMap() + constructor( + hub: IHub, + enableFragmentLifecycleBreadcrumbs: Boolean, + enableAutoFragmentLifecycleTracing: Boolean + ) : this( + hub = hub, + filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.values().toSet() + .takeIf { enableFragmentLifecycleBreadcrumbs } + .orEmpty(), + enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing + ) + + constructor( + enableFragmentLifecycleBreadcrumbs: Boolean = true, + enableAutoFragmentLifecycleTracing: Boolean = false + ) : this( + hub = HubAdapter.getInstance(), + filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.values().toSet() + .takeIf { enableFragmentLifecycleBreadcrumbs } + .orEmpty(), + enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing + ) + + val enableFragmentLifecycleBreadcrumbs: Boolean + get() = filterFragmentLifecycleBreadcrumbs.isNotEmpty() + override fun onFragmentAttached( fragmentManager: FragmentManager, fragment: Fragment, @@ -100,7 +125,7 @@ internal class SentryFragmentLifecycleCallbacks( } private fun addBreadcrumb(fragment: Fragment, state: FragmentLifecycleState) { - if (!loggedFragmentLifecycleStates.contains(state)) { + if (!filterFragmentLifecycleBreadcrumbs.contains(state)) { return } val breadcrumb = Breadcrumb().apply { diff --git a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt index e70c7950cd..5b8f3a9a26 100644 --- a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt +++ b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/FragmentLifecycleIntegrationTest.kt @@ -12,7 +12,6 @@ import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import io.sentry.IHub import io.sentry.SentryOptions -import io.sentry.android.fragment.internal.SentryFragmentLifecycleCallbacks import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -92,7 +91,7 @@ class FragmentLifecycleIntegrationTest { check { fragmentCallbacks -> val callback = (fragmentCallbacks as SentryFragmentLifecycleCallbacks) assertTrue(callback.enableAutoFragmentLifecycleTracing) - assertEquals(emptySet(), callback.loggedFragmentLifecycleStates) + assertEquals(emptySet(), callback.filterFragmentLifecycleBreadcrumbs) }, eq(true) ) diff --git a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt similarity index 98% rename from sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt rename to sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt index d04d1c0fa5..86fc94334d 100644 --- a/sentry-android-fragment/src/test/java/io/sentry/android/fragment/internal/SentryFragmentLifecycleCallbacksTest.kt +++ b/sentry-android-fragment/src/test/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacksTest.kt @@ -1,4 +1,4 @@ -package io.sentry.android.fragment.internal +package io.sentry.android.fragment import android.content.Context import android.os.Bundle @@ -21,7 +21,6 @@ import io.sentry.ScopeCallback import io.sentry.SentryLevel.INFO import io.sentry.SentryOptions import io.sentry.SpanStatus -import io.sentry.android.fragment.FragmentLifecycleState import kotlin.test.Test import kotlin.test.assertEquals @@ -56,7 +55,7 @@ class SentryFragmentLifecycleCallbacksTest { whenever(fragment.isAdded).thenReturn(isAdded) return SentryFragmentLifecycleCallbacks( hub = hub, - loggedFragmentLifecycleStates = loggedFragmentLifecycleStates, + filterFragmentLifecycleBreadcrumbs = loggedFragmentLifecycleStates, enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ) } From 7a453bad06caeb752ddd33b3031fde778df03fec Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 31 Oct 2022 11:47:53 +0100 Subject: [PATCH 3/4] Reorder things --- .../android/fragment/SentryFragmentLifecycleCallbacks.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt index 72ef511aae..7cef61c085 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt @@ -23,10 +23,6 @@ class SentryFragmentLifecycleCallbacks( val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { - private val isPerformanceEnabled get() = hub.options.isTracingEnabled && enableAutoFragmentLifecycleTracing - - private val fragmentsWithOngoingTransactions = WeakHashMap() - constructor( hub: IHub, enableFragmentLifecycleBreadcrumbs: Boolean, @@ -50,6 +46,10 @@ class SentryFragmentLifecycleCallbacks( enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ) + private val isPerformanceEnabled get() = hub.options.isTracingEnabled && enableAutoFragmentLifecycleTracing + + private val fragmentsWithOngoingTransactions = WeakHashMap() + val enableFragmentLifecycleBreadcrumbs: Boolean get() = filterFragmentLifecycleBreadcrumbs.isNotEmpty() From b763f282419896fff5408c4b839747d2fd843dad Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 31 Oct 2022 11:49:54 +0100 Subject: [PATCH 4/4] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 590ab37135..57011ec10b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,6 @@ - HTTP Client errors for OkHttp ([#2287](https://github.com/getsentry/sentry-java/pull/2287)) - Add option to enable or disable Frame Tracking ([#2314](https://github.com/getsentry/sentry-java/pull/2314)) - ### Dependencies - Bump Native SDK from v0.5.0 to v0.5.1 ([#2306](https://github.com/getsentry/sentry-java/pull/2306))