mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Return endCoordinates for keyboardDidHide keyboard event (#24947)
Summary: This pull request enhances the Keyboard API event emitter for Android upon `keyboardDidHide` by returning a `KeyboardEvent` with a meaningful `endCoordinates` property (instead of emitting a null as of current implementation). This change standardizes the `keyboardDidHide` keyboard event emission across both iOS and Android, which makes it easier for developers to use the API. In particular, the semantics of `endCoordinates` emitted during the `keyboardDidHide` event on Android will match nicely with semantics of the same event emitted on iOS: - `screenY` will be height of the screen, as that the keyboard has collapsed to the bottom of the screen - `screenX` will be 0, as the keyboard will always be flush to the sides of the screen - `height` will be 0, as the keyboard has fully collapsed - `width` will be the width of the screen, as the keyboard will always extend to the width of the screen Also, the flowtypes for `KeyboardEvent` have been further improved and are more explicit to better highlight the different object shapes (see `IOSKeyboardEvent` and `AndroidKeyboardEvent`) depending on the platform. ## Changelog [Android] [Added] - Return endCoordinates for keyboardDidHide keyboard event Pull Request resolved: https://github.com/facebook/react-native/pull/24947 Differential Revision: D15413441 Pulled By: cpojer fbshipit-source-id: aa3998542b7068e9852467038f57310355018379
This commit is contained in:
committed by
Facebook Github Bot
parent
c38f167019
commit
168a67e4b2
@@ -648,21 +648,33 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
|
||||
getRootView().getWindowVisibleDisplayFrame(mVisibleViewArea);
|
||||
final int heightDiff =
|
||||
DisplayMetricsHolder.getWindowDisplayMetrics().heightPixels - mVisibleViewArea.bottom;
|
||||
if (mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected) {
|
||||
// keyboard is now showing, or the keyboard height has changed
|
||||
|
||||
boolean isKeyboardShowingOrKeyboardHeightChanged =
|
||||
mKeyboardHeight != heightDiff && heightDiff > mMinKeyboardHeightDetected;
|
||||
if (isKeyboardShowingOrKeyboardHeightChanged) {
|
||||
mKeyboardHeight = heightDiff;
|
||||
WritableMap params = Arguments.createMap();
|
||||
WritableMap coordinates = Arguments.createMap();
|
||||
coordinates.putDouble("screenY", PixelUtil.toDIPFromPixel(mVisibleViewArea.bottom));
|
||||
coordinates.putDouble("screenX", PixelUtil.toDIPFromPixel(mVisibleViewArea.left));
|
||||
coordinates.putDouble("width", PixelUtil.toDIPFromPixel(mVisibleViewArea.width()));
|
||||
coordinates.putDouble("height", PixelUtil.toDIPFromPixel(mKeyboardHeight));
|
||||
params.putMap("endCoordinates", coordinates);
|
||||
sendEvent("keyboardDidShow", params);
|
||||
} else if (mKeyboardHeight != 0 && heightDiff <= mMinKeyboardHeightDetected) {
|
||||
// keyboard is now hidden
|
||||
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;
|
||||
sendEvent("keyboardDidHide", null);
|
||||
sendEvent("keyboardDidHide",
|
||||
createKeyboardEventPayload(
|
||||
PixelUtil.toDIPFromPixel(mVisibleViewArea.height()),
|
||||
0,
|
||||
PixelUtil.toDIPFromPixel(mVisibleViewArea.width()),
|
||||
0
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -746,5 +758,19 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
|
||||
.getNativeModule(DeviceInfoModule.class)
|
||||
.emitUpdateDimensionsEvent();
|
||||
}
|
||||
|
||||
private WritableMap createKeyboardEventPayload(double screenY, double screenX, double width, double height) {
|
||||
WritableMap keyboardEventParams = Arguments.createMap();
|
||||
WritableMap endCoordinates = Arguments.createMap();
|
||||
|
||||
endCoordinates.putDouble("height", height);
|
||||
endCoordinates.putDouble("screenX", screenX);
|
||||
endCoordinates.putDouble("width", width);
|
||||
endCoordinates.putDouble("screenY", screenY);
|
||||
|
||||
keyboardEventParams.putMap("endCoordinates", endCoordinates);
|
||||
keyboardEventParams.putString("easing", "keyboard");
|
||||
return keyboardEventParams;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user