/// <summary> /// Instantiates a <see cref="UIManagerModule"/>. /// </summary> /// <param name="reactContext">The React context.</param> /// <param name="viewManagers">The view managers.</param> /// <param name="uiImplementationProvider">The UI implementation provider.</param> /// <param name="layoutActionQueue">The layout action queue.</param> public UIManagerModule( ReactContext reactContext, IReadOnlyList <IViewManager> viewManagers, UIImplementationProvider uiImplementationProvider, IActionQueue layoutActionQueue) : base(reactContext, layoutActionQueue) { if (viewManagers == null) { throw new ArgumentNullException(nameof(viewManagers)); } if (uiImplementationProvider == null) { throw new ArgumentNullException(nameof(uiImplementationProvider)); } if (layoutActionQueue == null) { throw new ArgumentNullException(nameof(layoutActionQueue)); } _eventDispatcher = new EventDispatcher(reactContext); _uiImplementation = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher); _moduleConstants = CreateConstants(viewManagers); _layoutActionQueue = layoutActionQueue; reactContext.AddLifecycleEventListener(this); }
/// <summary> /// Instantiates a <see cref="UIManagerModule"/>. /// </summary> /// <param name="reactContext">The React context.</param> /// <param name="viewManagers">The view managers.</param> /// <param name="uiImplementationProvider">The UI implementation provider.</param> /// <param name="window">The Framework Element.</param> public UIManagerModule( ReactContext reactContext, IReadOnlyList <IViewManager> viewManagers, UIImplementationProvider uiImplementationProvider, FrameworkElement window) : base(reactContext) { if (viewManagers == null) { throw new ArgumentNullException(nameof(viewManagers)); } if (uiImplementationProvider == null) { throw new ArgumentNullException(nameof(uiImplementationProvider)); } if (window == null) { throw new ArgumentNullException(nameof(window)); } _window = window; _eventDispatcher = new EventDispatcher(reactContext); _uiImplementation = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher); _moduleConstants = CreateConstants(viewManagers); reactContext.AddLifecycleEventListener(this); }
/// <summary> /// Instantiates a <see cref="UIManagerModule"/>. /// </summary> /// <param name="reactContext">The React context.</param> /// <param name="viewManagers">The view managers.</param> /// <param name="uiImplementationProvider">The UI implementation provider.</param> /// <param name="layoutActionQueue">The layout action queue.</param> /// <param name="options">Options for the <see cref="UIManagerModule"/>.</param> public UIManagerModule( ReactContext reactContext, IReadOnlyList <IViewManager> viewManagers, UIImplementationProvider uiImplementationProvider, IActionQueue layoutActionQueue, UIManagerModuleOptions options) : base(reactContext, layoutActionQueue) { if (viewManagers == null) { throw new ArgumentNullException(nameof(viewManagers)); } if (uiImplementationProvider == null) { throw new ArgumentNullException(nameof(uiImplementationProvider)); } if (layoutActionQueue == null) { throw new ArgumentNullException(nameof(layoutActionQueue)); } _eventDispatcher = new EventDispatcher(reactContext); _uiImplementation = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher); var lazyViewManagersEnabled = IsLazyViewManagersEnabled(options); _customDirectEvents = lazyViewManagersEnabled ? GetDirectEventTypeConstants() : new JObject(); _moduleConstants = CreateConstants(viewManagers, null, _customDirectEvents, IsLazyViewManagersEnabled(options)); _layoutActionQueue = layoutActionQueue; reactContext.AddLifecycleEventListener(this); }
public async Task UIManagerModule_CustomEvents_Constants() { var context = new ReactContext(); var viewManagers = new List<IViewManager>(); var uiImplementation = new UIImplementation(context, viewManagers); var module = await DispatcherHelpers.CallOnDispatcherAsync( () => new UIManagerModule(context, viewManagers, uiImplementation)); var constants = module.Constants; Assert.AreEqual("onSelect", constants.GetMap("customBubblingEventTypes").GetMap("topSelect").GetMap("phasedRegistrationNames").GetValue("bubbled")); Assert.AreEqual("onSelectCapture", constants.GetMap("customBubblingEventTypes").GetMap("topSelect").GetMap("phasedRegistrationNames").GetValue("captured")); Assert.AreEqual("onChange", constants.GetMap("customBubblingEventTypes").GetMap("topChange").GetMap("phasedRegistrationNames").GetValue("bubbled")); Assert.AreEqual("onChangeCapture", constants.GetMap("customBubblingEventTypes").GetMap("topChange").GetMap("phasedRegistrationNames").GetValue("captured")); Assert.AreEqual("onTouchStart", constants.GetMap("customBubblingEventTypes").GetMap("topTouchStart").GetMap("phasedRegistrationNames").GetValue("bubbled")); Assert.AreEqual("onTouchStartCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchStart").GetMap("phasedRegistrationNames").GetValue("captured")); Assert.AreEqual("onTouchMove", constants.GetMap("customBubblingEventTypes").GetMap("topTouchMove").GetMap("phasedRegistrationNames").GetValue("bubbled")); Assert.AreEqual("onTouchMoveCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchMove").GetMap("phasedRegistrationNames").GetValue("captured")); Assert.AreEqual("onTouchEnd", constants.GetMap("customBubblingEventTypes").GetMap("topTouchEnd").GetMap("phasedRegistrationNames").GetValue("bubbled")); Assert.AreEqual("onTouchEndCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchEnd").GetMap("phasedRegistrationNames").GetValue("captured")); Assert.AreEqual("onSelectionChange", constants.GetMap("customDirectEventTypes").GetMap("topSelectionChange").GetValue("registrationName")); Assert.AreEqual("onLoadingStart", constants.GetMap("customDirectEventTypes").GetMap("topLoadingStart").GetValue("registrationName")); Assert.AreEqual("onLoadingFinish", constants.GetMap("customDirectEventTypes").GetMap("topLoadingFinish").GetValue("registrationName")); Assert.AreEqual("onLoadingError", constants.GetMap("customDirectEventTypes").GetMap("topLoadingError").GetValue("registrationName")); Assert.AreEqual("onLayout", constants.GetMap("customDirectEventTypes").GetMap("topLayout").GetValue("registrationName")); }
public void UIManagerModule_ArgumentChecks() { var context = new ReactContext(); var viewManagers = new List<IViewManager>(); var uiImplementation = new UIImplementation(context, viewManagers); AssertEx.Throws<ArgumentNullException>( () => new UIManagerModule(context, null, uiImplementation), ex => Assert.AreEqual("viewManagers", ex.ParamName)); AssertEx.Throws<ArgumentNullException>( () => new UIManagerModule(context, viewManagers, null), ex => Assert.AreEqual("uiImplementation", ex.ParamName)); }
/// <summary> /// Instantiates a <see cref="UIManagerModule"/>. /// </summary> /// <param name="reactContext">The React context.</param> /// <param name="viewManagers">The view managers.</param> /// <param name="uiImplementation">The UI implementation.</param> public UIManagerModule( ReactContext reactContext, IReadOnlyList<IViewManager> viewManagers, UIImplementation uiImplementation) : base(reactContext) { if (viewManagers == null) throw new ArgumentNullException(nameof(viewManagers)); if (uiImplementation == null) throw new ArgumentNullException(nameof(uiImplementation)); _eventDispatcher = new EventDispatcher(reactContext); _uiImplementation = uiImplementation; _moduleConstants = CreateConstants(viewManagers); reactContext.AddLifecycleEventListener(this); }
public async Task UIManagerModule_Constants_ViewManagerOverrides() { var context = new ReactContext(); var viewManagers = new List<IViewManager> { new TestViewManager() }; var uiImplementation = new UIImplementation(context, viewManagers); var module = await DispatcherHelpers.CallOnDispatcherAsync( () => new UIManagerModule(context, viewManagers, uiImplementation)); var constants = module.Constants; Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetValue("otherSelectionChange")); Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetMap("topSelectionChange").GetValue("registrationName")); Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetMap("topLoadingStart").GetValue("foo")); Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetValue("topLoadingError")); }
/// <summary> /// Instantiates a <see cref="UIManagerModule"/>. /// </summary> /// <param name="reactContext">The React context.</param> /// <param name="viewManagers">The view managers.</param> /// <param name="uiImplementation">The UI implementation.</param> public UIManagerModule( ReactContext reactContext, IReadOnlyList <IViewManager> viewManagers, UIImplementation uiImplementation) : base(reactContext) { if (viewManagers == null) { throw new ArgumentNullException(nameof(viewManagers)); } if (uiImplementation == null) { throw new ArgumentNullException(nameof(uiImplementation)); } _eventDispatcher = new EventDispatcher(reactContext); _uiImplementation = uiImplementation; _moduleConstants = CreateConstants(viewManagers); reactContext.AddLifecycleEventListener(this); }
public void UpdateView(UIImplementation uiImplementation) { if (ConnectedViewTag == -1) { throw new InvalidOperationException("Node has not been attached to a view."); } var propsMap = new JObject(); foreach (var entry in _propMapping) { var node = _manager.GetNodeById(entry.Value); var styleNode = node as StyleAnimatedNode; var valueNode = default(ValueAnimatedNode); if (styleNode != null) { styleNode.CollectViewUpdates(propsMap); } else if ((valueNode = node as ValueAnimatedNode) != null) { propsMap.Add(entry.Key, valueNode.Value); } else { throw new InvalidOperationException( Invariant($"Unsupported type of node used in property node '{node.GetType()}'.")); } } // TODO: Reuse propsMap and stylesDiffMap objects - note that in // subsequent animation steps for a given node most of the time // will be creating the same set of props (just with different // values). We can take advantage on that and optimize the way we // allocate property maps (we also know that updating view props // doesn't retain a reference to the styles object). uiImplementation.SynchronouslyUpdateViewOnDispatcherThread( ConnectedViewTag, new ReactStylesDiffMap(propsMap)); }