diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java index 75e500c4199..765fe784e26 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java @@ -4,6 +4,7 @@ import android.content.res.Configuration; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import com.reactnativenavigation.options.OverlayAttachOptions; import com.reactnativenavigation.viewcontrollers.viewcontroller.ScrollEventListener; @@ -21,10 +22,13 @@ import androidx.annotation.Nullable; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; +import androidx.core.view.ViewKt; import androidx.core.view.WindowInsetsCompat; import static com.reactnativenavigation.utils.ObjectUtils.perform; +import kotlin.Unit; + public class ComponentViewController extends ChildController { private final String componentName; private final ComponentPresenter presenter; @@ -156,8 +160,10 @@ protected WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat i ViewController viewController = findController(view); if (viewController == null || viewController.getView() == null || ignoreInsets) return insets; final Options currentOptions = resolveCurrentOptions(presenter.defaultOptions); - - final int keyboardBottomInset = currentOptions.layout.adjustResize.get(true) ? insets.getInsets(WindowInsetsCompat.Type.ime()).bottom : 0; + int mode = getActivity().getWindow().getAttributes().softInputMode; + boolean adjustNothing = (mode & WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING) ==WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING ; + final int keyboardBottomInset = currentOptions.layout.adjustResize.get(true) &&!adjustNothing ? + insets.getInsets(WindowInsetsCompat.Type.ime()).bottom : 0; final Insets systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()); final int visibleNavBar = currentOptions.navigationBar.isVisible.isTrueOrUndefined() ? 1 : 0; final int controllerBottomInset = currentOptions.bottomTabsOptions.isHiddenOrDrawBehind() ? 0 : getBottomInset(); @@ -167,8 +173,10 @@ protected WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat i systemBarsInsets.right, Math.max(0, Math.max(visibleNavBar * systemBarsInsets.bottom, keyboardBottomInset) - controllerBottomInset)) ).build(); - - ViewCompat.onApplyWindowInsets(viewController.getView(), finalInsets); + ViewKt.doOnLayout(viewController.getView(), (v) -> { + ViewCompat.onApplyWindowInsets(viewController.getView(), finalInsets); + return Unit.INSTANCE; + }); return insets; } diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java index 540c304fe90..250e0dd4747 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java @@ -58,7 +58,7 @@ public class SideMenuControllerTest extends BaseTest { @Override public void beforeEach() { super.beforeEach(); - activity = createActivity(); + activity = newActivity(); childRegistry = new ChildControllersRegistry(); presenter = spy(new SideMenuPresenter()); @@ -430,14 +430,6 @@ private void closeRightMenu() { uut.onDrawerSlide(right.getView(), 0); } - private Activity createActivity() { - Activity activity = spy(newActivity()); - Window window = mock(Window.class); - when(window.getDecorView()).thenReturn(mock(View.class)); - when(activity.getWindow()).thenReturn(window); - return activity; - } - private void setLeftRight(ViewController left, ViewController right) { uut.setLeftController(left); uut.setRightController(right);