Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The ART '<Surface>' becomes invisible in Android #17565

Closed
alwaysonlinetxm opened this issue Jan 12, 2018 · 28 comments
Closed

The ART '<Surface>' becomes invisible in Android #17565

alwaysonlinetxm opened this issue Jan 12, 2018 · 28 comments
Labels
Bug Help Wanted :octocat: Issues ideal for external contributors. Platform: Android Android applications. Ran Commands One of our bots successfully processed a command. Resolution: Locked This issue was locked by the bot. Resolution: PR Submitted A pull request with a fix has been provided.

Comments

@alwaysonlinetxm
Copy link

alwaysonlinetxm commented Jan 12, 2018

Is this a bug report?

Yes.

Have you read the Contributing Guidelines?

Yes.

Environment

Environment:
OS: macOS Sierra 10.12.6
Node: 8.4.0
Yarn: 1.3.2
Watchman: 4.9.0

Packages: (wanted => installed)
react-native: 0.50.1 => 0.50.1
react: 16.0.0 => 16.0.0

Target Platform: Android 7.1.1

Steps to Reproduce

  1. generate a pathh and draw if with ART, it works correctly on the first render;
  2. put the phone to sleep;
  3. awake the phone;
  4. the <Surface> area becomes invisable;

Expected Behavior

it should just look like same with the first render.

Actual Behavior

the <Surface> area becomes invisable;

Reproducible Demo

the main just like below:

<Surface width={ 300 } height={ 200 }>
  <Shape  d={ new Path()
      .moveTo(0, 0)
      .lineTo(0, 200)
      .lineTo(300, 200)
      .lineTo(300, 0)
      .close() } fill={ '#f00' } />
</Surface>
@cyuanyang
Copy link

me too. if you refresh ui ,it good work. how did you solve it?

@ardmn
Copy link

ardmn commented Feb 14, 2018

Same issues . I think the maintainers are have only iOS devices and don't want support android. I think they do work on react-native only because they likes write code on js for iOS.

@react-native-bot
Copy link
Collaborator

Thanks for posting this! It looks like you may not be using the latest version of React Native, v0.53.0, released on January 2018. Can you make sure this issue can still be reproduced in the latest version?

I am going to close this, but please feel free to open a new issue if you are able to confirm that this is still a problem in v0.53.0 or newer.

How to ContributeWhat to Expect from Maintainers

@react-native-bot react-native-bot added Ran Commands One of our bots successfully processed a command. Stale There has been a lack of activity on this issue and it may be closed soon. labels Feb 24, 2018
@stale stale bot removed the Stale There has been a lack of activity on this issue and it may be closed soon. label Feb 24, 2018
@nolan-m
Copy link

nolan-m commented Feb 26, 2018

I updated to React Native 0.53.3 and still have this issue.
I tried to call this.forceUpdate as a work around and still did not work.

@woowalker
Copy link

woowalker commented Mar 1, 2018

em, what i face is ,when i use animated on Surface, like
const AniSurface = Animated.createAnimatedComponent(Surface)
<AniSurface style={{transform: [{translateX: this.state.aniTransX}]}}/>
when the animation start the Surface panel invisible, all dark like
but, when i open the dev menu, and click Toggle Inspector, the Surface visible again
=====UPDATE 2018.03.05=====
set style backgroundColor on the top View(not always top View, but must parent View), the Surface always visible

@ghostrick
Copy link

ghostrick commented Mar 4, 2018

me too.
I call this.forceUpdate, But the situation is not improved.

@spaceye
Copy link

spaceye commented Mar 16, 2018

Same here. We ended up changing component's key value to force remount on active app state change and device rotation (AppState and Dimensions event listeners).

@anthony-skr
Copy link

I'm facing the same problem. I will probably use the same fix (like there bartgryszko/react-native-circular-progress@f198080).

I don't get why this issue has been closed... it makes ReactNative ART on Android unreliable.

@hramos hramos reopened this Mar 29, 2018
@hramos hramos added the Platform: Android Android applications. label Mar 29, 2018
@hramos hramos changed the title The '<Surface>' becomes invisable in Android The '<Surface>' becomes invisible in Android Mar 29, 2018
@patrickkempff
Copy link
Contributor

patrickkempff commented Apr 30, 2018

I am also having this problem, ended up using the AppState solution. This bug makes ART almost unusable on Android. I hope to investigate it a bit further next week when i have some spare time.

CC: @btegenbosch

@ghostrick
Copy link

I still have similar problems.
When will this problem be improved?
Also, what is the most effective solution? 🤔

@sophiebits
Copy link
Contributor

Results from an internal investigation here:

From API level 25 onwards the hardware layer is deleted with the below call stack

screenshot of call stack including TextureView destroyHardwareResources

Screen on -> TextureView's draw gets called --

boolean createNewSurface = (mSurface == null);
if (createNewSurface) {
// Create a new SurfaceTexture for the layer.
mSurface = new SurfaceTexture(false);
nCreateNativeWindow(mSurface);
}
mLayer.setSurfaceTexture(mSurface);

So, if there is a surface existing from before sleep, use that. A regular Textureview proceeds to draw on preexisting surface and has no problem.

In the case of ARTSurfaceView we are doing all the drawing here -

https://github.com/facebook/react-native/blob/v0.55.4/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java#L61

(Oh btw, Android says not to actually - Subclasses of TextureView cannot do their own rendering with the {@link Canvas} object.)

So, ARTSurfaceView is not aware of the whole sleep and destroy, there is no redraw after screen gets switched on and hence the blank screen.

It sounds like the best path forwards may be to switch from TextureView to SurfaceView since the latter appears intended for software drawing which is what we're doing (vs video/camera use cases recommended in TextureView docs).

It's not clear if we'll have time to work on this at FB soon but if someone in the community wants to try their hand at making the switch then that would be valuable towards getting this bug fixed.

cc @himabindugadupudi

@sophiebits sophiebits changed the title The '<Surface>' becomes invisible in Android The ART '<Surface>' becomes invisible in Android May 18, 2018
@AricWu
Copy link

AricWu commented May 24, 2018

Same issues , and I did a test on the latest ‘react-native-0.55’ that was not resolved. This problem directly led to my failure to use ART in my projects, but I found that a third-party framework 'react-native-svg' did not have this problem when used.

@hramos hramos added Core Team Help Wanted :octocat: Issues ideal for external contributors. labels May 24, 2018
@jh3141
Copy link

jh3141 commented Jun 6, 2018

Why was this closed again? AIUI the bug still exists in the latest version ...

@AricWu
Copy link

AricWu commented Jun 6, 2018

They write release notes say they have resolved it in 0.54.And I test the bug in react-native-0.54 ,0.55 ,still exists.

@sophiebits
Copy link
Contributor

The commit fixing it had to be reverted due to another bug. Hopefully we will be able to land it again for a permanent fix.

@sophiebits sophiebits reopened this Jun 6, 2018
@ap050492
Copy link

How to set click event of shape area in react native ?

I need write click event of particular Shape which draw using react native ART. How can i achieve this ?
can you please share your ideas or thought on this so can i worked on it.


sectionAngles.map(section => (
                <Group>                

                <TouchableWithoutFeedback                  
                  onPress={this.bindCallBackClick}>
                  <View>
                  <Shape
                    key={section.index}
                    d={path(section)}
                    fill={section.data.color}
                    strokeWidth={1} />
              
                  <ART.Text font={{ fontFamily: 'Helvetica Neue', fontSize: 20, }}
                    fill="#000"
                    x={path.centroid(section)[0]}
                    y={path.centroid(section)[1]}
                    ellipsizeMode={"middle"}
                    alignment="center"
                  >{section.data.itemName}</ART.Text>
                  </View></TouchableWithoutFeedback>
                </Group>

              ))

@JohnRyanTsai
Copy link

Same problem,How to solve this?

zhongwuzw added a commit to zhongwuzw/react-native that referenced this issue Nov 27, 2018
Remove _workQueue of webSocket set to NULL which may leads to crash

Remove _delegateDispatchQueue nil handler

Sync stream event cleanup with SRWebSocket

Added operation for unschedule stream from runloop

Adjust order of weakSelf

Adding `Wrapper` suffix to `EventHandler` and `EventHandler` type names

Summary:
It's maybe not so important/crucial, but this thing bothers me a lot.
We use raw opaque `EventTarget`, `InstanceHandle` and `EventHandler` pointers in application layer quite a lot and we don't have any kind of type-safety here. I believe all those opaque types should be represented as named scalar types which compiler at least can differentiate at compile time.
So I propose introducing named aliases for them which will point to particular empty `struct`s. This will allow us to tag types properly in all functions and methods and ensure that we pass right values as right arguments.
Again, they are *just aliases*, which are effectively still `void *`, no any additional logic or names are involved.

Unfortunately, those nice type names are already taken by `JSIFabricUIManager` local anonymous namespace (even if they are inside anonymous namespace we cannot use them https://stackoverflow.com/questions/3673353/anonymous-namespace-ambiguity).  I think it's fair to rename them because... it's local. And we already use `Wrapper` suffix for them anyways.

Reviewed By: fkgozali

Differential Revision: D8181151

fbshipit-source-id: 9b55b43fb671a56b32a862ac54f78d528e1188ce

Export JSExecutor

Reviewed By: rzito

Differential Revision: D8187754

fbshipit-source-id: e0da3781e2b3e24cef04086d15e3f5394e059d30

Vendor fetch polyfill, remove default blob response type

Summary:
While investigating an issue about blobs (https://github.com/facebook/react-native/issues/18223), I noticed that the fetch polyfill (https://github.com/github/fetch) uses blobs as the response type by default if the module is available (https://github.com/github/fetch/blob/master/fetch.js#L454). This surfaced some issue with the blob implementation on iOS that has since been fixed.

However after further review of the fetch polyfill and the way Blobs work in RN, I noticed a major issue that causes blobs created by fetch to leak memory. This is because RN blobs are not deallocated automatically like in the browser (see comment https://github.com/facebook/react-native/blob/master/Libraries/Blob/Blob.js#L108) and the fetch polyfill does not deallocate them explicitly using the close method.

Ideally we should implement automatic blob cleanup when the instance is garbage collected but implementing that is probably somewhat complex as it requires integrating with JSC. For now I suggest disabling the default handling of requests as blobs in the fetch polyfill. This will mitigate the issue for people not using Blobs directly. I'm not sure how well documented the Blob module is but we should make it clear that they currently require explicit deallocation with the close method for people using them directly.

Run a simple http request using fetch and make sure it does not use the Blob module anymore.

[GENERAL] [BUGFIX] [fetch] - Do not use blobs to handle responses in the fetch polyfill, fixes potential memory leak.
Closes https://github.com/facebook/react-native/pull/19333

Differential Revision: D8125463

Pulled By: hramos

fbshipit-source-id: 8f4602190dfc2643606606886c698e8e9b1d91d1

Fabric: Using types `EventTarget`, `EventHandler` & co. instead of `void *` everywhere

Summary:
Nothing actually changed besides type names... which actually helps me found an issue in FabricUIManager!
Now there is no a single `void *` in Fabric/C++ and JavaScript bindings. Yay!

Reviewed By: fkgozali

Differential Revision: D8191420

fbshipit-source-id: b1eb60b6bc34dd25ab200aab854ffbd7ccf5b15d

cli: upgrade envinfo for new features in `react-native info`

Summary:
envinfo has done a good job reporting issues in the issue template so far, and I've done a lot of work between version 3.x and 5.x that react-native could benefit from. This adds:
- better information organization, including versions and paths
- Platform/CPU/RAM
- Android and iOS SDK version detection
- npm package globbing (select all babel* packages
- global npm packages (with globbing)

envinfo also can report IDE versions, other binaries, languages and browsers if needed, and in different formats. Take a look here if interested: https://github.com/tabrindle/envinfo

- run `react-native info` // standard info
- run `react-native info --packages` // all packages in package.json
- run `react-native info --packages jest,eslint,babel-polyfill` // specified packages
- run `react-native info --packages *babel*` // globbed packages

Sample standard output:
```
  System:
    OS: macOS High Sierra 10.13
    CPU: x64 Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
    Memory: 97.59 MB / 16.00 GB
    Shell: 5.4.2 - /usr/local/bin/zsh
  Binaries:
    Node: 8.11.0 - ~/.nvm/versions/node/v8.11.0/bin/node
    Yarn: 1.5.1 - ~/.yarn/bin/yarn
    npm: 5.6.0 - ~/.nvm/versions/node/v8.11.0/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0
    Android SDK:
      Build Tools: 27.0.3
      API Levels: 26
  IDEs:
    Android Studio: 3.0 AI-171.4443003
    Xcode: 9.0/9A235 - /usr/bin/xcodebuild
  npmPackages:
    react: 16.3.2 => 16.3.2
    react-native: 0.55.0 => 0.55.0
  npmGlobalPackages:
    create-react-native-app: 1.0.0
    react-native-cli: 2.0.1
```

https://github.com/facebook/react-native/pull/14428 - original inclusion of `react-native info`

[CLI] [ENHANCEMENT] [local-cli/info/info.js] - add more info to react-native info cli command, like global npm packages, binary paths, and SDK versions
Closes https://github.com/facebook/react-native/pull/19331

Differential Revision: D8049650

Pulled By: hramos

fbshipit-source-id: 35c677f369bcad1a014eb083b2ce60ba33fee0ea

Update Jest snapshots

Summary:
Jest will now exclude undefined props from snapshots (https://github.com/facebook/jest/pull/6162). Updating the snapshots should fix the current `test_javascript` failures.

Circle CI

[INTERNAL][MINOR][Snapshots] - Update snapshots
Closes https://github.com/facebook/react-native/pull/19414

Differential Revision: D8125193

Pulled By: hramos

fbshipit-source-id: db8dcfcd8afbf9d6256f83c6e922680a7872d776

Add Feature Request template

Summary: Closes https://github.com/facebook/react-native/pull/19498

Differential Revision: D8197147

Pulled By: hramos

fbshipit-source-id: 0668b885a0eb04a3af948f5643649d5b68488c71

OSS: ignore xcodeproj in root dir

Summary: We don't need Xcode project in root dir.

Reviewed By: davidaurelio

Differential Revision: D8197985

fbshipit-source-id: dbbb8820111e84181c9880372dab9af55e0876e6

jest@23.0.1 in xplat/js

Reviewed By: rafeca

Differential Revision: D8195559

fbshipit-source-id: 7e96f24ae1f9586e9fbc6e1687f731420979352d

deleted UI Action Sheet Delegate Methods

Reviewed By: PeteTheHeat

Differential Revision: D8191111

fbshipit-source-id: 39867683cf5e0cdf8a94a76269d939b5ecf6bbd4

Fix ART surface sleep issue

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

Reviewed By: achen1

Differential Revision: D8194925

fbshipit-source-id: 5448d49d959078eaded697f791e1b382471fabdb

Fix TextInput's initial layout measurements

Reviewed By: mdvacca

Differential Revision: D7732819

fbshipit-source-id: 0ca4e5643d2cfefe304d7f189474a671c4bcb31e

Fix ReactInstanceManager unmountApplication

Reviewed By: mdvacca

Differential Revision: D7945746

fbshipit-source-id: 0c2eed9a623e442fa4a4ff29ffa01f025466c9b6

Introducing Scheduling of JS calls from native

Reviewed By: achen1

Differential Revision: D7729226

fbshipit-source-id: 9869e0a6a2b0c58b7538836ed2c13a4b28dd8887

Refactor setup of Event Dispatcher

Reviewed By: achen1

Differential Revision: D7746311

fbshipit-source-id: cfee1c2ced6d85477628085f3260496e80ae48c2

First implementation of scheduleWork method

Reviewed By: shergin

Differential Revision: D7799412

fbshipit-source-id: b78a0bc0e80868f6877a31f862d7e6104fd4a049

Deprecate UIManagerModule#getEventDispatcher and refactor usages

Reviewed By: shergin

Differential Revision: D7832079

fbshipit-source-id: 263a2f8ff96ab6e14b91395644710b4d5f36dc50

store / retrieve instanceHandle from View

Reviewed By: shergin, achen1

Differential Revision: D8074014

fbshipit-source-id: aee0d41e0e9da44e8748f47da04dcd76dbe96d8d

Include instanceHandle in cloning mechanism

Reviewed By: shergin, achen1

Differential Revision: D8072075

fbshipit-source-id: 2fcfdfa5116850ce0bac6c2c86d87e5bf00fd7f0

Binding for js events

Reviewed By: fkgozali

Differential Revision: D8181616

fbshipit-source-id: 5937c83f22ac09e3041fcb0f8d4e9e3026b2b397

Initialize Event Emitter as part of UIManagerModule

Reviewed By: achen1

Differential Revision: D8216184

fbshipit-source-id: 3b188804e2dad2b112f566da49a939eb4338713d

Use timestamps from QPL by default

Differential Revision: D8207166

fbshipit-source-id: 1e43d6874ee400cb2e26a11cbcfb12ee32d28d3c

Upgrade Jest to 23.1.0

Reviewed By: davidaurelio

Differential Revision: D8212583

fbshipit-source-id: 245a5ccc9bcd63a0995dcb5a1770a6f5f34cd04e

Revert D8194925: Fix ART surface sleep issue

Differential Revision:
D8194925

Original commit changeset: 5448d49d9590

fbshipit-source-id: c01e11d44424e1f6fb79866bb845ed60764c5f13

Fix jest snapshot testing on windows

Summary:
Fixes #19370

Applied changes to existing project that uses jest snapshot testing. Testing was broken before and now works.

To verify: Run any snapshot test containing an image reference on Windows before and after this PR.

[WINDOWS][BUGFIX][jest] - Fixed jest snapshot testing on windows
Closes https://github.com/facebook/react-native/pull/19496

Differential Revision: D8195947

Pulled By: hramos

fbshipit-source-id: 909b5fe7cfd8c6286baf161a227a359854a37603

Enable webhooks on Circle

Summary:
Release Notes
=============

[INTERNAL][MINOR][CircleCI] - Send webhooks to Facebook.
Closes https://github.com/facebook/react-native/pull/19527

Differential Revision: D8228361

Pulled By: hramos

fbshipit-source-id: 5d7c0960392b9a860d3f665e2a316c18153879eb

Migrate Android sources to MIT license header

Reviewed By: fkgozali

Differential Revision: D8065619

fbshipit-source-id: 719c303b40c96950bab8e5dde9a75f449b2956c6

Upgrade Metro to 0.37.2

Reviewed By: rafeca

Differential Revision: D8223545

fbshipit-source-id: fdaacbb514e2947b9244cb55ef9170af55ba2f60

Rename default RN transformer

Differential Revision: D8235001

fbshipit-source-id: 59a4b2f13185dd9be0d33f01589d907d49493a26

Change default metro transformer

Differential Revision: D8234984

fbshipit-source-id: 83cecfbfa3300f7703ea197009d985bbbc58127a

Bump metro@0.38.0

Reviewed By: davidaurelio

Differential Revision: D8235787

fbshipit-source-id: a22802c829920e7e182a9aae70bd69a6446d5f8f

Fabric: Integrating `tag` into `EventHandlers`

Summary:
In order to dispatch event, `EventHandlers` must also know react tag. So we have to store it inside.
We plan to illuminate this requirement (and `tag` from `EventHandlers`) eventually.

Reviewed By: fkgozali

Differential Revision: D8211685

fbshipit-source-id: 2064c0f4a7869cbf4d2c92d0349f4ee3998cb8f5

Fabric: The first version of event dispatching pipeline

Summary:
This is the first attempt to implement some base part of event dispatching pipeline from end-to-end.
Even when it is working, all this is still incomplete and generally up in the air. We are still messing proper implementation of event queue, priority, and synchronization of react reconciliation process with event scheduling.

Reviewed By: fkgozali

Differential Revision: D8212271

fbshipit-source-id: 92f9427d14726441c70ffff294ac95eeb004152a

Fabric: Removed unused type aliases

Summary: Trivial.

Reviewed By: fkgozali

Differential Revision: D8212287

fbshipit-source-id: 228951742568d28a064ee03b6314a4c01532b9c9

Clamp typechecks -> Flow

Reviewed By: yungsters

Differential Revision: D8219220

fbshipit-source-id: e849d9dae573459e4b09e317cc6dc37bec9ce4e8

RefreshControl ES6 Class

Reviewed By: sahrens

Differential Revision: D8219221

fbshipit-source-id: 445243964d64dd5274c1e47bdc137645dc8eecaf

ActivityIndicator ES6 Class

Reviewed By: yungsters

Differential Revision: D8219463

fbshipit-source-id: 7d252d15bb4a7345d156b1659b09be2a4a69ba6c

DatePickerIOS add onChange event definition

Reviewed By: sahrens

Differential Revision: D8219622

fbshipit-source-id: 37f26d0981318b7eab9d3c734c44e7714fa6f0e8

DatePickerIOS ES6 Class

Reviewed By: sahrens

Differential Revision: D8219657

fbshipit-source-id: cef48cf3ad24ad442f07df0edad55ab97d96c6f2

Delete EventDispatcher interface

Reviewed By: achen1

Differential Revision: D8232129

fbshipit-source-id: 6d618b4a587c0b0e1dfac967e8d22c05a62c44ee

RN: Remove Native Prop Validation

Summary:
As we migrate over to static typing solutions for props, we cannot rely on always having `propTypes` available at runtime.

This gets us started on that journey by removing the native prop validation that happens when we require native components.

bypass-lint

Reviewed By: TheSavior

Differential Revision: D7976854

fbshipit-source-id: f3ab579a7f0f8cfb716b0eb7fd4625f8168f3d96

Bump to BUCK v2018.03.26.01

Summary:
Bumps CI to latest BUCK release.

Test Plan
---------

Run on Circle CI.

Release Notes
-------------

[INTERNAL] [MINOR] [Tests] - Bump to BUCK v2018.03.26.01
Closes https://github.com/facebook/react-native/pull/19535

Differential Revision: D8240382

Pulled By: hramos

fbshipit-source-id: 60812cc90542201b362ef264083dd79dbf5d9360

make logMarker visible for consistency with logTaggedMarker

Differential Revision: D8240294

fbshipit-source-id: 8d056dc89adff41ff43c0df2f752b01ac1fb189f

react-native-xcode.sh: Support Homebrew-installed nodenv

Summary:
As well as nvm.

https://github.com/facebook/react-native/blob/9d315f4a1e7b0c9cd80a51903db0b1b561b19e33/scripts/react-native-xcode.sh#L56-L60

Build React Native iOS app with Release configuration and run the script using `node` command which is installed through Homebrew-installed `nodenv` and `node-build`.

None.

[IOS] [ENHANCEMENT] [scripts/react-native-xcode.sh] - Support Homebrew-installed nodenv
Closes https://github.com/facebook/react-native/pull/19509

Differential Revision: D8243181

Pulled By: hramos

fbshipit-source-id: fbd75f377f4aebf89ce35b96a47c59238e62e9ce

Low the priority for logging events in fabric

Reviewed By: achen1

Differential Revision: D8238957

fbshipit-source-id: f2e8bd941ac68ead4c5ed7cadfcf83a753e44cab

better place for dismiss all button

Summary:
This pr makes a little bit simpler to dismiss all warnings (1 click instead of 2)
Sometimes you don't want to use `YellowBox.ignoreWarnings` to remember.

RNTester sceenshot:

<img width="322" alt="screen shot 2018-05-30 at 09 51 25" src="https://user-images.githubusercontent.com/1488195/40701475-1142506a-63ef-11e8-8fc9-ea1696d9cb65.png">
Or RNTester -> Native Animation Example -> Force JS Stalls (in the end of the list) also cause warning to test.

[GENERAL][ENHANCEMENT][YellowBox] - Move `Dismiss All` yellow box button to another place which makes a little bit simpler to dismiss warnings.
Closes https://github.com/facebook/react-native/pull/19501

Differential Revision: D8243823

Pulled By: hramos

fbshipit-source-id: 31887469cddb4adfd7b889ae0c29a3bf41e87b7b

Slider remove $FlowFixMe

Reviewed By: sahrens

Differential Revision: D8234803

fbshipit-source-id: cfc0466a54f3c219d8a2eadfebf840399a2abdd8

refactor JSI module initialization

Reviewed By: fkgozali

Differential Revision: D8111636

fbshipit-source-id: 6e32703b077144962519485002adff8c9f6084ad

Add backward compatible support for onLayout event in Fabric

Reviewed By: achen1

Differential Revision: D8231722

fbshipit-source-id: 3d0641a7813e742ca81b98576f9ffc30ee597f30

Implement release of FabricUIManager resources

Reviewed By: achen1

Differential Revision: D8232155

fbshipit-source-id: 6683c692a830f5a73aab2c606167e54d668ae5c2

normalizeColor to compute regexps lazily

Reviewed By: johnislarry

Differential Revision: D8241955

fbshipit-source-id: 0939f442bb1e51118207449e0b95c6da97b899da

Revert D8234803: [RN] Slider remove $FlowFixMe

Differential Revision:
D8234803

Original commit changeset: cfc0466a54f3

fbshipit-source-id: 354fcc1853597cbcd518abaf4be5b11116f594b3

Slider remove $FlowFixMe #take2

Reviewed By: fkgozali

Differential Revision: D8246336

fbshipit-source-id: 21555a318bd823309ac2c285b49c2045338c2b28

Slider move prop comments to flow types

Reviewed By: yungsters

Differential Revision: D8246378

fbshipit-source-id: f62a77d64016f6502b3445ab6d0d1558034333e6

Slider to ES6 Class

Reviewed By: yungsters

Differential Revision: D8246422

fbshipit-source-id: 1955ae87abe077115ac8f8ea105be85db8ea66b4

Switch to ES6 Class

Reviewed By: yungsters

Differential Revision: D8246980

fbshipit-source-id: fbd6998429e6791000ea093d3fa15c1a486914bd

Remove duplicated attachWebsocketServer module

Reviewed By: jeanlauliac

Differential Revision: D8248752

fbshipit-source-id: b829de4b0d75d154dd80196b589fe70b0050be4d

Bump metro@0.38.1

Reviewed By: jeanlauliac

Differential Revision: D8248753

fbshipit-source-id: aa6d0da4e96e8b4109b6b5bca050614ec1860fc2

Trigger nested VirtualizedLists to re-measure if their containing cell's onLayout fires

Reviewed By: sahrens

Differential Revision: D8272040

fbshipit-source-id: c490ffa875bfd0547ac54d214c5ebbeb23c99942

skip dismiss all if all rows are hidden (#19564)

Summary:
Small fix based on
https://github.com/facebook/react-native/pull/19501#issuecomment-394486884

No need to mention it

[GENERAL] [BUGFIX] [YellowBox] - Message
Closes https://github.com/facebook/react-native/pull/19564

Differential Revision: D8276808

Pulled By: hramos

fbshipit-source-id: 59832d3d6e60ae30afbeb7c9303405746e9eec45

Fix events not working after closing and navigating back to Fabric screen in FB4A

Reviewed By: fkgozali

Differential Revision: D8240344

fbshipit-source-id: 992945f94843589cefdf7ea24da709449ee38778

Enable proguard for Fabric in release builds

Reviewed By: shergin

Differential Revision: D8247814

fbshipit-source-id: 94ed8a767fcf4f6093646618a5691ff17753ffe0

Use correct library reference for libfishhook.a in RCTWebSocket (#19579)

Summary:
This uses the reference for `libfishhook.a` from the Products, rather than
the reference from the Frameworks group.

This fixes the build for the new Xcode build system, on both Xcode 9 and
Xcode 10.

Fixes #19569

- Using Xcode 10:
	- Open `RNTester/RNTester.xcodeproj`
	- Build RNTester, noting build errors
- Using Xcode 9:
	- Open `RNTester/RNTester.xcodeproj`
	- Switch to using new build system in `File > Project Settings > Build System`, selecting `New Build System (Preview)`
	- Build RNTester, noting build errors

none

[IOS] [BUGFIX] [RCTWebSocket] - Fix build for new Xcode build system
Closes https://github.com/facebook/react-native/pull/19579

Differential Revision: D8287487

Pulled By: hramos

fbshipit-source-id: 5bfc9decb09ebc763824df8474b5897099d39ad7

Add open source Flow declaration for Metro module

Summary:
Fix Flow failure by adding a declaration to the Flow config used in open source. This did not get caught internally because we use a different Flow config.

Release Notes
-------------
[INTERNAL] [MINOR] [Flow] - Fix Flow config.

Reviewed By: rafeca

Differential Revision: D8257641

fbshipit-source-id: 3f4b2cbe622b2e76aa018e9369216a6b9ac25f47

Fix/security issues (#19373)

Summary:
This updates both [`react-devtools-core`](https://github.com/facebook/react-devtools/issues/941) and [`plist`](https://github.com/TooTallNate/plist.js/commit/04c8ee7646d4abcfe13b3fdc3037b75047069ead) to include security fixes, reported by `npm audit`.

Fixes #18854

_Only dependencies are updated with security patches, no change in actual code._

_Only dependencies are updated with security patches, no change in actual code._

[GENERAL] [ENHANCEMENT] [react-devtools-core] - Bump to `3.2.2` for a security fix for `ws`
[GENERAL] [ENHANCEMENT] [plist] - Bump to `3.0.0` for a security fix for `xmlbuilder`

Closes https://github.com/facebook/react-native/pull/19373

Reviewed By: sophiebits

Differential Revision: D8149200

Pulled By: hramos

fbshipit-source-id: 732fd627b232c315be60ed2da432742e8256a38a

Bump Prettier to 1.13.4 on xplat

Summary:
Bump Prettier to use version 1.13.4
All code changes are caused by running Prettier and should only affect files that have an `format` header.
All other changes caused by yarn.

Reviewed By: ryanmce

Differential Revision: D8251255

fbshipit-source-id: 0b4445c35f1269d72730f2000002a27c1bc35914

Change error message on interpolation (#19571)

Summary:
Change message in Animated.Interpolation to "inputRange must be monotonically non-decreasing" as it's allowed to give the same x's like in the test [example](https://github.com/facebook/react-native/blob/4435f087713e1d0ac3639e3b3196d71c6402898e/Libraries/Animated/src/__tests__/Interpolation-test.js#L71)

Simply giving improper value of interpolation input

[GENERAL] [MINOR] [AnimatedInterpolation.js] - Change error message on interpolation improper range error
Closes https://github.com/facebook/react-native/pull/19571

Differential Revision: D8310791

Pulled By: TheSavior

fbshipit-source-id: 803ef55104ad2a36231c5f18c0c089bd14822bf3

Modified deepFreezeAndThrowOnMutationInDev to use Object.prototype.ha… (#19598)

Summary:
This PR fixes a bug in `deepFreezeAndThrowOnMutationInDev` which did not take into account that objects passed to it may have been created with `Object.create(null)` and thus may not have a prototype. Such objects don't have the methods `hasOwnProperty`, `__defineGetter__`, or `__defineSetter__` on the instance.

I ran into an unrecoverable error in React Native when passing this type of object across the bridge because `deepFreezeAndThrowOnMutationInDev` attempts to call `object.hasOwnProperty(key)`, `object.__defineGetter__` and `object__defineSetter__` on objects passed to it. But my object instance does not have these prototype methods.

Changes:
* Defined `Object.prototype.hasOwnProperty` as a `const` (pattern used elsewhere in React Native)
* Modified calls to `object.hasOwnProperty(key)` to use `hasOwnProperty.call(object, key)` (Per ESLint rule [here](https://eslint.org/docs/rules/no-prototype-builtins))
* Modified calls to deprecated methods `object.__defineGetter__` and `object.__defineSetter__` to instead use `Object.defineProperty` to define get and set methods on the object. (Per guidance on [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__))
* Added a new test to `deepFreezeAndThrowOnMutationInDev-test` to verify the fix.

I tried to create a reproducible example to post to Snack by passing prototype-less objects to a `Text` component, in various ways, but they appear to be converted to plain objects before crossing the bridge and therefore they do not throw an error.

However, I was able to create a new test to reproduce the issue. I added the following test to `deepFreezeAndThrowOnMutationInDev-test`:

```JavaScript
it('should not throw on object without prototype', () => {
    __DEV__ = true;
    var o = Object.create(null);
    o.key = 'Value';
    expect(() => deepFreezeAndThrowOnMutationInDev(o)).not.toThrow();
  });
```

The changes in this PR include this new test.

ESLint test produced no change in Error count (3) or Warnings (671)

N/A
Other areas with _possibly_ the same issue:
https://github.com/facebook/react-native/blob/c6b96c0df789717d53ec520ad28ba0ae00db6ec2/Libraries/vendor/core/mergeInto.js#L50
https://github.com/facebook/react-native/blob/8dc3ba0444c94d9bbb66295b5af885bff9b9cd34/Libraries/ReactNative/requireNativeComponent.js#L134

 [GENERAL] [BUGFIX] [Libraries/Utilities/deepFreezeAndThrowOnMutationInDev] -Fix for compatibility with objects without a prototype.
Closes https://github.com/facebook/react-native/pull/19598

Differential Revision: D8310845

Pulled By: TheSavior

fbshipit-source-id: 020c414a1062a637e97f9ee99bf8e5ba2d1fcf4f

Update Danger token (#19606)

Summary:
Trivial.
Closes https://github.com/facebook/react-native/pull/19606

Differential Revision: D8314419

Pulled By: hramos

fbshipit-source-id: b298e265c2c87cdc01175b1a014f9003e0673f40

Remove unused include. (#19548)

Summary:
`LayoutableShadowNode.cpp` includes `"LayoutableShadowNode.h"` as well as `<fabric/core/LayoutContext.h>`. In turn, `LayoutContext.h` then includes `<fabric/core/LayoutableShadowNode.h>`. `LayoutContext.h` doesn't actually require `LayoutableShadowNode.h`, but this unnecessary inclusion can cause duplicate definition errors if the two include paths don't map to exactly the same file. This patch removes the unnecessary include.

The CI's build system should cover the testing needed.

[INTERNAL] [MINOR] [fabric] - Remove an unnecessary include in fabric/core/layout.
Closes https://github.com/facebook/react-native/pull/19548

Differential Revision: D8313337

Pulled By: shergin

fbshipit-source-id: 2e01e29ff25131543d9a8601483c2e716c7437be

Fix ReactImagePropertyTest SoLoader failures (#19607)

Summary:
Fixes #18637 & #19309

<!--
  Required: Write your test plan here. If you changed any code, please provide us with
  clear instructions on how you verified your changes work. Bonus points for screenshots and videos!
-->

Check Android `ReactImagePropertyTest` tests pass.

<!--
  Does this PR require a documentation change?
  Create a PR at https://github.com/facebook/react-native-website and add a link to it here.
-->

<!--
  Required.
  Help reviewers and the release process by writing your own release notes. See below for an example.
-->

 [ANDROID] [BUGFIX] [Unit Tests] - Fix ReactImagePropertyTest SoLoader failure

<!--
  **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.**

    CATEGORY
  [----------]      TYPE
  [ CLI      ] [-------------]    LOCATION
  [ DOCS     ] [ BREAKING    ] [-------------]
  [ GENERAL  ] [ BUGFIX      ] [ {Component} ]
  [ INTERNAL ] [ ENHANCEMENT ] [ {Filename}  ]
  [ IOS      ] [ FEATURE     ] [ {Directory} ]   |-----------|
  [ ANDROID  ] [ MINOR       ] [ {Framework} ] - | {Message} |
  [----------] [-------------] [-------------]   |-----------|

 EXAMPLES:

 [IOS] [BREAKING] [FlatList] - Change a thing that breaks other things
 [ANDROID] [BUGFIX] [TextInput] - Did a thing to TextInput
 [CLI] [FEATURE] [local-cli/info/info.js] - CLI easier to do things with
 [DOCS] [BUGFIX] [GettingStarted.md] - Accidentally a thing/word
 [GENERAL] [ENHANCEMENT] [Yoga] - Added new yoga thing/position
 [INTERNAL] [FEATURE] [./scripts] - Added thing to script that nobody will see
-->
Closes https://github.com/facebook/react-native/pull/19607

Differential Revision: D8325415

Pulled By: hramos

fbshipit-source-id: 598baa3499646bb50da065815c19bb9f76bf6c87

Fixed concurrency issue in remote debugger

Reviewed By: rafeca

Differential Revision: D8316215

fbshipit-source-id: 70b5000a9bf09897bb9b9d505bfc5dcc7c4c3a41

Fix NullPointerException when emiting event using UIManagerModule

Reviewed By: achen1

Differential Revision: D8321766

fbshipit-source-id: ae5052c83f46e08d540b90bf5b71c68f354c566d

QuickPerformanceLogger.js: markerPoint + iOS/Android JS binding

Reviewed By: alexeylang

Differential Revision: D8125546

fbshipit-source-id: bb02921c7d89faba64001bff3b9aaf13f64a7f8b

Fabric: Using Size instead of Point as textShadowOffset's type

Summary:
The current implementation of React Native uses `Size` as the underlying type of `textShadowOffset` which is clearly terribly wrong (especially because negative size values makes no sense). This mistake was borrowed from `NSShadow`, I believe.
I don't have time to fix this in every implementation of RN now, so let's use `Size` in Fabric as well.

Reviewed By: fkgozali

Differential Revision: D8246714

fbshipit-source-id: 1f0bf9b9dfa83802ef3faef2971fed5510494bfd

Fabric: Using exact UIFontWeight* constants instead of CGFloat

Summary: SUDDENLY, `-[UIFont systemFontOfSize:weight:]` returns incorrect result if `weight` is not exactly equal to any of built-in constants.

Reviewed By: fkgozali

Differential Revision: D8246712

fbshipit-source-id: 13d59cc8d66a4494437f28d791fd93fa83ebe6fb

Fabric: Data model of Touch Events

Summary: The data model of Touch events and payload serialization. The implementation mimics W3C standard and current React Native implementation.

Reviewed By: fkgozali

Differential Revision: D8246711

fbshipit-source-id: 955b2068674f290d8bdb82da1ebfb796dd32971b

Fabric: Introducing RCTSurfaceTouchHandler

Summary:
RCTSurfaceTouchHandler is a complete rewrite of RCTTouchHandler which uses direct Fabric-specific event dispatching pipeline and several new approaches to managing active events (such as high-performant C++ collections, better management of identifier pool, and so on).
Besides that, the new implementation is much more W3C compliant that it used to be (see old TODOs near `receiveTouches()` implementation in Javascript).
So, touch events work now!

Reviewed By: fkgozali

Differential Revision: D8246713

fbshipit-source-id: 218dc15cd8f982237de7e2497ff36a7bfe6d37cc

Fabric: `convertRawProp` was extended to accept an optional default value

Summary:
During transforming raw prop (`rawProps[<prop>]`) to typed props (`MyProps.<prop>`) we can face three different cases:
 * `rawProps` collection has proper serialized value for the key. In this case, we have to set a new value of the typed prop converting value using `fromDynamic`.
 * `rawProps` collection does not have value for the key. In this case, we have to copy a value from source prop (`sourceValue`).
 * `rawProps` collection has `null` value for the key. This is the special case which means that the prop was removed from the particular component instance and we have to reset it to some *default* value (which is *not* the same as `sourceValue`). Now the default value of the `defaultValue` (sic!) argument is a default value of the type of the value (which may be different from logical default value).

We didn't handle the last case previously and this caused crashes (and unexpected behavior) because `fromDynamic` often cannot handle `null` value.

And yes, all this mean that we also have to update all `convertRawProp` call sites where logical default values are not equal to type-specific default values. This is a potential error-prone place, especially because now we have to specify logical default values in two places (in a prop declaration and in a parameterized constructor). And seems there is no way to avoid that without performance loss (because both of those places are basically constructors).

My hope is that codegen (where default values are also defined in JavaScript) will help with it eventually.

Reviewed By: fkgozali

Differential Revision: D8247652

fbshipit-source-id: 2cbe65f5f5cccd7a0d34aaa19e385aacebfe8cb1

Bump eslint-plugin-react in FBSource

Reviewed By: yungsters

Differential Revision: D8247892

fbshipit-source-id: 4072e65ccf2fdc654f58087a16b4c7709ce393f8

have circle ci use xcode 9.4 (#19629)

Summary:
Circle CI just released Xcode 9.4 https://discuss.circleci.com/t/xcode-9-4-availability-on-circleci/22648/5

Make sure react native still works with Xcode 9.4.

None

[IOS][MINOR] Upgrade CI
Closes https://github.com/facebook/react-native/pull/19629

Differential Revision: D8343236

Pulled By: hramos

fbshipit-source-id: 2266aeafc9a1b1c77ad842f06c9a137bb05b135d

Disallow requiring from invariant/warning (#19634)

Summary:
In this repo we have to require from fbjs/lib/invariant and issues occur when we require directly from invariant/warning. Flow doesn't complain about those requires right now because we have a transitive dependency on invariant and warning causing them to happen to be at the root of node_modules.

This change blacklists requiring directly from invariant and warning using Flow. janicduplessis opened a pull request to do this with ESLint back in 2017: https://github.com/facebook/react-native/pull/13014
Closes https://github.com/facebook/react-native/pull/19634

Reviewed By: hramos

Differential Revision: D8343060

Pulled By: TheSavior

fbshipit-source-id: 9cfc7915b2fb68a567355fc2f5edc4dfcd46f4af

Fabric: All *EventHandlers were renamed to *EventEmitter

Summary:
Using `EventHandlers` name was a bad idea, and I cannot tolerate it anymore.
The worst part of it is that when you have a collection of `EventHandlers` objects you cannot use plural word to describe it because `EventHandlers` is an already plural word.

And, this object is actually an event emitter, the thing on which we call events.

Reviewed By: fkgozali

Differential Revision: D8247723

fbshipit-source-id: b3303a4b9529bd6d32bb8ca0378287ebefaedda8

Add MIT License Header

Summary: When a third party library is vendored, both the original copyright header as well as React Native's header are required.

Reviewed By: fkgozali

Differential Revision: D8284116

fbshipit-source-id: 1748eb011c843a87e9ed421597571b66334edfd2

Migrate PickerIOS to ES6 Class

Reviewed By: sahrens

Differential Revision: D8343380

fbshipit-source-id: 9432f0810c67034f20b44ba9f4955d4ffd2ef1d2

Fix some typos in dumpReactTree.js (#19636)

Summary:
Simple doc fixes
Closes https://github.com/facebook/react-native/pull/19636

Differential Revision: D8344481

Pulled By: TheSavior

fbshipit-source-id: b6fa064f70793bdaf1d6346b2775373b74c2ae3b

iOS: fix fabric core test

Reviewed By: shergin

Differential Revision: D8344613

fbshipit-source-id: 10c604e7fbe2ff3b8c47babedea12a197c0c56b2

Switch to Platform.isTV to pass Android Flow

Reviewed By: sahrens

Differential Revision: D8345911

fbshipit-source-id: 9af7a25127e7c35844a6c59b267a77cf8adba535

Passing forwardedRef to Slider

Reviewed By: sahrens

Differential Revision: D8345883

fbshipit-source-id: d2affdba14d38593541e591fe72006c76fca166f

Enable Flow for bezier

Reviewed By: sahrens

Differential Revision: D8346102

fbshipit-source-id: bb1a2eccb5472bf6f3fe113303ad96cf3f386cab

Don't pass additional args to requireNativeComponent in .android.js files

Reviewed By: sahrens

Differential Revision: D8345921

fbshipit-source-id: 187048ad4c1b361f0b99b993052bdcaf47a266db

Fix iOS e2e tests: bump react-native-babel-preset to ^5 (#19625)

Summary:
We opt in to version ^5 of the React Native Babel Preset, as required after the bump to Babel 7. This fixes the Objective-C end-to-end test failure in master. (Fixes #19538)

See https://github.com/facebook/react-native/commit/34bd776af2f2529009188fced91083203a48fd40#commitcomment-29024085 for prior discussion.

There have already been several changes made to the repo during the transition to Babel 7. This PR brings all tests back to green and allows us to move forward with the 0.56 branch cut.

We also bump our tests to use Xcode 9.4.0 and iOS 11.4, the latest stable versions of both.

Once the 0.56 branch makes it to stable, we can change `react-native-babel-preset@latest` on npm to point to `react-native-babel-preset@5.0.1` (or newer), and undo the change made to `init.js` we made as part of this diff.

Wait for Circle CI to run: https://circleci.com/workflow-run/e39a66d7-bf8a-4b31-a22f-eef30a2c53bc

[GENERAL] [BREAKING] [Babel] - Bump React Native Babel Preset version used by RN CLI to Babel v7 compliant release
Closes https://github.com/facebook/react-native/pull/19625

Reviewed By: TheSavior

Differential Revision: D8343861

Pulled By: hramos

fbshipit-source-id: 42644d5b0bfb40a8bc592ae3461c5008deef8232

Upgrade to Flow v0.74.0

Reviewed By: panagosg7

Differential Revision: D8322344

fbshipit-source-id: 1208528009785f7f797201777287af525d0a9ca1

Open source Flow definition for Jest

Reviewed By: sahrens

Differential Revision: D8347198

fbshipit-source-id: 0b6194bfd14bad09db7dcd462f0bf342c9c6fe44

Add back deprecated getParent methods for non-breaking API change (#775)

Summary:
I'm not totally sure what I'm doing so if this needs changes let me know.
Closes https://github.com/facebook/yoga/pull/775

Reviewed By: emilsjolander

Differential Revision: D8331892

Pulled By: passy

fbshipit-source-id: eb1023e666322d2472e4081fd4a4e72a7b43d049

Trigger onFocus/onBlur instead of onPressIn/onPressOut (eventually, but for now just deprecate) (#18470)

Summary:
Currently on iOS and Android focus/blur events trigger onPressIn/onPressOut. Based on discussions with people are several companies who use react-native we're proposing instead triggering new events onFocus/onBlur. Initial discussion on Slack with some from the core team on Slack seemed positive.

Couple reasons:

* The current API behavior overloads onPressIn/onPressOut. That means on platforms like react-native-web, if focus/blur support was added (as we're hoping for), even though onPressIn/onPressOut would be useful as the name describes, you wouldn't be able to distinguish between it and browser element focus/blur events.
* The names aren't as self-documenting/intuitive as onFocus/onBlur, especially for react-dom users.

There aren't any current tests around this, but I intend to add them if we solidify the API.

There's also an option question on the transition--do we deprecate the existing API with a warning? This PR just deprecates them, though it will on any TV platform when something becomes focused regardless of whether they use the API or not. This isn't ideal. It's not clear if there are alternatives or if just right away breaking the API for TV users is the correct solution, if we can get consensus between the few parties who are using it.

***

I'm interested to hear counter points or prior discussions.

Cc/ matthargett dlowder-salesforce rozele
Closes https://github.com/facebook/react-native/pull/18470

Differential Revision: D8368109

Pulled By: hramos

fbshipit-source-id: 22587b82e091645e748b6c2d721fdff06d54837f

Jest: Upgrade Flow Definition in RN + Metro

Reviewed By: sahrens

Differential Revision: D8371076

fbshipit-source-id: 12d03c545ca190a5fda1ff319e5ea906173d2241

RN: A wild YellowBox has appeared!

Summary:
Replaces the existing `YellowBox` with a modern one.

Here are the notable changes:

- Sort warnings by recency (with most recent on top).
- Group warnings by format string if present.
- Present stack traces similar to RedBox.
- Show status of loading source maps.
- Support inspecting each occurrence of a warning.
- Fixed a bunch of edge cases and race conditions.

Reviewed By: TheSavior

Differential Revision: D8345180

fbshipit-source-id: b9e10d526b262c3985bbea639ba2ea0e7cad5081

fix forwardRef displayName on Text and View

Reviewed By: TheSavior

Differential Revision: D8342852

fbshipit-source-id: 5af80edfd5de5b6d6ea6fdc24abf8931f767c812

Fix more forwardRef displayNames

Reviewed By: TheSavior

Differential Revision: D8342904

fbshipit-source-id: b6e53da7305d71635528a42e80910f4a9db0455c

Upgrade react-test-render to handle React.forwardRef

Reviewed By: TheSavior

Differential Revision: D8346704

fbshipit-source-id: fc6686fab12a429780fb16e4129e8987529b13af

iOS: Fixed some props conversion errors

Summary:
* numbers in JS are doubles in native land, since there's no notion of int or int64 in JS - so simply convert numbers to int instead of assuming it's int
* the parsing of Yoga props with `'...%'` string value has a bug: it should be copying the number instead of the `%`

Reviewed By: shergin

Differential Revision: D8370873

fbshipit-source-id: 44e9e3f0530c000c963e8e9ca66e8b0a48d80bcd

Flow: textShadownOffest needs to be stricter

Summary: `width` and `height` are required for this style prop, for the sake of consistency (and Fabric). Callsites should set one of them to 0 instead of not specifying it.

Reviewed By: TheSavior, shergin

Differential Revision: D8371064

fbshipit-source-id: b0ffd6b6543ac5456a3708382966e7b3df241f7e

Revert D8346704: Upgrade react-test-render to handle React.forwardRef

Differential Revision:
D8346704

Original commit changeset: fc6686fab12a

fbshipit-source-id: 4d1a9d109ef5be93c40df2701f35966bf441eb0a

Revert D8342904: [StrictMode] Fix more forwardRef displayNames

Differential Revision:
D8342904

Original commit changeset: b6e53da7305d

fbshipit-source-id: abf5fa6ccb16058f20cbb569ecfc790fad017133

fix No bundle url present in iOS (#19643)

Summary:
fix No bundle url present in iOS.
Related issue: https://github.com/facebook/react-native/issues/14118, https://github.com/facebook/react-native/issues/12754.
Pass all current ci
none
 [GENERAL] [BUGFIX] [iOS] - fix No bundle url present in iOS
Closes https://github.com/facebook/react-native/pull/19643

Differential Revision: D8374583

Pulled By: hramos

fbshipit-source-id: 62d621f431d2067825dc701f87044ecb1d720f14

Fixed comparison on possible null object (#19675)

Summary:
Motivation: getting NPE on BlobModule part

<img width="1718" alt="screen shot 2018-06-12 at 3 03 48 pm" src="https://user-images.githubusercontent.com/4340636/41292212-31e0acc8-6e52-11e8-916a-dd6fc2bb695a.png">

Should still build and pass all tests since project settings changes should be safe changes.

<!--
  Required: Write your test plan here. If you changed any code, please provide us with
  clear instructions on how you verified your changes work. Bonus points for screenshots and videos!
-->

No documentation change is required
<!--
  Does this PR require a documentation change?
  Create a PR at https://github.com/facebook/react-native-website and add a link to it here.
-->

<!--
  Required.
  Help reviewers and the release process by writing your own release notes. See below for an example.
-->

[ANDROID][BUGFIX][BlobModule] safe equals checks

<!--
  **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.**

    CATEGORY
  [----------]      TYPE
  [ CLI      ] [-------------]    LOCATION
  [ DOCS     ] [ BREAKING    ] [-------------]
  [ GENERAL  ] [ BUGFIX      ] [ {Component} ]
  [ INTERNAL ] [ ENHANCEMENT ] [ {Filename}  ]
  [ IOS      ] [ FEATURE     ] [ {Directory} ]   |-----------|
  [ ANDROID  ] [ MINOR       ] [ {Framework} ] - | {Message} |
  [----------] [-------------] [-------------]   |-----------|

 EXAMPLES:

 [IOS] [BREAKING] [FlatList] - Change a thing that breaks other things
 [ANDROID] [BUGFIX] [TextInput] - Did a thing to TextInput
 [CLI] [FEATURE] [local-cli/info/info.js] - CLI easier to do things with
 [DOCS] [BUGFIX] [GettingStarted.md] - Accidentally a thing/word
 [GENERAL] [ENHANCEMENT] [Yoga] - Added new yoga thing/position
 [INTERNAL] [FEATURE] [./scripts] - Added thing to script that nobody will see
-->
Closes https://github.com/facebook/react-native/pull/19675

Differential Revision: D8380228

Pulled By: hramos

fbshipit-source-id: 1d3caefdb7a7d638228490ef7b3771617745d26f

Implement console group APIs (#18555)

Summary:
Thank you for sending the PR! We appreciate you spending the time to work on these changes.
Help us understand your motivation by explaining why you decided to make this change.

React Native provides an implementation of the Web "Console" API, which is a powerful mechanism for debugging and analyzing RN apps. However, one subset of the Console API that RN does not provide is the "grouping" functions, namely `console.group` and `console.groupEnd`. These functions provide a useful way to see how an application behaves within a different parts of an application hierarchy.

I modified the "RNTester" app to create a console group each time an example is tapped, and the group is ended when the "Back" button is tapped. Here is an example of the grouping as seen in the Xcode console.

<img width="651" alt="console grouping" src="https://user-images.githubusercontent.com/445421/37882070-d2ae7860-306d-11e8-8cf4-be843a864f43.png">

https://github.com/facebook/react-native-website/pull/270

[GENERAL] [ENHANCEMENT] [console.js] - Add `console.group()` and `console.groupEnd()` APIs, matching the Web Console API.
Closes https://github.com/facebook/react-native/pull/18555

Differential Revision: D7992131

Pulled By: hramos

fbshipit-source-id: 0d28896292563922240ae2100ed49e35b6d1f102

Bump soloader to 0.5.0 (#19676)

Summary:
Closes https://github.com/facebook/react-native/pull/19676

0.5.0 adds compatibility for Android P.

Reviewed By: mdvacca

Differential Revision: D8379610

fbshipit-source-id: cbef6c2e5e82e2d9e17756b00d210fecb04e8a40

Expose getResolverMainFields() config param

Reviewed By: mjesun

Differential Revision: D8380198

fbshipit-source-id: 3d5b7a5873095db2b90a23b5054fb94579df3f1a

Bump metro@0.39.0

Reviewed By: mjesun, davidaurelio

Differential Revision: D8380199

fbshipit-source-id: 6b9e3aa343e8d0526a3c42d5ea266c44428d31f8

YellowBox: Apply SafeAreaView in Header

Summary: Uses `SafeAreaView` in the YellowBox inspector header so that it does not collide with the status bar.

Reviewed By: sahrens

Differential Revision: D8374861

fbshipit-source-id: e67358ac9268db8291cacf79df402f3bd5a2173d

use android build-tools 26.0.2 and set compileSdk to 26 (#19662)

Summary:
Android Target API Level 26 will be required starting from August 2018, it's so soon 😄.Read https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html

This PR uses android build tools 26.0.2, support library 26.1.0 (with android lifecycle) and setting compileSdkVersion to 26, but leaving minSdkVersion and targetSdkVersion intact, which will make targeting 26 easy.

Circle CI: https://circleci.com/gh/dulmandakh/react-native/209

Everything will build and work just fine.

[ANDROID] [ENHANCEMENT] [TOOLS] - Use android build-tools 26.0.2 and set compileSdk to 26, and use support library version 26.1.0.
Closes https://github.com/facebook/react-native/pull/19662

Differential Revision: D8398855

Pulled By: hramos

fbshipit-source-id: a4066eb04cb5f947efe1f3202b638c1092b79aae

Support animated values for border dimensions

Summary:
The flow types for these were too restrictive.

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

Reviewed By: yungsters

Differential Revision: D8409550

fbshipit-source-id: e4774e8856efc998ff1fa6cdcbe7b0cb6db2c4e3

YellowBox: Define in __DEV__ Only

Summary: This makes it so that `YellowBox` and its dependencies are completely stripped from production bundles.

Reviewed By: sahrens

Differential Revision: D8402545

fbshipit-source-id: 6993521280a02dfe5eab8863d12c46781f35444f

- Keyboard layout now updates when changing keyboardType while it has focus (#19027)

Summary:
This PR makes sure that changing the `keyboardType` props of `<TextInput>` is reflected while the text field has focus. It is something that is also discusses in #13782. The workaround mentioned in that issue using `key` causes the TextInput to re-render itself which has some undesired side-effects.

Fixes #13782

```javascript
export default class KeyboardTypeApp extends Component {
  state = { keyboardType: 'default' };

  toggleKeyboardType = () => {
    this.setState({
      keyboardType: this.state.keyboardType === 'default' ? 'numeric' : 'default'
    });
  }

  render() {
    return (
      <View style={{ padding: 40 }}>
        <TextInput autoFocus value="Press Toggle :)" keyboardType={this.state.keyboardType} />
        <Button title="Toggle" onPress={this.toggleKeyboardType} />
      </View>
    );
  }
}
```

![video](https://user-images.githubusercontent.com/706368/39268429-3e331440-48d0-11e8-947c-7d334e3cec50.gif)

<!--
  Does this PR require a documentation change?
  Create a PR at https://github.com/facebook/react-native-website and add a link to it here.
-->

 [IOS] [ENHANCEMENT] [TextInput] - Keyboard layout now updates when changing `keyboardType` while it has focus

<!--
  **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.**

    CATEGORY
  [----------]      TYPE
  [ CLI      ] [-------------]    LOCATION
  [ DOCS     ] [ BREAKING    ] [-------------]
  [ GENERAL  ] [ BUGFIX      ] [ {Component} ]
  [ INTERNAL ] [ ENHANCEMENT ] [ {Filename}  ]
  [ IOS      ] [ FEATURE     ] [ {Directory} ]   |-----------|
  [ ANDROID  ] [ MINOR       ] [ {Framework} ] - | {Message} |
  [----------] [-------------] [-------------]   |-----------|

 EXAMPLES:

 [IOS] [BREAKING] [FlatList] - Change a thing that breaks other things
 [ANDROID] [BUGFIX] [TextInput] - Did a thing to TextInput
 [CLI] [FEATURE] [local-cli/info/info.js] - CLI easier to do things with
 [DOCS] [BUGFIX] [GettingStarted.md] - Accidentally a thing/word
 [GENERAL] [ENHANCEMENT] [Yoga] - Added new yoga thing/position
 [INTERNAL] [FEATURE] [./scripts] - Added thing to script that nobody will see
-->
Closes https://github.com/facebook/react-native/pull/19027

Differential Revision: D8416007

Pulled By: PeteTheHeat

fbshipit-source-id: c4f89ab3dc0819bca52feddbc9c7a9f62fd96794

Bumping Metro to 0.39.1

Reviewed By: rafeca

Differential Revision: D8418105

fbshipit-source-id: 66032deb53f46a388b81233e8d00d7af6a2c7fa7

improve NativeModuleRegistryBuilder.java (#16402)

Summary:
I met the error `Native module xyz tried to override xyz for module name xyzModuleName. If this was your intention...` after something went wrong during `react-native link` - one module somehow ended up being included twice in the `getPackages` method, as in:

```java
Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
            new WowPackage(),
            new WowPackage(),
```

Since I have > 20 native modules it took me a little while to find out what the problem was. The improved error message should make the problem clearer to anybody who may encounter it. I did try to refactor the code a little more, by extracting the whole part of:

```java
        String name = moduleHolder.getName();
        if (namesToType.containsKey(name)) {
          Class<? extends NativeModule> existingNativeModule = namesToType.get(name);
          if (!moduleHolder.getCanOverrideExistingModule()) {
            throw new IllegalStateException(getModuleOverridingExceptionMessage(
              type.getSimpleName(),
              existingNativeModule.getSimpleName(),
              name
            ));
          }

          mModules.remove(existingNativeModule);
        }

        namesToType.put(name, type);
        mModules.put(type, moduleHolder);
```

out into a separate method since there were two places where nearly identical code was written.

I have built RN from source and used it in a very simple app with RN vector icons (the package creates a native module as can be seen [here](https://github.com/oblador/react-native-vector-icons/blob/master/android/src/main/java/com/oblador/vectoricons/VectorIconsPackage.java#L19)).

After including the module twice, ie.

```java
        Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
                    new VectorIconsPackage(),
                    new VectorIconsPackage()
            );
        }
```

I get the improved error description, as seen in the screenshot.

<img src="https://user-images.githubusercontent.com/1566403/36340960-3289d9d0-13e7-11e8-8d17-e1651da17841.png" height="500">

[ANDROID] [MINOR] [NativeModuleRegistryBuilder] - Improve error message and refactor putting native modules to module maps
Closes https://github.com/facebook/react-native/pull/16402

Differential Revision: D8421392

Pulled By: hramos

fbshipit-source-id: 719bd37b4681933d35858621b402ae73dd460a5b

YellowBox: Restore ES5 Compatibility

Reviewed By: sahrens

Differential Revision: D8421561

fbshipit-source-id: c2b8d430f4d0c9ce0d5177f0af5eb5f404916024

Publish releases automatically, update docs (#19715)

Summary:
Now that tests are green, we can return to automatic publishing to npm based on git tags. As long as all tests are passing, deploying a new release of React Native is as easy as tagging a commit. I've updated `Releases.md` to reflect today's release process.

Future Work: Include information about updating the website, as this is no longer done automatically.
Closes https://github.com/facebook/react-native/pull/19715

Differential Revision: D8429834

Pulled By: hramos

fbshipit-source-id: 2c6f2c80ac43c4e6d20c01e06ba14a7e4b16180d

Feature/add decimal pad to android (#19714)

Summary:
For a current use-case we need the a keyboard with characters 0-9 and a decimal point (or comma depending on language settings)

This exists on iOS as UIKeyboardType "decimalPad" and this is what react-native maps to for both "numeric" and "decimal-pad". This also exists on Android as inputType "numberDecimal", but is currently not accessible through react-native.

This PR maps the value "decimal-pad" of the keyboardType property of TextInput to the Android inputType "numberDecimal", effectively making "decimal-pad" cross platform without breaking anything.

* https://facebook.github.io/react-native/docs/textinput.html#keyboardtype
* https://developer.apple.com/documentation/uikit/uikeyboardtype
* https://developer.android.com/reference/android/widget/TextView#attr_android:inputType

There is this bug in some Samsung keyboards where both the - sign and decimal sign disappear when the keyboardType is set to "number" and both the "signed" and "decimal" flags are set. (Like is the case when using the react-native keyboardType prop "numeric".) https://androidforums.com/threads/numeric-soft-keyboard-missing-minus-sign-in-android-8-0-samsung-a5.1272628/

For developers that need decimal numbers but not negative ones, using "decimal-pad" will provide a workaround. I reproduced this on a Samsung A5 only, but maybe other phones have this exact issue. https://github.com/facebook/react-native/issues/12988 https://github.com/facebook/react-native/issues/12977 https://github.com/facebook/react-native/issues/17473 https://github.com/facebook/react-native/issues/17474

* Added testcase consistent with existing keyboardType tests
* Also added testcase for the related, but missing number-pad

This PR follows the same approach as the recently merged PR introducing "number-pad" https://github.com/facebook/react-native/pull/18350/commits/b638847a46491bd75e7ce7928c73f7cb78399195

Documentation PR: https://github.com/facebook/react-native-website/pull/405

 [ANDROID] [ENHANCEMENT] [TextInput] - Added "decimal-pad" keyboard type
Closes https://github.com/facebook/react-native/pull/19714

Differential Revision: D8429185

Pulled By: mdvacca

fbshipit-source-id: 6b56da2088f2be427ebffa04c4e17c91ffb9f7d9

add google maven repo in android project template (#19712)

Summary:
This PR will add Google maven repo to RN project template that contains com.android.support:appcompat-v7:26.1.0, thus fixes `react-native run-android` using version 0.56.0-rc.1

CI is Green - https://circleci.com/gh/dulmandakh/react-native/235

new Android projects will build and run just fine.
Closes https://github.com/facebook/react-native/pull/19712

Differential Revision: D8433730

Pulled By: hramos

fbshipit-source-id: b7d5a1cd5a97b1c4aad2a307158d6dbfcf9a42a5

bump gradle-plugin@2.3.3, gradle@3.5.1, gradle-download-task@3.4.3 (#19697)

Summary:
bump gradle-plugin@2.3.3, gradle@3.5.1, gradle-download-task@3.4.3, as we landed build tools 26.0.2 with https://github.com/facebook/react-native/commit/065c5b6590de18281a8c592a04240751c655c03c

Will improve Android build performance.

Everything will work as normal, but build faster.

<!--
  Required.
  Help reviewers and the release process by writing your own release notes. See below for an example.
-->

[ANDROID] [ENHANCEMENT] [TOOLS] - bump gradle-plugin@2.3.3, gradle@3.5.1, gradle-download-task@3.4.3
Closes https://github.com/facebook/react-native/pull/19697

Differential Revision: D8433743

Pulled By: hramos

fbshipit-source-id: da72aeb314bed7f63807a0c69bebd24c633cc807

Update GitHub Issue templates (#19723)

Summary:
Now that we have templates for everything we want to handle in the repo, the bot will go back to automatically closing issues that do not use one of the provided templates.

We have an escape valve for generic issues ("For Discussion"), so anyone who gets their issue closed automatically by the bot is unlikely to have read our instructions.
Closes https://github.com/facebook/react-native/pull/19723

Differential Revision: D8435415

Pulled By: hramos

fbshipit-source-id: 41db33cefce1367ad8f3d9440b7bba27565679cb

add RNTester to ci (#19673)

Summary:
* Current ci is missing an important part to test the whole part. With this we can make sure the js and android part compiles.
* Ensure the current android proguard rules is okay.

The `my-release-key.keystore` is just a copy of debug.keystore in `react-native/keystores`.
Pass all ci.
none
 [GENERAL] [ENHANCEMENT] [CI] - Add RNTester to ci
Closes https://github.com/facebook/react-native/pull/19673

Differential Revision: D8435419

Pulled By: hramos

fbshipit-source-id: d3d92a5d1b8477c1f298643cc96695769e5c93ea

iOS: Fixed the bug where a Backspace event was emitted when entering characters after clearing a text in TextInput by an empty string (#18627)

Summary:
The bug #18374 was caused by the loose condition to execute `stringByReplacingCharactersInRange` in the method `textInputShouldChangeTextInRange` . As a result, `findMismatch` wrongly returning `true` which ends up the Backspace event being fired in another `textInputShouldChangeTextInRange` call in `textInputDidChange`.

<!--
  Required: Write your motivation here.
  If this PR fixes an issue, type "Fixes #issueNumber" to automatically close the issue when the PR is merged.
-->

1. Pass all the tests by `yarn run test`
2. Run the following code and type any text. (This code is brought from #18374. Thank you michalpetrov!!) And then verify that 'Backspace' events are not emitted after clearing text
and entering any letters.

```javascript
type Props = {};
type State = {
  text: string,
  keys: string
};
export default class App extends Component<Props, State> {
  state = {text: '', keys: ''}
  render() {
    return (
      <View style={styles.container}>
        <TextInput style={styles.textInput} value={this.state.text} onChangeText={this.onChangeText} onKeyPress={this.onKeyPress}/>
        <Button title="Clear" onPress={this.onClear}/>
        <Text>Text: {this.state.text}</Text>
        <Text>Keys: {this.state.keys}</Text>
      </View>
    );
  }

  onChangeText = (text: string) => {
    this.setState({text})
  }

  onKeyPress = ({ nativeEvent }: Object) => {
    this.setState({keys: this.state.keys + nativeEvent.key + ', '})
  }

  onClear = () => {
    this.setState({text: '', keys: ''})
  }
}
```

<!--
  Does this PR require a documentation change?
  Create a PR at https://github.com/facebook/react-native-website and add a link to it here.
-->

<!--
  Required.
  Help reviewers and the release process by writing your own release notes. See below for an example.
-->

[IOS] [BUGFIX] [TextInput] - Fixed the bug where Backspace event was emitted when entering a character after clearing a text in TextInput by an empty string

<!--
  **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.**

    CATEGORY
  [----------]      TYPE
  [ CLI      ] [-------------]    LOCATION
  [ DOCS     ] [ BREAKING    ] [-------------]
  [ GENERAL  ] [ BUGFIX      ] [ {Component} ]
  [ INTERNAL ] [ ENHANCEMENT ] [ {Filename}  ]
  [ IOS      ] [ FEATURE     ] [ {Directory} ]   |-----------|
  [ ANDROID  ] [ MINOR       ] [ {Framework} ] - | {Message} |
  [----------] [-------------] [-------------]   |-----------|

 EXAMPLES:

 [IOS] [BREAKING] [FlatList] - Change a thing that breaks other things
 [ANDROID] [BUGFIX] [TextInput] - Did a thing to TextInput
 [CLI] [FEATURE] [local-cli/info/info.js] - CLI easier to do things with
 [DOCS] [BUGFIX] [GettingStarted.md] - Accidentally a thing/word
 [GENERAL] [ENHANCEMENT] [Yoga] - Added new yoga thing/position
 [INTERNAL] [FEATURE] [./scripts] - Added thing to script that nobody will see
-->
Closes https://github.com/facebook/react-native/pull/18627

Differential Revision: D8436331

Pulled By: hramos

fbshipit-source-id: ec75a6ca926061cbf7cb106db652f2b4a71c9a0c

Refactor Log to Flog in Fabric

Reviewed By: shergin

Differential Revision: D8363593

fbshipit-source-id: fb4104b66ef3d50d4101c39a1bf4515e6d0ecd19

Adding UIManager performance counters in Fabric

Reviewed By: fkgozali

Differential Revision: D8381255

fbshipit-source-id: d817557c8a3033d0d7ae47e5ea0a21d224279e29

Add systrace logging for Fabric android

Reviewed By: fkgozali

Differential Revision: D8387339

fbshipit-source-id: 2e202566541cc25fb6b8773a94e607e8b40fb0ce

Tightening some Image Flow Types

Reviewed By: yungsters

Differential Revision: D7270059

fbshipit-source-id: 3b9727363aeb6910fbbdc613a70d9e8cac97b3b1

ios: expose surfaceForRootTag: up the chain

Summary: The app needs to find the surface by rootTag at some point.

Reviewed By: shergin

Differential Revision: D8391957

fbshipit-source-id: b0bb107b7be882071890afb46de17b50e7ee060d

Keep UIManagerModule as a default renderer

Reviewed By: fkgozali

Differential Revision: D8439626

fbshipit-source-id: d761d977c9e6dab38f21e18da72b045483431f79

Checkbox to inherit from AppCompatCheckBox (#18318)

Summary:
The checkbox components inherits from `android.widget.CheckBox`. `AppCompatCheckBox` offers better appearance and support for advanced features (eg. tinting) on older APIs.

~~However, the build fails for some reason; If somebody could shed some light on this, I'd appreciate it.~~ Thanks for the comment, I was being blind and somehow ignored the BUCK file.

I have created a simple app with a checkbox.

Screenshot from android 4.1 (current master):

<img src="https://user-images.githubusercontent.com/1566403/37357997-2d34bdb8-26ea-11e8-8c77-709a4f96c6bf.png" width="300" />

Screenshot after applying the change, also android 4.1:

<img src="https://user-images.githubusercontent.com/1566403/37358016-3c28fb86-26ea-11e8-8dca-3a92e41450c9.png" width="300" />

https://github.com/facebook/react-native/pull/18300 (this PR is needed to support tinting on older android api levels)

[ANDROID]  [ENHANCEMENT]  [Checkbox] - Checkbox inherits from AppCompatCheckBox
Closes https://github.com/facebook/react-native/pull/18318

Differential Revision: D7268393

Pulled By: hramos

fbshipit-source-id: 01cb2819f4d56c4e0f94cdd1fb5e1a90667a398a

Bump Metro dep in RN preset to 39.1, preset to 5.0.2

Reviewed By: rubennorte

Differential Revision: D8445528

fbshipit-source-id: e8937509bb1384a2d62e880c860306d8c86dab92

Revert "Bump soloader to 0.5.0 (#19676)" (#19739)

Summary:
This reverts commit e3c5524bc65026a4c3d062cb05cee85b6d835286.
Closes https://github.com/facebook/react-native/pull/19739

Differential Revision: D8446714

Pulled By: hramos

fbshipit-source-id: 1b0e78fe57e9864faafcc766364bd76a1ba5bd03

Bugfix/ci lint proguard (#19724)

Summary:
* avoid lint to interrupt ci
* add proguard rules
pass all ci
none
 [GENERAL] [ENHANCEMENT] [CI] - Fix lint and proguard
Closes https://github.com/facebook/react-native/pull/19724

Differential Revision: D8446721

Pulled By: hramos

fbshipit-source-id: b21c5418210b27dda6a7194995a25df39af0c92a

fix permission requests on pre-M android (#19734)

Summary:
On pre-M devices, `PermissionsAndroid.request` currently returns a boolean, whereas on newer, it returns GRANTED, DENIED or other constants defined in `PermissionsModule.java`

given the example form the [docs](https://facebook.github.io/react-native/docs/permissionsandroid.html) which I guess many people use, this will lead to code that does not work before M (it will tell you that permissions are not given even if they are in the manifest).

I believe the author of [this](https://github.com/facebook/react-native/commit/51efaab1209a41254c90dcba596d49e3cbc2d925) forgot to change the resolved value in this one place but changed it in other places, eg [here](https://github.com/facebook/react-native/commit/51efaab1209a41254c90dcba596d49e3cbc2d925#diff-2a74096453bc8faa5d4a1599ad0ab33fL99).

The docs are written correctly:

> On devices before SDK version 23, the permissions are automatically granted if they appear in the manifest, so check and request should always be true.

but the code is not right because we'd need to check for `if (granted === PermissionsAndroid.RESULTS.GRANTED || granted === true) {`

Also, the behavior is done correctly in [requestMultiplePermissions](https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java#L148) so returning a boolean is an inconsistency.

I tested this locally. The code is the same as on line [148](https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java#L148) where it is done correctly.

[ANDROID] [BUGFIX] [PermissionAndroid] - return GRANTED / DENIED instead of true / false on pre-M android

<!--
  **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.**

    CATEGORY
  [----------]      TYPE
  [ CLI …
@robinclaes
Copy link

Same problem here.

cabelitos added a commit to cabelitos/react-native that referenced this issue Dec 12, 2018
…tion

Starting on API level 25, Android will destroy the TextureView's TextureLayer when the
an app is sent to the background and automatically create a new one once the TextureView is
drawed again. This causes a problem for ARTSurfaceView, because this component does not draw itself
and the Android API explicitly forbids to do such action. Since there's no listeners available to know
when the new TextureLayer was created, the ARTSufurfaceViewShadowNode will listen for life cycle events
and redraw its children once the activity is resumed.

It's was also discussed that ARTSurfaceView should extends SurfaceView and not TextureView, however
this may introduce two problems:

* SurfaceView is not hardware accelerated, which may cause impact on performance
* SurfaceView does not support opacity, so it will be impossible to set the ARTSufraceView as
transparent

With this problems in mind, this commit keeps the ARTSurfaceView extending TextureView.

Fixes facebook#17565
@cabelitos
Copy link
Contributor

Hello everyone I created a pull request that fix this issue, if possible could you guys take a look? Thank you very much #22624

cabelitos added a commit to cabelitos/react-native that referenced this issue Dec 18, 2018
…tion

Starting on API level 25, Android will destroy the TextureView's TextureLayer when the
an app is sent to the background and automatically create a new one once the TextureView is
drawed again. This causes a problem for ARTSurfaceView, because this component does not draw itself
and the Android API explicitly forbids to do such action. Since there's no listeners available to know
when the new TextureLayer was created, the ARTSufurfaceViewShadowNode will listen for life cycle events
and redraw its children once the activity is resumed.

It's was also discussed that ARTSurfaceView should extends SurfaceView and not TextureView, however
this may introduce two problems:

* SurfaceView is not hardware accelerated, which may cause impact on performance
* SurfaceView does not support opacity, so it will be impossible to set the ARTSufraceView as
transparent

With this problems in mind, this commit keeps the ARTSurfaceView extending TextureView.

Fixes facebook#17565
hshiraiwa pushed a commit to hshiraiwa/react-native that referenced this issue Jan 14, 2019
…tion

Starting on API level 25, Android will destroy the TextureView's TextureLayer when the
an app is sent to the background and automatically create a new one once the TextureView is
drawed again. This causes a problem for ARTSurfaceView, because this component does not draw itself
and the Android API explicitly forbids to do such action. Since there's no listeners available to know
when the new TextureLayer was created, the ARTSufurfaceViewShadowNode will listen for life cycle events
and redraw its children once the activity is resumed.

It's was also discussed that ARTSurfaceView should extends SurfaceView and not TextureView, however
this may introduce two problems:

* SurfaceView is not hardware accelerated, which may cause impact on performance
* SurfaceView does not support opacity, so it will be impossible to set the ARTSufraceView as
transparent

With this problems in mind, this commit keeps the ARTSurfaceView extending TextureView.

Fixes facebook#17565
@hramos hramos removed the Bug Report label Feb 6, 2019
@ksincennes
Copy link

Hello, are there any updates on this? Is it planned for the next release of React Native or would it be better to make a fork and fix it there?

@hramos hramos added Resolution: PR Submitted A pull request with a fix has been provided. and removed Core Team labels Mar 8, 2019
@cpojer
Copy link
Contributor

cpojer commented May 9, 2019

We just merged the PR that is supposed to fix this issue, to be shipped with 0.61.

@baragatti
Copy link

baragatti commented Jun 13, 2019

While 0.61 isn't released yet, I've done a workaround solution that isn't perfect but works.
I've created a Surface class that updates it key when going foreground, then React Native lifecycle will destroy and create the instance.

import React from 'react';
import {
  AppState,
  ART,
  ARTSurfaceProps,
} from 'react-native';

const { Surface: RNSurface } = ART;
const uuid = () => Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);

export default class Surface extends React.Component<ARTSurfaceProps> {
  constructor(props) {
    super(props);

    const propKey = props.key || 'surface';

    this.state = {
      key: `${propKey}-${uuid()}`,
      propKey,
      appState: AppState.currentState,
    };
  }

  componentDidMount() {
    AppState.addEventListener('change', this.handleAppStateChange);
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange);
  }

  static getDerivedStateFromProps(nextProps, prevState) {
    const propKey = nextProps.key || 'surface';

    if (propKey !== prevState.propKey) {
      return {
        key: `${propKey}-${uuid()}`,
        propKey,
      };
    }

    return null;
  }

  handleAppStateChange = (nextAppState) => {
    const {
      appState,
      propKey,
    } = this.state;

    if (appState.match(/inactive|background/) && nextAppState === 'active') {
      this.setState({ appState: nextAppState, key: `${propKey}-${uuid()}` });
    } else if (appState === 'active' && nextAppState.match(/inactive|background/)) {
      this.setState({ appState: nextAppState });
    }
  };

  render() {
    const { key } = this.state;

    return (
      <RNSurface
        key={key}
        {...this.props}
      />
    );
  }
}

@taoqf
Copy link

taoqf commented Jun 15, 2019

When will 0.61 be released?

pennersr added a commit to pennersr/react-native that referenced this issue Jun 23, 2019
commit d80cb15
Author: Guilherme Iscaro <iscaro@profusion.mobi>
Date:   Wed Dec 12 18:56:08 2018 -0200

    ARTSurfaceViewShadowNode: Avoid not drawing the Surface View

    Calls updateExtraData(), which registers the surface texture listener may arrive too late,
    thus the SurfaceTexture may already have been created which will case onSurfaceTextureAvailable()
    to never be called, ultimatilly causing the surface to not be drawed.

    As a fix this patch checks if the SurfaceTexture is ready to use and if so draw the surface right away.

commit c767175
Author: Guilherme Iscaro <iscaro@profusion.mobi>
Date:   Wed Dec 12 18:45:55 2018 -0200

    ARTSurfaceViewShadowNode: redraw itself if the host resumed the execution

    Starting on API level 25, Android will destroy the TextureView's TextureLayer when the
    an app is sent to the background and automatically create a new one once the TextureView is
    drawed again. This causes a problem for ARTSurfaceView, because this component does not draw itself
    and the Android API explicitly forbids to do such action. Since there's no listeners available to know
    when the new TextureLayer was created, the ARTSufurfaceViewShadowNode will listen for life cycle events
    and redraw its children once the activity is resumed.

    It's was also discussed that ARTSurfaceView should extends SurfaceView and not TextureView, however
    this may introduce two problems:

    * SurfaceView is not hardware accelerated, which may cause impact on performance
    * SurfaceView does not support opacity, so it will be impossible to set the ARTSufraceView as
    transparent

    With this problems in mind, this commit keeps the ARTSurfaceView extending TextureView.

    Fixes facebook#17565

commit 793669f
Author: Guilherme Iscaro <iscaro@profusion.mobi>
Date:   Wed Dec 12 18:43:54 2018 -0200

    ARTSurfaceViewShadowNode: Properly release mSurface

    Since onSurfaceTextureDestroyed() returns true, the SurfaceTexture object will be released
    by the Android automatically so there's no need to call release on it. However,
    the node should release its refereces to the Surface object.
@duccyf
Copy link

duccyf commented Jul 1, 2019

@baragatti, It worked. Thank you.

mnzaki added a commit to jolocom/smartwallet-app that referenced this issue Jul 23, 2019
@HideOnBushTuT
Copy link

While 0.61 isn't released yet, I've done a workaround solution that isn't perfect but works.
I've created a Surface class that updates it key when going foreground, then React Native lifecycle will destroy and create the instance.

import React from 'react';
import {
  AppState,
  ART,
  ARTSurfaceProps,
} from 'react-native';

const { Surface: RNSurface } = ART;
const uuid = () => Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);

export default class Surface extends React.Component<ARTSurfaceProps> {
  constructor(props) {
    super(props);

    const propKey = props.key || 'surface';

    this.state = {
      key: `${propKey}-${uuid()}`,
      propKey,
      appState: AppState.currentState,
    };
  }

  componentDidMount() {
    AppState.addEventListener('change', this.handleAppStateChange);
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange);
  }

  static getDerivedStateFromProps(nextProps, prevState) {
    const propKey = nextProps.key || 'surface';

    if (propKey !== prevState.propKey) {
      return {
        key: `${propKey}-${uuid()}`,
        propKey,
      };
    }

    return null;
  }

  handleAppStateChange = (nextAppState) => {
    const {
      appState,
      propKey,
    } = this.state;

    if (appState.match(/inactive|background/) && nextAppState === 'active') {
      this.setState({ appState: nextAppState, key: `${propKey}-${uuid()}` });
    } else if (appState === 'active' && nextAppState.match(/inactive|background/)) {
      this.setState({ appState: nextAppState });
    }
  };

  render() {
    const { key } = this.state;

    return (
      <RNSurface
        key={key}
        {...this.props}
      />
    );
  }
}

Thanks !!!!!! It works . you did help a lot

@facebook facebook locked as resolved and limited conversation to collaborators May 9, 2020
@react-native-bot react-native-bot added the Resolution: Locked This issue was locked by the bot. label May 9, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Bug Help Wanted :octocat: Issues ideal for external contributors. Platform: Android Android applications. Ran Commands One of our bots successfully processed a command. Resolution: Locked This issue was locked by the bot. Resolution: PR Submitted A pull request with a fix has been provided.
Projects
None yet
Development

Successfully merging a pull request may close this issue.