From a257083d2bfeb6497dd5c2c99f2fe139a32c04e5 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 1 Nov 2019 11:54:44 -0700 Subject: [PATCH] Split NativeStatusBarManager into NativeStatusBarManager{Android,IOS} Summary: The `StatusBarManager` NativeModule does not have a uniform API on iOS and Android. In particular, the `setStyle` and the `setHidden` methods have an additional parameter on iOS: ``` /** * - statusBarStyles can be: * - 'default' * - 'dark-content' * - 'light-content' */ +setStyle: (statusBarStyle?: ?string, animated: boolean) => void; /** * - withAnimation can be: 'none' | 'fade' | 'slide' */ +setHidden: (hidden: boolean, withAnimation: string) => void; ``` If we keep the NativeModule spec the same between the two platforms, we'd have to keep the second parameter optional for both methods. This works for `setHidden`, because the second parameter is a string, and optional strings are allowed. However, for `setStyle`, the second parameter is a number, and we don't support optional numbers/booleans on Android in the NativeModule system. If we keep the optional number, then the following check triggers in our RedBox tests on iOS, which makes them fail: https://fburl.com/diffusion/b7adezd9. So, since the two specs are sufficiently different, I figured that the easiest path forward is to split them apart. Changelog: [iOS][Changed] - Separated NativeStatusBarManager into NativeStatusBarManager{IOS,Android} Reviewed By: PeteTheHeat Differential Revision: D18214161 fbshipit-source-id: 6fd8b8c5f576244b5b90ee47faa7f50508c5e1d3 --- .../NativeStatusBarManagerAndroid.js | 35 +++++ ...anager.js => NativeStatusBarManagerIOS.js} | 17 +-- Libraries/Components/StatusBar/StatusBar.js | 47 +++--- .../StatusBar/StatusBarIOS.android.js | 17 --- .../{StatusBarIOS.ios.js => StatusBarIOS.js} | 4 +- .../FBReactNativeSpec-generated.mm | 100 ++++++++----- .../FBReactNativeSpec/FBReactNativeSpec.h | 137 +++++++++++++----- RNTester/Podfile.lock | 8 +- .../NativeStatusBarManagerAndroidSpec.java | 69 +++++++++ .../specs/NativeStatusBarManagerIOSSpec.java | 76 ++++++++++ 10 files changed, 383 insertions(+), 127 deletions(-) create mode 100644 Libraries/Components/StatusBar/NativeStatusBarManagerAndroid.js rename Libraries/Components/StatusBar/{NativeStatusBarManager.js => NativeStatusBarManagerIOS.js} (67%) delete mode 100644 Libraries/Components/StatusBar/StatusBarIOS.android.js rename Libraries/Components/StatusBar/{StatusBarIOS.ios.js => StatusBarIOS.js} (74%) create mode 100644 ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerAndroidSpec.java create mode 100644 ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java diff --git a/Libraries/Components/StatusBar/NativeStatusBarManagerAndroid.js b/Libraries/Components/StatusBar/NativeStatusBarManagerAndroid.js new file mode 100644 index 00000000000..c964337e0c9 --- /dev/null +++ b/Libraries/Components/StatusBar/NativeStatusBarManagerAndroid.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + */ + +'use strict'; + +import type {TurboModule} from '../../TurboModule/RCTExport'; +import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; + +export interface Spec extends TurboModule { + +getConstants: () => {| + +HEIGHT: number, + +DEFAULT_BACKGROUND_COLOR: number, + |}; + +setColor: (color: number, animated: boolean) => void; + +setTranslucent: (translucent: boolean) => void; + + /** + * - statusBarStyles can be: + * - 'default' + * - 'dark-content' + */ + +setStyle: (statusBarStyle?: ?string) => void; + +setHidden: (hidden: boolean) => void; +} + +export default (TurboModuleRegistry.getEnforcing( + 'StatusBarManager', +): Spec); diff --git a/Libraries/Components/StatusBar/NativeStatusBarManager.js b/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js similarity index 67% rename from Libraries/Components/StatusBar/NativeStatusBarManager.js rename to Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js index 9743d222758..d42149d5937 100644 --- a/Libraries/Components/StatusBar/NativeStatusBarManager.js +++ b/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js @@ -14,35 +14,28 @@ import type {TurboModule} from '../../TurboModule/RCTExport'; import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { - // Android only +getConstants: () => {| +HEIGHT: number, +DEFAULT_BACKGROUND_COLOR: number, |}; - +setColor: (color: number, animated: boolean) => void; - +setTranslucent: (translucent: boolean) => void; - // iOS only // TODO(T47754272) Can we remove this method? +getHeight: (callback: (result: {|height: number|}) => void) => void; +setNetworkActivityIndicatorVisible: (visible: boolean) => void; +addListener: (eventType: string) => void; +removeListeners: (count: number) => void; - // Android and iOS /** - * - animated is iOS only * - statusBarStyles can be: - * - 'default' (iOS and Android) - * - 'dark-content' (iOS and Android) - * - 'light-content' (iOS) + * - 'default' + * - 'dark-content' + * - 'light-content' */ - +setStyle: (statusBarStyle?: ?string, animated?: ?boolean) => void; + +setStyle: (statusBarStyle?: ?string, animated: boolean) => void; /** - * - withAnimation is iOS only * - withAnimation can be: 'none' | 'fade' | 'slide' */ - +setHidden: (hidden: boolean, withAnimation?: ?string) => void; + +setHidden: (hidden: boolean, withAnimation: string) => void; } export default (TurboModuleRegistry.getEnforcing( diff --git a/Libraries/Components/StatusBar/StatusBar.js b/Libraries/Components/StatusBar/StatusBar.js index 1481b25d9a8..2dacf2f21e2 100644 --- a/Libraries/Components/StatusBar/StatusBar.js +++ b/Libraries/Components/StatusBar/StatusBar.js @@ -15,7 +15,8 @@ const React = require('react'); const processColor = require('../../StyleSheet/processColor'); -import NativeStatusBarManager from './NativeStatusBarManager'; +import NativeStatusBarManagerAndroid from './NativeStatusBarManagerAndroid'; +import NativeStatusBarManagerIOS from './NativeStatusBarManagerIOS'; /** * Status bar style @@ -221,12 +222,11 @@ class StatusBar extends React.Component { static _defaultProps = createStackEntry({ animated: false, showHideTransition: 'fade', - backgroundColor: Platform.select({ - android: - NativeStatusBarManager.getConstants().DEFAULT_BACKGROUND_COLOR ?? - 'black', - ios: 'black', - }), + backgroundColor: + Platform.OS === 'android' + ? NativeStatusBarManagerAndroid.getConstants() + .DEFAULT_BACKGROUND_COLOR ?? 'black' + : 'black', barStyle: 'default', translucent: false, hidden: false, @@ -246,7 +246,10 @@ class StatusBar extends React.Component { * * @platform android */ - static currentHeight: number = NativeStatusBarManager.getConstants().HEIGHT; + static currentHeight: ?number = + Platform.OS === 'android' + ? NativeStatusBarManagerAndroid.getConstants().HEIGHT + : null; // Provide an imperative API as static functions of the component. // See the corresponding prop for more detail. @@ -261,9 +264,9 @@ class StatusBar extends React.Component { animation = animation || 'none'; StatusBar._defaultProps.hidden.value = hidden; if (Platform.OS === 'ios') { - NativeStatusBarManager.setHidden(hidden, animation); + NativeStatusBarManagerIOS.setHidden(hidden, animation); } else if (Platform.OS === 'android') { - NativeStatusBarManager.setHidden(hidden); + NativeStatusBarManagerAndroid.setHidden(hidden); } } @@ -276,9 +279,9 @@ class StatusBar extends React.Component { animated = animated || false; StatusBar._defaultProps.barStyle.value = style; if (Platform.OS === 'ios') { - NativeStatusBarManager.setStyle(style, animated); + NativeStatusBarManagerIOS.setStyle(style, animated); } else if (Platform.OS === 'android') { - NativeStatusBarManager.setStyle(style); + NativeStatusBarManagerAndroid.setStyle(style); } } @@ -294,7 +297,7 @@ class StatusBar extends React.Component { return; } StatusBar._defaultProps.networkActivityIndicatorVisible = visible; - NativeStatusBarManager.setNetworkActivityIndicatorVisible(visible); + NativeStatusBarManagerIOS.setNetworkActivityIndicatorVisible(visible); } /** @@ -318,7 +321,7 @@ class StatusBar extends React.Component { return; } - NativeStatusBarManager.setColor(processedColor, animated); + NativeStatusBarManagerAndroid.setColor(processedColor, animated); } /** @@ -331,7 +334,7 @@ class StatusBar extends React.Component { return; } StatusBar._defaultProps.translucent = translucent; - NativeStatusBarManager.setTranslucent(translucent); + NativeStatusBarManagerAndroid.setTranslucent(translucent); } /** @@ -426,13 +429,13 @@ class StatusBar extends React.Component { !oldProps || oldProps.barStyle.value !== mergedProps.barStyle.value ) { - NativeStatusBarManager.setStyle( + NativeStatusBarManagerIOS.setStyle( mergedProps.barStyle.value, mergedProps.barStyle.animated || false, ); } if (!oldProps || oldProps.hidden.value !== mergedProps.hidden.value) { - NativeStatusBarManager.setHidden( + NativeStatusBarManagerIOS.setHidden( mergedProps.hidden.value, mergedProps.hidden.animated ? mergedProps.hidden.transition @@ -445,7 +448,7 @@ class StatusBar extends React.Component { oldProps.networkActivityIndicatorVisible !== mergedProps.networkActivityIndicatorVisible ) { - NativeStatusBarManager.setNetworkActivityIndicatorVisible( + NativeStatusBarManagerIOS.setNetworkActivityIndicatorVisible( mergedProps.networkActivityIndicatorVisible, ); } @@ -454,7 +457,7 @@ class StatusBar extends React.Component { !oldProps || oldProps.barStyle.value !== mergedProps.barStyle.value ) { - NativeStatusBarManager.setStyle(mergedProps.barStyle.value); + NativeStatusBarManagerAndroid.setStyle(mergedProps.barStyle.value); } if ( !oldProps || @@ -470,17 +473,17 @@ class StatusBar extends React.Component { } parsed to null or undefined`, ); } else { - NativeStatusBarManager.setColor( + NativeStatusBarManagerAndroid.setColor( processedColor, mergedProps.backgroundColor.animated, ); } } if (!oldProps || oldProps.hidden.value !== mergedProps.hidden.value) { - NativeStatusBarManager.setHidden(mergedProps.hidden.value); + NativeStatusBarManagerAndroid.setHidden(mergedProps.hidden.value); } if (!oldProps || oldProps.translucent !== mergedProps.translucent) { - NativeStatusBarManager.setTranslucent(mergedProps.translucent); + NativeStatusBarManagerAndroid.setTranslucent(mergedProps.translucent); } } // Update the current prop values. diff --git a/Libraries/Components/StatusBar/StatusBarIOS.android.js b/Libraries/Components/StatusBar/StatusBarIOS.android.js deleted file mode 100644 index 40331f4f67f..00000000000 --- a/Libraries/Components/StatusBar/StatusBarIOS.android.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const NativeEventEmitter = require('../../EventEmitter/NativeEventEmitter'); - -/* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found when - * making Flow check .android.js files. */ -module.exports = new NativeEventEmitter('StatusBarManager'); diff --git a/Libraries/Components/StatusBar/StatusBarIOS.ios.js b/Libraries/Components/StatusBar/StatusBarIOS.js similarity index 74% rename from Libraries/Components/StatusBar/StatusBarIOS.ios.js rename to Libraries/Components/StatusBar/StatusBarIOS.js index f3ebbf4d988..004f1fdee3c 100644 --- a/Libraries/Components/StatusBar/StatusBarIOS.ios.js +++ b/Libraries/Components/StatusBar/StatusBarIOS.js @@ -12,11 +12,11 @@ const NativeEventEmitter = require('../../EventEmitter/NativeEventEmitter'); -import NativeStatusBarManager from './NativeStatusBarManager'; +import NativeStatusBarManagerIOS from './NativeStatusBarManagerIOS'; /** * Use `StatusBar` for mutating the status bar. */ class StatusBarIOS extends NativeEventEmitter {} -module.exports = (new StatusBarIOS(NativeStatusBarManager): StatusBarIOS); +module.exports = (new StatusBarIOS(NativeStatusBarManagerIOS): StatusBarIOS); diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm index eaa564a3819..e9104537917 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm @@ -2027,81 +2027,115 @@ namespace facebook { } // namespace react } // namespace facebook -@implementation RCTCxxConvert (NativeStatusBarManager_SpecGetHeightCallbackResult) -+ (RCTManagedPointer *)JS_NativeStatusBarManager_SpecGetHeightCallbackResult:(id)json +namespace facebook { + namespace react { + + + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setColor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setColor", @selector(setColor:animated:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setTranslucent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setTranslucent", @selector(setTranslucent:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setStyle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setStyle", @selector(setStyle:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setHidden(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setHidden", @selector(setHidden:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerAndroidSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + + NativeStatusBarManagerAndroidSpecJSI::NativeStatusBarManagerAndroidSpecJSI(id instance, std::shared_ptr jsInvoker) + : ObjCTurboModule("StatusBarManagerAndroid", instance, jsInvoker) { + + methodMap_["setColor"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setColor}; + + + methodMap_["setTranslucent"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setTranslucent}; + + + methodMap_["setStyle"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setStyle}; + + + methodMap_["setHidden"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerAndroidSpecJSI_setHidden}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeStatusBarManagerAndroidSpecJSI_getConstants}; + + + + } + + } // namespace react +} // namespace facebook +@implementation RCTCxxConvert (NativeStatusBarManagerIOS_SpecGetHeightCallbackResult) ++ (RCTManagedPointer *)JS_NativeStatusBarManagerIOS_SpecGetHeightCallbackResult:(id)json { - return facebook::react::managedPointer(json); + return facebook::react::managedPointer(json); } @end namespace facebook { namespace react { - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_setColor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setColor", @selector(setColor:animated:), args, count); - } - - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_setTranslucent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setTranslucent", @selector(setTranslucent:), args, count); - } - - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_getHeight(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_getHeight(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "getHeight", @selector(getHeight:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_setNetworkActivityIndicatorVisible(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_setNetworkActivityIndicatorVisible(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setNetworkActivityIndicatorVisible", @selector(setNetworkActivityIndicatorVisible:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_addListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_addListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addListener", @selector(addListener:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_removeListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_removeListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeListeners", @selector(removeListeners:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_setStyle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_setStyle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setStyle", @selector(setStyle:animated:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_setHidden(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_setHidden(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setHidden", @selector(setHidden:withAnimation:), args, count); } - static facebook::jsi::Value __hostFunction_NativeStatusBarManagerSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static facebook::jsi::Value __hostFunction_NativeStatusBarManagerIOSSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); } - NativeStatusBarManagerSpecJSI::NativeStatusBarManagerSpecJSI(id instance, std::shared_ptr jsInvoker) - : ObjCTurboModule("StatusBarManager", instance, jsInvoker) { + NativeStatusBarManagerIOSSpecJSI::NativeStatusBarManagerIOSSpecJSI(id instance, std::shared_ptr jsInvoker) + : ObjCTurboModule("StatusBarManagerIOS", instance, jsInvoker) { - methodMap_["setColor"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerSpecJSI_setColor}; + methodMap_["getHeight"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerIOSSpecJSI_getHeight}; - methodMap_["setTranslucent"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerSpecJSI_setTranslucent}; + methodMap_["setNetworkActivityIndicatorVisible"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerIOSSpecJSI_setNetworkActivityIndicatorVisible}; - methodMap_["getHeight"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerSpecJSI_getHeight}; + methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerIOSSpecJSI_addListener}; - methodMap_["setNetworkActivityIndicatorVisible"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerSpecJSI_setNetworkActivityIndicatorVisible}; + methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerIOSSpecJSI_removeListeners}; - methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerSpecJSI_addListener}; + methodMap_["setStyle"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerIOSSpecJSI_setStyle}; - methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeStatusBarManagerSpecJSI_removeListeners}; + methodMap_["setHidden"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerIOSSpecJSI_setHidden}; - methodMap_["setStyle"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerSpecJSI_setStyle}; - - - methodMap_["setHidden"] = MethodMetadata {2, __hostFunction_NativeStatusBarManagerSpecJSI_setHidden}; - - - methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeStatusBarManagerSpecJSI_getConstants}; + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeStatusBarManagerIOSSpecJSI_getConstants}; diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h index 7eed174102d..3fc95a8e64e 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h @@ -2161,23 +2161,7 @@ namespace facebook { } // namespace facebook namespace JS { - namespace NativeStatusBarManager { - struct SpecGetHeightCallbackResult { - double height() const; - - SpecGetHeightCallbackResult(NSDictionary *const v) : _v(v) {} - private: - NSDictionary *_v; - }; - } -} - -@interface RCTCxxConvert (NativeStatusBarManager_SpecGetHeightCallbackResult) -+ (RCTManagedPointer *)JS_NativeStatusBarManager_SpecGetHeightCallbackResult:(id)json; -@end - -namespace JS { - namespace NativeStatusBarManager { + namespace NativeStatusBarManagerAndroid { struct Constants { struct Builder { @@ -2204,32 +2188,98 @@ namespace JS { }; } } -@protocol NativeStatusBarManagerSpec +@protocol NativeStatusBarManagerAndroidSpec - (void)setColor:(double)color animated:(BOOL)animated; - (void)setTranslucent:(BOOL)translucent; -- (void)getHeight:(RCTResponseSenderBlock)callback; -- (void)setNetworkActivityIndicatorVisible:(BOOL)visible; -- (void)addListener:(NSString *)eventType; -- (void)removeListeners:(double)count; -- (void)setStyle:(NSString * _Nullable)statusBarStyle - animated:(NSNumber *)animated; -- (void)setHidden:(BOOL)hidden - withAnimation:(NSString * _Nullable)withAnimation; -- (facebook::react::ModuleConstants)constantsToExport; -- (facebook::react::ModuleConstants)getConstants; +- (void)setStyle:(NSString * _Nullable)statusBarStyle; +- (void)setHidden:(BOOL)hidden; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; @end namespace facebook { namespace react { /** - * ObjC++ class for module 'StatusBarManager' + * ObjC++ class for module 'StatusBarManagerAndroid' */ - class JSI_EXPORT NativeStatusBarManagerSpecJSI : public ObjCTurboModule { + class JSI_EXPORT NativeStatusBarManagerAndroidSpecJSI : public ObjCTurboModule { public: - NativeStatusBarManagerSpecJSI(id instance, std::shared_ptr jsInvoker); + NativeStatusBarManagerAndroidSpecJSI(id instance, std::shared_ptr jsInvoker); + + }; + } // namespace react +} // namespace facebook + +namespace JS { + namespace NativeStatusBarManagerIOS { + struct SpecGetHeightCallbackResult { + double height() const; + + SpecGetHeightCallbackResult(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeStatusBarManagerIOS_SpecGetHeightCallbackResult) ++ (RCTManagedPointer *)JS_NativeStatusBarManagerIOS_SpecGetHeightCallbackResult:(id)json; +@end + +namespace JS { + namespace NativeStatusBarManagerIOS { + struct Constants { + + struct Builder { + struct Input { + RCTRequired HEIGHT; + RCTRequired DEFAULT_BACKGROUND_COLOR; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeStatusBarManagerIOSSpec + +- (void)getHeight:(RCTResponseSenderBlock)callback; +- (void)setNetworkActivityIndicatorVisible:(BOOL)visible; +- (void)addListener:(NSString *)eventType; +- (void)removeListeners:(double)count; +- (void)setStyle:(NSString * _Nullable)statusBarStyle + animated:(BOOL)animated; +- (void)setHidden:(BOOL)hidden + withAnimation:(NSString *)withAnimation; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end +namespace facebook { + namespace react { + /** + * ObjC++ class for module 'StatusBarManagerIOS' + */ + + class JSI_EXPORT NativeStatusBarManagerIOSSpecJSI : public ObjCTurboModule { + public: + NativeStatusBarManagerIOSSpecJSI(id instance, std::shared_ptr jsInvoker); }; } // namespace react @@ -3308,12 +3358,7 @@ inline JS::NativeSourceCode::Constants::Builder::Builder(const Input i) : _facto inline JS::NativeSourceCode::Constants::Builder::Builder(Constants i) : _factory(^{ return i.unsafeRawValue(); }) {} -inline double JS::NativeStatusBarManager::SpecGetHeightCallbackResult::height() const -{ - id const p = _v[@"height"]; - return RCTBridgingToDouble(p); -} -inline JS::NativeStatusBarManager::Constants::Builder::Builder(const Input i) : _factory(^{ +inline JS::NativeStatusBarManagerAndroid::Constants::Builder::Builder(const Input i) : _factory(^{ NSMutableDictionary *d = [NSMutableDictionary new]; auto HEIGHT = i.HEIGHT.get(); d[@"HEIGHT"] = @(HEIGHT); @@ -3321,7 +3366,23 @@ inline JS::NativeStatusBarManager::Constants::Builder::Builder(const Input i) : d[@"DEFAULT_BACKGROUND_COLOR"] = @(DEFAULT_BACKGROUND_COLOR); return d; }) {} -inline JS::NativeStatusBarManager::Constants::Builder::Builder(Constants i) : _factory(^{ +inline JS::NativeStatusBarManagerAndroid::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +inline double JS::NativeStatusBarManagerIOS::SpecGetHeightCallbackResult::height() const +{ + id const p = _v[@"height"]; + return RCTBridgingToDouble(p); +} +inline JS::NativeStatusBarManagerIOS::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto HEIGHT = i.HEIGHT.get(); + d[@"HEIGHT"] = @(HEIGHT); + auto DEFAULT_BACKGROUND_COLOR = i.DEFAULT_BACKGROUND_COLOR.get(); + d[@"DEFAULT_BACKGROUND_COLOR"] = @(DEFAULT_BACKGROUND_COLOR); + return d; +}) {} +inline JS::NativeStatusBarManagerIOS::Constants::Builder::Builder(Constants i) : _factory(^{ return i.unsafeRawValue(); }) {} inline JS::NativeToastAndroid::Constants::Builder::Builder(const Input i) : _factory(^{ diff --git a/RNTester/Podfile.lock b/RNTester/Podfile.lock index 5668cb8dcf3..bd513094b1f 100644 --- a/RNTester/Podfile.lock +++ b/RNTester/Podfile.lock @@ -203,6 +203,8 @@ PODS: - React-RCTActionSheet (1000.0.0): - React-Core/RCTActionSheetHeaders (= 1000.0.0) - React-RCTAnimation (1000.0.0): + - FBReactNativeSpec (= 1000.0.0) + - Folly (= 2018.10.22.00) - React-Core/RCTAnimationHeaders (= 1000.0.0) - React-RCTBlob (1000.0.0): - FBReactNativeSpec (= 1000.0.0) @@ -365,14 +367,14 @@ SPEC CHECKSUMS: RCTTypeSafety: 2b1cb2d92b779aa9a3522f67bd4f07e6b6d0797e React: 28a654b69575941571c073a656bc06795825e7f7 React-ART: a5da06a892342d03896e0db45a7072525981f63c - React-Core: f8656b21cfe16b1fe276686f3b921bce0fa6de4d + React-Core: c74122b2f399f92f94301cd22e888787375ed5d8 React-CoreModules: 96b2f1e0b84493e6c1b7f3bb21357f24fdcfce2f React-cxxreact: 7c4242192149ce0205b53efaa03e3bf86ba4337c React-jsi: 98d1f9d8a79d2720ba6a44c2d928a77f315b7e4f React-jsiexecutor: c0ab8c80a6e88380d63f583690a50d4a723b47b5 React-jsinspector: ea0a218071a11c3687cef2480580180caa6a64c0 React-RCTActionSheet: 090e7bd7c5774d919c47c4eeff78223a7fd8c19c - React-RCTAnimation: 73d536fff417a101724d9529189c95a94263710c + React-RCTAnimation: fb2b60b7050aedf5a8bf03cf5c30f33a8d2b01b5 React-RCTBlob: acd519b1d6ec5d66f98b7cf8e70d0cd76642426f React-RCTImage: 4d2a090c491e29665f27f87c58feb4dfcb2f4cfa React-RCTLinking: d7d7f792e63a8d57380cecbb9b7a3b31f92d1bb6 @@ -383,7 +385,7 @@ SPEC CHECKSUMS: React-RCTText: 9078167d3bc011162326f2d8ef4dd580ec1eca17 React-RCTVibration: bf05159719598f876ba763e5a58ccbad21e2e82f ReactCommon: 9d212865526209dc2d01be40340c8d27b53e6bea - Yoga: d88d8b51ee5b247f43211e2edf272438df1b484f + Yoga: 01557763eb099a104c0ac47eed7dd07203e29d6b PODFILE CHECKSUM: 060903e270072f1e192b064848e6c34528af1c87 diff --git a/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerAndroidSpec.java b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerAndroidSpec.java new file mode 100644 index 00000000000..e2d2dd2c6ad --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerAndroidSpec.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + * + *

Generated by an internal genrule from Flow types. + * + * @generated + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReactModuleWithSpec; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; + +public abstract class NativeStatusBarManagerAndroidSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public NativeStatusBarManagerAndroidSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @ReactMethod + public abstract void setTranslucent(boolean translucent); + + @ReactMethod + public abstract void setColor(double color, boolean animated); + + @ReactMethod + public abstract void setHidden(boolean hidden); + + @ReactMethod + public abstract void setStyle(@Nullable String statusBarStyle); + + protected abstract Map getTypedExportedConstants(); + + @Override + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "DEFAULT_BACKGROUND_COLOR", + "HEIGHT" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java new file mode 100644 index 00000000000..14d3af93acb --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + * + *

Generated by an internal genrule from Flow types. + * + * @generated + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReactModuleWithSpec; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; + +public abstract class NativeStatusBarManagerIOSSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public NativeStatusBarManagerIOSSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @ReactMethod + public abstract void setNetworkActivityIndicatorVisible(boolean visible); + + @ReactMethod + public abstract void getHeight(Callback callback); + + @ReactMethod + public abstract void removeListeners(double count); + + @ReactMethod + public abstract void setHidden(boolean hidden, String withAnimation); + + @ReactMethod + public abstract void setStyle(@Nullable String statusBarStyle, boolean animated); + + @ReactMethod + public abstract void addListener(String eventType); + + protected abstract Map getTypedExportedConstants(); + + @Override + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "DEFAULT_BACKGROUND_COLOR", + "HEIGHT" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } +}