diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index cfb6b5031c1..f4f220e9a26 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -15,10 +15,8 @@ import static com.facebook.systrace.Systrace.TRACE_TAG_REACT_JAVA_BRIDGE; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; -import android.util.DisplayMetrics; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Surface; @@ -683,8 +681,6 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot { private int mKeyboardHeight = 0; private int mDeviceRotation = 0; - private DisplayMetrics mWindowMetrics = new DisplayMetrics(); - private DisplayMetrics mScreenMetrics = new DisplayMetrics(); /* package */ CustomGlobalLayoutListener() { DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(getContext().getApplicationContext()); @@ -749,32 +745,8 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot { } private void checkForDeviceDimensionsChanges() { - // Get current display metrics. - DisplayMetricsHolder.initDisplayMetrics(getContext()); - // Check changes to both window and screen display metrics since they may not update at the - // same time. - if (!areMetricsEqual(mWindowMetrics, DisplayMetricsHolder.getWindowDisplayMetrics()) - || !areMetricsEqual(mScreenMetrics, DisplayMetricsHolder.getScreenDisplayMetrics())) { - mWindowMetrics.setTo(DisplayMetricsHolder.getWindowDisplayMetrics()); - mScreenMetrics.setTo(DisplayMetricsHolder.getScreenDisplayMetrics()); - emitUpdateDimensionsEvent(); - } - } - - private boolean areMetricsEqual(DisplayMetrics displayMetrics, DisplayMetrics otherMetrics) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return displayMetrics.equals(otherMetrics); - } else { - // DisplayMetrics didn't have an equals method before API 17. - // Check all public fields manually. - return displayMetrics.widthPixels == otherMetrics.widthPixels - && displayMetrics.heightPixels == otherMetrics.heightPixels - && displayMetrics.density == otherMetrics.density - && displayMetrics.densityDpi == otherMetrics.densityDpi - && displayMetrics.scaledDensity == otherMetrics.scaledDensity - && displayMetrics.xdpi == otherMetrics.xdpi - && displayMetrics.ydpi == otherMetrics.ydpi; - } + // DeviceInfoModule caches the last dimensions emitted to JS, so we don't need to check here. + emitUpdateDimensionsEvent(); } private void emitOrientationChanged(final int newRotation) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java index d9972664265..a6a2e5c4a47 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java @@ -14,6 +14,8 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactNoCrashSoftException; import com.facebook.react.bridge.ReactSoftException; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.turbomodule.core.interfaces.TurboModule; @@ -30,6 +32,7 @@ public class DeviceInfoModule extends ReactContextBaseJavaModule private @Nullable ReactApplicationContext mReactApplicationContext; private float mFontScale; + private @Nullable ReadableMap mPreviousDisplayMetrics; public DeviceInfoModule(ReactApplicationContext reactContext) { super(reactContext); @@ -83,9 +86,15 @@ public class DeviceInfoModule extends ReactContextBaseJavaModule } if (mReactApplicationContext.hasActiveCatalystInstance()) { - mReactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("didUpdateDimensions", DisplayMetricsHolder.getDisplayMetricsNativeMap(mFontScale)); + // Don't emit an event to JS if the dimensions haven't changed + WritableNativeMap displayMetrics = + DisplayMetricsHolder.getDisplayMetricsNativeMap(mFontScale); + if (!displayMetrics.equals(mPreviousDisplayMetrics)) { + mReactApplicationContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("didUpdateDimensions", displayMetrics); + mPreviousDisplayMetrics = displayMetrics; + } } else { ReactSoftException.logSoftException( NAME,