Program: 88911
Project: 88911
Buggy source:
@Override public boolean onTouchEvent(MotionEvent ev){
  final int action=ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
{
      if (getChildCount() == 0) {
        return false;
      }
      mLastMotionX=(int)ev.getX();
      mLastMotionY=(int)ev.getY();
      mActivePointerId=ev.getPointerId(0);
      break;
    }
case MotionEvent.ACTION_MOVE:
{
    if (!mIsBeingDragged && mIgnoreTouchEvent) {
      return false;
    }
    final int activePointerIndex=ev.findPointerIndex(mActivePointerId);
    if (activePointerIndex == -1) {
      Log.e(TAG,"String_Node_Str" + mActivePointerId + "String_Node_Str");
      break;
    }
    boolean isBeingDraggedX=false;
    boolean isBeingDraggedY=false;
    final int x=(int)ev.getX(activePointerIndex);
    int deltaX=mLastMotionX - x;
    if (!mIsBeingDragged && Math.abs(deltaX) > mTouchSlop) {
      isBeingDraggedX=true;
      if (deltaX > 0) {
        deltaX-=mTouchSlop;
      }
 else {
        deltaX+=mTouchSlop;
      }
    }
    final int y=(int)ev.getY(activePointerIndex);
    int deltaY=mLastMotionY - y;
    if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {
      isBeingDraggedY=true;
      if (deltaY > 0) {
        deltaY-=mTouchSlop;
      }
 else {
        deltaY+=mTouchSlop;
      }
    }
    if (isBeingDraggedX || isBeingDraggedY) {
      final ViewParent parent=getParent();
      if (parent != null) {
        parent.requestDisallowInterceptTouchEvent(true);
      }
      mIsBeingDragged=true;
    }
    if (mIsBeingDragged) {
      onMove(-deltaX,-deltaY);
      mLastMotionX=x;
      mLastMotionY=y;
    }
    break;
  }
case MotionEvent.ACTION_UP:
{
  if (mIsBeingDragged) {
    onMoveFinished();
    mActivePointerId=INVALID_POINTER;
    mIsBeingDragged=false;
  }
 else {
    onUnhandledClick(ev);
  }
  break;
}
case MotionEvent.ACTION_CANCEL:
if (mIsBeingDragged && getChildCount() > 0) {
onMoveFinished();
mActivePointerId=INVALID_POINTER;
mIsBeingDragged=false;
}
 else if (!mIsBeingDragged) {
onUnhandledClick(ev);
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
{
final int index=ev.getActionIndex();
mLastMotionX=(int)ev.getX(index);
mLastMotionY=(int)ev.getY(index);
mActivePointerId=ev.getPointerId(index);
break;
}
case MotionEvent.ACTION_POINTER_UP:
onSecondaryPointerUp(ev);
mLastMotionX=(int)ev.getX(ev.findPointerIndex(mActivePointerId));
mLastMotionY=(int)ev.getY(ev.findPointerIndex(mActivePointerId));
break;
}
return true;
}

Fixed version (ground truth):
@Override public boolean onTouchEvent(MotionEvent ev){
  if (!mIsBeingDragged && mIgnoreTouchEvent) {
    return false;
  }
  final int action=ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
{
      if (getChildCount() == 0) {
        return false;
      }
      mLastMotionX=(int)ev.getX();
      mLastMotionY=(int)ev.getY();
      mActivePointerId=ev.getPointerId(0);
      break;
    }
case MotionEvent.ACTION_MOVE:
{
    final int activePointerIndex=ev.findPointerIndex(mActivePointerId);
    if (activePointerIndex == -1) {
      Log.e(TAG,"String_Node_Str" + mActivePointerId + "String_Node_Str");
      break;
    }
    boolean isBeingDraggedX=false;
    boolean isBeingDraggedY=false;
    final int x=(int)ev.getX(activePointerIndex);
    int deltaX=mLastMotionX - x;
    if (!mIsBeingDragged && Math.abs(deltaX) > mTouchSlop) {
      isBeingDraggedX=true;
      if (deltaX > 0) {
        deltaX-=mTouchSlop;
      }
 else {
        deltaX+=mTouchSlop;
      }
    }
    final int y=(int)ev.getY(activePointerIndex);
    int deltaY=mLastMotionY - y;
    if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {
      isBeingDraggedY=true;
      if (deltaY > 0) {
        deltaY-=mTouchSlop;
      }
 else {
        deltaY+=mTouchSlop;
      }
    }
    if (isBeingDraggedX || isBeingDraggedY) {
      final ViewParent parent=getParent();
      if (parent != null) {
        parent.requestDisallowInterceptTouchEvent(true);
      }
      mIsBeingDragged=true;
    }
    if (mIsBeingDragged) {
      onMove(-deltaX,-deltaY);
      mLastMotionX=x;
      mLastMotionY=y;
    }
    break;
  }
case MotionEvent.ACTION_UP:
{
  if (mIsBeingDragged) {
    onMoveFinished();
    mActivePointerId=INVALID_POINTER;
    mIsBeingDragged=false;
  }
 else {
    onUnhandledClick(ev);
  }
  break;
}
case MotionEvent.ACTION_CANCEL:
if (mIsBeingDragged && getChildCount() > 0) {
onMoveFinished();
mActivePointerId=INVALID_POINTER;
mIsBeingDragged=false;
}
 else if (!mIsBeingDragged) {
onUnhandledClick(ev);
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
{
final int index=ev.getActionIndex();
mLastMotionX=(int)ev.getX(index);
mLastMotionY=(int)ev.getY(index);
mActivePointerId=ev.getPointerId(index);
break;
}
case MotionEvent.ACTION_POINTER_UP:
onSecondaryPointerUp(ev);
mLastMotionX=(int)ev.getX(ev.findPointerIndex(mActivePointerId));
mLastMotionY=(int)ev.getY(ev.findPointerIndex(mActivePointerId));
break;
}
return true;
}