diff --git a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js index 4f1cd85848f0..3c5251f2935b 100644 --- a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js +++ b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js @@ -208,7 +208,7 @@ class KeyboardAvoidingView extends React.Component< ]; } else { this._subscriptions = [ - Keyboard.addListener('keyboardDidHide', this._onKeyboardChange), + Keyboard.addListener('keyboardDidHide', this._onKeyboardHide), Keyboard.addListener('keyboardDidShow', this._onKeyboardChange), ]; } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 7379f69f0e9e..f6f13e8ff992 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -17,7 +17,6 @@ import android.content.Context; import android.graphics.BlendMode; import android.graphics.Canvas; -import android.graphics.Insets; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; @@ -25,18 +24,18 @@ import android.os.Bundle; import android.util.AttributeSet; import android.util.DisplayMetrics; -import android.view.DisplayCutout; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.ThreadConfined; @@ -801,11 +800,7 @@ public void runApplication() { @VisibleForTesting /* package */ void simulateCheckForKeyboardForTesting() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - getCustomGlobalLayoutListener().checkForKeyboardEvents(); - } else { - getCustomGlobalLayoutListener().checkForKeyboardEventsLegacy(); - } + getCustomGlobalLayoutListener().checkForKeyboardEvents(); } private CustomGlobalLayoutListener getCustomGlobalLayoutListener() { @@ -932,16 +927,13 @@ public boolean isViewAttachedToReactInstance() { private class CustomGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener { private final Rect mVisibleViewArea; - private final int mMinKeyboardHeightDetected; private boolean mKeyboardIsVisible = false; - private int mKeyboardHeight = 0; // Only used in checkForKeyboardEventsLegacy path private int mDeviceRotation = 0; /* package */ CustomGlobalLayoutListener() { DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(getContext().getApplicationContext()); mVisibleViewArea = new Rect(); - mMinKeyboardHeightDetected = (int) PixelUtil.toPixelFromDIP(60); } @Override @@ -950,31 +942,25 @@ public void onGlobalLayout() { return; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - checkForKeyboardEvents(); - } else { - checkForKeyboardEventsLegacy(); - } - + checkForKeyboardEvents(); checkForDeviceOrientationChanges(); checkForDeviceDimensionsChanges(); } - @RequiresApi(api = Build.VERSION_CODES.R) private void checkForKeyboardEvents() { getRootView().getWindowVisibleDisplayFrame(mVisibleViewArea); - WindowInsets rootInsets = getRootView().getRootWindowInsets(); + WindowInsetsCompat rootInsets = ViewCompat.getRootWindowInsets(getRootView()); if (rootInsets == null) { return; } - boolean keyboardIsVisible = rootInsets.isVisible(WindowInsets.Type.ime()); + boolean keyboardIsVisible = rootInsets.isVisible(WindowInsetsCompat.Type.ime()); if (keyboardIsVisible != mKeyboardIsVisible) { mKeyboardIsVisible = keyboardIsVisible; + Insets barInsets = rootInsets.getInsets(WindowInsetsCompat.Type.systemBars()); if (keyboardIsVisible) { - Insets imeInsets = rootInsets.getInsets(WindowInsets.Type.ime()); - Insets barInsets = rootInsets.getInsets(WindowInsets.Type.systemBars()); + Insets imeInsets = rootInsets.getInsets(WindowInsetsCompat.Type.ime()); int height = imeInsets.bottom - barInsets.bottom; ViewGroup.LayoutParams rootLayoutParams = getRootView().getLayoutParams(); @@ -997,7 +983,7 @@ private void checkForKeyboardEvents() { sendEvent( "keyboardDidHide", createKeyboardEventPayload( - PixelUtil.toDIPFromPixel(mVisibleViewArea.height()), + PixelUtil.toDIPFromPixel(mVisibleViewArea.bottom + barInsets.bottom), 0, PixelUtil.toDIPFromPixel(mVisibleViewArea.width()), 0)); @@ -1005,54 +991,6 @@ private void checkForKeyboardEvents() { } } - private void checkForKeyboardEventsLegacy() { - getRootView().getWindowVisibleDisplayFrame(mVisibleViewArea); - - int notchHeight = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - WindowInsets insets = getRootView().getRootWindowInsets(); - if (insets != null) { - DisplayCutout displayCutout = insets.getDisplayCutout(); - if (displayCutout != null) { - notchHeight = displayCutout.getSafeInsetTop(); - } - } - } - final int heightDiff = - DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - - mVisibleViewArea.bottom - + notchHeight; - - boolean isKeyboardShowingOrKeyboardHeightChanged = - mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected; - - if (isKeyboardShowingOrKeyboardHeightChanged) { - mKeyboardHeight = heightDiff; - mKeyboardIsVisible = true; - sendEvent( - "keyboardDidShow", - createKeyboardEventPayload( - PixelUtil.toDIPFromPixel(mVisibleViewArea.bottom), - PixelUtil.toDIPFromPixel(mVisibleViewArea.left), - PixelUtil.toDIPFromPixel(mVisibleViewArea.width()), - PixelUtil.toDIPFromPixel(mKeyboardHeight))); - return; - } - - boolean isKeyboardHidden = mKeyboardHeight != 0 && heightDiff <= mMinKeyboardHeightDetected; - if (isKeyboardHidden) { - mKeyboardHeight = 0; - mKeyboardIsVisible = false; - sendEvent( - "keyboardDidHide", - createKeyboardEventPayload( - PixelUtil.toDIPFromPixel(mVisibleViewArea.height()), - 0, - PixelUtil.toDIPFromPixel(mVisibleViewArea.width()), - 0)); - } - } - private void checkForDeviceOrientationChanges() { final int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))