package io.sentry.flutter import io.sentry.SentryLevel import io.sentry.android.core.BuildConfig import io.sentry.android.core.SentryAndroidOptions import io.sentry.protocol.SdkVersion import java.util.Locale class SentryFlutter( private val androidSdk: String, private val nativeSdk: String ) { var autoPerformanceTracingEnabled = false fun updateOptions(options: SentryAndroidOptions, data: Map) { data.getIfNotNull("dsn") { options.dsn = it } data.getIfNotNull("debug") { options.isDebug = it } data.getIfNotNull("environment") { options.environment = it } data.getIfNotNull("release") { options.release = it } data.getIfNotNull("dist") { options.dist = it } data.getIfNotNull("enableAutoSessionTracking") { options.isEnableAutoSessionTracking = it } data.getIfNotNull("autoSessionTrackingIntervalMillis") { options.sessionTrackingIntervalMillis = it } data.getIfNotNull("anrTimeoutIntervalMillis") { options.anrTimeoutIntervalMillis = it } data.getIfNotNull("attachThreads") { options.isAttachThreads = it } data.getIfNotNull("attachStacktrace") { options.isAttachStacktrace = it } data.getIfNotNull("enableAutoNativeBreadcrumbs") { options.isEnableActivityLifecycleBreadcrumbs = it options.isEnableAppLifecycleBreadcrumbs = it options.isEnableSystemEventBreadcrumbs = it options.isEnableAppComponentBreadcrumbs = it options.isEnableUserInteractionBreadcrumbs = it } data.getIfNotNull("maxBreadcrumbs") { options.maxBreadcrumbs = it } data.getIfNotNull("maxCacheItems") { options.maxCacheItems = it } data.getIfNotNull("diagnosticLevel") { if (options.isDebug) { val sentryLevel = SentryLevel.valueOf(it.toUpperCase(Locale.ROOT)) options.setDiagnosticLevel(sentryLevel) } } data.getIfNotNull("anrEnabled") { options.isAnrEnabled = it } data.getIfNotNull("sendDefaultPii") { options.isSendDefaultPii = it } data.getIfNotNull("enableNdkScopeSync") { options.isEnableScopeSync = it } data.getIfNotNull("proguardUuid") { options.proguardUuid = it } val nativeCrashHandling = (data["enableNativeCrashHandling"] as? Boolean) ?: true // nativeCrashHandling has priority over anrEnabled if (!nativeCrashHandling) { options.isEnableUncaughtExceptionHandler = false options.isAnrEnabled = false // if split symbols are enabled, we need Ndk integration so we can't really offer the option // to turn it off // options.isEnableNdk = false } data.getIfNotNull("enableAutoPerformanceTracing") { enableAutoPerformanceTracing -> if (enableAutoPerformanceTracing) { autoPerformanceTracingEnabled = true } } data.getIfNotNull("sendClientReports") { options.isSendClientReports = it } data.getIfNotNull("maxAttachmentSize") { options.maxAttachmentSize = it } var sdkVersion = options.sdkVersion if (sdkVersion == null) { sdkVersion = SdkVersion(androidSdk, BuildConfig.VERSION_NAME) } else { sdkVersion.name = androidSdk } options.sdkVersion = sdkVersion options.sentryClientName = "$androidSdk/${BuildConfig.VERSION_NAME}" options.nativeSdkName = nativeSdk data.getIfNotNull("connectionTimeoutMillis") { options.connectionTimeoutMillis = it } data.getIfNotNull("readTimeoutMillis") { options.readTimeoutMillis = it } } } // Call the `completion` closure if cast to map value with `key` and type `T` is successful. @Suppress("UNCHECKED_CAST") private fun Map.getIfNotNull(key: String, callback: (T) -> Unit) { (get(key) as? T)?.let { callback(it) } }