Skip to content

Commit

Permalink
Fix dimensions on orientation change
Browse files Browse the repository at this point in the history
Summary:
This adds the `didUpdateDimensions` event that already exists on iOS, and
updates the internal native dimensions data that needs repopulation after
orientation change.

Reviewed By: foghina

Differential Revision: D3819364

fbshipit-source-id: fc2b3b4d1991d101e5de4439ccef2189bc65fd58
  • Loading branch information
andreicoman11 authored and Facebook Github Bot 1 committed Sep 6, 2016
1 parent 48ab5eb commit 8451585
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 7 deletions.
30 changes: 29 additions & 1 deletion ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java
Expand Up @@ -11,11 +11,11 @@

import javax.annotation.Nullable;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
Expand Down Expand Up @@ -346,6 +346,10 @@ private void checkForDeviceOrientationChanges() {
return;
}
mDeviceRotation = rotation;
// It's important to repopulate DisplayMetrics and export them before emitting the
// orientation change event, so that the Dimensions object returns the correct new values.
DisplayMetricsHolder.initDisplayMetrics(getContext());
emitUpdateDimensionsEvent();
emitOrientationChanged(rotation);
}

Expand Down Expand Up @@ -384,6 +388,30 @@ private void emitOrientationChanged(final int newRotation) {
sendEvent("namedOrientationDidChange", map);
}

private void emitUpdateDimensionsEvent() {
DisplayMetrics windowDisplayMetrics = DisplayMetricsHolder.getWindowDisplayMetrics();
DisplayMetrics screenDisplayMetrics = DisplayMetricsHolder.getScreenDisplayMetrics();

WritableMap windowDisplayMetricsMap = Arguments.createMap();
windowDisplayMetricsMap.putInt("width", windowDisplayMetrics.widthPixels);
windowDisplayMetricsMap.putInt("height", windowDisplayMetrics.heightPixels);
windowDisplayMetricsMap.putDouble("scale", windowDisplayMetrics.density);
windowDisplayMetricsMap.putDouble("fontScale", windowDisplayMetrics.scaledDensity);
windowDisplayMetricsMap.putDouble("densityDpi", windowDisplayMetrics.densityDpi);

WritableMap screenDisplayMetricsMap = Arguments.createMap();
screenDisplayMetricsMap.putInt("width", screenDisplayMetrics.widthPixels);
screenDisplayMetricsMap.putInt("height", screenDisplayMetrics.heightPixels);
screenDisplayMetricsMap.putDouble("scale", screenDisplayMetrics.density);
screenDisplayMetricsMap.putDouble("fontScale", screenDisplayMetrics.scaledDensity);
screenDisplayMetricsMap.putDouble("densityDpi", screenDisplayMetrics.densityDpi);

WritableMap dimensionsMap = Arguments.createMap();
dimensionsMap.putMap("windowPhysicalPixels", windowDisplayMetricsMap);
dimensionsMap.putMap("screenPhysicalPixels", screenDisplayMetricsMap);
sendEvent("didUpdateDimensions", dimensionsMap);
}

private void sendEvent(String eventName, @Nullable WritableMap params) {
if (mReactInstanceManager != null) {
mReactInstanceManager.getCurrentReactContext()
Expand Down
Expand Up @@ -9,17 +9,17 @@

package com.facebook.react.uimanager;

import javax.annotation.Nullable;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.Context;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.annotation.Nullable;

import com.facebook.infer.annotation.Assertions;

/**
Expand All @@ -43,11 +43,15 @@ public class DisplayMetricsHolder {
public static void setWindowDisplayMetrics(DisplayMetrics displayMetrics) {
sWindowDisplayMetrics = displayMetrics;
}

public static void initDisplayMetricsIfNotInitialized(Context context) {
if (DisplayMetricsHolder.getScreenDisplayMetrics() != null) {
return;
}
initDisplayMetrics(context);
}

public static void initDisplayMetrics(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics);

Expand Down

0 comments on commit 8451585

Please sign in to comment.