diff --git a/Libraries/Utilities/DeviceInfo.js b/Libraries/Utilities/DeviceInfo.js index 9757f2686e..c3f59c5e88 100644 --- a/Libraries/Utilities/DeviceInfo.js +++ b/Libraries/Utilities/DeviceInfo.js @@ -10,10 +10,6 @@ 'use strict'; -const DeviceInfo = require('../BatchedBridge/NativeModules').DeviceInfo; +import NativeDeviceInfo from './NativeDeviceInfo'; -const invariant = require('invariant'); - -invariant(DeviceInfo, 'DeviceInfo native module is not installed correctly'); - -module.exports = DeviceInfo; +module.exports = NativeDeviceInfo; diff --git a/Libraries/Utilities/Dimensions.js b/Libraries/Utilities/Dimensions.js index 383dcc44c8..508f6b0403 100644 --- a/Libraries/Utilities/Dimensions.js +++ b/Libraries/Utilities/Dimensions.js @@ -14,6 +14,8 @@ const EventEmitter = require('../vendor/emitter/EventEmitter'); const Platform = require('./Platform'); const RCTDeviceEventEmitter = require('../EventEmitter/RCTDeviceEventEmitter'); +import NativeDeviceInfo from './NativeDeviceInfo'; + const invariant = require('invariant'); const eventEmitter = new EventEmitter(); @@ -128,8 +130,7 @@ let dims: ?{[key: string]: any} = global.nativeExtensions.DeviceInfo.Dimensions; let nativeExtensionsEnabled = true; if (!dims) { - const DeviceInfo = require('./DeviceInfo'); - dims = DeviceInfo.Dimensions; + dims = NativeDeviceInfo.getConstants().Dimensions; nativeExtensionsEnabled = false; } diff --git a/Libraries/Utilities/NativeDeviceInfo.js b/Libraries/Utilities/NativeDeviceInfo.js new file mode 100644 index 0000000000..dd90580654 --- /dev/null +++ b/Libraries/Utilities/NativeDeviceInfo.js @@ -0,0 +1,47 @@ +/** + * 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 strict-local + * @format + */ + +'use strict'; + +import type {TurboModule} from 'RCTExport'; +import * as TurboModuleRegistry from 'TurboModuleRegistry'; + +type DisplayMetricsAndroid = {| + width: number, + height: number, + scale: number, + fontScale: number, + densityDpi: number, +|}; + +type DisplayMetricsIOS = {| + width: number, + height: number, + scale: number, + fontScale: number, +|}; + +export interface Spec extends TurboModule { + +getConstants: () => {| + +Dimensions: { + window?: DisplayMetricsIOS, + screen?: DisplayMetricsIOS, + windowPhysicalPixels?: DisplayMetricsAndroid, + screenPhysicalPixels?: DisplayMetricsAndroid, + }, + +isIPhoneX_deprecated?: boolean, + |}; +} + +const NativeModule = TurboModuleRegistry.getEnforcing('DeviceInfo'); + +const NativeDeviceInfo = NativeModule; + +export default NativeDeviceInfo; diff --git a/Libraries/Utilities/__tests__/DeviceInfo-test.js b/Libraries/Utilities/__tests__/DeviceInfo-test.js index 049feb571d..8cc9c22446 100644 --- a/Libraries/Utilities/__tests__/DeviceInfo-test.js +++ b/Libraries/Utilities/__tests__/DeviceInfo-test.js @@ -14,6 +14,6 @@ describe('DeviceInfo', () => { const DeviceInfo = require('../DeviceInfo'); it('should give device info', () => { - expect(DeviceInfo).toHaveProperty('Dimensions'); + expect(DeviceInfo.getConstants()).toHaveProperty('Dimensions'); }); }); diff --git a/Libraries/react-native/react-native-implementation.js b/Libraries/react-native/react-native-implementation.js index 66f1ce260e..0b9f07b6aa 100644 --- a/Libraries/react-native/react-native-implementation.js +++ b/Libraries/react-native/react-native-implementation.js @@ -206,7 +206,7 @@ module.exports = { return require('DatePickerAndroid'); }, get DeviceInfo() { - return require('DeviceInfo'); + return require('NativeDeviceInfo').default; }, get Dimensions() { return require('Dimensions'); diff --git a/RNTester/js/examples/SafeAreaView/SafeAreaViewExample.js b/RNTester/js/examples/SafeAreaView/SafeAreaViewExample.js index 287c19bbfd..d92acd76f1 100644 --- a/RNTester/js/examples/SafeAreaView/SafeAreaViewExample.js +++ b/RNTester/js/examples/SafeAreaView/SafeAreaViewExample.js @@ -87,7 +87,7 @@ class IsIPhoneXExample extends React.Component<{}> { Is this an iPhone X:{' '} - {DeviceInfo.isIPhoneX_deprecated + {DeviceInfo.getConstants().isIPhoneX_deprecated ? 'Yeah!' : 'Nope. (Or `isIPhoneX_deprecated` was already removed.)'} diff --git a/jest/setup.js b/jest/setup.js index 3a2eb77bd2..e03244ed5d 100644 --- a/jest/setup.js +++ b/jest/setup.js @@ -153,19 +153,23 @@ const mockNativeModules = { queryData: jest.fn(), }, DeviceInfo: { - Dimensions: { - window: { - fontScale: 2, - height: 1334, - scale: 2, - width: 750, - }, - screen: { - fontScale: 2, - height: 1334, - scale: 2, - width: 750, - }, + getConstants() { + return { + Dimensions: { + window: { + fontScale: 2, + height: 1334, + scale: 2, + width: 750, + }, + screen: { + fontScale: 2, + height: 1334, + scale: 2, + width: 750, + }, + }, + }; }, }, FacebookSDK: {