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);