Fix wrong modal size in fullscreen

Summary:
Display.getCurrentSizeRange() doesn't include the size of the status
bar, so Modal windows on Android have a gap in the bottom that is the
same size as the status bar. This checks the current theme and adds the
size of status bar to the modal window height if necessary.

**Test plan (required)**

Run a React Native app on Android with a theme that doesn't show status bar and launch a modal dialog. See issue #11872 for an example.
Closes https://github.com/facebook/react-native/pull/11928

Differential Revision: D4695847

fbshipit-source-id: 9fafc2b5040e2f58d562c9cc4cd4d6d87b0df2a3
This commit is contained in:
Üstün Ergenoglu 2017-03-11 17:22:32 -08:00 committed by Facebook Github Bot
parent 70e4a58d5b
commit 8ba06cbfb1

View File

@ -4,6 +4,8 @@ package com.facebook.react.views.modal;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Point;
import android.view.Display;
import android.view.WindowManager;
@ -38,12 +40,26 @@ import com.facebook.infer.annotation.Assertions;
// getSize will return the dimensions of the screen in its current orientation
display.getSize(SIZE_POINT);
int[] attrs = {android.R.attr.windowFullscreen};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);
boolean windowFullscreen = ta.getBoolean(0, false);
// We need to add the status bar height to the height if we have a fullscreen window,
// because Display.getCurrentSizeRange doesn't include it.
Resources resources = context.getResources();
int statusBarId = resources.getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = 0;
if (windowFullscreen && statusBarId > 0) {
statusBarHeight = (int) resources.getDimension(statusBarId);
}
if (SIZE_POINT.x < SIZE_POINT.y) {
// If we are vertical the width value comes from min width and height comes from max height
return new Point(MIN_POINT.x, MAX_POINT.y);
return new Point(MIN_POINT.x, MAX_POINT.y + statusBarHeight);
} else {
// If we are horizontal the width value comes from max width and height comes from min height
return new Point(MAX_POINT.x, MIN_POINT.y);
return new Point(MAX_POINT.x, MIN_POINT.y + statusBarHeight);
}
}
}