From 06c23dca2cea13c5c0574c445233f7a6ae70dd87 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 1 Nov 2024 10:37:24 +0000 Subject: [PATCH 01/22] Bump Gradle 8.9, AGP 8.6.0, Kotlin 1.9.22 --- build.gradle.kts | 21 ++-- buildSrc/src/main/java/Config.kt | 29 ++--- gradle.properties | 3 - gradle/wrapper/gradle-wrapper.properties | 2 +- sentry-android-core/build.gradle.kts | 11 +- .../src/main/AndroidManifest.xml | 7 +- .../api/sentry-android-fragment.api | 4 +- sentry-android-fragment/build.gradle.kts | 11 +- .../fragment/FragmentLifecycleIntegration.kt | 6 +- .../fragment/FragmentLifecycleState.kt | 6 +- .../SentryFragmentLifecycleCallbacks.kt | 16 +-- .../build.gradle.kts | 6 +- .../build.gradle.kts | 6 +- .../sentry-uitest-android/build.gradle.kts | 6 +- .../test-app-plain/build.gradle.kts | 6 +- .../test-app-sentry/build.gradle.kts | 6 +- sentry-android-navigation/build.gradle.kts | 11 +- .../navigation/SentryNavigationListener.kt | 6 +- sentry-android-ndk/build.gradle.kts | 15 ++- sentry-android-okhttp/build.gradle.kts | 11 +- .../okhttp/SentryOkHttpEventListener.kt | 12 +- .../android/okhttp/SentryOkHttpInterceptor.kt | 12 +- .../api/sentry-android-replay.api | 117 ------------------ sentry-android-replay/build.gradle.kts | 11 +- .../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/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 | 2 +- sentry-android-sqlite/build.gradle.kts | 11 +- .../sqlite/SentrySupportSQLiteOpenHelper.kt | 6 +- .../api/sentry-android-timber.api | 2 - sentry-android-timber/build.gradle.kts | 11 +- .../android/timber/SentryTimberIntegration.kt | 6 +- .../sentry/android/timber/SentryTimberTree.kt | 2 +- sentry-android/build.gradle.kts | 7 +- sentry-compose-helper/build.gradle.kts | 2 +- sentry-compose/build.gradle.kts | 11 +- .../api/sentry-kotlin-extensions.api | 4 - .../build.gradle.kts | 2 +- .../sentry-samples-android/build.gradle.kts | 7 +- 50 files changed, 167 insertions(+), 299 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9d532525628..6934ec5e975 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) @@ -139,7 +137,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(file("${project.layout.buildDirectory}/reports/kover/report.xml")) } } } @@ -154,8 +152,9 @@ subprojects { } } - if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support" && this.name != "sentry-compose-helper") { + if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support" && this.name != "sentry-compose-helper" && this.name != "sentry-bom") { apply() + apply() val sep = File.separator @@ -179,7 +178,7 @@ subprojects { this.dependsOn("publishToMavenLocal") this.doLast { val distributionFilePath = - "${this.project.buildDir}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" + "${this.project.layout.buildDirectory}${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") @@ -189,12 +188,6 @@ subprojects { 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() @@ -205,7 +198,7 @@ subprojects { repositories { maven { name = "unityMaven" - url = file("${rootProject.buildDir}/unityMaven").toURI() + url = file("${rootProject.layout.buildDirectory}/unityMaven").toURI() } } } @@ -242,7 +235,7 @@ spotless { gradle.projectsEvaluated { tasks.create("aggregateJavadocs", Javadoc::class.java) { - setDestinationDir(file("$buildDir/docs/javadoc")) + setDestinationDir(file("${project.layout.buildDirectory}/docs/javadoc")) 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 2715dd57671..971f4bea01e 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -2,16 +2,16 @@ 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.22" val kotlinStdLib = "stdlib-jdk8" val springBootVersion = "2.7.5" val springBoot3Version = "3.3.2" - val kotlinCompatibleLanguageVersion = "1.4" + val kotlinCompatibleLanguageVersion = "1.5" - val composeVersion = "1.5.3" - val androidComposeCompilerVersion = "1.4.0" + val composeVersion = "1.5.12" + val androidComposeCompilerVersion = "1.5.10" object BuildPlugins { val androidGradle = "com.android.tools.build:gradle:$AGP" @@ -23,8 +23,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" @@ -43,7 +44,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" } } @@ -144,13 +145,13 @@ 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.6.0" val apolloKotlin = "com.apollographql.apollo3:apollo-runtime:3.8.2" @@ -214,7 +215,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 4268e10785b..536a4f0eb1c 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=7.16.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b8..09523c0e549 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 12e6e6ad4f6..15692681cd7 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 dba3e7df8e7..880a38953a7 100644 --- a/sentry-android-core/src/main/AndroidManifest.xml +++ b/sentry-android-core/src/main/AndroidManifest.xml @@ -1,6 +1,11 @@ - + + + + + (Lio/sentry/IHub;ZZ)V public fun (ZZ)V public synthetic fun (ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getEnableAutoFragmentLifecycleTracing ()Z public final fun getEnableFragmentLifecycleBreadcrumbs ()Z - public final fun getFilterFragmentLifecycleBreadcrumbs ()Ljava/util/Set; public fun onFragmentAttached (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/content/Context;)V public fun onFragmentCreated (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V public fun onFragmentDestroyed (Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V diff --git a/sentry-android-fragment/build.gradle.kts b/sentry-android-fragment/build.gradle.kts index 14fb3ff9c18..37bba3e7cab 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 bd94c58684d..138e83b6897 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 fd52437d607..3a45dd60d0b 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 983d17464bd..322c12aa94b 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 hub: IHub = HubAdapter.getInstance(), - val filterFragmentLifecycleBreadcrumbs: Set, - val enableAutoFragmentLifecycleTracing: Boolean + private val filterFragmentLifecycleBreadcrumbs: Set, + private val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { - constructor( + public constructor( hub: IHub, 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/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts index 9cd769676a1..e8a483da7ea 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 @@ -76,10 +76,8 @@ android { checkReleaseBuilds = false } - 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/sentry-uitest-android-critical/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts index cebf744a24d..cce74876cdc 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) } } 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 7755166a4e2..374552f8089 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) } } 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 762bd2ce7ca..580a9248389 100644 --- a/sentry-android-integration-tests/test-app-plain/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-plain/build.gradle.kts @@ -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/build.gradle.kts b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts index 3c067fb7ed7..297312f60e4 100644 --- a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts @@ -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-navigation/build.gradle.kts b/sentry-android-navigation/build.gradle.kts index d46c7e2b84f..ddf8e1f6c0e 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 3d020f5a562..1c6cc68bad8 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 hub: IHub = HubAdapter.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 f1c48730537..60b27498e5b 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -24,8 +24,7 @@ android { println("sentry-android-ndk: $sentryNativeSrc") defaultConfig { - targetSdk = Config.Android.targetSdkVersion - minSdk = Config.Android.minSdkVersionNdk // NDK requires a higher API level than core. + minSdk = Config.Android.minSdkVersionNdk testInstrumentationRunner = Config.TestLibs.androidJUnitRunner @@ -90,11 +89,15 @@ 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" } dependencies { diff --git a/sentry-android-okhttp/build.gradle.kts b/sentry-android-okhttp/build.gradle.kts index 67a4729e562..d6226327602 100644 --- a/sentry-android-okhttp/build.gradle.kts +++ b/sentry-android-okhttp/build.gradle.kts @@ -15,7 +15,6 @@ android { namespace = "io.sentry.android.okhttp" defaultConfig { - targetSdk = Config.Android.targetSdkVersion minSdk = Config.Android.minSdkVersionOkHttp // 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-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpEventListener.kt b/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpEventListener.kt index 7ca5313d8f6..431cb71e2d1 100644 --- a/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpEventListener.kt +++ b/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpEventListener.kt @@ -41,31 +41,31 @@ import java.net.Proxy ReplaceWith("SentryOkHttpEventListener", "io.sentry.okhttp.SentryOkHttpEventListener") ) @Suppress("TooManyFunctions") -class SentryOkHttpEventListener( +public class SentryOkHttpEventListener( hub: IHub = HubAdapter.getInstance(), originalEventListenerCreator: ((call: Call) -> EventListener)? = null ) : EventListener() { - constructor() : this( + public constructor() : this( HubAdapter.getInstance(), originalEventListenerCreator = null ) - constructor(originalEventListener: EventListener) : this( + public constructor(originalEventListener: EventListener) : this( HubAdapter.getInstance(), originalEventListenerCreator = { originalEventListener } ) - constructor(originalEventListenerFactory: Factory) : this( + public constructor(originalEventListenerFactory: Factory) : this( HubAdapter.getInstance(), originalEventListenerCreator = { originalEventListenerFactory.create(it) } ) - constructor(hub: IHub = HubAdapter.getInstance(), originalEventListener: EventListener) : this( + public constructor(hub: IHub = HubAdapter.getInstance(), originalEventListener: EventListener) : this( hub, originalEventListenerCreator = { originalEventListener } ) - constructor(hub: IHub = HubAdapter.getInstance(), originalEventListenerFactory: Factory) : this( + public constructor(hub: IHub = HubAdapter.getInstance(), originalEventListenerFactory: Factory) : this( hub, originalEventListenerCreator = { originalEventListenerFactory.create(it) } ) diff --git a/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpInterceptor.kt b/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpInterceptor.kt index 6e58b7bb106..5dca5d8780b 100644 --- a/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpInterceptor.kt +++ b/sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpInterceptor.kt @@ -30,7 +30,7 @@ import okhttp3.Response "Use SentryOkHttpInterceptor from sentry-okhttp instead", ReplaceWith("SentryOkHttpInterceptor", "io.sentry.okhttp.SentryOkHttpInterceptor") ) -class SentryOkHttpInterceptor( +public class SentryOkHttpInterceptor( private val hub: IHub = HubAdapter.getInstance(), private val beforeSpan: BeforeSpanCallback? = null, private val captureFailedRequests: Boolean = true, @@ -49,9 +49,9 @@ class SentryOkHttpInterceptor( failedRequestTargets ) { - constructor() : this(HubAdapter.getInstance()) - constructor(hub: IHub) : this(hub, null) - constructor(beforeSpan: BeforeSpanCallback) : this(HubAdapter.getInstance(), beforeSpan) + public constructor() : this(HubAdapter.getInstance()) + public constructor(hub: IHub) : this(hub, null) + public constructor(beforeSpan: BeforeSpanCallback) : this(HubAdapter.getInstance(), beforeSpan) init { addIntegrationToSdkVersion("OkHttp") @@ -66,7 +66,7 @@ class SentryOkHttpInterceptor( "Use BeforeSpanCallback from sentry-okhttp instead", ReplaceWith("BeforeSpanCallback", "io.sentry.okhttp.SentryOkHttpInterceptor.BeforeSpanCallback") ) - fun interface BeforeSpanCallback { + public fun interface BeforeSpanCallback { /** * Mutates or drops span before being added * @@ -74,6 +74,6 @@ class SentryOkHttpInterceptor( * @param request the HTTP request executed by okHttp * @param response the HTTP response received by okHttp */ - fun execute(span: ISpan, request: Request, response: Response?): ISpan? + public fun execute(span: ISpan, request: Request, response: Response?): ISpan? } } diff --git a/sentry-android-replay/api/sentry-android-replay.api b/sentry-android-replay/api/sentry-android-replay.api index a08fb1dd988..ac8de52df9f 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/Integration, io/sentry/ReplayController, io/sentry/android/replay/ScreenshotRecorderCallback, io/sentry/android/replay/gestures/TouchRecorderCallback, java/io/Closeable { @@ -88,7 +81,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 @@ -109,10 +101,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; @@ -131,36 +119,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 @@ -191,82 +153,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 15713bb6f43..c32046a4c14 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.minSdkVersionReplay 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/java/io/sentry/android/replay/ModifierExtensions.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ModifierExtensions.kt index b5d52223886..5d0c27af356 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 6cf86b6a7e6..0946018c78d 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 3db92ea5d80..973a8ac9adf 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 @@ -236,7 +236,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) { @@ -260,7 +260,7 @@ public class ReplayCache( // TODO: it's awful, choose a better serialization format @Synchronized - fun persistSegmentValues(key: String, value: String?) { + internal fun persistSegmentValues(key: String, value: String?) { if (isClosed.get()) { return } @@ -280,7 +280,7 @@ public class ReplayCache( ongoingSegmentFile?.writeText(ongoingSegment.entries.joinToString("\n") { (k, v) -> "$k=$v" }) } - 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 90832585cd8..7b63a038168 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 @@ -51,7 +51,7 @@ public class ReplayIntegration( ) : Integration, Closeable, ScreenshotRecorderCallback, TouchRecorderCallback, ReplayController, ComponentCallbacks { // needed for the Java's call site - constructor(context: Context, dateProvider: ICurrentDateProvider) : this( + public constructor(context: Context, dateProvider: ICurrentDateProvider) : this( context.appContext(), dateProvider, null, @@ -126,7 +126,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 @@ -259,7 +259,7 @@ public class ReplayIntegration( recorder?.start(recorderConfig) } - 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 54f92a89587..3d19d1caf07 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 @@ -288,7 +288,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 @@ -349,7 +349,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. @@ -357,5 +357,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 fb5105565b6..e86b7b03b3a 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 2625399c99a..b39b96b523e 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 57302aaac13..e7df3f92ddf 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 59d6b30bce3..b379aaf32db 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/TextLayout.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/util/TextLayout.kt index cd07c6d1701..26e61fb135f 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 0a0656de52e..6e4433bd9af 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 17f454967bb..298e27db625 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 cf30f9e49fc..cfd89d12419 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 03cb37ad3e6..7fa2c31e7e3 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 @@ -15,7 +15,7 @@ import io.sentry.android.replay.util.toOpaque import io.sentry.android.replay.util.totalPaddingTopSafe @TargetApi(26) -sealed class ViewHierarchyNode( +internal sealed class ViewHierarchyNode( val x: Float, val y: Float, val width: Int, diff --git a/sentry-android-sqlite/build.gradle.kts b/sentry-android-sqlite/build.gradle.kts index 6de1b1ab30a..fe983f1dd87 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 08777b7fb53..f22b90d8dfe 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-timber/api/sentry-android-timber.api b/sentry-android-timber/api/sentry-android-timber.api index 808e91bf105..7349eba6faf 100644 --- a/sentry-android-timber/api/sentry-android-timber.api +++ b/sentry-android-timber/api/sentry-android-timber.api @@ -12,8 +12,6 @@ public final class io/sentry/android/timber/SentryTimberIntegration : io/sentry/ public fun (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;)V public synthetic fun (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun close ()V - public final fun getMinBreadcrumbLevel ()Lio/sentry/SentryLevel; - public final fun getMinEventLevel ()Lio/sentry/SentryLevel; public fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } diff --git a/sentry-android-timber/build.gradle.kts b/sentry-android-timber/build.gradle.kts index a2a999da4ab..8f8afafd799 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 f5350512a56..858fadf0f1b 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( + private val minEventLevel: SentryLevel = SentryLevel.ERROR, + private 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 f3a0f599a98..5c7bd928718 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 hub: IHub, private val minEventLevel: SentryLevel, private val minBreadcrumbLevel: SentryLevel diff --git a/sentry-android/build.gradle.kts b/sentry-android/build.gradle.kts index 81619b736f2..37b7faa9f7e 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.minSdkVersionNdk } @@ -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-compose-helper/build.gradle.kts b/sentry-compose-helper/build.gradle.kts index 4bdb1b1f990..c1963c12b26 100644 --- a/sentry-compose-helper/build.gradle.kts +++ b/sentry-compose-helper/build.gradle.kts @@ -50,7 +50,7 @@ val embeddedJar by configurations.creating { } artifacts { - add("embeddedJar", File("$buildDir/libs/sentry-compose-helper-jvm-$version.jar")) + add("embeddedJar", File("${project.layout.buildDirectory}/libs/sentry-compose-helper-jvm-$version.jar")) } buildConfig { diff --git a/sentry-compose/build.gradle.kts b/sentry-compose/build.gradle.kts index 114c08a22ff..63de0cab72c 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.minSdkVersionCompose // 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 d501240a3ab..abbd2546290 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/IHub;)V public synthetic fun (Lio/sentry/IHub;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/IHub;)V public synthetic fun restoreThreadContext (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V public fun updateThreadContext (Lkotlin/coroutines/CoroutineContext;)Lio/sentry/IHub; diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 80b68430db2..1ff25c634ea 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -122,7 +122,7 @@ tasks { dependsOn(findByName("relocateJavaagentLibs")) with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) - into("$buildDir/isolated/javaagentLibs") + into("${project.layout.buildDirectory}/isolated/javaagentLibs") } // 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 204ef83fc29..2616e2e8488 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -38,6 +38,7 @@ android { // Note that the viewBinding.enabled property is now deprecated. viewBinding = true compose = true + buildConfig = true } composeOptions { @@ -94,10 +95,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) } } From 175cd51c3b4d4f91d43153b6758b53742dfe87b5 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 1 Nov 2024 11:45:34 +0000 Subject: [PATCH 02/22] Disable explicit API mode for uitest modules --- .../sentry-uitest-android-benchmark/build.gradle.kts | 3 --- .../sentry-uitest-android-critical/build.gradle.kts | 4 ---- .../sentry-uitest-android/build.gradle.kts | 4 ---- 3 files changed, 11 deletions(-) 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 e8a483da7ea..ab62f2f5400 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 @@ -119,6 +119,3 @@ tasks.withType { 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 cce74876cdc..21c5998070f 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 @@ -61,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 374552f8089..e9711491434 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts @@ -138,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() -} From 496c89dd7d7162a7fa63c7e77d556ecc0c433df9 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Fri, 1 Nov 2024 11:47:45 +0000 Subject: [PATCH 03/22] Format code --- .../sentry-uitest-android-benchmark/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) 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 ab62f2f5400..88899bb24ac 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 @@ -118,4 +118,3 @@ tasks.withType { // Target version of the generated JVM bytecode. It is used for type resolution. jvmTarget = JavaVersion.VERSION_1_8.toString() } - From e5aba6df16ee86e34a2e5f75ca27ccff4043f179 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 7 Nov 2024 10:56:37 +0100 Subject: [PATCH 04/22] Address PR feedback --- buildSrc/src/main/java/Config.kt | 2 +- sentry-android-core/src/main/AndroidManifest.xml | 3 --- .../android/replay/DefaultReplayBreadcrumbConverter.kt | 5 ++++- .../sentry/android/replay/viewhierarchy/ViewHierarchyNode.kt | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 971f4bea01e..b7907ffab69 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -8,7 +8,7 @@ object Config { val springBootVersion = "2.7.5" val springBoot3Version = "3.3.2" - val kotlinCompatibleLanguageVersion = "1.5" + val kotlinCompatibleLanguageVersion = "1.4" val composeVersion = "1.5.12" val androidComposeCompilerVersion = "1.5.10" diff --git a/sentry-android-core/src/main/AndroidManifest.xml b/sentry-android-core/src/main/AndroidManifest.xml index 880a38953a7..cb5f59c4b67 100644 --- a/sentry-android-core/src/main/AndroidManifest.xml +++ b/sentry-android-core/src/main/AndroidManifest.xml @@ -3,9 +3,6 @@ xmlns:tools="http://schemas.android.com/tools"> - - - Date: Thu, 7 Nov 2024 12:08:01 +0100 Subject: [PATCH 05/22] Ensure file paths are correctly resolved --- build.gradle.kts | 16 +++++++--------- sentry-bom/build.gradle.kts | 8 -------- sentry-compose-helper/build.gradle.kts | 2 +- .../sentry-opentelemetry-agent/build.gradle.kts | 2 +- 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6934ec5e975..eac32dc6eee 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -137,7 +137,7 @@ subprojects { androidReports("release") { xml { // Change the report file name so the Codecov Github action can find it - setReportFile(file("${project.layout.buildDirectory}/reports/kover/report.xml")) + setReportFile(project.layout.buildDirectory.file("reports/kover/report.xml").get().asFile) } } } @@ -152,7 +152,7 @@ subprojects { } } - if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support" && this.name != "sentry-compose-helper" && this.name != "sentry-bom") { + if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support" && this.name != "sentry-compose-helper") { apply() apply() @@ -177,11 +177,9 @@ subprojects { tasks.named("distZip").configure { this.dependsOn("publishToMavenLocal") this.doLast { - val distributionFilePath = - "${this.project.layout.buildDirectory}${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") } } @@ -198,7 +196,7 @@ subprojects { repositories { maven { name = "unityMaven" - url = file("${rootProject.layout.buildDirectory}/unityMaven").toURI() + url = rootProject.layout.buildDirectory.file("unityMaven").get().asFile.toURI() } } } @@ -235,7 +233,7 @@ spotless { gradle.projectsEvaluated { tasks.create("aggregateJavadocs", Javadoc::class.java) { - setDestinationDir(file("${project.layout.buildDirectory}/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/sentry-bom/build.gradle.kts b/sentry-bom/build.gradle.kts index 9f0a0ff1178..8af147e82db 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 c1963c12b26..ad04e48de02 100644 --- a/sentry-compose-helper/build.gradle.kts +++ b/sentry-compose-helper/build.gradle.kts @@ -50,7 +50,7 @@ val embeddedJar by configurations.creating { } artifacts { - add("embeddedJar", File("${project.layout.buildDirectory}/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-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 1ff25c634ea..f5be1c718f0 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -122,7 +122,7 @@ tasks { dependsOn(findByName("relocateJavaagentLibs")) with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) - into("${project.layout.buildDirectory}/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 From 17cdc9131dca5032f63434e84fae9abd052c0d46 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 8 Nov 2024 10:12:42 +0100 Subject: [PATCH 06/22] Fix more lint/test issues --- .../internal/util/SentryFrameMetricsCollector.java | 3 +-- .../io/sentry/android/core/ContextUtilsTest.kt | 2 ++ .../core/SystemEventsBreadcrumbsIntegrationTest.kt | 9 ++++++--- sentry-android-replay/src/main/AndroidManifest.xml | 6 ++++++ .../io/sentry/android/replay/util/Executors.kt | 2 ++ .../api/sentry-android-timber.api | 2 ++ .../android/timber/SentryTimberIntegration.kt | 4 ++-- .../sentry-samples-android/build.gradle.kts | 14 ++++++++++++++ .../src/main/AndroidManifest.xml | 8 +++++--- 9 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 sentry-android-replay/src/main/AndroidManifest.xml diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java index 25ff5da2bdb..412f8a2fb2d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java @@ -68,7 +68,6 @@ public SentryFrameMetricsCollector( this(context, logger, buildInfoProvider, new WindowFrameMetricsManager() {}); } - @SuppressWarnings("deprecation") @SuppressLint({"NewApi", "DiscouragedPrivateApi"}) public SentryFrameMetricsCollector( final @NotNull Context context, @@ -79,7 +78,7 @@ public SentryFrameMetricsCollector( } @SuppressWarnings("deprecation") - @SuppressLint({"NewApi", "DiscouragedPrivateApi"}) + @SuppressLint({"NewApi", "PrivateApi"}) public SentryFrameMetricsCollector( final @NotNull Context context, final @NotNull ILogger logger, diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt index 588a32a6569..80e19d01200 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt @@ -1,5 +1,6 @@ package io.sentry.android.core +import android.annotation.SuppressLint import android.app.ActivityManager import android.app.ActivityManager.MemoryInfo import android.app.ActivityManager.RunningAppProcessInfo @@ -174,6 +175,7 @@ class ContextUtilsTest { assertNull(memInfo) } + @SuppressLint("UnspecifiedRegisterReceiverFlag") @Test fun `registerReceiver calls context_registerReceiver without exported flag on API 32-`() { val buildInfo = mock() 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 3dfca15fdb3..ef89af5e69c 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.IHub @@ -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.hub, 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.hub, 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.hub, fixture.options) diff --git a/sentry-android-replay/src/main/AndroidManifest.xml b/sentry-android-replay/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..5094ceefb98 --- /dev/null +++ b/sentry-android-replay/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + 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 453ff49df29..a0ab5a12516 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-timber/api/sentry-android-timber.api b/sentry-android-timber/api/sentry-android-timber.api index 7349eba6faf..808e91bf105 100644 --- a/sentry-android-timber/api/sentry-android-timber.api +++ b/sentry-android-timber/api/sentry-android-timber.api @@ -12,6 +12,8 @@ public final class io/sentry/android/timber/SentryTimberIntegration : io/sentry/ public fun (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;)V public synthetic fun (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun close ()V + public final fun getMinBreadcrumbLevel ()Lio/sentry/SentryLevel; + public final fun getMinEventLevel ()Lio/sentry/SentryLevel; public fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V } 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 858fadf0f1b..f139eb5772e 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 @@ -15,8 +15,8 @@ import java.io.Closeable * Sentry integration for Timber. */ public class SentryTimberIntegration( - private val minEventLevel: SentryLevel = SentryLevel.ERROR, - private val minBreadcrumbLevel: SentryLevel = SentryLevel.INFO + 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-samples/sentry-samples-android/build.gradle.kts b/sentry-samples/sentry-samples-android/build.gradle.kts index 2616e2e8488..68dfff28e6c 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -33,6 +33,20 @@ 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. diff --git a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml index d8ae6c709d9..7bf1a5bfd50 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: Fri, 8 Nov 2024 10:29:28 +0100 Subject: [PATCH 07/22] Fix minSdk errors --- sentry-android-replay/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry-android-replay/src/main/AndroidManifest.xml b/sentry-android-replay/src/main/AndroidManifest.xml index 5094ceefb98..be2fa26e1ed 100644 --- a/sentry-android-replay/src/main/AndroidManifest.xml +++ b/sentry-android-replay/src/main/AndroidManifest.xml @@ -2,5 +2,7 @@ - + + From b5aa001c942db9b757ad718d864c84e223334256 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 8 Nov 2024 10:55:00 +0100 Subject: [PATCH 08/22] Remove assertIs, as it's not available for Kotlin 1.4 --- .../fragment/SentryFragmentLifecycleCallbacks.kt | 4 ++-- .../android/sqlite/SQLiteSpanManagerTest.kt | 3 +-- .../sqlite/SentrySupportSQLiteDatabaseTest.kt | 15 ++++----------- .../sqlite/SentrySupportSQLiteOpenHelperTest.kt | 6 +++--- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/SentryFragmentLifecycleCallbacks.kt index 322c12aa94b..dc8c78344bc 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 @@ -21,8 +21,8 @@ private const val TRACE_ORIGIN = "auto.ui.fragment" @Suppress("TooManyFunctions") public class SentryFragmentLifecycleCallbacks( private val hub: IHub = HubAdapter.getInstance(), - private val filterFragmentLifecycleBreadcrumbs: Set, - private val enableAutoFragmentLifecycleTracing: Boolean + internal val filterFragmentLifecycleBreadcrumbs: Set, + internal val enableAutoFragmentLifecycleTracing: Boolean ) : FragmentLifecycleCallbacks() { public constructor( diff --git a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt index 425932113cd..be9f0bf1f3d 100644 --- a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt +++ b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt @@ -16,7 +16,6 @@ import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse -import kotlin.test.assertIs import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -151,7 +150,7 @@ class SQLiteSpanManagerTest { val result = sut.performSql("sql") { mock() } // Returns a SentryCrossProcessCursor - assertIs(result) + assertNotNull(result) // And no span is started assertNull(fixture.sentryTracer.children.firstOrNull()) } diff --git a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt index cf22c3b0ec3..26764727aaa 100644 --- a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt +++ b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt @@ -1,6 +1,5 @@ package io.sentry.android.sqlite -import android.database.Cursor import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteQuery import io.sentry.IHub @@ -16,7 +15,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -64,21 +62,17 @@ class SentrySupportSQLiteDatabaseTest { sut.execPerConnectionSQL(sql, emptyArray()) verify(fixture.mockDatabase).execPerConnectionSQL(eq(sql), any()) - var res = sut.query(sql) + sut.query(sql) verify(fixture.mockDatabase).query(eq(sql)) - assertIs(res) - res = sut.query(sql, emptyArray()) + sut.query(sql, emptyArray()) verify(fixture.mockDatabase).query(eq(sql), any()) - assertIs(res) - res = sut.query(dummySqLiteQuery) + sut.query(dummySqLiteQuery) verify(fixture.mockDatabase).query(eq(dummySqLiteQuery)) - assertIs(res) - res = sut.query(dummySqLiteQuery, mock()) + sut.query(dummySqLiteQuery, mock()) verify(fixture.mockDatabase).query(eq(dummySqLiteQuery), any()) - assertIs(res) sut.execSQL(sql) verify(fixture.mockDatabase).execSQL(eq(sql)) @@ -96,7 +90,6 @@ class SentrySupportSQLiteDatabaseTest { val sut = fixture.getSut() val compiled = sut.compileStatement("sql") assertNotNull(compiled) - assertIs(compiled) } @Test 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 8160d49fae5..c5e1ffa0755 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 @@ -7,8 +7,8 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlin.test.assertNotEquals +import kotlin.test.assertNotNull class SentrySupportSQLiteOpenHelperTest { @@ -47,13 +47,13 @@ class SentrySupportSQLiteOpenHelperTest { @Test fun `writableDatabase returns a SentrySupportSQLiteDatabase`() { val openHelper = fixture.getSut() - assertIs(openHelper.writableDatabase) + assertNotNull(openHelper.writableDatabase) } @Test fun `create returns a SentrySupportSQLiteOpenHelper wrapper`() { val openHelper: SupportSQLiteOpenHelper = SentrySupportSQLiteOpenHelper.Companion.create(fixture.mockOpenHelper) - assertIs(openHelper) + assertNotNull(openHelper) assertNotEquals(fixture.mockOpenHelper, openHelper) } From 1188303b5a9b430e52cc1d33affa433ea762b7c1 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Tue, 12 Nov 2024 08:34:41 +0100 Subject: [PATCH 09/22] Fix detekt errors --- .../java/io/sentry/android/timber/SentryTimberTreeTest.kt | 2 +- .../src/test/java/io/sentry/core/SentryEventKtx.kt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) 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 3d82b139ec1..997329504e5 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.IHub 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 95d342f3b92..09f5c4eb5d0 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 } From 9083d6074b0e4bcce369f915e8f3dc2217d339e7 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Tue, 12 Nov 2024 08:34:49 +0100 Subject: [PATCH 10/22] Fix R8 issues --- .../benchmark-proguard-rules.pro | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 8f5e14b25e7..b2db365bad4 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 From 2dcb237db5953fbfc5af8e17093f2596bd9f811a Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Wed, 13 Nov 2024 13:39:51 +0100 Subject: [PATCH 11/22] Bump to Kotlin 1.9.24, language version 1.6, Compose MP 1.6.11, Compose Compiler 1.5.14 --- buildSrc/src/main/java/Config.kt | 10 ++++++---- .../replay/DefaultReplayBreadcrumbConverter.kt | 3 +-- .../android/sqlite/SQLiteSpanManagerTest.kt | 3 ++- .../sqlite/SentrySupportSQLiteDatabaseTest.kt | 15 +++++++++++---- .../sqlite/SentrySupportSQLiteOpenHelperTest.kt | 6 +++--- .../apollo3/SentryApollo3HttpInterceptor.kt | 3 +-- .../io/sentry/apollo/SentryApolloInterceptor.kt | 3 +-- sentry-compose-helper/build.gradle.kts | 2 ++ .../java/io/sentry/okhttp/SentryOkHttpEvent.kt | 3 +-- 9 files changed, 28 insertions(+), 20 deletions(-) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index b7907ffab69..5f91295e8f0 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -3,15 +3,17 @@ import java.math.BigDecimal object Config { val AGP = System.getenv("VERSION_AGP") ?: "8.6.0" - val kotlinVersion = "1.9.22" + 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.12" - val androidComposeCompilerVersion = "1.5.10" + // 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" 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 053096b5e6a..d7b4b7739e4 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 @@ -7,7 +7,6 @@ import io.sentry.SpanDataConvention import io.sentry.rrweb.RRWebBreadcrumbEvent import io.sentry.rrweb.RRWebEvent import io.sentry.rrweb.RRWebSpanEvent -import java.util.Locale import kotlin.LazyThreadSafetyMode.NONE public open class DefaultReplayBreadcrumbConverter : ReplayBreadcrumbConverter { @@ -128,7 +127,7 @@ public open class DefaultReplayBreadcrumbConverter : ReplayBreadcrumbConverter { private fun String.snakeToCamelCase(): String { return replace(snakecasePattern) { - it.value.last().toString().toUpperCase(Locale.ROOT) + it.value.last().toString().uppercase() } } diff --git a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt index be9f0bf1f3d..425932113cd 100644 --- a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt +++ b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt @@ -16,6 +16,7 @@ import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertIs import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -150,7 +151,7 @@ class SQLiteSpanManagerTest { val result = sut.performSql("sql") { mock() } // Returns a SentryCrossProcessCursor - assertNotNull(result) + assertIs(result) // And no span is started assertNull(fixture.sentryTracer.children.firstOrNull()) } diff --git a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt index 26764727aaa..cf22c3b0ec3 100644 --- a/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt +++ b/sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SentrySupportSQLiteDatabaseTest.kt @@ -1,5 +1,6 @@ package io.sentry.android.sqlite +import android.database.Cursor import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteQuery import io.sentry.IHub @@ -15,6 +16,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -62,17 +64,21 @@ class SentrySupportSQLiteDatabaseTest { sut.execPerConnectionSQL(sql, emptyArray()) verify(fixture.mockDatabase).execPerConnectionSQL(eq(sql), any()) - sut.query(sql) + var res = sut.query(sql) verify(fixture.mockDatabase).query(eq(sql)) + assertIs(res) - sut.query(sql, emptyArray()) + res = sut.query(sql, emptyArray()) verify(fixture.mockDatabase).query(eq(sql), any()) + assertIs(res) - sut.query(dummySqLiteQuery) + res = sut.query(dummySqLiteQuery) verify(fixture.mockDatabase).query(eq(dummySqLiteQuery)) + assertIs(res) - sut.query(dummySqLiteQuery, mock()) + res = sut.query(dummySqLiteQuery, mock()) verify(fixture.mockDatabase).query(eq(dummySqLiteQuery), any()) + assertIs(res) sut.execSQL(sql) verify(fixture.mockDatabase).execSQL(eq(sql)) @@ -90,6 +96,7 @@ class SentrySupportSQLiteDatabaseTest { val sut = fixture.getSut() val compiled = sut.compileStatement("sql") assertNotNull(compiled) + assertIs(compiled) } @Test 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 c5e1ffa0755..6add02165da 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 @@ -7,8 +7,8 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlin.test.assertNotEquals -import kotlin.test.assertNotNull class SentrySupportSQLiteOpenHelperTest { @@ -47,13 +47,13 @@ class SentrySupportSQLiteOpenHelperTest { @Test fun `writableDatabase returns a SentrySupportSQLiteDatabase`() { val openHelper = fixture.getSut() - assertNotNull(openHelper.writableDatabase) + assertIs(openHelper.writableDatabase) } @Test fun `create returns a SentrySupportSQLiteOpenHelper wrapper`() { val openHelper: SupportSQLiteOpenHelper = SentrySupportSQLiteOpenHelper.Companion.create(fixture.mockOpenHelper) - assertNotNull(openHelper) + assertIs(openHelper.writableDatabase) assertNotEquals(fixture.mockOpenHelper, openHelper) } 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 08cab179a54..a6c1c6b9b8c 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 8191e48e4a4..1394046ac34 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-compose-helper/build.gradle.kts b/sentry-compose-helper/build.gradle.kts index ad04e48de02..0b7a06eee32 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) + + implementation("androidx.annotation:annotation:1.9.1") } } val jvmTest by getting { 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 6bceb81a195..ca7953218be 100644 --- a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt +++ b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt @@ -20,7 +20,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.RejectedExecutionException import java.util.concurrent.atomic.AtomicBoolean @@ -66,7 +65,7 @@ internal class SentryOkHttpEvent(private val hub: IHub, private val request: Req callRootSpan?.setData("url", url) callRootSpan?.setData("host", host) callRootSpan?.setData("path", encodedPath) - callRootSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT)) + callRootSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method.uppercase()) } /** From 73d248dbb0d3ffef8b013a1a3413c9dab29eae3e Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 14 Nov 2024 09:25:03 +0000 Subject: [PATCH 12/22] Format code --- sentry-android-ndk/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-ndk/build.gradle.kts b/sentry-android-ndk/build.gradle.kts index 5da9450b87e..01261789e07 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -98,7 +98,7 @@ android { } ndkVersion = "23.1.7779620" - + @Suppress("UnstableApiUsage") packagingOptions { jniLibs { From 571da2938f062f7ce3407efad8d28213be0a1fe5 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 14 Nov 2024 11:33:10 +0100 Subject: [PATCH 13/22] Define testProguardFiles to make R8 happy --- .../sentry-uitest-android-benchmark/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) 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 88899bb24ac..0cb209ad1ab 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") } } From af380aa84ff0080fed061916c42cba4e24baca91 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 15 Nov 2024 10:14:33 +0100 Subject: [PATCH 14/22] Add detailed message to asserts --- .../android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e5330fa8277..7ed966eb22f 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 @@ -139,9 +139,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") } } } From ad3740f175bb6de86bf0689adf119f62118a6654 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 15 Nov 2024 10:29:56 +0100 Subject: [PATCH 15/22] Ensure looper is idle --- .../replay/viewhierarchy/ComposeMaskingOptionsTest.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 7ed966eb22f..7616681101b 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 @@ -55,6 +57,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 +73,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 +87,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 +101,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 +116,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 +137,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 @@ -150,6 +158,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 +178,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() From 8fbc17b9b66e2d6b9b3fb8ec16a1524d54b32749 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 15 Nov 2024 11:26:57 +0100 Subject: [PATCH 16/22] Bump robolectric, ensure main thread is idle for all replay tests --- buildSrc/src/main/java/Config.kt | 2 +- .../viewhierarchy/ComposeMaskingOptionsTest.kt | 1 + .../replay/viewhierarchy/MaskingOptionsTest.kt | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 5f91295e8f0..511e810bd0a 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -193,7 +193,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" 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 7616681101b..ec75571a4df 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 @@ -50,6 +50,7 @@ class ComposeMaskingOptionsTest { @Before fun setup() { System.setProperty("robolectric.areWindowsMarkedVisible", "true") + System.setProperty("robolectric.pixelCopyRenderMode", "hardware") ComposeMaskingOptionsActivity.textModifierApplier = null ComposeMaskingOptionsActivity.containerModifierApplier = null } 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 4a40e0a9150..b6082cdaa77 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) From 15c166204a6398df6f15804871e92df6fb157c20 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 15 Nov 2024 13:44:41 +0100 Subject: [PATCH 17/22] Fully robolectric-ify UserInteractionIntegration tests As the latest robolectric version features new shadows clashing with our mocks --- .../core/UserInteractionIntegrationTest.kt | 87 ++++++------------- 1 file changed, 25 insertions(+), 62 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 d43dfe14197..223013e2e9c 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.Hub 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(hub.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() @@ -103,12 +85,8 @@ class UserInteractionIntegrationTest { fun `registers window callback on activity resumed`() { val sut = fixture.getSut() sut.register(fixture.hub, 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 @@ -116,62 +94,47 @@ class UserInteractionIntegrationTest { val sut = fixture.getSut() sut.register(fixture.hub, fixture.options) - sut.onActivityResumed(fixture.activity) + fixture.window.callback = null - val argumentCaptor = argumentCaptor() - verify(fixture.window).callback = argumentCaptor.capture() - assertTrue { - argumentCaptor.firstValue is SentryWindowCallback && - (argumentCaptor.firstValue as SentryWindowCallback).delegate is NoOpWindowCallback - } + sut.onActivityResumed(fixture.activity) + 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() From 96ee3c686395fd3bac232113669d9de9d4782322 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Fri, 15 Nov 2024 13:52:42 +0100 Subject: [PATCH 18/22] Add Changelog for new Kotlin Language version --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba0e84d5d68..9b772f696b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ - [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 fcf74d8cec5d771c40718e9ac68d668662ca916e Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 18 Nov 2024 09:32:53 +0100 Subject: [PATCH 19/22] Fix missing proguard rules --- .../test-app-plain/build.gradle.kts | 2 +- .../test-app-plain/proguard-rules.pro | 2 ++ .../test-app-sentry/build.gradle.kts | 2 +- .../test-app-sentry/proguard-rules.pro | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) 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 580a9248389..a5d70465417 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") 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 2f9dc5a47ed..d5b66a5b790 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 297312f60e4..53d4985c59f 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") 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 2f9dc5a47ed..e6edffeb9ef 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 From b203084335cf92d99b3b4aad83e220527ffb0b47 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 18 Nov 2024 10:02:48 +0100 Subject: [PATCH 20/22] Fix missing explicit API --- .../src/main/java/io/sentry/android/replay/ReplayIntegration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3b98b019681..d0bec3e9aec 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 @@ -306,7 +306,7 @@ public class ReplayIntegration( } } - override fun onLowMemory() = Unit + override fun onLowMemory() : Unit = Unit override fun onTouchEvent(event: MotionEvent) { captureStrategy?.onTouchEvent(event) From 317eb419bd44683a3685be01a18447723713697b Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 18 Nov 2024 09:05:12 +0000 Subject: [PATCH 21/22] Format code --- .../src/main/java/io/sentry/android/replay/ReplayIntegration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d0bec3e9aec..435450daf80 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 @@ -306,7 +306,7 @@ public class ReplayIntegration( } } - override fun onLowMemory() : Unit = Unit + override fun onLowMemory(): Unit = Unit override fun onTouchEvent(event: MotionEvent) { captureStrategy?.onTouchEvent(event) From 778c58f46635bca93f8b88c770d1fac11094ff63 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 18 Nov 2024 10:02:48 +0100 Subject: [PATCH 22/22] Fix missing explicit API --- .../src/main/java/io/sentry/android/replay/ReplayIntegration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3b98b019681..d0bec3e9aec 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 @@ -306,7 +306,7 @@ public class ReplayIntegration( } } - override fun onLowMemory() = Unit + override fun onLowMemory() : Unit = Unit override fun onTouchEvent(event: MotionEvent) { captureStrategy?.onTouchEvent(event)