Kotlinify DeviceInfoModule (#44536)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/44536

# Changelog:
[Internal] -

As in the title.

Reviewed By: alanleedev

Differential Revision: D57248069

fbshipit-source-id: 4187b620483d439da5fc4c81012c1124fa19fc09
This commit is contained in:
Ruslan Shestopalyuk
2024-05-14 00:05:23 -07:00
committed by Facebook GitHub Bot
parent 8593eee9fe
commit 61887338ea
3 changed files with 87 additions and 111 deletions
@@ -3241,10 +3241,10 @@ public abstract interface class com/facebook/react/modules/debug/interfaces/Deve
public abstract fun setRemoteJSDebugEnabled (Z)V
}
public class com/facebook/react/modules/deviceinfo/DeviceInfoModule : com/facebook/fbreact/specs/NativeDeviceInfoSpec, com/facebook/react/bridge/LifecycleEventListener {
public final class com/facebook/react/modules/deviceinfo/DeviceInfoModule : com/facebook/fbreact/specs/NativeDeviceInfoSpec, com/facebook/react/bridge/LifecycleEventListener {
public fun <init> (Landroid/content/Context;)V
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun emitUpdateDimensionsEvent ()V
public final fun emitUpdateDimensionsEvent ()V
public fun getTypedExportedConstants ()Ljava/util/Map;
public fun invalidate ()V
public fun onHostDestroy ()V
@@ -1,109 +0,0 @@
/*
* 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.
*/
package com.facebook.react.modules.deviceinfo;
import android.content.Context;
import androidx.annotation.Nullable;
import com.facebook.fbreact.specs.NativeDeviceInfoSpec;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactNoCrashSoftException;
import com.facebook.react.bridge.ReactSoftExceptionLogger;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.DisplayMetricsHolder;
import java.util.HashMap;
import java.util.Map;
/** Module that exposes Android Constants to JS. */
@ReactModule(name = NativeDeviceInfoSpec.NAME)
public class DeviceInfoModule extends NativeDeviceInfoSpec implements LifecycleEventListener {
private final @Nullable ReactApplicationContext mReactApplicationContext;
private float mFontScale;
private @Nullable ReadableMap mPreviousDisplayMetrics;
public DeviceInfoModule(ReactApplicationContext reactContext) {
super(reactContext);
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext);
mFontScale = reactContext.getResources().getConfiguration().fontScale;
mReactApplicationContext = reactContext;
mReactApplicationContext.addLifecycleEventListener(this);
}
public DeviceInfoModule(Context context) {
super(null);
mReactApplicationContext = null;
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(context);
mFontScale = context.getResources().getConfiguration().fontScale;
}
@Override
public @Nullable Map<String, Object> getTypedExportedConstants() {
WritableMap displayMetrics = DisplayMetricsHolder.getDisplayMetricsWritableMap(mFontScale);
// Cache the initial dimensions for later comparison in emitUpdateDimensionsEvent
mPreviousDisplayMetrics = displayMetrics.copy();
HashMap<String, Object> constants = new HashMap<>();
constants.put("Dimensions", displayMetrics.toHashMap());
return constants;
}
@Override
public void onHostResume() {
if (mReactApplicationContext == null) {
return;
}
float fontScale = mReactApplicationContext.getResources().getConfiguration().fontScale;
if (mFontScale != fontScale) {
mFontScale = fontScale;
emitUpdateDimensionsEvent();
}
}
@Override
public void onHostPause() {}
@Override
public void onHostDestroy() {}
public void emitUpdateDimensionsEvent() {
if (mReactApplicationContext == null) {
return;
}
if (mReactApplicationContext.hasActiveReactInstance()) {
// Don't emit an event to JS if the dimensions haven't changed
WritableMap displayMetrics = DisplayMetricsHolder.getDisplayMetricsWritableMap(mFontScale);
if (mPreviousDisplayMetrics == null) {
mPreviousDisplayMetrics = displayMetrics.copy();
} else if (!displayMetrics.equals(mPreviousDisplayMetrics)) {
mPreviousDisplayMetrics = displayMetrics.copy();
mReactApplicationContext.emitDeviceEvent("didUpdateDimensions", displayMetrics);
}
} else {
ReactSoftExceptionLogger.logSoftException(
NAME,
new ReactNoCrashSoftException(
"No active CatalystInstance, cannot emitUpdateDimensionsEvent"));
}
}
@Override
public void invalidate() {
super.invalidate();
if (mReactApplicationContext != null) {
mReactApplicationContext.removeLifecycleEventListener(this);
}
}
}
@@ -0,0 +1,85 @@
/*
* 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.
*/
package com.facebook.react.modules.deviceinfo
import android.content.Context
import com.facebook.fbreact.specs.NativeDeviceInfoSpec
import com.facebook.react.bridge.LifecycleEventListener
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactNoCrashSoftException
import com.facebook.react.bridge.ReactSoftExceptionLogger
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.DisplayMetricsHolder.getDisplayMetricsWritableMap
import com.facebook.react.uimanager.DisplayMetricsHolder.initDisplayMetricsIfNotInitialized
/** Module that exposes Android Constants to JS. */
@ReactModule(name = NativeDeviceInfoSpec.NAME)
public class DeviceInfoModule : NativeDeviceInfoSpec, LifecycleEventListener {
private var reactApplicationContext: ReactApplicationContext? = null
private var fontScale: Float
private var previousDisplayMetrics: ReadableMap? = null
public constructor(reactContext: ReactApplicationContext) : super(reactContext) {
initDisplayMetricsIfNotInitialized(reactContext)
fontScale = reactContext.resources.configuration.fontScale
reactContext.addLifecycleEventListener(this)
reactApplicationContext = reactContext
}
public constructor(context: Context) : super(null) {
reactApplicationContext = null
initDisplayMetricsIfNotInitialized(context)
fontScale = context.resources.configuration.fontScale
}
override public fun getTypedExportedConstants(): Map<String, Any> {
val displayMetrics = getDisplayMetricsWritableMap(fontScale.toDouble())
// Cache the initial dimensions for later comparison in emitUpdateDimensionsEvent
previousDisplayMetrics = displayMetrics.copy()
return mapOf("Dimensions" to displayMetrics.toHashMap())
}
override fun onHostResume() {
val newFontScale = reactApplicationContext?.resources?.configuration?.fontScale
if (newFontScale != null && newFontScale != fontScale) {
fontScale = newFontScale
emitUpdateDimensionsEvent()
}
}
override fun onHostPause(): Unit = Unit
override fun onHostDestroy(): Unit = Unit
public fun emitUpdateDimensionsEvent() {
reactApplicationContext?.let { context ->
if (context.hasActiveReactInstance()) {
// Don't emit an event to JS if the dimensions haven't changed
val displayMetrics = getDisplayMetricsWritableMap(fontScale.toDouble())
if (previousDisplayMetrics == null) {
previousDisplayMetrics = displayMetrics.copy()
} else if (displayMetrics != previousDisplayMetrics) {
previousDisplayMetrics = displayMetrics.copy()
context.emitDeviceEvent("didUpdateDimensions", displayMetrics)
}
} else {
ReactSoftExceptionLogger.logSoftException(
NativeDeviceInfoSpec.NAME,
ReactNoCrashSoftException(
"No active CatalystInstance, cannot emitUpdateDimensionsEvent"))
}
}
}
override fun invalidate() {
super.invalidate()
reactApplicationContext?.removeLifecycleEventListener(this)
}
}