diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f984ef8c1..5a81cd5825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Ignore Shutdown in progress when closing ShutdownHookIntegration ([#2521](https://github.com/getsentry/sentry-java/pull/2521)) - Fix app start span end-time is wrong if SDK init is deferred ([#2519](https://github.com/getsentry/sentry-java/pull/2519)) +- Fix invalid session creation when app is launched in background ([#2543](https://github.com/getsentry/sentry-java/pull/2543)) ## 6.13.1 diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java index 820d0c51a1..eb33039a71 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java @@ -123,7 +123,8 @@ public static synchronized void init( true); final @NotNull IHub hub = Sentry.getCurrentHub(); - if (hub.getOptions().isEnableAutoSessionTracking()) { + if (hub.getOptions().isEnableAutoSessionTracking() + && ContextUtils.isForegroundImportance(context)) { hub.addBreadcrumb(BreadcrumbFactory.forSession("session.start")); hub.startSession(); } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt index a00b57072c..5070cc00bf 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt @@ -11,6 +11,7 @@ import io.sentry.SentryLevel import io.sentry.SentryLevel.DEBUG import io.sentry.SentryLevel.FATAL import io.sentry.SentryOptions +import io.sentry.Session import io.sentry.android.core.cache.AndroidEnvelopeCache import io.sentry.android.fragment.FragmentLifecycleIntegration import io.sentry.android.timber.SentryTimberIntegration @@ -18,6 +19,7 @@ import io.sentry.cache.IEnvelopeCache import io.sentry.transport.NoOpEnvelopeCache import io.sentry.util.StringUtils import org.junit.runner.RunWith +import org.mockito.Mockito import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock @@ -188,12 +190,36 @@ class SentryAndroidTest { } @Test - fun `init starts a session if auto session tracking is enabled`() { - fixture.initSut { options -> - options.isEnableAutoSessionTracking = true + fun `init starts a session if auto session tracking is enabled and app is in foreground`() { + initSentryWithForegroundImportance(true) { session: Session? -> + assertNotNull(session) } - Sentry.getCurrentHub().withScope { scope -> - assertNotNull(scope.session) + } + + @Test + fun `init does not start a session if auto session tracking is enabled but the app is in background`() { + initSentryWithForegroundImportance(false) { session: Session? -> + assertNull(session) + } + } + + private fun initSentryWithForegroundImportance(inForeground: Boolean, callback: (session: Session?) -> Unit) { + val context = ContextUtilsTest.createMockContext() + + Mockito.mockStatic(ContextUtils::class.java).use { mockedContextUtils -> + mockedContextUtils.`when` { ContextUtils.isForegroundImportance(context) } + .thenReturn(inForeground) + SentryAndroid.init(context) { options -> + options.release = "prod" + options.dsn = "https://key@sentry.io/123" + options.isEnableAutoSessionTracking = true + } + + var session: Session? = null + Sentry.getCurrentHub().configureScope { scope -> + session = scope.session + } + callback(session) } }