Skip to content

Commit f583493

Browse files
authored
Merge pull request #2724 from DataDog/xgouchet/automotive
Add Android Automotive sample
2 parents 221bc2e + 5b82786 commit f583493

33 files changed

+680
-1
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ tasks.register("assembleSampleRelease") {
9595
":sample:kotlin:assembleUs1Release",
9696
":sample:wear:assembleUs1Release",
9797
":sample:vendor-lib:assembleRelease",
98+
":sample:automotive:assembleRelease",
9899
":sample:tv:assembleRelease"
99100
)
100101
}

buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ object AndroidConfig {
1818
const val TARGET_SDK = 36
1919
const val MIN_SDK = 21
2020
const val MIN_SDK_FOR_WEAR_AND_TV = 23
21+
const val MIN_SDK_FOR_AUTO = 29
2122
const val BUILD_TOOLS_VERSION = "36.0.0"
2223

2324
val VERSION = Version(2, 23, 0, Version.Type.Snapshot)

buildSrc/src/main/kotlin/com/datadog/gradle/config/FlavorBuildConfig.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,20 @@ fun ApplicationDefaultConfig.configureFlavorForTvApp(
122122
"\"${config.token}\""
123123
)
124124
}
125+
126+
@Suppress("UnstableApiUsage")
127+
fun ApplicationDefaultConfig.configureFlavorForAutoApp(
128+
rootDir: File
129+
) {
130+
val config = sampleAppConfig("${rootDir.absolutePath}/config/auto.json")
131+
buildConfigField(
132+
"String",
133+
"DD_RUM_APPLICATION_ID",
134+
"\"${config.rumApplicationId}\""
135+
)
136+
buildConfigField(
137+
"String",
138+
"DD_CLIENT_TOKEN",
139+
"\"${config.token}\""
140+
)
141+
}

gradle/libs.versions.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ androidDesugaringSdk = "2.0.4"
1313
androidToolsPlugin = "8.9.1"
1414
androidXAnnotations = "1.9.1"
1515
androidXAppCompat = "1.4.2" # Next version will bring coroutines
16+
androidXCar = "1.4.0"
1617
androidXCollection = "1.4.5"
1718
androidXComposeBom = "2023.10.01" # Next version will bring coroutines
1819
androidXComposeCompilerExtension = "1.5.14"
@@ -23,6 +24,7 @@ androidXCore = "1.3.1"
2324
androidXFragment = "1.2.4"
2425
androidXLeanback = "1.0.0"
2526
androidXLifecycle = "2.8.7"
27+
androidXLegacy = "1.0.0"
2628
androidXMetrics = "1.0.0-beta02"
2729
androidXMultidex = "2.0.1"
2830
androidXNavigation = "2.7.7"
@@ -106,7 +108,6 @@ openTelemetryBenchmark = "1.40.0"
106108
re2j = "1.7"
107109
material3Android = "1.1.2"
108110

109-
110111
[libraries]
111112

112113
# Classpaths
@@ -141,6 +142,9 @@ adapterDelegatesViewBinding = { module = "com.hannesdorfmann:adapterdelegates4-k
141142
androidDesugaringSdk = { module = "com.android.tools:desugar_jdk_libs", version.ref = "androidDesugaringSdk" }
142143
androidXAnnotation = { module = "androidx.annotation:annotation", version.ref = "androidXAnnotations" }
143144
androidXAppCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidXAppCompat" }
145+
androidXCarApp = { module = "androidx.car.app:app", version.ref = "androidXCar" }
146+
androidXCarAutomotive = { module = "androidx.car.app:app-automotive", version.ref = "androidXCar" }
147+
androidXCarProjected = { module = "androidx.car.app:app-projected", version.ref = "androidXCar" }
144148
androidXCollection = { module = "androidx.collection:collection", version.ref = "androidXCollection" }
145149
androidXConstraintLayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidXConstraintLayout" }
146150
androidXCore = { module = "androidx.core:core", version.ref = "androidXCore" }
@@ -157,6 +161,8 @@ androidXWorkManager = { module = "androidx.work:work-runtime", version.ref = "an
157161
androidXLifecycleCompose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidXLifecycle" }
158162
androidXLifecycleLiveDataKtx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidXLifecycle" }
159163
androidXLifecycleViewModelKtx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidXLifecycle" }
164+
androidXLegacySupportV4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "androidXLegacy" }
165+
androidXLegacySupportV13 = { group = "androidx.legacy", name = "legacy-support-v13", version.ref = "androidXLegacy" }
160166
daggerLib = { module = "com.google.dagger:dagger", version.ref = "dagger" }
161167
daggerCompiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
162168
googleAccompanistAppCompatTheme = { module = "com.google.accompanist:accompanist-appcompat-theme", version.ref = "googleAccompanist" }

sample/automotive/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

sample/automotive/build.gradle.kts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import com.datadog.gradle.config.AndroidConfig
2+
import com.datadog.gradle.config.configureFlavorForAutoApp
3+
import com.datadog.gradle.config.dependencyUpdateConfig
4+
import com.datadog.gradle.config.java17
5+
import com.datadog.gradle.config.junitConfig
6+
import com.datadog.gradle.config.kotlinConfig
7+
import com.datadog.gradle.config.taskConfig
8+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
9+
10+
plugins {
11+
id("com.android.application")
12+
kotlin("android")
13+
id("com.github.ben-manes.versions")
14+
alias(libs.plugins.datadogGradlePlugin)
15+
}
16+
17+
android {
18+
compileSdk = AndroidConfig.TARGET_SDK
19+
buildToolsVersion = AndroidConfig.BUILD_TOOLS_VERSION
20+
21+
defaultConfig {
22+
minSdk = AndroidConfig.MIN_SDK_FOR_AUTO
23+
targetSdk = AndroidConfig.TARGET_SDK
24+
versionCode = AndroidConfig.VERSION.code
25+
versionName = AndroidConfig.VERSION.name
26+
multiDexEnabled = true
27+
28+
buildFeatures {
29+
buildConfig = true
30+
}
31+
32+
configureFlavorForAutoApp(project.rootDir)
33+
}
34+
35+
namespace = "com.datadog.sample.automotive"
36+
37+
compileOptions {
38+
java17()
39+
}
40+
41+
testOptions {
42+
unitTests.isReturnDefaultValues = true
43+
}
44+
45+
buildTypes {
46+
getByName("debug") {
47+
isMinifyEnabled = false
48+
}
49+
50+
getByName("release") {
51+
proguardFiles(
52+
getDefaultProguardFile("proguard-android-optimize.txt"),
53+
"proguard-rules.pro"
54+
)
55+
isMinifyEnabled = false
56+
}
57+
}
58+
}
59+
60+
dependencies {
61+
// Datadog Libraries
62+
implementation(project(":features:dd-sdk-android-logs"))
63+
implementation(project(":features:dd-sdk-android-rum"))
64+
65+
implementation(libs.kotlin)
66+
67+
// Android dependencies
68+
implementation(libs.androidXMultidex)
69+
implementation(libs.androidXCoreKtx)
70+
implementation(libs.androidXAppCompat)
71+
implementation(libs.androidXLegacySupportV4)
72+
implementation(libs.androidXLegacySupportV13)
73+
74+
// Android Car
75+
implementation(libs.androidXCarApp)
76+
implementation(libs.androidXCarAutomotive)
77+
}
78+
79+
kotlinConfig(evaluateWarningsAsErrors = false)
80+
taskConfig<KotlinCompile> {
81+
compilerOptions {
82+
freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn")
83+
}
84+
}
85+
junitConfig()
86+
dependencyUpdateConfig()

sample/automotive/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<uses-feature
5+
android:name="android.hardware.type.automotive"
6+
android:required="true" />
7+
8+
<application
9+
android:name=".SampleAutoApplication"
10+
android:allowBackup="true"
11+
android:appCategory="audio"
12+
android:icon="@mipmap/ic_launcher"
13+
android:label="@string/app_name"
14+
android:roundIcon="@mipmap/ic_launcher_round"
15+
android:supportsRtl="true"
16+
android:theme="@style/SampleAuto.Theme">
17+
<meta-data
18+
android:name="com.google.android.gms.car.application"
19+
android:resource="@xml/automotive_app_desc" />
20+
21+
<activity
22+
android:name="androidx.car.app.activity.CarAppActivity"
23+
android:exported="true"
24+
android:launchMode="singleTask"
25+
android:label="Sample Auto">
26+
27+
<intent-filter>
28+
<action android:name="android.intent.action.MAIN" />
29+
<category android:name="android.intent.category.LAUNCHER" />
30+
</intent-filter>
31+
<meta-data android:name="distractionOptimized" android:value="true"/>
32+
</activity>
33+
34+
<service
35+
android:name=".SampleCarAppService"
36+
android:exported="true">
37+
<intent-filter>
38+
<action android:name="androidx.car.app.CarAppService" />
39+
<category android:name="androidx.car.app.category.NAVIGATION"/>
40+
</intent-filter>
41+
</service>
42+
43+
<meta-data
44+
android:name="androidx.car.app.minCarApiLevel"
45+
android:value="1"/>
46+
</application>
47+
48+
</manifest>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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 android.app.Application
10+
import android.util.Log
11+
import com.datadog.android.Datadog
12+
import com.datadog.android.DatadogSite
13+
import com.datadog.android.core.configuration.BatchSize
14+
import com.datadog.android.core.configuration.Configuration
15+
import com.datadog.android.core.configuration.UploadFrequency
16+
import com.datadog.android.log.Logs
17+
import com.datadog.android.log.LogsConfiguration
18+
import com.datadog.android.privacy.TrackingConsent
19+
import com.datadog.android.rum.GlobalRumMonitor
20+
import com.datadog.android.rum.Rum
21+
import com.datadog.android.rum.RumConfiguration
22+
import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy
23+
24+
@Suppress("UndocumentedPublicClass")
25+
class SampleAutoApplication : Application() {
26+
27+
override fun onCreate() {
28+
super.onCreate()
29+
initializeDatadog()
30+
}
31+
32+
private fun initializeDatadog() {
33+
Datadog.setVerbosity(Log.VERBOSE)
34+
Datadog.initialize(
35+
this,
36+
createDatadogConfiguration(),
37+
TrackingConsent.GRANTED
38+
)
39+
40+
val rumConfig = createRumConfiguration()
41+
Rum.enable(rumConfig)
42+
43+
val logsConfig = LogsConfiguration.Builder().build()
44+
Logs.enable(logsConfig)
45+
46+
GlobalRumMonitor.get().debug = true
47+
}
48+
49+
private fun createRumConfiguration(): RumConfiguration {
50+
return RumConfiguration.Builder(BuildConfig.DD_RUM_APPLICATION_ID)
51+
.useViewTrackingStrategy(
52+
ActivityViewTrackingStrategy(true)
53+
)
54+
.setTelemetrySampleRate(FULL_SAMPLING_RATE)
55+
.trackUserInteractions()
56+
.build()
57+
}
58+
private fun createDatadogConfiguration(): Configuration {
59+
return Configuration.Builder(
60+
clientToken = BuildConfig.DD_CLIENT_TOKEN,
61+
env = "test",
62+
variant = ""
63+
)
64+
.useSite(DatadogSite.US1)
65+
.setBatchSize(BatchSize.SMALL)
66+
.setUploadFrequency(UploadFrequency.FREQUENT)
67+
.build()
68+
}
69+
70+
private companion object {
71+
private const val FULL_SAMPLING_RATE = 100f
72+
}
73+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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 androidx.car.app.CarAppService
10+
import androidx.car.app.Session
11+
import androidx.car.app.SessionInfo
12+
import androidx.car.app.validation.HostValidator
13+
14+
@Suppress("UndocumentedPublicClass")
15+
class SampleCarAppService : CarAppService() {
16+
17+
override fun onCreateSession(): Session {
18+
SharedLogger.logger.i("onCreateSession")
19+
return SampleCarSession()
20+
}
21+
22+
override fun onCreateSession(sessionInfo: SessionInfo): Session {
23+
SharedLogger.logger.i("onCreateSession ${sessionInfo.displayType} ${sessionInfo.sessionId}")
24+
return SampleCarSession()
25+
}
26+
27+
override fun createHostValidator(): HostValidator {
28+
return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR
29+
}
30+
}

0 commit comments

Comments
 (0)