Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidate and disambiguate version checking for load traces capability detection #1833

Merged
merged 1 commit into from
Jan 22, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ fun createActivityLoadEventEmitter(
autoTraceEnabled = autoTraceEnabled,
clock = clock,
)
return if (versionChecker.isAtLeast(VERSION_CODES.Q)) {
return if (hasPrePostEvents(versionChecker)) {
ActivityLoadEventEmitter(lifecycleEventEmitter)
} else {
LegacyActivityLoadEventEmitter(lifecycleEventEmitter)
Expand All @@ -45,6 +45,16 @@ fun createActivityLoadEventEmitter(
*/
fun traceInstanceId(activity: Activity): Int = activity.hashCode()

/**
* Determine if the current instance of the app will fire render events
*/
fun hasRenderEvent(versionChecker: VersionChecker) = versionChecker.isAtLeast(VERSION_CODES.Q)

/**
* Determine if the current instance of the app will pre and post lifecycle events
*/
fun hasPrePostEvents(versionChecker: VersionChecker) = versionChecker.isAtLeast(VERSION_CODES.Q)

/**
* Implementation that works with Android 10+ APIs
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.embrace.android.embracesdk.internal.capture.activity

import android.app.Application.ActivityLifecycleCallbacks
import android.os.Build
import io.embrace.android.embracesdk.internal.arch.schema.EmbType
import io.embrace.android.embracesdk.internal.spans.PersistableEmbraceSpan
import io.embrace.android.embracesdk.internal.spans.SpanService
Expand Down Expand Up @@ -105,7 +104,7 @@ class UiLoadTraceEmitter(
instanceId = instanceId,
timestampMs = timestampMs,
)
} else if (hasRenderEvent()) {
} else if (hasRenderEvent(versionChecker)) {
startChildSpan(
instanceId = instanceId,
timestampMs = timestampMs,
Expand Down Expand Up @@ -222,7 +221,7 @@ class UiLoadTraceEmitter(
private fun determineEndEvent(manualEnd: Boolean): TraceCompleteTrigger {
return if (manualEnd) {
TraceCompleteTrigger.MANUAL
} else if (hasRenderEvent()) {
} else if (hasRenderEvent(versionChecker)) {
TraceCompleteTrigger.RENDER
} else {
TraceCompleteTrigger.RESUME
Expand Down Expand Up @@ -266,8 +265,6 @@ class UiLoadTraceEmitter(
private fun traceCompleteTrigger(instanceId: Int): TraceCompleteTrigger? =
activeTraces[instanceId]?.traceCompleteTrigger

private fun hasRenderEvent(): Boolean = versionChecker.isAtLeast(Build.VERSION_CODES.Q)

private fun traceName(
activityName: String,
uiLoadType: UiLoadType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ internal class AppStartupTraceEmitter(

private val startupRecorded = AtomicBoolean(false)
private val dataCollectionComplete = AtomicBoolean(false)
private val endWithFrameDraw: Boolean = versionChecker.isAtLeast(VERSION_CODES.Q)
private val endWithFrameDraw: Boolean = startupHasRenderEvent(versionChecker)

override fun applicationInitStart(timestampMs: Long?) {
applicationInitStartMs = timestampMs ?: nowMs()
Expand Down Expand Up @@ -218,7 +218,7 @@ internal class AppStartupTraceEmitter(
}

val traceEndTimeMs: Long? =
if (versionChecker.isAtLeast(VERSION_CODES.Q)) {
if (endWithFrameDraw) {
firstFrameRenderedMs
} else {
startupActivityResumedMs
Expand Down Expand Up @@ -472,5 +472,7 @@ internal class AppStartupTraceEmitter(
} else {
null
}

fun startupHasRenderEvent(versionChecker: VersionChecker) = versionChecker.isAtLeast(VERSION_CODES.Q)
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package io.embrace.android.embracesdk.internal.injection

import android.os.Build
import android.os.Build.VERSION_CODES
import io.embrace.android.embracesdk.internal.Systrace
import io.embrace.android.embracesdk.internal.capture.activity.UiLoadDataListener
import io.embrace.android.embracesdk.internal.capture.activity.UiLoadTraceEmitter
import io.embrace.android.embracesdk.internal.capture.activity.createActivityLoadEventEmitter
import io.embrace.android.embracesdk.internal.capture.activity.hasRenderEvent
import io.embrace.android.embracesdk.internal.capture.crumbs.ActivityBreadcrumbTracker
import io.embrace.android.embracesdk.internal.capture.crumbs.PushNotificationCaptureService
import io.embrace.android.embracesdk.internal.capture.startup.AppStartupDataCollector
import io.embrace.android.embracesdk.internal.capture.startup.AppStartupTraceEmitter
import io.embrace.android.embracesdk.internal.capture.startup.AppStartupTraceEmitter.Companion.startupHasRenderEvent
import io.embrace.android.embracesdk.internal.capture.startup.StartupService
import io.embrace.android.embracesdk.internal.capture.startup.StartupServiceImpl
import io.embrace.android.embracesdk.internal.capture.startup.StartupTracker
import io.embrace.android.embracesdk.internal.capture.webview.EmbraceWebViewService
import io.embrace.android.embracesdk.internal.capture.webview.WebViewService
import io.embrace.android.embracesdk.internal.config.ConfigService
import io.embrace.android.embracesdk.internal.logging.EmbLogger
import io.embrace.android.embracesdk.internal.session.lifecycle.ActivityLifecycleListener
import io.embrace.android.embracesdk.internal.ui.FirstDrawDetector
import io.embrace.android.embracesdk.internal.utils.BuildVersionChecker
Expand Down Expand Up @@ -70,10 +71,11 @@ internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
StartupTracker(
appStartupDataCollector = appStartupDataCollector,
activityLoadEventEmitter = activityLoadEventEmitter,
drawEventEmitter = createFirstDrawDetector(
versionChecker = versionChecker,
logger = initModule.logger,
)
drawEventEmitter = if (startupHasRenderEvent(versionChecker)) {
FirstDrawDetector(logger = initModule.logger)
} else {
null
}
)
}

Expand All @@ -93,7 +95,11 @@ internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
if (uiLoadEventListener != null) {
createActivityLoadEventEmitter(
uiLoadEventListener = uiLoadEventListener,
firstDrawDetector = createFirstDrawDetector(versionChecker, initModule.logger),
firstDrawDetector = if (versionChecker.isAtLeast(VERSION_CODES.Q) && hasRenderEvent(versionChecker)) {
FirstDrawDetector(initModule.logger)
} else {
null
},
autoTraceEnabled = configService.autoDataCaptureBehavior.isUiLoadTracingTraceAll(),
clock = openTelemetryModule.openTelemetryClock,
versionChecker = versionChecker
Expand All @@ -102,11 +108,4 @@ internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
null
}
}

private fun createFirstDrawDetector(versionChecker: VersionChecker, logger: EmbLogger) =
if (versionChecker.isAtLeast(Build.VERSION_CODES.Q)) {
FirstDrawDetector(logger)
} else {
null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ internal class UiLoadExtTest {
}
start()
resume()
if (BuildVersionChecker.isAtLeast(Build.VERSION_CODES.Q)) {
if (hasRenderEvent(BuildVersionChecker)) {
drawEventEmitter.draw(activityController.get()) {
clock.tick(RENDER_DURATION)
}
Expand Down
Loading
Loading