react-native-tvos 0.68.1-0 → 0.68.2-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Libraries/Components/Pressable/Pressable.js +11 -0
- package/Libraries/Components/Touchable/TouchableHighlight.js +19 -5
- package/Libraries/Components/Touchable/TouchableNativeFeedback.js +6 -5
- package/README.md +2 -1
- package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.h +4 -0
- package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +83 -30
- package/React/Views/RCTTVView.h +9 -5
- package/React/Views/RCTTVView.m +98 -52
- package/ReactAndroid/build.gradle +2 -11
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/src/main/java/com/facebook/hermes/instrumentation/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/Android.mk +2 -0
- package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/Android.mk +2 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/Android.mk +1 -0
- package/ReactAndroid/src/main/jni/first-party/yogajni/Android.mk +1 -0
- package/ReactAndroid/src/main/jni/react/jni/Android.mk +2 -0
- package/ReactAndroid/src/main/jni/third-party/boost/Android.mk +1 -0
- package/ReactCommon/butter/Android.mk +1 -0
- package/ReactCommon/cxxreact/Android.mk +1 -0
- package/ReactCommon/hermes/executor/Android.mk +2 -0
- package/ReactCommon/hermes/inspector/Android.mk +1 -0
- package/ReactCommon/jsi/Android.mk +2 -0
- package/ReactCommon/jsiexecutor/Android.mk +1 -0
- package/ReactCommon/jsinspector/Android.mk +1 -0
- package/ReactCommon/logger/Android.mk +1 -0
- package/ReactCommon/react/config/Android.mk +1 -0
- package/ReactCommon/react/debug/Android.mk +1 -0
- package/ReactCommon/react/nativemodule/core/Android.mk +1 -0
- package/ReactCommon/react/nativemodule/samples/platform/android/Android.mk +1 -0
- package/ReactCommon/react/renderer/animations/Android.mk +1 -0
- package/ReactCommon/react/renderer/attributedstring/Android.mk +1 -0
- package/ReactCommon/react/renderer/componentregistry/Android.mk +1 -0
- package/ReactCommon/react/renderer/componentregistry/native/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/image/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/modal/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/progressbar/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/root/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/scrollview/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/slider/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/switch/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/text/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/textinput/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/unimplementedview/Android.mk +1 -0
- package/ReactCommon/react/renderer/components/view/Android.mk +1 -0
- package/ReactCommon/react/renderer/core/Android.mk +1 -0
- package/ReactCommon/react/renderer/debug/Android.mk +1 -0
- package/ReactCommon/react/renderer/graphics/Android.mk +1 -0
- package/ReactCommon/react/renderer/imagemanager/Android.mk +1 -0
- package/ReactCommon/react/renderer/leakchecker/Android.mk +1 -0
- package/ReactCommon/react/renderer/mapbuffer/Android.mk +1 -0
- package/ReactCommon/react/renderer/mounting/Android.mk +1 -0
- package/ReactCommon/react/renderer/runtimescheduler/Android.mk +1 -0
- package/ReactCommon/react/renderer/scheduler/Android.mk +1 -0
- package/ReactCommon/react/renderer/telemetry/Android.mk +1 -0
- package/ReactCommon/react/renderer/templateprocessor/Android.mk +1 -0
- package/ReactCommon/react/renderer/textlayoutmanager/Android.mk +1 -0
- package/ReactCommon/react/renderer/uimanager/Android.mk +1 -0
- package/ReactCommon/react/utils/Android.mk +1 -0
- package/ReactCommon/reactperflogger/Android.mk +1 -0
- package/ReactCommon/yoga/Android.mk +1 -0
- package/android/com/facebook/react/react-native/{0.68.1-0/react-native-0.68.1-0-sources.jar → 0.68.2-1/react-native-0.68.2-1-sources.jar} +0 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1-sources.jar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1-sources.jar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1-sources.jar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1-sources.jar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.68.1-0/react-native-0.68.1-0.aar → 0.68.2-1/react-native-0.68.2-1.aar} +0 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.aar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.aar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.aar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.aar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.68.1-0/react-native-0.68.1-0.module → 0.68.2-1/react-native-0.68.2-1.module} +15 -15
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.module.md5 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.module.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.module.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.module.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.68.1-0/react-native-0.68.1-0.pom → 0.68.2-1/react-native-0.68.2-1.pom} +1 -1
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.pom.md5 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.pom.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.pom.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.68.2-1/react-native-0.68.2-1.pom.sha512 +1 -0
- package/android/com/facebook/react/react-native/maven-metadata.xml +4 -4
- package/android/com/facebook/react/react-native/maven-metadata.xml.md5 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha1 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha256 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha512 +1 -1
- package/package.json +2 -2
- package/template/android/app/build.gradle +1 -3
- package/template/android/build.gradle +0 -4
- package/template/package.json +1 -1
- package/tvos-types.d.ts +23 -18
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0-sources.jar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0-sources.jar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0-sources.jar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0-sources.jar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.aar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.aar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.aar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.aar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.module.md5 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.module.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.module.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.module.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.pom.md5 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.pom.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.pom.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.68.1-0/react-native-0.68.1-0.pom.sha512 +0 -1
|
@@ -39,6 +39,7 @@ import View from '../View/View';
|
|
|
39
39
|
import typeof TVParallaxPropertiesType from '../AppleTV/TVViewPropTypes';
|
|
40
40
|
import Platform from '../../Utilities/Platform';
|
|
41
41
|
import {tvFocusEventHandler} from '../AppleTV/TVFocusEventHandler';
|
|
42
|
+
import tagForComponentOrHandle from '../AppleTV/tagForComponentOrHandle';
|
|
42
43
|
|
|
43
44
|
type ViewStyleProp = $ElementType<React.ElementConfig<typeof View>, 'style'>;
|
|
44
45
|
|
|
@@ -212,6 +213,11 @@ function Pressable(props: Props, forwardedRef): React.Node {
|
|
|
212
213
|
onHoverIn,
|
|
213
214
|
onHoverOut,
|
|
214
215
|
isTVSelectable,
|
|
216
|
+
nextFocusDown,
|
|
217
|
+
nextFocusForward,
|
|
218
|
+
nextFocusLeft,
|
|
219
|
+
nextFocusRight,
|
|
220
|
+
nextFocusUp,
|
|
215
221
|
onBlur,
|
|
216
222
|
onFocus,
|
|
217
223
|
onLongPress,
|
|
@@ -354,6 +360,11 @@ function Pressable(props: Props, forwardedRef): React.Node {
|
|
|
354
360
|
{...restPropsWithDefaults}
|
|
355
361
|
{...eventHandlers}
|
|
356
362
|
ref={viewRef}
|
|
363
|
+
nextFocusDown={tagForComponentOrHandle(props.nextFocusDown)}
|
|
364
|
+
nextFocusForward={tagForComponentOrHandle(props.nextFocusForward)}
|
|
365
|
+
nextFocusLeft={tagForComponentOrHandle(props.nextFocusLeft)}
|
|
366
|
+
nextFocusRight={tagForComponentOrHandle(props.nextFocusRight)}
|
|
367
|
+
nextFocusUp={tagForComponentOrHandle(props.nextFocusUp)}
|
|
357
368
|
isTVSelectable={isTVSelectable !== false && accessible !== false}
|
|
358
369
|
style={typeof style === 'function' ? style({pressed, focused}) : style}
|
|
359
370
|
tvParallaxProperties={tvParallaxProperties}
|
|
@@ -19,6 +19,8 @@ import typeof TouchableWithoutFeedback from './TouchableWithoutFeedback';
|
|
|
19
19
|
import Platform from '../../Utilities/Platform';
|
|
20
20
|
import View from '../../Components/View/View';
|
|
21
21
|
import type {ViewProps} from '../../Components/View/ViewPropTypes';
|
|
22
|
+
import typeof TVParallaxPropertiesType from '../AppleTV/TVViewPropTypes';
|
|
23
|
+
import tagForComponentOrHandle from '../AppleTV/tagForComponentOrHandle';
|
|
22
24
|
import * as React from 'react';
|
|
23
25
|
|
|
24
26
|
type AndroidProps = $ReadOnly<{|
|
|
@@ -29,9 +31,21 @@ type AndroidProps = $ReadOnly<{|
|
|
|
29
31
|
nextFocusUp?: ?number,
|
|
30
32
|
|}>;
|
|
31
33
|
|
|
34
|
+
type TVProps = $ReadOnly<{|
|
|
35
|
+
hasTVPreferredFocus?: ?boolean,
|
|
36
|
+
isTVSelectable?: ?boolean,
|
|
37
|
+
tvParallaxProperties?: ?TVParallaxPropertiesType,
|
|
38
|
+
nextFocusDown?: ?number,
|
|
39
|
+
nextFocusForward?: ?number,
|
|
40
|
+
nextFocusLeft?: ?number,
|
|
41
|
+
nextFocusRight?: ?number,
|
|
42
|
+
nextFocusUp?: ?number,
|
|
43
|
+
|}>;
|
|
44
|
+
|
|
32
45
|
type Props = $ReadOnly<{|
|
|
33
46
|
...React.ElementConfig<TouchableWithoutFeedback>,
|
|
34
47
|
...AndroidProps,
|
|
48
|
+
...TVProps,
|
|
35
49
|
...ViewProps,
|
|
36
50
|
|
|
37
51
|
activeOpacity?: ?number,
|
|
@@ -313,11 +327,11 @@ class TouchableHighlight extends React.Component<Props, State> {
|
|
|
313
327
|
hasTVPreferredFocus={this.props.hasTVPreferredFocus === true}
|
|
314
328
|
isTVSelectable={this.props.isTVSelectable !== false && this.props.accessible !== false}
|
|
315
329
|
tvParallaxProperties={this.props.tvParallaxProperties}
|
|
316
|
-
nextFocusDown={this.props.nextFocusDown}
|
|
317
|
-
nextFocusForward={this.props.nextFocusForward}
|
|
318
|
-
nextFocusLeft={this.props.nextFocusLeft}
|
|
319
|
-
nextFocusRight={this.props.nextFocusRight}
|
|
320
|
-
nextFocusUp={this.props.nextFocusUp}
|
|
330
|
+
nextFocusDown={tagForComponentOrHandle(this.props.nextFocusDown)}
|
|
331
|
+
nextFocusForward={tagForComponentOrHandle(this.props.nextFocusForward)}
|
|
332
|
+
nextFocusLeft={tagForComponentOrHandle(this.props.nextFocusLeft)}
|
|
333
|
+
nextFocusRight={tagForComponentOrHandle(this.props.nextFocusRight)}
|
|
334
|
+
nextFocusUp={tagForComponentOrHandle(this.props.nextFocusUp)}
|
|
321
335
|
focusable={
|
|
322
336
|
this.props.focusable !== false && this.props.onPress !== undefined
|
|
323
337
|
}
|
|
@@ -20,6 +20,7 @@ import type {PressEvent} from '../../Types/CoreEventTypes';
|
|
|
20
20
|
import Platform from '../../Utilities/Platform';
|
|
21
21
|
import View from '../../Components/View/View';
|
|
22
22
|
import processColor from '../../StyleSheet/processColor';
|
|
23
|
+
import tagForComponentOrHandle from '../AppleTV/tagForComponentOrHandle';
|
|
23
24
|
import * as React from 'react';
|
|
24
25
|
import invariant from 'invariant';
|
|
25
26
|
|
|
@@ -291,11 +292,11 @@ class TouchableNativeFeedback extends React.Component<Props, State> {
|
|
|
291
292
|
this.props.onPress !== undefined &&
|
|
292
293
|
!this.props.disabled,
|
|
293
294
|
nativeID: this.props.nativeID,
|
|
294
|
-
nextFocusDown: this.props.nextFocusDown,
|
|
295
|
-
nextFocusForward: this.props.nextFocusForward,
|
|
296
|
-
nextFocusLeft: this.props.nextFocusLeft,
|
|
297
|
-
nextFocusRight: this.props.nextFocusRight,
|
|
298
|
-
nextFocusUp: this.props.nextFocusUp,
|
|
295
|
+
nextFocusDown: tagForComponentOrHandle(this.props.nextFocusDown),
|
|
296
|
+
nextFocusForward: tagForComponentOrHandle(this.props.nextFocusForward),
|
|
297
|
+
nextFocusLeft: tagForComponentOrHandle(this.props.nextFocusLeft),
|
|
298
|
+
nextFocusRight: tagForComponentOrHandle(this.props.nextFocusRight),
|
|
299
|
+
nextFocusUp: tagForComponentOrHandle(this.props.nextFocusUp),
|
|
299
300
|
onLayout: this.props.onLayout,
|
|
300
301
|
testID: this.props.testID,
|
|
301
302
|
},
|
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ Notes:
|
|
|
28
28
|
- _Apple TV_: `pod install` will pick up the additional pods needed for the new architecture.
|
|
29
29
|
- _Android TV_: Enabling the new architecture will cause your app to be built from React Native sources, including C++ sources, so you will need the NDK and the build will take much longer.
|
|
30
30
|
- _Third party libraries_: As of this moment, third party libraries have not all enabled support for the new architecture.
|
|
31
|
+
- _Bugs_: There are some issues with interactions between Apple TV parallax properties implementation and the new renderer. TabBarIOS has not been reimplemented in the new architecture so it will show up as an "unimplemented component".
|
|
31
32
|
|
|
32
33
|
### Typescript
|
|
33
34
|
|
|
@@ -182,7 +183,7 @@ class Game2048 extends React.Component {
|
|
|
182
183
|
|
|
183
184
|
- _Turbomodules_: Working as of the 0.61.2-0 release.
|
|
184
185
|
|
|
185
|
-
- _Flipper_: Working in the 0.62.2-x releases. Working in the 0.63.x releases; however, tvOS requires the Flipper pods from 0.62.2-x. `scripts/react_native_pods.rb` contains macros for both versions. The new project template Podfile is correctly set up to provide the older Flipper for both iOS and tvOS targets. In 0.64.x, Flipper support
|
|
186
|
+
- _Flipper_: Working in the 0.62.2-x releases. Working in the 0.63.x releases; however, tvOS requires the Flipper pods from 0.62.2-x. `scripts/react_native_pods.rb` contains macros for both versions. The new project template Podfile is correctly set up to provide the older Flipper for both iOS and tvOS targets. In 0.64.x and later, Flipper support is removed until issues can be resolved with newer Xcode versions.
|
|
186
187
|
|
|
187
188
|
- _Hermes for tvOS_: RN core added support for the Hermes JS engine on iOS in 0.64. tvOS does not yet have this, as it will require significant additions to the Hermes build structure.
|
|
188
189
|
|
|
@@ -71,6 +71,10 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
71
71
|
|
|
72
72
|
#if TARGET_OS_TV
|
|
73
73
|
@property(nonatomic, nullable) UIFocusGuide *focusGuide;
|
|
74
|
+
@property(nonatomic, nullable) UIFocusGuide *focusGuideUp;
|
|
75
|
+
@property(nonatomic, nullable) UIFocusGuide *focusGuideDown;
|
|
76
|
+
@property(nonatomic, nullable) UIFocusGuide *focusGuideLeft;
|
|
77
|
+
@property(nonatomic, nullable) UIFocusGuide *focusGuideRight;
|
|
74
78
|
#endif
|
|
75
79
|
|
|
76
80
|
/**
|
|
@@ -309,41 +309,92 @@ using namespace facebook::react;
|
|
|
309
309
|
return _props->isTVSelectable;
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
self
|
|
324
|
-
|
|
325
|
-
|
|
312
|
+
// In tvOS, to support directional focus APIs, we add a UIFocusGuide for each
|
|
313
|
+
// side of the view where a nextFocus has been set. Set layout constraints to
|
|
314
|
+
// make the guide 1 px thick, and set the destination to the nextFocus object.
|
|
315
|
+
//
|
|
316
|
+
// This is only done once the view is focused.
|
|
317
|
+
//
|
|
318
|
+
- (void)enableDirectionalFocusGuides
|
|
319
|
+
{
|
|
320
|
+
if (self->_nextFocusUp != nil) {
|
|
321
|
+
if (self.focusGuideUp == nil) {
|
|
322
|
+
self.focusGuideUp = [UIFocusGuide new];
|
|
323
|
+
[[self containingRootView] addLayoutGuide:self.focusGuideUp];
|
|
324
|
+
|
|
325
|
+
[self.focusGuideUp.bottomAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
326
|
+
[self.focusGuideUp.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES;
|
|
327
|
+
[self.focusGuideUp.heightAnchor constraintEqualToConstant:1.0].active = YES;
|
|
328
|
+
[self.focusGuideUp.leftAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
326
329
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
330
|
+
|
|
331
|
+
self.focusGuideUp.preferredFocusEnvironments = @[self->_nextFocusUp];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (self->_nextFocusDown != nil) {
|
|
335
|
+
if (self.focusGuideDown == nil) {
|
|
336
|
+
self.focusGuideDown = [UIFocusGuide new];
|
|
337
|
+
[[self containingRootView] addLayoutGuide:self.focusGuideDown];
|
|
338
|
+
|
|
339
|
+
[self.focusGuideDown.topAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
|
|
340
|
+
[self.focusGuideDown.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES;
|
|
341
|
+
[self.focusGuideDown.heightAnchor constraintEqualToConstant:1.0].active = YES;
|
|
342
|
+
[self.focusGuideDown.leftAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
331
343
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
344
|
+
|
|
345
|
+
self.focusGuideDown.preferredFocusEnvironments = @[self->_nextFocusDown];
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (self->_nextFocusLeft != nil) {
|
|
349
|
+
if (self.focusGuideLeft == nil) {
|
|
350
|
+
self.focusGuideLeft = [UIFocusGuide new];
|
|
351
|
+
[[self containingRootView] addLayoutGuide:self.focusGuideLeft];
|
|
352
|
+
|
|
353
|
+
[self.focusGuideLeft.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
354
|
+
[self.focusGuideLeft.widthAnchor constraintEqualToConstant:1.0].active = YES;
|
|
355
|
+
[self.focusGuideLeft.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
|
|
356
|
+
[self.focusGuideLeft.rightAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
336
357
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
358
|
+
|
|
359
|
+
self.focusGuideLeft.preferredFocusEnvironments = @[self->_nextFocusLeft];
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (self->_nextFocusRight != nil) {
|
|
363
|
+
if (self.focusGuideRight == nil) {
|
|
364
|
+
self.focusGuideRight = [UIFocusGuide new];
|
|
365
|
+
[[self containingRootView] addLayoutGuide:self.focusGuideRight];
|
|
366
|
+
|
|
367
|
+
[self.focusGuideRight.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
368
|
+
[self.focusGuideRight.widthAnchor constraintEqualToConstant:1.0].active = YES;
|
|
369
|
+
[self.focusGuideRight.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
|
|
370
|
+
[self.focusGuideRight.leftAnchor constraintEqualToAnchor:self.rightAnchor].active = YES;
|
|
341
371
|
}
|
|
342
|
-
|
|
343
|
-
|
|
372
|
+
|
|
373
|
+
self.focusGuideRight.preferredFocusEnvironments = @[self->_nextFocusRight];
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Called when focus leaves this view -- disable the directional focus guides
|
|
377
|
+
// (if they exist) so that they don't interfere with focus navigation from
|
|
378
|
+
// other views
|
|
379
|
+
//
|
|
380
|
+
- (void)disableDirectionalFocusGuides
|
|
381
|
+
{
|
|
382
|
+
if (self.focusGuideUp != nil) {
|
|
383
|
+
[[self containingRootView] removeLayoutGuide:self.focusGuideUp];
|
|
384
|
+
self.focusGuideUp = nil;
|
|
385
|
+
}
|
|
386
|
+
if (self.focusGuideDown != nil) {
|
|
387
|
+
[[self containingRootView] removeLayoutGuide:self.focusGuideDown];
|
|
388
|
+
self.focusGuideDown = nil;
|
|
389
|
+
}
|
|
390
|
+
if (self.focusGuideLeft != nil) {
|
|
391
|
+
[[self containingRootView] removeLayoutGuide:self.focusGuideLeft];
|
|
392
|
+
self.focusGuideLeft = nil;
|
|
393
|
+
}
|
|
394
|
+
if (self.focusGuideRight != nil) {
|
|
395
|
+
[[self containingRootView] removeLayoutGuide:self.focusGuideRight];
|
|
396
|
+
self.focusGuideRight = nil;
|
|
344
397
|
}
|
|
345
|
-
self->_nextFocusActiveTarget = nil;
|
|
346
|
-
return true;
|
|
347
398
|
}
|
|
348
399
|
|
|
349
400
|
- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator
|
|
@@ -353,11 +404,13 @@ using namespace facebook::react;
|
|
|
353
404
|
}
|
|
354
405
|
if (context.nextFocusedView == self && self.isUserInteractionEnabled ) {
|
|
355
406
|
[self becomeFirstResponder];
|
|
407
|
+
[self enableDirectionalFocusGuides];
|
|
356
408
|
[coordinator addCoordinatedAnimations:^(void){
|
|
357
409
|
[self addParallaxMotionEffects];
|
|
358
410
|
[self sendFocusNotification:context];
|
|
359
411
|
} completion:^(void){}];
|
|
360
412
|
} else {
|
|
413
|
+
[self disableDirectionalFocusGuides];
|
|
361
414
|
[coordinator addCoordinatedAnimations:^(void){
|
|
362
415
|
[self removeParallaxMotionEffects];
|
|
363
416
|
[self sendBlurNotification:context];
|
package/React/Views/RCTTVView.h
CHANGED
|
@@ -32,11 +32,15 @@
|
|
|
32
32
|
/**
|
|
33
33
|
* Focus direction tags
|
|
34
34
|
*/
|
|
35
|
-
@property (nonatomic,
|
|
36
|
-
@property (nonatomic,
|
|
37
|
-
@property (nonatomic,
|
|
38
|
-
@property (nonatomic,
|
|
39
|
-
|
|
35
|
+
@property (nonatomic, weak) RCTTVView * nextFocusUp;
|
|
36
|
+
@property (nonatomic, weak) RCTTVView * nextFocusDown;
|
|
37
|
+
@property (nonatomic, weak) RCTTVView * nextFocusLeft;
|
|
38
|
+
@property (nonatomic, weak) RCTTVView * nextFocusRight;
|
|
39
|
+
|
|
40
|
+
@property (nonatomic, strong) UIFocusGuide * focusGuideUp;
|
|
41
|
+
@property (nonatomic, strong) UIFocusGuide * focusGuideDown;
|
|
42
|
+
@property (nonatomic, strong) UIFocusGuide * focusGuideLeft;
|
|
43
|
+
@property (nonatomic, strong) UIFocusGuide * focusGuideRight;
|
|
40
44
|
|
|
41
45
|
- (instancetype)initWithBridge:(RCTBridge *)bridge;
|
|
42
46
|
|
package/React/Views/RCTTVView.m
CHANGED
|
@@ -127,6 +127,18 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : unused)
|
|
|
127
127
|
return (self.isTVSelectable);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
- (RCTRootView *)rootView
|
|
131
|
+
{
|
|
132
|
+
UIView *rootview = self;
|
|
133
|
+
while (![rootview isReactRootView] && rootview != nil) {
|
|
134
|
+
rootview = [rootview superview];
|
|
135
|
+
}
|
|
136
|
+
if (rootview == nil) return nil;
|
|
137
|
+
|
|
138
|
+
rootview = [rootview superview];
|
|
139
|
+
return (RCTRootView *)rootview;
|
|
140
|
+
}
|
|
141
|
+
|
|
130
142
|
- (void)addParallaxMotionEffects
|
|
131
143
|
{
|
|
132
144
|
if(![self.tvParallaxProperties[@"enabled"] boolValue]) {
|
|
@@ -237,11 +249,13 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : unused)
|
|
|
237
249
|
}
|
|
238
250
|
if (context.nextFocusedView == self && self.isTVSelectable ) {
|
|
239
251
|
[self becomeFirstResponder];
|
|
252
|
+
[self enableDirectionalFocusGuides];
|
|
240
253
|
[coordinator addCoordinatedAnimations:^(void){
|
|
241
254
|
[self addParallaxMotionEffects];
|
|
242
255
|
[self sendFocusNotification:context];
|
|
243
256
|
} completion:^(void){}];
|
|
244
257
|
} else {
|
|
258
|
+
[self disableDirectionalFocusGuides];
|
|
245
259
|
[coordinator addCoordinatedAnimations:^(void){
|
|
246
260
|
[self sendBlurNotification:context];
|
|
247
261
|
[self removeParallaxMotionEffects];
|
|
@@ -250,41 +264,93 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : unused)
|
|
|
250
264
|
}
|
|
251
265
|
}
|
|
252
266
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
267
|
+
// In tvOS, to support directional focus APIs, we add a UIFocusGuide for each
|
|
268
|
+
// side of the view where a nextFocus has been set. Set layout constraints to
|
|
269
|
+
// make the guide 1 px thick, and set the destination to the nextFocus object.
|
|
270
|
+
//
|
|
271
|
+
// This is only done once the view is focused.
|
|
272
|
+
//
|
|
273
|
+
- (void)enableDirectionalFocusGuides
|
|
274
|
+
{
|
|
275
|
+
if (self->_nextFocusUp != nil) {
|
|
276
|
+
if (self.focusGuideUp == nil) {
|
|
277
|
+
self.focusGuideUp = [UIFocusGuide new];
|
|
278
|
+
[[self rootView] addLayoutGuide:self.focusGuideUp];
|
|
279
|
+
|
|
280
|
+
[self.focusGuideUp.bottomAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
281
|
+
[self.focusGuideUp.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES;
|
|
282
|
+
[self.focusGuideUp.heightAnchor constraintEqualToConstant:1.0].active = YES;
|
|
283
|
+
[self.focusGuideUp.leftAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
259
284
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
285
|
+
|
|
286
|
+
self.focusGuideUp.preferredFocusEnvironments = @[self->_nextFocusUp];
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (self->_nextFocusDown != nil) {
|
|
290
|
+
if (self.focusGuideDown == nil) {
|
|
291
|
+
self.focusGuideDown = [UIFocusGuide new];
|
|
292
|
+
[[self rootView] addLayoutGuide:self.focusGuideDown];
|
|
293
|
+
|
|
294
|
+
[self.focusGuideDown.topAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
|
|
295
|
+
[self.focusGuideDown.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES;
|
|
296
|
+
[self.focusGuideDown.heightAnchor constraintEqualToConstant:1.0].active = YES;
|
|
297
|
+
[self.focusGuideDown.leftAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
264
298
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
299
|
+
|
|
300
|
+
self.focusGuideDown.preferredFocusEnvironments = @[self->_nextFocusDown];
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (self->_nextFocusLeft != nil) {
|
|
304
|
+
if (self.focusGuideLeft == nil) {
|
|
305
|
+
self.focusGuideLeft = [UIFocusGuide new];
|
|
306
|
+
[[self rootView] addLayoutGuide:self.focusGuideLeft];
|
|
307
|
+
|
|
308
|
+
[self.focusGuideLeft.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
309
|
+
[self.focusGuideLeft.widthAnchor constraintEqualToConstant:1.0].active = YES;
|
|
310
|
+
[self.focusGuideLeft.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
|
|
311
|
+
[self.focusGuideLeft.rightAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
|
|
269
312
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
313
|
+
|
|
314
|
+
self.focusGuideLeft.preferredFocusEnvironments = @[self->_nextFocusLeft];
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (self->_nextFocusRight != nil) {
|
|
318
|
+
if (self.focusGuideRight == nil) {
|
|
319
|
+
self.focusGuideRight = [UIFocusGuide new];
|
|
320
|
+
[[self rootView] addLayoutGuide:self.focusGuideRight];
|
|
321
|
+
|
|
322
|
+
[self.focusGuideRight.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
|
|
323
|
+
[self.focusGuideRight.widthAnchor constraintEqualToConstant:1.0].active = YES;
|
|
324
|
+
[self.focusGuideRight.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
|
|
325
|
+
[self.focusGuideRight.leftAnchor constraintEqualToAnchor:self.rightAnchor].active = YES;
|
|
274
326
|
}
|
|
275
|
-
|
|
276
|
-
|
|
327
|
+
|
|
328
|
+
self.focusGuideRight.preferredFocusEnvironments = @[self->_nextFocusRight];
|
|
277
329
|
}
|
|
278
|
-
self->_nextFocusActiveTarget = nil;
|
|
279
|
-
return true;
|
|
280
330
|
}
|
|
281
331
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
332
|
+
// Called when focus leaves this view -- disable the directional focus guides
|
|
333
|
+
// (if they exist) so that they don't interfere with focus navigation from
|
|
334
|
+
// other views
|
|
335
|
+
//
|
|
336
|
+
- (void)disableDirectionalFocusGuides
|
|
337
|
+
{
|
|
338
|
+
if (self.focusGuideUp != nil) {
|
|
339
|
+
[[self rootView] removeLayoutGuide:self.focusGuideUp];
|
|
340
|
+
self.focusGuideUp = nil;
|
|
341
|
+
}
|
|
342
|
+
if (self.focusGuideDown != nil) {
|
|
343
|
+
[[self rootView] removeLayoutGuide:self.focusGuideDown];
|
|
344
|
+
self.focusGuideDown = nil;
|
|
345
|
+
}
|
|
346
|
+
if (self.focusGuideLeft != nil) {
|
|
347
|
+
[[self rootView] removeLayoutGuide:self.focusGuideLeft];
|
|
348
|
+
self.focusGuideLeft = nil;
|
|
349
|
+
}
|
|
350
|
+
if (self.focusGuideRight != nil) {
|
|
351
|
+
[[self rootView] removeLayoutGuide:self.focusGuideRight];
|
|
352
|
+
self.focusGuideRight = nil;
|
|
353
|
+
}
|
|
288
354
|
}
|
|
289
355
|
|
|
290
356
|
- (void)sendFocusNotification:(__unused UIFocusUpdateContext *)context
|
|
@@ -339,15 +405,11 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : unused)
|
|
|
339
405
|
_hasTVPreferredFocus = hasTVPreferredFocus;
|
|
340
406
|
if (hasTVPreferredFocus) {
|
|
341
407
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
342
|
-
|
|
343
|
-
while (![rootview isReactRootView] && rootview != nil) {
|
|
344
|
-
rootview = [rootview superview];
|
|
345
|
-
}
|
|
346
|
-
if (rootview == nil) return;
|
|
408
|
+
RCTRootView *rootview = [self rootView];
|
|
347
409
|
|
|
348
|
-
rootview
|
|
410
|
+
if (rootview == nil) return;
|
|
349
411
|
|
|
350
|
-
[
|
|
412
|
+
[rootview setReactPreferredFocusedView:self];
|
|
351
413
|
[rootview setNeedsFocusUpdate];
|
|
352
414
|
[rootview updateFocusIfNeeded];
|
|
353
415
|
});
|
|
@@ -356,23 +418,7 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : unused)
|
|
|
356
418
|
|
|
357
419
|
- (void)setHasTVPreferredFocus:(BOOL)hasTVPreferredFocus
|
|
358
420
|
{
|
|
359
|
-
|
|
360
|
-
if (hasTVPreferredFocus) {
|
|
361
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
362
|
-
UIView *rootview = self;
|
|
363
|
-
while (![rootview isReactRootView] && rootview != nil) {
|
|
364
|
-
rootview = [rootview superview];
|
|
365
|
-
}
|
|
366
|
-
if (rootview == nil)
|
|
367
|
-
return;
|
|
368
|
-
|
|
369
|
-
rootview = [rootview superview];
|
|
370
|
-
|
|
371
|
-
[(RCTRootView *)rootview setReactPreferredFocusedView:self];
|
|
372
|
-
[rootview setNeedsFocusUpdate];
|
|
373
|
-
[rootview updateFocusIfNeeded];
|
|
374
|
-
});
|
|
375
|
-
}
|
|
421
|
+
[self setPreferredFocus:hasTVPreferredFocus];
|
|
376
422
|
}
|
|
377
423
|
|
|
378
424
|
- (void)addFocusGuide:(NSArray*)destinations {
|
|
@@ -333,18 +333,9 @@ android {
|
|
|
333
333
|
arguments "--output-sync=none"
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
-
//
|
|
337
|
-
// Ref: https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#Path-Length-Limits
|
|
338
|
-
// NDK allows circumventing command line limits using response(RSP) files as inputs using NDK_APP_SHORT_COMMANDS flag.
|
|
339
|
-
//
|
|
340
|
-
// Windows can support long file paths if configured through registry or by prefixing all file paths with a special character sequence
|
|
341
|
-
// The latter requires changes in NDK. And there are tools in NDK (AR) which is not able to handle long paths (>256) even after setting the registry key.
|
|
342
|
-
// The new architecutre source tree is too deep, and the object file naming conventions in NDK makes the matters worse, by producing incredibly long file paths.
|
|
343
|
-
// Other solutions such as symlinking source code etc. didn't work as expected, and makes the build scripts complicated and hard to manage.
|
|
344
|
-
// This change temporarily works around the issue by placing the temporary build outputs as short a path as possible within the project path.
|
|
336
|
+
// Fix for windows limit on number of character in file paths and in command lines
|
|
345
337
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
346
|
-
arguments "
|
|
347
|
-
"NDK_APP_SHORT_COMMANDS=true"
|
|
338
|
+
arguments "NDK_APP_SHORT_COMMANDS=true"
|
|
348
339
|
}
|
|
349
340
|
}
|
|
350
341
|
}
|
|
@@ -13,6 +13,7 @@ include $(CLEAR_VARS)
|
|
|
13
13
|
LOCAL_MODULE := jsijniprofiler
|
|
14
14
|
|
|
15
15
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
16
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
16
17
|
|
|
17
18
|
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(REACT_NATIVE)/ReactCommon/jsi $(call find-node-module,$(LOCAL_PATH),hermes-engine)/android/include
|
|
18
19
|
|
|
@@ -12,6 +12,7 @@ include $(CLEAR_VARS)
|
|
|
12
12
|
LOCAL_MODULE := hermes-executor-release
|
|
13
13
|
|
|
14
14
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
15
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
15
16
|
|
|
16
17
|
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(REACT_NATIVE)/ReactCommon/jsi $(call find-node-module,$(LOCAL_PATH),hermes-engine)/android/include
|
|
17
18
|
|
|
@@ -35,6 +36,7 @@ LOCAL_MODULE := hermes-executor-debug
|
|
|
35
36
|
LOCAL_CFLAGS := -DHERMES_ENABLE_DEBUGGER=1
|
|
36
37
|
|
|
37
38
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
39
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
38
40
|
|
|
39
41
|
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(REACT_NATIVE)/ReactCommon/jsi $(call find-node-module,$(LOCAL_PATH),hermes-engine)/android/include
|
|
40
42
|
|
|
@@ -26,6 +26,7 @@ LOCAL_MODULE := reactperfloggerjni
|
|
|
26
26
|
|
|
27
27
|
# Compile all local c++ files
|
|
28
28
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/reactperflogger/*.cpp)
|
|
29
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
29
30
|
|
|
30
31
|
# Build the files in this directory as a shared library
|
|
31
32
|
include $(BUILD_SHARED_LIBRARY)
|
|
@@ -28,6 +28,7 @@ LOCAL_MODULE := callinvokerholder
|
|
|
28
28
|
|
|
29
29
|
# Compile all local c++ files
|
|
30
30
|
LOCAL_SRC_FILES := $(LOCAL_PATH)/ReactCommon/CallInvokerHolder.cpp
|
|
31
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
31
32
|
|
|
32
33
|
# Build the files in this directory as a shared library
|
|
33
34
|
include $(BUILD_STATIC_LIBRARY)
|
|
@@ -56,6 +57,7 @@ LOCAL_STATIC_LIBRARIES = libcallinvokerholder libreactperfloggerjni
|
|
|
56
57
|
|
|
57
58
|
# Compile all local c++ files
|
|
58
59
|
LOCAL_SRC_FILES := $(LOCAL_PATH)/ReactCommon/TurboModuleManager.cpp $(LOCAL_PATH)/ReactCommon/OnLoad.cpp
|
|
60
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
59
61
|
|
|
60
62
|
# Build the files in this directory as a shared library
|
|
61
63
|
include $(BUILD_SHARED_LIBRARY)
|
|
@@ -47,6 +47,7 @@ LOCAL_MODULE := reactnativeutilsjni
|
|
|
47
47
|
|
|
48
48
|
# Compile all local c++ files.
|
|
49
49
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
50
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
50
51
|
|
|
51
52
|
ifeq ($(APP_OPTIM),debug)
|
|
52
53
|
# Keep symbols by overriding the strip command invoked by ndk-build.
|
|
@@ -106,6 +107,7 @@ LOCAL_MODULE := reactnativejni
|
|
|
106
107
|
|
|
107
108
|
# Compile all local c++ files.
|
|
108
109
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
110
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
109
111
|
|
|
110
112
|
ifeq ($(APP_OPTIM),debug)
|
|
111
113
|
# Keep symbols by overriding the strip command invoked by ndk-build.
|
|
@@ -5,6 +5,7 @@ include $(CLEAR_VARS)
|
|
|
5
5
|
# because the react native version does not include anything outside of headers.
|
|
6
6
|
# They are required for Folly futures to compile successfully.
|
|
7
7
|
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/asm/$(TARGET_ARCH)/*.S)
|
|
8
|
+
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(LOCAL_SRC_FILES))
|
|
8
9
|
|
|
9
10
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/boost_1_63_0
|
|
10
11
|
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/boost_1_63_0
|