Skip to content

Commit

Permalink
Stop special-casing Android 11+ from large form-factor `keyboardShoul…
Browse files Browse the repository at this point in the history
…dPersistTaps` 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 #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 (1e48274) 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
  • Loading branch information
NickGerleman authored and facebook-github-bot committed Aug 23, 2022
1 parent fd1e82a commit ef77a42
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions Libraries/Components/ScrollView/ScrollView.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand All @@ -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.
*
Expand Down

0 comments on commit ef77a42

Please sign in to comment.