Skip to content

Commit 36297d3

Browse files
authored
ReactSoftKeyboardMonitor - fix crash when window is null (#783)
* ReactSoftKeyboardMonitor - fix crash when window is null * Fix
1 parent 56a52e9 commit 36297d3

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

lib/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.graphics.Rect;
44
import android.view.ViewTreeObserver;
5+
import android.view.Window;
56

67
import androidx.annotation.Nullable;
78

@@ -21,12 +22,14 @@ public interface Listener {
2122
@Override
2223
public void onGlobalLayout() {
2324
Integer viewportVisibleHeight = getViewportVisibleHeight();
24-
if (viewportVisibleHeight.equals(mLastViewportVisibleHeight)) {
25+
if (viewportVisibleHeight == null || viewportVisibleHeight.equals(mLastViewportVisibleHeight)) {
2526
return;
2627
}
27-
mLastViewportVisibleHeight = viewportVisibleHeight;
2828

29-
if (viewportVisibleHeight < mMaxViewportVisibleHeight) {
29+
mLastViewportVisibleHeight = viewportVisibleHeight;
30+
if (mMaxViewportVisibleHeight == null) {
31+
mMaxViewportVisibleHeight = viewportVisibleHeight;
32+
} else if (viewportVisibleHeight < mMaxViewportVisibleHeight) {
3033
mExternalListener.onSoftKeyboardVisible(!mSoftKeyboardUp);
3134
refreshKeyboardHeight();
3235
mSoftKeyboardUp = true;
@@ -42,15 +45,15 @@ public void onGlobalLayout() {
4245
* root-view height normally remains unaffected during immediate layout. We therefore keep the maximal view-port size so we could
4346
* concurrently compare heights in each layout.
4447
*/
45-
private int mMaxViewportVisibleHeight;
48+
private Integer mMaxViewportVisibleHeight;
4649

4750
private Integer mLastViewportVisibleHeight;
4851

4952
/**
5053
* Soft-keyboard *height* (when visible) is deduced by the effect on the root react-view height. This is ineffective in trying to
5154
* monitor keyboard appearance -- only for height measuring.
5255
*/
53-
private int mLocallyVisibleHeight;
56+
private Integer mLocallyVisibleHeight;
5457

5558
private boolean mSoftKeyboardUp;
5659
private Integer mKeyboardHeight;
@@ -84,7 +87,11 @@ public Integer getKeyboardHeight() {
8487
return mKeyboardHeight;
8588
}
8689

87-
return (int) (.5f * mLocallyVisibleHeight);
90+
if (mLocallyVisibleHeight != null) {
91+
return (int) (.5f * mLocallyVisibleHeight);
92+
}
93+
94+
return null;
8895
}
8996

9097
private void registerReactRootViewLayoutListener() {
@@ -123,17 +130,28 @@ public void run() {
123130
return;
124131
}
125132

126-
if (mLocallyVisibleHeight > locallyVisibleHeight) {
133+
if (mLocallyVisibleHeight == null) {
134+
mLocallyVisibleHeight = locallyVisibleHeight;
135+
mKeyboardHeight = mLocallyVisibleHeight;
136+
} else if (mLocallyVisibleHeight > locallyVisibleHeight) {
127137
mKeyboardHeight = mLocallyVisibleHeight - locallyVisibleHeight;
138+
} else {
139+
mKeyboardHeight = locallyVisibleHeight;
128140
}
129141
}
130142
});
131143
}
132144

133-
private int getViewportVisibleHeight() {
145+
private Integer getViewportVisibleHeight() {
146+
Integer visibleHeight = null;
134147
final Rect visibleArea = new Rect();
135-
getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleArea);
136-
return visibleArea.height();
148+
Window window = getWindow();
149+
if (window != null) {
150+
window.getDecorView().getWindowVisibleDisplayFrame(visibleArea);
151+
visibleHeight = visibleArea.height();
152+
}
153+
154+
return visibleHeight;
137155
}
138156

139157
private Integer getLocallyVisibleHeight() {

0 commit comments

Comments
 (0)