Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions dd-sdk-android-core/api/apiSurface
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ interface com.datadog.android.api.feature.FeatureSdkCore : com.datadog.android.a
val internalLogger: com.datadog.android.api.InternalLogger
fun registerFeature(Feature)
fun getFeature(String): FeatureScope?
fun updateFeatureContext(String, (MutableMap<String, Any?>) -> Unit)
fun getFeatureContext(String): Map<String, Any?>
fun updateFeatureContext(String, Boolean = true, (MutableMap<String, Any?>) -> Unit)
fun getFeatureContext(String, Boolean = true): Map<String, Any?>
fun setEventReceiver(String, FeatureEventReceiver)
fun setContextUpdateReceiver(String, FeatureContextUpdateReceiver)
fun removeContextUpdateReceiver(String, FeatureContextUpdateReceiver)
Expand Down Expand Up @@ -311,6 +311,8 @@ fun Collection<ByteArray>.join(ByteArray, ByteArray = ByteArray(0), ByteArray =
fun java.util.concurrent.Executor.executeSafe(String, com.datadog.android.api.InternalLogger, Runnable)
fun java.util.concurrent.ScheduledExecutorService.scheduleSafe(String, Long, java.util.concurrent.TimeUnit, com.datadog.android.api.InternalLogger, Runnable): java.util.concurrent.ScheduledFuture<*>?
fun java.util.concurrent.ExecutorService.submitSafe(String, com.datadog.android.api.InternalLogger, Runnable): java.util.concurrent.Future<*>?
fun <T> java.util.concurrent.ExecutorService.submitSafe(String, com.datadog.android.api.InternalLogger, java.util.concurrent.Callable<T>): java.util.concurrent.Future<T>?
fun <T> java.util.concurrent.Future<T>?.getSafe(String, com.datadog.android.api.InternalLogger): T?
val NULL_MAP_VALUE: Object
object com.datadog.android.core.internal.utils.JsonSerializer
fun toJsonElement(Any?): com.google.gson.JsonElement
Expand Down
11 changes: 9 additions & 2 deletions dd-sdk-android-core/api/dd-sdk-android-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -358,15 +358,20 @@ public abstract interface class com/datadog/android/api/feature/FeatureSdkCore :
public abstract fun createScheduledExecutorService (Ljava/lang/String;)Ljava/util/concurrent/ScheduledExecutorService;
public abstract fun createSingleThreadExecutorService (Ljava/lang/String;)Ljava/util/concurrent/ExecutorService;
public abstract fun getFeature (Ljava/lang/String;)Lcom/datadog/android/api/feature/FeatureScope;
public abstract fun getFeatureContext (Ljava/lang/String;)Ljava/util/Map;
public abstract fun getFeatureContext (Ljava/lang/String;Z)Ljava/util/Map;
public abstract fun getInternalLogger ()Lcom/datadog/android/api/InternalLogger;
public abstract fun registerFeature (Lcom/datadog/android/api/feature/Feature;)V
public abstract fun removeContextUpdateReceiver (Ljava/lang/String;Lcom/datadog/android/api/feature/FeatureContextUpdateReceiver;)V
public abstract fun removeEventReceiver (Ljava/lang/String;)V
public abstract fun setAnonymousId (Ljava/util/UUID;)V
public abstract fun setContextUpdateReceiver (Ljava/lang/String;Lcom/datadog/android/api/feature/FeatureContextUpdateReceiver;)V
public abstract fun setEventReceiver (Ljava/lang/String;Lcom/datadog/android/api/feature/FeatureEventReceiver;)V
public abstract fun updateFeatureContext (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
public abstract fun updateFeatureContext (Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)V
}

public final class com/datadog/android/api/feature/FeatureSdkCore$DefaultImpls {
public static synthetic fun getFeatureContext$default (Lcom/datadog/android/api/feature/FeatureSdkCore;Ljava/lang/String;ZILjava/lang/Object;)Ljava/util/Map;
public static synthetic fun updateFeatureContext$default (Lcom/datadog/android/api/feature/FeatureSdkCore;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
}

public abstract interface class com/datadog/android/api/feature/StorageBackedFeature : com/datadog/android/api/feature/Feature {
Expand Down Expand Up @@ -812,8 +817,10 @@ public final class com/datadog/android/core/internal/utils/ByteArrayExtKt {

public final class com/datadog/android/core/internal/utils/ConcurrencyExtKt {
public static final fun executeSafe (Ljava/util/concurrent/Executor;Ljava/lang/String;Lcom/datadog/android/api/InternalLogger;Ljava/lang/Runnable;)V
public static final fun getSafe (Ljava/util/concurrent/Future;Ljava/lang/String;Lcom/datadog/android/api/InternalLogger;)Ljava/lang/Object;
public static final fun scheduleSafe (Ljava/util/concurrent/ScheduledExecutorService;Ljava/lang/String;JLjava/util/concurrent/TimeUnit;Lcom/datadog/android/api/InternalLogger;Ljava/lang/Runnable;)Ljava/util/concurrent/ScheduledFuture;
public static final fun submitSafe (Ljava/util/concurrent/ExecutorService;Ljava/lang/String;Lcom/datadog/android/api/InternalLogger;Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
public static final fun submitSafe (Ljava/util/concurrent/ExecutorService;Ljava/lang/String;Lcom/datadog/android/api/InternalLogger;Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;
}

public final class com/datadog/android/core/internal/utils/JsonSerializer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,21 +45,30 @@ interface FeatureSdkCore : SdkCore {
* provided [featureName], a new one will be created.
*
* @param featureName Feature name.
* @param useContextThread Whenever update of the context should happen on the context processing thread or not. It
* should be true for most of the cases related to the event processing. Be careful when setting it to false, valid
* use-case can be like updating/reading feature context on the same (or already on the context) thread.
* Defaults to true.
* @param updateCallback Provides current feature context for the update. If there is no feature
* with the given name registered, callback won't be called.
*/
fun updateFeatureContext(
featureName: String,
useContextThread: Boolean = true,
updateCallback: (context: MutableMap<String, Any?>) -> Unit
)

/**
* Retrieves the context for the particular feature.
*
* @param featureName Feature name.
* @param useContextThread Whenever context read should happen on the context processing thread or not. It
* should be true for most of the cases related to the event processing. Be careful when setting it to false, valid
* use-case can be like updating/reading feature context on the same (or already on the context) thread.
* Defaults to true.
* @return Context for the given feature or empty map if feature is not registered.
*/
fun getFeatureContext(featureName: String): Map<String, Any?>
fun getFeatureContext(featureName: String, useContextThread: Boolean = true): Map<String, Any?>

/**
* Sets event receiver for the given feature.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,8 @@ package com.datadog.android.core.internal
import com.datadog.android.api.context.DatadogContext

internal interface ContextProvider {
// TODO RUM-3784 getting context may be quite heavy, should it be something non-blocking here?

// TODO RUM-3784 lifecycle checks may be needed for the cases when context is requested
// when datadog is not initialized yet/anymore (case of UploadWorker, other calls site
// should be in sync with lifecycle)

// TODO RUM-3784 can be accessed from different threads
val context: DatadogContext

fun setFeatureContext(feature: String, context: Map<String, Any?>)

fun getFeatureContext(feature: String): Map<String, Any?>
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ import java.io.File
import java.io.FileNotFoundException
import java.lang.ref.WeakReference
import java.util.Locale
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ExecutorService
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.ScheduledExecutorService
Expand All @@ -123,7 +122,6 @@ internal class CoreFeature(
internal var timeProvider: TimeProvider = NoOpTimeProvider()
internal var trackingConsentProvider: ConsentProvider = NoOpConsentProvider()
internal var userInfoProvider: MutableUserInfoProvider = NoOpMutableUserInfoProvider()
internal var contextProvider: ContextProvider = NoOpContextProvider()

internal lateinit var okHttpClient: OkHttpClient
internal var kronosClock: KronosClock? = null
Expand Down Expand Up @@ -155,8 +153,6 @@ internal class CoreFeature(
internal lateinit var storageDir: File
internal lateinit var androidInfoProvider: AndroidInfoProvider

internal val featuresContext: MutableMap<String, Map<String, Any?>> = ConcurrentHashMap()

internal val appStartTimeNs: Long
get() = appStartTimeProvider.appStartTimeNs

Expand Down Expand Up @@ -232,7 +228,6 @@ internal class CoreFeature(
prepareNdkCrashData(nativeSourceOverride)
setupInfoProviders(appContext, consent)
initialized.set(true)
contextProvider = DatadogContextProvider(this)
}

fun stop() {
Expand Down Expand Up @@ -262,12 +257,9 @@ internal class CoreFeature(
)
}

featuresContext.clear()

initialized.set(false)
ndkCrashHandler = NoOpNdkCrashHandler()
trackingConsentProvider = NoOpConsentProvider()
contextProvider = NoOpContextProvider()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ import com.datadog.android.api.context.ProcessInfo
import com.datadog.android.api.context.TimeInfo
import java.util.concurrent.TimeUnit

internal class DatadogContextProvider(val coreFeature: CoreFeature) : ContextProvider {
internal class DatadogContextProvider(
private val coreFeature: CoreFeature,
private val featureContextProvider: FeatureContextProvider
) : ContextProvider {
override val context: DatadogContext
get() {
// IMPORTANT All properties should be immutable and be frozen at the state
Expand Down Expand Up @@ -64,19 +67,13 @@ internal class DatadogContextProvider(val coreFeature: CoreFeature) : ContextPro
// Values at the top 2 levels are frozen: feature-name key,
// and feature-specific-name key.
featuresContext = mutableMapOf<String, Map<String, Any?>>().apply {
val source = coreFeature.featuresContext
source.forEach { (key, value) ->
this[key] = value.toMap()
featureContextProvider.getFeaturesContexts().forEach {
val value = it.second()
if (value.isNotEmpty()) {
this[it.first] = value.toMap()
Comment thread
0xnm marked this conversation as resolved.
}
}
}
)
}

override fun setFeatureContext(feature: String, context: Map<String, Any?>) {
coreFeature.featuresContext[feature] = context
}

override fun getFeatureContext(feature: String): Map<String, Any?> {
return coreFeature.featuresContext[feature] ?: emptyMap()
}
}
Loading