From 5778398d759e24dbd38d6d790ca94a86cac74d75 Mon Sep 17 00:00:00 2001 From: Anna Powolny Date: Tue, 1 Oct 2024 07:31:27 -0700 Subject: [PATCH] Clear event handlers and triggers Summary: Adding QE for clearing event handlers and triggers when we release component tree. Reviewed By: adityasharat Differential Revision: D63632467 fbshipit-source-id: ac1d6344db06f0917850814a3e16bf620d88d0e8 --- .../src/main/java/com/facebook/litho/ComponentTree.java | 5 ++++- .../java/com/facebook/litho/EventHandlersController.kt | 5 +++++ .../src/main/java/com/facebook/litho/NestedLithoTree.kt | 7 ++++++- litho-core/src/main/java/com/facebook/litho/TreeState.kt | 5 +++++ .../com/facebook/litho/config/ComponentsConfiguration.kt | 3 +++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/litho-core/src/main/java/com/facebook/litho/ComponentTree.java b/litho-core/src/main/java/com/facebook/litho/ComponentTree.java index 32d856e24db..9048bf7d745 100644 --- a/litho-core/src/main/java/com/facebook/litho/ComponentTree.java +++ b/litho-core/src/main/java/com/facebook/litho/ComponentTree.java @@ -2466,6 +2466,9 @@ public void release() { if (mTreeState != null) { effectsHandler = mTreeState.getEffectsHandler(); + if (ComponentsConfiguration.clearEventHandlersAndTriggers) { + mTreeState.clearEventHandlersAndTriggers(); + } } else { effectsHandler = null; } @@ -2488,7 +2491,7 @@ public void release() { } mOnReleaseListeners = null; } - if (mTreeState != null) { + if (mTreeState != null && !ComponentsConfiguration.clearEventHandlersAndTriggers) { mTreeState.clearUnusedTriggerHandlers(); } } diff --git a/litho-core/src/main/java/com/facebook/litho/EventHandlersController.kt b/litho-core/src/main/java/com/facebook/litho/EventHandlersController.kt index 507e56d3871..6609e9a4f0f 100644 --- a/litho-core/src/main/java/com/facebook/litho/EventHandlersController.kt +++ b/litho-core/src/main/java/com/facebook/litho/EventHandlersController.kt @@ -137,4 +137,9 @@ class EventHandlersController { class DispatchInfoWrapper(val dispatchInfo: EventDispatchInfo) { var usedInCurrentTree: Boolean = false } + + @Synchronized + fun clear() { + _dispatchInfos.clear() + } } diff --git a/litho-core/src/main/java/com/facebook/litho/NestedLithoTree.kt b/litho-core/src/main/java/com/facebook/litho/NestedLithoTree.kt index d772797acbb..2d5d3413fb5 100644 --- a/litho-core/src/main/java/com/facebook/litho/NestedLithoTree.kt +++ b/litho-core/src/main/java/com/facebook/litho/NestedLithoTree.kt @@ -20,6 +20,7 @@ import android.view.View import androidx.annotation.UiThread import com.facebook.kotlin.compilerplugins.dataclassgenerate.annotation.DataClassGenerate import com.facebook.kotlin.compilerplugins.dataclassgenerate.annotation.Mode +import com.facebook.litho.config.ComponentsConfiguration import com.facebook.rendercore.SizeConstraints import com.facebook.rendercore.utils.ThreadUtils.assertMainThread @@ -111,7 +112,11 @@ object NestedLithoTree { fun LayoutState.cleanup() { treeState.effectsHandler.onDetached() - treeState.clearUnusedTriggerHandlers() + if (ComponentsConfiguration.clearEventHandlersAndTriggers) { + treeState.clearEventHandlersAndTriggers() + } else { + treeState.clearUnusedTriggerHandlers() + } } fun TreeState.enqueue(updates: List): TreeState { diff --git a/litho-core/src/main/java/com/facebook/litho/TreeState.kt b/litho-core/src/main/java/com/facebook/litho/TreeState.kt index e72a2a9a1ec..f01d98ac888 100644 --- a/litho-core/src/main/java/com/facebook/litho/TreeState.kt +++ b/litho-core/src/main/java/com/facebook/litho/TreeState.kt @@ -331,6 +331,11 @@ class TreeState { } } + fun clearEventHandlersAndTriggers() { + synchronized(eventTriggersContainer) { eventTriggersContainer.clear() } + eventHandlersController.clear() + } + fun clearUnusedTriggerHandlers() { synchronized(eventTriggersContainer) { eventTriggersContainer.clear() } } diff --git a/litho-core/src/main/java/com/facebook/litho/config/ComponentsConfiguration.kt b/litho-core/src/main/java/com/facebook/litho/config/ComponentsConfiguration.kt index 727d0519721..ae614e4a241 100644 --- a/litho-core/src/main/java/com/facebook/litho/config/ComponentsConfiguration.kt +++ b/litho-core/src/main/java/com/facebook/litho/config/ComponentsConfiguration.kt @@ -295,6 +295,9 @@ internal constructor( /** This config will enable logging of interactable components with 0 alpha */ @JvmField var isZeroAlphaLoggingEnabled: Boolean = false + /** This flag is used to enable clearing event handlers and triggers */ + @JvmField var clearEventHandlersAndTriggers: Boolean = false + /** * This method is only used so that Java clients can have a builder like approach to override a * configuration.