Stop special-casing Android 11+ from large form-factor keyboardShouldPersistTaps behavior

Summary:
ScrollView has special-case logic to dismiss keyboard on tap, controlled via the `keyboardShouldPersistTaps` property. The first click does not propagate to children of the scrollview if the tap causes the keyboard to be dismissed. This behavior is motivated by a soft keyboard on phones which takes away space from the viewport.

ScrollView historically determined if a soft-keyboard was open via querying if there was a focused TextInput. This meant that clicks to a ScrollView would be eaten, even on form factors using phsyical keyboards.

A couple years ago I added https://github.com/facebook/react-native/pull/30374 to only eat clicks when keyboard events have indicated that a soft keyboard is present. I special-cased Android out of the change, because of platform issues with its reliability of keyboard events.

After D38500859 (https://github.com/facebook/react-native/commit/1e48274223ee647ac4fc2c21822b5240f3c47e4c) rolls out we can start to remove that special-casing, of devices which report "android" for Platform.OS.

Reviewed By: javache

Differential Revision: D38528887

fbshipit-source-id: a745b478b18abe4ef32cbdd8a14ca6dfdb5e738f
This commit is contained in:
Nick Gerleman
2022-08-23 05:46:58 -07:00
committed by Facebook GitHub Bot
parent fd1e82a10f
commit ef77a4218d
@@ -1545,10 +1545,9 @@ class ScrollView extends React.Component<Props, State> {
// Even if an input is focused, we may not have a keyboard to dismiss. E.g
// when using a physical keyboard. Ensure we have an event for an opened
// keyboard, except on Android where setting windowSoftInputMode to
// adjustNone leads to missing keyboard events.
// keyboard.
const softKeyboardMayBeOpen =
this._keyboardMetrics != null || Platform.OS === 'android';
this._keyboardMetrics != null || this._keyboardEventsAreUnreliable();
return hasFocusedTextInput && softKeyboardMayBeOpen;
};
@@ -1562,6 +1561,12 @@ class ScrollView extends React.Component<Props, State> {
return this._keyboardMetrics != null && this._keyboardMetrics.height === 0;
};
_keyboardEventsAreUnreliable: () => boolean = () => {
// Android versions prior to API 30 rely on observing layout changes when
// `android:windowSoftInputMode` is set to `adjustResize` or `adjustPan`.
return Platform.OS === 'android' && Platform.Version < 30;
};
/**
* Invoke this from an `onTouchEnd` event.
*