From b7677f91e2b0f92f9dfaeeefbb4880e3040b3d44 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 28 Nov 2024 08:33:01 +0100 Subject: [PATCH 1/9] Bump Gradle, AGP and Kotlin versions --- .github/workflows/codeql-analysis.yml | 2 +- CHANGELOG.md | 4 + build.gradle.kts | 25 ++-- buildSrc/src/main/java/Config.kt | 36 +++--- gradle.properties | 3 - gradle/wrapper/gradle-wrapper.properties | 2 +- sentry-android-core/build.gradle.kts | 11 +- .../src/main/AndroidManifest.xml | 1 + .../util/SentryFrameMetricsCollector.java | 3 +- .../sentry/android/core/ContextUtilsTest.kt | 2 + .../SystemEventsBreadcrumbsIntegrationTest.kt | 9 +- .../core/UserInteractionIntegrationTest.kt | 85 ++++--------- .../api/sentry-android-fragment.api | 4 +- sentry-android-fragment/build.gradle.kts | 11 +- .../fragment/FragmentLifecycleIntegration.kt | 6 +- .../fragment/FragmentLifecycleState.kt | 6 +- .../SentryFragmentLifecycleCallbacks.kt | 16 +-- .../benchmark-proguard-rules.pro | 7 +- .../build.gradle.kts | 12 +- .../build.gradle.kts | 10 +- .../sentry-uitest-android/build.gradle.kts | 10 +- .../test-app-plain/build.gradle.kts | 8 +- .../test-app-plain/proguard-rules.pro | 2 + .../test-app-sentry/build.gradle.kts | 8 +- .../test-app-sentry/proguard-rules.pro | 1 + sentry-android-navigation/build.gradle.kts | 11 +- .../navigation/SentryNavigationListener.kt | 6 +- sentry-android-ndk/build.gradle.kts | 13 +- .../api/sentry-android-replay.api | 117 ------------------ sentry-android-replay/build.gradle.kts | 11 +- .../src/main/AndroidManifest.xml | 8 ++ .../DefaultReplayBreadcrumbConverter.kt | 4 +- .../android/replay/ModifierExtensions.kt | 2 +- .../java/io/sentry/android/replay/Recorder.kt | 10 +- .../io/sentry/android/replay/ReplayCache.kt | 6 +- .../android/replay/ReplayIntegration.kt | 6 +- .../android/replay/ScreenshotRecorder.kt | 6 +- .../android/replay/SessionReplayOptions.kt | 4 +- .../sentry/android/replay/ViewExtensions.kt | 4 +- .../replay/gestures/GestureRecorder.kt | 4 +- .../replay/gestures/ReplayGestureConverter.kt | 2 +- .../sentry/android/replay/util/Executors.kt | 2 + .../sentry/android/replay/util/TextLayout.kt | 2 +- .../io/sentry/android/replay/util/Views.kt | 2 +- .../android/replay/video/SimpleFrameMuxer.kt | 2 +- .../replay/video/SimpleMp4FrameMuxer.kt | 2 +- .../replay/viewhierarchy/ViewHierarchyNode.kt | 7 +- .../ComposeMaskingOptionsTest.kt | 15 ++- .../viewhierarchy/MaskingOptionsTest.kt | 15 +++ sentry-android-sqlite/build.gradle.kts | 11 +- .../sqlite/SentrySupportSQLiteOpenHelper.kt | 6 +- .../SentrySupportSQLiteOpenHelperTest.kt | 2 +- sentry-android-timber/build.gradle.kts | 11 +- .../android/timber/SentryTimberIntegration.kt | 6 +- .../sentry/android/timber/SentryTimberTree.kt | 2 +- .../android/timber/SentryTimberTreeTest.kt | 2 +- .../java/io/sentry/core/SentryEventKtx.kt | 6 +- sentry-android/build.gradle.kts | 7 +- .../apollo3/SentryApollo3HttpInterceptor.kt | 3 +- .../sentry/apollo/SentryApolloInterceptor.kt | 3 +- sentry-bom/build.gradle.kts | 8 -- sentry-compose-helper/build.gradle.kts | 5 +- sentry-compose/build.gradle.kts | 11 +- .../api/sentry-kotlin-extensions.api | 4 - .../io/sentry/okhttp/SentryOkHttpEvent.kt | 3 +- .../build.gradle.kts | 2 +- .../sentry-samples-android/build.gradle.kts | 21 +++- .../src/main/AndroidManifest.xml | 8 +- 68 files changed, 274 insertions(+), 392 deletions(-) create mode 100644 sentry-android-replay/src/main/AndroidManifest.xml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 771b5274a6..0344a9843c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -10,7 +10,7 @@ on: - cron: '17 23 * * 3' concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.language }} cancel-in-progress: true jobs: diff --git a/CHANGELOG.md b/CHANGELOG.md index b0c11a9cb3..efa1e83e68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -357,6 +357,10 @@ You may also use `LifecycleHelper.close(token)`, e.g. in case you need to pass t - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#078) - [diff](https://github.com/getsentry/sentry-native/compare/0.7.2...0.7.8) +### Breaking Changes + +- The Kotlin Language version is now set to 1.6 ([#3839](https://github.com/getsentry/sentry-java/pull/3839)) + ## 7.17.0 ### Features diff --git a/build.gradle.kts b/build.gradle.kts index e7d828e61f..a1b81add3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,5 @@ import com.diffplug.spotless.LineEnding import com.vanniktech.maven.publish.MavenPublishBaseExtension -import com.vanniktech.maven.publish.MavenPublishPlugin -import com.vanniktech.maven.publish.MavenPublishPluginExtension import groovy.util.Node import io.gitlab.arturbosch.detekt.extensions.DetektExtension import kotlinx.kover.gradle.plugin.dsl.KoverReportExtension @@ -17,6 +15,7 @@ plugins { id(Config.QualityPlugins.binaryCompatibilityValidator) version Config.QualityPlugins.binaryCompatibilityValidatorVersion id(Config.QualityPlugins.jacocoAndroid) version Config.QualityPlugins.jacocoAndroidVersion apply false id(Config.QualityPlugins.kover) version Config.QualityPlugins.koverVersion apply false + id(Config.BuildPlugins.gradleMavenPublishPlugin) version Config.BuildPlugins.gradleMavenPublishPluginVersion apply false } buildscript { @@ -26,7 +25,6 @@ buildscript { dependencies { classpath(Config.BuildPlugins.androidGradle) classpath(kotlin(Config.BuildPlugins.kotlinGradlePlugin, version = Config.kotlinVersion)) - classpath(Config.BuildPlugins.gradleMavenPublishPlugin) // dokka is required by gradle-maven-publish-plugin. classpath(Config.BuildPlugins.dokkaPlugin) classpath(Config.QualityPlugins.errorpronePlugin) @@ -140,7 +138,7 @@ subprojects { androidReports("release") { xml { // Change the report file name so the Codecov Github action can find it - setReportFile(file("$buildDir/reports/kover/report.xml")) + setReportFile(project.layout.buildDirectory.file("reports/kover/report.xml").get().asFile) } } } @@ -157,6 +155,7 @@ subprojects { if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support" && this.name != "sentry-compose-helper") { apply() + apply() val sep = File.separator @@ -179,23 +178,15 @@ subprojects { tasks.named("distZip").configure { this.dependsOn("publishToMavenLocal") this.doLast { - val distributionFilePath = - "${this.project.buildDir}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" - val file = File(distributionFilePath) - if (!file.exists()) throw IllegalStateException("Distribution file: $distributionFilePath does not exist") - if (file.length() == 0L) throw IllegalStateException("Distribution file: $distributionFilePath is empty") + val file = this.project.layout.buildDirectory.file("distributions${sep}${this.project.name}-${this.project.version}.zip").get().asFile + if (!file.exists()) throw IllegalStateException("Distribution file: ${file.absolutePath} does not exist") + if (file.length() == 0L) throw IllegalStateException("Distribution file: ${file.absolutePath} is empty") } } afterEvaluate { apply() - configure { - // signing is done when uploading files to MC - // via gpg:sign-and-deploy-file (release.kts) - releaseSigningEnabled = false - } - @Suppress("UnstableApiUsage") configure { assignAarTypes() @@ -206,7 +197,7 @@ subprojects { repositories { maven { name = "unityMaven" - url = file("${rootProject.buildDir}/unityMaven").toURI() + url = rootProject.layout.buildDirectory.file("unityMaven").get().asFile.toURI() } } } @@ -243,7 +234,7 @@ spotless { gradle.projectsEvaluated { tasks.create("aggregateJavadocs", Javadoc::class.java) { - setDestinationDir(file("$buildDir/docs/javadoc")) + setDestinationDir(project.layout.buildDirectory.file("docs/javadoc").get().asFile) title = "${project.name} $version API" val opts = options as StandardJavadocDocletOptions opts.quiet() diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index dd62348342..59f8d3641d 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -2,16 +2,18 @@ import java.math.BigDecimal object Config { - val AGP = System.getenv("VERSION_AGP") ?: "7.4.2" - val kotlinVersion = "1.8.0" + val AGP = System.getenv("VERSION_AGP") ?: "8.6.0" + val kotlinVersion = "1.9.24" val kotlinStdLib = "stdlib-jdk8" val springBootVersion = "2.7.5" val springBoot3Version = "3.3.2" - val kotlinCompatibleLanguageVersion = "1.4" + val kotlinCompatibleLanguageVersion = "1.6" - val composeVersion = "1.5.3" - val androidComposeCompilerVersion = "1.4.0" + // see https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-compatibility-and-versioning.html#kotlin-compatibility + // see https://developer.android.com/jetpack/androidx/releases/compose-kotlin + val composeVersion = "1.6.11" + val androidComposeCompilerVersion = "1.5.14" object BuildPlugins { val androidGradle = "com.android.tools.build:gradle:$AGP" @@ -23,8 +25,9 @@ object Config { val springDependencyManagementVersion = "1.0.11.RELEASE" val gretty = "org.gretty" val grettyVersion = "4.0.0" - val gradleMavenPublishPlugin = "com.vanniktech:gradle-maven-publish-plugin:0.18.0" - val dokkaPlugin = "org.jetbrains.dokka:dokka-gradle-plugin:1.7.10" + val gradleMavenPublishPlugin = "com.vanniktech.maven.publish" + val gradleMavenPublishPluginVersion = "0.28.0" + val dokkaPlugin = "org.jetbrains.dokka:dokka-gradle-plugin:1.9.20" val dokkaPluginAlias = "org.jetbrains.dokka" val composeGradlePlugin = "org.jetbrains.compose:compose-gradle-plugin:$composeVersion" val commonsCompressOverride = "org.apache.commons:commons-compress:1.25.0" @@ -39,7 +42,7 @@ object Config { val abiFilters = listOf("x86", "armeabi-v7a", "x86_64", "arm64-v8a") - fun shouldSkipDebugVariant(name: String): Boolean { + fun shouldSkipDebugVariant(name: String?): Boolean { return System.getenv("CI")?.toBoolean() ?: false && name == "debug" } } @@ -58,6 +61,7 @@ object Config { val androidxCore = "androidx.core:core:1.3.2" val androidxSqlite = "androidx.sqlite:sqlite:2.3.1" val androidxRecylerView = "androidx.recyclerview:recyclerview:1.2.1" + val androidxAnnotation = "androidx.annotation:annotation:1.9.1" val slf4jApi = "org.slf4j:slf4j-api:1.7.30" val slf4jApi2 = "org.slf4j:slf4j-api:2.0.5" @@ -142,14 +146,14 @@ object Config { // compose deps val composeNavigation = "androidx.navigation:navigation-compose:$navigationVersion" - val composeActivity = "androidx.activity:activity-compose:1.4.0" - val composeFoundation = "androidx.compose.foundation:foundation:$composeVersion" - val composeUi = "androidx.compose.ui:ui:$composeVersion" + val composeActivity = "androidx.activity:activity-compose:1.8.2" + val composeFoundation = "androidx.compose.foundation:foundation:1.6.3" + val composeUi = "androidx.compose.ui:ui:1.6.3" + val composeFoundationLayout = "androidx.compose.foundation:foundation-layout:1.6.3" + val composeMaterial = "androidx.compose.material3:material3:1.2.1" val composeUiReplay = "androidx.compose.ui:ui:1.5.0" // Note: don't change without testing forwards compatibility - val composeFoundationLayout = "androidx.compose.foundation:foundation-layout:$composeVersion" - val composeMaterial = "androidx.compose.material3:material3:1.0.0-alpha13" - val composeCoil = "io.coil-kt:coil-compose:2.0.0" + val composeCoil = "io.coil-kt:coil-compose:2.6.0" val apolloKotlin = "com.apollographql.apollo3:apollo-runtime:3.8.2" @@ -192,7 +196,7 @@ object Config { val androidxTestOrchestrator = "androidx.test:orchestrator:1.5.0" val androidxJunit = "androidx.test.ext:junit:1.1.5" val androidxCoreKtx = "androidx.core:core-ktx:1.7.0" - val robolectric = "org.robolectric:robolectric:4.10.3" + val robolectric = "org.robolectric:robolectric:4.14" val mockitoKotlin = "org.mockito.kotlin:mockito-kotlin:4.1.0" val mockitoInline = "org.mockito:mockito-inline:4.8.0" val awaitility = "org.awaitility:awaitility-kotlin:4.1.1" @@ -218,7 +222,7 @@ object Config { val gradleVersionsPlugin = "com.github.ben-manes:gradle-versions-plugin:0.42.0" val gradleVersions = "com.github.ben-manes.versions" val detekt = "io.gitlab.arturbosch.detekt" - val detektVersion = "1.19.0" + val detektVersion = "1.23.5" val detektPlugin = "io.gitlab.arturbosch.detekt" val binaryCompatibilityValidatorVersion = "0.13.0" val binaryCompatibilityValidatorPlugin = "org.jetbrains.kotlinx:binary-compatibility-validator:$binaryCompatibilityValidatorVersion" diff --git a/gradle.properties b/gradle.properties index e757c3c1ab..293702b672 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,9 +9,6 @@ org.gradle.workers.max=2 # AndroidX required by AGP >= 3.6.x android.useAndroidX=true -# Required by AGP >= 8.0.x -android.defaults.buildfeatures.buildconfig=true - # Release information versionName=8.0.0-beta.3 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b..09523c0e54 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sentry-android-core/build.gradle.kts b/sentry-android-core/build.gradle.kts index 12e6e6ad4f..15692681cd 100644 --- a/sentry-android-core/build.gradle.kts +++ b/sentry-android-core/build.gradle.kts @@ -15,7 +15,6 @@ android { namespace = "io.sentry.android.core" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner @@ -53,15 +52,17 @@ android { checkReleaseBuilds = false } + buildFeatures { + buildConfig = true + } + // needed because of Kotlin 1.4.x configurations.all { resolutionStrategy.force(Config.CompileOnly.jetbrainsAnnotations) } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-core/src/main/AndroidManifest.xml b/sentry-android-core/src/main/AndroidManifest.xml index dba3e7df8e..a304ee075b 100644 --- a/sentry-android-core/src/main/AndroidManifest.xml +++ b/sentry-android-core/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + () diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt index 45e247a5cb..e0d053066b 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt @@ -3,6 +3,7 @@ package io.sentry.android.core import android.content.Context import android.content.Intent import android.os.BatteryManager +import android.os.Build import androidx.test.ext.junit.runners.AndroidJUnit4 import io.sentry.Breadcrumb import io.sentry.IScopes @@ -19,6 +20,7 @@ import org.mockito.kotlin.never import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever +import org.robolectric.annotation.Config import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse @@ -26,6 +28,7 @@ import kotlin.test.assertNotNull import kotlin.test.assertNull @RunWith(AndroidJUnit4::class) +@Config(sdk = [Build.VERSION_CODES.TIRAMISU]) class SystemEventsBreadcrumbsIntegrationTest { private class Fixture { @@ -50,7 +53,7 @@ class SystemEventsBreadcrumbsIntegrationTest { sut.register(fixture.scopes, fixture.options) - verify(fixture.context).registerReceiver(any(), any()) + verify(fixture.context).registerReceiver(any(), any(), any()) assertNotNull(sut.receiver) } @@ -69,7 +72,7 @@ class SystemEventsBreadcrumbsIntegrationTest { sut.register(fixture.scopes, fixture.options) - verify(fixture.context, never()).registerReceiver(any(), any()) + verify(fixture.context, never()).registerReceiver(any(), any(), any()) assertNull(sut.receiver) } @@ -174,7 +177,7 @@ class SystemEventsBreadcrumbsIntegrationTest { @Test fun `Do not crash if registerReceiver throws exception`() { val sut = fixture.getSut() - whenever(fixture.context.registerReceiver(any(), any())).thenThrow(SecurityException()) + whenever(fixture.context.registerReceiver(any(), any(), any())).thenThrow(SecurityException()) sut.register(fixture.scopes, fixture.options) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt index 379e3db353..4c3a39c160 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt @@ -2,24 +2,23 @@ package io.sentry.android.core import android.app.Activity import android.app.Application -import android.content.Context -import android.content.res.Resources -import android.util.DisplayMetrics import android.view.Window import androidx.test.ext.junit.runners.AndroidJUnit4 import io.sentry.Scopes import io.sentry.android.core.internal.gestures.NoOpWindowCallback import io.sentry.android.core.internal.gestures.SentryWindowCallback +import junit.framework.TestCase.assertNull import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull -import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import org.robolectric.Robolectric.buildActivity import kotlin.test.Test -import kotlin.test.assertTrue +import kotlin.test.assertIs +import kotlin.test.assertSame @RunWith(AndroidJUnit4::class) class UserInteractionIntegrationTest { @@ -30,34 +29,17 @@ class UserInteractionIntegrationTest { val options = SentryAndroidOptions().apply { dsn = "https://key@sentry.io/proj" } - val activity = mock() - val window = mock() + val activity: Activity = buildActivity(EmptyActivity::class.java).setup().get() + val window: Window = activity.window val loadClass = mock() fun getSut( - callback: Window.Callback? = null, isAndroidXAvailable: Boolean = true ): UserInteractionIntegration { whenever(loadClass.isClassAvailable(any(), anyOrNull())).thenReturn(isAndroidXAvailable) whenever(scopes.options).thenReturn(options) - whenever(window.callback).thenReturn(callback) - whenever(activity.window).thenReturn(window) - - val resources = mockResources() - whenever(activity.resources).thenReturn(resources) return UserInteractionIntegration(application, loadClass) } - - companion object { - fun mockResources(): Resources { - val displayMetrics = mock() - displayMetrics.density = 1.0f - - val resources = mock() - whenever(resources.displayMetrics).thenReturn(displayMetrics) - return resources - } - } } private val fixture = Fixture() @@ -105,73 +87,54 @@ class UserInteractionIntegrationTest { sut.register(fixture.scopes, fixture.options) sut.onActivityResumed(fixture.activity) - - val argumentCaptor = argumentCaptor() - verify(fixture.window).callback = argumentCaptor.capture() - assertTrue { argumentCaptor.firstValue is SentryWindowCallback } + assertIs(fixture.activity.window.callback) } @Test fun `when no original callback delegates to NoOpWindowCallback`() { val sut = fixture.getSut() sut.register(fixture.scopes, fixture.options) + fixture.window.callback = null sut.onActivityResumed(fixture.activity) - - val argumentCaptor = argumentCaptor() - verify(fixture.window).callback = argumentCaptor.capture() - assertTrue { - argumentCaptor.firstValue is SentryWindowCallback && - (argumentCaptor.firstValue as SentryWindowCallback).delegate is NoOpWindowCallback - } + assertIs(fixture.activity.window.callback) + assertIs((fixture.activity.window.callback as SentryWindowCallback).delegate) } @Test fun `unregisters window callback on activity paused`() { - val context = mock() - val resources = Fixture.mockResources() - whenever(context.resources).thenReturn(resources) - val sut = fixture.getSut( - SentryWindowCallback( - NoOpWindowCallback(), - context, - mock(), - mock() - ) - ) + val sut = fixture.getSut() + fixture.activity.window.callback = null + sut.onActivityResumed(fixture.activity) sut.onActivityPaused(fixture.activity) - verify(fixture.window).callback = null + assertNull(fixture.activity.window.callback) } @Test fun `preserves original callback on activity paused`() { - val delegate = mock() - val context = mock() - val resources = Fixture.mockResources() - whenever(context.resources).thenReturn(resources) - val sut = fixture.getSut( - SentryWindowCallback( - delegate, - context, - mock(), - mock() - ) - ) + val sut = fixture.getSut() + val mockCallback = mock() + + fixture.window.callback = mockCallback + sut.onActivityResumed(fixture.activity) sut.onActivityPaused(fixture.activity) - verify(fixture.window).callback = delegate + assertSame(mockCallback, fixture.activity.window.callback) } @Test fun `stops tracing on activity paused`() { val callback = mock() - val sut = fixture.getSut(callback) + val sut = fixture.getSut() + fixture.activity.window.callback = callback sut.onActivityPaused(fixture.activity) verify(callback).stopTracking() } } + +private class EmptyActivity : Activity() diff --git a/sentry-android-fragment/api/sentry-android-fragment.api b/sentry-android-fragment/api/sentry-android-fragment.api index 044d9cfbf5..ddd7d0f669 100644 --- a/sentry-android-fragment/api/sentry-android-fragment.api +++ b/sentry-android-fragment/api/sentry-android-fragment.api @@ -39,7 +39,7 @@ public final class io/sentry/android/fragment/FragmentLifecycleState : java/lang } public final class io/sentry/android/fragment/FragmentLifecycleState$Companion { - public final fun getStates ()Ljava/util/HashSet; + public final fun getStates ()Ljava/util/Set; } public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks : androidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks { @@ -50,9 +50,7 @@ public final class io/sentry/android/fragment/SentryFragmentLifecycleCallbacks : public fun (Lio/sentry/IScopes;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 diff --git a/sentry-android-fragment/build.gradle.kts b/sentry-android-fragment/build.gradle.kts index 14fb3ff9c1..37bba3e7ca 100644 --- a/sentry-android-fragment/build.gradle.kts +++ b/sentry-android-fragment/build.gradle.kts @@ -14,7 +14,6 @@ android { namespace = "io.sentry.android.fragment" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion // for AGP 4.1 @@ -48,10 +47,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } 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 f1c44422a5..0577944be2 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 @@ -13,7 +13,7 @@ import io.sentry.SentryOptions import io.sentry.util.IntegrationUtils.addIntegrationToSdkVersion import java.io.Closeable -class FragmentLifecycleIntegration( +public class FragmentLifecycleIntegration( private val application: Application, private val filterFragmentLifecycleBreadcrumbs: Set, private val enableAutoFragmentLifecycleTracing: Boolean @@ -22,13 +22,13 @@ class FragmentLifecycleIntegration( Integration, Closeable { - constructor(application: Application) : this( + public constructor(application: Application) : this( application = application, filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.states, enableAutoFragmentLifecycleTracing = false ) - constructor( + public constructor( application: Application, enableFragmentLifecycleBreadcrumbs: Boolean, enableAutoFragmentLifecycleTracing: Boolean 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 index fd52437d60..3a45dd60d0 100644 --- 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 @@ -1,6 +1,6 @@ package io.sentry.android.fragment -enum class FragmentLifecycleState(internal val breadcrumbName: String) { +public enum class FragmentLifecycleState(internal val breadcrumbName: String) { ATTACHED("attached"), SAVE_INSTANCE_STATE("save instance state"), CREATED("created"), @@ -13,8 +13,8 @@ enum class FragmentLifecycleState(internal val breadcrumbName: String) { DESTROYED("destroyed"), DETACHED("detached"); - companion object { - val states = HashSet().apply { + public companion object { + public val states: Set = HashSet().apply { add(ATTACHED) add(SAVE_INSTANCE_STATE) add(CREATED) 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 cf5b14b43c..c7877180cb 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 @@ -19,13 +19,13 @@ import java.util.WeakHashMap private const val TRACE_ORIGIN = "auto.ui.fragment" @Suppress("TooManyFunctions") -class SentryFragmentLifecycleCallbacks( +public class SentryFragmentLifecycleCallbacks( private val scopes: IScopes = ScopesAdapter.getInstance(), - val filterFragmentLifecycleBreadcrumbs: Set, - val enableAutoFragmentLifecycleTracing: Boolean + internal val filterFragmentLifecycleBreadcrumbs: Set, + internal val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { - constructor( + public constructor( scopes: IScopes, enableFragmentLifecycleBreadcrumbs: Boolean, enableAutoFragmentLifecycleTracing: Boolean @@ -37,7 +37,7 @@ class SentryFragmentLifecycleCallbacks( enableAutoFragmentLifecycleTracing = enableAutoFragmentLifecycleTracing ) - constructor( + public constructor( enableFragmentLifecycleBreadcrumbs: Boolean = true, enableAutoFragmentLifecycleTracing: Boolean = false ) : this( @@ -52,7 +52,7 @@ class SentryFragmentLifecycleCallbacks( private val fragmentsWithOngoingTransactions = WeakHashMap() - val enableFragmentLifecycleBreadcrumbs: Boolean + public val enableFragmentLifecycleBreadcrumbs: Boolean get() = filterFragmentLifecycleBreadcrumbs.isNotEmpty() override fun onFragmentAttached( @@ -190,7 +190,7 @@ class SentryFragmentLifecycleCallbacks( } } - companion object { - const val FRAGMENT_LOAD_OP = "ui.load" + public companion object { + public const val FRAGMENT_LOAD_OP: String = "ui.load" } } diff --git a/sentry-android-integration-tests/sentry-uitest-android-benchmark/benchmark-proguard-rules.pro b/sentry-android-integration-tests/sentry-uitest-android-benchmark/benchmark-proguard-rules.pro index 8f5e14b25e..b2db365bad 100644 --- a/sentry-android-integration-tests/sentry-uitest-android-benchmark/benchmark-proguard-rules.pro +++ b/sentry-android-integration-tests/sentry-uitest-android-benchmark/benchmark-proguard-rules.pro @@ -24,8 +24,6 @@ #Shrinking removes annotations and "unused classes" from test apk, so we don't shrink -dontshrink --ignorewarnings - -keepattributes *Annotation* -dontnote junit.framework.** @@ -33,3 +31,8 @@ -dontwarn androidx.test.** -dontwarn org.junit.** + +-dontwarn androidx.annotation.** +-dontwarn com.google.errorprone.** + +-ignorewarnings diff --git a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts index 9f9fd1b3d6..dddaa7b912 100644 --- a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts @@ -55,12 +55,14 @@ android { isMinifyEnabled = true signingConfig = signingConfigs.getByName("debug") proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") + testProguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") } getByName("release") { isMinifyEnabled = true isShrinkResources = true signingConfig = signingConfigs.getByName("debug") // to be able to run release mode proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") + testProguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") } } @@ -76,10 +78,8 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } @@ -120,7 +120,3 @@ tasks.withType { // Target version of the generated JVM bytecode. It is used for type resolution. jvmTarget = JavaVersion.VERSION_1_8.toString() } - -kotlin { - explicitApi() -} diff --git a/sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts index da7add25cc..dcd52443ca 100644 --- a/sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts @@ -42,10 +42,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = Config.androidComposeCompilerVersion } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } @@ -63,7 +61,3 @@ tasks.withType { // Target version of the generated JVM bytecode. It is used for type resolution. jvmTarget = JavaVersion.VERSION_1_8.toString() } - -kotlin { - explicitApi() -} diff --git a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts index dc4dbd171f..16af968f4c 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts @@ -81,10 +81,8 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } @@ -140,7 +138,3 @@ tasks.withType { // Target version of the generated JVM bytecode. It is used for type resolution. jvmTarget = JavaVersion.VERSION_1_8.toString() } - -kotlin { - explicitApi() -} diff --git a/sentry-android-integration-tests/test-app-plain/build.gradle.kts b/sentry-android-integration-tests/test-app-plain/build.gradle.kts index 7a094fe283..e2592ca31f 100644 --- a/sentry-android-integration-tests/test-app-plain/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-plain/build.gradle.kts @@ -18,7 +18,7 @@ android { getByName("release") { isMinifyEnabled = true signingConfig = signingConfigs.getByName("debug") // to be able to run release mode - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") ndk { abiFilters.clear() abiFilters.add("arm64-v8a") @@ -41,10 +41,8 @@ android { } } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-integration-tests/test-app-plain/proguard-rules.pro b/sentry-android-integration-tests/test-app-plain/proguard-rules.pro index 2f9dc5a47e..d5b66a5b79 100644 --- a/sentry-android-integration-tests/test-app-plain/proguard-rules.pro +++ b/sentry-android-integration-tests/test-app-plain/proguard-rules.pro @@ -19,3 +19,5 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + +-keep,allowobfuscation,allowshrinking class * extends androidx.navigation.Navigator diff --git a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts index 6464ca9d57..34973ff38a 100644 --- a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts @@ -18,7 +18,7 @@ android { getByName("release") { isMinifyEnabled = true signingConfig = signingConfigs.getByName("debug") // to be able to run release mode - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") ndk { abiFilters.clear() abiFilters.add("arm64-v8a") @@ -41,10 +41,8 @@ android { } } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro b/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro index 2f9dc5a47e..e6edffeb9e 100644 --- a/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro +++ b/sentry-android-integration-tests/test-app-sentry/proguard-rules.pro @@ -19,3 +19,4 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile +-keep,allowobfuscation,allowshrinking class * extends androidx.navigation.Navigator diff --git a/sentry-android-navigation/build.gradle.kts b/sentry-android-navigation/build.gradle.kts index d46c7e2b84..ddf8e1f6c0 100644 --- a/sentry-android-navigation/build.gradle.kts +++ b/sentry-android-navigation/build.gradle.kts @@ -14,7 +14,6 @@ android { namespace = "io.sentry.android.navigation" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion // for AGP 4.1 @@ -49,10 +48,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt index 1ea9e42c3c..4f546851a6 100644 --- a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt +++ b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt @@ -34,7 +34,7 @@ private const val TRACE_ORIGIN = "auto.navigation" * @param enableNavigationTracing Whether the integration should start a new idle [ITransaction] * with [SentryOptions.idleTimeout] for navigation events. */ -class SentryNavigationListener @JvmOverloads constructor( +public class SentryNavigationListener @JvmOverloads constructor( private val scopes: IScopes = ScopesAdapter.getInstance(), private val enableNavigationBreadcrumbs: Boolean = true, private val enableNavigationTracing: Boolean = true, @@ -193,7 +193,7 @@ class SentryNavigationListener @JvmOverloads constructor( return "/" + name.substringBefore('/') // strip out arguments from the tx name } - companion object { - const val NAVIGATION_OP = "navigation" + public companion object { + public const val NAVIGATION_OP: String = "navigation" } } diff --git a/sentry-android-ndk/build.gradle.kts b/sentry-android-ndk/build.gradle.kts index 339c168214..c0ddd39d4c 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -13,7 +13,6 @@ android { namespace = "io.sentry.android.ndk" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner @@ -58,12 +57,16 @@ android { resolutionStrategy.force(Config.CompileOnly.jetbrainsAnnotations) } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } + ndkVersion = "23.1.7779620" + @Suppress("UnstableApiUsage") packagingOptions { jniLibs { diff --git a/sentry-android-replay/api/sentry-android-replay.api b/sentry-android-replay/api/sentry-android-replay.api index 906e848bb5..186e715d05 100644 --- a/sentry-android-replay/api/sentry-android-replay.api +++ b/sentry-android-replay/api/sentry-android-replay.api @@ -42,19 +42,12 @@ public abstract interface class io/sentry/android/replay/Recorder : java/io/Clos public final class io/sentry/android/replay/ReplayCache : java/io/Closeable { public static final field $stable I - public static final field Companion Lio/sentry/android/replay/ReplayCache$Companion; public fun (Lio/sentry/SentryOptions;Lio/sentry/protocol/SentryId;Lio/sentry/android/replay/ScreenshotRecorderConfig;)V public final fun addFrame (Ljava/io/File;JLjava/lang/String;)V public static synthetic fun addFrame$default (Lio/sentry/android/replay/ReplayCache;Ljava/io/File;JLjava/lang/String;ILjava/lang/Object;)V public fun close ()V public final fun createVideoOf (JJIIILjava/io/File;)Lio/sentry/android/replay/GeneratedVideo; public static synthetic fun createVideoOf$default (Lio/sentry/android/replay/ReplayCache;JJIIILjava/io/File;ILjava/lang/Object;)Lio/sentry/android/replay/GeneratedVideo; - public final fun persistSegmentValues (Ljava/lang/String;Ljava/lang/String;)V - public final fun rotate (J)Ljava/lang/String; -} - -public final class io/sentry/android/replay/ReplayCache$Companion { - public final fun makeReplayCacheDir (Lio/sentry/SentryOptions;Lio/sentry/protocol/SentryId;)Ljava/io/File; } public final class io/sentry/android/replay/ReplayIntegration : android/content/ComponentCallbacks, io/sentry/IConnectionStatusProvider$IConnectionStatusObserver, io/sentry/Integration, io/sentry/ReplayController, io/sentry/android/replay/ScreenshotRecorderCallback, io/sentry/android/replay/gestures/TouchRecorderCallback, io/sentry/transport/RateLimiter$IRateLimitObserver, java/io/Closeable { @@ -90,7 +83,6 @@ public abstract interface class io/sentry/android/replay/ScreenshotRecorderCallb public final class io/sentry/android/replay/ScreenshotRecorderConfig { public static final field $stable I - public static final field Companion Lio/sentry/android/replay/ScreenshotRecorderConfig$Companion; public fun (IIFFII)V public final fun component1 ()I public final fun component2 ()I @@ -111,10 +103,6 @@ public final class io/sentry/android/replay/ScreenshotRecorderConfig { public fun toString ()Ljava/lang/String; } -public final class io/sentry/android/replay/ScreenshotRecorderConfig$Companion { - public final fun from (Landroid/content/Context;Lio/sentry/SentryReplayOptions;)Lio/sentry/android/replay/ScreenshotRecorderConfig; -} - public final class io/sentry/android/replay/SentryReplayModifiers { public static final field $stable I public static final field INSTANCE Lio/sentry/android/replay/SentryReplayModifiers; @@ -133,36 +121,10 @@ public final class io/sentry/android/replay/ViewExtensionsKt { public static final fun sentryReplayUnmask (Landroid/view/View;)V } -public final class io/sentry/android/replay/gestures/GestureRecorder : io/sentry/android/replay/OnRootViewsChangedListener { - public static final field $stable I - public fun (Lio/sentry/SentryOptions;Lio/sentry/android/replay/gestures/TouchRecorderCallback;)V - public fun onRootViewsChanged (Landroid/view/View;Z)V - public final fun stop ()V -} - -public final class io/sentry/android/replay/gestures/ReplayGestureConverter { - public static final field $stable I - public fun (Lio/sentry/transport/ICurrentDateProvider;)V - public final fun convert (Landroid/view/MotionEvent;Lio/sentry/android/replay/ScreenshotRecorderConfig;)Ljava/util/List; -} - public abstract interface class io/sentry/android/replay/gestures/TouchRecorderCallback { public abstract fun onTouchEvent (Landroid/view/MotionEvent;)V } -public final class io/sentry/android/replay/util/AndroidTextLayout : io/sentry/android/replay/util/TextLayout { - public static final field $stable I - public fun (Landroid/text/Layout;)V - public fun getDominantTextColor ()Ljava/lang/Integer; - public fun getEllipsisCount (I)I - public fun getLineBottom (I)I - public fun getLineCount ()I - public fun getLineStart (I)I - public fun getLineTop (I)I - public fun getLineVisibleEnd (I)I - public fun getPrimaryHorizontal (II)F -} - public class io/sentry/android/replay/util/FixedWindowCallback : android/view/Window$Callback { public final field delegate Landroid/view/Window$Callback; public fun (Landroid/view/Window$Callback;)V @@ -193,82 +155,3 @@ public class io/sentry/android/replay/util/FixedWindowCallback : android/view/Wi public fun onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode; } -public abstract interface class io/sentry/android/replay/util/TextLayout { - public abstract fun getDominantTextColor ()Ljava/lang/Integer; - public abstract fun getEllipsisCount (I)I - public abstract fun getLineBottom (I)I - public abstract fun getLineCount ()I - public abstract fun getLineStart (I)I - public abstract fun getLineTop (I)I - public abstract fun getLineVisibleEnd (I)I - public abstract fun getPrimaryHorizontal (II)F -} - -public abstract interface class io/sentry/android/replay/video/SimpleFrameMuxer { - public abstract fun getVideoTime ()J - public abstract fun isStarted ()Z - public abstract fun muxVideoFrame (Ljava/nio/ByteBuffer;Landroid/media/MediaCodec$BufferInfo;)V - public abstract fun release ()V - public abstract fun start (Landroid/media/MediaFormat;)V -} - -public final class io/sentry/android/replay/video/SimpleMp4FrameMuxer : io/sentry/android/replay/video/SimpleFrameMuxer { - public static final field $stable I - public fun (Ljava/lang/String;F)V - public fun getVideoTime ()J - public fun isStarted ()Z - public fun muxVideoFrame (Ljava/nio/ByteBuffer;Landroid/media/MediaCodec$BufferInfo;)V - public fun release ()V - public fun start (Landroid/media/MediaFormat;)V -} - -public abstract class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode { - public static final field $stable I - public static final field Companion Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode$Companion; - public synthetic fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getChildren ()Ljava/util/List; - public final fun getDistance ()I - public final fun getElevation ()F - public final fun getHeight ()I - public final fun getParent ()Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode; - public final fun getShouldMask ()Z - public final fun getVisibleRect ()Landroid/graphics/Rect; - public final fun getWidth ()I - public final fun getX ()F - public final fun getY ()F - public final fun isImportantForContentCapture ()Z - public final fun isObscured (Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;)Z - public final fun isVisible ()Z - public final fun setChildren (Ljava/util/List;)V - public final fun setImportantForCaptureToAncestors (Z)V - public final fun setImportantForContentCapture (Z)V - public final fun traverse (Lkotlin/jvm/functions/Function1;)V -} - -public final class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode$Companion { - public final fun fromView (Landroid/view/View;Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ILio/sentry/SentryOptions;)Lio/sentry/android/replay/viewhierarchy/ViewHierarchyNode; -} - -public final class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode$GenericViewHierarchyNode : io/sentry/android/replay/viewhierarchy/ViewHierarchyNode { - public static final field $stable I - public fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;)V - public synthetic fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public final class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode$ImageViewHierarchyNode : io/sentry/android/replay/viewhierarchy/ViewHierarchyNode { - public static final field $stable I - public fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;)V - public synthetic fun (FFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public final class io/sentry/android/replay/viewhierarchy/ViewHierarchyNode$TextViewHierarchyNode : io/sentry/android/replay/viewhierarchy/ViewHierarchyNode { - public static final field $stable I - public fun (Lio/sentry/android/replay/util/TextLayout;Ljava/lang/Integer;IIFFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;)V - public synthetic fun (Lio/sentry/android/replay/util/TextLayout;Ljava/lang/Integer;IIFFIIFILio/sentry/android/replay/viewhierarchy/ViewHierarchyNode;ZZZLandroid/graphics/Rect;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getDominantColor ()Ljava/lang/Integer; - public final fun getLayout ()Lio/sentry/android/replay/util/TextLayout; - public final fun getPaddingLeft ()I - public final fun getPaddingTop ()I -} - diff --git a/sentry-android-replay/build.gradle.kts b/sentry-android-replay/build.gradle.kts index 7f1424096c..45a51906eb 100644 --- a/sentry-android-replay/build.gradle.kts +++ b/sentry-android-replay/build.gradle.kts @@ -17,7 +17,6 @@ android { namespace = "io.sentry.android.replay" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner @@ -63,10 +62,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-replay/src/main/AndroidManifest.xml b/sentry-android-replay/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..be2fa26e1e --- /dev/null +++ b/sentry-android-replay/src/main/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/DefaultReplayBreadcrumbConverter.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/DefaultReplayBreadcrumbConverter.kt index d5c666b5b0..d7b4b7739e 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/DefaultReplayBreadcrumbConverter.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/DefaultReplayBreadcrumbConverter.kt @@ -126,7 +126,9 @@ public open class DefaultReplayBreadcrumbConverter : ReplayBreadcrumbConverter { } private fun String.snakeToCamelCase(): String { - return replace(snakecasePattern) { it.value.last().uppercase() } + return replace(snakecasePattern) { + it.value.last().toString().uppercase() + } } private fun Breadcrumb.toRRWebSpanEvent(): RRWebSpanEvent { diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ModifierExtensions.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ModifierExtensions.kt index b5d5222388..5d0c27af35 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ModifierExtensions.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ModifierExtensions.kt @@ -6,7 +6,7 @@ import androidx.compose.ui.semantics.semantics import io.sentry.android.replay.SentryReplayModifiers.SentryPrivacy public object SentryReplayModifiers { - val SentryPrivacy = SemanticsPropertyKey( + public val SentryPrivacy: SemanticsPropertyKey = SemanticsPropertyKey( name = "SentryPrivacy", mergePolicy = { parentValue, _ -> parentValue } ) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/Recorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/Recorder.kt index 6cf86b6a7e..0946018c78 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/Recorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/Recorder.kt @@ -2,17 +2,17 @@ package io.sentry.android.replay import java.io.Closeable -interface Recorder : Closeable { +public interface Recorder : Closeable { /** * @param recorderConfig a [ScreenshotRecorderConfig] that can be used to determine frame rate * at which the screenshots should be taken, and the screenshots size/resolution, which can * change e.g. in the case of orientation change or window size change */ - fun start(recorderConfig: ScreenshotRecorderConfig) + public fun start(recorderConfig: ScreenshotRecorderConfig) - fun resume() + public fun resume() - fun pause() + public fun pause() - fun stop() + public fun stop() } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayCache.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayCache.kt index dcbdd84360..ab907243fb 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayCache.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayCache.kt @@ -238,7 +238,7 @@ public class ReplayCache( * @param until value until whose the frames should be removed, represented as unix timestamp * @return the first screen in the rotated buffer, if any */ - fun rotate(until: Long): String? { + internal fun rotate(until: Long): String? { var screen: String? = null frames.removeAll { if (it.timestamp < until) { @@ -261,7 +261,7 @@ public class ReplayCache( } // TODO: it's awful, choose a better serialization format - fun persistSegmentValues(key: String, value: String?) { + internal fun persistSegmentValues(key: String, value: String?) { lock.acquire().use { if (isClosed.get()) { return @@ -283,7 +283,7 @@ public class ReplayCache( } } - companion object { + internal companion object { internal const val ONGOING_SEGMENT = ".ongoing_segment" internal const val SEGMENT_KEY_HEIGHT = "config.height" diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt index 5663b80f63..76c5f3a2f8 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt @@ -65,7 +65,7 @@ public class ReplayIntegration( IRateLimitObserver { // needed for the Java's call site - constructor(context: Context, dateProvider: ICurrentDateProvider) : this( + public constructor(context: Context, dateProvider: ICurrentDateProvider) : this( context.appContext(), dateProvider, null, @@ -142,7 +142,7 @@ public class ReplayIntegration( finalizePreviousReplay() } - override fun isRecording() = isRecording.get() + override fun isRecording(): Boolean = isRecording.get() override fun start() { // TODO: add lifecycle state instead and manage it in start/pause/resume/stop @@ -306,7 +306,7 @@ public class ReplayIntegration( } } - override fun onLowMemory() = Unit + override fun onLowMemory(): Unit = Unit override fun onTouchEvent(event: MotionEvent) { captureStrategy?.onTouchEvent(event) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt index 734be2c06a..007b1e6caf 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt @@ -308,7 +308,7 @@ public data class ScreenshotRecorderConfig( bitRate = 0 ) - companion object { + internal companion object { /** * Since codec block size is 16, so we have to adjust the width and height to it, otherwise * the codec might fail to configure on some devices, see https://cs.android.com/android/platform/superproject/+/master:frameworks/base/media/java/android/media/MediaCodecInfo.java;l=1999-2001 @@ -369,7 +369,7 @@ public interface ScreenshotRecorderCallback { * * @param bitmap a screenshot taken in the form of [android.graphics.Bitmap] */ - fun onScreenshotRecorded(bitmap: Bitmap) + public fun onScreenshotRecorded(bitmap: Bitmap) /** * Called whenever a new frame screenshot is available. @@ -377,5 +377,5 @@ public interface ScreenshotRecorderCallback { * @param screenshot file containing the frame screenshot * @param frameTimestamp the timestamp when the frame screenshot was taken */ - fun onScreenshotRecorded(screenshot: File, frameTimestamp: Long) + public fun onScreenshotRecorded(screenshot: File, frameTimestamp: Long) } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/SessionReplayOptions.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/SessionReplayOptions.kt index fb5105565b..e86b7b03b3 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/SessionReplayOptions.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/SessionReplayOptions.kt @@ -12,7 +12,7 @@ import io.sentry.SentryReplayOptions * *

Default is enabled. */ -var SentryReplayOptions.maskAllText: Boolean +public var SentryReplayOptions.maskAllText: Boolean @Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR) get() = error("Getter not supported") set(value) = setMaskAllText(value) @@ -25,7 +25,7 @@ var SentryReplayOptions.maskAllText: Boolean * *

Default is enabled. */ -var SentryReplayOptions.maskAllImages: Boolean +public var SentryReplayOptions.maskAllImages: Boolean @Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR) get() = error("Getter not supported") set(value) = setMaskAllImages(value) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ViewExtensions.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ViewExtensions.kt index 2625399c99..b39b96b523 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ViewExtensions.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ViewExtensions.kt @@ -5,7 +5,7 @@ import android.view.View /** * Marks this view to be masked in session replay. */ -fun View.sentryReplayMask() { +public fun View.sentryReplayMask() { setTag(R.id.sentry_privacy, "mask") } @@ -13,6 +13,6 @@ fun View.sentryReplayMask() { * Marks this view to be unmasked in session replay. * All its content will be visible in the replay, use with caution. */ -fun View.sentryReplayUnmask() { +public fun View.sentryReplayUnmask() { setTag(R.id.sentry_privacy, "unmask") } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/GestureRecorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/GestureRecorder.kt index 57302aaac1..e7df3f92dd 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/GestureRecorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/GestureRecorder.kt @@ -11,7 +11,7 @@ import io.sentry.android.replay.phoneWindow import io.sentry.android.replay.util.FixedWindowCallback import java.lang.ref.WeakReference -class GestureRecorder( +internal class GestureRecorder( private val options: SentryOptions, private val touchRecorderCallback: TouchRecorderCallback ) : OnRootViewsChangedListener { @@ -81,5 +81,5 @@ class GestureRecorder( } public interface TouchRecorderCallback { - fun onTouchEvent(event: MotionEvent) + public fun onTouchEvent(event: MotionEvent) } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/ReplayGestureConverter.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/ReplayGestureConverter.kt index 59d6b30bce..b379aaf32d 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/ReplayGestureConverter.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/gestures/ReplayGestureConverter.kt @@ -9,7 +9,7 @@ import io.sentry.rrweb.RRWebInteractionMoveEvent import io.sentry.rrweb.RRWebInteractionMoveEvent.Position import io.sentry.transport.ICurrentDateProvider -class ReplayGestureConverter( +internal class ReplayGestureConverter( private val dateProvider: ICurrentDateProvider ) { diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Executors.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Executors.kt index 453ff49df2..a0ab5a1251 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Executors.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Executors.kt @@ -1,5 +1,6 @@ package io.sentry.android.replay.util +import android.annotation.SuppressLint import io.sentry.ISentryExecutorService import io.sentry.SentryLevel.ERROR import io.sentry.SentryOptions @@ -64,6 +65,7 @@ internal fun ExecutorService.submitSafely( } } +@SuppressLint("DiscouragedApi") internal fun ScheduledExecutorService.scheduleAtFixedRateSafely( options: SentryOptions, taskName: String, diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/TextLayout.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/TextLayout.kt index cd07c6d170..26e61fb135 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/TextLayout.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/TextLayout.kt @@ -3,7 +3,7 @@ package io.sentry.android.replay.util /** * An abstraction over [android.text.Layout] with different implementations for Views and Compose. */ -interface TextLayout { +internal interface TextLayout { val lineCount: Int /** diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Views.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Views.kt index 0a0656de52..6e4433bd9a 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Views.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/Views.kt @@ -146,7 +146,7 @@ internal val TextView.totalPaddingTopSafe: Int */ internal fun Int.toOpaque() = this or 0xFF000000.toInt() -class AndroidTextLayout(private val layout: Layout) : TextLayout { +internal class AndroidTextLayout(private val layout: Layout) : TextLayout { override val lineCount: Int get() = layout.lineCount override val dominantTextColor: Int? get() { if (layout.text !is Spanned) return null diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleFrameMuxer.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleFrameMuxer.kt index 17f454967b..298e27db62 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleFrameMuxer.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleFrameMuxer.kt @@ -34,7 +34,7 @@ import android.media.MediaCodec import android.media.MediaFormat import java.nio.ByteBuffer -interface SimpleFrameMuxer { +internal interface SimpleFrameMuxer { fun isStarted(): Boolean fun start(videoFormat: MediaFormat) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleMp4FrameMuxer.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleMp4FrameMuxer.kt index cf30f9e49f..cfd89d1241 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleMp4FrameMuxer.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/video/SimpleMp4FrameMuxer.kt @@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit.MICROSECONDS import java.util.concurrent.TimeUnit.MILLISECONDS -class SimpleMp4FrameMuxer(path: String, fps: Float) : SimpleFrameMuxer { +internal class SimpleMp4FrameMuxer(path: String, fps: Float) : SimpleFrameMuxer { private val frameDurationUsec: Long = (TimeUnit.SECONDS.toMicros(1L) / fps).toLong() private val muxer: MediaMuxer = MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt index 03bda7cfc6..8b9755c39f 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt @@ -14,9 +14,10 @@ import io.sentry.android.replay.util.isMaskable import io.sentry.android.replay.util.isVisibleToUser import io.sentry.android.replay.util.toOpaque import io.sentry.android.replay.util.totalPaddingTopSafe +import java.util.Locale @TargetApi(26) -sealed class ViewHierarchyNode( +internal sealed class ViewHierarchyNode( val x: Float, val y: Float, val width: Int, @@ -250,13 +251,13 @@ sealed class ViewHierarchyNode( } private fun View.shouldMask(options: SentryOptions): Boolean { - if ((tag as? String)?.lowercase()?.contains(SENTRY_UNMASK_TAG) == true || + if ((tag as? String)?.toLowerCase(Locale.ROOT)?.contains(SENTRY_UNMASK_TAG) == true || getTag(R.id.sentry_privacy) == "unmask" ) { return false } - if ((tag as? String)?.lowercase()?.contains(SENTRY_MASK_TAG) == true || + if ((tag as? String)?.toLowerCase(Locale.ROOT)?.contains(SENTRY_MASK_TAG) == true || getTag(R.id.sentry_privacy) == "mask" ) { return true diff --git a/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt b/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt index e5330fa827..ec75571a4d 100644 --- a/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt +++ b/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt @@ -3,6 +3,7 @@ package io.sentry.android.replay.viewhierarchy import android.app.Activity import android.net.Uri import android.os.Bundle +import android.os.Looper import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement @@ -34,6 +35,7 @@ import io.sentry.android.replay.viewhierarchy.ViewHierarchyNode.TextViewHierarch import org.junit.Before import org.junit.runner.RunWith import org.robolectric.Robolectric.buildActivity +import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config import java.io.File import kotlin.test.Test @@ -48,6 +50,7 @@ class ComposeMaskingOptionsTest { @Before fun setup() { System.setProperty("robolectric.areWindowsMarkedVisible", "true") + System.setProperty("robolectric.pixelCopyRenderMode", "hardware") ComposeMaskingOptionsActivity.textModifierApplier = null ComposeMaskingOptionsActivity.containerModifierApplier = null } @@ -55,6 +58,7 @@ class ComposeMaskingOptionsTest { @Test fun `when maskAllText is set all Text nodes are masked`() { val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -70,6 +74,7 @@ class ComposeMaskingOptionsTest { @Test fun `when maskAllText is set to false all Text nodes are unmasked`() { val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = false @@ -83,6 +88,7 @@ class ComposeMaskingOptionsTest { @Test fun `when maskAllImages is set all Image nodes are masked`() { val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllImages = true @@ -96,6 +102,7 @@ class ComposeMaskingOptionsTest { @Test fun `when maskAllImages is set to false all Image nodes are unmasked`() { val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllImages = false @@ -110,6 +117,7 @@ class ComposeMaskingOptionsTest { fun `when sentry-mask modifier is set masks the node`() { ComposeMaskingOptionsActivity.textModifierApplier = { Modifier.sentryReplayMask() } val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = false @@ -130,6 +138,7 @@ class ComposeMaskingOptionsTest { fun `when sentry-unmask modifier is set unmasks the node`() { ComposeMaskingOptionsActivity.textModifierApplier = { Modifier.sentryReplayUnmask() } val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -139,9 +148,9 @@ class ComposeMaskingOptionsTest { assertEquals(4, textNodes.size) // [TextField, Text, Button, Activity Title] textNodes.forEach { if ((it.layout as? ComposeTextLayout)?.layout?.layoutInput?.text?.text == "Make Request") { - assertFalse(it.shouldMask) + assertFalse(it.shouldMask, "Node with text ${(it.layout as? ComposeTextLayout)?.layout?.layoutInput?.text?.text} should not be masked") } else { - assertTrue(it.shouldMask) + assertTrue(it.shouldMask, "Node with text ${(it.layout as? ComposeTextLayout)?.layout?.layoutInput?.text?.text} should be masked") } } } @@ -150,6 +159,7 @@ class ComposeMaskingOptionsTest { fun `when view is not visible, does not mask the view`() { ComposeMaskingOptionsActivity.textModifierApplier = { Modifier.semantics { invisibleToUser() } } val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -169,6 +179,7 @@ class ComposeMaskingOptionsTest { fun `when a container view is unmasked its children are not unmasked`() { ComposeMaskingOptionsActivity.containerModifierApplier = { Modifier.sentryReplayUnmask() } val activity = buildActivity(ComposeMaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions() diff --git a/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/MaskingOptionsTest.kt b/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/MaskingOptionsTest.kt index 4a40e0a915..b6082cdaa7 100644 --- a/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/MaskingOptionsTest.kt +++ b/sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/MaskingOptionsTest.kt @@ -6,6 +6,7 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Bundle +import android.os.Looper import android.view.View import android.widget.ImageView import android.widget.LinearLayout @@ -22,6 +23,7 @@ import io.sentry.android.replay.viewhierarchy.ViewHierarchyNode.ImageViewHierarc import io.sentry.android.replay.viewhierarchy.ViewHierarchyNode.TextViewHierarchyNode import org.junit.runner.RunWith import org.robolectric.Robolectric.buildActivity +import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config import kotlin.test.BeforeTest import kotlin.test.Test @@ -35,11 +37,13 @@ class MaskingOptionsTest { @BeforeTest fun setup() { System.setProperty("robolectric.areWindowsMarkedVisible", "true") + System.setProperty("robolectric.pixelCopyRenderMode", "hardware") } @Test fun `when maskAllText is set all TextView nodes are masked`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -58,6 +62,7 @@ class MaskingOptionsTest { @Test fun `when maskAllText is set to false all TextView nodes are unmasked`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = false @@ -76,6 +81,7 @@ class MaskingOptionsTest { @Test fun `when maskAllImages is set all ImageView nodes are masked`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllImages = true @@ -90,6 +96,7 @@ class MaskingOptionsTest { @Test fun `when maskAllImages is set to false all ImageView nodes are unmasked`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllImages = false @@ -104,6 +111,7 @@ class MaskingOptionsTest { @Test fun `when sentry-mask tag is set mask the view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = false @@ -118,6 +126,7 @@ class MaskingOptionsTest { @Test fun `when sentry-unmask tag is set unmasks the view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -132,6 +141,7 @@ class MaskingOptionsTest { @Test fun `when sentry-privacy tag is set to mask masks the view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = false @@ -146,6 +156,7 @@ class MaskingOptionsTest { @Test fun `when sentry-privacy tag is set to unmask unmasks the view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -160,6 +171,7 @@ class MaskingOptionsTest { @Test fun `when view is not visible, does not mask the view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true @@ -174,6 +186,7 @@ class MaskingOptionsTest { @Test fun `when added to mask list masks custom view`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskViewClasses.add(CustomView::class.java.canonicalName) @@ -187,6 +200,7 @@ class MaskingOptionsTest { @Test fun `when subclass is added to ignored classes ignores all instances of that class`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.maskAllText = true // all TextView subclasses @@ -203,6 +217,7 @@ class MaskingOptionsTest { @Test fun `when a container view is ignored its children are not ignored`() { buildActivity(MaskingOptionsActivity::class.java).setup() + shadowOf(Looper.getMainLooper()).idle() val options = SentryOptions().apply { experimental.sessionReplay.unmaskViewClasses.add(LinearLayout::class.java.canonicalName) diff --git a/sentry-android-sqlite/build.gradle.kts b/sentry-android-sqlite/build.gradle.kts index 6de1b1ab30..fe983f1dd8 100644 --- a/sentry-android-sqlite/build.gradle.kts +++ b/sentry-android-sqlite/build.gradle.kts @@ -15,7 +15,6 @@ android { namespace = "io.sentry.android.sqlite" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion // for AGP 4.1 @@ -50,10 +49,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-sqlite/src/main/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelper.kt b/sentry-android-sqlite/src/main/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelper.kt index 08777b7fb5..f22b90d8df 100644 --- a/sentry-android-sqlite/src/main/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelper.kt +++ b/sentry-android-sqlite/src/main/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelper.kt @@ -30,7 +30,7 @@ import androidx.sqlite.db.SupportSQLiteOpenHelper * * @param delegate The [SupportSQLiteOpenHelper] instance to delegate calls to. */ -class SentrySupportSQLiteOpenHelper private constructor( +public class SentrySupportSQLiteOpenHelper private constructor( private val delegate: SupportSQLiteOpenHelper ) : SupportSQLiteOpenHelper by delegate { @@ -50,11 +50,11 @@ class SentrySupportSQLiteOpenHelper private constructor( override val readableDatabase: SupportSQLiteDatabase get() = sentryReadableDatabase - companion object { + public companion object { // @JvmStatic is needed to let this method be accessed by our gradle plugin @JvmStatic - fun create(delegate: SupportSQLiteOpenHelper): SupportSQLiteOpenHelper { + public fun create(delegate: SupportSQLiteOpenHelper): SupportSQLiteOpenHelper { return if (delegate is SentrySupportSQLiteOpenHelper) { delegate } else { diff --git a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelperTest.kt b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelperTest.kt index 8160d49fae..6add02165d 100644 --- a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelperTest.kt +++ b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteOpenHelperTest.kt @@ -53,7 +53,7 @@ class SentrySupportSQLiteOpenHelperTest { @Test fun `create returns a SentrySupportSQLiteOpenHelper wrapper`() { val openHelper: SupportSQLiteOpenHelper = SentrySupportSQLiteOpenHelper.Companion.create(fixture.mockOpenHelper) - assertIs(openHelper) + assertIs(openHelper.writableDatabase) assertNotEquals(fixture.mockOpenHelper, openHelper) } diff --git a/sentry-android-timber/build.gradle.kts b/sentry-android-timber/build.gradle.kts index a2a999da4a..8f8afafd79 100644 --- a/sentry-android-timber/build.gradle.kts +++ b/sentry-android-timber/build.gradle.kts @@ -15,7 +15,6 @@ android { namespace = "io.sentry.android.timber" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner @@ -53,10 +52,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt index b0b756fa26..a0d9f4dad4 100644 --- a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt +++ b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt @@ -14,9 +14,9 @@ import java.io.Closeable /** * Sentry integration for Timber. */ -class SentryTimberIntegration( - val minEventLevel: SentryLevel = SentryLevel.ERROR, - val minBreadcrumbLevel: SentryLevel = SentryLevel.INFO +public class SentryTimberIntegration( + public val minEventLevel: SentryLevel = SentryLevel.ERROR, + public val minBreadcrumbLevel: SentryLevel = SentryLevel.INFO ) : Integration, Closeable { private lateinit var tree: SentryTimberTree private lateinit var logger: ILogger diff --git a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberTree.kt b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberTree.kt index dddab75133..dda29c61d8 100644 --- a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberTree.kt +++ b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberTree.kt @@ -12,7 +12,7 @@ import timber.log.Timber * Sentry Timber tree which is responsible to capture events via Timber */ @Suppress("TooManyFunctions") // we have to override all methods to be able to tweak logging -class SentryTimberTree( +public class SentryTimberTree( private val scopes: IScopes, private val minEventLevel: SentryLevel, private val minBreadcrumbLevel: SentryLevel diff --git a/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt b/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt index 2ab7ff64db..b556da459a 100644 --- a/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt +++ b/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt @@ -3,7 +3,7 @@ package io.sentry.android.timber import io.sentry.Breadcrumb import io.sentry.IScopes import io.sentry.SentryLevel -import io.sentry.getExc +import io.sentry.core.getExc import org.mockito.kotlin.any import org.mockito.kotlin.check import org.mockito.kotlin.mock diff --git a/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt b/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt index 95d342f3b9..09f5c4eb5d 100644 --- a/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt +++ b/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt @@ -1,8 +1,10 @@ -package io.sentry +package io.sentry.core + +import io.sentry.SentryEvent /** * package-private hack. */ -fun SentryEvent.getExc(): Throwable? { +internal fun SentryEvent.getExc(): Throwable? { return this.throwable } diff --git a/sentry-android/build.gradle.kts b/sentry-android/build.gradle.kts index 49f7e75006..43d07bd44d 100644 --- a/sentry-android/build.gradle.kts +++ b/sentry-android/build.gradle.kts @@ -9,7 +9,6 @@ android { namespace = "io.sentry.android" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion } @@ -25,10 +24,8 @@ android { } } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt index 52219cb8e1..f4b3567c11 100644 --- a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt +++ b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt @@ -36,7 +36,6 @@ import io.sentry.util.UrlUtils import io.sentry.vendor.Base64 import okio.Buffer import org.jetbrains.annotations.ApiStatus -import java.util.Locale private const val TRACE_ORIGIN = "auto.graphql.apollo3" @@ -170,7 +169,7 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor( variables?.let { setData("variables", it) } - setData(HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT)) + setData(HTTP_METHOD_KEY, method.uppercase()) } } diff --git a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt index dd5fdd3980..92b1f1cf79 100644 --- a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt +++ b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt @@ -26,7 +26,6 @@ import io.sentry.TypeCheckHint.APOLLO_REQUEST import io.sentry.TypeCheckHint.APOLLO_RESPONSE import io.sentry.util.IntegrationUtils.addIntegrationToSdkVersion import io.sentry.util.TracingUtils -import java.util.Locale import java.util.concurrent.Executor private const val TRACE_ORIGIN = "auto.graphql.apollo" @@ -76,7 +75,7 @@ class SentryApolloInterceptor( response.httpResponse.map { it.request().method() }.orNull()?.let { span.setData( SpanDataConvention.HTTP_METHOD_KEY, - it.toUpperCase(Locale.ROOT) + it.uppercase() ) } diff --git a/sentry-bom/build.gradle.kts b/sentry-bom/build.gradle.kts index 9f0a0ff117..8af147e82d 100644 --- a/sentry-bom/build.gradle.kts +++ b/sentry-bom/build.gradle.kts @@ -27,11 +27,3 @@ dependencies { } } } - -publishing { - publications { - create("maven") { - from(components["javaPlatform"]) - } - } -} diff --git a/sentry-compose-helper/build.gradle.kts b/sentry-compose-helper/build.gradle.kts index 4bdb1b1f99..be5637280e 100644 --- a/sentry-compose-helper/build.gradle.kts +++ b/sentry-compose-helper/build.gradle.kts @@ -20,6 +20,8 @@ kotlin { compileOnly(compose.runtime) compileOnly(compose.ui) + + compileOnly(Config.Libs.androidxAnnotation) } } val jvmTest by getting { @@ -27,6 +29,7 @@ kotlin { implementation(compose.runtime) implementation(compose.ui) + compileOnly(Config.Libs.androidxAnnotation) implementation(Config.TestLibs.kotlinTestJunit) implementation(Config.TestLibs.mockitoKotlin) implementation(Config.TestLibs.mockitoInline) @@ -50,7 +53,7 @@ val embeddedJar by configurations.creating { } artifacts { - add("embeddedJar", File("$buildDir/libs/sentry-compose-helper-jvm-$version.jar")) + add("embeddedJar", project.layout.buildDirectory.file("libs/sentry-compose-helper-jvm-$version.jar").get().asFile) } buildConfig { diff --git a/sentry-compose/build.gradle.kts b/sentry-compose/build.gradle.kts index 0253b97268..597a619154 100644 --- a/sentry-compose/build.gradle.kts +++ b/sentry-compose/build.gradle.kts @@ -70,7 +70,6 @@ android { namespace = "io.sentry.compose" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersion // for AGP 4.1 @@ -104,10 +103,12 @@ android { checkReleaseBuilds = false } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + buildFeatures { + buildConfig = true + } + + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } } diff --git a/sentry-kotlin-extensions/api/sentry-kotlin-extensions.api b/sentry-kotlin-extensions/api/sentry-kotlin-extensions.api index 7e3be67279..0555383c1b 100644 --- a/sentry-kotlin-extensions/api/sentry-kotlin-extensions.api +++ b/sentry-kotlin-extensions/api/sentry-kotlin-extensions.api @@ -3,11 +3,7 @@ public final class io/sentry/kotlin/SentryContext : kotlin/coroutines/AbstractCo public fun (Lio/sentry/IScopes;)V public synthetic fun (Lio/sentry/IScopes;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun copyForChild ()Lkotlinx/coroutines/CopyableThreadContextElement; - public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; public fun mergeForChild (Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; - public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; - public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; public fun restoreThreadContext (Lkotlin/coroutines/CoroutineContext;Lio/sentry/IScopes;)V public synthetic fun restoreThreadContext (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V public fun updateThreadContext (Lkotlin/coroutines/CoroutineContext;)Lio/sentry/IScopes; diff --git a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt index 137af27913..5bc488d074 100644 --- a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt +++ b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt @@ -12,7 +12,6 @@ import io.sentry.util.Platform import io.sentry.util.UrlUtils import okhttp3.Request import okhttp3.Response -import java.util.Locale import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean @@ -56,7 +55,7 @@ internal class SentryOkHttpEvent(private val scopes: IScopes, private val reques callSpan?.setData("url", url) callSpan?.setData("host", host) callSpan?.setData("path", encodedPath) - callSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method.uppercase(Locale.ROOT)) + callSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method.uppercase()) } /** diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 2d4ea259c6..4d346b294f 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -123,7 +123,7 @@ tasks { dependsOn(findByName("relocateJavaagentLibs")) with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) - into("$buildDir/isolated/javaagentLibs") + into(project.layout.buildDirectory.file("isolated/javaagentLibs").get().asFile) } // 3. the relocated and isolated javaagent libs are merged together with the bootstrap libs (which undergo relocation diff --git a/sentry-samples/sentry-samples-android/build.gradle.kts b/sentry-samples/sentry-samples-android/build.gradle.kts index 88ee38e931..04772af8aa 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -28,11 +28,26 @@ android { } } + lint { + disable.addAll( + listOf( + "Typos", + "PluralsCandidate", + "MonochromeLauncherIcon", + "TextFields", + "ContentDescription", + "LabelFor", + "HardcodedText" + ) + ) + } + buildFeatures { // Determines whether to support View Binding. // Note that the viewBinding.enabled property is now deprecated. viewBinding = true compose = true + buildConfig = true prefab = true } @@ -90,10 +105,8 @@ android { jvmTarget = JavaVersion.VERSION_1_8.toString() } - variantFilter { - if (Config.Android.shouldSkipDebugVariant(buildType.name)) { - ignore = true - } + androidComponents.beforeVariants { + it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } @Suppress("UnstableApiUsage") diff --git a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml index 84372b7766..d27733b96a 100644 --- a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml +++ b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml @@ -11,7 +11,6 @@ - @@ -19,9 +18,12 @@ - + + Date: Thu, 28 Nov 2024 14:03:44 +0100 Subject: [PATCH 2/9] Fix Changelog --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efa1e83e68..f2e63f260b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Breaking Changes + +- The Kotlin Language version is now set to 1.6 ([#3936](https://github.com/getsentry/sentry-java/pull/3936)) + ### Features - Extract OpenTelemetry `URL_PATH` span attribute into description ([#3933](https://github.com/getsentry/sentry-java/pull/3933)) @@ -357,10 +361,6 @@ You may also use `LifecycleHelper.close(token)`, e.g. in case you need to pass t - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#078) - [diff](https://github.com/getsentry/sentry-native/compare/0.7.2...0.7.8) -### Breaking Changes - -- The Kotlin Language version is now set to 1.6 ([#3839](https://github.com/getsentry/sentry-java/pull/3839)) - ## 7.17.0 ### Features From 5667b855ec128b721130500a6a94927ba8b18f47 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 12:26:41 +0100 Subject: [PATCH 3/9] Spotless --- .../android/core/UserInteractionIntegrationTest.kt | 3 --- sentry-android-replay/api/sentry-android-replay.api | 10 +++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt index f6f0e7e7aa..239aa85dbe 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/UserInteractionIntegrationTest.kt @@ -2,7 +2,6 @@ package io.sentry.android.core import android.app.Activity import android.app.Application -import android.content.Context import android.view.Window import androidx.test.ext.junit.runners.AndroidJUnit4 import io.sentry.Scopes @@ -12,7 +11,6 @@ import junit.framework.TestCase.assertNull import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull -import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.verify @@ -22,7 +20,6 @@ import kotlin.test.Test import kotlin.test.assertIs import kotlin.test.assertNotEquals import kotlin.test.assertSame -import kotlin.test.assertTrue @RunWith(AndroidJUnit4::class) class UserInteractionIntegrationTest { diff --git a/sentry-android-replay/api/sentry-android-replay.api b/sentry-android-replay/api/sentry-android-replay.api index 186e715d05..d4e20da038 100644 --- a/sentry-android-replay/api/sentry-android-replay.api +++ b/sentry-android-replay/api/sentry-android-replay.api @@ -42,19 +42,19 @@ public abstract interface class io/sentry/android/replay/Recorder : java/io/Clos public final class io/sentry/android/replay/ReplayCache : java/io/Closeable { public static final field $stable I - public fun (Lio/sentry/SentryOptions;Lio/sentry/protocol/SentryId;Lio/sentry/android/replay/ScreenshotRecorderConfig;)V + public fun (Lio/sentry/SentryOptions;Lio/sentry/protocol/SentryId;)V public final fun addFrame (Ljava/io/File;JLjava/lang/String;)V public static synthetic fun addFrame$default (Lio/sentry/android/replay/ReplayCache;Ljava/io/File;JLjava/lang/String;ILjava/lang/Object;)V public fun close ()V - public final fun createVideoOf (JJIIILjava/io/File;)Lio/sentry/android/replay/GeneratedVideo; - public static synthetic fun createVideoOf$default (Lio/sentry/android/replay/ReplayCache;JJIIILjava/io/File;ILjava/lang/Object;)Lio/sentry/android/replay/GeneratedVideo; + public final fun createVideoOf (JJIIIIILjava/io/File;)Lio/sentry/android/replay/GeneratedVideo; + public static synthetic fun createVideoOf$default (Lio/sentry/android/replay/ReplayCache;JJIIIIILjava/io/File;ILjava/lang/Object;)Lio/sentry/android/replay/GeneratedVideo; } public final class io/sentry/android/replay/ReplayIntegration : android/content/ComponentCallbacks, io/sentry/IConnectionStatusProvider$IConnectionStatusObserver, io/sentry/Integration, io/sentry/ReplayController, io/sentry/android/replay/ScreenshotRecorderCallback, io/sentry/android/replay/gestures/TouchRecorderCallback, io/sentry/transport/RateLimiter$IRateLimitObserver, java/io/Closeable { public static final field $stable I public fun (Landroid/content/Context;Lio/sentry/transport/ICurrentDateProvider;)V - public fun (Landroid/content/Context;Lio/sentry/transport/ICurrentDateProvider;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V - public synthetic fun (Landroid/content/Context;Lio/sentry/transport/ICurrentDateProvider;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Landroid/content/Context;Lio/sentry/transport/ICurrentDateProvider;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Landroid/content/Context;Lio/sentry/transport/ICurrentDateProvider;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun captureReplay (Ljava/lang/Boolean;)V public fun close ()V public fun getBreadcrumbConverter ()Lio/sentry/ReplayBreadcrumbConverter; From 0b86b383656672df11b552a34d88d3cce7569d09 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 12:58:36 +0100 Subject: [PATCH 4/9] Add a comment about NDK-AGP compatibility --- sentry-android-ndk/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sentry-android-ndk/build.gradle.kts b/sentry-android-ndk/build.gradle.kts index c0ddd39d4c..0d75024ddc 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -65,6 +65,8 @@ android { it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType) } + // the default AGP version is too high, we keep this low for compatibility reasons + // see https://developer.android.com/build/releases/past-releases/ to find the AGP-NDK mapping ndkVersion = "23.1.7779620" @Suppress("UnstableApiUsage") From 10f2858be9fd1dd3ef64adaad9dc9b234089e156 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 13:52:01 +0100 Subject: [PATCH 5/9] Remove redundant manifest --- sentry-android-replay/src/main/AndroidManifest.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 sentry-android-replay/src/main/AndroidManifest.xml diff --git a/sentry-android-replay/src/main/AndroidManifest.xml b/sentry-android-replay/src/main/AndroidManifest.xml deleted file mode 100644 index be2fa26e1e..0000000000 --- a/sentry-android-replay/src/main/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - From 5db044d26252134032625ba899a8f917d5f38bb9 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 13:58:54 +0100 Subject: [PATCH 6/9] Remove redundant extension --- .../io/sentry/android/timber/SentryTimberTreeTest.kt | 5 ++--- .../src/test/java/io/sentry/core/SentryEventKtx.kt | 10 ---------- 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt diff --git a/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt b/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt index b556da459a..30afeb928d 100644 --- a/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt +++ b/sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt @@ -3,7 +3,6 @@ package io.sentry.android.timber import io.sentry.Breadcrumb import io.sentry.IScopes import io.sentry.SentryLevel -import io.sentry.core.getExc import org.mockito.kotlin.any import org.mockito.kotlin.check import org.mockito.kotlin.mock @@ -130,7 +129,7 @@ class SentryTimberTreeTest { sut.e(throwable) verify(fixture.scopes).captureEvent( check { - assertEquals(throwable, it.getExc()) + assertEquals(throwable, it.throwable) } ) } @@ -141,7 +140,7 @@ class SentryTimberTreeTest { sut.e("message") verify(fixture.scopes).captureEvent( check { - assertNull(it.getExc()) + assertNull(it.throwable) } ) } diff --git a/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt b/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt deleted file mode 100644 index 09f5c4eb5d..0000000000 --- a/sentry-android-timber/src/test/java/io/sentry/core/SentryEventKtx.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.sentry.core - -import io.sentry.SentryEvent - -/** - * package-private hack. - */ -internal fun SentryEvent.getExc(): Throwable? { - return this.throwable -} From c7c5e466d0c8d1367367a167188142336ca582d7 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 14:03:47 +0100 Subject: [PATCH 7/9] Revert toLowerCase -> lowercase --- .../sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt index f4b312ae70..555190675e 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt @@ -251,13 +251,13 @@ internal sealed class ViewHierarchyNode( } private fun View.shouldMask(options: SentryOptions): Boolean { - if ((tag as? String)?.toLowerCase(Locale.ROOT)?.contains(SENTRY_UNMASK_TAG) == true || + if ((tag as? String)?.lowercase()?.contains(SENTRY_UNMASK_TAG) == true || getTag(R.id.sentry_privacy) == "unmask" ) { return false } - if ((tag as? String)?.toLowerCase(Locale.ROOT)?.contains(SENTRY_MASK_TAG) == true || + if ((tag as? String)?.lowercase()?.contains(SENTRY_MASK_TAG) == true || getTag(R.id.sentry_privacy) == "mask" ) { return true From d6a1e992e239462f2df2a485dffef6e27813162f Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Feb 2025 22:11:09 +0100 Subject: [PATCH 8/9] Centralize java-library config and mention javadoc/soruces to module files --- build.gradle.kts | 18 ++++++++++++++++++ .../replay/viewhierarchy/ViewHierarchyNode.kt | 1 - sentry-apache-http-client-5/build.gradle.kts | 5 ----- sentry-apollo-3/build.gradle.kts | 5 ----- sentry-apollo/build.gradle.kts | 5 ----- sentry-graphql-22/build.gradle.kts | 5 ----- sentry-graphql-core/build.gradle.kts | 5 ----- sentry-graphql/build.gradle.kts | 5 ----- sentry-jdbc/build.gradle.kts | 5 ----- sentry-jul/build.gradle.kts | 5 ----- sentry-kotlin-extensions/build.gradle.kts | 5 ----- sentry-log4j2/build.gradle.kts | 5 ----- sentry-logback/build.gradle.kts | 5 ----- sentry-okhttp/build.gradle.kts | 5 ----- sentry-openfeign/build.gradle.kts | 5 ----- .../build.gradle.kts | 5 ----- .../build.gradle.kts | 5 ----- .../build.gradle.kts | 5 ----- .../build.gradle.kts | 5 ----- .../build.gradle.kts | 5 ----- .../sentry-opentelemetry-core/build.gradle.kts | 5 ----- sentry-quartz/build.gradle.kts | 5 ----- sentry-servlet-jakarta/build.gradle.kts | 5 ----- sentry-servlet/build.gradle.kts | 5 ----- sentry-spring-boot-starter/build.gradle.kts | 5 ----- sentry-spring-boot/build.gradle.kts | 5 ----- sentry-spring/build.gradle.kts | 5 ----- sentry/build.gradle.kts | 5 ----- 28 files changed, 18 insertions(+), 131 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a1b81add3f..86d8765404 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,6 @@ import com.diffplug.spotless.LineEnding +import com.vanniktech.maven.publish.JavaLibrary +import com.vanniktech.maven.publish.JavadocJar import com.vanniktech.maven.publish.MavenPublishBaseExtension import groovy.util.Node import io.gitlab.arturbosch.detekt.extensions.DetektExtension @@ -184,6 +186,22 @@ subprojects { } } + plugins.withId("java-library") { + configure { + // we have to disable javadoc publication in maven-publish plugin as it's not + // including it in the .module file https://github.com/vanniktech/gradle-maven-publish-plugin/issues/861 + // and do it ourselves + configure(JavaLibrary(JavadocJar.None(), sourcesJar = true)) + } + + configure { + withJavadocJar() + + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + } + afterEvaluate { apply() diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt index 555190675e..1fba20d6f8 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt @@ -14,7 +14,6 @@ import io.sentry.android.replay.util.isMaskable import io.sentry.android.replay.util.isVisibleToUser import io.sentry.android.replay.util.toOpaque import io.sentry.android.replay.util.totalPaddingTopSafe -import java.util.Locale @TargetApi(26) internal sealed class ViewHierarchyNode( diff --git a/sentry-apache-http-client-5/build.gradle.kts b/sentry-apache-http-client-5/build.gradle.kts index a5d2dc358d..324569c63d 100644 --- a/sentry-apache-http-client-5/build.gradle.kts +++ b/sentry-apache-http-client-5/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.QualityPlugins.gradleVersions) } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-apollo-3/build.gradle.kts b/sentry-apollo-3/build.gradle.kts index 22583203ed..b3d2f7289e 100644 --- a/sentry-apollo-3/build.gradle.kts +++ b/sentry-apollo-3/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-apollo/build.gradle.kts b/sentry-apollo/build.gradle.kts index d05a31856b..3568254e81 100644 --- a/sentry-apollo/build.gradle.kts +++ b/sentry-apollo/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-graphql-22/build.gradle.kts b/sentry-graphql-22/build.gradle.kts index 5463456f8c..4cae7bc7b6 100644 --- a/sentry-graphql-22/build.gradle.kts +++ b/sentry-graphql-22/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-graphql-core/build.gradle.kts b/sentry-graphql-core/build.gradle.kts index ed1c197acd..20c0602489 100644 --- a/sentry-graphql-core/build.gradle.kts +++ b/sentry-graphql-core/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-graphql/build.gradle.kts b/sentry-graphql/build.gradle.kts index f0de17f288..2fec033ed7 100644 --- a/sentry-graphql/build.gradle.kts +++ b/sentry-graphql/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-jdbc/build.gradle.kts b/sentry-jdbc/build.gradle.kts index 239bd46cab..eb4b53a962 100644 --- a/sentry-jdbc/build.gradle.kts +++ b/sentry-jdbc/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-jul/build.gradle.kts b/sentry-jul/build.gradle.kts index 009561801b..f59f14bbf4 100644 --- a/sentry-jul/build.gradle.kts +++ b/sentry-jul/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-kotlin-extensions/build.gradle.kts b/sentry-kotlin-extensions/build.gradle.kts index c920b6cf33..9db72d89ca 100644 --- a/sentry-kotlin-extensions/build.gradle.kts +++ b/sentry-kotlin-extensions/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.QualityPlugins.detektPlugin) } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-log4j2/build.gradle.kts b/sentry-log4j2/build.gradle.kts index 933b28bfc9..1be24487c3 100644 --- a/sentry-log4j2/build.gradle.kts +++ b/sentry-log4j2/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-logback/build.gradle.kts b/sentry-logback/build.gradle.kts index 255e35022f..48c81a452e 100644 --- a/sentry-logback/build.gradle.kts +++ b/sentry-logback/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-okhttp/build.gradle.kts b/sentry-okhttp/build.gradle.kts index a30e2d0594..71e09d8778 100644 --- a/sentry-okhttp/build.gradle.kts +++ b/sentry-okhttp/build.gradle.kts @@ -11,11 +11,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-openfeign/build.gradle.kts b/sentry-openfeign/build.gradle.kts index 0679c42f41..305b020a3b 100644 --- a/sentry-openfeign/build.gradle.kts +++ b/sentry-openfeign/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 4d346b294f..88569f69b6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -5,11 +5,6 @@ plugins { id("com.github.johnrengelman.shadow") version "7.1.2" } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - fun relocatePackages(shadowJar: ShadowJar) { // rewrite dependencies calling Logger.getLogger shadowJar.relocate("java.util.logging.Logger", "io.opentelemetry.javaagent.bootstrap.PatchLogger") diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts index 77ef8f56a8..97452cab95 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts @@ -9,11 +9,6 @@ plugins { id(Config.QualityPlugins.gradleVersions) } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts index a79bd6c94f..1465574c65 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts @@ -2,11 +2,6 @@ plugins { `java-library` } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - dependencies { api(projects.sentry) implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts index 26a404e49c..efad0063a1 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts @@ -2,11 +2,6 @@ plugins { `java-library` } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - dependencies { api(projects.sentry) implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap) diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts index 6eb8e6d6f1..447b0823f5 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts @@ -9,11 +9,6 @@ plugins { id(Config.QualityPlugins.gradleVersions) } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts index e46ff2783a..de2143f01d 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts @@ -9,11 +9,6 @@ plugins { id(Config.QualityPlugins.gradleVersions) } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } diff --git a/sentry-quartz/build.gradle.kts b/sentry-quartz/build.gradle.kts index 8731f6a40b..605ae7a3b7 100644 --- a/sentry-quartz/build.gradle.kts +++ b/sentry-quartz/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-servlet-jakarta/build.gradle.kts b/sentry-servlet-jakarta/build.gradle.kts index 9066d228c7..6760e00c40 100644 --- a/sentry-servlet-jakarta/build.gradle.kts +++ b/sentry-servlet-jakarta/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-servlet/build.gradle.kts b/sentry-servlet/build.gradle.kts index 8d03ede152..593f346034 100644 --- a/sentry-servlet/build.gradle.kts +++ b/sentry-servlet/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-spring-boot-starter/build.gradle.kts b/sentry-spring-boot-starter/build.gradle.kts index fcbdd0d9a6..d68f2c9332 100644 --- a/sentry-spring-boot-starter/build.gradle.kts +++ b/sentry-spring-boot-starter/build.gradle.kts @@ -11,11 +11,6 @@ plugins { id(Config.BuildPlugins.springBoot) version Config.springBootVersion apply false } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-spring-boot/build.gradle.kts b/sentry-spring-boot/build.gradle.kts index f6a84d47f0..426cea26f6 100644 --- a/sentry-spring-boot/build.gradle.kts +++ b/sentry-spring-boot/build.gradle.kts @@ -12,11 +12,6 @@ plugins { id(Config.BuildPlugins.springBoot) version Config.springBootVersion apply false } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry-spring/build.gradle.kts b/sentry-spring/build.gradle.kts index 8f7ed519d2..6873c1cada 100644 --- a/sentry-spring/build.gradle.kts +++ b/sentry-spring/build.gradle.kts @@ -13,11 +13,6 @@ plugins { id(Config.BuildPlugins.springBoot) version Config.springBootVersion apply false } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() kotlinOptions.languageVersion = Config.kotlinCompatibleLanguageVersion diff --git a/sentry/build.gradle.kts b/sentry/build.gradle.kts index 08efc550d5..4498e3bc2f 100644 --- a/sentry/build.gradle.kts +++ b/sentry/build.gradle.kts @@ -10,11 +10,6 @@ plugins { id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } -configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType().configureEach { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } From 8ae3c3f5f8ff6a8894ed5bac2be3fa4556834374 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 5 Feb 2025 00:24:03 +0100 Subject: [PATCH 9/9] Fix publications for new locations --- buildSrc/src/main/java/Config.kt | 2 +- buildSrc/src/main/java/Publication.kt | 29 +++++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 9aa31dce0f..f508b21b1d 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -26,7 +26,7 @@ object Config { val gretty = "org.gretty" val grettyVersion = "4.0.0" val gradleMavenPublishPlugin = "com.vanniktech.maven.publish" - val gradleMavenPublishPluginVersion = "0.28.0" + val gradleMavenPublishPluginVersion = "0.30.0" val dokkaPlugin = "org.jetbrains.dokka:dokka-gradle-plugin:1.9.20" val dokkaPluginAlias = "org.jetbrains.dokka" val composeGradlePlugin = "org.jetbrains.compose:compose-gradle-plugin:$composeVersion" diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 08a81c703f..bae398e27c 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -24,7 +24,10 @@ fun DistributionContainer.configureForMultiplatform(project: Project) { } from("build${sep}libs") { include("*android*") - withJavadoc(renameTo = "compose-android") + include("*androidRelease-javadoc*") + rename { + it.replace("androidRelease-javadoc", "android") + } } } this.getByName("main").contents { @@ -38,8 +41,8 @@ fun DistributionContainer.configureForMultiplatform(project: Project) { rename { it.replace("-kotlin", "") .replace("-metadata", "") + .replace("Multiplatform-javadoc", "") } - withJavadoc() } } this.maybeCreate("desktop").contents { @@ -49,7 +52,10 @@ fun DistributionContainer.configureForMultiplatform(project: Project) { } from("build${sep}libs") { include("*desktop*") - withJavadoc(renameTo = "compose-desktop") + include("*desktop-javadoc*") + rename { + it.replace("desktop-javadoc", "desktop") + } } } @@ -77,16 +83,13 @@ fun DistributionContainer.configureForJvm(project: Project) { from("build${sep}publications${sep}release") { renameModule(project.name, version = version) } - } -} - -private fun CopySpec.withJavadoc(renameTo: String = "compose") { - include("*javadoc*") - rename { - if (it.contains("javadoc")) { - it.replace("compose", renameTo) - } else { - it + from("build${sep}intermediates${sep}java_doc_jar${sep}release") { + include("*javadoc*") + rename { it.replace("release", "${project.name}-$version") } + } + from("build${sep}intermediates${sep}source_jar${sep}release") { + include("*sources*") + rename { it.replace("release", "${project.name}-$version") } } } }