docs: @Override
      public void check(final List<TransportCandidate> localCandidates) {
          // TODO candidate is being checked trigger
          // candidatesChecking.add(cand);
  
          final ICECandidate checkingCandidate = this;
  
          Thread checkThread = new Thread(new Runnable() {
              @Override
              public void run() {
  
                  final TestResult result = new TestResult();
  
                  // Media Proxy don't have Echo features.
                  // If its a relayed candidate we assumed that is NOT Valid while other candidates still being checked.
                  // The negotiator MUST add then in the correct situations
                  if (getType().equals(Type.relay)) {
                      triggerCandidateChecked(false);
                      return;
                  }
  
                  ResultListener resultListener = new ResultListener() {
                      @Override
                      public void testFinished(TestResult testResult, TransportCandidate candidate) {
                          if (testResult.isReachable() && checkingCandidate.equals(candidate)) {
                              result.setResult(true);
                              LOGGER.fine("Candidate reachable: " + candidate.getIp() + ":" + candidate.getPort() + " from " + getIp() + ":" + getPort());
                          }
                      }
                  };
  
                  for (TransportCandidate candidate : localCandidates) {
                      CandidateEcho echo = candidate.getCandidateEcho();
                      if (echo != null) {
                          if (candidate instanceof ICECandidate) {
                              ICECandidate iceCandidate = (ICECandidate) candidate;
                              if (iceCandidate.getType().equals(getType())) {
                                  try {
                                      echo.addResultListener(resultListener);
                                      InetAddress address = InetAddress.getByName(getIp());
                                      echo.testASync(checkingCandidate, getPassword());
                                  }
                                  catch (UnknownHostException e) {
                                      LOGGER.log(Level.WARNING, "exception", e);
                                  }
                              }
                          }
                      }
                  }
  
                  for (int i = 0; i < 10 && !result.isReachable(); i++)
                      try {
                          LOGGER.severe("ICE Candidate retry #" + i);
                          Thread.sleep(400);
                      }
                      catch (InterruptedException e) {
                          LOGGER.log(Level.WARNING, "exception", e);
                      }
  
                  for (TransportCandidate candidate : localCandidates) {
                      CandidateEcho echo = candidate.getCandidateEcho();
                      if (echo != null) {
                          echo.removeResultListener(resultListener);
                      }
                  }
  
                  triggerCandidateChecked(result.isReachable());
  
                  // TODO candidate is being checked trigger
                  // candidatesChecking.remove(cand);
              }
          }, "Transport candidate check");
  
          checkThread.setName("Transport candidate test");
          checkThread.start();
      }