Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3bd4b1
Add compose module
romtsn Jun 11, 2022
15085f3
Add sentry-android-navigation module for jetpack.navigation support
romtsn Jun 15, 2022
4076929
Compose sample + tweaks
romtsn Jun 20, 2022
2d64f04
Merge branch 'main' into feat/navigation-breadcrumbs
romtsn Jun 20, 2022
962466a
feat: androidx-navigation support
romtsn Jun 20, 2022
9ab0299
feat: androidx-compose support for navigation
romtsn Jun 21, 2022
9660cd1
Merge branch 'feat/androidx-navigation' into feat/androidx-compose
romtsn Jun 21, 2022
048df40
api dump
romtsn Jun 21, 2022
608d751
Compose sample + tweaks
romtsn Jun 21, 2022
ddbd29d
Fix compose activity
romtsn Jun 22, 2022
40372df
api dump
romtsn Jun 22, 2022
db06058
Address PR reviews
romtsn Jun 22, 2022
29c8107
Add JvmOverloads for java-interop
romtsn Jun 22, 2022
bf7bce2
Add tests
romtsn Jun 22, 2022
1c87f90
Switch to compileOnly navigation-runtime dep
romtsn Jun 22, 2022
3ec43e0
Add runtime dep in tests
romtsn Jun 22, 2022
6a3c581
Merge branch 'feat/androidx-navigation' into feat/androidx-compose
romtsn Jun 22, 2022
28e2606
Address PR reviews
romtsn Jun 22, 2022
8133b05
Add kotlin language verison for compatibility
romtsn Jun 22, 2022
721c35c
Merge branch 'feat/androidx-navigation' into feat/androidx-compose
romtsn Jun 22, 2022
3426dfd
Merge branch 'feat/androidx-compose' into feat/compose-sample
romtsn Jun 22, 2022
828fbcf
Fix test
romtsn Jun 22, 2022
a474427
Merge branch 'feat/androidx-compose' into feat/compose-sample
romtsn Jun 22, 2022
6815f62
Rename extension method to withSentryObservableEffect
romtsn Jun 22, 2022
4e23337
Merge branch 'feat/androidx-compose' into feat/compose-sample
romtsn Jun 22, 2022
47f315d
Update sample
romtsn Jun 22, 2022
dc1e5fa
api dump
romtsn Jun 22, 2022
a35a0e1
Merge branch 'feat/androidx-compose' into feat/compose-sample
romtsn Jun 22, 2022
2cf6c87
Navigation tracing WIP
romtsn Jun 23, 2022
65654d3
Finalize nav tracing
romtsn Jun 24, 2022
6cf851f
Set nav tx to scope and refine the name of it
romtsn Jun 24, 2022
815c346
Add tests
romtsn Jun 24, 2022
d54672e
spotless & api
romtsn Jun 24, 2022
2c0fcc8
Merge branch 'feat/compose-navigation-support' into feat/androidx-nav…
romtsn Jun 24, 2022
1e2c0af
Fix detekt
romtsn Jun 24, 2022
9ad489a
Format code
getsentry-bot Jun 24, 2022
c5ceca7
Add new modules to craft.yml (#2138)
romtsn Jun 27, 2022
02facea
Attach hint
romtsn Jun 28, 2022
fd5b2e0
Address PR reviews
romtsn Jun 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .craft.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ targets:
maven:io.sentry:sentry-apollo:
maven:io.sentry:sentry-jdbc:
maven:io.sentry:sentry-graphql:
maven:io.sentry:sentry-android-navigation:
maven:io.sentry:sentry-compose:
9 changes: 9 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import com.diffplug.spotless.LineEnding
import com.vanniktech.maven.publish.MavenPublishPlugin
import com.vanniktech.maven.publish.MavenPublishPluginExtension
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

Expand Down Expand Up @@ -89,6 +90,14 @@ allprojects {
}

subprojects {
plugins.withId(Config.QualityPlugins.detektPlugin) {
configure<DetektExtension> {
buildUponDefaultConfig = true
allRules = true
config.setFrom("${rootProject.rootDir}/detekt.yml")
}
}
Comment thread
romtsn marked this conversation as resolved.

if (!this.name.contains("sample") && !this.name.contains("integration-tests") && this.name != "sentry-test-support") {
apply<DistributionPlugin>()

Expand Down
3 changes: 3 additions & 0 deletions detekt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
style:
ReturnCount:
max: 3
Comment thread
marandaneto marked this conversation as resolved.
6 changes: 0 additions & 6 deletions sentry-android-fragment/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension

plugins {
id("com.android.library")
Expand Down Expand Up @@ -79,8 +78,3 @@ tasks.withType<Detekt> {
// Target version of the generated JVM bytecode. It is used for type resolution.
jvmTarget = JavaVersion.VERSION_1_8.toString()
}

configure<DetektExtension> {
buildUponDefaultConfig = true
allRules = true
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import net.ltgt.gradle.errorprone.errorprone

plugins {
Expand Down Expand Up @@ -122,11 +121,6 @@ tasks.withType<Detekt> {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}

configure<DetektExtension> {
buildUponDefaultConfig = true
allRules = true
}

kotlin {
explicitApi()
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import net.ltgt.gradle.errorprone.errorprone

plugins {
Expand Down Expand Up @@ -120,11 +119,6 @@ tasks.withType<Detekt> {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}

configure<DetektExtension> {
buildUponDefaultConfig = true
allRules = true
}

kotlin {
explicitApi()
}
9 changes: 8 additions & 1 deletion sentry-android-navigation/api/sentry-android-navigation.api
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@ public final class io/sentry/android/navigation/BuildConfig {
}

public final class io/sentry/android/navigation/SentryNavigationListener : androidx/navigation/NavController$OnDestinationChangedListener {
public static final field Companion Lio/sentry/android/navigation/SentryNavigationListener$Companion;
public static final field NAVIGATION_OP Ljava/lang/String;
public fun <init> ()V
public fun <init> (Lio/sentry/IHub;)V
public synthetic fun <init> (Lio/sentry/IHub;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lio/sentry/IHub;Z)V
public fun <init> (Lio/sentry/IHub;ZZ)V
public synthetic fun <init> (Lio/sentry/IHub;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun onDestinationChanged (Landroidx/navigation/NavController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V
}

public final class io/sentry/android/navigation/SentryNavigationListener$Companion {
}

6 changes: 0 additions & 6 deletions sentry-android-navigation/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension

plugins {
id("com.android.library")
Expand Down Expand Up @@ -88,8 +87,3 @@ tasks.withType<Detekt> {
// Target version of the generated JVM bytecode. It is used for type resolution.
jvmTarget = JavaVersion.VERSION_1_8.toString()
}

configure<DetektExtension> {
buildUponDefaultConfig = true
allRules = true
}
Original file line number Diff line number Diff line change
@@ -1,64 +1,151 @@
package io.sentry.android.navigation

import android.content.res.Resources.NotFoundException
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import io.sentry.Breadcrumb
import io.sentry.Hint
import io.sentry.HubAdapter
import io.sentry.IHub
import io.sentry.ITransaction
import io.sentry.SentryLevel.DEBUG
import io.sentry.SentryLevel.INFO
import io.sentry.SpanStatus
import io.sentry.TypeCheckHint
import java.lang.ref.WeakReference

class SentryNavigationListener @JvmOverloads constructor(
private val hub: IHub = HubAdapter.getInstance()
private val hub: IHub = HubAdapter.getInstance(),
private val enableNavigationBreadcrumbs: Boolean = true,
private val enableNavigationTracing: Boolean = true
) : NavController.OnDestinationChangedListener {

private var previousDestinationRef: WeakReference<NavDestination>? = null
private var previousArgs: Bundle? = null

private val isPerformanceEnabled get() = hub.options.isTracingEnabled && enableNavigationTracing

private var activeTransaction: ITransaction? = null

override fun onDestinationChanged(
controller: NavController,
destination: NavDestination,
arguments: Bundle?
) {
addBreadcrumb(destination, arguments)
val toArguments = arguments.refined()

addBreadcrumb(destination, toArguments)
startTracing(controller, destination, toArguments)
previousDestinationRef = WeakReference(destination)
previousArgs = arguments
}

private fun addBreadcrumb(destination: NavDestination, arguments: Bundle?) {
private fun addBreadcrumb(destination: NavDestination, arguments: Map<String, Any?>) {
if (!enableNavigationBreadcrumbs) {
return
}
val breadcrumb = Breadcrumb().apply {
type = "navigation"
category = "navigation"
type = NAVIGATION_OP
category = NAVIGATION_OP

val from = previousDestinationRef?.get()?.route
from?.let { data["from"] = it }
previousArgs?.let { args ->
val fromArguments = args.keySet().filter {
it != NavController.KEY_DEEP_LINK_INTENT // there's a lot of unrelated stuff
}.associateWith { args[it] }
if (fromArguments.isNotEmpty()) {
data["from_arguments"] = fromArguments
}
from?.let { data["from"] = "/$it" }
val fromArguments = previousArgs.refined()
if (fromArguments.isNotEmpty()) {
data["from_arguments"] = fromArguments
}

val to = destination.route
to?.let { data["to"] = it }
arguments?.let { args ->
val toArguments = args.keySet().filter {
it != NavController.KEY_DEEP_LINK_INTENT // there's a lot of unrelated stuff
}.associateWith { args[it] }
if (toArguments.isNotEmpty()) {
data["to_arguments"] = toArguments
}
to?.let { data["to"] = "/$it" }
if (arguments.isNotEmpty()) {
data["to_arguments"] = arguments
}

level = INFO
}
val hint = Hint()
hint.set(TypeCheckHint.ANDROID_NAV_DESTINATION, destination)
hub.addBreadcrumb(breadcrumb)
hub.addBreadcrumb(breadcrumb, hint)
}

private fun startTracing(
controller: NavController,
destination: NavDestination,
arguments: Map<String, Any?>
) {
if (!isPerformanceEnabled) {
return
}

// we can only have one nav transaction at a time
if (activeTransaction != null) {
stopTracing()
}

if (destination.navigatorName == "activity") {
// we do not trace navigation between activities to avoid clashing with activity lifecycle tracing
hub.options.logger.log(
DEBUG,
"Navigating to activity destination, no transaction captured."
)
return
}

@Suppress("SwallowedException") // we swallow it on purpose
var name = destination.route ?: try {
controller.context.resources.getResourceEntryName(destination.id)
} catch (e: NotFoundException) {
hub.options.logger.log(
DEBUG,
"Destination id cannot be retrieved from Resources, no transaction captured."
)
return
}

// we add '/' to the name to match dart and web pattern
name = "/" + name.substringBefore('/') // strip out arguments from the tx name
Comment thread
romtsn marked this conversation as resolved.

val transaction =
hub.startTransaction(name, NAVIGATION_OP, true, hub.options.idleTimeout, true)
Comment thread
romtsn marked this conversation as resolved.

if (arguments.isNotEmpty()) {
transaction.setData("arguments", arguments)
}
hub.configureScope { scope ->
scope.withTransaction { tx ->
if (tx == null) {
scope.transaction = transaction
}
}
}
activeTransaction = transaction
}

private fun stopTracing() {
val status = activeTransaction?.status ?: SpanStatus.OK
activeTransaction?.finish(status)

// clear transaction from scope so others can bind to it
hub.configureScope { scope ->
scope.withTransaction { tx ->
if (tx == activeTransaction) {
scope.clearTransaction()
}
}
}

activeTransaction = null
}

private fun Bundle?.refined(): Map<String, Any?> =
this?.let { args ->
args.keySet().filter {
it != NavController.KEY_DEEP_LINK_INTENT // there's a lot of unrelated stuff
}.associateWith { args[it] }
} ?: emptyMap()

companion object {
const val NAVIGATION_OP = "navigation"
}
}
Loading