mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
126873f63d
Summary: Changelog: [Internal] this doesn't really make any sense, first of all CGFloat is a primitive data type so comparing it against nil only will return true if it's 0. but that won't catch cases where CGFloat is uninitialized bc it will be holding junk in memory. the error checking of the value is already handled in the accessibility manager, so just remove it here. Reviewed By: p-sun Differential Revision: D34909365 fbshipit-source-id: 483f9c100433f8533edd784622523c5469c616c2
231 lines
7.7 KiB
Plaintext
231 lines
7.7 KiB
Plaintext
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTDeviceInfo.h"
|
|
|
|
#import <FBReactNativeSpec/FBReactNativeSpec.h>
|
|
#import <React/RCTAccessibilityManager.h>
|
|
#import <React/RCTAssert.h>
|
|
#import <React/RCTConstants.h>
|
|
#import <React/RCTEventDispatcherProtocol.h>
|
|
#import <React/RCTInitializing.h>
|
|
#import <React/RCTUIUtils.h>
|
|
#import <React/RCTUtils.h>
|
|
|
|
#import "CoreModulesPlugins.h"
|
|
|
|
using namespace facebook::react;
|
|
|
|
@interface RCTDeviceInfo () <NativeDeviceInfoSpec, RCTInitializing>
|
|
@end
|
|
|
|
@implementation RCTDeviceInfo {
|
|
UIInterfaceOrientation _currentInterfaceOrientation;
|
|
NSDictionary *_currentInterfaceDimensions;
|
|
}
|
|
|
|
@synthesize moduleRegistry = _moduleRegistry;
|
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
+ (BOOL)requiresMainQueueSetup
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (dispatch_queue_t)methodQueue
|
|
{
|
|
return dispatch_get_main_queue();
|
|
}
|
|
|
|
- (void)initialize
|
|
{
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(didReceiveNewContentSizeMultiplier)
|
|
name:RCTAccessibilityManagerDidUpdateMultiplierNotification
|
|
object:[_moduleRegistry moduleForName:"AccessibilityManager"]];
|
|
|
|
_currentInterfaceOrientation = [RCTSharedApplication() statusBarOrientation];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(interfaceOrientationDidChange)
|
|
name:UIApplicationDidChangeStatusBarOrientationNotification
|
|
object:nil];
|
|
|
|
_currentInterfaceDimensions = RCTExportedDimensions(_moduleRegistry);
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(interfaceFrameDidChange)
|
|
name:UIApplicationDidBecomeActiveNotification
|
|
object:nil];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(interfaceFrameDidChange)
|
|
name:RCTUserInterfaceStyleDidChangeNotification
|
|
object:nil];
|
|
}
|
|
|
|
- (void)setModuleRegistry:(RCTModuleRegistry *)moduleRegistry
|
|
{
|
|
if (!moduleRegistry) {
|
|
RCTAssert(false, @"moduleRegistry should not be nil, _moduleRegistry is nil: %d", _moduleRegistry == nil);
|
|
}
|
|
_moduleRegistry = moduleRegistry;
|
|
}
|
|
|
|
static BOOL RCTIsIPhoneX()
|
|
{
|
|
static BOOL isIPhoneX = NO;
|
|
static dispatch_once_t onceToken;
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
RCTAssertMainQueue();
|
|
|
|
CGSize screenSize = [UIScreen mainScreen].nativeBounds.size;
|
|
CGSize iPhoneXScreenSize = CGSizeMake(1125, 2436);
|
|
CGSize iPhoneXMaxScreenSize = CGSizeMake(1242, 2688);
|
|
CGSize iPhoneXRScreenSize = CGSizeMake(828, 1792);
|
|
CGSize iPhone12ScreenSize = CGSizeMake(1170, 2532);
|
|
CGSize iPhone12MiniScreenSize = CGSizeMake(1080, 2340);
|
|
CGSize iPhone12ProMaxScreenSize = CGSizeMake(1284, 2778);
|
|
|
|
isIPhoneX = CGSizeEqualToSize(screenSize, iPhoneXScreenSize) ||
|
|
CGSizeEqualToSize(screenSize, iPhoneXMaxScreenSize) || CGSizeEqualToSize(screenSize, iPhoneXRScreenSize) ||
|
|
CGSizeEqualToSize(screenSize, iPhone12ScreenSize) || CGSizeEqualToSize(screenSize, iPhone12MiniScreenSize) ||
|
|
CGSizeEqualToSize(screenSize, iPhone12ProMaxScreenSize);
|
|
;
|
|
});
|
|
|
|
return isIPhoneX;
|
|
}
|
|
|
|
static NSDictionary *RCTExportedDimensions(RCTModuleRegistry *moduleRegistry)
|
|
{
|
|
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.");
|
|
}
|
|
__typeof(dimensions.window) window = dimensions.window;
|
|
NSDictionary<NSString *, NSNumber *> *dimsWindow = @{
|
|
@"width" : @(window.width),
|
|
@"height" : @(window.height),
|
|
@"scale" : @(window.scale),
|
|
@"fontScale" : @(window.fontScale)
|
|
};
|
|
__typeof(dimensions.screen) screen = dimensions.screen;
|
|
NSDictionary<NSString *, NSNumber *> *dimsScreen = @{
|
|
@"width" : @(screen.width),
|
|
@"height" : @(screen.height),
|
|
@"scale" : @(screen.scale),
|
|
@"fontScale" : @(screen.fontScale)
|
|
};
|
|
return @{@"window" : dimsWindow, @"screen" : dimsScreen};
|
|
}
|
|
|
|
- (NSDictionary<NSString *, id> *)constantsToExport
|
|
{
|
|
return [self getConstants];
|
|
}
|
|
|
|
- (NSDictionary<NSString *, id> *)getConstants
|
|
{
|
|
__block NSDictionary<NSString *, id> *constants;
|
|
RCTModuleRegistry *moduleRegistry = _moduleRegistry;
|
|
RCTUnsafeExecuteOnMainQueueSync(^{
|
|
constants = @{
|
|
@"Dimensions" : RCTExportedDimensions(moduleRegistry),
|
|
// Note:
|
|
// This prop is deprecated and will be removed in a future release.
|
|
// Please use this only for a quick and temporary solution.
|
|
// Use <SafeAreaView> instead.
|
|
@"isIPhoneX_deprecated" : @(RCTIsIPhoneX()),
|
|
};
|
|
});
|
|
|
|
return constants;
|
|
}
|
|
|
|
- (void)didReceiveNewContentSizeMultiplier
|
|
{
|
|
RCTModuleRegistry *moduleRegistry = _moduleRegistry;
|
|
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)];
|
|
#pragma clang diagnostic pop
|
|
});
|
|
}
|
|
|
|
- (void)interfaceOrientationDidChange
|
|
{
|
|
__weak __typeof(self) weakSelf = self;
|
|
RCTExecuteOnMainQueue(^{
|
|
[weakSelf _interfaceOrientationDidChange];
|
|
});
|
|
}
|
|
|
|
- (void)_interfaceOrientationDidChange
|
|
{
|
|
UIInterfaceOrientation nextOrientation = [RCTSharedApplication() statusBarOrientation];
|
|
|
|
// Update when we go from portrait to landscape, or landscape to portrait
|
|
if ((UIInterfaceOrientationIsPortrait(_currentInterfaceOrientation) &&
|
|
!UIInterfaceOrientationIsPortrait(nextOrientation)) ||
|
|
(UIInterfaceOrientationIsLandscape(_currentInterfaceOrientation) &&
|
|
!UIInterfaceOrientationIsLandscape(nextOrientation))) {
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
[[_moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions"
|
|
body:RCTExportedDimensions(_moduleRegistry)];
|
|
#pragma clang diagnostic pop
|
|
}
|
|
|
|
_currentInterfaceOrientation = nextOrientation;
|
|
}
|
|
|
|
- (void)interfaceFrameDidChange
|
|
{
|
|
__weak __typeof(self) weakSelf = self;
|
|
RCTExecuteOnMainQueue(^{
|
|
[weakSelf _interfaceFrameDidChange];
|
|
});
|
|
}
|
|
|
|
- (void)_interfaceFrameDidChange
|
|
{
|
|
NSDictionary *nextInterfaceDimensions = RCTExportedDimensions(_moduleRegistry);
|
|
|
|
if (!([nextInterfaceDimensions isEqual:_currentInterfaceDimensions])) {
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
[[_moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions"
|
|
body:nextInterfaceDimensions];
|
|
#pragma clang diagnostic pop
|
|
}
|
|
|
|
_currentInterfaceDimensions = nextInterfaceDimensions;
|
|
}
|
|
|
|
- (std::shared_ptr<TurboModule>)getTurboModule:(const ObjCTurboModule::InitParams &)params
|
|
{
|
|
return std::make_shared<NativeDeviceInfoSpecJSI>(params);
|
|
}
|
|
|
|
@end
|
|
|
|
Class RCTDeviceInfoCls(void)
|
|
{
|
|
return RCTDeviceInfo.class;
|
|
}
|