Fix touch handling in DragLayout.
Fixes: 33104074
-Only accept drags on HistoryFrame when isOpen()
-requestDisallowInterceptTouchEvent() in CalculatorResult to prevent
DragLayout from scrolling when a CalculatorResult is the target
Change-Id: If0dfbccc2fc05a90383a03cf397e6becd4496554
diff --git a/src/com/android/calculator2/DragLayout.java b/src/com/android/calculator2/DragLayout.java
index b07d087..c96d139 100644
--- a/src/com/android/calculator2/DragLayout.java
+++ b/src/com/android/calculator2/DragLayout.java
@@ -108,11 +108,17 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- // First verify that we don't have a large deltaX (that the user is not trying to
- // horizontally scroll).
+ final int action = event.getActionMasked();
+
+ // Always handle the case of the touch gesture being complete.
+ if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+ // Release the scroll.
+ mDragHelper.cancel();
+ return false; // Do not intercept touch event, let the child handle it
+ }
+
final float x = event.getX();
final float y = event.getY();
- final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
@@ -123,31 +129,23 @@
final float deltaX = Math.abs(x - mInitialDownX);
final float deltaY = Math.abs(y - mInitialDownY);
final int slop = mDragHelper.getTouchSlop();
- if (deltaY > slop && deltaX > deltaY) {
- mDragHelper.cancel();
+ if (deltaY > slop && deltaY > deltaX) {
+ break;
+ } else {
return false;
}
}
-
boolean doDrag = true;
for (DragCallback c : mDragCallbacks) {
- doDrag &= c.allowDrag(event);
+ doDrag &= c.shouldInterceptTouchEvent(event);
}
return doDrag && mDragHelper.shouldInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- boolean doIntercept = true;
- for (DragCallback c : mDragCallbacks) {
- doIntercept &= c.shouldInterceptTouchEvent(event);
- }
- if (doIntercept || isMoving()) {
- mDragHelper.processTouchEvent(event);
- return true;
- } else {
- return super.onTouchEvent(event);
- }
+ mDragHelper.processTouchEvent(event);
+ return super.onTouchEvent(event);
}
@Override
@@ -215,9 +213,6 @@
// Animate the RecyclerView text.
void whileDragging(float yFraction);
- // Whether we should allow the drag to happen
- boolean allowDrag(MotionEvent event);
-
// Whether we should intercept the touch event
boolean shouldInterceptTouchEvent(MotionEvent event);