diff --git a/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerBinderConfiguration.java b/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerBinderConfiguration.java index e041e565ab5..fe9d911de86 100644 --- a/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerBinderConfiguration.java +++ b/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerBinderConfiguration.java @@ -54,6 +54,7 @@ public class RecyclerBinderConfiguration { ComponentsConfiguration.threadPoolConfiguration; @Nullable private RunnableHandler mChangeSetThreadHandler; private final boolean mIsReconciliationEnabled; + private final boolean mIsIncrementalMountEnabled; private final boolean mIsLayoutDiffingEnabled; private final boolean mPostToFrontOfQueueForFirstChangeset; private final int mEstimatedViewportCount; @@ -85,6 +86,7 @@ private RecyclerBinderConfiguration( boolean requestMountForPrefetchedItems, @Nullable RunnableHandler changeSetThreadHandler, boolean isReconciliationEnabled, + boolean isIncrementalMountEnabled, boolean isLayoutDiffingEnabled, boolean postToFrontOfQueueForFirstChangeset, @Nullable ComponentWarmer componentWarmer, @@ -104,6 +106,7 @@ private RecyclerBinderConfiguration( mEnableStableIds = enableStableIds; mChangeSetThreadHandler = changeSetThreadHandler; mIsReconciliationEnabled = isReconciliationEnabled; + mIsIncrementalMountEnabled = isIncrementalMountEnabled; mIsLayoutDiffingEnabled = isLayoutDiffingEnabled; mPostToFrontOfQueueForFirstChangeset = postToFrontOfQueueForFirstChangeset; mComponentWarmer = componentWarmer; @@ -177,6 +180,10 @@ public boolean isReconciliationEnabled() { return mIsReconciliationEnabled; } + public boolean isIncrementalMountEnabled() { + return mIsIncrementalMountEnabled; + } + public boolean isLayoutDiffingEnabled() { return mIsLayoutDiffingEnabled; } @@ -226,6 +233,8 @@ public static class Builder { private boolean mUseBackgroundChangeSets = SectionsConfiguration.useBackgroundChangeSets; @Nullable private RunnableHandler mChangeSetThreadHandler; private boolean mIsReconciliationEnabled = ComponentsConfiguration.isReconciliationEnabled; + private boolean mIsIncrementalMountEnabled = + !ComponentsConfiguration.isIncrementalMountGloballyDisabled; private boolean mIsLayoutDiffingEnabled = ComponentsConfiguration.isLayoutDiffingEnabled; private boolean mPostToFrontOfQueueForFirstChangeset; private @Nullable ComponentWarmer mComponentWarmer; @@ -249,6 +258,7 @@ private Builder(RecyclerBinderConfiguration configuration) { this.mUseBackgroundChangeSets = configuration.mUseBackgroundChangeSets; this.mChangeSetThreadHandler = configuration.mChangeSetThreadHandler; this.mIsReconciliationEnabled = configuration.mIsReconciliationEnabled; + mIsIncrementalMountEnabled = configuration.mIsIncrementalMountEnabled; this.mIsLayoutDiffingEnabled = configuration.mIsLayoutDiffingEnabled; this.mPostToFrontOfQueueForFirstChangeset = configuration.mPostToFrontOfQueueForFirstChangeset; @@ -386,6 +396,15 @@ public Builder isReconciliationEnabled(boolean isEnabled) { return this; } + public Builder isIncrementalMountEnabled(boolean isEnabled) { + if (ComponentsConfiguration.isIncrementalMountGloballyDisabled) { + mIsIncrementalMountEnabled = false; + } else { + mIsIncrementalMountEnabled = isEnabled; + } + return this; + } + public Builder isLayoutDiffingEnabled(boolean isEnabled) { mIsLayoutDiffingEnabled = isEnabled; return this; @@ -453,6 +472,7 @@ public RecyclerBinderConfiguration build() { mRequestMountForPrefetchedItems, mChangeSetThreadHandler, mIsReconciliationEnabled, + mIsIncrementalMountEnabled, mIsLayoutDiffingEnabled, mPostToFrontOfQueueForFirstChangeset, mComponentWarmer, diff --git a/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerCollectionComponentSpec.java b/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerCollectionComponentSpec.java index 80cc7bad315..8ba52b17885 100644 --- a/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerCollectionComponentSpec.java +++ b/litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerCollectionComponentSpec.java @@ -322,7 +322,7 @@ static void createInitialState( .hscrollAsyncMode(binderConfiguration.getHScrollAsyncMode()) .isCircular(binderConfiguration.isCircular()) .hasDynamicItemHeight(binderConfiguration.hasDynamicItemHeight()) - .incrementalMount(incrementalMount) + .incrementalMount(incrementalMount && binderConfiguration.isIncrementalMountEnabled()) .stickyHeaderControllerFactory(stickyHeaderControllerFactory) .componentsConfiguration(binderConfiguration.getComponentsConfiguration()) .isReconciliationEnabled(binderConfiguration.isReconciliationEnabled()) diff --git a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionLayout.kt b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionLayout.kt index 8134474117e..c45421da29a 100644 --- a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionLayout.kt +++ b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionLayout.kt @@ -19,6 +19,7 @@ package com.facebook.litho.widget.collection import androidx.annotation.Px import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.facebook.litho.config.ComponentsConfiguration import com.facebook.litho.sections.widget.GridRecyclerConfiguration import com.facebook.litho.sections.widget.ListRecyclerConfiguration import com.facebook.litho.sections.widget.RecyclerBinderConfiguration @@ -40,6 +41,8 @@ abstract class CollectionLayout( rangeRatio: Float? = null, useBackgroundChangeSets: Boolean = false, isReconciliationEnabled: Boolean = false, + isIncrementalMountEnabled: Boolean = + !ComponentsConfiguration.isIncrementalMountGloballyDisabled, hasDynamicItemHeight: Boolean = false, val canMeasureRecycler: Boolean = false, mainAxisWrapContent: Boolean = false, @@ -62,6 +65,7 @@ abstract class CollectionLayout( .wrapContent(mainAxisWrapContent) .useBackgroundChangeSets(useBackgroundChangeSets) .isReconciliationEnabled(isReconciliationEnabled) + .isIncrementalMountEnabled(isIncrementalMountEnabled) .shouldPreallocatePerMountContent(preallocationPerMountContentEnabled) .build()) .build() @@ -193,6 +197,7 @@ internal object CollectionLayouts { rangeRatio: Float? = null, useBackgroundChangeSets: Boolean = false, isReconciliationEnabled: Boolean = false, + isIncrementalMountEnabled: Boolean = true, spans: Int = 2, gapStrategy: Int = StaggeredGridLayoutManager.GAP_HANDLING_NONE, preallocationPerMountContentEnabled: Boolean, @@ -204,6 +209,7 @@ internal object CollectionLayouts { rangeRatio = rangeRatio, useBackgroundChangeSets = useBackgroundChangeSets, isReconciliationEnabled = isReconciliationEnabled, + isIncrementalMountEnabled = isIncrementalMountEnabled, preallocationPerMountContentEnabled = preallocationPerMountContentEnabled, ) { override fun createRecyclerConfigurationBuilder(): RecyclerConfiguration.Builder = diff --git a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionRecyclerSpec.kt b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionRecyclerSpec.kt index 0c894fd7384..0de2767105e 100644 --- a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionRecyclerSpec.kt +++ b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionRecyclerSpec.kt @@ -159,6 +159,7 @@ object CollectionRecyclerSpec { hasDynamicItemHeight(hasDynamicItemHeight()) componentsConfiguration(componentsConfiguration) isReconciliationEnabled(isReconciliationEnabled) + incrementalMount(isIncrementalMountEnabled) isLayoutDiffingEnabled(isLayoutDiffingEnabled) componentWarmer(componentWarmer) lithoViewFactory(lithoViewFactory) diff --git a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyStaggeredGrid.kt b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyStaggeredGrid.kt index 811b3fe9b4f..3c007e43ed4 100644 --- a/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyStaggeredGrid.kt +++ b/litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyStaggeredGrid.kt @@ -65,6 +65,7 @@ inline fun ResourcesScope.LazyStaggeredGrid( rangeRatio: Float? = null, useBackgroundChangeSets: Boolean = false, isReconciliationEnabled: Boolean = false, + isIncrementalMountEnabled: Boolean = true, childEquivalenceIncludesCommonProps: Boolean = true, overlayRenderCount: Boolean = false, alwaysDetectDuplicates: Boolean = false, @@ -82,6 +83,7 @@ inline fun ResourcesScope.LazyStaggeredGrid( rangeRatio = rangeRatio, useBackgroundChangeSets = useBackgroundChangeSets, isReconciliationEnabled = isReconciliationEnabled, + isIncrementalMountEnabled = isIncrementalMountEnabled, preallocationPerMountContentEnabled = preallocationPerMountContentEnabled, spans = spans, gapStrategy = gapStrategy),