// Fallback method if news server doesnt' support listNewNews -> this is much slower
 // but at least we get the messages
 private String[] applyNextCommand(NNTPClient client, String group) throws IOException {
   ArrayList<String> articleList = new ArrayList<>();
   client.selectNewsgroup(group);
   ArticleInfo pointer = new ArticleInfo();
   int i = 0;
   while (client.selectNextArticle(pointer) && i < 100) { // TODO while date > sync start date
     // client.selectArticle(pointer.articleNumber, pointer);
     Log.d(
         TAG,
         "pointer.articleNumber = "
             + pointer.articleNumber
             + ", pointer.articleId = "
             + pointer.articleId);
     articleList.add(pointer.articleId);
     i++;
   }
   String[] articleArray = new String[articleList.size()];
   return articleList.toArray(articleArray);
 }
  public static void main(String[] args) throws SocketException, IOException {

    if (args.length != 2 && args.length != 4) {
      System.out.println("Usage: MessageThreading <hostname> <groupname> [<user> <password>]");
      return;
    }

    String hostname = args[0];
    String newsgroup = args[1];

    NNTPClient client = new NNTPClient();
    client.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
    client.connect(hostname);

    if (args.length == 4) { // Optional auth
      String user = args[2];
      String password = args[3];
      if (!client.authenticate(user, password)) {
        System.out.println("Authentication failed for user " + user + "!");
        System.exit(1);
      }
    }

    String fmt[] = client.listOverviewFmt();
    if (fmt != null) {
      System.out.println("LIST OVERVIEW.FMT:");
      for (String s : fmt) {
        System.out.println(s);
      }
    } else {
      System.out.println("Failed to get OVERVIEW.FMT");
    }
    NewsgroupInfo group = new NewsgroupInfo();
    client.selectNewsgroup(newsgroup, group);

    long lowArticleNumber = group.getFirstArticleLong();
    long highArticleNumber = lowArticleNumber + 5000;

    System.out.println(
        "Retrieving articles between [" + lowArticleNumber + "] and [" + highArticleNumber + "]");
    Iterable<Article> articles = client.iterateArticleInfo(lowArticleNumber, highArticleNumber);

    System.out.println("Building message thread tree...");
    Threader threader = new Threader();
    Article root = (Article) threader.thread(articles);

    Article.printThread(root, 0);
  }
  private void getNewNewsForNewsgroup(
      long serverId, NNTPClient client, long groupId, String groupName, int syncTime)
      throws IOException, LoginException {
    currentNewsgroupId = groupId;

    // Create a GregorianCalendar instance with date of last sync.
    NewsgroupQueries newsgroupQueries = new NewsgroupQueries(context);
    long lastSyncDate = newsgroupQueries.getLastSyncDate(groupId);
    GregorianCalendar calendar = new GregorianCalendar();
    if (lastSyncDate != -1) {
      calendar.setTimeInMillis(
          lastSyncDate); // TODO compare mails that arrived in this second with database entries to
                         // not lose messages.
      Log.d(TAG, "Last synced: " + NNTPDateFormatter.getPrettyDateString(lastSyncDate, context));
    } else {
      // Set sync interval; TODO get sync interval from settings
      calendar.setTimeInMillis(
          System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(syncTime, TimeUnit.DAYS));
      Log.d(
          TAG,
          "Complete sync: "
              + NNTPDateFormatter.getPrettyDateString(calendar.getTimeInMillis(), context));
    }

    // get list of message id's from server
    NewGroupsOrNewsQuery query = new NewGroupsOrNewsQuery(calendar, false);
    query.addNewsgroup(groupName);
    String[] messages = client.listNewNews(query);
    if (messages == null) {
      messages = applyNextCommand(client, groupName);
    }

    // Get messages and add them to database.
    for (String s : messages) {
      fetchMessage(serverId, groupId, s);
    }

    // Store date of last message that we fetched in newsgroup table and reset values.
    if (currentNewsgroupId != -1 && currentMessageDate != -1) {
      newsgroupQueries.setLastSyncDate(groupId, currentMessageDate);
    }

    currentNewsgroupId = -1;
    currentMessageDate = -1;
  }