mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
7
Commits
nc/react-sync
...
v0.48.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47f6e5782e | ||
|
|
28c7535a75 | ||
|
|
373f7edf55 | ||
|
|
ab64f7b9e8 | ||
|
|
96b32d7be8 | ||
|
|
4d572cd0f8 | ||
|
|
580805968c |
@@ -72,7 +72,6 @@ const SwipeableRow = createReactClass({
|
||||
propTypes: {
|
||||
children: PropTypes.any,
|
||||
isOpen: PropTypes.bool,
|
||||
preventSwipeLeft: PropTypes.bool,
|
||||
preventSwipeRight: PropTypes.bool,
|
||||
maxSwipeDistance: PropTypes.number.isRequired,
|
||||
onOpen: PropTypes.func.isRequired,
|
||||
@@ -110,7 +109,6 @@ const SwipeableRow = createReactClass({
|
||||
getDefaultProps(): Object {
|
||||
return {
|
||||
isOpen: false,
|
||||
preventSwipeLeft: false,
|
||||
preventSwipeRight: false,
|
||||
maxSwipeDistance: 0,
|
||||
onOpen: emptyFunction,
|
||||
@@ -339,12 +337,10 @@ const SwipeableRow = createReactClass({
|
||||
|
||||
// Ignore swipes due to user's finger moving slightly when tapping
|
||||
_isValidSwipe(gestureState: Object): boolean {
|
||||
if (this.props.preventSwipeLeft && gestureState.dx < 0) {
|
||||
return false;
|
||||
}
|
||||
if (this.props.preventSwipeRight && gestureState.dx > 0) {
|
||||
if (this.props.preventSwipeRight && this._previousLeft === CLOSED_LEFT_POSITION && gestureState.dx > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Math.abs(gestureState.dx) > HORIZONTAL_SWIPE_DISTANCE_THRESHOLD;
|
||||
},
|
||||
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"];
|
||||
__block NSInteger count = 0;
|
||||
BOOL success = [reader readAllParts:^(NSDictionary *headers, NSData *content, BOOL done) {
|
||||
BOOL success = [reader readAllPartsWithCompletionCallback:^(NSDictionary *headers, NSData *content, BOOL done) {
|
||||
XCTAssertTrue(done);
|
||||
XCTAssertEqualObjects(headers[@"Content-Type"], @"application/json; charset=utf-8");
|
||||
XCTAssertEqualObjects([[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding], @"{}");
|
||||
count++;
|
||||
}];
|
||||
} progressCallback: nil];
|
||||
XCTAssertTrue(success);
|
||||
XCTAssertEqual(count, 1);
|
||||
}
|
||||
@@ -56,13 +56,13 @@
|
||||
NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"];
|
||||
__block NSInteger count = 0;
|
||||
BOOL success = [reader readAllParts:^(__unused NSDictionary *headers, NSData *content, BOOL done) {
|
||||
BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, NSData *content, BOOL done) {
|
||||
count++;
|
||||
XCTAssertEqual(done, count == 3);
|
||||
NSString *expectedBody = [NSString stringWithFormat:@"%ld", (long)count];
|
||||
NSString *actualBody = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding];
|
||||
XCTAssertEqualObjects(actualBody, expectedBody);
|
||||
}];
|
||||
} progressCallback:nil];
|
||||
XCTAssertTrue(success);
|
||||
XCTAssertEqual(count, 3);
|
||||
}
|
||||
@@ -73,9 +73,9 @@
|
||||
NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"];
|
||||
__block NSInteger count = 0;
|
||||
BOOL success = [reader readAllParts:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) {
|
||||
BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) {
|
||||
count++;
|
||||
}];
|
||||
} progressCallback:nil];
|
||||
XCTAssertFalse(success);
|
||||
XCTAssertEqual(count, 0);
|
||||
}
|
||||
@@ -93,9 +93,9 @@
|
||||
NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"];
|
||||
__block NSInteger count = 0;
|
||||
BOOL success = [reader readAllParts:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) {
|
||||
BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) {
|
||||
count++;
|
||||
}];
|
||||
} progressCallback:nil];
|
||||
XCTAssertFalse(success);
|
||||
XCTAssertEqual(count, 1);
|
||||
}
|
||||
|
||||
@@ -198,7 +198,6 @@ static void attemptAsynchronousLoadOfBundleAtURL(NSURL *scriptURL, RCTSourceLoad
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
RCTMultipartDataTask *task = [[RCTMultipartDataTask alloc] initWithURL:scriptURL partHandler:^(NSInteger statusCode, NSDictionary *headers, NSData *data, NSError *error, BOOL done) {
|
||||
if (!done) {
|
||||
if (onProgress) {
|
||||
@@ -261,6 +260,11 @@ static void attemptAsynchronousLoadOfBundleAtURL(NSURL *scriptURL, RCTSourceLoad
|
||||
}
|
||||
|
||||
onComplete(nil, data, data.length);
|
||||
} progressHandler:^(NSDictionary *headers, NSNumber *loaded, NSNumber *total) {
|
||||
// Only care about download progress events for the javascript bundle part.
|
||||
if ([headers[@"Content-Type"] isEqualToString:@"application/javascript"]) {
|
||||
onProgress(progressEventFromDownloadProgress(loaded, total));
|
||||
}
|
||||
}];
|
||||
|
||||
[task startTask];
|
||||
@@ -287,6 +291,16 @@ static RCTLoadingProgress *progressEventFromData(NSData *rawData)
|
||||
return progress;
|
||||
}
|
||||
|
||||
static RCTLoadingProgress *progressEventFromDownloadProgress(NSNumber *total, NSNumber *done)
|
||||
{
|
||||
RCTLoadingProgress *progress = [RCTLoadingProgress new];
|
||||
progress.status = @"Downloading JavaScript bundle";
|
||||
// Progress values are in bytes transform them to kilobytes for smaller numbers.
|
||||
progress.done = done != nil ? @([done integerValue] / 1024) : nil;
|
||||
progress.total = total != nil ? @([total integerValue] / 1024) : nil;
|
||||
return progress;
|
||||
}
|
||||
|
||||
static NSDictionary *userInfoForRawResponse(NSString *rawText)
|
||||
{
|
||||
NSDictionary *parsedResponse = RCTJSONParse(rawText, nil);
|
||||
|
||||
@@ -15,7 +15,10 @@ typedef void (^RCTMultipartDataTaskCallback)(NSInteger statusCode, NSDictionary
|
||||
|
||||
@interface RCTMultipartDataTask : NSObject
|
||||
|
||||
- (instancetype)initWithURL:(NSURL *)url partHandler:(RCTMultipartDataTaskCallback)partHandler;
|
||||
- (instancetype)initWithURL:(NSURL *)url
|
||||
partHandler:(RCTMultipartDataTaskCallback)partHandler
|
||||
progressHandler:(RCTMultipartProgressCallback)progressHandler;
|
||||
|
||||
- (void)startTask;
|
||||
|
||||
@end
|
||||
|
||||
@@ -30,17 +30,21 @@ static BOOL isStreamTaskSupported() {
|
||||
@implementation RCTMultipartDataTask {
|
||||
NSURL *_url;
|
||||
RCTMultipartDataTaskCallback _partHandler;
|
||||
RCTMultipartProgressCallback _progressHandler;
|
||||
NSInteger _statusCode;
|
||||
NSDictionary *_headers;
|
||||
NSString *_boundary;
|
||||
NSMutableData *_data;
|
||||
}
|
||||
|
||||
- (instancetype)initWithURL:(NSURL *)url partHandler:(RCTMultipartDataTaskCallback)partHandler
|
||||
- (instancetype)initWithURL:(NSURL *)url
|
||||
partHandler:(RCTMultipartDataTaskCallback)partHandler
|
||||
progressHandler:(RCTMultipartProgressCallback)progressHandler
|
||||
{
|
||||
if (self = [super init]) {
|
||||
_url = url;
|
||||
_partHandler = [partHandler copy];
|
||||
_progressHandler = [progressHandler copy];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -117,9 +121,9 @@ didBecomeInputStream:(NSInputStream *)inputStream
|
||||
_partHandler = nil;
|
||||
NSInteger statusCode = _statusCode;
|
||||
|
||||
BOOL completed = [reader readAllParts:^(NSDictionary *headers, NSData *content, BOOL done) {
|
||||
BOOL completed = [reader readAllPartsWithCompletionCallback:^(NSDictionary *headers, NSData *content, BOOL done) {
|
||||
partHandler(statusCode, headers, content, nil, done);
|
||||
}];
|
||||
} progressCallback:_progressHandler];
|
||||
if (!completed) {
|
||||
partHandler(statusCode, nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:nil], YES);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef void (^RCTMultipartCallback)(NSDictionary *headers, NSData *content, BOOL done);
|
||||
typedef void (^RCTMultipartProgressCallback)(NSDictionary *headers, NSNumber *loaded, NSNumber *total);
|
||||
|
||||
|
||||
// RCTMultipartStreamReader can be used to parse responses with Content-Type: multipart/mixed
|
||||
@@ -17,6 +18,7 @@ typedef void (^RCTMultipartCallback)(NSDictionary *headers, NSData *content, BOO
|
||||
@interface RCTMultipartStreamReader : NSObject
|
||||
|
||||
- (instancetype)initWithInputStream:(NSInputStream *)stream boundary:(NSString *)boundary;
|
||||
- (BOOL)readAllParts:(RCTMultipartCallback)callback;
|
||||
- (BOOL)readAllPartsWithCompletionCallback:(RCTMultipartCallback)callback
|
||||
progressCallback:(RCTMultipartProgressCallback)progressCallback;
|
||||
|
||||
@end
|
||||
|
||||
@@ -9,11 +9,14 @@
|
||||
|
||||
#import "RCTMultipartStreamReader.h"
|
||||
|
||||
#import <QuartzCore/CAAnimation.h>
|
||||
|
||||
#define CRLF @"\r\n"
|
||||
|
||||
@implementation RCTMultipartStreamReader {
|
||||
__strong NSInputStream *_stream;
|
||||
__strong NSString *_boundary;
|
||||
CFTimeInterval _lastDownloadProgress;
|
||||
}
|
||||
|
||||
- (instancetype)initWithInputStream:(NSInputStream *)stream boundary:(NSString *)boundary
|
||||
@@ -21,6 +24,7 @@
|
||||
if (self = [super init]) {
|
||||
_stream = stream;
|
||||
_boundary = boundary;
|
||||
_lastDownloadProgress = CACurrentMediaTime();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -42,12 +46,17 @@
|
||||
return headers;
|
||||
}
|
||||
|
||||
- (void)emitChunk:(NSData *)data callback:(RCTMultipartCallback)callback done:(BOOL)done
|
||||
- (void)emitChunk:(NSData *)data headers:(NSDictionary *)headers callback:(RCTMultipartCallback)callback done:(BOOL)done
|
||||
{
|
||||
NSData *marker = [CRLF CRLF dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSRange range = [data rangeOfData:marker options:0 range:NSMakeRange(0, data.length)];
|
||||
if (range.location == NSNotFound) {
|
||||
callback(nil, data, done);
|
||||
} else if (headers != nil) {
|
||||
// If headers were parsed already just use that to avoid doing it twice.
|
||||
NSInteger bodyStart = range.location + marker.length;
|
||||
NSData *bodyData = [data subdataWithRange:NSMakeRange(bodyStart, data.length - bodyStart)];
|
||||
callback(headers, bodyData, done);
|
||||
} else {
|
||||
NSData *headersData = [data subdataWithRange:NSMakeRange(0, range.location)];
|
||||
NSInteger bodyStart = range.location + marker.length;
|
||||
@@ -56,7 +65,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)readAllParts:(RCTMultipartCallback)callback
|
||||
- (void)emitProgress:(NSDictionary *)headers
|
||||
contentLength:(NSUInteger)contentLength
|
||||
final:(BOOL)final
|
||||
callback:(RCTMultipartProgressCallback)callback
|
||||
{
|
||||
if (headers == nil) {
|
||||
return;
|
||||
}
|
||||
// Throttle progress events so we don't send more that around 60 per second.
|
||||
CFTimeInterval currentTime = CACurrentMediaTime();
|
||||
|
||||
NSUInteger headersContentLength = headers[@"Content-Length"] != nil ? [headers[@"Content-Length"] unsignedIntValue] : 0;
|
||||
if (callback && (currentTime - _lastDownloadProgress > 0.016 || final)) {
|
||||
_lastDownloadProgress = currentTime;
|
||||
callback(headers, @(headersContentLength), @(contentLength));
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)readAllPartsWithCompletionCallback:(RCTMultipartCallback)callback
|
||||
progressCallback:(RCTMultipartProgressCallback)progressCallback
|
||||
{
|
||||
NSInteger chunkStart = 0;
|
||||
NSInteger bytesSeen = 0;
|
||||
@@ -64,6 +92,8 @@
|
||||
NSData *delimiter = [[NSString stringWithFormat:@"%@--%@%@", CRLF, _boundary, CRLF] dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSData *closeDelimiter = [[NSString stringWithFormat:@"%@--%@--%@", CRLF, _boundary, CRLF] dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSMutableData *content = [[NSMutableData alloc] initWithCapacity:1];
|
||||
NSDictionary *currentHeaders = nil;
|
||||
NSUInteger currentHeadersLength = 0;
|
||||
|
||||
const NSUInteger bufferLen = 4 * 1024;
|
||||
uint8_t buffer[bufferLen];
|
||||
@@ -75,6 +105,8 @@
|
||||
// to allow for the edge case when the delimiter is cut by read call
|
||||
NSInteger searchStart = MAX(bytesSeen - (NSInteger)closeDelimiter.length, chunkStart);
|
||||
NSRange remainingBufferRange = NSMakeRange(searchStart, content.length - searchStart);
|
||||
|
||||
// Check for delimiters.
|
||||
NSRange range = [content rangeOfData:delimiter options:0 range:remainingBufferRange];
|
||||
if (range.location == NSNotFound) {
|
||||
isCloseDelimiter = YES;
|
||||
@@ -82,6 +114,23 @@
|
||||
}
|
||||
|
||||
if (range.location == NSNotFound) {
|
||||
if (currentHeaders == nil) {
|
||||
// Check for the headers delimiter.
|
||||
NSData *headersMarker = [CRLF CRLF dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSRange headersRange = [content rangeOfData:headersMarker options:0 range:remainingBufferRange];
|
||||
if (headersRange.location != NSNotFound) {
|
||||
NSData *headersData = [content subdataWithRange:NSMakeRange(chunkStart, headersRange.location - chunkStart)];
|
||||
currentHeadersLength = headersData.length;
|
||||
currentHeaders = [self parseHeaders:headersData];
|
||||
}
|
||||
} else {
|
||||
// When headers are loaded start sending progress callbacks.
|
||||
[self emitProgress:currentHeaders
|
||||
contentLength:content.length - currentHeadersLength
|
||||
final:NO
|
||||
callback:progressCallback];
|
||||
}
|
||||
|
||||
bytesSeen = content.length;
|
||||
NSInteger bytesRead = [_stream read:buffer maxLength:bufferLen];
|
||||
if (bytesRead <= 0 || _stream.streamError) {
|
||||
@@ -98,7 +147,13 @@
|
||||
// Ignore preamble
|
||||
if (chunkStart > 0) {
|
||||
NSData *chunk = [content subdataWithRange:NSMakeRange(chunkStart, length)];
|
||||
[self emitChunk:chunk callback:callback done:isCloseDelimiter];
|
||||
[self emitProgress:currentHeaders
|
||||
contentLength:chunk.length - currentHeadersLength
|
||||
final:YES
|
||||
callback:progressCallback];
|
||||
[self emitChunk:chunk headers:currentHeaders callback:callback done:isCloseDelimiter];
|
||||
currentHeaders = nil;
|
||||
currentHeadersLength = 0;
|
||||
}
|
||||
|
||||
if (isCloseDelimiter) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION_NAME=1000.0.0-master
|
||||
VERSION_NAME=0.48.0
|
||||
GROUP=com.facebook.react
|
||||
|
||||
POM_NAME=ReactNative
|
||||
|
||||
@@ -16,6 +16,7 @@ import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
@@ -357,6 +358,8 @@ public class ReactRootView extends SizeMonitoringFrameLayout implements RootView
|
||||
|
||||
private int mKeyboardHeight = 0;
|
||||
private int mDeviceRotation = 0;
|
||||
private DisplayMetrics mWindowMetrics = new DisplayMetrics();
|
||||
private DisplayMetrics mScreenMetrics = new DisplayMetrics();
|
||||
|
||||
/* package */ CustomGlobalLayoutListener() {
|
||||
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(getContext().getApplicationContext());
|
||||
@@ -372,6 +375,7 @@ public class ReactRootView extends SizeMonitoringFrameLayout implements RootView
|
||||
}
|
||||
checkForKeyboardEvents();
|
||||
checkForDeviceOrientationChanges();
|
||||
checkForDeviceDimensionsChanges();
|
||||
}
|
||||
|
||||
private void checkForKeyboardEvents() {
|
||||
@@ -404,13 +408,37 @@ public class ReactRootView extends SizeMonitoringFrameLayout implements RootView
|
||||
return;
|
||||
}
|
||||
mDeviceRotation = rotation;
|
||||
// It's important to repopulate DisplayMetrics and export them before emitting the
|
||||
// orientation change event, so that the Dimensions object returns the correct new values.
|
||||
DisplayMetricsHolder.initDisplayMetrics(getContext());
|
||||
emitUpdateDimensionsEvent();
|
||||
emitOrientationChanged(rotation);
|
||||
}
|
||||
|
||||
private void checkForDeviceDimensionsChanges() {
|
||||
// Get current display metrics.
|
||||
DisplayMetricsHolder.initDisplayMetrics(getContext());
|
||||
// Check changes to both window and screen display metrics since they may not update at the same time.
|
||||
if (!areMetricsEqual(mWindowMetrics, DisplayMetricsHolder.getWindowDisplayMetrics()) ||
|
||||
!areMetricsEqual(mScreenMetrics, DisplayMetricsHolder.getScreenDisplayMetrics())) {
|
||||
mWindowMetrics.setTo(DisplayMetricsHolder.getWindowDisplayMetrics());
|
||||
mScreenMetrics.setTo(DisplayMetricsHolder.getScreenDisplayMetrics());
|
||||
emitUpdateDimensionsEvent();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean areMetricsEqual(DisplayMetrics displayMetrics, DisplayMetrics otherMetrics) {
|
||||
if (Build.VERSION.SDK_INT >= 17) {
|
||||
return displayMetrics.equals(otherMetrics);
|
||||
} else {
|
||||
// DisplayMetrics didn't have an equals method before API 17.
|
||||
// Check all public fields manually.
|
||||
return displayMetrics.widthPixels == otherMetrics.widthPixels &&
|
||||
displayMetrics.heightPixels == otherMetrics.heightPixels &&
|
||||
displayMetrics.density == otherMetrics.density &&
|
||||
displayMetrics.densityDpi == otherMetrics.densityDpi &&
|
||||
displayMetrics.scaledDensity == otherMetrics.scaledDensity &&
|
||||
displayMetrics.xdpi == otherMetrics.xdpi &&
|
||||
displayMetrics.ydpi == otherMetrics.ydpi;
|
||||
}
|
||||
}
|
||||
|
||||
private void emitOrientationChanged(final int newRotation) {
|
||||
String name;
|
||||
double rotationDegrees;
|
||||
|
||||
@@ -5,6 +5,7 @@ package com.facebook.react.uimanager;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.view.ViewParent;
|
||||
|
||||
import com.facebook.react.R;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
@@ -80,6 +81,10 @@ public abstract class BaseViewManager<T extends View, C extends LayoutShadowNode
|
||||
public void setZIndex(T view, float zIndex) {
|
||||
int integerZIndex = Math.round(zIndex);
|
||||
ViewGroupManager.setViewZIndex(view, integerZIndex);
|
||||
ViewParent parent = view.getParent();
|
||||
if (parent != null && parent instanceof ReactZIndexedViewGroup) {
|
||||
((ReactZIndexedViewGroup) parent).updateDrawingOrder();
|
||||
}
|
||||
}
|
||||
|
||||
@ReactProp(name = PROP_RENDER_TO_HARDWARE_TEXTURE)
|
||||
|
||||
@@ -12,4 +12,10 @@ public interface ReactZIndexedViewGroup {
|
||||
* @return The child view index considering z-index
|
||||
*/
|
||||
int getZIndexMappedChildIndex(int index);
|
||||
|
||||
/**
|
||||
* Redraw the view based on updated child z-index. This should be called after updating one of its child
|
||||
* z-index.
|
||||
*/
|
||||
void updateDrawingOrder();
|
||||
}
|
||||
|
||||
+13
@@ -100,4 +100,17 @@ public class ViewGroupDrawingOrderHelper {
|
||||
}
|
||||
return mDrawingOrderIndices[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Recheck all children for z-index changes.
|
||||
*/
|
||||
public void update() {
|
||||
mNumberOfChildrenWithZIndex = 0;
|
||||
for (int i = 0; i < mViewGroup.getChildCount(); i++) {
|
||||
if (ViewGroupManager.getViewZIndex(mViewGroup.getChildAt(i)) != null) {
|
||||
mNumberOfChildrenWithZIndex++;
|
||||
}
|
||||
}
|
||||
mDrawingOrderIndices = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -419,6 +419,13 @@ public class ReactViewGroup extends ViewGroup implements
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDrawingOrder() {
|
||||
mDrawingOrderHelper.update();
|
||||
setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder());
|
||||
invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointerEvents getPointerEvents() {
|
||||
return mPointerEvents;
|
||||
|
||||
@@ -82,16 +82,7 @@ All we need now is to apply this patch to your source files. While the old `reac
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
<<<<<<< ours
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/HockeySDK.embeddedframework",
|
||||
"$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework",
|
||||
);
|
||||
=======
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
>>>>>>> theirs
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-native",
|
||||
"version": "1000.0.0",
|
||||
"version": "0.48.0",
|
||||
"description": "A framework for building native apps using React",
|
||||
"license": "BSD-3-Clause",
|
||||
"repository": {
|
||||
@@ -241,4 +241,4 @@
|
||||
"shelljs": "0.6.0",
|
||||
"sinon": "^2.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,36 +37,6 @@ rm -rf android
|
||||
success "Generated artifacts for Maven"
|
||||
|
||||
npm install
|
||||
|
||||
success "Killing any running packagers"
|
||||
lsof -i :8081 | grep LISTEN
|
||||
lsof -i :8081 | grep LISTEN | /usr/bin/awk '{print $2}' | xargs kill
|
||||
|
||||
info "Start the packager in another terminal by running 'npm start' from the root"
|
||||
info "and then press any key."
|
||||
info ""
|
||||
read -n 1
|
||||
|
||||
./gradlew :RNTester:android:app:installDebug || error "Couln't build RNTester Android"
|
||||
|
||||
info "Press any key to run RNTester in an already running Android emulator/device"
|
||||
info ""
|
||||
read -n 1
|
||||
adb shell am start -n com.facebook.react.uiapp/.RNTesterActivity
|
||||
|
||||
info "Press any key to open the project in Xcode, then build and test manually."
|
||||
info ""
|
||||
read -n 1
|
||||
open "RNTester/RNTester.xcodeproj"
|
||||
|
||||
info "When done testing RNTester app on iOS and Android press any key to continue."
|
||||
info ""
|
||||
read -n 1
|
||||
|
||||
success "Killing packager"
|
||||
lsof -i :8081 | grep LISTEN
|
||||
lsof -i :8081 | grep LISTEN | /usr/bin/awk '{print $2}' | xargs kill
|
||||
|
||||
npm pack
|
||||
|
||||
PACKAGE=$(pwd)/react-native-$PACKAGE_VERSION.tgz
|
||||
|
||||
Reference in New Issue
Block a user