Skip to content

Commit 5b82786

Browse files
xgouchet0xnm
authored andcommitted
Create basic Automotive app with RUM support
1 parent 614a072 commit 5b82786

29 files changed

+552
-14
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
}

sample/automotive/.gitignore

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

sample/automotive/build.gradle.kts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import com.datadog.gradle.config.AndroidConfig
22
import com.datadog.gradle.config.configureFlavorForAutoApp
3-
import com.datadog.gradle.config.configureFlavorForTvApp
43
import com.datadog.gradle.config.dependencyUpdateConfig
54
import com.datadog.gradle.config.java17
65
import com.datadog.gradle.config.junitConfig
76
import com.datadog.gradle.config.kotlinConfig
87
import com.datadog.gradle.config.taskConfig
8+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
99

1010
plugins {
1111
id("com.android.application")
@@ -35,7 +35,6 @@ android {
3535
namespace = "com.datadog.sample.automotive"
3636

3737
compileOptions {
38-
isCoreLibraryDesugaringEnabled = true
3938
java17()
4039
}
4140

@@ -62,11 +61,6 @@ dependencies {
6261
// Datadog Libraries
6362
implementation(project(":features:dd-sdk-android-logs"))
6463
implementation(project(":features:dd-sdk-android-rum"))
65-
implementation(project(":integrations:dd-sdk-android-okhttp"))
66-
implementation(project(":integrations:dd-sdk-android-okhttp-otel"))
67-
68-
// Desugaring SDK
69-
coreLibraryDesugaring(libs.androidDesugaringSdk)
7064

7165
implementation(libs.kotlin)
7266

@@ -78,17 +72,15 @@ dependencies {
7872
implementation(libs.androidXLegacySupportV13)
7973

8074
// Android Car
81-
implementation(libs.androidXCarApp)
82-
implementation(libs.androidXCarAutomotive)
75+
implementation(libs.androidXCarApp)
76+
implementation(libs.androidXCarAutomotive)
8377
}
8478

8579
kotlinConfig(evaluateWarningsAsErrors = false)
86-
taskConfig<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
80+
taskConfig<KotlinCompile> {
8781
compilerOptions {
8882
freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn")
8983
}
9084
}
9185
junitConfig()
9286
dependencyUpdateConfig()
93-
94-

sample/automotive/proguard-rules.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@
1818

1919
# If you keep the line number information, uncomment this to
2020
# hide the original source file name.
21-
#-renamesourcefileattribute SourceFile
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+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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.content.Intent
10+
import androidx.car.app.Screen
11+
import androidx.car.app.Session
12+
import com.datadog.sample.automotive.screen.HomeScreen
13+
14+
@Suppress("UndocumentedPublicClass")
15+
class SampleCarSession : Session() {
16+
override fun onCreateScreen(intent: Intent): Screen {
17+
SharedLogger.logger.i("onCreateScreen $intent")
18+
return HomeScreen(carContext)
19+
}
20+
21+
override fun onNewIntent(intent: Intent) {
22+
SharedLogger.logger.i("onNewIntent $intent")
23+
super.onNewIntent(intent)
24+
}
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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.screen
8+
9+
import androidx.car.app.Screen
10+
import androidx.car.app.model.Action
11+
import androidx.car.app.model.OnClickListener
12+
import com.datadog.android.Datadog
13+
import com.datadog.android.api.SdkCore
14+
import com.datadog.android.rum.GlobalRumMonitor
15+
import com.datadog.android.rum.RumActionType
16+
17+
internal fun Screen.monitorGetTemplate(
18+
sdkCore: SdkCore = Datadog.getInstance()
19+
) {
20+
GlobalRumMonitor.get(sdkCore).startView(
21+
key = javaClass.name,
22+
name = javaClass.simpleName
23+
)
24+
}
25+
26+
internal fun Action.Builder.setMonitoredClickListener(
27+
sdkCore: SdkCore = Datadog.getInstance(),
28+
listener: OnClickListener
29+
): Action.Builder {
30+
val builtAction = build()
31+
return setOnClickListener {
32+
GlobalRumMonitor.get(sdkCore).addAction(
33+
type = RumActionType.TAP,
34+
name = builtAction.title?.toString() ?: builtAction.icon.toString(),
35+
attributes = emptyMap()
36+
)
37+
listener.onClick()
38+
}
39+
}

0 commit comments

Comments
 (0)