ComposeFoundationFlags


This is a collection of flags which are used to guard against regressions in some of the "riskier" refactors or new feature support that is added to this module. These flags are always "on" in the published artifact of this module, however these flags allow end consumers of this module to toggle them "off" in case this new path is causing a regression.

These flags are considered temporary, and there should be no expectation for these flags be around for an extended period of time. If you have a regression that one of these flags fixes, it is strongly encouraged for you to file a bug ASAP.

Usage:

In order to turn a feature off in a debug environment, it is recommended to set this to false in as close to the initial loading of the application as possible. Changing this value after compose library code has already been loaded can result in undefined behavior.

class MyApplication : Application() {
    override fun onCreate() {
        ComposeFoundationFlags.SomeFeatureEnabled = false
        super.onCreate()
    }
}

In order to turn this off in a release environment, it is recommended to additionally utilize R8 rules which force a single value for the entire build artifact. This can result in the new code paths being completely removed from the artifact, which can often have nontrivial positive performance impact.

-assumevalues class androidx.compose.foundation.ComposeFoundationFlags {
    public static boolean SomeFeatureEnabled return false
}

Summary

Public properties

Boolean

With this flag enabled, androidx.compose.foundation.gestures.AnchoredDraggableState.targetValue correctly returns the androidx.compose.foundation.gestures.AnchoredDraggableState.currentValue when no androidx.compose.foundation.gestures.AnchoredDraggableState.anchoredDrag is in progress.

Cmn
Boolean

This flag controls performance optimizations related to androidx.compose.foundation.text.BasicTextField's internal calculations of the minimum and maximum height.

Cmn
Boolean

This flag controls performance optimizations related to androidx.compose.foundation.text.BasicTextField's internal min height calculations.

Cmn
Boolean

This flag controls performance optimizations related to squashing multiple modifiers responsible for providing default measurement of the androidx.compose.foundation.text.BasicTextField into one.

Cmn
Boolean

This flag controls whether androidx.compose.foundation.text.BasicTextField's formatted text features are enabled.

Cmn
Boolean

With this flag on, Pager will use androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow as the default prefetching strategy, instead of 1 item in the direction of the scroll.

Cmn
Boolean

This flag controls whether androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow checks if the number of visible items has changed across iterations without scroll deltas (such as when changing lookahead window sizes) and refills the cache window if needed.

Cmn
Boolean

This flag controls whether the legacy nodeOffset logic in DragGestureNode and IndirectPointerInputDragCycleDetector is disabled.

Cmn
Boolean

This flag controls whether the fix for velocity tracker usage in Draggable and related classes is enabled to a) properly track velocity per pointer and b) make sure to also take the pointer events into account that don't move at the beginning of the gesture in order to increase the stability of the computed velocity.

Cmn
Boolean

This flag controls the fix where draggable was ignoring and not consuming zero delta events.

Cmn
Boolean

Whether to support inherited text styles.

Cmn
Boolean

Disable minimum touch target expansion for inline links.

Cmn
Boolean

This flag controls whether it's possible to start selecting (via the mouse) text in a androidx.compose.foundation.text.selection.SelectionContainer by dragging from the areas between the text selectables.

Cmn
Boolean

With this flag on, androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow will support multi-lane configurations.

Cmn
Boolean

Whether to use the new context menu API and default implementations in SelectionContainer, and all BasicTextFields.

Cmn
Boolean

Selecting flag to enable the use of new PausableComposition in lazy layout prefetch.

Cmn
Boolean

This flag controls whether androidx.compose.foundation.lazy.grid.LazyGrid prefers using the default androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow over androidx.compose.foundation.lazy.grid.LazyGridPrefetchStrategy.

Cmn
Boolean

This flag controls a fix in the lazy layout prefetch scheduler's idle detection.

Cmn
Boolean

This flag controls the fix where we correctly dispatch deltas in pager's default pageNestedScrollConnection by considering the role of reverse layout.

Cmn
Boolean

This flag controls whether selecting text in androidx.compose.foundation.text.selection.SelectionContainer causes scrollable ancestors of the text to be scrolled when the selecting pointer is dragged outside the scrollable's viewport.

Cmn
Boolean

Whether to use the new smart selection feature in androidx.compose.foundation.text.selection.SelectionContainer and all androidx.compose.foundation.text.BasicTextFields.

Cmn
Boolean

With this flag enabled, androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGrid layouts will make use of a cache window, either a default cache window or the cache window provided by the user via the composable function arguments.

Cmn

Public properties

isAnchoredDraggableTargetValueCalculationFixEnabled

var isAnchoredDraggableTargetValueCalculationFixEnabledBoolean

With this flag enabled, androidx.compose.foundation.gestures.AnchoredDraggableState.targetValue correctly returns the androidx.compose.foundation.gestures.AnchoredDraggableState.currentValue when no androidx.compose.foundation.gestures.AnchoredDraggableState.anchoredDrag is in progress. Previously, androidx.compose.foundation.gestures.AnchoredDraggableState.targetValue incorrectly returned the last-inserted anchor when there were two or more anchors with the same offset, for example: DraggableAnchors { Expanded at 100f; HalfExpanded at 0f; Hidden at 0f;} Disabling the flag restores this previous behavior.

isBasicTextFieldHeightInLinesOptimizationEnabled

var isBasicTextFieldHeightInLinesOptimizationEnabledBoolean

This flag controls performance optimizations related to androidx.compose.foundation.text.BasicTextField's internal calculations of the minimum and maximum height.

isBasicTextFieldMinSizeOptimizationEnabled

var isBasicTextFieldMinSizeOptimizationEnabledBoolean

This flag controls performance optimizations related to androidx.compose.foundation.text.BasicTextField's internal min height calculations.

isBasicTextFieldSizeOptimizationEnabled

var isBasicTextFieldSizeOptimizationEnabledBoolean

This flag controls performance optimizations related to squashing multiple modifiers responsible for providing default measurement of the androidx.compose.foundation.text.BasicTextField into one.

isBasicTextFieldStyledTextEnabled

var isBasicTextFieldStyledTextEnabledBoolean

This flag controls whether androidx.compose.foundation.text.BasicTextField's formatted text features are enabled.

isCacheWindowForPagerEnabled

var isCacheWindowForPagerEnabledBoolean

With this flag on, Pager will use androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow as the default prefetching strategy, instead of 1 item in the direction of the scroll. The window used will be 1 view port AFTER the currently composed items, this includes visible and items composed through beyond bounds.

isCacheWindowLookaheadCheckEnabled

var isCacheWindowLookaheadCheckEnabledBoolean

This flag controls whether androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow checks if the number of visible items has changed across iterations without scroll deltas (such as when changing lookahead window sizes) and refills the cache window if needed.

isDragNodeOffsetDoubleCountingFixEnabled

var isDragNodeOffsetDoubleCountingFixEnabledBoolean

This flag controls whether the legacy nodeOffset logic in DragGestureNode and IndirectPointerInputDragCycleDetector is disabled. Previously, VelocityTracker used local coordinates, necessitating manual point adjustment tracking.

isDraggableVelocityTrackerFixEnabled

var isDraggableVelocityTrackerFixEnabledBoolean

This flag controls whether the fix for velocity tracker usage in Draggable and related classes is enabled to a) properly track velocity per pointer and b) make sure to also take the pointer events into account that don't move at the beginning of the gesture in order to increase the stability of the computed velocity.

isDraggableZeroDeltaConsumptionEnabled

var isDraggableZeroDeltaConsumptionEnabledBoolean

This flag controls the fix where draggable was ignoring and not consuming zero delta events. This caused issues with the gesture pickup feature. When this flag is enabled, zero delta events will be consumed (after a drag gesture has started).

isInheritedTextStyleEnabled

var isInheritedTextStyleEnabledBoolean

Whether to support inherited text styles. If enabled, text styles set by the styles API will be inherited by text composables contained in a style box.

isLinkMinimumTouchTargetSizeZeroEnabled

var isLinkMinimumTouchTargetSizeZeroEnabledBoolean

Disable minimum touch target expansion for inline links. Touch target expansion for multi-line links causes incorrect clicks on plain text on the same lines because it uses layout bounds (bounding box of multi-line path) instead of clipped shape.

isMouseSelectionBetweenTextEnabled

var isMouseSelectionBetweenTextEnabledBoolean

This flag controls whether it's possible to start selecting (via the mouse) text in a androidx.compose.foundation.text.selection.SelectionContainer by dragging from the areas between the text selectables.

isMultiLaneCacheWindowEnabled

var isMultiLaneCacheWindowEnabledBoolean

With this flag on, androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow will support multi-lane configurations.

isNewContextMenuEnabled

var isNewContextMenuEnabledBoolean

Whether to use the new context menu API and default implementations in SelectionContainer, and all BasicTextFields. If false, the previous context menu that has no public APIs will be used instead.

isPausableCompositionInPrefetchEnabled

var isPausableCompositionInPrefetchEnabledBoolean

Selecting flag to enable the use of new PausableComposition in lazy layout prefetch. This change allows us to distribute work we need to do during the prefetch better, for example we can only perform the composition for parts of the LazyColumn's next item during one ui frame, and then continue composing the rest of it in the next frames.

isPrefetchSchedulerLateFrameDetectionEnabled

var isPrefetchSchedulerLateFrameDetectionEnabledBoolean

This flag controls a fix in the lazy layout prefetch scheduler's idle detection. When enabled, it prevents the scheduler from incorrectly identifying an idle state when a frame is delayed longer than our idle detection threshold. If disabled, only the idle detection threshold will be used to determine if a frame is idle, which could lead to janky frames when scrolling.

isReverseLayoutNestedScrollConnectionInPagerFixEnabled

var isReverseLayoutNestedScrollConnectionInPagerFixEnabledBoolean

This flag controls the fix where we correctly dispatch deltas in pager's default pageNestedScrollConnection by considering the role of reverse layout.

isSelectionAutoScrollEnabled

var isSelectionAutoScrollEnabledBoolean

This flag controls whether selecting text in androidx.compose.foundation.text.selection.SelectionContainer causes scrollable ancestors of the text to be scrolled when the selecting pointer is dragged outside the scrollable's viewport.

isSmartSelectionEnabled

var isSmartSelectionEnabledBoolean

Whether to use the new smart selection feature in androidx.compose.foundation.text.selection.SelectionContainer and all androidx.compose.foundation.text.BasicTextFields.

isUsingCacheWindowInStaggeredGrids

var isUsingCacheWindowInStaggeredGridsBoolean

With this flag enabled, androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGrid layouts will make use of a cache window, either a default cache window or the cache window provided by the user via the composable function arguments.