From dc12676e3a5bf6bda545fe7fafb1027d056b8dd2 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 1 Nov 2019 11:54:44 -0700 Subject: [PATCH] Make RCTStatusBarManager TurboModule-compatible Summary: See title. Changelog: [iOS][Added] - Make RCTStatusBarManager TurboModule-compatible Reviewed By: shergin Differential Revision: D18130374 fbshipit-source-id: 3ec226bcff17e47ffd9eba05e32c1eb68d6135b2 --- .../StatusBar/NativeStatusBarManagerIOS.js | 2 +- .../FBReactNativeSpec/FBReactNativeSpec.h | 6 +-- React/CoreModules/BUCK | 3 ++ React/CoreModules/CoreModulesPlugins.h | 1 + React/CoreModules/CoreModulesPlugins.mm | 1 + .../RCTStatusBarManager.h | 0 .../RCTStatusBarManager.mm} | 46 ++++++++++++++++--- .../specs/NativeStatusBarManagerIOSSpec.java | 5 +- 8 files changed, 52 insertions(+), 12 deletions(-) rename React/{Modules => CoreModules}/RCTStatusBarManager.h (100%) rename React/{Modules/RCTStatusBarManager.m => CoreModules/RCTStatusBarManager.mm} (74%) diff --git a/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js b/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js index d42149d5937..45bcc1a3a4a 100644 --- a/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js +++ b/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js @@ -16,7 +16,7 @@ import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { +getConstants: () => {| +HEIGHT: number, - +DEFAULT_BACKGROUND_COLOR: number, + +DEFAULT_BACKGROUND_COLOR?: number, |}; // TODO(T47754272) Can we remove this method? diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h index 3fc95a8e64e..39e877ea170 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h @@ -2236,7 +2236,7 @@ namespace JS { struct Builder { struct Input { RCTRequired HEIGHT; - RCTRequired DEFAULT_BACKGROUND_COLOR; + folly::Optional DEFAULT_BACKGROUND_COLOR; }; /** Initialize with a set of values */ @@ -3378,8 +3378,8 @@ inline JS::NativeStatusBarManagerIOS::Constants::Builder::Builder(const Input i) 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); + auto DEFAULT_BACKGROUND_COLOR = i.DEFAULT_BACKGROUND_COLOR; + d[@"DEFAULT_BACKGROUND_COLOR"] = DEFAULT_BACKGROUND_COLOR.hasValue() ? @((double)DEFAULT_BACKGROUND_COLOR.value()) : nil; return d; }) {} inline JS::NativeStatusBarManagerIOS::Constants::Builder::Builder(Constants i) : _factory(^{ diff --git a/React/CoreModules/BUCK b/React/CoreModules/BUCK index 4ab09f40fc1..e41c2d38c88 100644 --- a/React/CoreModules/BUCK +++ b/React/CoreModules/BUCK @@ -75,6 +75,9 @@ rn_apple_library( ) + react_module_plugin_providers( name = "Timing", native_class_func = "RCTTimingCls", + ) + react_module_plugin_providers( + name = "StatusBarManager", + native_class_func = "RCTStatusBarManagerCls", ), plugins_header = "FBCoreModulesPlugins.h", preprocessor_flags = OBJC_ARC_PREPROCESSOR_FLAGS + get_debug_preprocessor_flags() + rn_extra_build_flags() + [ diff --git a/React/CoreModules/CoreModulesPlugins.h b/React/CoreModules/CoreModulesPlugins.h index db61ca3e6f9..b85a9d41a71 100644 --- a/React/CoreModules/CoreModulesPlugins.h +++ b/React/CoreModules/CoreModulesPlugins.h @@ -41,6 +41,7 @@ Class RCTActionSheetManagerCls(void) __attribute__((used)); Class RCTAlertManagerCls(void) __attribute__((used)); Class RCTAsyncLocalStorageCls(void) __attribute__((used)); Class RCTTimingCls(void) __attribute__((used)); +Class RCTStatusBarManagerCls(void) __attribute__((used)); #ifdef __cplusplus } diff --git a/React/CoreModules/CoreModulesPlugins.mm b/React/CoreModules/CoreModulesPlugins.mm index 703434a6b0b..6b2aa1f2e5a 100644 --- a/React/CoreModules/CoreModulesPlugins.mm +++ b/React/CoreModules/CoreModulesPlugins.mm @@ -30,6 +30,7 @@ Class RCTCoreModulesClassProvider(const char *name) { {"AlertManager", RCTAlertManagerCls}, {"AsyncLocalStorage", RCTAsyncLocalStorageCls}, {"Timing", RCTTimingCls}, + {"StatusBarManager", RCTStatusBarManagerCls}, }; auto p = sCoreModuleClassMap.find(name); diff --git a/React/Modules/RCTStatusBarManager.h b/React/CoreModules/RCTStatusBarManager.h similarity index 100% rename from React/Modules/RCTStatusBarManager.h rename to React/CoreModules/RCTStatusBarManager.h diff --git a/React/Modules/RCTStatusBarManager.m b/React/CoreModules/RCTStatusBarManager.mm similarity index 74% rename from React/Modules/RCTStatusBarManager.m rename to React/CoreModules/RCTStatusBarManager.mm index c70dddc7e68..9394a6e7004 100644 --- a/React/Modules/RCTStatusBarManager.m +++ b/React/CoreModules/RCTStatusBarManager.mm @@ -6,12 +6,15 @@ */ #import "RCTStatusBarManager.h" +#import "CoreModulesPlugins.h" -#import "RCTEventDispatcher.h" -#import "RCTLog.h" -#import "RCTUtils.h" +#import +#import +#import #if !TARGET_OS_TV +#import + @implementation RCTConvert (UIStatusBar) + (UIStatusBarStyle)UIStatusBarStyle:(id)json RCT_DYNAMIC @@ -40,7 +43,7 @@ } }); return _RCT_CAST( - type, [RCTConvertEnumValue("UIStatusBarStyle", mapping, @(UIStatusBarStyleDefault), json) integerValue]); + UIStatusBarStyle, [RCTConvertEnumValue("UIStatusBarStyle", mapping, @(UIStatusBarStyleDefault), json) integerValue]); } RCT_ENUM_CONVERTER( @@ -56,6 +59,13 @@ RCT_ENUM_CONVERTER( @end #endif +#if !TARGET_OS_TV + +@interface RCTStatusBarManager() +@end + +#endif + @implementation RCTStatusBarManager static BOOL RCTViewControllerBasedStatusBarAppearance() @@ -134,8 +144,9 @@ RCT_EXPORT_METHOD(getHeight : (RCTResponseSenderBlock)callback) } ]); } -RCT_EXPORT_METHOD(setStyle : (UIStatusBarStyle)statusBarStyle animated : (BOOL)animated) +RCT_EXPORT_METHOD(setStyle : (NSString *)style animated : (BOOL)animated) { + UIStatusBarStyle statusBarStyle = [RCTConvert UIStatusBarStyle:style]; if (RCTViewControllerBasedStatusBarAppearance()) { RCTLogError(@"RCTStatusBarManager module requires that the \ UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); @@ -147,8 +158,9 @@ RCT_EXPORT_METHOD(setStyle : (UIStatusBarStyle)statusBarStyle animated : (BOOL)a #pragma clang diagnostic pop } -RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (UIStatusBarAnimation)animation) +RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (NSString *)withAnimation) { + UIStatusBarAnimation animation = [RCTConvert UIStatusBarAnimation:withAnimation]; if (RCTViewControllerBasedStatusBarAppearance()) { RCTLogError(@"RCTStatusBarManager module requires that the \ UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); @@ -165,6 +177,28 @@ RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible) RCTSharedApplication().networkActivityIndicatorVisible = visible; } +- (facebook::react::ModuleConstants)getConstants +{ + return facebook::react::typedConstants({ + .HEIGHT = RCTSharedApplication().statusBarFrame.size.height, + .DEFAULT_BACKGROUND_COLOR = folly::none, + }); +} + +- (facebook::react::ModuleConstants)constantsToExport +{ + return (facebook::react::ModuleConstants)[self getConstants]; +} + +- (std::shared_ptr)getTurboModuleWithJsInvoker:(std::shared_ptr)jsInvoker +{ + return std::make_shared(self, jsInvoker); +} + #endif // TARGET_OS_TV @end + +Class RCTStatusBarManagerCls(void) { + return RCTStatusBarManager.class; +} diff --git a/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java index 14d3af93acb..908930e76d6 100644 --- a/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java +++ b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeStatusBarManagerIOSSpec.java @@ -55,10 +55,11 @@ public abstract class NativeStatusBarManagerIOSSpec extends ReactContextBaseJava 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 optionalFlowConstants = new HashSet<>(Arrays.asList( + "DEFAULT_BACKGROUND_COLOR" + )); Set undeclaredConstants = new HashSet<>(constants.keySet()); undeclaredConstants.removeAll(obligatoryFlowConstants); undeclaredConstants.removeAll(optionalFlowConstants);