123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /*
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- #import "RCTScheduler.h"
- #import <react/debug/SystraceSection.h>
- #import <react/uimanager/ComponentDescriptorFactory.h>
- #import <react/uimanager/Scheduler.h>
- #import <react/uimanager/SchedulerDelegate.h>
- #import <React/RCTFollyConvert.h>
- #import "RCTConversions.h"
- using namespace facebook::react;
- class SchedulerDelegateProxy : public SchedulerDelegate {
- public:
- SchedulerDelegateProxy(void *scheduler) : scheduler_(scheduler) {}
- void schedulerDidFinishTransaction(MountingCoordinator::Shared const &mountingCoordinator) override
- {
- RCTScheduler *scheduler = (__bridge RCTScheduler *)scheduler_;
- [scheduler.delegate schedulerDidFinishTransaction:mountingCoordinator];
- }
- void schedulerDidRequestPreliminaryViewAllocation(SurfaceId surfaceId, const ShadowView &shadowView) override
- {
- // Does nothing.
- // Preemptive allocation of native views on iOS does not require this call.
- }
- void schedulerDidDispatchCommand(
- const ShadowView &shadowView,
- const std::string &commandName,
- const folly::dynamic args) override
- {
- RCTScheduler *scheduler = (__bridge RCTScheduler *)scheduler_;
- [scheduler.delegate schedulerDidDispatchCommand:shadowView commandName:commandName args:args];
- }
- void schedulerDidSetJSResponder(
- SurfaceId surfaceId,
- const ShadowView &shadowView,
- const ShadowView &initialShadowView,
- bool blockNativeResponder) override
- {
- // Does nothing for now.
- }
- void schedulerDidClearJSResponder() override
- {
- // Does nothing for now.
- }
- private:
- void *scheduler_;
- };
- @implementation RCTScheduler {
- std::shared_ptr<Scheduler> _scheduler;
- std::shared_ptr<SchedulerDelegateProxy> _delegateProxy;
- }
- - (instancetype)initWithToolbox:(facebook::react::SchedulerToolbox)toolbox
- {
- if (self = [super init]) {
- _delegateProxy = std::make_shared<SchedulerDelegateProxy>((__bridge void *)self);
- _scheduler = std::make_shared<Scheduler>(toolbox, _delegateProxy.get());
- }
- return self;
- }
- - (void)dealloc
- {
- _scheduler->setDelegate(nullptr);
- }
- - (void)startSurfaceWithSurfaceId:(SurfaceId)surfaceId
- moduleName:(NSString *)moduleName
- initialProps:(NSDictionary *)initialProps
- layoutConstraints:(LayoutConstraints)layoutConstraints
- layoutContext:(LayoutContext)layoutContext
- {
- SystraceSection s("-[RCTScheduler startSurfaceWithSurfaceId:...]");
- auto props = convertIdToFollyDynamic(initialProps);
- _scheduler->startSurface(surfaceId, RCTStringFromNSString(moduleName), props, layoutConstraints, layoutContext);
- _scheduler->renderTemplateToSurface(
- surfaceId, props.getDefault("navigationConfig").getDefault("initialUITemplate", "").getString());
- }
- - (void)stopSurfaceWithSurfaceId:(SurfaceId)surfaceId
- {
- SystraceSection s("-[RCTScheduler stopSurfaceWithSurfaceId:]");
- _scheduler->stopSurface(surfaceId);
- }
- - (CGSize)measureSurfaceWithLayoutConstraints:(LayoutConstraints)layoutConstraints
- layoutContext:(LayoutContext)layoutContext
- surfaceId:(SurfaceId)surfaceId
- {
- SystraceSection s("-[RCTScheduler measureSurfaceWithLayoutConstraints:]");
- return RCTCGSizeFromSize(_scheduler->measureSurface(surfaceId, layoutConstraints, layoutContext));
- }
- - (void)constraintSurfaceLayoutWithLayoutConstraints:(LayoutConstraints)layoutConstraints
- layoutContext:(LayoutContext)layoutContext
- surfaceId:(SurfaceId)surfaceId
- {
- SystraceSection s("-[RCTScheduler constraintSurfaceLayoutWithLayoutConstraints:]");
- _scheduler->constraintSurfaceLayout(surfaceId, layoutConstraints, layoutContext);
- }
- - (ComponentDescriptor const *)findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN:(ComponentHandle)handle
- {
- return _scheduler->findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN(handle);
- }
- - (MountingCoordinator::Shared)mountingCoordinatorWithSurfaceId:(SurfaceId)surfaceId
- {
- return _scheduler->findMountingCoordinator(surfaceId);
- }
- @end
|