docs: @Nullable
    public String[] calculateRemainingWaypointNames(RouteProgress routeProgress) {
      RouteOptions routeOptions = routeProgress.directionsRoute().routeOptions();
      if (routeOptions == null || TextUtils.isEmpty(routeOptions.waypointNames())) {
        return null;
      }
      String allWaypointNames = routeOptions.waypointNames();
      String[] names = allWaypointNames.split(SEMICOLON);
      int coordinatesSize = routeProgress.directionsRoute().routeOptions().coordinates().size();
      String[] remainingWaypointNames = Arrays.copyOfRange(names,
        coordinatesSize - routeProgress.remainingWaypoints(), coordinatesSize);
      String[] waypointNames = new String[remainingWaypointNames.length + ORIGIN_WAYPOINT_NAME_THRESHOLD];
      waypointNames[ORIGIN_WAYPOINT_NAME] = names[ORIGIN_WAYPOINT_NAME];
      System.arraycopy(remainingWaypointNames, FIRST_POSITION, waypointNames, SECOND_POSITION,
        remainingWaypointNames.length);
      return waypointNames;
    }