Program: 193845
Project: 193845
Buggy source:
/** 
 * Worker method for rearranging history stack. Implements the function of moving all activities for a specific task (gathering them if disjoint) into a single group at the bottom of the stack. If a watcher is installed, the action is preflighted and the watcher has an opportunity to premeptively cancel the move.
 * @param taskId The taskId to collect and move to the bottom.
 * @return Returns true if the move completed, false if not.
 */
final boolean moveTaskToBackLocked(int taskId){
  final TaskRecord tr=taskForIdLocked(taskId);
  if (tr == null) {
    Slog.i(TAG,"String_Node_Str" + taskId);
    return false;
  }
  Slog.i(TAG,"String_Node_Str" + tr);
  mStackSupervisor.removeLockedTaskLocked(tr);
  if (mStackSupervisor.isFrontStack(this) && mService.mController != null) {
    ActivityRecord next=topRunningActivityLocked(null,taskId);
    if (next == null) {
      next=topRunningActivityLocked(null,0);
    }
    if (next != null) {
      boolean moveOK=true;
      try {
        moveOK=mService.mController.activityResuming(next.packageName);
      }
 catch (      RemoteException e) {
        mService.mController=null;
        Watchdog.getInstance().setActivityController(null);
      }
      if (!moveOK) {
        return false;
      }
    }
  }
  if (DEBUG_TRANSITION)   Slog.v(TAG_TRANSITION,"String_Node_Str" + taskId);
  boolean prevIsHome=false;
  if (tr.isOverHomeStack()) {
    final TaskRecord nextTask=getNextTask(tr);
    if (nextTask != null) {
      nextTask.setTaskToReturnTo(tr.getTaskToReturnTo());
    }
 else {
      prevIsHome=true;
    }
  }
  mTaskHistory.remove(tr);
  mTaskHistory.add(0,tr);
  updateTaskMovement(tr,false);
  int numTasks=mTaskHistory.size();
  for (int taskNdx=numTasks - 1; taskNdx >= 1; --taskNdx) {
    final TaskRecord task=mTaskHistory.get(taskNdx);
    if (task.isOverHomeStack()) {
      break;
    }
    if (taskNdx == 1) {
      task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
    }
  }
  mWindowManager.prepareAppTransition(AppTransition.TRANSIT_TASK_TO_BACK,false);
  mWindowManager.moveTaskToBottom(taskId);
  if (VALIDATE_TOKENS) {
    validateAppTokensLocked();
  }
  final TaskRecord task=mResumedActivity != null ? mResumedActivity.task : null;
  if (prevIsHome || task == tr && tr.isOverHomeStack() || numTasks <= 1 && isOnHomeDisplay()) {
    if (!mService.mBooting && !mService.mBooted) {
      return false;
    }
    final int taskToReturnTo=tr.getTaskToReturnTo();
    tr.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
    return mStackSupervisor.resumeHomeStackTask(taskToReturnTo,null,"String_Node_Str");
  }
  mStackSupervisor.resumeTopActivitiesLocked();
  return true;
}

Fixed version (ground truth):
/** 
 * Worker method for rearranging history stack. Implements the function of moving all activities for a specific task (gathering them if disjoint) into a single group at the bottom of the stack. If a watcher is installed, the action is preflighted and the watcher has an opportunity to premeptively cancel the move.
 * @param taskId The taskId to collect and move to the bottom.
 * @return Returns true if the move completed, false if not.
 */
final boolean moveTaskToBackLocked(int taskId){
  final TaskRecord tr=taskForIdLocked(taskId);
  if (tr == null) {
    Slog.i(TAG,"String_Node_Str" + taskId);
    return false;
  }
  Slog.i(TAG,"String_Node_Str" + tr);
  mStackSupervisor.removeLockedTaskLocked(tr);
  if (mStackSupervisor.isFrontStack(this) && mService.mController != null) {
    ActivityRecord next=topRunningActivityLocked(null,taskId);
    if (next == null) {
      next=topRunningActivityLocked(null,0);
    }
    if (next != null) {
      boolean moveOK=true;
      try {
        moveOK=mService.mController.activityResuming(next.packageName);
      }
 catch (      RemoteException e) {
        mService.mController=null;
        Watchdog.getInstance().setActivityController(null);
      }
      if (!moveOK) {
        return false;
      }
    }
  }
  if (DEBUG_TRANSITION)   Slog.v(TAG_TRANSITION,"String_Node_Str" + taskId);
  boolean prevIsHome=false;
  final boolean canGoHome=!tr.isHomeTask() && tr.isOverHomeStack();
  if (canGoHome) {
    final TaskRecord nextTask=getNextTask(tr);
    if (nextTask != null) {
      nextTask.setTaskToReturnTo(tr.getTaskToReturnTo());
    }
 else {
      prevIsHome=true;
    }
  }
  mTaskHistory.remove(tr);
  mTaskHistory.add(0,tr);
  updateTaskMovement(tr,false);
  int numTasks=mTaskHistory.size();
  for (int taskNdx=numTasks - 1; taskNdx >= 1; --taskNdx) {
    final TaskRecord task=mTaskHistory.get(taskNdx);
    if (task.isOverHomeStack()) {
      break;
    }
    if (taskNdx == 1) {
      task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
    }
  }
  mWindowManager.prepareAppTransition(AppTransition.TRANSIT_TASK_TO_BACK,false);
  mWindowManager.moveTaskToBottom(taskId);
  if (VALIDATE_TOKENS) {
    validateAppTokensLocked();
  }
  final TaskRecord task=mResumedActivity != null ? mResumedActivity.task : null;
  if (prevIsHome || (task == tr && canGoHome) || (numTasks <= 1 && isOnHomeDisplay())) {
    if (!mService.mBooting && !mService.mBooted) {
      return false;
    }
    final int taskToReturnTo=tr.getTaskToReturnTo();
    tr.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
    return mStackSupervisor.resumeHomeStackTask(taskToReturnTo,null,"String_Node_Str");
  }
  mStackSupervisor.resumeTopActivitiesLocked();
  return true;
}