Add Fragment Transactions
Description
In the light of #1810, we're still not really there yet with the Manual Screens API and only-spans, so this might be a interim solution to support single-activity apps and create transactions bound to scope automatically for our fragment integration. This has several tricky things to figure out:
- What is considered a screen when fragments are used?
- If androidx.navigation is used we could use our integration to create transaction whenever a route changes
- otherwise we could by default always create transaction and then provide a lambda/function to customize this behavior (e.g.
shouldCreateTx: (Fragment) -> Boolean
- If there's an active Activity transaction, should we keep it or should we replace it with the Fragment one?
- I think we should keep it and make the fragment integration create a span instead
- Should inherit most of the behavior from the ActivityLifecycleIntegration, so it would makes sense to commonize that code
- TTID/TTFD
- ...
- ViewPager?
Some more considerations:
- For ViewPager we could determine if a fragment is visible or not based on the
.getGlobalVisibleRect()API - If a fragment takes up most of the screen space, it's considered a "screen fragment"
- Add an option to enable this feature
- Keep the underlying APIs for generating screen txn generic, so we could use it for the manual screens API
Just leaving a note here that we had some recent interactions with customers that requested this
Let's also think about a way to split the Activity and Fragments span data in the UI, so that we can have slow/frozen frames separated between Activity and Fragment
One thing to consider: We should have a flag that disable Fragment tracing completely (even a new trace generation if perf is disabled), because RN is using Fragments for navigation sometimes, and we may be overriding their trace: https://github.com/getsentry/sentry-java/pull/4137#discussion_r1949378349