Fix edge swipe logic.

1) Only start delegating upon first move event, if all three fingers went down on the bottom edge.
2) The previous logic only required one finger to be in the edge boundary. It now requires all fingers to be in the edge boundary.
Bug: 162521649
Test: manual

Change-Id: I829c463c63b384642d129ff3b5ccdb0db816ddcd
This commit is contained in:
Ameer Armaly
2020-08-11 17:27:02 -07:00
parent ba9004eb81
commit 91fa64652e

View File

@@ -561,24 +561,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
// stream consistent.
sendHoverExitAndTouchExplorationGestureEndIfNeeded(policyFlags);
}
if (mGestureDetector.isMultiFingerGesturesEnabled()
&& mGestureDetector.isTwoFingerPassthroughEnabled()) {
if (event.getPointerCount() == 3) {
boolean isOnBottomEdge = false;
// If three fingers go down on the bottom edge of the screen, delegate immediately.
final long screenHeight = mContext.getResources().getDisplayMetrics().heightPixels;
for (int i = 0; i < TouchState.MAX_POINTER_COUNT; ++i) {
if (mReceivedPointerTracker.getReceivedPointerDownY(i)
> (screenHeight - mEdgeSwipeHeightPixels)) {
isOnBottomEdge = true;
}
}
if (isOnBottomEdge) {
mState.startDelegating();
mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags);
}
}
}
}
/**
@@ -644,12 +626,34 @@ public class TouchExplorer extends BaseEventStreamTransformation
break;
default:
if (mGestureDetector.isMultiFingerGesturesEnabled()) {
return;
if (mGestureDetector.isTwoFingerPassthroughEnabled()) {
if (event.getPointerCount() == 3) {
boolean isOnBottomEdge = true;
// If three fingers went down on the bottom edge of the screen, delegate
// immediately.
final long screenHeight =
mContext.getResources().getDisplayMetrics().heightPixels;
for (int i = 0; i < TouchState.MAX_POINTER_COUNT; ++i) {
if (mReceivedPointerTracker.getReceivedPointerDownY(i)
< (screenHeight - mEdgeSwipeHeightPixels)) {
isOnBottomEdge = false;
}
}
if (isOnBottomEdge) {
if (DEBUG) {
Slog.d(LOG_TAG, "Three-finger edge swipe detected.");
}
mState.startDelegating();
mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags);
}
}
}
} else {
// More than two pointers are delegated to the view hierarchy.
mState.startDelegating();
event = MotionEvent.obtainNoHistory(event);
mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags);
}
// More than two pointers are delegated to the view hierarchy.
mState.startDelegating();
event = MotionEvent.obtainNoHistory(event);
mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags);
break;
}
}