From b00f70033a0a92f91d787a14c72bc3f7c8e98505 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Fri, 5 Aug 2016 12:16:37 +0300 Subject: [PATCH 01/23] [0.32.0-rc.0] Bump version numbers --- React.podspec | 2 +- ReactAndroid/gradle.properties | 2 +- package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/React.podspec b/React.podspec index 1162fa990f3d83..024e886aedd498 100644 --- a/React.podspec +++ b/React.podspec @@ -4,7 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| s.name = "React" - s.version = package['version'] + s.version = "0.32.0-rc.0" s.summary = package['description'] s.description = <<-DESC React Native apps are built using the React JS diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 2d5dd3a7f8d037..3ac3e1def1f32b 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=1000.0.0-master +VERSION_NAME=0.32.0-rc.0 GROUP=com.facebook.react POM_NAME=ReactNative diff --git a/package.json b/package.json index d73d118b65e59d..4f3d3f09b56d45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "1000.0.0", + "version": "0.32.0-rc.0", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { @@ -210,4 +210,4 @@ "react": "~15.3.0-rc.2", "shelljs": "0.6.0" } -} +} \ No newline at end of file From d402a9110e07e73de4d0182e7cfbe73ee6c485f8 Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Wed, 17 Aug 2016 18:16:04 +0300 Subject: [PATCH 02/23] Implemented TODO 7255985: ReactART Surface rendering via TextureView on Android --- .../react/views/art/ARTSurfaceView.java | 28 ++------------ .../views/art/ARTSurfaceViewManager.java | 31 ++++++++++++---- .../views/art/ARTSurfaceViewShadowNode.java | 37 ++++++++++++++----- 3 files changed, 54 insertions(+), 42 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java index 42aecf3927e135..ea55d0b415f112 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java @@ -9,37 +9,15 @@ package com.facebook.react.views.art; -import javax.annotation.Nullable; - import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.view.View; +import android.view.TextureView; /** * Custom {@link View} implementation that draws an ARTSurface React view and its children. */ -public class ARTSurfaceView extends View { - - private @Nullable Bitmap mBitmap; - +public class ARTSurfaceView extends TextureView { public ARTSurfaceView(Context context) { super(context); - } - - public void setBitmap(Bitmap bitmap) { - if (mBitmap != null) { - mBitmap.recycle(); - } - mBitmap = bitmap; - invalidate(); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (mBitmap != null) { - canvas.drawBitmap(mBitmap, 0, 0, null); - } + setOpaque(false); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java index 729fff291df294..3debd161c5ec32 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java @@ -10,6 +10,9 @@ package com.facebook.react.views.art; import android.graphics.Bitmap; +import android.view.TextureView; +import android.view.Surface; +import android.graphics.SurfaceTexture; import com.facebook.csslayout.CSSMeasureMode; import com.facebook.csslayout.CSSNodeAPI; @@ -22,7 +25,9 @@ * invalidating the native view on shadow view updates happening in the underlying tree. */ public class ARTSurfaceViewManager extends - BaseViewManager { + BaseViewManager implements TextureView.SurfaceTextureListener { + + private ARTSurfaceViewShadowNode mShadowNode; private static final String REACT_CLASS = "ARTSurfaceView"; @@ -46,9 +51,9 @@ public String getName() { @Override public ARTSurfaceViewShadowNode createShadowNodeInstance() { - ARTSurfaceViewShadowNode node = new ARTSurfaceViewShadowNode(); - node.setMeasureFunction(MEASURE_FUNCTION); - return node; + mShadowNode = new ARTSurfaceViewShadowNode(); + mShadowNode.setMeasureFunction(MEASURE_FUNCTION); + return mShadowNode; } @Override @@ -58,11 +63,23 @@ public Class getShadowNodeClass() { @Override protected ARTSurfaceView createViewInstance(ThemedReactContext reactContext) { - return new ARTSurfaceView(reactContext); + ARTSurfaceView node = new ARTSurfaceView(reactContext); + node.setSurfaceTextureListener(this); + return node; } @Override - public void updateExtraData(ARTSurfaceView root, Object extraData) { - root.setBitmap((Bitmap) extraData); + public void updateExtraData(ARTSurfaceView root, Object extraData) {} + + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + mShadowNode.setSurface(new Surface(surface)); } + + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + mShadowNode.setSurface(null); + return true; + } + + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java index b6004efa88b214..acd32131502d4a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java @@ -12,15 +12,23 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.view.Surface; import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.UIViewOperationQueue; +import com.facebook.react.uimanager.ReactShadowNode; /** * Shadow node for ART virtual tree root - ARTSurfaceView */ public class ARTSurfaceViewShadowNode extends LayoutShadowNode { + private Surface mSurface; + + public void setSurface(Surface surface) { + mSurface = surface; + } + @Override public boolean isVirtual() { return false; @@ -34,23 +42,32 @@ public boolean isVirtualAnchor() { @Override public void onCollectExtraUpdates(UIViewOperationQueue uiUpdater) { super.onCollectExtraUpdates(uiUpdater); - uiUpdater.enqueueUpdateExtraData(getReactTag(), drawOutput()); + drawOutput(); } - private Object drawOutput() { - // TODO(7255985): Use TextureView and pass Surface from the view to draw on it asynchronously - // instead of passing the bitmap (which is inefficient especially in terms of memory usage) - Bitmap bitmap = Bitmap.createBitmap( - (int) getLayoutWidth(), - (int) getLayoutHeight(), - Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + private void drawOutput() { + if (mSurface == null) { + markChildrenUpdatesSeen(this); + return; + } + + Canvas canvas = mSurface.lockHardwareCanvas(); + Paint paint = new Paint(); for (int i = 0; i < getChildCount(); i++) { ARTVirtualNode child = (ARTVirtualNode) getChildAt(i); child.draw(canvas, paint, 1f); child.markUpdateSeen(); } - return bitmap; + + mSurface.unlockCanvasAndPost(canvas); + } + + private void markChildrenUpdatesSeen(ReactShadowNode shadowNode) { + for (int i = 0; i < shadowNode.getChildCount(); i++) { + ReactShadowNode child = (ReactShadowNode) shadowNode.getChildAt(i); + child.markUpdateSeen(); + markChildrenUpdatesSeen(child); + } } } From 9d73091db61eb1c156b53f7d10224cceb60cd866 Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Fri, 19 Aug 2016 10:37:26 +0300 Subject: [PATCH 03/23] TODO(6352067) implemented: support for dashes in React ART on Android --- .../java/com/facebook/react/views/art/ARTShapeShadowNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java index ce8b5e1362ccee..770739f394ca7d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java @@ -15,6 +15,7 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; +import android.graphics.DashPathEffect; import com.facebook.common.logging.FLog; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; @@ -158,8 +159,7 @@ protected boolean setupStrokePaint(Paint paint, float opacity) { (int) (mStrokeColor[1] * 255), (int) (mStrokeColor[2] * 255)); if (mStrokeDash != null && mStrokeDash.length > 0) { - // TODO(6352067): Support dashes - FLog.w(ReactConstants.TAG, "ART: Dashes are not supported yet!"); + paint.setPathEffect(new DashPathEffect(mStrokeDash, 0)); } return true; } From 47333292873c899ab8e94359e1b6390a5279864d Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Fri, 19 Aug 2016 16:28:39 +0300 Subject: [PATCH 04/23] TODO(7255985): implemented ARTSurface via TextureView in Android --- .../views/art/ARTSurfaceViewManager.java | 22 ++++------------ .../views/art/ARTSurfaceViewShadowNode.java | 26 ++++++++++++++----- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java index 3debd161c5ec32..ced53b4a8704df 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java @@ -11,8 +11,6 @@ import android.graphics.Bitmap; import android.view.TextureView; -import android.view.Surface; -import android.graphics.SurfaceTexture; import com.facebook.csslayout.CSSMeasureMode; import com.facebook.csslayout.CSSNodeAPI; @@ -25,7 +23,7 @@ * invalidating the native view on shadow view updates happening in the underlying tree. */ public class ARTSurfaceViewManager extends - BaseViewManager implements TextureView.SurfaceTextureListener { + BaseViewManager { private ARTSurfaceViewShadowNode mShadowNode; @@ -63,23 +61,13 @@ public Class getShadowNodeClass() { @Override protected ARTSurfaceView createViewInstance(ThemedReactContext reactContext) { - ARTSurfaceView node = new ARTSurfaceView(reactContext); - node.setSurfaceTextureListener(this); + ARTSurfaceView node = new ARTSurfaceView(reactContext); return node; } @Override - public void updateExtraData(ARTSurfaceView root, Object extraData) {} - - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { - mShadowNode.setSurface(new Surface(surface)); - } - - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { - mShadowNode.setSurface(null); - return true; + public void updateExtraData(ARTSurfaceView root, Object extraData) { + ARTSurfaceViewShadowNode shadowNode = (ARTSurfaceViewShadowNode)extraData; + root.setSurfaceTextureListener(shadowNode); } - - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} - public void onSurfaceTextureUpdated(SurfaceTexture surface) {} } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java index acd32131502d4a..9c8b2d582b80a4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java @@ -12,7 +12,11 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Color; import android.view.Surface; +import android.graphics.PorterDuff; +import android.graphics.SurfaceTexture; +import android.view.TextureView; import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.UIViewOperationQueue; @@ -21,14 +25,10 @@ /** * Shadow node for ART virtual tree root - ARTSurfaceView */ -public class ARTSurfaceViewShadowNode extends LayoutShadowNode { +public class ARTSurfaceViewShadowNode extends LayoutShadowNode implements TextureView.SurfaceTextureListener { private Surface mSurface; - public void setSurface(Surface surface) { - mSurface = surface; - } - @Override public boolean isVirtual() { return false; @@ -43,6 +43,7 @@ public boolean isVirtualAnchor() { public void onCollectExtraUpdates(UIViewOperationQueue uiUpdater) { super.onCollectExtraUpdates(uiUpdater); drawOutput(); + uiUpdater.enqueueUpdateExtraData(getReactTag(), this); } private void drawOutput() { @@ -51,7 +52,8 @@ private void drawOutput() { return; } - Canvas canvas = mSurface.lockHardwareCanvas(); + Canvas canvas = mSurface.lockCanvas(null); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); Paint paint = new Paint(); for (int i = 0; i < getChildCount(); i++) { @@ -70,4 +72,16 @@ private void markChildrenUpdatesSeen(ReactShadowNode shadowNode) { markChildrenUpdatesSeen(child); } } + + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + mSurface = new Surface(surface); + } + + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + mSurface = null; + return true; + } + + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} } From a76dbc50f581665637baba3c13a8bd4b0b4d0130 Mon Sep 17 00:00:00 2001 From: Geoffrey Goh Date: Sat, 6 Aug 2016 07:27:20 -0700 Subject: [PATCH 05/23] Should be R.string, not R.strings Summary: Fix regression of https://github.com/rnpm/rnpm-plugin-link/pull/88. Closes https://github.com/facebook/react-native/pull/9252 Differential Revision: D3680785 fbshipit-source-id: a6ea63295ae8f61b17c0a1b2ca5e6a5f5da7437a --- local-cli/rnpm/link/__tests__/android/applyPatch.spec.js | 2 +- local-cli/rnpm/link/src/android/patches/applyParams.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js b/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js index 35ff810574be62..43af95b7c2b76e 100644 --- a/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js +++ b/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js @@ -8,7 +8,7 @@ describe('applyParams', () => { it('apply params to the string', () => { expect( applyParams('${foo}', {foo: 'foo'}, 'react-native') - ).toEqual('this.getResources().getString(R.strings.reactNative_foo)'); + ).toEqual('this.getResources().getString(R.string.reactNative_foo)'); }); it('use null if no params provided', () => { diff --git a/local-cli/rnpm/link/src/android/patches/applyParams.js b/local-cli/rnpm/link/src/android/patches/applyParams.js index d91bbb0d526c0d..44f4d1624795bf 100644 --- a/local-cli/rnpm/link/src/android/patches/applyParams.js +++ b/local-cli/rnpm/link/src/android/patches/applyParams.js @@ -7,7 +7,7 @@ module.exports = function applyParams(str, params, prefix) { const name = toCamelCase(prefix) + '_' + param; return params[param] - ? `this.getResources().getString(R.strings.${name})` + ? `this.getResources().getString(R.string.${name})` : null; } ); From c732ca4a954fc43b489feccea4d5c8fc3d3b0933 Mon Sep 17 00:00:00 2001 From: Geoffrey Goh Date: Fri, 19 Aug 2016 13:54:57 -0700 Subject: [PATCH 06/23] Fix params patch Summary: `this` is a `ReactNativeHost` post RN 0.29, so the current patch doesn't compile. Simply `getResources()` will work for all versions - Post RN 0.29, it will be the method in the outer `MainApplication`, Pre RN 0.29, it will be the method on the `MainActivity`. grabbou Kureev Closes https://github.com/facebook/react-native/pull/9381 Differential Revision: D3744162 fbshipit-source-id: 1fa270bb3268b7b40c6160da948d99ff993c83b1 --- .../rnpm/link/__tests__/android/applyPatch.spec.js | 11 ++++++++++- .../rnpm/link/src/android/patches/applyParams.js | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js b/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js index 43af95b7c2b76e..0994b24aea4186 100644 --- a/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js +++ b/local-cli/rnpm/link/__tests__/android/applyPatch.spec.js @@ -1,3 +1,12 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + 'use strict'; jest.autoMockOff(); @@ -8,7 +17,7 @@ describe('applyParams', () => { it('apply params to the string', () => { expect( applyParams('${foo}', {foo: 'foo'}, 'react-native') - ).toEqual('this.getResources().getString(R.string.reactNative_foo)'); + ).toEqual('getResources().getString(R.string.reactNative_foo)'); }); it('use null if no params provided', () => { diff --git a/local-cli/rnpm/link/src/android/patches/applyParams.js b/local-cli/rnpm/link/src/android/patches/applyParams.js index 44f4d1624795bf..21c1e9545bc49a 100644 --- a/local-cli/rnpm/link/src/android/patches/applyParams.js +++ b/local-cli/rnpm/link/src/android/patches/applyParams.js @@ -1,3 +1,12 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + const toCamelCase = require('lodash').camelCase; module.exports = function applyParams(str, params, prefix) { @@ -7,7 +16,7 @@ module.exports = function applyParams(str, params, prefix) { const name = toCamelCase(prefix) + '_' + param; return params[param] - ? `this.getResources().getString(R.string.${name})` + ? `getResources().getString(R.string.${name})` : null; } ); From be921792cc51621bd971b719c6163d8c7fc68c74 Mon Sep 17 00:00:00 2001 From: James Ide Date: Mon, 8 Aug 2016 02:17:04 -0700 Subject: [PATCH 07/23] Use React 15.3.0 instead of 15.3.0-rc.2 Summary: React 15.3.0 was officially released. We especially should try not depend on RCs in RN releases and npm doesn't handle RC versions well. Closes https://github.com/facebook/react-native/pull/9279 Differential Revision: D3683587 fbshipit-source-id: fc4f8a030769232b7697434a419e1e07e482e308 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4f3d3f09b56d45..1bea982def8c34 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "react-native": "local-cli/wrong-react-native.js" }, "peerDependencies": { - "react": "~15.3.0-rc.2" + "react": "~15.3.0" }, "dependencies": { "absolute-path": "^0.0.0", @@ -207,7 +207,7 @@ "jest-runtime": "~14.1.0", "mock-fs": "^3.11.0", "portfinder": "0.4.0", - "react": "~15.3.0-rc.2", + "react": "~15.3.0", "shelljs": "0.6.0" } } \ No newline at end of file From 01c78be640eb12b38d8f512260aa89c889b200ec Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 8 Aug 2016 03:57:08 -0700 Subject: [PATCH 08/23] Unbreak upgrade to React 15.3.0 fbshipit-source-id: 0373b4dd11895f3b1c76a904a0a59b70aaa845f9 --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bea982def8c34..d15f006691fea1 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,8 @@ "yeoman-generator": "0.21.2", "mime-types": "2.1.11", "whatwg-fetch": "^1.0.0", - "denodeify": "^1.2.1" + "denodeify": "^1.2.1", + "react": "15.3.0" }, "devDependencies": { "babel-eslint": "^6.0.0", From 0d5fa74c1c66a081cdf749a35881ce76895bd04c Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 8 Aug 2016 04:20:47 -0700 Subject: [PATCH 09/23] Specify React dependency correctly fbshipit-source-id: c25ad1b942e75d9a631134fc277306931c7bc859 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d15f006691fea1..6db118d6a00918 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "mime-types": "2.1.11", "whatwg-fetch": "^1.0.0", "denodeify": "^1.2.1", - "react": "15.3.0" + "react": "~15.3.0" }, "devDependencies": { "babel-eslint": "^6.0.0", From 4f5fe812d2d841afaede1217c2a780ac39f148c9 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 9 Aug 2016 03:44:27 -0700 Subject: [PATCH 10/23] Have React only as a peer dependency Reviewed By: davidaurelio Differential Revision: D3683793 fbshipit-source-id: 6ffb8c24e81cfb33b11b9f99d440220287161fb6 --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 6db118d6a00918..1bea982def8c34 100644 --- a/package.json +++ b/package.json @@ -193,8 +193,7 @@ "yeoman-generator": "0.21.2", "mime-types": "2.1.11", "whatwg-fetch": "^1.0.0", - "denodeify": "^1.2.1", - "react": "~15.3.0" + "denodeify": "^1.2.1" }, "devDependencies": { "babel-eslint": "^6.0.0", From ff1c6f98b1e961af10f967a56358e53d5de02218 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Sun, 21 Aug 2016 11:40:21 +0200 Subject: [PATCH 11/23] [0.32.0] Bump version numbers --- React.podspec | 2 +- ReactAndroid/gradle.properties | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/React.podspec b/React.podspec index 024e886aedd498..7991f0bc494af3 100644 --- a/React.podspec +++ b/React.podspec @@ -4,7 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| s.name = "React" - s.version = "0.32.0-rc.0" + s.version = "0.32.0" s.summary = package['description'] s.description = <<-DESC React Native apps are built using the React JS diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 3ac3e1def1f32b..1a038c32f254c3 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.32.0-rc.0 +VERSION_NAME=0.32.0 GROUP=com.facebook.react POM_NAME=ReactNative diff --git a/package.json b/package.json index 1bea982def8c34..9c14f3cdf50a7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.32.0-rc.0", + "version": "0.32.0", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { From 9dad9800b3a121142b2bea99169bc02f33634aeb Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Tue, 23 Aug 2016 17:54:42 +0300 Subject: [PATCH 12/23] TODO(7255985): refactoring of ARTSurface --- .../react/views/art/ARTSurfaceViewManager.java | 17 +++++------------ .../views/art/ARTSurfaceViewShadowNode.java | 4 ++-- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java index ced53b4a8704df..816a78940cfaf5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java @@ -9,9 +9,6 @@ package com.facebook.react.views.art; -import android.graphics.Bitmap; -import android.view.TextureView; - import com.facebook.csslayout.CSSMeasureMode; import com.facebook.csslayout.CSSNodeAPI; import com.facebook.csslayout.MeasureOutput; @@ -25,8 +22,6 @@ public class ARTSurfaceViewManager extends BaseViewManager { - private ARTSurfaceViewShadowNode mShadowNode; - private static final String REACT_CLASS = "ARTSurfaceView"; private static final CSSNodeAPI.MeasureFunction MEASURE_FUNCTION = new CSSNodeAPI.MeasureFunction() { @@ -49,9 +44,9 @@ public String getName() { @Override public ARTSurfaceViewShadowNode createShadowNodeInstance() { - mShadowNode = new ARTSurfaceViewShadowNode(); - mShadowNode.setMeasureFunction(MEASURE_FUNCTION); - return mShadowNode; + ARTSurfaceViewShadowNode node = new ARTSurfaceViewShadowNode(); + node.setMeasureFunction(MEASURE_FUNCTION); + return node; } @Override @@ -61,13 +56,11 @@ public Class getShadowNodeClass() { @Override protected ARTSurfaceView createViewInstance(ThemedReactContext reactContext) { - ARTSurfaceView node = new ARTSurfaceView(reactContext); - return node; + return new ARTSurfaceView(reactContext); } @Override public void updateExtraData(ARTSurfaceView root, Object extraData) { - ARTSurfaceViewShadowNode shadowNode = (ARTSurfaceViewShadowNode)extraData; - root.setSurfaceTextureListener(shadowNode); + root.setSurfaceTextureListener((ARTSurfaceViewShadowNode)extraData); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java index 9c8b2d582b80a4..e2929f0c7e44a1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java @@ -9,7 +9,6 @@ package com.facebook.react.views.art; -import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Color; @@ -25,7 +24,8 @@ /** * Shadow node for ART virtual tree root - ARTSurfaceView */ -public class ARTSurfaceViewShadowNode extends LayoutShadowNode implements TextureView.SurfaceTextureListener { +public class ARTSurfaceViewShadowNode extends LayoutShadowNode + implements TextureView.SurfaceTextureListener { private Surface mSurface; From 2a5c9a1d897bcc5a9e9565f6f4a3b015453c1cc6 Mon Sep 17 00:00:00 2001 From: Alexander Blom Date: Wed, 24 Aug 2016 03:42:45 -0700 Subject: [PATCH 13/23] Don't clear queue in ProxyExecutor Reviewed By: mhorowitz Differential Revision: D3757216 fbshipit-source-id: 5adda2dcdfb438b65fe668c52e0d2e35705eed9f --- ReactAndroid/src/main/jni/xreact/jni/ProxyExecutor.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/jni/xreact/jni/ProxyExecutor.cpp b/ReactAndroid/src/main/jni/xreact/jni/ProxyExecutor.cpp index 011a12f563e33b..53cf147fb4e297 100644 --- a/ReactAndroid/src/main/jni/xreact/jni/ProxyExecutor.cpp +++ b/ReactAndroid/src/main/jni/xreact/jni/ProxyExecutor.cpp @@ -78,7 +78,8 @@ void ProxyExecutor::loadApplicationScript( loadApplicationScript( m_executor.get(), jni::make_jstring(sourceURL).get()); - executeJSCallWithProxy(m_executor.get(), "flushedQueue", std::vector()); + // We can get pending calls here to native but the queue will be drained when + // we launch the application. } void ProxyExecutor::setJSModulesUnbundle(std::unique_ptr) { From 37a05edbd2df88edbceaa096948a86dbb31ced8d Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Tue, 23 Aug 2016 04:13:27 -0700 Subject: [PATCH 14/23] Bring back missing android command Summary: Fixes #9312 (Sorry for inconvenience, could've been removed by mistake!) Bonus: projectName can be configured rather than always defaulting to package.json name, not sure if helpful, but just added it since we have a `default` function that makes sense in this case. Closes https://github.com/facebook/react-native/pull/9525 Differential Revision: D3753610 Pulled By: bestander fbshipit-source-id: 641872855b9865502f4055910262686edc4b504e --- .flowconfig | 2 +- local-cli/android/android.js | 32 ++++++++++++++++++++++++++++++++ local-cli/commands.js | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 local-cli/android/android.js diff --git a/.flowconfig b/.flowconfig index 43acd4c9d34a5f..16132121252f0c 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,7 +1,7 @@ [ignore] # We fork some components by platform. -.*/*.android.js +.*/*[.]android.js # Ignore templates with `@flow` in header .*/local-cli/generator.* diff --git a/local-cli/android/android.js b/local-cli/android/android.js new file mode 100644 index 00000000000000..016389824022f4 --- /dev/null +++ b/local-cli/android/android.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +var generate = require('../generate/generate'); +var fs = require('fs'); + +function android(argv, config, args) { + return generate([ + '--platform', 'android', + '--project-path', process.cwd(), + '--project-name', args.projectName, + ], config); +} + +module.exports = { + name: 'android', + description: 'creates an empty android project', + func: android, + options: [{ + command: '--project-name [name]', + default: () => JSON.parse( + fs.readFileSync('package.json', 'utf8') + ).name, + }], +}; diff --git a/local-cli/commands.js b/local-cli/commands.js index e696b35be1f4e5..3813bac325b559 100644 --- a/local-cli/commands.js +++ b/local-cli/commands.js @@ -31,6 +31,7 @@ export type Command = { }; const documentedCommands = [ + require('./android/android'), require('./server/server'), require('./runIOS/runIOS'), require('./runAndroid/runAndroid'), From fa660c6392b765c51b79bda112e8fe1bc79f34aa Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 25 Aug 2016 12:54:38 +0200 Subject: [PATCH 15/23] Revert "[0.32.0] Bump version numbers" This reverts commit ff1c6f98b1e961af10f967a56358e53d5de02218. --- React.podspec | 2 +- ReactAndroid/gradle.properties | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/React.podspec b/React.podspec index 7991f0bc494af3..024e886aedd498 100644 --- a/React.podspec +++ b/React.podspec @@ -4,7 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| s.name = "React" - s.version = "0.32.0" + s.version = "0.32.0-rc.0" s.summary = package['description'] s.description = <<-DESC React Native apps are built using the React JS diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 1a038c32f254c3..3ac3e1def1f32b 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.32.0 +VERSION_NAME=0.32.0-rc.0 GROUP=com.facebook.react POM_NAME=ReactNative diff --git a/package.json b/package.json index 9c14f3cdf50a7d..1bea982def8c34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.32.0", + "version": "0.32.0-rc.0", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { From 96877a0e68719ab4fa8662646a02e5fbc016c722 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 25 Aug 2016 12:55:00 +0200 Subject: [PATCH 16/23] [0.32.0] Bump version numbers --- React.podspec | 2 +- ReactAndroid/gradle.properties | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/React.podspec b/React.podspec index 024e886aedd498..7991f0bc494af3 100644 --- a/React.podspec +++ b/React.podspec @@ -4,7 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| s.name = "React" - s.version = "0.32.0-rc.0" + s.version = "0.32.0" s.summary = package['description'] s.description = <<-DESC React Native apps are built using the React JS diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 3ac3e1def1f32b..1a038c32f254c3 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.32.0-rc.0 +VERSION_NAME=0.32.0 GROUP=com.facebook.react POM_NAME=ReactNative diff --git a/package.json b/package.json index 1bea982def8c34..9c14f3cdf50a7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.32.0-rc.0", + "version": "0.32.0", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { From e72181447e137cac5c8052bda6abd3b9fe7b56a3 Mon Sep 17 00:00:00 2001 From: Konstantin Raev Date: Mon, 22 Aug 2016 11:12:56 -0700 Subject: [PATCH 17/23] Fixes paths to robolectric when they are downloaded from maven into buck-out Reviewed By: mmmulani Differential Revision: D3751888 fbshipit-source-id: 2a70e8655f3c6e6dcc2de17e85289d9db18a2699 --- .../java/robolectric3/robolectric/BUCK | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/BUCK b/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/BUCK index 1f5d94f7670a33..e172113aad1571 100644 --- a/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/BUCK +++ b/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/BUCK @@ -110,8 +110,16 @@ prebuilt_jar( visibility = ['//ReactAndroid/...',], ) -remote_file( +# This new rule will make the .jar file appear in the "right" location, +# though that may change in the future +export_file( name = 'robolectric-android-all-binary-jar', + src = ':robolectric-android-all-binary-remote-jar', + out = 'android-all-4.1.2_r1-robolectric-0.jar', # name defines filename used by robolectric in runtime +) + +remote_file( + name = 'robolectric-android-all-binary-remote-jar', url = 'mvn:org.robolectric:android-all:jar:4.1.2_r1-robolectric-0', sha1 = 'aecc8ce5119a25fcea1cdf8285469c9d1261a352', ) @@ -122,8 +130,14 @@ prebuilt_jar( visibility = ['//ReactAndroid/...',], ) -remote_file( +export_file( name = 'json-jar', + src = ':json-remote-jar', + out = 'json-20080701.jar', # name defines filename used by robolectric in runtime +) + +remote_file( + name = 'json-remote-jar', url = 'mvn:org.json:json:jar:20080701', sha1 = 'd652f102185530c93b66158b1859f35d45687258', ) @@ -134,8 +148,14 @@ prebuilt_jar( visibility = ['//ReactAndroid/...',], ) -remote_file( +export_file( name = 'tagsoup-jar', + src = ':tagsoup-remote-jar', + out = 'tagsoup-1.2.jar', # name defines filename used by robolectric in runtime +) + +remote_file( + name = 'tagsoup-remote-jar', url = 'mvn:org.ccil.cowan.tagsoup:tagsoup:jar:1.2', sha1 = '639fd364750d7363c85797dc944b4a80f78fa684', ) @@ -146,8 +166,14 @@ prebuilt_jar( visibility = ['//ReactAndroid/...',], ) -remote_file( +export_file( name = 'robolectric-shadows-binary-jar', + src = ':robolectric-shadows-binary-remote-jar', + out = 'shadows-core-3.0-16.jar', # name defines filename used by robolectric in runtime +) + +remote_file( + name = 'robolectric-shadows-binary-remote-jar', url = 'https://repo1.maven.org/maven2/org/robolectric/shadows-core/3.0/shadows-core-3.0-16.jar', sha1 = '39d7a856bf91640b1a6d044333336a2b3f3c198f', ) From 3a3ecc40d50b90a2a4dfe5a44f418d16ea942a50 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 8 Aug 2016 03:28:42 -0700 Subject: [PATCH 18/23] Make sure layout happens after setFrame:forView: Reviewed By: majak Differential Revision: D3682745 fbshipit-source-id: 108ff292aa79765d8e5bb7fc364717eba662c0ea --- React/Modules/RCTUIManager.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 538428c0286adf..264c01950fcdf9 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -232,7 +232,7 @@ - (void)didReceiveNewContentSizeMultiplier dispatch_async(RCTGetUIManagerQueue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:RCTUIManagerWillUpdateViewsDueToContentSizeMultiplierChangeNotification object:self]; - [self batchDidComplete]; + [self setNeedsLayout]; }); } @@ -424,8 +424,10 @@ - (void)setFrame:(CGRect)frame forView:(UIView *)view RCTShadowView *shadowView = self->_shadowViewRegistry[reactTag]; RCTAssert(shadowView != nil, @"Could not locate shadow view with tag #%@", reactTag); + BOOL needsLayout = NO; if (!CGRectEqualToRect(frame, shadowView.frame)) { shadowView.frame = frame; + needsLayout = YES; } // Trigger re-layout when size flexibility changes, as the root view might grow or @@ -434,9 +436,13 @@ - (void)setFrame:(CGRect)frame forView:(UIView *)view RCTRootShadowView *rootShadowView = (RCTRootShadowView *)shadowView; if (rootShadowView.sizeFlexibility != sizeFlexibility) { rootShadowView.sizeFlexibility = sizeFlexibility; - [self batchDidComplete]; + needsLayout = YES; } } + + if (needsLayout) { + [self setNeedsLayout]; + } }); } @@ -451,7 +457,7 @@ - (void)setIntrinsicContentSize:(CGSize)size forView:(UIView *)view shadowView.intrinsicContentSize = size; - [self batchDidComplete]; + [self setNeedsLayout]; }); } From 7a1410aca622b896bf4b63744991b61a9c57c6c0 Mon Sep 17 00:00:00 2001 From: Konstantin Raev Date: Wed, 7 Sep 2016 11:31:45 +0100 Subject: [PATCH 19/23] [0.32.1] Bump version numbers --- React.podspec | 2 +- ReactAndroid/gradle.properties | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/React.podspec b/React.podspec index 7991f0bc494af3..ffcda7a4b1fddc 100644 --- a/React.podspec +++ b/React.podspec @@ -4,7 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| s.name = "React" - s.version = "0.32.0" + s.version = "0.32.1" s.summary = package['description'] s.description = <<-DESC React Native apps are built using the React JS diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 1a038c32f254c3..6a74ee949d31fc 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.32.0 +VERSION_NAME=0.32.1 GROUP=com.facebook.react POM_NAME=ReactNative diff --git a/package.json b/package.json index 9c14f3cdf50a7d..5df775eb12a7d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.32.0", + "version": "0.32.1", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { From 1311c45702a6037a5e3bdc0750fda432e4bd9506 Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Fri, 9 Sep 2016 10:58:23 +0300 Subject: [PATCH 20/23] WebSocket onError fix; Dashes in Android; ARTSurface via TextureView --- Libraries/WebSocket/WebSocket.js | 1 + .../react/views/art/ARTShapeShadowNode.java | 4 +- .../react/views/art/ARTSurfaceView.java | 28 +------ .../views/art/ARTSurfaceViewManager.java | 8 +- .../views/art/ARTSurfaceViewShadowNode.java | 73 +++++++++++++++---- 5 files changed, 68 insertions(+), 46 deletions(-) diff --git a/Libraries/WebSocket/WebSocket.js b/Libraries/WebSocket/WebSocket.js index 16f2866ca45601..93065683f424c8 100644 --- a/Libraries/WebSocket/WebSocket.js +++ b/Libraries/WebSocket/WebSocket.js @@ -192,6 +192,7 @@ class WebSocket extends EventTarget(...WEBSOCKET_EVENTS) { if (ev.id !== this._socketId) { return; } + this.readyState = this.CLOSED; this.dispatchEvent(new WebSocketEvent('error', { message: ev.message, })); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java index ce8b5e1362ccee..770739f394ca7d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java @@ -15,6 +15,7 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; +import android.graphics.DashPathEffect; import com.facebook.common.logging.FLog; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; @@ -158,8 +159,7 @@ protected boolean setupStrokePaint(Paint paint, float opacity) { (int) (mStrokeColor[1] * 255), (int) (mStrokeColor[2] * 255)); if (mStrokeDash != null && mStrokeDash.length > 0) { - // TODO(6352067): Support dashes - FLog.w(ReactConstants.TAG, "ART: Dashes are not supported yet!"); + paint.setPathEffect(new DashPathEffect(mStrokeDash, 0)); } return true; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java index 42aecf3927e135..ea55d0b415f112 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceView.java @@ -9,37 +9,15 @@ package com.facebook.react.views.art; -import javax.annotation.Nullable; - import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.view.View; +import android.view.TextureView; /** * Custom {@link View} implementation that draws an ARTSurface React view and its children. */ -public class ARTSurfaceView extends View { - - private @Nullable Bitmap mBitmap; - +public class ARTSurfaceView extends TextureView { public ARTSurfaceView(Context context) { super(context); - } - - public void setBitmap(Bitmap bitmap) { - if (mBitmap != null) { - mBitmap.recycle(); - } - mBitmap = bitmap; - invalidate(); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (mBitmap != null) { - canvas.drawBitmap(mBitmap, 0, 0, null); - } + setOpaque(false); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java index 729fff291df294..e19101f6e48f04 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java @@ -12,7 +12,7 @@ import android.graphics.Bitmap; import com.facebook.csslayout.CSSMeasureMode; -import com.facebook.csslayout.CSSNodeAPI; +import com.facebook.csslayout.CSSNode; import com.facebook.csslayout.MeasureOutput; import com.facebook.react.uimanager.BaseViewManager; import com.facebook.react.uimanager.ThemedReactContext; @@ -26,10 +26,10 @@ public class ARTSurfaceViewManager extends private static final String REACT_CLASS = "ARTSurfaceView"; - private static final CSSNodeAPI.MeasureFunction MEASURE_FUNCTION = new CSSNodeAPI.MeasureFunction() { + private static final CSSNode.MeasureFunction MEASURE_FUNCTION = new CSSNode.MeasureFunction() { @Override public void measure( - CSSNodeAPI node, + CSSNode node, float width, CSSMeasureMode widthMode, float height, @@ -63,6 +63,6 @@ protected ARTSurfaceView createViewInstance(ThemedReactContext reactContext) { @Override public void updateExtraData(ARTSurfaceView root, Object extraData) { - root.setBitmap((Bitmap) extraData); + root.setSurfaceTextureListener((ARTSurfaceViewShadowNode)extraData); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java index b6004efa88b214..a1a5a843651014 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java @@ -12,14 +12,25 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Color; +import android.view.Surface; +import android.graphics.PorterDuff; +import android.graphics.SurfaceTexture; +import android.view.TextureView; +import com.facebook.common.logging.FLog; +import com.facebook.react.common.ReactConstants; import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.UIViewOperationQueue; +import com.facebook.react.uimanager.ReactShadowNode; /** * Shadow node for ART virtual tree root - ARTSurfaceView */ -public class ARTSurfaceViewShadowNode extends LayoutShadowNode { +public class ARTSurfaceViewShadowNode extends LayoutShadowNode + implements TextureView.SurfaceTextureListener { + + private Surface mSurface; @Override public boolean isVirtual() { @@ -34,23 +45,55 @@ public boolean isVirtualAnchor() { @Override public void onCollectExtraUpdates(UIViewOperationQueue uiUpdater) { super.onCollectExtraUpdates(uiUpdater); - uiUpdater.enqueueUpdateExtraData(getReactTag(), drawOutput()); + drawOutput(); + uiUpdater.enqueueUpdateExtraData(getReactTag(), this); + } + + private void drawOutput() { + if (mSurface == null || !mSurface.isValid()) { + markChildrenUpdatesSeen(this); + return; + } + + try { + Canvas canvas = mSurface.lockCanvas(null); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + + Paint paint = new Paint(); + for (int i = 0; i < getChildCount(); i++) { + ARTVirtualNode child = (ARTVirtualNode) getChildAt(i); + child.draw(canvas, paint, 1f); + child.markUpdateSeen(); + } + + if (mSurface == null) { + return; + } + + mSurface.unlockCanvasAndPost(canvas); + } catch(IllegalArgumentException e) { + FLog.e(ReactConstants.TAG, "IllegalArgumentException in Surface.unlockCanvasAndPost"); + } } - private Object drawOutput() { - // TODO(7255985): Use TextureView and pass Surface from the view to draw on it asynchronously - // instead of passing the bitmap (which is inefficient especially in terms of memory usage) - Bitmap bitmap = Bitmap.createBitmap( - (int) getLayoutWidth(), - (int) getLayoutHeight(), - Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - Paint paint = new Paint(); - for (int i = 0; i < getChildCount(); i++) { - ARTVirtualNode child = (ARTVirtualNode) getChildAt(i); - child.draw(canvas, paint, 1f); + private void markChildrenUpdatesSeen(ReactShadowNode shadowNode) { + for (int i = 0; i < shadowNode.getChildCount(); i++) { + ReactShadowNode child = (ReactShadowNode) shadowNode.getChildAt(i); child.markUpdateSeen(); + markChildrenUpdatesSeen(child); } - return bitmap; } + + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + mSurface = new Surface(surface); + } + + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + mSurface.release(); + mSurface = null; + return true; + } + + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} } From 4b807300120c7b86c9b867468633d7f570e7d5e0 Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Fri, 9 Sep 2016 11:47:46 +0300 Subject: [PATCH 21/23] Fixed: CSSNodeAPI instad of CSSNode --- .../com/facebook/react/views/art/ARTSurfaceViewManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java index e19101f6e48f04..d942b2bc88463e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewManager.java @@ -12,7 +12,7 @@ import android.graphics.Bitmap; import com.facebook.csslayout.CSSMeasureMode; -import com.facebook.csslayout.CSSNode; +import com.facebook.csslayout.CSSNodeAPI; import com.facebook.csslayout.MeasureOutput; import com.facebook.react.uimanager.BaseViewManager; import com.facebook.react.uimanager.ThemedReactContext; @@ -26,10 +26,10 @@ public class ARTSurfaceViewManager extends private static final String REACT_CLASS = "ARTSurfaceView"; - private static final CSSNode.MeasureFunction MEASURE_FUNCTION = new CSSNode.MeasureFunction() { + private static final CSSNodeAPI.MeasureFunction MEASURE_FUNCTION = new CSSNodeAPI.MeasureFunction() { @Override public void measure( - CSSNode node, + CSSNodeAPI node, float width, CSSMeasureMode widthMode, float height, From dc979014835df8a5ec07b2dc4de390f8311ebb13 Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Mon, 19 Sep 2016 16:58:34 +0300 Subject: [PATCH 22/23] Added IllegalStateException in ArtSurfaceViewShadowNode --- .../facebook/react/views/art/ARTSurfaceViewShadowNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java index a1a5a843651014..93833e9da11abc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTSurfaceViewShadowNode.java @@ -71,8 +71,8 @@ private void drawOutput() { } mSurface.unlockCanvasAndPost(canvas); - } catch(IllegalArgumentException e) { - FLog.e(ReactConstants.TAG, "IllegalArgumentException in Surface.unlockCanvasAndPost"); + } catch(IllegalArgumentException | IllegalStateException e) { + FLog.e(ReactConstants.TAG, e.getClass().getSimpleName() + " in Surface.unlockCanvasAndPost"); } } From 09a22fcf26d623c0f7afe781de8f8fecc5c0baeb Mon Sep 17 00:00:00 2001 From: Dmitry Petukhov Date: Mon, 5 Sep 2016 14:40:12 +0300 Subject: [PATCH 23/23] Removed throwing exception "Cannot send a message. Unknown WebSocket id" --- .../modules/websocket/WebSocketModule.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java index 3c6799efa467e8..c15de3fd13f92d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java @@ -202,7 +202,11 @@ public void send(String message, int id) { WebSocket client = mWebSocketConnections.get(id); if (client == null) { // This is a programmer error - throw new RuntimeException("Cannot send a message. Unknown WebSocket id " + id); + return; + // throw new RuntimeException("Cannot send a message. Unknown WebSocket id " + id + // + (mWebSocketConnections.containsKey(id) ? "Has key in map. " : "No key in map. " ) + // + "Message: " + message + // ); } try { client.sendMessage(RequestBody.create(WebSocket.TEXT, message)); @@ -216,7 +220,11 @@ public void sendBinary(String base64String, int id) { WebSocket client = mWebSocketConnections.get(id); if (client == null) { // This is a programmer error - throw new RuntimeException("Cannot send a message. Unknown WebSocket id " + id); + return; + // throw new RuntimeException( + // "Cannot send a message. Unknown WebSocket id " + id + // + (mWebSocketConnections.containsKey(id) ? "Has key in map. " : "No key in map. " ) + // ); } try { client.sendMessage(RequestBody.create(WebSocket.BINARY, ByteString.decodeBase64(base64String))); @@ -230,7 +238,11 @@ public void ping(int id) { WebSocket client = mWebSocketConnections.get(id); if (client == null) { // This is a programmer error - throw new RuntimeException("Cannot send a message. Unknown WebSocket id " + id); + return; + // throw new RuntimeException( + // "Cannot send a message. Unknown WebSocket id " + id + // + (mWebSocketConnections.containsKey(id) ? "Has key in map. " : "No key in map. " ) + // ); } try { Buffer buffer = new Buffer();