diff --git a/e2e/android/app/build.gradle.kts b/e2e/android/app/build.gradle.kts index bf4bed9c9b..e56a988838 100644 --- a/e2e/android/app/build.gradle.kts +++ b/e2e/android/app/build.gradle.kts @@ -1,3 +1,5 @@ +import java.util.Properties + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) @@ -5,6 +7,13 @@ plugins { id("net.bytebuddy.byte-buddy-gradle-plugin") version "1.17.6" } +val localProperties = Properties().apply { + val localPropertiesFile = rootProject.file("local.properties") + if (localPropertiesFile.exists()) { + localPropertiesFile.inputStream().use { load(it) } + } +} + android { namespace = "com.example.androidobservability" compileSdk = 36 @@ -16,6 +25,22 @@ android { versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + buildConfigField( + "String", + "LAUNCHDARKLY_MOBILE_KEY", + "\"${localProperties.getProperty("launchdarkly.mobileKey", "")}\"" + ) + buildConfigField( + "String", + "OTLP_ENDPOINT", + "\"${localProperties.getProperty("launchdarkly.otlpEndpoint", "").ifEmpty { "https://otel.observability.app.launchdarkly.com:4318" }}\"" + ) + buildConfigField( + "String", + "BACKEND_URL", + "\"${localProperties.getProperty("launchdarkly.backendUrl", "").ifEmpty { "https://pub.observability.app.launchdarkly.com" }}\"" + ) } buildTypes { @@ -36,6 +61,7 @@ android { } buildFeatures { compose = true + buildConfig = true } packaging { resources { diff --git a/e2e/android/app/src/main/java/com/example/androidobservability/BaseApplication.kt b/e2e/android/app/src/main/java/com/example/androidobservability/BaseApplication.kt index 664735d349..8e9af9da28 100644 --- a/e2e/android/app/src/main/java/com/example/androidobservability/BaseApplication.kt +++ b/e2e/android/app/src/main/java/com/example/androidobservability/BaseApplication.kt @@ -1,6 +1,7 @@ package com.example.androidobservability import android.app.Application +import android.util.Log import android.widget.ImageView import com.launchdarkly.observability.api.ObservabilityOptions import com.launchdarkly.observability.client.TelemetryInspector @@ -18,13 +19,12 @@ import com.launchdarkly.sdk.android.LDConfig import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.common.Attributes import com.launchdarkly.observability.sdk.LDReplay +import com.launchdarkly.sdk.android.FeatureFlagChangeListener open class BaseApplication : Application() { companion object { - // TODO O11Y-376: Update this credential to be driven by env variable or gradle property - // Set LAUNCHDARKLY_MOBILE_KEY to your LaunchDarkly SDK mobile key. - const val LAUNCHDARKLY_MOBILE_KEY = "MOBILE_KEY_GOES_HERE" + const val LAUNCHDARKLY_MOBILE_KEY = BuildConfig.LAUNCHDARKLY_MOBILE_KEY } var observabilityOptions = ObservabilityOptions( @@ -32,6 +32,8 @@ open class BaseApplication : Application() { AttributeKey.stringKey("example"), "value" ), debug = true, + otlpEndpoint = BuildConfig.OTLP_ENDPOINT, + backendUrl = BuildConfig.BACKEND_URL, tracesApi = ObservabilityOptions.TracesApi.enabled(), metricsApi = ObservabilityOptions.MetricsApi.enabled(), instrumentations = ObservabilityOptions.Instrumentations( @@ -89,9 +91,22 @@ open class BaseApplication : Application() { LDClient.init(this@BaseApplication, ldConfig, context) telemetryInspector = observabilityPlugin.getTelemetryInspector() + flagEvaluation() + LDReplay.start() } + fun flagEvaluation() { + val flagKey = "feature1" + val value = LDClient.get().boolVariation(flagKey, false) + Log.i("flag", "sync ${flagKey} value= ${value}") + val listener = FeatureFlagChangeListener { + val newValue = LDClient.get().boolVariation(flagKey, false) + Log.i("flag", "listened ${flagKey} value= ${newValue}") + } + LDClient.get().registerFeatureFlagListener(flagKey, listener) + } + override fun onCreate() { super.onCreate() realInit()