Skip to content

Commit 827666e

Browse files
RUM-9511: Refactor navigation and empty RumAuto scenario fragment
f
1 parent 6508209 commit 827666e

36 files changed

+880
-266
lines changed

sample/benchmark/src/main/AndroidManifest.xml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
<uses-permission android:name="android.permission.INTERNET" />
55
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
6+
67
<application
78
android:name="com.datadog.benchmark.sample.BenchmarkApplication"
89
android:allowBackup="true"
@@ -12,10 +13,37 @@
1213
android:supportsRtl="true"
1314
android:theme="@style/Theme.BenchmarkApp">
1415
<activity
15-
android:name="com.datadog.benchmark.sample.MainActivity"
16+
android:name="com.datadog.benchmark.sample.activities.scenarios.DefaultScenarioActivity"
1617
android:exported="true"
1718
android:label="@string/app_name"
1819
android:theme="@style/Theme.BenchmarkApp">
20+
21+
</activity>
22+
23+
<activity
24+
android:name="com.datadog.benchmark.sample.activities.scenarios.RumAutoScenarioActivity"
25+
android:exported="true"
26+
android:theme="@style/Theme.BenchmarkApp">
27+
28+
</activity>
29+
30+
<activity
31+
android:name="com.datadog.benchmark.sample.activities.scenarios.SessionReplayComposeScenarioActivity"
32+
android:exported="true"
33+
android:theme="@style/Theme.BenchmarkApp">
34+
35+
</activity>
36+
37+
<activity
38+
android:name="com.datadog.benchmark.sample.activities.scenarios.SessionReplayScenarioActivity"
39+
android:exported="true"
40+
android:theme="@style/Theme.BenchmarkApp">
41+
42+
</activity>
43+
44+
<activity
45+
android:name="com.datadog.benchmark.sample.activities.LaunchActivity"
46+
android:exported="true">
1947
<intent-filter>
2048
<action android:name="android.intent.action.MAIN" />
2149

sample/benchmark/src/main/java/com/datadog/benchmark/sample/BenchmarkApplication.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.datadog.benchmark.sample
88

99
import android.app.Application
10+
import android.content.Context
1011
import com.datadog.benchmark.sample.di.app.BenchmarkAppComponent
1112
import com.datadog.benchmark.sample.di.app.DaggerBenchmarkAppComponent
1213

@@ -22,5 +23,5 @@ internal class BenchmarkApplication : Application() {
2223
}
2324
}
2425

25-
internal val Application.benchmarkAppComponent: BenchmarkAppComponent
26-
get() = (this as BenchmarkApplication).benchmarkAppComponent
26+
internal val Context.benchmarkAppComponent: BenchmarkAppComponent
27+
get() = (applicationContext as BenchmarkApplication).benchmarkAppComponent
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
var config: BenchmarkConfig? = null
16+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 android.content.Context
10+
import com.bumptech.glide.Glide
11+
import com.bumptech.glide.Registry
12+
import com.bumptech.glide.annotation.GlideModule
13+
import com.datadog.android.glide.DatadogGlideModule
14+
import com.datadog.benchmark.sample.di.app.DATADOG_SDK_INSTANCE_NAME
15+
import okhttp3.OkHttpClient
16+
import javax.inject.Inject
17+
18+
@GlideModule
19+
internal class BenchmarkGlideModule : DatadogGlideModule(
20+
sdkInstanceName = DATADOG_SDK_INSTANCE_NAME
21+
) {
22+
@Inject
23+
lateinit var okHttpClient: OkHttpClient
24+
25+
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
26+
context.benchmarkAppComponent.inject(this)
27+
28+
super.registerComponents(context, glide, registry)
29+
}
30+
31+
override fun getClientBuilder(): OkHttpClient.Builder {
32+
return okHttpClient.newBuilder()
33+
}
34+
}

sample/benchmark/src/main/java/com/datadog/benchmark/sample/DatadogFeaturesInitializer.kt

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.datadog.android.log.LogsConfiguration
1313
import com.datadog.android.rum.Rum
1414
import com.datadog.android.rum.RumConfiguration
1515
import com.datadog.android.rum.tracking.NavigationViewTrackingStrategy
16+
import com.datadog.android.rum.tracking.ViewTrackingStrategy
1617
import com.datadog.android.sessionreplay.SessionReplay
1718
import com.datadog.android.sessionreplay.SessionReplayConfiguration
1819
import com.datadog.android.sessionreplay.SessionReplayPrivacy
@@ -23,19 +24,19 @@ import com.datadog.android.trace.TraceConfiguration
2324
import com.datadog.benchmark.sample.config.BenchmarkConfig
2425
import com.datadog.benchmark.sample.config.SyntheticsRun
2526
import com.datadog.benchmark.sample.config.SyntheticsScenario
26-
import com.datadog.benchmark.sample.di.activity.BenchmarkActivityScope
2727
import com.datadog.benchmark.sample.navigation.BenchmarkNavigationPredicate
2828
import com.datadog.sample.benchmark.BuildConfig
2929
import com.datadog.sample.benchmark.R
3030
import dagger.Lazy
3131
import javax.inject.Inject
32+
import javax.inject.Singleton
3233

3334
/**
3435
* The general recommendation is to initialize all the components at the Application.onCreate
3536
* to have all the observability as early as possible. However in the Benchmark app we know what features
3637
* we need only in [MainActivity.onCreate], it depends on the [SyntheticsScenario] which is derived from intent extras.
3738
*/
38-
@BenchmarkActivityScope
39+
@Singleton
3940
@Suppress("TooManyFunctions")
4041
internal class DatadogFeaturesInitializer @Inject constructor(
4142
private val sdkCore: Lazy<SdkCore>
@@ -104,17 +105,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
104105

105106
private fun createRumConfiguration(config: BenchmarkConfig): RumConfiguration {
106107
return RumConfiguration.Builder(BuildConfig.BENCHMARK_RUM_APPLICATION_ID).apply {
107-
if (config.scenario != SyntheticsScenario.RumManual) {
108-
useViewTrackingStrategy(
109-
NavigationViewTrackingStrategy(
110-
R.id.nav_host_fragment,
111-
true,
112-
BenchmarkNavigationPredicate()
113-
)
114-
)
115-
} else {
116-
useViewTrackingStrategy(null)
117-
}
108+
useViewTrackingStrategy(rumViewTrackingStrategy(config))
118109
setTelemetrySampleRate(SAMPLE_RATE_TELEMETRY)
119110
trackUserInteractions()
120111
trackLongTasks(THRESHOLD_LONG_TASK_INTERVAL)
@@ -143,6 +134,17 @@ internal class DatadogFeaturesInitializer @Inject constructor(
143134
}.build()
144135
}
145136

137+
private fun rumViewTrackingStrategy(config: BenchmarkConfig): ViewTrackingStrategy? {
138+
return when (config.scenario) {
139+
SyntheticsScenario.RumManual -> null
140+
else -> NavigationViewTrackingStrategy(
141+
R.id.nav_host_fragment,
142+
true,
143+
BenchmarkNavigationPredicate()
144+
)
145+
}
146+
}
147+
146148
private fun enableRum(config: BenchmarkConfig) {
147149
val rumConfig = createRumConfiguration(config)
148150
Rum.enable(rumConfig, sdkCore = sdkCore.get())
@@ -156,10 +158,12 @@ internal class DatadogFeaturesInitializer @Inject constructor(
156158
SyntheticsScenario.Trace,
157159
SyntheticsScenario.LogsCustom,
158160
SyntheticsScenario.LogsHeavyTraffic,
161+
SyntheticsScenario.RumAuto,
159162
null -> false
160163
}
161164

162165
private fun isRumScenario(config: BenchmarkConfig) = when (config.scenario) {
166+
SyntheticsScenario.RumAuto,
163167
SyntheticsScenario.RumManual -> true
164168
SyntheticsScenario.SessionReplay,
165169
SyntheticsScenario.SessionReplayCompose,
@@ -178,6 +182,7 @@ internal class DatadogFeaturesInitializer @Inject constructor(
178182
SyntheticsScenario.RumManual,
179183
SyntheticsScenario.Trace,
180184
SyntheticsScenario.Upload,
185+
SyntheticsScenario.RumAuto,
181186
null -> false
182187
}
183188

sample/benchmark/src/main/java/com/datadog/benchmark/sample/MainActivity.kt

Lines changed: 0 additions & 82 deletions
This file was deleted.

sample/benchmark/src/main/java/com/datadog/benchmark/sample/MainActivityViewModel.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package com.datadog.benchmark.sample
99
import android.app.Application
1010
import androidx.lifecycle.ViewModel
1111
import androidx.lifecycle.ViewModelProvider
12-
import com.datadog.benchmark.sample.config.BenchmarkConfig
1312
import com.datadog.benchmark.sample.di.activity.BenchmarkActivityComponent
1413
import com.datadog.benchmark.sample.di.activity.DaggerBenchmarkActivityComponent
1514

@@ -18,16 +17,12 @@ internal class MainActivityViewModel(
1817
) : ViewModel()
1918

2019
internal class MainActivityViewModelFactory(
21-
private val application: Application,
22-
private val activity: MainActivity
20+
private val application: Application
2321
) : ViewModelProvider.Factory {
2422
@Suppress("UNCHECKED_CAST")
2523
override fun <T : ViewModel> create(modelClass: Class<T>): T {
26-
val config = BenchmarkConfig.resolveSyntheticsBundle(activity.intent.extras)
27-
2824
val benchmarkActivityComponent = DaggerBenchmarkActivityComponent.factory().create(
29-
deps = application.benchmarkAppComponent,
30-
config = config
25+
deps = application.benchmarkAppComponent
3126
)
3227

3328
return MainActivityViewModel(benchmarkActivityComponent) as T
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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.activities
8+
9+
import android.annotation.SuppressLint
10+
import android.content.Intent
11+
import android.os.Bundle
12+
import androidx.appcompat.app.AppCompatActivity
13+
import coil.Coil
14+
import coil.ImageLoader
15+
import com.datadog.benchmark.sample.BenchmarkConfigHolder
16+
import com.datadog.benchmark.sample.DatadogFeaturesInitializer
17+
import com.datadog.benchmark.sample.activities.scenarios.DefaultScenarioActivity
18+
import com.datadog.benchmark.sample.activities.scenarios.RumAutoScenarioActivity
19+
import com.datadog.benchmark.sample.activities.scenarios.SessionReplayComposeScenarioActivity
20+
import com.datadog.benchmark.sample.activities.scenarios.SessionReplayScenarioActivity
21+
import com.datadog.benchmark.sample.benchmarkAppComponent
22+
import com.datadog.benchmark.sample.config.BenchmarkConfig
23+
import com.datadog.benchmark.sample.config.SyntheticsScenario
24+
import okhttp3.OkHttpClient
25+
import javax.inject.Inject
26+
27+
@SuppressLint("CustomSplashScreen")
28+
internal class LaunchActivity : AppCompatActivity() {
29+
@Inject
30+
internal lateinit var benchmarkConfigHolder: BenchmarkConfigHolder
31+
32+
@Inject
33+
internal lateinit var benchmarkFeaturesInitializer: DatadogFeaturesInitializer
34+
35+
@Inject
36+
internal lateinit var okHttpClient: dagger.Lazy<OkHttpClient>
37+
38+
override fun onCreate(savedInstanceState: Bundle?) {
39+
super.onCreate(savedInstanceState)
40+
41+
application.benchmarkAppComponent.inject(this)
42+
43+
val config = BenchmarkConfig.resolveSyntheticsBundle(intent.extras)
44+
benchmarkConfigHolder.config = config
45+
46+
/**
47+
* The general recommendation is to initialize Datadog SDK at the Application.onCreate
48+
* to have all the observability as early as possible. However in the Benchmark app we know what kind of run we
49+
* have [SyntheticsRun.Instrumented] or [SyntheticsRun.Baseline] only in [LaunchActivity.onCreate].
50+
* It is derived from intent extras.
51+
*/
52+
benchmarkFeaturesInitializer.initialize(config)
53+
54+
initializeCoil()
55+
56+
openScenarioActivity(config)
57+
58+
finish()
59+
}
60+
61+
private fun initializeCoil() {
62+
Coil.setImageLoader(ImageLoader(applicationContext).newBuilder().okHttpClient(okHttpClient.get()).build())
63+
}
64+
65+
private fun openScenarioActivity(config: BenchmarkConfig) {
66+
val activity = when (config.scenario) {
67+
SyntheticsScenario.RumAuto -> RumAutoScenarioActivity::class.java
68+
SyntheticsScenario.SessionReplayCompose -> SessionReplayComposeScenarioActivity::class.java
69+
SyntheticsScenario.SessionReplay -> SessionReplayScenarioActivity::class.java
70+
else -> DefaultScenarioActivity::class.java
71+
}
72+
73+
val intent = Intent(this, activity)
74+
startActivity(intent)
75+
}
76+
}

0 commit comments

Comments
 (0)