public ActivityTaskProgressModel(ActivityTask activity) {
    d_task = activity;
    Set<Task> states = activity.getModel().getStates();

    if (!d_task.isFinished()) {
      for (Task state : states) {
        d_progress.put(state, 0.0);
        state.addTaskListener(d_listener);
      }
    }
    d_task.addTaskListener(
        new TaskListener() {
          public void taskEvent(TaskEvent e) {
            synchronized (d_lock) {
              if (e instanceof PhaseEvent) {
                Task phase = ((PhaseEvent) e).getPhase();
                if (e.getType().equals(TaskEvent.EventType.PHASE_STARTED)) {
                  d_runningTasks.add(phase);
                } else if (e.getType().equals(TaskEvent.EventType.PHASE_FINISHED)) {
                  d_runningTasks.remove(phase);
                }
                setDeterminate(calcDeterminate());
                setProgress(calcProgress());
              }
            }
          }
        });
    d_iterables.addAll(findIterables(states));
  }
 protected List<String> getPhaseStrings() {
   List<String> phaseStrings = new ArrayList<String>();
   synchronized (d_lock) {
     for (Task p : d_runningTasks) {
       phaseStrings.add(
           p.toString()
               + ((p instanceof IterativeTask) ? ": " + formatProgress(d_progress.get(p)) : ""));
     }
   }
   return phaseStrings;
 }