fix sliding input issues: take into account that keyboard height may change

This commit is contained in:
Helium314 2023-08-21 07:46:54 +02:00
parent 356e39921b
commit 2db6d99a23

View file

@ -137,6 +137,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
// true if keyboard layout has been changed.
private boolean mKeyboardLayoutHasBeenChanged;
private int keyboardChangeOccupiedHeightDifference;
// true if this pointer is no longer triggering any action because it has been canceled.
private boolean mIsTrackingForActionDisabled;
@ -356,6 +357,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
if (keyDetector == mKeyDetector && keyboard == mKeyboard) {
return;
}
if (mKeyboard != null) {
// changing keyboards may change height
// since y is measured from top of view, this change needs to be considered in some places
keyboardChangeOccupiedHeightDifference = keyboard.mOccupiedHeight - mKeyboard.mOccupiedHeight;
}
mKeyDetector = keyDetector;
mKeyboard = keyboard;
// Mark that keyboard layout has been changed.
@ -696,8 +702,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
// This onPress call may have changed keyboard layout. Those cases are detected at
// {@link #setKeyboard}. In those cases, we should update key according to the new
// keyboard layout.
// Also height difference between keyboards needs to be considered.
if (callListenerOnPressAndCheckKeyboardLayoutChange(key, 0 /* repeatCount */)) {
key = onDownKey(x, y, eventTime);
final int yOffset = keyboardChangeOccupiedHeightDifference;
keyboardChangeOccupiedHeightDifference = 0;
CoordinateUtils.set(mDownCoordinates, x, y + yOffset);
key = onDownKey(x, y + yOffset, eventTime);
}
startRepeatKey(key);