├── sample ├── tv │ ├── .gitignore │ └── src │ │ └── main │ │ ├── res │ │ ├── drawable-xhdpi │ │ │ └── banner.png │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values-land │ │ │ └── dimens.xml │ │ ├── values-w600dp │ │ │ └── dimens.xml │ │ ├── drawable │ │ │ └── baseline_play_arrow_24.xml │ │ ├── values │ │ │ ├── dimens.xml │ │ │ └── strings.xml │ │ └── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── java │ │ └── com │ │ └── datadog │ │ └── android │ │ └── tv │ │ └── sample │ │ └── model │ │ └── EpisodeList.kt ├── wear │ ├── .gitignore │ └── src │ │ └── main │ │ └── res │ │ ├── mipmap-hdpi │ │ └── ic_launcher.webp │ │ ├── mipmap-mdpi │ │ └── ic_launcher.webp │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.webp │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.webp │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.webp │ │ ├── values-round │ │ └── strings.xml │ │ └── values │ │ └── strings.xml ├── benchmark │ ├── .gitignore │ └── src │ │ └── main │ │ ├── res │ │ ├── drawable │ │ │ └── ic_dd_icon_rgb.png │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── values │ │ │ ├── themes.xml │ │ │ └── dimens.xml │ │ └── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── java │ │ └── com │ │ └── datadog │ │ └── benchmark │ │ └── sample │ │ ├── utils │ │ ├── recycler │ │ │ └── BaseRecyclerViewItem.kt │ │ └── CollectionUtils.kt │ │ ├── BenchmarkConfigHolder.kt │ │ └── ui │ │ └── sessionreplay │ │ └── SessionReplayNavigationManager.kt ├── automotive │ ├── .gitignore │ └── src │ │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── xml │ │ │ └── automotive_app_desc.xml │ │ └── mipmap-anydpi │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── java │ │ └── com │ │ └── datadog │ │ └── sample │ │ └── automotive │ │ └── SharedLogger.kt ├── kotlin │ ├── src │ │ └── main │ │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── ic_dd_icon_rgb.png │ │ │ │ ├── selector_statelist_images.xml │ │ │ │ ├── selector_nav_search.xml │ │ │ │ ├── selector_nav_edits.xml │ │ │ │ ├── selector_nav_saved.xml │ │ │ │ ├── selector_statelist_images_no_default.xml │ │ │ │ ├── ic_menu_white_24dp.xml │ │ │ │ ├── ic_bookmark_white_24dp.xml │ │ │ │ ├── ic_bookmark_border_white_24dp.xml │ │ │ │ ├── ph_background_grey.xml │ │ │ │ ├── ph_background_red.xml │ │ │ │ ├── ic_mode_edit_white_24dp.xml │ │ │ │ ├── ic_dd_shape_oval.xml │ │ │ │ ├── ic_dd_shape_rect.xml │ │ │ │ ├── ph_error.xml │ │ │ │ ├── ic_search_white_24dp.xml │ │ │ │ ├── ph_default.xml │ │ │ │ ├── ic_add_24dp.xml │ │ │ │ ├── ic_dd_statelist.xml │ │ │ │ ├── baseline_arrow_drop_down_24.xml │ │ │ │ ├── outline_edit_24.xml │ │ │ │ ├── baseline_text_fields_24.xml │ │ │ │ └── ic_traces_black_24dp.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── xml │ │ │ │ ├── automotive_app_desc.xml │ │ │ │ └── network_security_config.xml │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-nodpi │ │ │ │ └── example_appwidget_preview.png │ │ │ ├── raw │ │ │ │ └── about.txt │ │ │ ├── values │ │ │ │ ├── ids.xml │ │ │ │ ├── styles.xml │ │ │ │ └── dimens.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ └── layout │ │ │ │ └── fragment_web.xml │ │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── datadog │ │ │ │ └── android │ │ │ │ └── sample │ │ │ │ ├── compose │ │ │ │ ├── DimensionExt.kt │ │ │ │ └── Page.kt │ │ │ │ ├── home │ │ │ │ └── HomeViewModel.kt │ │ │ │ ├── logs │ │ │ │ └── LogsViewModel.kt │ │ │ │ ├── crash │ │ │ │ └── CrashViewModel.kt │ │ │ │ ├── datalist │ │ │ │ └── DataSourceType.kt │ │ │ │ ├── picture │ │ │ │ ├── ImageLoaderType.kt │ │ │ │ └── ImageLoader.kt │ │ │ │ ├── data │ │ │ │ ├── model │ │ │ │ │ ├── LogsCollection.kt │ │ │ │ │ ├── Log.kt │ │ │ │ │ └── LogAttributes.kt │ │ │ │ └── Result.kt │ │ │ │ └── sessionreplay │ │ │ │ ├── ImageScalingFragment.kt │ │ │ │ └── DifferentFontsFragment.kt │ │ │ └── sqldelight │ │ │ └── com.datadog.android.sample.data.db │ │ │ └── Logs.sq │ └── .gitignore └── vendor-lib │ ├── .gitignore │ └── src │ └── main │ └── kotlin │ └── com │ └── datadog │ └── android │ └── vendor │ └── sample │ └── SseEvent.kt ├── tools ├── benchmark │ ├── .gitignore │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── datadog │ │ └── benchmark │ │ ├── internal │ │ ├── RequestBodyBuilder.kt │ │ └── model │ │ │ └── BenchmarkContext.kt │ │ ├── noop │ │ ├── NoOpObservableLongGauge.kt │ │ └── NoOpObservableDoubleGauge.kt │ │ └── DatadogBaseMeter.kt ├── javabackport │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ └── java │ │ ├── nio │ │ └── file │ │ │ └── Path.kt │ │ └── util │ │ └── concurrent │ │ ├── atomic │ │ └── LongAdder.kt │ │ └── CompletableFuture.kt ├── unit │ ├── .gitignore │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── tools │ │ │ └── unit │ │ │ └── annotations │ │ │ └── TestConfigurationsProvider.kt │ │ └── test │ │ └── kotlin │ │ └── com │ │ └── datadog │ │ └── tools │ │ └── unit │ │ └── extensions │ │ ├── JavaClassWithStaticMock.java │ │ └── JavaClassWithNestedStaticMock.java ├── detekt │ ├── .gitignore │ └── src │ │ ├── test │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── tools │ │ │ └── detekt │ │ │ └── rules │ │ │ └── test │ │ │ └── FakeAnnotation.kt │ │ └── main │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── io.gitlab.arturbosch.detekt.api.RuleSetProvider ├── lint │ └── .gitignore └── noopfactory │ └── src │ ├── test │ └── resources │ │ ├── src │ │ ├── PublicImplementation.kt │ │ ├── ExperimentalInterface.kt │ │ ├── OverloadedInterface.kt │ │ ├── EnumInterface.kt │ │ ├── AnyGenericInterface.kt │ │ ├── InheritedInterface.kt │ │ ├── NotAnInterface.kt │ │ └── ExperimentalApi.kt │ │ └── gen │ │ ├── NoOpPublicImplementation.kt │ │ ├── NoOpExperimentalInterface.kt │ │ ├── NoOpEnumInterface.kt │ │ ├── NoOpOverloadedInterface.kt │ │ └── NoOpInheritedInterface.kt │ └── main │ └── resources │ └── META-INF │ └── services │ └── com.google.devtools.ksp.processing.SymbolProcessorProvider ├── dd-sdk-android-internal ├── .gitignore ├── transitiveDependencies └── src │ └── main │ └── java │ └── com │ └── datadog │ └── android │ └── internal │ ├── profiler │ └── NoOpExecutionTimer.kt │ ├── telemetry │ └── TracingHeaderTypesSet.kt │ └── flags │ └── RumFlagEvaluationMessage.kt ├── reliability ├── core-it │ ├── src │ │ └── main │ │ │ ├── assets │ │ │ └── datadog.buildId │ │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ └── proguard-rules.pro └── single-fit │ ├── okhttp │ └── src │ │ └── test │ │ └── resources │ │ └── graphql │ │ ├── com │ │ └── example │ │ │ ├── FakeMutation.graphql │ │ │ └── FakeQuery.graphql │ │ └── schema.graphqls │ ├── logs │ └── src │ │ └── main │ │ └── AndroidManifest.xml │ ├── rum │ └── src │ │ ├── main │ │ └── AndroidManifest.xml │ │ └── test │ │ └── kotlin │ │ └── com │ │ └── datadog │ │ └── android │ │ └── rum │ │ └── integration │ │ └── tests │ │ └── utils │ │ └── RumBatchEvent.kt │ └── trace │ └── src │ └── main │ └── AndroidManifest.xml ├── features ├── dd-sdk-android-trace-otel │ ├── README.md │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── datadog │ │ │ └── opentelemetry │ │ │ └── compat │ │ │ └── function │ │ │ └── Function.java │ ├── .gitignore │ ├── consumer-rules.pro │ └── transitiveDependencies ├── dd-sdk-android-logs │ ├── src │ │ └── test │ │ │ └── resources │ │ │ └── mockito-extensions │ │ │ └── org.mockito.plugins.MockMaker │ ├── .gitignore │ ├── README.md │ └── transitiveDependencies ├── dd-sdk-android-rum │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ ├── rum │ │ │ ├── internal │ │ │ │ ├── vitals │ │ │ │ │ ├── VitalReader.kt │ │ │ │ │ ├── VitalObserver.kt │ │ │ │ │ ├── VitalListener.kt │ │ │ │ │ ├── FrameStateListener.kt │ │ │ │ │ ├── FrameMetricsDataListener.kt │ │ │ │ │ └── VitalInfo.kt │ │ │ │ ├── startup │ │ │ │ │ └── RumTTIDInfo.kt │ │ │ │ ├── anr │ │ │ │ │ └── ANRException.kt │ │ │ │ ├── domain │ │ │ │ │ ├── InfoProvider.kt │ │ │ │ │ ├── battery │ │ │ │ │ │ └── SystemClockWrapper.kt │ │ │ │ │ ├── accessibility │ │ │ │ │ │ └── AccessibilitySnapshotManager.kt │ │ │ │ │ └── scope │ │ │ │ │ │ └── RumViewChangedListener.kt │ │ │ │ ├── metric │ │ │ │ │ ├── networksettled │ │ │ │ │ │ └── InternalResourceContext.kt │ │ │ │ │ └── interactiontonextview │ │ │ │ │ │ └── InteractionIngestionValidator.kt │ │ │ │ └── utils │ │ │ │ │ ├── NumberExt.kt │ │ │ │ │ └── RuntimeUtils.kt │ │ │ └── tracking │ │ │ │ └── ViewTrackingStrategy.kt │ │ │ └── telemetry │ │ │ └── internal │ │ │ └── TelemetryType.kt │ ├── .gitignore │ ├── README.md │ └── consumer-rules.pro ├── dd-sdk-android-session-replay │ ├── src │ │ ├── test │ │ │ ├── resources │ │ │ │ └── mockito-extensions │ │ │ │ │ └── org.mockito.plugins.MockMaker │ │ │ └── kotlin │ │ │ │ └── com │ │ │ │ └── datadog │ │ │ │ └── android │ │ │ │ └── sessionreplay │ │ │ │ └── recorder │ │ │ │ └── mapper │ │ │ │ ├── BaseWireframeMapperTest.kt │ │ │ │ └── BaseAsyncBackgroundWireframeMapperTest.kt │ │ └── main │ │ │ ├── json │ │ │ └── schemas │ │ │ │ ├── session-replay-mobile-schema.json │ │ │ │ └── session-replay │ │ │ │ └── common │ │ │ │ └── _common-record-schema.json │ │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── datadog │ │ │ │ └── android │ │ │ │ └── sessionreplay │ │ │ │ ├── PrivacyLevel.kt │ │ │ │ └── internal │ │ │ │ ├── utils │ │ │ │ ├── DrawableDimensions.kt │ │ │ │ └── DrawableExt.kt │ │ │ │ ├── exception │ │ │ │ └── InvalidPayloadFormatException.kt │ │ │ │ ├── recorder │ │ │ │ ├── resources │ │ │ │ │ ├── HashGenerator.kt │ │ │ │ │ ├── ResourceResolverCallback.kt │ │ │ │ │ └── ResolveResourceCallback.kt │ │ │ │ ├── TraversalStrategy.kt │ │ │ │ ├── obfuscator │ │ │ │ │ └── NoOpStringObfuscator.kt │ │ │ │ └── callback │ │ │ │ │ └── OnWindowRefreshedCallback.kt │ │ │ │ ├── processor │ │ │ │ └── WireframeBounds.kt │ │ │ │ └── storage │ │ │ │ └── NoOpRecordWriter.kt │ │ │ └── res │ │ │ └── values │ │ │ └── ids.xml │ ├── README.md │ └── .gitignore ├── dd-sdk-android-trace │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ └── trace │ │ │ └── internal │ │ │ ├── domain │ │ │ └── event │ │ │ │ ├── Mapper.kt │ │ │ │ ├── MetaKeys.kt │ │ │ │ └── ContextAwareMapper.kt │ │ │ └── DatadogSpanWriterWrapper.kt │ ├── .gitignore │ ├── README.md │ ├── consumer-rules.pro │ └── transitiveDependencies ├── dd-sdk-android-webview │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ └── webview │ │ │ └── internal │ │ │ └── WebViewEventConsumer.kt │ ├── .gitignore │ ├── README.md │ ├── api │ │ └── apiSurface │ └── transitiveDependencies ├── dd-sdk-android-session-replay-material │ ├── src │ │ └── test │ │ │ └── resources │ │ │ └── mockito-extensions │ │ │ └── org.mockito.plugins.MockMaker │ ├── consumer-rules.pro │ ├── .gitignore │ ├── README.md │ └── api │ │ ├── dd-sdk-android-session-replay-material.api │ │ └── apiSurface ├── dd-sdk-android-ndk │ ├── api │ │ ├── apiSurface │ │ └── dd-sdk-android-ndk.api │ ├── CMakeLists.txt │ ├── src │ │ ├── test │ │ │ └── cpp │ │ │ │ ├── test-utils.h │ │ │ │ └── test-datetime-utils.cpp │ │ └── main │ │ │ └── cpp │ │ │ └── utils │ │ │ ├── file-utils.h │ │ │ └── datetime-utils.h │ └── transitiveDependencies ├── dd-sdk-android-trace-internal │ ├── src │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── datadog │ │ │ │ └── trace │ │ │ │ ├── api │ │ │ │ ├── profiling │ │ │ │ │ ├── ObservableType.java │ │ │ │ │ ├── TransientProfilingContextHolder.java │ │ │ │ │ ├── ProfilingSnapshot.java │ │ │ │ │ ├── QueueTiming.java │ │ │ │ │ ├── ProfilingScope.java │ │ │ │ │ ├── ProfilingContextAttribute.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── RecordingType.java │ │ │ │ │ ├── Timer.java │ │ │ │ │ └── Timing.java │ │ │ │ ├── gateway │ │ │ │ │ ├── RequestContextSlot.java │ │ │ │ │ └── IGSpanInfo.java │ │ │ │ ├── normalize │ │ │ │ │ └── HttpPathNormalizer.java │ │ │ │ ├── Stateful.java │ │ │ │ ├── scopemanager │ │ │ │ │ ├── ExtendedScopeListener.java │ │ │ │ │ └── ScopeListener.java │ │ │ │ ├── EndpointTracker.java │ │ │ │ ├── naming │ │ │ │ │ ├── v1 │ │ │ │ │ │ ├── CacheNamingV1.java │ │ │ │ │ │ └── ServerNamingV1.java │ │ │ │ │ └── v0 │ │ │ │ │ │ └── PeerServiceNamingV0.java │ │ │ │ ├── metrics │ │ │ │ │ ├── SpanMetrics.java │ │ │ │ │ └── CoreCounter.java │ │ │ │ └── ConfigOrigin.java │ │ │ │ ├── bootstrap │ │ │ │ ├── instrumentation │ │ │ │ │ └── api │ │ │ │ │ │ ├── InboxItem.java │ │ │ │ │ │ ├── AgentTrace.java │ │ │ │ │ │ ├── SamplerConstants.java │ │ │ │ │ │ ├── ErrorPriorities.java │ │ │ │ │ │ ├── ScopeSource.java │ │ │ │ │ │ ├── ProfilerContext.java │ │ │ │ │ │ └── AttachableWrapper.java │ │ │ │ └── ActiveSubsystems.java │ │ │ │ ├── common │ │ │ │ ├── sampling │ │ │ │ │ ├── RateSampler.java │ │ │ │ │ ├── PrioritySampler.java │ │ │ │ │ └── AllSampler.java │ │ │ │ ├── writer │ │ │ │ │ └── RemoteResponseListener.java │ │ │ │ └── metrics │ │ │ │ │ └── MetricsAggregator.java │ │ │ │ └── core │ │ │ │ ├── util │ │ │ │ └── Matcher.java │ │ │ │ ├── MetadataConsumer.java │ │ │ │ └── tagprocessor │ │ │ │ └── TagsPostProcessor.java │ │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ └── trace │ │ │ └── internal │ │ │ └── compat │ │ │ └── function │ │ │ ├── Consumer.kt │ │ │ ├── Supplier.kt │ │ │ ├── Function.kt │ │ │ ├── BiConsumer.kt │ │ │ ├── IntFunction.kt │ │ │ ├── BiFunction.kt │ │ │ └── IntPredicate.kt │ ├── .gitignore │ ├── api │ │ └── apiSurface │ └── transitiveDependencies ├── dd-sdk-android-flags │ ├── .gitignore │ └── src │ │ └── main │ │ └── kotlin │ │ └── com │ │ └── datadog │ │ └── android │ │ └── flags │ │ └── internal │ │ ├── storage │ │ └── NoOpRecordWriter.kt │ │ └── model │ │ └── FlagsStateEntry.kt ├── dd-sdk-android-trace-api │ ├── .gitignore │ ├── src │ │ └── main │ │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ └── trace │ │ │ └── api │ │ │ └── span │ │ │ └── DatadogSpanWriter.kt │ └── transitiveDependencies └── dd-sdk-android-session-replay-compose │ ├── README.md │ └── src │ └── main │ └── kotlin │ └── com │ └── datadog │ └── android │ └── sessionreplay │ └── compose │ └── internal │ └── data │ ├── ComposeWireframe.kt │ └── SemanticsWireframe.kt ├── dd-sdk-android-core ├── src │ ├── test │ │ ├── resources │ │ │ ├── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ │ └── logs-batch-2.2.0-and-earlier │ │ └── kotlin │ │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ └── utils │ │ │ ├── forge │ │ │ └── CustomAttributes.kt │ │ │ ├── CharExt.kt │ │ │ └── extension │ │ │ └── JsonObjectExt.kt │ └── main │ │ ├── kotlin │ │ └── com │ │ │ └── datadog │ │ │ └── android │ │ │ ├── core │ │ │ ├── internal │ │ │ │ ├── data │ │ │ │ │ └── upload │ │ │ │ │ │ ├── UploadRunnable.kt │ │ │ │ │ │ ├── UploadScheduler.kt │ │ │ │ │ │ └── Flusher.kt │ │ │ │ ├── constraints │ │ │ │ │ └── StringTransform.kt │ │ │ │ ├── HashGenerator.kt │ │ │ │ ├── persistence │ │ │ │ │ ├── BatchWriteEventListener.kt │ │ │ │ │ ├── Batch.kt │ │ │ │ │ └── BatchConfirmation.kt │ │ │ │ ├── system │ │ │ │ │ ├── AppVersionProvider.kt │ │ │ │ │ └── NoOpAppVersionProvider.kt │ │ │ │ ├── metrics │ │ │ │ │ └── BatchClosedMetadata.kt │ │ │ │ ├── utils │ │ │ │ │ └── RuntimeUtils.kt │ │ │ │ ├── user │ │ │ │ │ └── UserInfoProvider.kt │ │ │ │ ├── FeatureContextProvider.kt │ │ │ │ └── account │ │ │ │ │ └── AccountInfoProvider.kt │ │ │ └── metrics │ │ │ │ └── TelemetryMetricType.kt │ │ │ ├── api │ │ │ └── context │ │ │ │ └── ProcessInfo.kt │ │ │ └── ndk │ │ │ └── internal │ │ │ └── NdkCrashHandler.kt │ │ └── AndroidManifest.xml └── .gitignore ├── docs └── images │ ├── screenshot_apm.png │ ├── screenshot_rum.png │ └── screenshot_logs.png ├── integrations ├── dd-sdk-android-coil │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ ├── api │ │ ├── apiSurface │ │ └── dd-sdk-android-coil.api │ └── .gitignore ├── dd-sdk-android-glide │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ └── .gitignore ├── dd-sdk-android-rx │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ └── .gitignore ├── dd-sdk-android-timber │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ ├── .gitignore │ ├── api │ │ ├── apiSurface │ │ └── dd-sdk-android-timber.api │ └── transitiveDependencies ├── dd-sdk-android-tv │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ ├── .gitignore │ └── api │ │ └── apiSurface ├── dd-sdk-android-compose │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── datadog │ │ │ │ └── android │ │ │ │ └── compose │ │ │ │ └── ComposeInstrumentation.kt │ │ │ └── AndroidManifest.xml │ ├── .gitignore │ └── consumer-rules.pro ├── dd-sdk-android-fresco │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ └── .gitignore ├── dd-sdk-android-okhttp │ ├── src │ │ └── test │ │ │ └── resources │ │ │ └── mockito-extensions │ │ │ └── org.mockito.plugins.MockMaker │ ├── .gitignore │ └── README.md ├── dd-sdk-android-sqldelight │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ └── main │ │ │ └── AndroidManifest.xml │ └── .gitignore ├── dd-sdk-android-okhttp-otel │ ├── src │ │ └── test │ │ │ └── resources │ │ │ └── mockito-extensions │ │ │ └── org.mockito.plugins.MockMaker │ ├── api │ │ ├── apiSurface │ │ └── dd-sdk-android-okhttp-otel.api │ ├── .gitignore │ └── README.md ├── dd-sdk-android-apollo │ ├── src │ │ └── main │ │ │ └── AndroidManifest.xml │ ├── .gitignore │ └── api │ │ └── apiSurface ├── dd-sdk-android-cronet │ ├── .gitignore │ └── transitiveDependencies ├── dd-sdk-android-rum-coroutines │ ├── api │ │ └── apiSurface │ ├── .gitignore │ └── transitiveDependencies └── dd-sdk-android-trace-coroutines │ ├── .gitignore │ ├── transitiveDependencies │ └── src │ └── main │ └── kotlin │ └── com │ └── datadog │ └── android │ └── trace │ └── coroutines │ └── CoroutineScopeSpan.kt ├── .idea └── copyright │ ├── profiles_settings.xml │ └── Datadog.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── NOTICE ├── instrumented └── integration │ └── src │ ├── main │ └── res │ │ ├── drawable │ │ ├── ic_dd_icon_rgb.png │ │ ├── ic_dd_shape_oval.xml │ │ ├── ic_dd_shape_rect.xml │ │ └── ic_dd_statelist.xml │ │ └── values │ │ └── dimens.xml │ └── androidTest │ └── AndroidManifest.xml ├── consumer-rules.pro ├── .github ├── chainguard │ └── self.gitlab.read.sts.yaml ├── CODEOWNERS ├── ISSUE_TEMPLATE │ └── Question.yml └── PULL_REQUEST_TEMPLATE.md ├── .codecov.yml ├── .gitignore └── gradle.properties /sample/tv/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /sample/wear/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /sample/benchmark/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /tools/benchmark/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /dd-sdk-android-internal/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /sample/automotive/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /tools/javabackport/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /reliability/core-it/src/main/assets/datadog.buildId: -------------------------------------------------------------------------------- 1 | core_it_build_id -------------------------------------------------------------------------------- /features/dd-sdk-android-trace-otel/README.md: -------------------------------------------------------------------------------- 1 | # Tracing SDK for Android with OpenTelemetry support -------------------------------------------------------------------------------- /dd-sdk-android-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /docs/images/screenshot_apm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/docs/images/screenshot_apm.png -------------------------------------------------------------------------------- /docs/images/screenshot_rum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/docs/images/screenshot_rum.png -------------------------------------------------------------------------------- /features/dd-sdk-android-logs/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /features/dd-sdk-android-rum/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /docs/images/screenshot_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/docs/images/screenshot_logs.png -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline -------------------------------------------------------------------------------- /features/dd-sdk-android-trace/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /features/dd-sdk-android-webview/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-coil/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-glide/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-rx/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-timber/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline -------------------------------------------------------------------------------- /integrations/dd-sdk-android-tv/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /features/dd-sdk-android-trace-otel/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /integrations/dd-sdk-android-compose/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-fresco/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-okhttp/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-sqldelight/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay-material/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline -------------------------------------------------------------------------------- /integrations/dd-sdk-android-okhttp-otel/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /sample/automotive/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Auto Sample 3 | 4 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-apollo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Datadog dd-sdk-android 2 | Copyright 2019 Datadog, Inc. 3 | 4 | This product includes software developed at Datadog (https://www.datadoghq.com/). -------------------------------------------------------------------------------- /integrations/dd-sdk-android-okhttp-otel/api/apiSurface: -------------------------------------------------------------------------------- 1 | fun okhttp3.Request.Builder.addParentSpan(io.opentelemetry.api.trace.Span): okhttp3.Request.Builder 2 | -------------------------------------------------------------------------------- /sample/tv/src/main/res/drawable-xhdpi/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/drawable-xhdpi/banner.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /integrations/dd-sdk-android-cronet/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | *.iml 3 | .gradle 4 | local.properties 5 | /.idea 6 | .DS_Store 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /features/dd-sdk-android-ndk/api/apiSurface: -------------------------------------------------------------------------------- 1 | object com.datadog.android.ndk.NdkCrashReports 2 | fun enable(com.datadog.android.api.SdkCore = Datadog.getInstance()) 3 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/drawable/ic_dd_icon_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/drawable/ic_dd_icon_rgb.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/xml/automotive_app_desc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/wear/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/wear/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/wear/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/wear/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/wear/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/wear/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/wear/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/wear/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/benchmark/src/main/res/drawable/ic_dd_icon_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/benchmark/src/main/res/drawable/ic_dd_icon_rgb.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/kotlin/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /sample/tv/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/tv/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /sample/wear/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/wear/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/automotive/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/automotive/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/automotive/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/automotive/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/automotive/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDog/dd-sdk-android/HEAD/sample/automotive/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/automotive/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/drawable/baseline_arrow_drop_down_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/drawable/outline_edit_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 16dp 10 | 16dp 11 | 32dp 12 | 8dp 13 | 14 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### What does this PR do? 2 | 3 | A brief description of the change being made with this pull request. 4 | 5 | ### Motivation 6 | 7 | What inspired you to submit this pull request? 8 | 9 | ### Additional Notes 10 | 11 | Anything else we should know when reviewing? 12 | 13 | ### Review checklist (to be filled by reviewers) 14 | 15 | - [ ] Feature or bugfix MUST have appropriate tests (unit, integration, e2e) 16 | - [ ] Make sure you discussed the feature or bugfix with the maintaining team in an Issue 17 | - [ ] Make sure each commit and the PR mention the Issue number (cf the [CONTRIBUTING](../CONTRIBUTING.md) doc) 18 | 19 | -------------------------------------------------------------------------------- /dd-sdk-android-internal/src/main/java/com/datadog/android/internal/flags/RumFlagEvaluationMessage.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.internal.flags 8 | 9 | /** 10 | * Event for sending a RUM evaluation. 11 | * @param flagKey name of the flag. 12 | * @param value value of the flag. 13 | */ 14 | data class RumFlagEvaluationMessage( 15 | val flagKey: String, 16 | val value: Any 17 | ) 18 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/processor/WireframeBounds.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.internal.processor 8 | 9 | internal data class WireframeBounds( 10 | val left: Long, 11 | val right: Long, 12 | val top: Long, 13 | val bottom: Long, 14 | val width: Long, 15 | val height: Long 16 | ) 17 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/obfuscator/NoOpStringObfuscator.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.internal.recorder.obfuscator 8 | 9 | internal class NoOpStringObfuscator : StringObfuscator { 10 | override fun obfuscate(stringValue: String): String { 11 | return stringValue 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/test/kotlin/com/datadog/android/sessionreplay/recorder/mapper/BaseAsyncBackgroundWireframeMapperTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.recorder.mapper 8 | 9 | import android.view.View 10 | 11 | internal abstract class BaseAsyncBackgroundWireframeMapperTest> : 12 | BaseWireframeMapperTest() 13 | -------------------------------------------------------------------------------- /instrumented/integration/src/main/res/drawable/ic_dd_statelist.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-coil/api/dd-sdk-android-coil.api: -------------------------------------------------------------------------------- 1 | public final class com/datadog/android/coil/DatadogCoilRequestListener : coil/request/ImageRequest$Listener { 2 | public fun ()V 3 | public fun (Lcom/datadog/android/api/SdkCore;)V 4 | public synthetic fun (Lcom/datadog/android/api/SdkCore;ILkotlin/jvm/internal/DefaultConstructorMarker;)V 5 | public fun onCancel (Lcoil/request/ImageRequest;)V 6 | public fun onError (Lcoil/request/ImageRequest;Ljava/lang/Throwable;)V 7 | public fun onStart (Lcoil/request/ImageRequest;)V 8 | public fun onSuccess (Lcoil/request/ImageRequest;Lcoil/request/ImageResult$Metadata;)V 9 | } 10 | 11 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/FeatureContextProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.core.internal 8 | 9 | internal fun interface FeatureContextProvider { 10 | /** 11 | * Returns **frozen** snapshot of the feature context which is not mutated over the time. 12 | */ 13 | fun getFeatureContext(featureName: String): Map 14 | } 15 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/data/upload/Flusher.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.core.internal.data.upload 8 | 9 | import androidx.annotation.WorkerThread 10 | import com.datadog.tools.annotation.NoOpImplementation 11 | 12 | @NoOpImplementation 13 | internal interface Flusher { 14 | 15 | @WorkerThread 16 | fun flush(uploader: DataUploader) 17 | } 18 | -------------------------------------------------------------------------------- /features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/AccessibilitySnapshotManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.rum.internal.domain.accessibility 8 | 9 | import com.datadog.tools.annotation.NoOpImplementation 10 | 11 | @NoOpImplementation 12 | internal interface AccessibilitySnapshotManager { 13 | fun getIfChanged(): AccessibilityInfo? 14 | } 15 | -------------------------------------------------------------------------------- /features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/api/naming/v0/PeerServiceNamingV0.java: -------------------------------------------------------------------------------- 1 | package com.datadog.trace.api.naming.v0; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.datadog.trace.api.naming.NamingSchema; 6 | 7 | import java.util.Collections; 8 | import java.util.Map; 9 | 10 | public class PeerServiceNamingV0 implements NamingSchema.ForPeerService { 11 | @Override 12 | public boolean supports() { 13 | return false; 14 | } 15 | 16 | @NonNull 17 | @Override 18 | public Map tags(@NonNull final Map unsafeTags) { 19 | return Collections.emptyMap(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sample/benchmark/src/main/java/com/datadog/benchmark/sample/BenchmarkConfigHolder.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.benchmark.sample 8 | 9 | import com.datadog.benchmark.sample.config.BenchmarkConfig 10 | import javax.inject.Inject 11 | import javax.inject.Singleton 12 | 13 | @Singleton 14 | internal class BenchmarkConfigHolder @Inject constructor() { 15 | lateinit var config: BenchmarkConfig 16 | } 17 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/layout/fragment_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/account/AccountInfoProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.core.internal.account 8 | 9 | import com.datadog.android.api.context.AccountInfo 10 | import com.datadog.tools.annotation.NoOpImplementation 11 | 12 | @NoOpImplementation 13 | internal interface AccountInfoProvider { 14 | 15 | fun getAccountInfo(): AccountInfo? 16 | } 17 | -------------------------------------------------------------------------------- /features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/utils/RuntimeUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.rum.internal.utils 8 | 9 | import com.datadog.android.api.context.UserInfo 10 | 11 | internal fun UserInfo.hasUserData(): Boolean { 12 | return id != null || anonymousId != null || name != null || 13 | email != null || additionalProperties.isNotEmpty() 14 | } 15 | -------------------------------------------------------------------------------- /features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/api/ConfigOrigin.java: -------------------------------------------------------------------------------- 1 | package com.datadog.trace.api; 2 | 3 | public enum ConfigOrigin { 4 | /** configurations that are set through environment variables */ 5 | ENV("env_var"), 6 | /** values that are set using remote config */ 7 | REMOTE("remote_config"), 8 | /** configurations that are set through JVM properties */ 9 | JVM_PROP("jvm_prop"), 10 | /** set when the user has not set any configuration for the key (defaults to a value) */ 11 | DEFAULT("default"); 12 | 13 | public final String value; 14 | 15 | ConfigOrigin(String value) { 16 | this.value = value; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tools/benchmark/src/main/java/com/datadog/benchmark/internal/model/BenchmarkContext.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.benchmark.internal.model 8 | 9 | internal data class BenchmarkContext( 10 | val deviceModel: String, 11 | val osVersion: String, 12 | val run: String, 13 | val scenario: String?, 14 | val applicationId: String, 15 | val intervalInSeconds: Long, 16 | val env: String 17 | ) 18 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/data/ComposeWireframe.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.compose.internal.data 8 | 9 | import com.datadog.android.sessionreplay.model.MobileSegment 10 | 11 | internal data class ComposeWireframe( 12 | val wireframe: MobileSegment.Wireframe, 13 | val uiContext: UiContext? 14 | ) 15 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/system/NoOpAppVersionProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.core.internal.system 8 | 9 | internal class NoOpAppVersionProvider : AppVersionProvider { 10 | @Suppress("UNUSED_PARAMETER") 11 | override var version: String 12 | get() = "" 13 | set(value) {} 14 | override val versionCode: Int 15 | get() = 0 16 | } 17 | -------------------------------------------------------------------------------- /dd-sdk-android-core/src/main/kotlin/com/datadog/android/ndk/internal/NdkCrashHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.ndk.internal 8 | 9 | import com.datadog.android.api.feature.FeatureSdkCore 10 | import com.datadog.tools.annotation.NoOpImplementation 11 | 12 | @NoOpImplementation 13 | internal interface NdkCrashHandler { 14 | 15 | fun prepareData() 16 | 17 | fun handleNdkCrash(sdkCore: FeatureSdkCore) 18 | } 19 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay-compose/src/main/kotlin/com/datadog/android/sessionreplay/compose/internal/data/SemanticsWireframe.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.compose.internal.data 8 | 9 | import com.datadog.android.sessionreplay.model.MobileSegment 10 | 11 | internal data class SemanticsWireframe( 12 | val wireframes: List, 13 | val uiContext: UiContext? 14 | ) 15 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/storage/NoOpRecordWriter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.internal.storage 8 | 9 | import com.datadog.android.sessionreplay.internal.processor.EnrichedRecord 10 | 11 | internal class NoOpRecordWriter : RecordWriter { 12 | override fun write(record: EnrichedRecord) { 13 | // no-op 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | # This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | # Copyright 2016-Present Datadog, Inc. 5 | # 6 | org.gradle.jvmargs=-Xmx4096m 7 | android.useAndroidX=true 8 | android.experimental.enableTestFixturesKotlinSupport=true 9 | org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled 10 | org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true 11 | 12 | # Allows Kotlin with target JVM compat 17 to be built on JDK 21 13 | kotlin.jvm.target.validation.mode = IGNORE 14 | # Leave the next line blank for CI 15 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/drawable/baseline_text_fields_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tools/benchmark/src/main/java/com/datadog/benchmark/DatadogBaseMeter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.benchmark 8 | 9 | /** 10 | * Interface to be used for Datadog SDK meters. 11 | */ 12 | interface DatadogBaseMeter { 13 | 14 | /** 15 | * Starts the Datadog SDK meter. 16 | */ 17 | fun startMeasuring() 18 | 19 | /** 20 | * Stops the Datadog SDK meter. 21 | */ 22 | fun stopMeasuring() 23 | } 24 | -------------------------------------------------------------------------------- /features/dd-sdk-android-session-replay/src/main/kotlin/com/datadog/android/sessionreplay/internal/recorder/callback/OnWindowRefreshedCallback.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.sessionreplay.internal.recorder.callback 8 | 9 | import android.view.Window 10 | 11 | internal interface OnWindowRefreshedCallback { 12 | 13 | fun onWindowsAdded(windows: List) 14 | 15 | fun onWindowsRemoved(windows: List) 16 | } 17 | -------------------------------------------------------------------------------- /features/dd-sdk-android-ndk/transitiveDependencies: -------------------------------------------------------------------------------- 1 | Dependencies List 2 | 3 | androidx.multidex:multidex:2.0.1 : 26 Kb 4 | com.squareup.okhttp3:okhttp:4.12.0 : 771 Kb 5 | com.squareup.okio:okio-jvm:3.6.0 : 351 Kb 6 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10 : 959 b 7 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 : 965 b 8 | org.jetbrains.kotlin:kotlin-stdlib:2.0.21 : 1706 Kb 9 | org.jetbrains:annotations:13.0 : 17 Kb 10 | 11 | Total transitive dependencies size : 2 Mb 12 | 13 | -------------------------------------------------------------------------------- /features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumViewChangedListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.rum.internal.domain.scope 8 | 9 | internal data class RumViewInfo( 10 | val key: RumScopeKey, 11 | val attributes: Map, 12 | val isActive: Boolean 13 | ) 14 | 15 | internal interface RumViewChangedListener { 16 | fun onViewChanged(viewInfo: RumViewInfo) 17 | } 18 | -------------------------------------------------------------------------------- /integrations/dd-sdk-android-trace-coroutines/src/main/kotlin/com/datadog/android/trace/coroutines/CoroutineScopeSpan.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.trace.coroutines 8 | 9 | import com.datadog.android.trace.api.span.DatadogSpan 10 | import kotlinx.coroutines.CoroutineScope 11 | 12 | /** 13 | * An object that implements both [DatadogSpan] and [CoroutineScope]. 14 | */ 15 | interface CoroutineScopeSpan : CoroutineScope, DatadogSpan 16 | -------------------------------------------------------------------------------- /sample/automotive/src/main/java/com/datadog/sample/automotive/SharedLogger.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.sample.automotive 8 | 9 | import com.datadog.android.log.Logger 10 | 11 | @Suppress("UndocumentedPublicClass") 12 | object SharedLogger { 13 | @Suppress("UndocumentedPublicProperty") 14 | val logger by lazy { 15 | Logger.Builder() 16 | .setLogcatLogsEnabled(true) 17 | .build() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sample/benchmark/src/main/java/com/datadog/benchmark/sample/ui/sessionreplay/SessionReplayNavigationManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.benchmark.sample.ui.sessionreplay 8 | 9 | import androidx.navigation.NavController 10 | 11 | internal interface SessionReplayNavigationManager { 12 | fun setNavController(navController: NavController) 13 | fun navigateToSessionReplayMaterial() 14 | fun navigateToSessionReplayAppCompat() 15 | } 16 | -------------------------------------------------------------------------------- /sample/kotlin/src/main/res/drawable/ic_traces_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tools/unit/src/main/kotlin/com/datadog/tools/unit/annotations/TestConfigurationsProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.tools.unit.annotations 8 | 9 | import com.datadog.tools.unit.extensions.config.TestConfiguration 10 | 11 | /** 12 | * Annotates a static method as provider for [TestConfiguration]. 13 | */ 14 | @Target(AnnotationTarget.FUNCTION) 15 | @Retention(AnnotationRetention.RUNTIME) 16 | annotation class TestConfigurationsProvider 17 | -------------------------------------------------------------------------------- /features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/model/FlagsStateEntry.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.flags.internal.model 8 | 9 | import com.datadog.android.flags.model.EvaluationContext 10 | 11 | internal data class FlagsStateEntry( 12 | val evaluationContext: EvaluationContext, 13 | val flags: Map, 14 | val lastUpdateTimestamp: Long = System.currentTimeMillis() 15 | ) 16 | -------------------------------------------------------------------------------- /features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/vitals/VitalInfo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. 3 | * This product includes software developed at Datadog (https://www.datadoghq.com/). 4 | * Copyright 2016-Present Datadog, Inc. 5 | */ 6 | 7 | package com.datadog.android.rum.internal.vitals 8 | 9 | internal data class VitalInfo( 10 | val sampleCount: Int, 11 | val minValue: Double, 12 | val maxValue: Double, 13 | val meanValue: Double 14 | ) { 15 | companion object { 16 | val EMPTY = VitalInfo(0, Double.MAX_VALUE, -Double.MAX_VALUE, 0.0) 17 | } 18 | } 19 | --------------------------------------------------------------------------------