@Override
 public void onIceCandidate(final IceCandidate candidate) {
   synchronized (iceCandidateEvent) {
     Log.d(TAG, "IceCandidate #" + iceCandidates.size() + " : " + candidate.toString());
     if (loopback) {
       // Loopback local ICE candidate in a separate thread to avoid adding
       // remote ICE candidate in a local ICE candidate callback.
       signalingExecutor.execute(
           new Runnable() {
             @Override
             public void run() {
               pcClient.addRemoteIceCandidate(candidate);
             }
           });
     }
     iceCandidates.add(candidate);
     iceCandidateEvent.notifyAll();
   }
 }