From 5cdab30947fbdbbbc23a9180e6c222ce08c32be7 Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 12:03:12 +0100 Subject: [PATCH 01/11] compute correct Keyboard Height with Notch Without Notch - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels is 1794 - mVisibleViewArea.bottom is 1794 **With Notch** - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels is 1668 - mVisibleViewArea.bottom is 1794 Observations: - getWindowVisibleDisplayFrame().heightPixels returns correct height for devices with Notch - mVisibleViewArea.bottom does not take in consideration the notch (the value does not change) Solution: - Including the Notch Height in the Keyboard Height calculation Clear Explanation at https://github.com/facebook/react-native/issues/27089#issuecomment-775821333 https://github.com/facebook/react-native/blob/d79212120b7168015d3d0225ef372ed851a230fa/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java#L757-L758 --- .../src/main/java/com/facebook/react/ReactRootView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 13074f8963e445..7f440be3e910e1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -25,6 +25,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.DisplayCutout; import android.widget.FrameLayout; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; @@ -766,8 +767,10 @@ public void onGlobalLayout() { private void checkForKeyboardEvents() { getRootView().getWindowVisibleDisplayFrame(mVisibleViewArea); + DisplayCutout displayCutout = getRootView().getRootWindowInsets().getDisplayCutout(); + int notchHeight = displayCutout == null ? 0 : displayCutout.getSafeInsetTop(); final int heightDiff = - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - mVisibleViewArea.bottom; + DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - mVisibleViewArea.bottom + notchHeight; boolean isKeyboardShowingOrKeyboardHeightChanged = mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; From b952474e2ff3ef8881af133309c2c11b3dea735b Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 12:55:20 +0100 Subject: [PATCH 02/11] default notchHeight to 0 for API < 28 --- .../src/main/java/com/facebook/react/ReactRootView.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 7f440be3e910e1..412c47ff4e2605 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -16,6 +16,7 @@ import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; +import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.view.KeyEvent; @@ -767,8 +768,11 @@ public void onGlobalLayout() { private void checkForKeyboardEvents() { getRootView().getWindowVisibleDisplayFrame(mVisibleViewArea); - DisplayCutout displayCutout = getRootView().getRootWindowInsets().getDisplayCutout(); - int notchHeight = displayCutout == null ? 0 : displayCutout.getSafeInsetTop(); + int notchHeight = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + DisplayCutout displayCutout = getRootView().getRootWindowInsets().getDisplayCutout(); + if (displayCutout != null) notchHeight = displayCutout.getSafeInsetTop(); + } final int heightDiff = DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - mVisibleViewArea.bottom + notchHeight; From 3280f40892dccd265dba360fcb3fa4b32e16c99d Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 14:43:17 +0100 Subject: [PATCH 03/11] fix import order for linter --- .../src/main/java/com/facebook/react/ReactRootView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 412c47ff4e2605..73652c589cce35 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -19,6 +19,7 @@ import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; +import android.view.DisplayCutout; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Surface; @@ -26,7 +27,6 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; -import android.view.DisplayCutout; import android.widget.FrameLayout; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; @@ -774,7 +774,9 @@ private void checkForKeyboardEvents() { if (displayCutout != null) notchHeight = displayCutout.getSafeInsetTop(); } final int heightDiff = - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - mVisibleViewArea.bottom + notchHeight; + DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels + - mVisibleViewArea.bottom + + notchHeight; boolean isKeyboardShowingOrKeyboardHeightChanged = mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; From ffb92619baf0ce7c257e102df7fb8352916ee0b5 Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 14:46:35 +0100 Subject: [PATCH 04/11] fix linter issues in Java --- .../main/java/com/facebook/react/ReactRootView.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 73652c589cce35..c57d6a4db9db4a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -771,12 +771,14 @@ private void checkForKeyboardEvents() { int notchHeight = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { DisplayCutout displayCutout = getRootView().getRootWindowInsets().getDisplayCutout(); - if (displayCutout != null) notchHeight = displayCutout.getSafeInsetTop(); + if (displayCutout != null) { + notchHeight = displayCutout.getSafeInsetTop(); + } } final int heightDiff = - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - - mVisibleViewArea.bottom - + notchHeight; + DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels + - mVisibleViewArea.bottom + + notchHeight; boolean isKeyboardShowingOrKeyboardHeightChanged = mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; From dd15c50c1c1ecca47ab38a0ea3090050c387694e Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 15:09:28 +0100 Subject: [PATCH 05/11] fix google linter issues --- .../src/main/java/com/facebook/react/ReactRootView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index c57d6a4db9db4a..11dd597ce70780 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -776,9 +776,9 @@ private void checkForKeyboardEvents() { } } final int heightDiff = - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - - mVisibleViewArea.bottom - + notchHeight; + DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels + - mVisibleViewArea.bottom + + notchHeight; boolean isKeyboardShowingOrKeyboardHeightChanged = mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; From 0b65aa36df495e43549a5d555cce90e872b3cc2e Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 9 Feb 2021 15:28:22 +0100 Subject: [PATCH 06/11] fix google code linter issues --- .../src/main/java/com/facebook/react/ReactRootView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 11dd597ce70780..8d49b8dec7d8da 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -777,8 +777,8 @@ private void checkForKeyboardEvents() { } final int heightDiff = DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - - mVisibleViewArea.bottom - + notchHeight; + - mVisibleViewArea.bottom + + notchHeight; boolean isKeyboardShowingOrKeyboardHeightChanged = mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; From 136147ba52c5a8476e94ae53f6cbcb19b6f3766c Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Fri, 12 Feb 2021 18:37:51 +0100 Subject: [PATCH 07/11] Java Unit Test checkForKeyboardEvents basic setup of the test passing green verifies that the event is invoked twice Still have to understand why the event is triggered twice I faked the implementation of getWindowVisibleDisplayFrame to simulate the keyboard opening that triggers keyboardDidShow event --- .../java/com/facebook/react/RootViewTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index c0a28af8f86fb4..0c6507d56738d7 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -7,10 +7,19 @@ package com.facebook.react; +import com.facebook.react.uimanager.ReactRoot; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.bridge.WritableMap; +import android.util.Log; +import android.graphics.Rect; + import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import org.mockito.Mockito; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -209,4 +218,31 @@ public void testRemountApplication() { rootView.unmountReactApplication(); rootView.startReactApplication(instanceManager, ""); } + + @Test + public void testCheckForKeyboardEvents() { + ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); + when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); + UIManagerModule uiManager = mock(UIManagerModule.class); + EventDispatcher eventDispatcher = mock(EventDispatcher.class); + DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitterModuleMock = mock(DeviceEventManagerModule.RCTDeviceEventEmitter.class); + when(mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)).thenReturn(eventEmitterModuleMock); + when(mCatalystInstanceMock.getNativeModule(UIManagerModule.class)).thenReturn(uiManager); + when(uiManager.getEventDispatcher()).thenReturn(eventDispatcher); + + int rootViewId = 7; + + ReactRootView rootView = new ReactRootView(mReactContext) { + @Override + public void getWindowVisibleDisplayFrame(Rect outRect) { + outRect.bottom += 100; + } + }; + rootView.setId(rootViewId); + rootView.setRootViewTag(rootViewId); + rootView.startReactApplication(instanceManager, ""); + rootView.simulateAttachForTesting(); + rootView.getCustomGlobalLayoutListener().checkForKeyboardEvents(); + verify(instanceManager, Mockito.times(2)).getCurrentReactContext(); + } } From 0828998f9a952f2186641c3b8d6fc65f37618745 Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Mon, 15 Feb 2021 10:54:00 +0100 Subject: [PATCH 08/11] add method simulateCheckForKeyboardForTesting The method has annotation @VisibleForTesting and is available only for testing purposes --- .../com/facebook/react/ReactRootView.java | 5 +++ .../java/com/facebook/react/RootViewTest.java | 35 +++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 8d49b8dec7d8da..5bfdf9aafd8398 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -649,6 +649,11 @@ public void runApplication() { mJSTouchDispatcher = new JSTouchDispatcher(this); } + @VisibleForTesting + /* package */ void simulateCheckForKeyboardForTesting() { + getCustomGlobalLayoutListener().checkForKeyboardEvents(); + } + private CustomGlobalLayoutListener getCustomGlobalLayoutListener() { if (mCustomGlobalLayoutListener == null) { mCustomGlobalLayoutListener = new CustomGlobalLayoutListener(); diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index 0c6507d56738d7..9c902bc5cd7310 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -7,24 +7,16 @@ package com.facebook.react; -import com.facebook.react.uimanager.ReactRoot; -import com.facebook.react.bridge.Arguments; -import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.facebook.react.bridge.WritableMap; -import android.util.Log; -import android.graphics.Rect; - import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; -import org.mockito.Mockito; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import android.graphics.Rect; import android.view.MotionEvent; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.CatalystInstance; @@ -35,6 +27,7 @@ import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.SystemClock; +import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.Event; @@ -46,6 +39,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.api.mockito.PowerMockito; @@ -225,24 +219,27 @@ public void testCheckForKeyboardEvents() { when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); UIManagerModule uiManager = mock(UIManagerModule.class); EventDispatcher eventDispatcher = mock(EventDispatcher.class); - DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitterModuleMock = mock(DeviceEventManagerModule.RCTDeviceEventEmitter.class); - when(mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)).thenReturn(eventEmitterModuleMock); + DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitterModuleMock = + mock(DeviceEventManagerModule.RCTDeviceEventEmitter.class); + when(mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)) + .thenReturn(eventEmitterModuleMock); when(mCatalystInstanceMock.getNativeModule(UIManagerModule.class)).thenReturn(uiManager); when(uiManager.getEventDispatcher()).thenReturn(eventDispatcher); int rootViewId = 7; - ReactRootView rootView = new ReactRootView(mReactContext) { - @Override - public void getWindowVisibleDisplayFrame(Rect outRect) { - outRect.bottom += 100; - } - }; + ReactRootView rootView = + new ReactRootView(mReactContext) { + @Override + public void getWindowVisibleDisplayFrame(Rect outRect) { + outRect.bottom += 100; + } + }; rootView.setId(rootViewId); rootView.setRootViewTag(rootViewId); rootView.startReactApplication(instanceManager, ""); rootView.simulateAttachForTesting(); - rootView.getCustomGlobalLayoutListener().checkForKeyboardEvents(); - verify(instanceManager, Mockito.times(2)).getCurrentReactContext(); + rootView.simulateCheckForKeyboardForTesting(); + verify(instanceManager, Mockito.times(1)).getCurrentReactContext(); } } From 1f97bdbbc0863ea575884e1f0428f6361ed3441e Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Mon, 15 Feb 2021 11:47:03 +0100 Subject: [PATCH 09/11] setting expectation on RCTDeviceEventEmitter.emit() for keyboardDidShow --- .../test/java/com/facebook/react/RootViewTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index 9c902bc5cd7310..1d8808ab5039f6 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -26,6 +26,7 @@ import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.SystemClock; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.DisplayMetricsHolder; @@ -214,7 +215,7 @@ public void testRemountApplication() { } @Test - public void testCheckForKeyboardEvents() { + public void testCheckForKeyboardDidShow() { ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); UIManagerModule uiManager = mock(UIManagerModule.class); @@ -240,6 +241,15 @@ public void getWindowVisibleDisplayFrame(Rect outRect) { rootView.startReactApplication(instanceManager, ""); rootView.simulateAttachForTesting(); rootView.simulateCheckForKeyboardForTesting(); - verify(instanceManager, Mockito.times(1)).getCurrentReactContext(); + WritableMap params = Arguments.createMap(); + WritableMap endCoordinates = Arguments.createMap(); + params.putDouble("duration", 0.0); + endCoordinates.putDouble("width", 0.0); + endCoordinates.putDouble("screenX", 0.0); + endCoordinates.putDouble("height", 370.0); + endCoordinates.putDouble("screenY", 100.0); + params.putMap("endCoordinates", endCoordinates); + params.putString("easing", "keyboard"); + verify(eventEmitterModuleMock, Mockito.times(1)).emit("keyboardDidShow", params); } } From 5e9c5d69c902d8bb26b55753889b97ca120f89dd Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Mon, 15 Feb 2021 14:32:31 +0100 Subject: [PATCH 10/11] updating expected parameters in keyboardDidShow test --- .../java/com/facebook/react/RootViewTest.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index 1d8808ab5039f6..e0090fc6c964a3 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -28,7 +28,7 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.SystemClock; -import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.Event; @@ -215,15 +215,15 @@ public void testRemountApplication() { } @Test - public void testCheckForKeyboardDidShow() { + public void testCheckForKeyboardEvents() { ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); + UIManagerModule uiManager = mock(UIManagerModule.class); EventDispatcher eventDispatcher = mock(EventDispatcher.class); - DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitterModuleMock = - mock(DeviceEventManagerModule.RCTDeviceEventEmitter.class); - when(mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)) - .thenReturn(eventEmitterModuleMock); + RCTDeviceEventEmitter eventEmitterModuleMock = mock(RCTDeviceEventEmitter.class); + + when(mReactContext.getJSModule(RCTDeviceEventEmitter.class)).thenReturn(eventEmitterModuleMock); when(mCatalystInstanceMock.getNativeModule(UIManagerModule.class)).thenReturn(uiManager); when(uiManager.getEventDispatcher()).thenReturn(eventDispatcher); @@ -233,23 +233,31 @@ public void testCheckForKeyboardDidShow() { new ReactRootView(mReactContext) { @Override public void getWindowVisibleDisplayFrame(Rect outRect) { - outRect.bottom += 100; + if (outRect.bottom == 0) { + outRect.bottom += 100; + outRect.right += 370; + } else { + outRect.bottom += 370; + } } }; + rootView.setId(rootViewId); rootView.setRootViewTag(rootViewId); rootView.startReactApplication(instanceManager, ""); rootView.simulateAttachForTesting(); rootView.simulateCheckForKeyboardForTesting(); + WritableMap params = Arguments.createMap(); WritableMap endCoordinates = Arguments.createMap(); params.putDouble("duration", 0.0); - endCoordinates.putDouble("width", 0.0); + endCoordinates.putDouble("width", 370.0); endCoordinates.putDouble("screenX", 0.0); endCoordinates.putDouble("height", 370.0); endCoordinates.putDouble("screenY", 100.0); params.putMap("endCoordinates", endCoordinates); params.putString("easing", "keyboard"); + verify(eventEmitterModuleMock, Mockito.times(1)).emit("keyboardDidShow", params); } } From 8b9681552cd2ff0d8f6f504572976002056c97a2 Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Mon, 15 Feb 2021 14:58:00 +0100 Subject: [PATCH 11/11] refactoring test keyboardDidShow --- .../java/com/facebook/react/RootViewTest.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index e0090fc6c964a3..6389c29d7179a9 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -217,17 +217,10 @@ public void testRemountApplication() { @Test public void testCheckForKeyboardEvents() { ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); - when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); - - UIManagerModule uiManager = mock(UIManagerModule.class); - EventDispatcher eventDispatcher = mock(EventDispatcher.class); RCTDeviceEventEmitter eventEmitterModuleMock = mock(RCTDeviceEventEmitter.class); + when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); when(mReactContext.getJSModule(RCTDeviceEventEmitter.class)).thenReturn(eventEmitterModuleMock); - when(mCatalystInstanceMock.getNativeModule(UIManagerModule.class)).thenReturn(uiManager); - when(uiManager.getEventDispatcher()).thenReturn(eventDispatcher); - - int rootViewId = 7; ReactRootView rootView = new ReactRootView(mReactContext) { @@ -242,19 +235,18 @@ public void getWindowVisibleDisplayFrame(Rect outRect) { } }; - rootView.setId(rootViewId); - rootView.setRootViewTag(rootViewId); rootView.startReactApplication(instanceManager, ""); - rootView.simulateAttachForTesting(); rootView.simulateCheckForKeyboardForTesting(); WritableMap params = Arguments.createMap(); WritableMap endCoordinates = Arguments.createMap(); + double screenHeight = 470.0; + double keyboardHeight = 100.0; params.putDouble("duration", 0.0); - endCoordinates.putDouble("width", 370.0); + endCoordinates.putDouble("width", screenHeight - keyboardHeight); endCoordinates.putDouble("screenX", 0.0); - endCoordinates.putDouble("height", 370.0); - endCoordinates.putDouble("screenY", 100.0); + endCoordinates.putDouble("height", screenHeight - keyboardHeight); + endCoordinates.putDouble("screenY", keyboardHeight); params.putMap("endCoordinates", endCoordinates); params.putString("easing", "keyboard");