2
2
3
3
import android .graphics .Rect ;
4
4
import android .view .ViewTreeObserver ;
5
+ import android .view .Window ;
5
6
6
7
import androidx .annotation .Nullable ;
7
8
@@ -21,12 +22,14 @@ public interface Listener {
21
22
@ Override
22
23
public void onGlobalLayout () {
23
24
Integer viewportVisibleHeight = getViewportVisibleHeight ();
24
- if (viewportVisibleHeight .equals (mLastViewportVisibleHeight )) {
25
+ if (viewportVisibleHeight == null || viewportVisibleHeight .equals (mLastViewportVisibleHeight )) {
25
26
return ;
26
27
}
27
- mLastViewportVisibleHeight = viewportVisibleHeight ;
28
28
29
- if (viewportVisibleHeight < mMaxViewportVisibleHeight ) {
29
+ mLastViewportVisibleHeight = viewportVisibleHeight ;
30
+ if (mMaxViewportVisibleHeight == null ) {
31
+ mMaxViewportVisibleHeight = viewportVisibleHeight ;
32
+ } else if (viewportVisibleHeight < mMaxViewportVisibleHeight ) {
30
33
mExternalListener .onSoftKeyboardVisible (!mSoftKeyboardUp );
31
34
refreshKeyboardHeight ();
32
35
mSoftKeyboardUp = true ;
@@ -42,15 +45,15 @@ public void onGlobalLayout() {
42
45
* root-view height normally remains unaffected during immediate layout. We therefore keep the maximal view-port size so we could
43
46
* concurrently compare heights in each layout.
44
47
*/
45
- private int mMaxViewportVisibleHeight ;
48
+ private Integer mMaxViewportVisibleHeight ;
46
49
47
50
private Integer mLastViewportVisibleHeight ;
48
51
49
52
/**
50
53
* Soft-keyboard *height* (when visible) is deduced by the effect on the root react-view height. This is ineffective in trying to
51
54
* monitor keyboard appearance -- only for height measuring.
52
55
*/
53
- private int mLocallyVisibleHeight ;
56
+ private Integer mLocallyVisibleHeight ;
54
57
55
58
private boolean mSoftKeyboardUp ;
56
59
private Integer mKeyboardHeight ;
@@ -84,7 +87,11 @@ public Integer getKeyboardHeight() {
84
87
return mKeyboardHeight ;
85
88
}
86
89
87
- return (int ) (.5f * mLocallyVisibleHeight );
90
+ if (mLocallyVisibleHeight != null ) {
91
+ return (int ) (.5f * mLocallyVisibleHeight );
92
+ }
93
+
94
+ return null ;
88
95
}
89
96
90
97
private void registerReactRootViewLayoutListener () {
@@ -123,17 +130,28 @@ public void run() {
123
130
return ;
124
131
}
125
132
126
- if (mLocallyVisibleHeight > locallyVisibleHeight ) {
133
+ if (mLocallyVisibleHeight == null ) {
134
+ mLocallyVisibleHeight = locallyVisibleHeight ;
135
+ mKeyboardHeight = mLocallyVisibleHeight ;
136
+ } else if (mLocallyVisibleHeight > locallyVisibleHeight ) {
127
137
mKeyboardHeight = mLocallyVisibleHeight - locallyVisibleHeight ;
138
+ } else {
139
+ mKeyboardHeight = locallyVisibleHeight ;
128
140
}
129
141
}
130
142
});
131
143
}
132
144
133
- private int getViewportVisibleHeight () {
145
+ private Integer getViewportVisibleHeight () {
146
+ Integer visibleHeight = null ;
134
147
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 ;
137
155
}
138
156
139
157
private Integer getLocallyVisibleHeight () {
0 commit comments