Program: 104958
Project: 104958
Buggy source:
@Override public boolean OnUpdate(float dt){
  if (mTargetInfo == null) {
    float tf=mTime / mPeriod;
    float f=(mLinear ? mLinearInterpolator.getInterpolation(tf) : mOvershootInterpolator.getInterpolation(tf));
    mTime+=dt;
    float x=mInitialX + (mTargetX - mInitialX) * f;
    float y=mInitialY + (mTargetY - mInitialY) * f;
    Canvas.TargetInfo ti=mBubble.getTargetInfo(mCanvas,(int)x,(int)y);
switch (ti.mAction) {
case Destroy:
case ConsumeRight:
case ConsumeLeft:
      ti.mTargetX=(int)(0.5f + ti.mTargetX - Config.mBubbleWidth * 0.5f);
    ti.mTargetY=(int)(0.5f + ti.mTargetY - Config.mBubbleHeight * 0.5f);
  mTargetInfo=ti;
mBubble.setTargetPos(ti.mTargetX,ti.mTargetY,0.2f,true);
break;
default :
{
Bubble b=mBubble;
if (mTime >= mPeriod) {
x=mTargetX;
y=mTargetY;
if (mContentViewActive) {
  MainController.STATE_AnimateToContentView.init(b);
  MainController.switchState(MainController.STATE_AnimateToContentView);
}
 else if (x == Config.mBubbleSnapLeftX || x == Config.mBubbleSnapRightX) {
  Config.BUBBLE_HOME_X=mBubble.getXPos();
  Config.BUBBLE_HOME_Y=mBubble.getYPos();
  MainController.switchState(MainController.STATE_BubbleView);
}
 else {
  MainController.STATE_SnapToEdge.init(b);
  MainController.switchState(MainController.STATE_SnapToEdge);
}
}
b.setExactPos((int)x,(int)y);
}
}
}
 else {
if (mBubble.getXPos() == mTargetInfo.mTargetX && mBubble.getYPos() == mTargetInfo.mTargetY) {
if (MainController.destroyBubble(mBubble,mTargetInfo.mAction)) {
if (mContentViewActive) MainController.switchState(MainController.STATE_AnimateToContentView);
 else MainController.switchState(MainController.STATE_AnimateToBubbleView);
}
 else {
if (mContentViewActive) MainController.switchState(MainController.STATE_ContentView);
 else MainController.switchState(MainController.STATE_BubbleView);
}
}
}
return true;
}

Fixed version (ground truth):
@Override public boolean OnUpdate(float dt){
  if (mTargetInfo == null) {
    float tf=mTime / mPeriod;
    float f=(mLinear ? mLinearInterpolator.getInterpolation(tf) : mOvershootInterpolator.getInterpolation(tf));
    mTime+=dt;
    float x=mInitialX + (mTargetX - mInitialX) * f;
    float y=mInitialY + (mTargetY - mInitialY) * f;
    Canvas.TargetInfo ti=mBubble.getTargetInfo(mCanvas,(int)x,(int)y);
switch (ti.mAction) {
case Destroy:
case ConsumeRight:
case ConsumeLeft:
      ti.mTargetX=(int)(0.5f + ti.mTargetX - Config.mBubbleWidth * 0.5f);
    ti.mTargetY=(int)(0.5f + ti.mTargetY - Config.mBubbleHeight * 0.5f);
  mTargetInfo=ti;
mBubble.setTargetPos(ti.mTargetX,ti.mTargetY,0.2f,true);
break;
default :
{
Bubble b=mBubble;
if (mTime >= mPeriod) {
x=mTargetX;
y=mTargetY;
if (mContentViewActive) {
  MainController.STATE_AnimateToContentView.init(b);
  MainController.switchState(MainController.STATE_AnimateToContentView);
}
 else if (x == Config.mBubbleSnapLeftX || x == Config.mBubbleSnapRightX) {
  Config.BUBBLE_HOME_X=mBubble.getXPos();
  Config.BUBBLE_HOME_Y=mBubble.getYPos();
  MainController.switchState(MainController.STATE_BubbleView);
}
 else {
  MainController.STATE_SnapToEdge.init(b);
  MainController.switchState(MainController.STATE_SnapToEdge);
}
}
b.setExactPos((int)x,(int)y);
}
}
}
 else {
if (mBubble.getXPos() == mTargetInfo.mTargetX && mBubble.getYPos() == mTargetInfo.mTargetY) {
if (MainController.destroyBubble(mBubble,mTargetInfo.mAction)) {
if (mContentViewActive) {
MainController.STATE_AnimateToContentView.init(MainController.getBubble(MainController.getBubbleCount() - 1));
MainController.switchState(MainController.STATE_AnimateToContentView);
}
 else {
MainController.switchState(MainController.STATE_AnimateToBubbleView);
}
}
 else {
if (mContentViewActive) MainController.switchState(MainController.STATE_ContentView);
 else MainController.switchState(MainController.STATE_BubbleView);
}
}
}
return true;
}