private String computeLongDescription() {
    StringBuilder sb = new StringBuilder();
    sb.append(ROUTE);
    sb.append(SPACE);
    sb.append(mInfo.getShortName());
    sb.append(SPACE);
    sb.append(mInfo.getHeadsign());
    sb.append(SPACE);

    if (mEta < 0) {
      // Route just arrived or departed
      long invertEta = -mEta;
      if (mIsArrival) {
        sb.append(LongDescription.ARRIVED);
      } else {
        sb.append(LongDescription.DEPARTED);
      }
      sb.append(SPACE);
      sb.append(invertEta);
      sb.append(SPACE);
      if (invertEta < 2) {
        sb.append(MINUTE_AGO);
      } else {
        sb.append(MINUTES_AGO);
      }
    } else if (mEta == 0) {
      // Route is now arriving/departing
      if (mIsArrival) {
        sb.append(IS_NOW_ARRIVING);
      } else {
        sb.append(IS_NOW_DEPARTING);
      }
    } else {
      // Route is arriving or departing in future
      if (mIsArrival) {
        sb.append(IS_ARRIVING_IN);
      } else {
        sb.append(IS_DEPARTING_IN);
      }
      sb.append(SPACE);
      sb.append(mEta);
      sb.append(SPACE);
      if (mEta < 2) {
        sb.append(MINUTE);
      } else {
        sb.append(MINUTES);
      }
    }

    // If its not real-time info, add statement about schedule
    if (!mPredicted) {
      sb.append(SPACE);
      sb.append(BASED_ON_SCHEDULE);
    }
    return sb.toString();
  }