Skip to content

feat: Optional Jet Compose#402

Merged
abelonogov-ld merged 33 commits intomainfrom
andrey/no-jet-compose
Feb 28, 2026
Merged

feat: Optional Jet Compose#402
abelonogov-ld merged 33 commits intomainfrom
andrey/no-jet-compose

Conversation

@abelonogov-ld
Copy link
Copy Markdown
Contributor

@abelonogov-ld abelonogov-ld commented Feb 27, 2026

Summary

  • Configure project so if customers didn't include Jet Compose library then it wasn't activated
  • Create flavor only XML Views test app

https://launchdarkly.atlassian.net/browse/O11Y-812


Note

Medium Risk
Touches session-replay masking traversal and dependency packaging; mistakes could break masking/Compose detection at runtime or introduce ClassNotFoundExceptions in non-Compose apps.

Overview
Makes Compose optional for the Android observability SDK. Compose UI dependencies are switched to compileOnly, and Compose masking helpers are split into a new ComposeMaskingAPI.kt so apps without Compose don’t pull in Compose UI artifacts.

Hardens runtime masking traversal when Compose isn’t present. MaskCollector now detects AbstractComposeView via reflection (cached) before traversing Compose nodes, avoiding direct type references when Compose UI isn’t on the classpath.

Updates the Android E2E app to exercise both UI stacks. Adds compose/noCompose product flavors with flavor-specific manifests and a new XML-based MainActivity/layout, adjusts dependencies accordingly, and updates CI to run :app:testComposeDebugUnitTest.

Written by Cursor Bugbot for commit 59b9e60. This will update automatically on new commits. Configure here.

Updated the class name from SessionReplayEventGenerator to RRWebEventGenerator for improved clarity and consistency. Adjusted the instantiation in SessionReplayExporter accordingly.
Updated the RRWebEventGenerator to improve the generation of incremental events. Introduced new constants for DOM elements and refined the state management for image nodes. The event generation now utilizes a more structured approach for adding and removing nodes, enhancing clarity and maintainability.
Modified the RRWebEventGenerator to use a constant for the image MIME type, ensuring consistency in data URL generation for incremental events. This change enhances maintainability and clarity in the codebase.
…natureManager

Updated the observability module to replace instances of CaptureEvent with the new ExportFrame class, enhancing the structure of exported frames. Introduced TileSignatureManager for improved tile-based signature computation. Adjusted related tests and export logic to accommodate these changes, ensuring consistency across the codebase.
Added CaptureManager class to facilitate capturing frames from the lowest visible window. This implementation includes functionality for emitting captured frames as ExportFrame objects, integrating session management, and applying masks for privacy. The new class enhances the observability module by providing a structured approach to frame capture, with future optimizations planned for capture quality and memory management.
Modified ExportDiffManager to accept ImageCaptureService.RawFrame instead of the previously defined RawFrame data class. This change streamlines the frame capture process and enhances integration with the ImageCaptureService, improving overall code clarity and maintainability. Additionally, removed the RawFrame data class from ExportDiffManager to reduce redundancy.
…ions

Modified the TileSignatureManager to accept separate width and height parameters for tile size during signature computation. This change enhances flexibility in tile processing and improves the accuracy of tile-based signatures. Additionally, updated the ExportDiffManager to utilize the new signature computation method, ensuring consistency across the observability module.
…roved state management

Updated the SessionReplayExporter to include a condition for forcing full captures based on canvas size and keyframe status. Refined the RRWebEventGenerator to manage node IDs and image handling more effectively, including the introduction of a new tile-based signature system. Adjusted the ExportFrame structure to utilize IntSize for original dimensions, enhancing clarity and consistency across the observability module.
…hashing and signature computation

Modified the TileSignature data class to include separate hashLo and hashHi values, enhancing the hashing mechanism. Updated the TileSignatureManager to support multiple compute methods with preferred tile dimensions and added convenience overloads for square tiles. Adjusted internal hashing logic to reduce collision probability and improved test cases to reflect changes in tile signature handling.
(cherry picked from commit 49e4fb9)
* main:
  chore: release main (#396)
  fix: Android span e2e tests (#397)
  fix: improve network response capture (#379)
  feat: initial upload of mobile-dotnet (#393)
  chore: release main (#394)
  fix: Fix event sorting in session replay export (#392)
  fix: Touch move event buffering using wrong clock and mismatched constants (#391)
## Summary

Fixes and removes ignore on span e2e tests. Flag Eval on the launch was
intervening with tests

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: changes are limited to the Android E2E test harness and test
annotations, with no impact on production SDK logic beyond skipping a
test-only span trigger during tests.
> 
> **Overview**
> Fixes flaky Android span E2E tests by preventing `BaseApplication`
from running `flagEvaluation()` during test runs (gated on `testUrl ==
null`), avoiding extra spans that interfered with assertions.
> 
> Re-enables previously ignored span-related E2E coverage by removing
`@Ignore` from several trace/export and sampling tests in
`DisablingConfigOptionsE2ETest` and `SamplingE2ETest`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
618e2b1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
* main:
  chore: release main (#400)
  fix: correct react native session replay build step (#399)
## Summary

Fixes and removes ignore on span e2e tests. Flag Eval on the launch was
intervening with tests

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: changes are limited to the Android E2E test harness and test
annotations, with no impact on production SDK logic beyond skipping a
test-only span trigger during tests.
> 
> **Overview**
> Fixes flaky Android span E2E tests by preventing `BaseApplication`
from running `flagEvaluation()` during test runs (gated on `testUrl ==
null`), avoiding extra spans that interfered with assertions.
> 
> Re-enables previously ignored span-related E2E coverage by removing
`@Ignore` from several trace/export and sampling tests in
`DisablingConfigOptionsE2ETest` and `SamplingE2ETest`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
618e2b1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ervability-sdk into andrey/tile-compression

* 'andrey/tile-compression' of github.com:launchdarkly/observability-sdk:
  chore: add CLAUDE.md (#398)
* andrey/tile-compression:
  fix: Android span e2e tests (#397)
  match unit test
  chore: add CLAUDE.md (#398)
  chore: release main (#400)
  fix: correct react native session replay build step (#399)
* main:
  feat: Android Incremental Image Diff compression (#390)
@abelonogov-ld abelonogov-ld requested a review from a team as a code owner February 27, 2026 23:35
Comment thread e2e/android/app/src/compose/AndroidManifest.xml Dismissed
Comment thread e2e/android/app/src/main/res/drawable/ic_launchdarkly_logo.xml Dismissed
Comment thread e2e/android/app/src/noCompose/AndroidManifest.xml Dismissed
Comment thread e2e/android/app/src/noCompose/res/layout/activity_main.xml Dismissed
Comment thread e2e/android/app/src/noCompose/res/layout/activity_main.xml Dismissed
@abelonogov-ld abelonogov-ld enabled auto-merge (squash) February 27, 2026 23:49
…ction

- Updated the MaskCollector class to cache the AbstractComposeView class reference using reflection, improving compatibility checks.
- Modified the traverseCompose method to accept a generic View instead of AbstractComposeView, ensuring type safety through casting.
- Adjusted child view traversal logic to work with the new structure, enhancing the overall robustness of the masking functionality.
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

@abelonogov-ld abelonogov-ld merged commit 8f3a671 into main Feb 28, 2026
24 checks passed
@abelonogov-ld abelonogov-ld deleted the andrey/no-jet-compose branch February 28, 2026 00:43
abelonogov-ld added a commit that referenced this pull request Feb 28, 2026
* main:
  feat: Optional Jet Compose (#402)
  feat: Android Incremental Image Diff compression (#390)
  chore: add CLAUDE.md (#398)
  chore: release main (#400)
  fix: correct react native session replay build step (#399)
  chore: release main (#396)
  fix: Android span e2e tests (#397)
  fix: improve network response capture (#379)

# Conflicts:
#	sdk/@launchdarkly/mobile-dotnet/.vscode/tasks.json
abelonogov-ld pushed a commit that referenced this pull request Feb 28, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>launchdarkly-observability-android: 0.27.0</summary>

##
[0.27.0](launchdarkly-observability-android-0.26.1...launchdarkly-observability-android-0.27.0)
(2026-02-28)


### Features

* Android Incremental Image Diff compression
([#390](#390))
([5ff93f6](5ff93f6))
* Optional Jet Compose
([#402](#402))
([8f3a671](8f3a671))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is
generating a summary for commit
bd91847. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants