mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
67f6b32409
Summary: ...to reflect the modern world we live in with dynamic DPI platforms :) Closes https://github.com/facebook/yoga/pull/375 Reviewed By: dshahidehpour Differential Revision: D4528518 Pulled By: emilsjolander fbshipit-source-id: e422bd4ae148e02c598a7b484a6adfa8c0e1e0c9
109 lines
3.4 KiB
Java
109 lines
3.4 KiB
Java
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
package com.facebook.react.flat;
|
|
|
|
import android.annotation.TargetApi;
|
|
import android.content.Context;
|
|
import android.graphics.Point;
|
|
import android.view.Display;
|
|
import android.view.Surface;
|
|
import android.view.WindowManager;
|
|
|
|
import com.facebook.react.uimanager.ReactShadowNode;
|
|
import com.facebook.yoga.YogaValue;
|
|
import com.facebook.yoga.YogaUnit;
|
|
|
|
/**
|
|
* FlatReactModalShadowNode
|
|
*
|
|
* This is a Nodes specific shadow node for modals. This is required because we wrap any
|
|
* non-FlatShadowNode node in a NativeViewWrapper. In the case of a modal shadow node, we need
|
|
* to treat it as its own node so that we can add the custom measurement behavior that is there
|
|
* in the non-Nodes version when we add a child.
|
|
*
|
|
* {@see {@link com.facebook.react.views.modal.ModalHostShadowNode}}
|
|
*/
|
|
class FlatReactModalShadowNode extends FlatShadowNode implements AndroidView {
|
|
|
|
private final Point mMinPoint = new Point();
|
|
private final Point mMaxPoint = new Point();
|
|
private boolean mPaddingChanged;
|
|
|
|
FlatReactModalShadowNode() {
|
|
forceMountToView();
|
|
forceMountChildrenToView();
|
|
}
|
|
|
|
/**
|
|
* We need to set the styleWidth and styleHeight of the one child (represented by the <View/>
|
|
* within the <RCTModalHostView/> in Modal.js. This needs to fill the entire window.
|
|
*/
|
|
@Override
|
|
@TargetApi(16)
|
|
public void addChildAt(ReactShadowNode child, int i) {
|
|
super.addChildAt(child, i);
|
|
|
|
Context context = getThemedContext();
|
|
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
|
|
Display display = wm.getDefaultDisplay();
|
|
// getCurrentSizeRange will return the min and max width and height that the window can be
|
|
display.getCurrentSizeRange(mMinPoint, mMaxPoint);
|
|
|
|
int width, height;
|
|
int rotation = display.getRotation();
|
|
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
|
|
// If we are vertical the width value comes from min width and height comes from max height
|
|
width = mMinPoint.x;
|
|
height = mMaxPoint.y;
|
|
} else {
|
|
// If we are horizontal the width value comes from max width and height comes from min height
|
|
width = mMaxPoint.x;
|
|
height = mMinPoint.y;
|
|
}
|
|
child.setStyleWidth(width);
|
|
child.setStyleHeight(height);
|
|
}
|
|
|
|
@Override
|
|
public boolean needsCustomLayoutForChildren() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isPaddingChanged() {
|
|
return mPaddingChanged;
|
|
}
|
|
|
|
@Override
|
|
public void resetPaddingChanged() {
|
|
mPaddingChanged = false;
|
|
}
|
|
|
|
@Override
|
|
public void setPadding(int spacingType, float padding) {
|
|
YogaValue current = getStylePadding(spacingType);
|
|
if (current.unit != YogaUnit.POINT || current.value != padding) {
|
|
super.setPadding(spacingType, padding);
|
|
mPaddingChanged = true;
|
|
markUpdated();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setPaddingPercent(int spacingType, float percent) {
|
|
YogaValue current = getStylePadding(spacingType);
|
|
if (current.unit != YogaUnit.PERCENT || current.value != percent) {
|
|
super.setPadding(spacingType, percent);
|
|
mPaddingChanged = true;
|
|
markUpdated();
|
|
}
|
|
}
|
|
}
|