Commit Graph

148 Commits

Author SHA1 Message Date
Samuel Susla e653cb06f8 Pass isRTL flag from FabricUIManager Fabric core
Summary:
Changelog: [Internal]

Send `isRTL` flag and `doLeftAndRightSwapInRTL`  flags from Java to Fabric Core.

Reviewed By: JoshuaGross, mdvacca

Differential Revision: D20776005

fbshipit-source-id: 946c239d9a11ebea958b0a6d04f2316b7cd77311
2020-04-01 08:39:53 -07:00
Joshua Gross b8664182da Remove allowDisablingImmediateExecutionOfScheduleMountItems feature flag
Summary:
No longer needed.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D20747684

fbshipit-source-id: a8077519b7670d72e23267b1c1423556ec97be3f
2020-03-30 16:50:41 -07:00
Joshua Gross b54257c628 Introduce early dispatch of ViewCommands in FabricUIManager
Summary:
Earlier this week I introduced a change in the old, non-Fabric renderer (D20378633 D20427803) that (gated behind a feature-flag) executes ViewCommands before all other types of commands, as a perf optimization and (I think) a potential fix for a category of race conditions.

I've added more details in comments here.

The Fabric renderer uses the same feature-flag that I introduced for the non-Fabric renderer.

Changelog: [Internal] Fabric

Reviewed By: mdvacca

Differential Revision: D20449186

fbshipit-source-id: bb3649f565f32c417a6247369902333989a043aa
2020-03-19 23:02:05 -07:00
Joshua Gross 7561adac77 Consolidate "dispatchMountItems" reentrancy prevention code, and retry code, in one function
Summary:
Simplifying the dispatchMountItems reentrance and retry logic.

Motivation: cleanup so I can work on dispatching ViewCommands before anything else.

Importantly, this gives us the properties that:
1) Only one function is responsible for calling dispatchMountItems
2) Only one function is responsible for deciding if we shouldn't call dispatchMountItems due to reentrance
3) Only one function is responsible for all cleanup
4) Only one function maintains all of the relevant flags (except dispatchPreMountItems... two total now, instead of 4 before)

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D20437035

fbshipit-source-id: 5370366790eb25f653bee6c1950e747458374a61
2020-03-19 23:02:04 -07:00
Joshua Gross c2de99662e Prevent reentrant dispatchMountItems calls
Summary:
Turns out that dispatchMountItems was reentrant, meaning that something (in particular, updateState) could cause mount items to be queued up which would then be executed synchronously, out-of-order, in the middle of the previous dispatchMountItems call.

We will continue to monitor this and see how often we're reentering: T63181639 and via any soft exceptions that are logged.

For context, there are currently three ways dispatchMountItems gets called: 1) On every UI Tick in the UI thread, in a loop; 2) via animations, via synchronouslyUpdateViewOnUIThread, which happens to fail a *lot* currently; 3) when there is a commit on the UI thread, like with a Java->C++ state update. We must account for reentrance and failure in all three cases and make sure the `mInDispatch` flag is reset after success or failure in all of those situations.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D20170160

fbshipit-source-id: 834f1d9b65000caa7f2eea4849e5e7951d2b6be6
2020-03-02 22:28:21 -08:00
David Vacca 8bc7ad605d Extend Fabric measure function to support attachment positions parameters
Summary:
This diff changes the Fabric measure API in order to support attachments parameters

changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D20087252

fbshipit-source-id: 20e1526aaa3695d38d0805416df8a32adb8296ad
2020-02-25 12:54:57 -08:00
David Vacca 6aea6256a6 Unify measure functions in Fabric Android
Summary:
Until now, there were two measure functions that differ in only one parameter (rootTag). The rootTag is used to use the context associated to the tag as part of the calculation of layout, otherwise it just uses the ReactApplicationContext.
This diff unifies both method into an unique method that

changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D20081281

fbshipit-source-id: b1f6a6cedbf78f36f36fd0f93407c23c6996d76b
2020-02-24 18:18:32 -08:00
Joshua Gross 5aae380f2d Differentiate between Fabric and non-Fabric UIManager logs
Summary:
Both the UIManagers use ReactConstants.TAG currently, so certain logs are ambiguous. Use FabricUIManager's tag instead for all logs to disambiguate.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D19945587

fbshipit-source-id: 0a9d62b5c0276688b2ad3acf8d893b523c26560a
2020-02-18 00:29:02 -08:00
David Vacca bc11e9c7f1 Expose getEventDispatcher() method into UIManager interface
Summary:
This diff promotes the UIManagerModule.getEventDispatcher() to the interface UIManager and it implements this method in FabricUIManager class.

Changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D18862862

fbshipit-source-id: 424f0e601ed1807dbd5d33048daf7dc3bb200dcd
2019-12-10 20:33:55 -08:00
David Vacca f0b6f8441b Expose SurfaceID as part ReactRootView
Summary:
This diff exposes the surfaceID as part of ReactRootView.

Changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D18474014

fbshipit-source-id: 98f651b211d3cc4df88c6b1eb257bc12129eff57
2019-11-15 17:28:12 -08:00
Joshua Gross 76f41a0578 Gate fix for T54997838 with a feature flag
Summary:
Gating fix for T54997838 behind a feature flag for experimentation.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D18534767

fbshipit-source-id: 5c0191c454fba6dd4a36d6e179959651ec197cac
2019-11-15 17:01:03 -08:00
Joshua Gross cc6b430c3a Annotate UIManager methods to document thread semantics
Summary:
Document which methods can be called on UI thread or ANY thread.

In the future we should see if we can use only `ThreadConfined` or the AndroidX annotations instead of using both / choosing between them at each site.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D18532542

fbshipit-source-id: 3b5406ea5035615a0ebf83484bf8ec0747a6b6f7
2019-11-15 17:01:02 -08:00
Joshua Gross ce226c1f28 Fix T54997838
Summary:
Fixes T54997838 by preventing any view mutations during `onMeasure` calls.

There might still be places where this is possible, but this is where I'm seeing all the crashes currently.

See comments in ReactRootView for why views were mutated during onMeasure.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D18518591

fbshipit-source-id: 1406af8a6b0bfcc86f4cc5b451b3967f312dfd85
2019-11-14 21:23:32 -08:00
David Vacca 94ba059679 Introduce the IS_DEVELOPMENT_ENVIRONMENT flag
Summary:
This diff introduces the flag IS_DEVELOPMENT_ENVIRONMENT that will be used in Fabric to control the logging of props, localData and state ONLY during development.
Using DEBUG mode to control the logging of this kind of data is not enough.

Changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D18290351

fbshipit-source-id: cf0824bd15b9f1c509bbb284b85761166099bc42
2019-11-04 10:52:28 -08:00
David Vacca 87e1734217 Add extra logging in FabricUIManager
Summary:
Easy diff to extend logging in FabricUIManager class

Changelog: Add extra logging in Fabric Android

Reviewed By: shergin

Differential Revision: D18277487

fbshipit-source-id: 387bdb4b237bdbdc0d65263c1f125ad5c9e26b18
2019-11-03 01:47:55 -07:00
David Vacca a1a56fe4e5 Add NonNull annotation to FabricUIManager API
Summary:
This diff annotates FabricUIManager class with NonNull annotations, this will help analysis of nullability plus improving integration with Kotlin clients

Changelog: Add NonNull annotation to FabricUIManager API

Reviewed By: JoshuaGross

Differential Revision: D18010917

fbshipit-source-id: 760ba04b78693cb184172c0fe613c7f808a49031
2019-10-25 15:11:53 -07:00
David Vacca a8ce2dcf89 Refactor logging of Fabric React Markers when running on the UI Thread
Summary:
This diff refactors the execution of the logging of Fabric React markers to be executed after the MountItems are executed on the UI Thred
Changelog: Improve logging of Fabric react markers

Reviewed By: JoshuaGross

Differential Revision: D18010920

fbshipit-source-id: e36306102d190119a89c16e660b855acab1528fe
2019-10-25 15:11:52 -07:00
David Vacca c5321e8514 Refactor the cancellation of DispatchUIFrameCallback
Summary:
This diff refactors the stopping of DispatchUIFrameCallback on FabricUIManager to make it thread safe

Changelog: Refactor the cancellation of dispatching of Mounting operations for Fabric

Reviewed By: JoshuaGross

Differential Revision: D18010922

fbshipit-source-id: 305bc65576698cb785a2a2308cbd03db4a9a97e4
2019-10-25 15:11:52 -07:00
Joshua Gross f8bf65b8fd Make sure FabricUIManager doesn't double-free Binding, or double-destroy itself
Summary:
While unlikely, in exceptional cases it's possible that `onCatalystInstanceDestroy` is called multiple times, especially since there's no restrictions as to which thread this is called on (currently it's only called on the JS thread from CatalystInstanceImpl) and no synchronization. Make sure it tears down cleanly if called multiple times, and report soft exceptions if that's detected.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D18001678

fbshipit-source-id: 4a7c37b5b3c2207ba1dd9c7d85690391f799518d
2019-10-19 02:30:08 -07:00
Andres Suarez aee88b6843 Tidy up license headers [3/n]
Summary: Changelog: [General] [Fixed] - License header cleanup

Reviewed By: yungsters

Differential Revision: D17952693

fbshipit-source-id: 8fcb8e58a2e04e7a3169f4d525bffc00835768e6
2019-10-16 10:06:34 -07:00
Joshua Gross 71d2c07c6e Unconditionally log when destroying FabricUIManager
Summary:
Unconditionally log when destroying FabricUIManager.

Changelog:
[[Internal]]

Reviewed By: mmmulani

Differential Revision: D17944621

fbshipit-source-id: 89f97ff966ae5b071eb0b50d888b41b264d9dab9
2019-10-16 00:19:34 -07:00
David Vacca c65267ca6f Allow update of state to receive null objects
Summary:
This diff changes updateState method to support null stateWrappers, before this method would crash with a NullPointerException, now it allows the null object to reach the view manager.

Changelog: Add support for update of nullable localState in Fabric

Reviewed By: JoshuaGross

Differential Revision: D17939651

fbshipit-source-id: c62555905e39f9e0db75b9e1d1b93f33d0560266
2019-10-15 18:52:26 -07:00
Joshua Gross fa1c2be387 Slightly more aggressive FabricUIManager teardown
Summary: Tear down FabricUIManager more aggressively. The rest of the ivars here we can't set to null (yet) because they're marked as final.

Reviewed By: mdvacca

Differential Revision: D17878342

fbshipit-source-id: a1c8ace2603750ac39c3d97e1aca6c486ba5fb79
2019-10-11 11:41:37 -07:00
Joshua Gross 7c20dc65d9 Add asserts and annotations for FabricUIManager UI-thread methods
Summary: These methods are (or should be) only called on the UI thread. Make those assumptions explicit.

Reviewed By: mdvacca

Differential Revision: D17865205

fbshipit-source-id: 9b3acf8f3215a07b1a667ced55e50e99a488de79
2019-10-10 22:01:10 -07:00
Joshua Gross 299eb9f440 Explicitly set mBinding to null in FabricUIManager
Summary: Although `mBinding` is unregistered which means the connection to the JNI-bridged Cxx object can be destructed, we still hold onto the `mBinding` Java object after unregistering. That doesn't seem desirable, I think we should just clear it out here for consistency.

Reviewed By: mdvacca

Differential Revision: D17865206

fbshipit-source-id: 1ad8643c48ba0b2d52620a7b8ebe8a52928648ef
2019-10-10 20:36:56 -07:00
Oleksandr Melnykov 299c984964 Pass surface ID to measure function in Java to retrieve themed Context
Summary:
We use `ViewManager.onMeasure` to perform measurements of Android views and pass the measured size back to Yoga. For Android in order to the report correct dimensions of a View, this View must be created using a Context that has a theme associated with it. Before, `onMeasure` only had ReactApplicationContext passed as the first parameter and ReactSwitch, for example, could not be measured correctly (because it uses the size of the thumb drawable, which is extracted from the current theme). This diff adds surfaceId as the first parameter of `FabricUIManager.measure`, so that we can retrieve ThemedReactContext and pass it to `ViewManager.onMeasure`.

The size of the Switch component is still incorrect, but at least the size reported back to Yoga is the same as in Paper. So there is more investigation necessary why this happens in Fabric. I will investigate and publish another diff with the fix.

Reviewed By: JoshuaGross, shergin

Differential Revision: D17625959

fbshipit-source-id: 48197a61240fb13042bef3e9f5d681acacc702fb
2019-10-03 03:15:20 -07:00
Joshua Gross 27fca36a9a Attempt to collate Remove/Delete mounting items
Summary:
Collapse many Remove/Delete mount items into a single batched item.

Since a delete is always preceded by a remove mountitem, we can batch these into one instruction. Since deletes tend to come in large blocks, it might make sense to batch many into a single instruction.

Reviewed By: mdvacca

Differential Revision: D17254631

fbshipit-source-id: abfd54cdb0bbb9a4c0880ec8e8bbd681367aecd4
2019-09-09 19:54:34 -07:00
Joshua Gross 21977f895a Log multi-line MountItems properly; log every MountItem in a BatchMountItem
Summary:
Log every item in a BatchMountItem. There's a lot of useful debug information being hidden there currently.

Changelog:
[Internal]

Reviewed By: mdvacca

Differential Revision: D17254629

fbshipit-source-id: c72f0aa8506059da5225ebead24d3f8ead5bdebd
2019-09-09 19:54:33 -07:00
Joshua Gross 898124541c Support sendAccessibilityEvent in Fabric
Summary: Support for `sendAccessibilityEvent` in the FabricUIManager.

Reviewed By: shergin

Differential Revision: D17142507

fbshipit-source-id: 5c131d7caa1e4189fd41ecfb558d0027394b6a15
2019-08-30 19:04:14 -07:00
Joshua Gross 44bfc4be44 Support for UpdatePaddingMountItem
Summary: Some views (TextInput!) need padding props.

Reviewed By: mdvacca

Differential Revision: D17081799

fbshipit-source-id: 4f5d6a139bb4dd878f90af0ed4a30fe3810e3429
2019-08-27 19:00:11 -07:00
David Vacca 0e067fd23b Implement JS Responder Handler in Fabric Android
Summary: This diff implements the JSResponderHandler in Fabric Android code

Reviewed By: JoshuaGross

Differential Revision: D16543438

fbshipit-source-id: 13680f77a5368e8ba1180383a5f9fb7d7330b90a
2019-08-02 16:38:45 -07:00
David Vacca 470ace0932 Expose JSResponderHandler API in Fabric UIManager
Summary:
This diff adds the new API required to implment JSResponderHandler in FabricUIManager
The new API differs from the old API, but since setJSResponder is called ONLY from JS it's not necessary to have this method as part of UIManager interface.

Reviewed By: JoshuaGross

Differential Revision: D16543440

fbshipit-source-id: ca4bd4c1e4df706cda0eb16798e01f3350558d06
2019-08-02 16:38:44 -07:00
Joshua Gross bf5e73e46c Always pass props and state to Create mount item
Summary: For Litho interop and to resolve T47926405, always pass props and state to Create mount item so that any ViewManager can create view instances with knowledge of initial props and state.

Reviewed By: mdvacca

Differential Revision: D16554082

fbshipit-source-id: 3b19a43347b0fa201a054eec60e82fb77cad3625
2019-07-29 18:15:03 -07:00
Emily Janzer 7244bae47d Rename addRootView to startSurface
Summary: I'm only renaming the new `addRootView` that I added (which takes the moduleName, and uses startSurfaceWithConstraints), since the other one implements the UIManager interface method that's shared with paper.

Reviewed By: shergin

Differential Revision: D16432425

fbshipit-source-id: 392af42690052551504676df776bac6d1a968785
2019-07-24 20:15:39 -07:00
Joshua Gross c075a240cd Granularly track perf of Fabric
Summary: Enable granular perf measurements under Fabric.

Reviewed By: mdvacca

Differential Revision: D16021797

fbshipit-source-id: c25a8f7cebf53abfcfc39c8f6d50900813214abb
2019-07-20 01:57:20 -07:00
Emily Janzer 305058178e Create binding for unmountComponentAtNode in bridgeless mode
Summary: Right now we register ReactFabric as a callable module with the bridge so that we can call `ReactFabric.unmountComponentAtNode` in `ReactInstanceManager.detachViewFromInstance`. In bridgeless mode we don't have callable modules, so I'm just setting a global variable that can be called from C++ instead. Using this in a new `unmount` method in FabricUIManager.

Reviewed By: shergin, mdvacca

Differential Revision: D16273720

fbshipit-source-id: 95edb16da6566113a58babda3ebdf0fc4e39f8b0
2019-07-18 14:14:57 -07:00
Emily Janzer 5f8c129f19 Remove unused removeRootView() method from FabricUIManager
Summary:
FabricUIManager.removeRootView() isn't currently used, removing it from the UIManager interface.

It looks like this is called from JS in paper renderers, but not Fabric, so we should be good to delete it.

Reviewed By: shergin, mdvacca

Differential Revision: D16275118

fbshipit-source-id: b8f3ae1dc7574ce17d8cc9e7fee72ef5dcc9b323
2019-07-17 11:05:33 -07:00
David Vacca b1b6501ac9 NIT: rename FabricUIManager.scheduleMountItems -> FabricUIManager.scheduleMountItem
Summary: The method FabricUIManager.scheduleMountItems receives only one MountItem, is makes more sense to be called FabricUIManager.scheduleMountItem

Reviewed By: JoshuaGross, makovkastar

Differential Revision: D16062749

fbshipit-source-id: a27063be33b644af83ede6a9198edbfb1c3296e1
2019-07-02 14:47:22 -07:00
David Vacca d07ab35bfb Expose LayoutDirection to Fabric android
Summary: This diff exposes LayoutDirection as part of UpdateLayoutMountItem

Reviewed By: JoshuaGross

Differential Revision: D16060521

fbshipit-source-id: 163bf2a0bdca62dcecb03a8aaa2f4bf595b18c8f
2019-07-02 14:47:21 -07:00
David Vacca 6eec39313d Deprecate receiveCommand method for INT commands
Summary:
This diff deprecates:

```
  public void receiveCommand(int reactTag, int commandId, Nullable ReadableArray commandArgs) {

```
in favor of:

```
  public void receiveCommand(int reactTag, String commandId, Nullable ReadableArray commandArgs) {
```

Reviewed By: JoshuaGross, TheSavior

Differential Revision: D16019254

fbshipit-source-id: 61efefe5d5c43f9b24b729f17229725b87b60a1f
2019-07-02 14:47:20 -07:00
David Vacca 59d85fbf0b Back out "[Fabric][Android] Force setConstraints to run in the JS Thread"
Summary: Original commit changeset: 6665a9388a6a

Reviewed By: fkgozali

Differential Revision: D15889338

fbshipit-source-id: 9acb13bc811446aae61bd9c91a9c427aa5bb0296
2019-07-02 14:47:20 -07:00
Oleksandr Melnykov 6c0f73b322 Format Java code in xplat/js/react-native-github
Summary:
This diff formats the Java class files inside xplat/js/react-native-github. Since google-java-format was enabled in D16071401 we want to codemode the existing code so that users don't have to deal with formatter lint noise at diff-time.

```arc f --paths-cmd 'hg files -I "**/*.java"'```

drop-conflicts

Reviewed By: cpojer

Differential Revision: D16071725

fbshipit-source-id: fc6e3852e45742c109f0c5ac4065d64201c74204
2019-07-02 04:16:46 -07:00
Eli White 3cae6fa950 RN Android: Support View Manager Commands that are strings
Summary:
Right now JS triggers a view manager command with the following code:

```
UIManager.dispatchViewManagerCommand(
  ReactNative.findNodeHandle(this),
  UIManager.getViewManagerConfig('RCTView').Commands.hotspotUpdate,
  [destX || 0, destY || 0],
);
```

As we want to get rid of calls to UIManager, we need to stop looking for the integer defined in native from JavaScript. We will be changing methods like this to be:

```
UIManager.dispatchViewManagerCommand(
  ReactNative.findNodeHandle(this),
  'hotspotUpdate',
  [destX || 0, destY || 0],
);
```

We need to support ints and Strings to be backwards compatible, but ints will be deprecated.

Reviewed By: shergin

Differential Revision: D15955444

fbshipit-source-id: d1c488975ae03404f8f851a7035b58a90ed34163
2019-06-24 18:47:16 -07:00
David Vacca 42e35b3b56 Add extra logs in FabricUIManager
Summary: This diff adds extra logging in FabricUIManager, this will be useful to debug production issues

Reviewed By: JoshuaGross

Differential Revision: D15907520

fbshipit-source-id: 94e16444af3c023b6c4837c4797404d3debe8e95
2019-06-21 11:52:56 -07:00
Emily Janzer 0d971f97d5 Fix weird formatting in FabricUIManager
Summary: I added this function in D15810990, not sure why lint didn't complain about this...

Reviewed By: zackargyle

Differential Revision: D15880129

fbshipit-source-id: 4d207ba26be46186dc3904c82d82a4a83d4d4eb7
2019-06-18 12:09:47 -07:00
David Vacca f43039da87 Force setConstraints to run in the JS Thread
Summary: This diff forces the method: scheduler.constraintSurfaceLayout to run on the JS thread.

Reviewed By: JoshuaGross

Differential Revision: D15845768

fbshipit-source-id: de2aa69f301770aaf6cb7c3f5670548a3b6110df
2019-06-17 21:42:28 -07:00
Emily Janzer 1de206f36f Pass layout constraints in to startSurface()
Summary: Scheduler.startSurface accepts LayoutConstraints and LayoutContext, but for some reason we don't use these on Android. This diff adds new methods to Binding and FabricUIManager to start a surface with the provided measurespecs. I created new methods to avoid affecting the functionality of any surfaces already using Fabric, but if we want this behavior everywhere then I can just add it to the existing `addRootView` and `startSurface`.

Reviewed By: JoshuaGross, shergin

Differential Revision: D15810990

fbshipit-source-id: 6cd9a58b125461f91253458905405298cfb723ce
2019-06-17 13:03:05 -07:00
David Vacca f95a21539a Create a ReactFeatureFlag to enabled logging in Fabric
Summary: Easy diff to create a ReactFeatureFlag to enabled logging in Fabric

Reviewed By: JoshuaGross

Differential Revision: D15803582

fbshipit-source-id: d735f24850bddf43c27b97d006100cbb8f0cc6e3
2019-06-14 02:52:55 -07:00
Joshua Gross b9d26bbb5b Enable debug FabricUIManager logging for everyone
Summary: Temporarily turn on debug FabricUIManager to gather diagnostics.

Reviewed By: mdvacca

Differential Revision: D15779389

fbshipit-source-id: b38c1a363dbbad9c7dcf6bdbc3f47aff1a834f2f
2019-06-12 07:41:26 -07:00
Emily Janzer 298f59c5d3 Use startSurface on Android
Summary:
We currently have two different codepaths for actually rendering a surface with Fabric on iOS and Android: on iOS we use Fabric's `UIManagerBinding.startSurface` to call `AppRegistry.runApplication`, but on Android we don't; instead we use the same codepath as paper, calling `ReactRootView.runApplication`.

This diff does a few different things:
1. Unify iOS and Android by removing the `#ifndef` for Android so that we call `startSurface` for both
2. Pass through the JS module name on Android so that this actually works (it currently passes in an empty string)
3. Remove the call to `ReactRootView.runApplication` for Fabric so that we don't end up doing this twice
4. Copy over some logic that we need from `ReactRootView.runApplication` (make sure that root layout specs get updated, and that content appeared gets logged)

Reviewed By: mdvacca

Differential Revision: D15501666

fbshipit-source-id: 5c96c8cf036261cb99729b1dbdff0f7c09a32d76
2019-05-28 12:23:00 -07:00