From 6bdad90421704cb3e96388661d37e93fb5dc5b55 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Thu, 10 Aug 2023 11:47:37 -0700 Subject: [PATCH] DeviceInfo: Simplify RCTExportedDimensions's API Summary: RCTExportedDimensions doesn't need access to the ModuleRegistry, or the bridge. It just uses those two things to get the fontScale. We could make RCTExportedDimensions easier to understand, by making it do fewer things (i.e: computing the fontScale up front, and passing it into RCTExportedDimensions). Let's just do that. Changelog: [Internal] Differential Revision: D48237715 fbshipit-source-id: 8af170c248e0ca27e994692ff851697ccb0aaeb8 --- .../React/CoreModules/RCTDeviceInfo.mm | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm index 78e53899778bf6..2db9c706edebf0 100644 --- a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm +++ b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm @@ -29,7 +29,6 @@ @implementation RCTDeviceInfo { BOOL _isFullscreen; } -@synthesize bridge = _bridge; @synthesize moduleRegistry = _moduleRegistry; RCT_EXPORT_MODULE() @@ -58,7 +57,7 @@ - (void)initialize name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; - _currentInterfaceDimensions = RCTExportedDimensions(_moduleRegistry, _bridge); + _currentInterfaceDimensions = [self _exportedDimensions]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interfaceOrientationDidChange) @@ -97,17 +96,10 @@ static BOOL RCTIsIPhoneX() return isIPhoneX; } -static NSDictionary *RCTExportedDimensions(RCTModuleRegistry *moduleRegistry, RCTBridge *bridge) +static NSDictionary *RCTExportedDimensions(CGFloat fontScale) { RCTAssertMainQueue(); - RCTDimensions dimensions; - if (moduleRegistry) { - RCTAccessibilityManager *accessibilityManager = - (RCTAccessibilityManager *)[moduleRegistry moduleForName:"AccessibilityManager"]; - dimensions = RCTGetDimensions(accessibilityManager ? accessibilityManager.multiplier : 1.0); - } else { - RCTAssert(false, @"ModuleRegistry must be set to properly init dimensions. Bridge exists: %d", bridge != nil); - } + RCTDimensions dimensions = RCTGetDimensions(fontScale); __typeof(dimensions.window) window = dimensions.window; NSDictionary *dimsWindow = @{ @"width" : @(window.width), @@ -125,6 +117,15 @@ static BOOL RCTIsIPhoneX() return @{@"window" : dimsWindow, @"screen" : dimsScreen}; } +- (NSDictionary *)_exportedDimensions +{ + RCTAssert(_moduleRegistry, @"ModuleRegistry must be set to properly init dimensions"); + RCTAccessibilityManager *accessibilityManager = + (RCTAccessibilityManager *)[_moduleRegistry moduleForName:"AccessibilityManager"]; + CGFloat fontScale = accessibilityManager ? accessibilityManager.multiplier : 1.0; + return RCTExportedDimensions(fontScale); +} + - (NSDictionary *)constantsToExport { return [self getConstants]; @@ -133,11 +134,10 @@ static BOOL RCTIsIPhoneX() - (NSDictionary *)getConstants { __block NSDictionary *constants; - RCTModuleRegistry *moduleRegistry = _moduleRegistry; - RCTBridge *bridge = _bridge; + __weak __typeof(self) weakSelf = self; RCTUnsafeExecuteOnMainQueueSync(^{ constants = @{ - @"Dimensions" : RCTExportedDimensions(moduleRegistry, bridge), + @"Dimensions" : [weakSelf _exportedDimensions], // Note: // This prop is deprecated and will be removed in a future release. // Please use this only for a quick and temporary solution. @@ -151,15 +151,14 @@ static BOOL RCTIsIPhoneX() - (void)didReceiveNewContentSizeMultiplier { + __weak __typeof(self) weakSelf = self; RCTModuleRegistry *moduleRegistry = _moduleRegistry; - RCTBridge *bridge = _bridge; RCTExecuteOnMainQueue(^{ // Report the event across the bridge. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [[moduleRegistry moduleForName:"EventDispatcher"] - sendDeviceEventWithName:@"didUpdateDimensions" - body:RCTExportedDimensions(moduleRegistry, bridge)]; + [[moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions" + body:[weakSelf _exportedDimensions]]; #pragma clang diagnostic pop }); } @@ -195,9 +194,8 @@ - (void)_interfaceOrientationDidChange if ((isOrientationChanging || isResizingOrChangingToFullscreen) && RCTIsAppActive()) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [[_moduleRegistry moduleForName:"EventDispatcher"] - sendDeviceEventWithName:@"didUpdateDimensions" - body:RCTExportedDimensions(_moduleRegistry, _bridge)]; + [[_moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions" + body:[self _exportedDimensions]]; // We only want to track the current _currentInterfaceOrientation and _isFullscreen only // when it happens and only when it is published. _currentInterfaceOrientation = nextOrientation; @@ -216,7 +214,7 @@ - (void)interfaceFrameDidChange - (void)_interfaceFrameDidChange { - NSDictionary *nextInterfaceDimensions = RCTExportedDimensions(_moduleRegistry, _bridge); + NSDictionary *nextInterfaceDimensions = [self _exportedDimensions]; // update and publish the even only when the app is in active state if (!([nextInterfaceDimensions isEqual:_currentInterfaceDimensions]) && RCTIsAppActive()) {