Skip to content

Commit

Permalink
Consolidate and disambiguate version checking for load traces capabil…
Browse files Browse the repository at this point in the history
…ity detection (#1833)

## Goal

Split up and consolidate the logic to check whether the current API version fires pre and post lifecycle events and whether or not we we try to instrument rendering for UI Load events.

This is so that in a later PR, we can disable the rendering events without affecting everything else.

## Testing
Existing tests pass
  • Loading branch information
bidetofevil authored Jan 22, 2025
2 parents a5e334e + fc6d9ef commit c296d8d
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 93 deletions.
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

0 comments on commit c296d8d

Please sign in to comment.