Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fabric support for maintainVisibleContentPosition on Android #35994

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,16 @@ public void didScheduleMountItems(UIManager uiManager) {
mCurrentFrameNumber++;
}

@Override
public void willMountItems(UIManager uiManager) {
// noop
}

@Override
public void didMountItems(UIManager uiManager) {
// noop
}

// For FabricUIManager only
@Override
@UiThread
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,33 @@ public interface UIManagerListener {
/**
* Called right before view updates are dispatched at the end of a batch. This is useful if a
* module needs to add UIBlocks to the queue before it is flushed.
*
* This is called by Paper only.
*/
void willDispatchViewUpdates(UIManager uiManager);
/* Called right after view updates are dispatched for a frame. */
/**
* Called on UIThread right before view updates are executed.
*
* This is called by Fabric only.
*/
void willMountItems(UIManager uiManager);
/**
* Called on UIThread right after view updates are executed.
*
* This is called by Fabric only.
*/
void didMountItems(UIManager uiManager);
/**
* Called on UIThread right after view updates are dispatched for a frame. Note that this will be called
* for every frame even if there are no updates.
*
* This is called by Fabric only.
*/
void didDispatchMountItems(UIManager uiManager);
/* Called right after scheduleMountItems is called in Fabric, after a new tree is committed. */
/**
* Called right after scheduleMountItems is called in Fabric, after a new tree is committed.
*
* This is called by Fabric only.
*/
void didScheduleMountItems(UIManager uiManager);
}
Original file line number Diff line number Diff line change
Expand Up @@ -1202,6 +1202,20 @@ public Map<String, Long> getPerformanceCounters() {
}

private class MountItemDispatchListener implements MountItemDispatcher.ItemDispatchListener {
@Override
public void willMountItems() {
for (UIManagerListener listener : mListeners) {
listener.willMountItems(FabricUIManager.this);
}
}

@Override
public void didMountItems() {
for (UIManagerListener listener : mListeners) {
listener.didMountItems(FabricUIManager.this);
}
}

@Override
public void didDispatchMountItems() {
for (UIManagerListener listener : mListeners) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ private boolean dispatchMountItems() {
return false;
}

mItemDispatchListener.willMountItems();

// As an optimization, execute all ViewCommands first
// This should be:
// 1) Performant: ViewCommands are often a replacement for SetNativeProps, which we've always
Expand Down Expand Up @@ -299,6 +301,9 @@ private boolean dispatchMountItems() {
}
mBatchedExecutionTime += SystemClock.uptimeMillis() - batchedExecutionStartTime;
}

mItemDispatchListener.didMountItems();

Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);

return true;
Expand Down Expand Up @@ -415,6 +420,8 @@ private static void printMountItem(MountItem mountItem, String prefix) {
}

public interface ItemDispatchListener {
void willMountItems();
void didMountItems();
void didDispatchMountItems();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.facebook.react.bridge.UIManagerListener;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.uimanager.UIManagerHelper;
import com.facebook.react.uimanager.common.UIManagerType;
import com.facebook.react.uimanager.common.ViewUtil;
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasSmoothScroll;
import com.facebook.react.views.view.ReactViewGroup;
Expand Down Expand Up @@ -89,6 +90,14 @@ public void stop() {
* been updated.
*/
public void updateScrollPosition() {
// On Fabric this will be called internally in `didMountItems`.
if (ViewUtil.getUIManagerType(mScrollView.getId()) == UIManagerType.FABRIC) {
return;
}
updateScrollPositionInternal();
}

private void updateScrollPositionInternal() {
if (mConfig == null || mFirstVisibleView == null || mPrevFirstVisibleFrame == null) {
return;
}
Expand Down Expand Up @@ -169,6 +178,16 @@ public void run() {
});
}

@Override
public void willMountItems(UIManager uiManager) {
computeTargetView();
}

@Override
public void didMountItems(UIManager uiManager) {
updateScrollPositionInternal();
}

@Override
public void didDispatchMountItems(UIManager uiManager) {
// noop
Expand Down