mirror of
https://github.com/status-im/react-native.git
synced 2025-01-27 09:45:04 +00:00
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:
parent
70e4a58d5b
commit
8ba06cbfb1
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user