Skip to content

Commit 4912958

Browse files
zeyapfacebook-github-bot
authored andcommitted
synchronouslyUpdateViewOnUIThread on UIManager (#50379)
Summary: Pull Request resolved: #50379 ## Changelog: [Android] [Added] - Allow invoking `synchronouslyUpdateViewOnUIThread` from c++ via `UIManager` implementation is provided by SchedulerDelegate on the platform Reviewed By: javache Differential Revision: D71648772 fbshipit-source-id: bba0f7e9e2deafd074d28ff5cece6b7738c4d123
1 parent 97324ab commit 4912958

9 files changed

Lines changed: 46 additions & 0 deletions

File tree

packages/react-native/React/Fabric/RCTScheduler.mm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ void schedulerDidSendAccessibilityEvent(const ShadowView &shadowView, const std:
6868
[scheduler.delegate schedulerDidSendAccessibilityEvent:shadowView eventType:eventType];
6969
}
7070

71+
void schedulerShouldSynchronouslyUpdateViewOnUIThread(facebook::react::Tag tag, const folly::dynamic &props) override
72+
{
73+
// Does nothing.
74+
// This delegate method is not currently used on iOS.
75+
}
76+
7177
private:
7278
void *scheduler_;
7379
};

packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,10 @@ void FabricUIManagerBinding::schedulerDidSetIsJSResponder(
620620
shadowView, isJSResponder, blockNativeResponder);
621621
}
622622

623+
void FabricUIManagerBinding::schedulerShouldSynchronouslyUpdateViewOnUIThread(
624+
Tag tag,
625+
const folly::dynamic& props) {}
626+
623627
void FabricUIManagerBinding::onAnimationStarted() {
624628
auto mountingManager = getMountingManager("onAnimationStarted");
625629
if (!mountingManager) {

packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ class FabricUIManagerBinding : public jni::HybridClass<FabricUIManagerBinding>,
120120
bool isJSResponder,
121121
bool blockNativeResponder) override;
122122

123+
void schedulerShouldSynchronouslyUpdateViewOnUIThread(
124+
Tag tag,
125+
const folly::dynamic& props) override;
126+
123127
void setPixelDensity(float pointScaleFactor);
124128

125129
void driveCxxAnimations();

packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,14 @@ void Scheduler::uiManagerDidSetIsJSResponder(
320320
}
321321
}
322322

323+
void Scheduler::uiManagerShouldSynchronouslyUpdateViewOnUIThread(
324+
Tag tag,
325+
const folly::dynamic& props) {
326+
if (delegate_ != nullptr) {
327+
delegate_->schedulerShouldSynchronouslyUpdateViewOnUIThread(tag, props);
328+
}
329+
}
330+
323331
void Scheduler::reportMount(SurfaceId surfaceId) const {
324332
uiManager_->reportMount(surfaceId);
325333
}

packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ class Scheduler final : public UIManagerDelegate {
9595
const ShadowNode::Shared& shadowNode,
9696
bool isJSResponder,
9797
bool blockNativeResponder) override;
98+
void uiManagerShouldSynchronouslyUpdateViewOnUIThread(
99+
Tag tag,
100+
const folly::dynamic& props) override;
98101

99102
#pragma mark - ContextContainer
100103
ContextContainer::Shared getContextContainer() const;

packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ class SchedulerDelegate {
6464
bool isJSResponder,
6565
bool blockNativeResponder) = 0;
6666

67+
virtual void schedulerShouldSynchronouslyUpdateViewOnUIThread(
68+
Tag tag,
69+
const folly::dynamic& props) = 0;
70+
6771
virtual ~SchedulerDelegate() noexcept = default;
6872
};
6973

packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,4 +690,12 @@ void UIManager::animationTick() const {
690690
}
691691
}
692692

693+
void UIManager::synchronouslyUpdateViewOnUIThread(
694+
Tag tag,
695+
const folly::dynamic& props) {
696+
if (delegate_ != nullptr) {
697+
delegate_->uiManagerShouldSynchronouslyUpdateViewOnUIThread(tag, props);
698+
}
699+
}
700+
693701
} // namespace facebook::react

packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class UIManager final : public ShadowTreeDelegate {
7070

7171
void animationTick() const;
7272

73+
void synchronouslyUpdateViewOnUIThread(Tag tag, const folly::dynamic& props);
74+
7375
/*
7476
* Provides access to a UIManagerBindging.
7577
* The `callback` methods will not be called if the internal pointer to

packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ class UIManagerDelegate {
5858
bool isJSResponder,
5959
bool blockNativeResponder) = 0;
6060

61+
/*
62+
* Synchronous view update.
63+
*/
64+
virtual void uiManagerShouldSynchronouslyUpdateViewOnUIThread(
65+
Tag tag,
66+
const folly::dynamic& props) = 0;
67+
6168
virtual ~UIManagerDelegate() noexcept = default;
6269
};
6370

0 commit comments

Comments
 (0)