Commit Graph

17269 Commits

Author SHA1 Message Date
Héctor Ramos cf5addc2f5 Move Pods to react-native-github
Summary: Now that the Pods/ directory is excluded by ShipIt from GitHub, we can move the Pods/ directory into react-native-github.

Reviewed By: fkgozali

Differential Revision: D15944730

fbshipit-source-id: b8165abbb4e6fef5ad4311da3885187b84ad1b20
2019-06-26 10:05:37 -07:00
Valentin Shergin 543c5a0164 Fabric: ShadowNode::getMostRecentState()
Summary: In some cases, we cannot retrieve the "committed" state because no one state was mounted yet. The whole concept of "confirmed" or "legit at the moment" is kinda overstatement. The actual meaning of this is "the last vision of the state to which we advanced so far"; it does not have any relation to the actual "commit" phase or "mounting" process.

Reviewed By: sammy-SC

Differential Revision: D16002127

fbshipit-source-id: 95465e632525f873ae67f6db320a89562b62ba29
2019-06-26 10:05:34 -07:00
aamalric 00c8b3cd09 Prevent scrollView to scroll with dpad when scrollEnabled property is set to false. (#25309)
Summary:
ScrollView doesn't handle the scrollEnabled property using dpad. When set to false, the directionnal pad still allows to scroll in the view.

## Changelog

[ANDROID] [ADDED] - Prevent scrollView to scroll with dpad when scrollEnabled property is set to false.
Pull Request resolved: https://github.com/facebook/react-native/pull/25309

Test Plan:
Add P67680731 to Playground.js and start the Catalyst Android app:

```buck install -r catalyst```

Send the following adb commands to the device/emulator:

```adb shell input keyevent DPAD_RIGHT_LEFT```
```adb shell input keyevent DPAD_RIGHT_RIGHT```

Make sure the ScrollView doesn't scroll to the left and right.

Add ```horizontal={true}``` to ScrollView and send the following adb commands to the device/emulator:

```adb shell input keyevent DPAD_RIGHT_TOP```
```adb shell input keyevent DPAD_RIGHT_BOTTOM```

Make sure the ScrollView doesn't scroll to the top and bottom.

Reviewed By: mdvacca

Differential Revision: D15983785

Pulled By: makovkastar

fbshipit-source-id: 678cc801a168531d71c8651b986c99ecd9da400e
2019-06-26 10:05:33 -07:00
David Vacca 01d0cd540c Fix textDecorationLine in Fabric Android
Summary: This diff fixes ```textDecorationLine: 'line-through'``` in Fabric Android

Reviewed By: JoshuaGross

Differential Revision: D15989149

fbshipit-source-id: 907bb64abb247c3e32a56df7f87538dce1a08826
2019-06-26 10:05:33 -07:00
Ramanpreet Nara 90897a9f62 Prevent getLegacyCxxModule from being stripped
Summary: `ReactPackageTurboModuleManagerDelegate.getLegacyCxxModule` isn't called from Java. Therefore, ProGuard will strip this method to reduce code size. To prevent this, we need to add the `DoNotStrip` annotation to this method. This annotation isn't necessary for the `getModule` method, since `getModule` is used in `TurboModuleManager.getJavaModule`.

Reviewed By: fkgozali

Differential Revision: D15996432

fbshipit-source-id: d34a7d28f7678e2dfc917f52d5cacc286bc33a0a
2019-06-26 10:05:33 -07:00
Eli White 0a34fb78ab RN iOS: Support View Manager Commands that are strings
Summary:
Right now JS triggers a view manager command with the following code:

```
UIManager.dispatchViewManagerCommand(
  nullthrows(this.scrollResponderGetScrollableNode()),
  UIManager.getViewManagerConfig('RCTScrollView').Commands.scrollTo,
  [x || 0, y || 0, animated !== false],
);
```

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(
  nullthrows(this.scrollResponderGetScrollableNode()),
  'scrollTo',
  [x || 0, y || 0, animated !== false],
);
```

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

This is the same change as made for Android here: https://github.com/facebook/react-native/commit/3cae6fa950eed54bccccf61a28c0e85d5a004c6c

Reviewed By: PeteTheHeat

Differential Revision: D15983041

fbshipit-source-id: 6cb0f3001553d1f9d26e7e8fb5481e16fbca6847
2019-06-26 10:05:33 -07:00
dattc2 1dbc38ad93 make yoga threadsafe (#852)
Summary:
Continuing https://github.com/facebook/yoga/pull/791
nokia6686 is a former member of our team, so we are trying to pick up what he left and carry out the pull request.
# Solution
Improved from previous solution with jpap's suggestions.
2. Passing ```gDepth``` and ```gCurrentGenerationCount``` (renamed to **_depth_** and **_generationCount_** respectively) between function calls that stem from ```YGNodeCalculateLayout```.
In ```YGNodeCalculateLayout```, pass ```depth``` as value 0, to indicate the root depth.
Pull Request resolved: https://github.com/facebook/yoga/pull/852

Reviewed By: SidharthGuglani

Differential Revision: D15537450

Pulled By: davidaurelio

fbshipit-source-id: 338f51383591ba27702ebe759f6c47c2dede3530
2019-06-26 10:05:32 -07:00
Tim Yung 3c41e7387d RN: Cleanup PickerAndroid
Summary:
Cleans up the implementation of `AndroidPicker` and the Flow types for the native components to almost work with `codegenNativeComponent`.

The remaining blocker is that the `items` prop is an array of objects: https://fburl.com/km8uj8x2

Reviewed By: rickhanlonii

Differential Revision: D15805611

fbshipit-source-id: 34bea83db8dbaaf6eb23b00e73e0c7ce292e8a32
2019-06-26 10:05:32 -07:00
Kevin Gozali b1bf133d69 TM iOS: Move generated specs for OSS NativeModules to github
Summary:
Note: iOS only.

This spec file (.h/.mm) was generated via FB internal codegen tool for TurboModule. The tool itself is not yet ready to be opensourced, but at least the generated file is. The output is based on all the Flow types added via https://github.com/facebook/react-native/issues/24875.
This file can be used by each ObjC NativeModule to be TurboModule compliant.

Reviewed By: rickhanlonii

Differential Revision: D15978911

fbshipit-source-id: 9e97495287bc406e0ed0ccf89cf370753b538772
2019-06-26 10:05:32 -07:00
Kevin Gozali 3e65122113 Added RCTRequired utils for typesafety
Summary: This util is used for TurboModule codegen system - it's not used anywhere else for now.

Reviewed By: JoshuaGross

Differential Revision: D15971956

fbshipit-source-id: 3cb1c3df7fa96fd51d420abff1fbfd07b18fdae6
2019-06-26 10:05:31 -07:00
Ramanpreet Nara bbc6695afc Move TurboModuleManager initialization into createReactContext
Summary:
TurboModuleManager was initialized in `ReactInstanceManager.setupReactContext`, which is executed on the NativeModule thread after we call `ReactInstanceManager.createReactContext` on a new thread. `NativeModuleRegistry` is initialized in `ReactInstanceManager.createReactContext`, so if someone requests a TurboModule after `ReactInstanceManager.createReactContext` is called and before `ReactInstanceManager.setupReactContext` fully finishes executing, that TurboModule won't be found.

This diff moves TurboModuleManager initialization into `ReactInstanceManager.createReactContext`

Reviewed By: fkgozali

Differential Revision: D15978486

fbshipit-source-id: 734e83eced414e545fe275e9a124d0df35204c40
2019-06-26 10:05:31 -07:00
Rubén Norte f9ecce7440 Create RootTagContext and provide it in AppContainer
Summary:
We should remove all usages of React's legacy context API because it'll be removed from React at some point, it prevents some performance optimizations in updates and can cause conflicts between different context providers (like mixins).

This creates a new Context for `rootTag` (this granularity is intentional) so users that are consuming it via the legacy context API can start migrating away from it.

I didn't create a more generic context (like ReactRootContext, ReactApplicationContext) because having a more granular context makes it easier to track and remove it if we want to, and prevents re-rendering when users only care about certain values.

Reviewed By: rickhanlonii, cpojer

Differential Revision: D14941918

fbshipit-source-id: 7ceea62727d10a591367b7ed7c447309b286758d
2019-06-26 10:05:31 -07:00
Jonny Burger 759b67490e Remove log: Initializing <RCTCxxBridge: 0x7fded270fbf0> (#25381)
Summary:
When starting a React Native app, one gets to see the message in the image.
I propose to remove it, because it provides little information to the developer and is noisy.

![image](https://user-images.githubusercontent.com/1629785/60040707-dc42eb00-96b9-11e9-8dad-e771ff8cca5c.png)

```
Initializing <RCTCxxBridge: 0x7fded270fbf0> (parent: <RCTBridge: 0x600001b95570>, executor: (null))
```

## Changelog

[iOS] [Fixed] - Debug message was logging to the console
Pull Request resolved: https://github.com/facebook/react-native/pull/25381

Test Plan: -

Differential Revision: D15983841

Pulled By: cpojer

fbshipit-source-id: 27f7d25ee0c580640d03f0db9adcd3c2a205b270
2019-06-26 10:05:31 -07:00
Luis Miguel Alvarado c749eaf401 add warnings for DatePickerIOS and DatePickerAndroid (#25374)
Summary:
`DatePickerIOS` and `DatePickerAndroid` have been merged as part of Lean Core. See [repo](https://github.com/react-native-community/react-native-datetimepicker)

## Changelog

[General] [Deprecate] -  Warning for `DatePickerIOS` and `DatePickerAndroid`
Pull Request resolved: https://github.com/facebook/react-native/pull/25374

Test Plan: Warning prints when user imports `DatePickerIOS` or `DatePickerAndroid`

Differential Revision: D15983829

Pulled By: cpojer

fbshipit-source-id: dfa35e204bb133a1b8de67c25abaa4338b956901
2019-06-26 10:05:30 -07:00
James George d847163755 Minor fix (#25385)
Summary:
Updated the `code of conduct` within TOC in order to point to the respective section.

## Changelog

[General] [Fixed] - Minor markdown fix
Pull Request resolved: https://github.com/facebook/react-native/pull/25385

Test Plan: N/A

Differential Revision: D15983819

Pulled By: cpojer

fbshipit-source-id: 3530dce8a6be0b6d3bc411f03b37a0cd05da5f53
2019-06-26 10:05:30 -07:00
Valentin Shergin b491e8725a Fabric: ShadowNode::getCommitedState() does not crash now in case if there is no comited state
Summary: `Target` inside the Stage can be empty; in this case, we should not try to extract `ShadowNode` from it.

Reviewed By: JoshuaGross, mdvacca

Differential Revision: D15982479

fbshipit-source-id: 83a4bebadc88b59d7fe77acbdf07e8ce9f2f6be1
2019-06-26 10:05:30 -07:00
Marco Zandonadi 06de4e6fe6 Fixed duplicate symbol in RCTAnimatedImage.h
fbshipit-source-id: 4db59f986a35a62a8c72cd6bc508ec1688e7b11d
2019-06-26 09:47:10 -07:00
David Vacca beee546779 Reduce visibility of ReactChoreographer.postFrameCallbackOnChoreographer method
Summary: The method ReactChoreographer.postFrameCallbackOnChoreographer should be private and it should be called from a context that contains the lock mCallbackQueuesLock

Reviewed By: JoshuaGross

Differential Revision: D15891758

fbshipit-source-id: fedba0db663aade25dbad1ef7151df1e340e05f6
2019-06-24 19:08:39 -07:00
David Vacca 89bf3d8b38 Allow ReactChoreographer to execute a FrameCallback that removes another FrameCallback from the mCallbackQueues
Summary: This diff extends the ReactChoreographer to allow the execution of FrameCallbacks that removes another FrameCallback from the mCallbackQueues.

Reviewed By: ejanzer

Differential Revision: D15891759

fbshipit-source-id: 62bc2b6afac45c50ac18771b0821742b4f7fc10e
2019-06-24 19:08:39 -07:00
Eli White 2bd503285e Update View Config generator to create command methods
Summary:
Flow types like this:
```
interface NativeCommands {
  +hotspotUpdate: (viewRef: React.Ref<'RCTView'>, x: Int32, y: Int32) => void;
}

export const Commands = codegenNativeCommands<NativeCommands>();
```

get turned into this:

```
export const Commands = {
  hotspotUpdate(viewRef: React.Ref<'RCTView'>, x: number, y: number) {
    UIManager.dispatchViewCommand(
      findNodeHandle(viewRef),
      UIManager.getViewManagerConfig('RCTView').Commands.hotspotUpdate,
      [x, y]
    );
  }
}
```

Reviewed By: rickhanlonii

Differential Revision: D15953126

fbshipit-source-id: edbb91056347d021dd0683391c903b76f3d1c33f
2019-06-24 18:54:41 -07:00
Eli White 9ad60131ba Support parsing View Commands into the schema
Summary: The schema for these view commands is lifted wholesale from the schema for TurboModules: P67239314

Reviewed By: rickhanlonii

Differential Revision: D15943109

fbshipit-source-id: a0ccd4e47067b62970218df6a32527c15868c4a5
2019-06-24 18:54:41 -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
Valentin Shergin 4b8d07ebf3 Fabric: Fixed another crash in RCTImageComponentView (nulled event emitter)
Summary: This fixes a crash happened in Image component caused by a race between recycling a component and image loading event are being delivered asynchronously.

Reviewed By: mdvacca

Differential Revision: D15977418

fbshipit-source-id: ac6f4b3d2b995af2afd56e551380a32d0f14ab15
2019-06-24 18:34:30 -07:00
Valentin Shergin 970bd2c69c Fabric: Fixed a crash in RCTImageComponentView
Summary: The app crashed on assert which was not actually legit. See the comment in the code.

Reviewed By: JoshuaGross

Differential Revision: D15976177

fbshipit-source-id: 612bbbd510187ffdc86369aa943d4b652b748694
2019-06-24 17:21:42 -07:00
Dan Abramov 7d2a95d43d Syntax errors should dismiss redboxes
Summary: If you make a syntax error while there is a redbox while Fast Refresh is on, we should dismiss that redbox. Otherwise there is no way for you to tell why your code is not working.

Reviewed By: rickhanlonii

Differential Revision: D15970337

fbshipit-source-id: 1ca6c9a1b2269d198ae726d3b64e5c51506503db
2019-06-24 13:54:40 -07:00
Dan Abramov 0a17699fd5 Recover from render errors by remounting root
Summary: This updates the renderer and Fresh packages to pull in the new error handling behavior. The new feature is that roots that errored on last save get remounted after an edit. This allows much faster iteration in the Fast Refresh mode as you don't need to do a full reload after typos.

Reviewed By: bvaughn

Differential Revision: D15967396

fbshipit-source-id: 96a82e6a4e00a8cb636d7bca037a1a43552a4cd2
2019-06-24 13:54:40 -07:00
Dan Abramov cf7813a625 Downgrade "packager disconnected" to a warning
Summary:
If the error doesn't come in direct response to a user action, I think a redbox is too severe. I think we don't want to associate turning on Fast Refresh with a higher frequency of redboxes. So this downgrades these messages to warnings.

If you manually try to turn it off and on again, we'll still show a redbox to remind why it's not working.

Reviewed By: rickhanlonii, cpojer

Differential Revision: D15958952

fbshipit-source-id: bd144c98e87a9836871391ac583c268dca8009b3
2019-06-24 13:54:39 -07:00
Dan Abramov a52e6d1dbb Unify "Hot Reloading" and "Reload-on-Save" into "Fast Refresh"
Summary:
We have too many options in the Dev Menu, and they're really hard to pick from. They're also somewhat conflicting. This replaces two menu choices that have a similar purpose (faster iteration cycle) with one.

"Fast Refresh" tries to only update the affected modules, but falls back to doing a full reload if the update can't be handled by the React components.

If for some reason you prefer the "Reload-on-Save" behavior, please:

- Reach out to me so I can learn more about your use case.
- As a workaround, you can add `if (__DEV__) require.Refresh.forceFullRefresh = true` to your app's entry point to always do a full refresh.

Also note that I only removed the user-facing part of "Reload-on-Save". So if you have automation depending on it, that's gonna keep working.

I moved it above Systrace since it's a more generic feature.

As a total aside nit, I renamed "Enable Inspector" and "Disable Inspector" to "Show Inspector" and "Hide Inspector" because... that's what those options do, really.

Reviewed By: rickhanlonii

Differential Revision: D15958697

fbshipit-source-id: 20e856d56f661fe4d39b5ab47d8c44754bf70f67
2019-06-24 13:54:39 -07:00
Rick Hanlon 0cb512f536 Fix PullToRefresh onRefresh event
Summary: The onRefresh event is a DirectEvent not a BubblingEvent

Reviewed By: PeteTheHeat

Differential Revision: D15969475

fbshipit-source-id: 049a6ffc74306246e8dbc3acdce5b0b26e849fc7
2019-06-24 11:57:13 -07:00
Dan Abramov 08bfdfad67 Remove useless module.hot checks
Summary:
Since we always create `module.hot` objects, the `module.hot` checks were unnecessary. They give a false impression that we're checking for a Hot Reloading mode. However, they're just Flow refinements and always exist in DEV. I made that explicit by throwing early.

Similarly, I removed a `module.hot` check inside `setupReactRefresh`, as it is always truish in DEV.

Finally, I'm adding a new mechanism as an escape hatch. It lets you do:

```
if (__DEV__) {
  require.Refresh.forceFullRefresh = true;
}
```

in your entry point and opt into full refreshes on every edit. This sounds similar to "Reload-on-Save". That is because in the next diff, I plan to remove "Reload-on-Save" from user-visible options (but it'll stay for automated workflows).

So this workaround is intended for people who for one reason or another don't want to opt into Hot Reloading as an alternative. We'll need to talk to them and find out why.

Reviewed By: rickhanlonii

Differential Revision: D15958475

fbshipit-source-id: 674187ddf86a4e286dfae28f4182555a8b5d7396
2019-06-24 09:48:57 -07:00
Dan Abramov 1f04ff580d Make "Enable Hot Reloading" Instant
Summary:
As we saw in D15947985, and later traced down to D5623623, the `hot` option isn't used by Metro anymore. The relevant transforms _always_ run in DEV regardless of the option.

Given that, it doesn't make sense that enabling or disabling Hot Reloading forces a full refresh. This significantly raises the usage barrier because **currently, you might have to wait ~20 seconds (on a large app) to just start using Hot Reloading when you're already in the middle of some screen.** So you just end up not using it.

This diff changes enabling/disabling Hot Reloading to be _instant_.

Here's how it works:

1. Now we always send the necessary info to the client via the new `HMRClient.setup()` function. It creates a Metro HMR client instance, but only actually sets up the socket if Hot Reloading is on.

2. The "Enable Hot Reloading" menu no longer forces a reload. Instead, it calls `HMRClient.enable()` which lazily sets up a socket (at most once).

3. The "Disable Hot Reloading" menu also doesn't trigger a refresh now. Instead, it calls `HMRClient.disable()`. We don't actually tear down the socket here because it's a pain to deal with race conditions and such. Instead, we keep the connection — but we _ignore the updates_ that come in while we're disabled.

4. As a result, it is possible to enable and disable it many times during a single session. (Updates while disabled would be ignored — which has a risk of making your running app inconsistent — but I'd argue it's expected and is worth it. You can always save a particular file to force it to update once the mode is on.)

5. In order to support "ignoring" updates, Metro's `HMRClient` (not to be confused with RN's module) now supports a `shouldApplyUpdates` field. The RN module uses it to disable handling updates when the mode is off.

6. In case there is an error that makes hot reloading unavailable (such as the server disconnecting), we surface the error only if the mode is on. If the mode is off, we stash the error message in the `_hmrUnavailableReason` variable, and display it next time you try to enable Hot Reloading.

Reviewed By: rickhanlonii

Differential Revision: D15958160

fbshipit-source-id: 8256fc4d5c2c3f653a78edf13b8515a5671953e4
2019-06-24 09:48:56 -07:00
Sidharth Guglani 055b28b4f4 pass cachedLayout and cachedMeasure measures to plugin
Summary: Passing whether layout cache or measure cache was used or not

Reviewed By: davidaurelio

Differential Revision: D15920937

fbshipit-source-id: a6728e7af07ea228a285f824fbdfddc8130c5990
2019-06-24 08:35:34 -07:00
Sidharth Guglani 4332a28750 Move event NodeLayout to end of NodeLayout step
Summary:
Added event NodeLayoutEnd and this is being used now instead of NodeLayout
It will be used later to add more information about caches

Reviewed By: davidaurelio

Differential Revision: D15920935

fbshipit-source-id: c9f5e193bc8cc70d26ff5d84882d483c9b09f67d
2019-06-24 08:35:34 -07:00
Oleksandr Melnykov 79e506d154 Fix typo in JavaDoc for ReactScrollViewManager
Summary: This diff fixes a typo in the JavaDoc for ReactScrollViewManager.

Reviewed By: cpojer

Differential Revision: D15965028

fbshipit-source-id: 3506cdde21c8d00ab916455a2d9fa29772f35359
2019-06-24 07:33:44 -07:00
Samuel Susla df17ebfcfa Back out "[react-native][PR] [iOS] Add convert compatible of NSString for bridge message data"
Summary:
Original commit changeset: 4849a8e94141

# Problem:
This diff caused https://github.com/facebook/react-native/issues/25339.
It was converting non string values to strings whenever the conversion was available.

The original problem that this diff was trying to solve is described here -> https://twitter.com/estevao_lucas/status/1117572702083190785?s=215

# Solution introduced by this diff
This diff introduced a conversion. So for any value that was meant to be string but wasn't we would attempt to convert it. Which is not always wanted.

# Solution for problem in the twitter
I think we should improve the error message if incorrect type is being passed as a prop. However this isn't a problem if views are Flow typed.

Reviewed By: cpojer

Differential Revision: D15964298

fbshipit-source-id: 3d027a378561b87e7a9e89fc5e39dc6f359d8d22
2019-06-24 07:13:46 -07:00
Rick Hanlon 004a90b131 Generate UnimplementedNativeView
Summary: This component is only used in native (there are no JS paths to it). Currently, the schema is being used to generate the native code for this component. Here, we add the codegen types so we still generate the native code when the schemas are removed, but the view config will never be used

Reviewed By: cpojer

Differential Revision: D15960990

fbshipit-source-id: 08fd0155f603e45785520c49a3ea86e30b276f9c
2019-06-24 04:59:13 -07:00
Rick Hanlon 3bdba0e0dc Slider fromUser is required
Summary: This was a mismatch with the schema

Reviewed By: cpojer

Differential Revision: D15960977

fbshipit-source-id: 08a56ac404eb5d45c6363e4574bd3d7bacf3ca08
2019-06-24 04:59:13 -07:00
Rick Hanlon 940a7d5a51 s/PullToRefresh/PullToRefreshView
Summary: Renames PullToRefresh to PullToRefreshView to correct a previous mistake so that this matches the Schema file

Reviewed By: cpojer

Differential Revision: D15960975

fbshipit-source-id: 575e526df2efdfa260f3cbbb4b0764998a91ade0
2019-06-24 04:59:13 -07:00
Rick Hanlon aa89f908cb AndroidSwipeRefreshLayout is not interfaceOnly
Summary: I think this was just an oversight when adding the flow types (notice that this flag isn't in the schema file, and the interface is required for android)

Reviewed By: TheSavior

Differential Revision: D15960965

fbshipit-source-id: 116b289261fbcaaaff53cd657a91f03dc036fb98
2019-06-24 04:59:13 -07:00
Rick Hanlon 468c9f581f Fix native output without props
Summary: Fixes an issue with the native output of components without props and events (a trailing comma)

Reviewed By: cpojer

Differential Revision: D15960962

fbshipit-source-id: 315276ef01484546da43954e6fd879350e214006
2019-06-24 04:59:12 -07:00
Eric Lewis 3b67bfab1e Animated image improvements (#24822)
Summary:
The goal of this PR is to improve the pipeline currently used for displaying GIFs / animated images on iOS. It is achieved by not holding all of the decoded frames in memory at the same time, as well as happily releasing existing memory whenever possible. This code is a simplified version of what you would find in SDWebImage (it is nearly 1:1, with unsupported or uneeded things removed). By adopting this API, it also allows classes conforming to RCTImageURLLoader or RCTImageDataDecoder to return any decodable UIImages conforming to RCTAnimatedImage and have improvements to memory consumption. Because RCTAnimatedImage is just a subset of the SDAnimatedImage protocol, it also means that you can use SDWebImage easier with Image directly.

A nice to have would be progressive image loading, but is beyond scope for this PR. It would, however, touch most of these same parts.

## Changelog

[iOS] [Fixed] - Substantially lower chances of crashes from abundant GIF use
Pull Request resolved: https://github.com/facebook/react-native/pull/24822

Test Plan: TBD. (but i am running a version of this in my own app currently)

Reviewed By: shergin

Differential Revision: D15853479

Pulled By: sammy-SC

fbshipit-source-id: 969e0d458da9fa49453aee1dcdf51783c2a45067
2019-06-24 03:45:23 -07:00
Janic Duplessis 690e85db04 Use CALayers to draw text (#24387)
Summary:
The current technique we use to draw text uses linear memory, which means that when text is too long the UIView layer is unable to draw it. This causes the issue described [here](https://github.com/facebook/react-native/issues/19453). On an iOS simulator the bug happens at around 500 lines which is quite annoying. It can also happen on a real device but requires a lot more text.

To be more specific the amount of text doesn't actually matter, it is the size of the UIView that we use to draw the text. When we use `[drawRect:]` the view creates a bitmap to send to the gpu to render, if that bitmap is too big it cannot render.

To fix this we can use `CATiledLayer` which will split drawing into smaller parts, that gets executed when the content is about to be visible. This drawing is also async which means the text can seem to appear during scroll. See https://developer.apple.com/documentation/quartzcore/calayer?language=objc.

`CATiledLayer` also adds some overhead that we don't want when rendering small amount of text. To fix this we can use either a regular `CALayer` or a `CATiledLayer` depending on the size of the view containing the text. I picked 1024 as the threshold which is about 1 screen and a half, and is still smaller than the height needed for the bug to occur when using a regular `CALayer` on a iOS simulator.

Also found this which addresses the problem in a similar manner and took some inspiration from the code linked there https://github.com/GitHawkApp/StyledTextKit/issues/14#issuecomment-395234885

Fixes https://github.com/facebook/react-native/issues/19453

## Changelog

[iOS] [Fixed] - Use CALayers to draw text, fixes rendering for long text
Pull Request resolved: https://github.com/facebook/react-native/pull/24387

Test Plan:
- Added the example I was using to verify the fix to RNTester.
- Made sure all other examples are still rendering properly.
- Tested text selection

Reviewed By: shergin

Differential Revision: D15918277

Pulled By: sammy-SC

fbshipit-source-id: c45409a8413e6e3ad272be39ba527a4e8d349e28
2019-06-24 02:59:31 -07:00
Nate 8094377d32 Possible fix for #9023: Use View.INVISIBLE instead of View.GONE to hide ActivityIndicator (#25354)
Summary:
On Android, if the ActivityIndicator component is initially set to `animate={false}`, it does not display if later set to `true` (https://github.com/facebook/react-native/issues/9023)

For some reason, the layout width/height of the associated ProgressBar remains 0, despite the parent layout having the correct width/height:

![image](https://user-images.githubusercontent.com/590904/59955251-f8d2ef00-943d-11e9-8019-0977e19186b3.png)

I wasn't able to determine why this is the case, but I did notice that changing the visibility settings from `View.GONE` to `View.INVISIBLE` fixes the issue while not (as far as I can tell) having an impact on the React Native layout:

#### Before:

![before](https://user-images.githubusercontent.com/590904/59955177-a1cd1a00-943d-11e9-80da-876c99b7d5bf.gif)

#### After:

![after](https://user-images.githubusercontent.com/590904/59955183-a7c2fb00-943d-11e9-952b-892bdc23bd48.gif)

Using `View.INVISIBLE` appears to alleviate the issue.

This should fix https://github.com/facebook/react-native/issues/9023

## Changelog

[Android][fixed] - ActivityIndicator appears as expected when `animated={false}` is later set to `true`.
Pull Request resolved: https://github.com/facebook/react-native/pull/25354

Test Plan:
Link this branch to a new React native project with the following App.js class:

```javascript
import React, { Component } from "react";
import {
  StyleSheet,
  Text,
  Button,
  View,
  ActivityIndicator,
  TouchableHighlight
} from "react-native";

export default class App extends Component {
  constructor() {
    super();

    this.state = {
      show: false
    };
  }

  hide = () => {
    this.setState({ show: false });
  };

  show = () => {
    this.setState({ show: true });
  };

  render() {
    return (
      <View>
        <ActivityIndicator
          animating={this.state.show}
          size="large"
          style={styles.indicator}
        />

        <ActivityIndicator
          animating={this.state.show}
          size="small"
          style={styles.indicator}
        />

        <View style={{ flexDirection: "row" }}>
          <Button title="Hide" style={styles.button} onPress={this.hide} />
          <Button title="Show" style={styles.button} onPress={this.show} />
        </View>

        <Text>Showing ? {this.state.show.toString()}</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  indicator: {
    borderColor: "red",
    borderWidth: 1
  },
  button: {
    marginRight: 8
  }
});
```

Differential Revision: D15963366

Pulled By: cpojer

fbshipit-source-id: ee3df3fd84acbff342599dc6f4f4a391704876fa
2019-06-24 02:11:08 -07:00
Cameron Bourke 680abf2d56 Move to SegmentedControlIOS to use a generated view config
Summary:
## Context
Moving SegmentedControlIOS to use a generated view config.

 ---

It's worth mentioning that even though `RCTSegmentedControlNativeComponent` defines a different event type to that of `RCTView`. We currently do not have 100%  type safety for the event types in Paper. In other words, when an event for `onChange` in this case comes from the native side, it could potentially be shaped differently than what was typed in the native component file. This will be addressed in `Fabric`.
```
// RCTSegmentedControlNativeComponent.js
export type Event = $ReadOnly<{|
  value: Int32,
  selectedSegmentIndex: Int32,
|}>;
...
export type NativeProps = $ReadOnly<{|
  ...
  onChange?: ?(event: BubblingEvent<Event>) => mixed,
|}>
```
This means that in the view config diff, there will be a value of `none` for `bubblingEventTypes`

Reviewed By: rickhanlonii

Differential Revision: D15851692

fbshipit-source-id: 6653fe7a77e46afdd55808aa5a4df813b34d7f70
2019-06-24 02:03:31 -07:00
Robert Ying 58beaf02ec Fix regression of improper assets copy (revert #24518 #24778) (#25363)
Summary:
Pull requests https://github.com/facebook/react-native/issues/24518 #24778 make Gradle copy all **generated** assets and resources into `android/app/src/res`, which is a bad behavior, because `src/res` goes into version control and should hold only those **original** resource files.

These changes in https://github.com/facebook/react-native/issues/24518 #24778 were merged into 0.60.0-rc release and cause regression.

This pull request will:

- Revert pull requests https://github.com/facebook/react-native/issues/24518 #24778
- Close https://github.com/facebook/react-native/issues/25325

## Changelog

[Android] [Fixed] - Fix regression of improper assets copy (revert https://github.com/facebook/react-native/issues/24518 #24778)
Pull Request resolved: https://github.com/facebook/react-native/pull/25363

Test Plan: It is a revert pull request and the reverted script should work the same as it has in 0.59.x.

Differential Revision: D15963329

Pulled By: cpojer

fbshipit-source-id: 5619a318dbdb40e816e37b6e37d4fe32caa46e9e
2019-06-24 01:56:55 -07:00
Luis Miguel Alvarado a833778553 add warning for StatusBarIOS (#25350)
Summary:
`StatusBarIOS` has been merged with `StatusBar`. See [Implement a StatusBar frame API](https://github.com/facebook/react-native/pull/16478)

## Changelog

[General] [Deprecate] -  Warning for `StatusBarIOS`
Pull Request resolved: https://github.com/facebook/react-native/pull/25350

Test Plan: Warning prints when user imports `StatusBarIOS`

Differential Revision: D15963347

Pulled By: cpojer

fbshipit-source-id: 456a7f3ccb245bd89ad322d5a2649e3bf844ba24
2019-06-24 01:49:29 -07:00
Valentin Shergin 27b672993d Fabric: Unification of ShadowView's default constructor
Summary:
The previous version of a set of default values of `ShadowView`'s fields has a bug:
```
  ComponentName componentName = "";
```

Initalizing `char const *` with a string literal in .h file makes the default constructor of the object produces different values across binary units (because a pointer to empty string can be defined differently). Now it's just a null pointer.

Reviewed By: sammy-SC

Differential Revision: D15911452

fbshipit-source-id: 16bcfb5f78ea802c0833135c486e3fbb8b7acaa6
2019-06-23 21:33:18 -07:00
Valentin Shergin bca4e4c8a4 Fabric: Additional static asserts in Differentiator
Summary: I am about to change the definition of ShadowView a bit, so I think we need to ensure that we don't regress move semantic.

Reviewed By: JoshuaGross, sammy-SC

Differential Revision: D15911453

fbshipit-source-id: ce2cd4cb2375ecb76295948a1e9b5d2e7fb80f38
2019-06-23 21:33:18 -07:00
Rick Hanlon 58cd046bb4 Add types for modal
Summary: Adds codegen types and generated view config for Modal

Reviewed By: TheSavior

Differential Revision: D15905324

fbshipit-source-id: b430a782bf03f04b5b86757c58b39ddb28d6f06d
2019-06-23 10:03:54 -07:00
Dulmandakh 0af25a8ea5 bump fresco to 2.0.0, supports AndroidX (#25358)
Summary:
Bump Fresco to 2.0.0, which supports AndroidX. We should cherry-pick to 0.60 release, to support brown field apps but also native components.

## Changelog

[Android] [Changed] - Bump Fresco to 2.0.0, supports AndroidX
Pull Request resolved: https://github.com/facebook/react-native/pull/25358

Test Plan: CI is green, and RNTester builds and runs as expected.

Differential Revision: D15959443

Pulled By: mdvacca

fbshipit-source-id: 58ba2c3e4d1342014d6ea632cd865b4f413548d9
2019-06-22 23:37:10 -07:00