Skip to content

Commit 9f737d7

Browse files
committed
RUM-11120: Refactor to use common InfoProvider
1 parent aa393a5 commit 9f737d7

30 files changed

+1026
-241
lines changed

detekt_custom.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ datadog:
137137
- "android.graphics.drawable.LayerDrawable.getDrawable(kotlin.Int):java.lang.IndexOutOfBoundsException"
138138
- "android.net.ConnectivityManager.registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback):java.lang.IllegalArgumentException,java.lang.SecurityException"
139139
- "android.net.ConnectivityManager.unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback):java.lang.SecurityException"
140+
- "android.provider.Settings.System.getInt(android.content.ContentResolver?, kotlin.String?):android.provider.Settings.SettingNotFoundException"
140141
- "android.util.Base64.encodeToString(kotlin.ByteArray?, kotlin.Int):java.lang.AssertionError"
141142
- "android.view.Choreographer.getInstance():java.lang.IllegalStateException"
142143
- "android.view.Choreographer.postFrameCallback():java.lang.IllegalArgumentException"
@@ -389,6 +390,7 @@ datadog:
389390
- "android.net.ConnectivityManager.NetworkCallback.onLost(android.net.Network)"
390391
- "android.net.ConnectivityManager.getNetworkCapabilities(android.net.Network?)"
391392
- "android.net.NetworkCapabilities.hasTransport(kotlin.Int)"
393+
- "android.os.BatteryManager.getIntProperty(kotlin.Int)"
392394
- "android.os.Bundle.get(kotlin.String?)"
393395
- "android.os.Bundle.getString(kotlin.String?)"
394396
- "android.os.Bundle.keySet()"
@@ -411,6 +413,7 @@ datadog:
411413
- "android.os.SystemClock.elapsedRealtime()"
412414
- "android.provider.Settings.Global.getUriFor(kotlin.String?)"
413415
- "android.provider.Settings.Secure.getUriFor(kotlin.String?)"
416+
- "android.provider.Settings.System.getUriFor(kotlin.String?)"
414417
- "android.util.Log.e(kotlin.String?, kotlin.String)"
415418
- "android.util.Log.e(kotlin.String?, kotlin.String?, kotlin.Throwable?)"
416419
- "android.util.Log.getStackTraceString(kotlin.Throwable?)"

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/RumFeature.kt

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,15 @@ import com.datadog.android.rum.configuration.SlowFramesConfiguration
4242
import com.datadog.android.rum.configuration.VitalsUpdateFrequency
4343
import com.datadog.android.rum.internal.anr.ANRDetectorRunnable
4444
import com.datadog.android.rum.internal.debug.UiRumDebugListener
45+
import com.datadog.android.rum.internal.domain.InfoProvider
46+
import com.datadog.android.rum.internal.domain.NoOpInfoProvider
4547
import com.datadog.android.rum.internal.domain.RumDataWriter
46-
import com.datadog.android.rum.internal.domain.accessibility.AccessibilityReader
4748
import com.datadog.android.rum.internal.domain.accessibility.AccessibilitySnapshotManager
4849
import com.datadog.android.rum.internal.domain.accessibility.DatadogAccessibilityReader
4950
import com.datadog.android.rum.internal.domain.accessibility.DefaultAccessibilitySnapshotManager
50-
import com.datadog.android.rum.internal.domain.accessibility.NoOpAccessibilityReader
5151
import com.datadog.android.rum.internal.domain.accessibility.NoOpAccessibilitySnapshotManager
52-
import com.datadog.android.rum.internal.domain.battery.BatteryInfoProvider
5352
import com.datadog.android.rum.internal.domain.battery.DefaultBatteryInfoProvider
54-
import com.datadog.android.rum.internal.domain.battery.NoOpBatteryInfoProvider
5553
import com.datadog.android.rum.internal.domain.display.DefaultDisplayInfoProvider
56-
import com.datadog.android.rum.internal.domain.display.DisplayInfoProvider
57-
import com.datadog.android.rum.internal.domain.display.NoOpDisplayInfoProvider
5854
import com.datadog.android.rum.internal.domain.event.RumEventMapper
5955
import com.datadog.android.rum.internal.domain.event.RumEventMetaDeserializer
6056
import com.datadog.android.rum.internal.domain.event.RumEventMetaSerializer
@@ -157,11 +153,11 @@ internal class RumFeature(
157153
internal var initialResourceIdentifier: InitialResourceIdentifier = NoOpInitialResourceIdentifier()
158154
internal var lastInteractionIdentifier: LastInteractionIdentifier? = NoOpLastInteractionIdentifier()
159155
internal var slowFramesListener: SlowFramesListener? = null
160-
internal var accessibilityReader: AccessibilityReader = NoOpAccessibilityReader()
156+
internal var accessibilityReader: InfoProvider = NoOpInfoProvider()
161157
internal var accessibilitySnapshotManager: AccessibilitySnapshotManager =
162158
NoOpAccessibilitySnapshotManager()
163-
internal var batteryInfoProvider: BatteryInfoProvider = NoOpBatteryInfoProvider()
164-
internal var displayInfoProvider: DisplayInfoProvider = NoOpDisplayInfoProvider()
159+
internal var batteryInfoProvider: InfoProvider = NoOpInfoProvider()
160+
internal var displayInfoProvider: InfoProvider = NoOpInfoProvider()
165161

166162
private val lateCrashEventHandler by lazy { lateCrashReporterFactory(sdkCore as InternalSdkCore) }
167163

@@ -174,8 +170,10 @@ internal class RumFeature(
174170
this.appContext = appContext
175171

176172
if (configuration.collectAccessibility) {
177-
accessibilityReader =
178-
DatadogAccessibilityReader(applicationContext = appContext, internalLogger = sdkCore.internalLogger)
173+
accessibilityReader = DatadogAccessibilityReader(
174+
internalLogger = sdkCore.internalLogger,
175+
applicationContext = appContext
176+
)
179177
accessibilitySnapshotManager = DefaultAccessibilitySnapshotManager(accessibilityReader)
180178
}
181179

@@ -205,7 +203,8 @@ internal class RumFeature(
205203
applicationContext = appContext
206204
)
207205
displayInfoProvider = DefaultDisplayInfoProvider(
208-
applicationContext = appContext
206+
applicationContext = appContext,
207+
internalLogger = sdkCore.internalLogger
209208
)
210209

211210
configuration.viewTrackingStrategy?.let { viewTrackingStrategy = it }
@@ -320,19 +319,26 @@ internal class RumFeature(
320319
vitalExecutorService = NoOpScheduledExecutorService()
321320
sessionListener = NoOpRumSessionListener()
322321

322+
cleanupInfoProviders()
323+
324+
GlobalRumMonitor.unregister(sdkCore)
325+
}
326+
327+
// endregion
328+
329+
private fun cleanupInfoProviders() {
323330
if (configuration.collectAccessibility) {
324331
accessibilityReader.cleanup()
325-
accessibilityReader = NoOpAccessibilityReader()
332+
accessibilityReader = NoOpInfoProvider()
326333
accessibilitySnapshotManager = NoOpAccessibilitySnapshotManager()
327334
}
328335

329-
batteryInfoProvider = NoOpBatteryInfoProvider()
330-
331-
GlobalRumMonitor.unregister(sdkCore)
336+
batteryInfoProvider.cleanup()
337+
batteryInfoProvider = NoOpInfoProvider()
338+
displayInfoProvider.cleanup()
339+
displayInfoProvider = NoOpInfoProvider()
332340
}
333341

334-
// endregion
335-
336342
private fun createDataWriter(
337343
configuration: Configuration,
338344
sdkCore: InternalSdkCore
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.rum.internal.domain.accessibility
7+
package com.datadog.android.rum.internal.domain
88

99
import com.datadog.tools.annotation.NoOpImplementation
1010

1111
@NoOpImplementation
12-
internal interface AccessibilityReader {
12+
internal interface InfoProvider {
1313
fun getState(): Map<String, Any>
1414
fun cleanup()
1515
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/DatadogAccessibilityReader.kt

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import android.view.View
2222
import android.view.accessibility.AccessibilityManager
2323
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener
2424
import com.datadog.android.api.InternalLogger
25-
import java.util.concurrent.atomic.AtomicBoolean
25+
import com.datadog.android.rum.internal.domain.InfoProvider
2626
import java.util.concurrent.atomic.AtomicLong
2727

2828
@Suppress("TooManyFunctions")
@@ -37,14 +37,7 @@ internal class DatadogAccessibilityReader(
3737
private val secureWrapper: SecureWrapper = SecureWrapper(),
3838
private val globalWrapper: GlobalWrapper = GlobalWrapper(),
3939
private val handler: Handler = Handler(Looper.getMainLooper())
40-
) : AccessibilityReader, ComponentCallbacks {
41-
42-
@Volatile
43-
private var currentState = Accessibility()
44-
45-
private var lastPollTime: AtomicLong = AtomicLong(0)
46-
47-
private var isInitialized = AtomicBoolean(false)
40+
) : InfoProvider, ComponentCallbacks {
4841

4942
private val displayInversionListener = object : ContentObserver(handler) {
5043
override fun onChange(selfChange: Boolean, uri: Uri?) {
@@ -72,15 +65,22 @@ internal class DatadogAccessibilityReader(
7265
updateState { it.copy(isScreenReaderEnabled = newScreenReaderEnabled) }
7366
}
7467

68+
@Volatile
69+
private var currentState = Accessibility()
70+
71+
private var lastPollTime: AtomicLong = AtomicLong(0)
72+
73+
init {
74+
registerListeners()
75+
buildInitialState()
76+
}
77+
7578
override fun cleanup() {
76-
if (isInitialized.get()) {
77-
accessibilityManager?.removeTouchExplorationStateChangeListener(touchListener)
78-
applicationContext.contentResolver.unregisterContentObserver(animationDurationListener)
79-
applicationContext.contentResolver.unregisterContentObserver(captioningListener)
80-
applicationContext.contentResolver.unregisterContentObserver(displayInversionListener)
81-
applicationContext.unregisterComponentCallbacks(this)
82-
isInitialized.set(false)
83-
}
79+
accessibilityManager?.removeTouchExplorationStateChangeListener(touchListener)
80+
applicationContext.contentResolver.unregisterContentObserver(animationDurationListener)
81+
applicationContext.contentResolver.unregisterContentObserver(captioningListener)
82+
applicationContext.contentResolver.unregisterContentObserver(displayInversionListener)
83+
applicationContext.unregisterComponentCallbacks(this)
8484
}
8585

8686
override fun onLowMemory() {
@@ -97,8 +97,6 @@ internal class DatadogAccessibilityReader(
9797

9898
@Synchronized
9999
override fun getState(): Map<String, Any> {
100-
ensureInitialized()
101-
102100
val currentTime = System.currentTimeMillis()
103101
val shouldPoll = currentTime - lastPollTime.get() >= POLL_THRESHOLD
104102
if (shouldPoll) {
@@ -114,16 +112,8 @@ internal class DatadogAccessibilityReader(
114112
currentState = updater(currentState)
115113
}
116114

117-
private fun ensureInitialized() {
118-
if (!isInitialized.get()) {
119-
registerListeners()
120-
currentState = buildInitialState()
121-
isInitialized.set(true)
122-
}
123-
}
124-
125-
private fun buildInitialState(): Accessibility {
126-
return Accessibility(
115+
private fun buildInitialState() {
116+
currentState = Accessibility(
127117
textSize = getTextSize(),
128118
isScreenReaderEnabled = isScreenReaderEnabled(accessibilityManager),
129119
isColorInversionEnabled = isDisplayInversionEnabled(),

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/DefaultAccessibilitySnapshotManager.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
package com.datadog.android.rum.internal.domain.accessibility
88

9+
import com.datadog.android.rum.internal.domain.InfoProvider
10+
911
internal class DefaultAccessibilitySnapshotManager(
10-
private val accessibilityReader: AccessibilityReader
12+
private val accessibilityReader: InfoProvider
1113
) : AccessibilitySnapshotManager {
1214
private val lastSnapshot = mutableMapOf<String, Any>()
1315

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/battery/BatteryInfo.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,21 @@ package com.datadog.android.rum.internal.domain.battery
1515
internal data class BatteryInfo(
1616
val batteryLevel: Float? = null,
1717
val lowPowerMode: Boolean? = null
18-
)
18+
) {
19+
fun toMap(): Map<String, Any> = buildMap {
20+
batteryLevel?.let { put(BATTERY_LEVEL_KEY, it) }
21+
lowPowerMode?.let { put(LOW_POWER_MODE_KEY, it) }
22+
}
23+
24+
internal companion object {
25+
const val BATTERY_LEVEL_KEY = "battery_level"
26+
const val LOW_POWER_MODE_KEY = "low_power_mode"
27+
28+
fun fromMap(map: Map<String, Any>): BatteryInfo {
29+
return BatteryInfo(
30+
batteryLevel = map[BATTERY_LEVEL_KEY] as? Float,
31+
lowPowerMode = map[LOW_POWER_MODE_KEY] as? Boolean
32+
)
33+
}
34+
}
35+
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/battery/BatteryInfoProvider.kt

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

0 commit comments

Comments
 (0)